diff options
Diffstat (limited to 'indra')
288 files changed, 30101 insertions, 25399 deletions
diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index 310e6cbdd4..d1042d6e86 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -35,8 +35,10 @@ endif (NOT CMAKE_BUILD_TYPE) # For the library installation process; # see cmake/Prebuild.cmake for the counterpart code. -file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/temp) -file(WRITE ${CMAKE_BINARY_DIR}/temp/sentinel_installed "0") +if ("${CMAKE_SOURCE_DIR}/../autobuild.xml" IS_NEWER_THAN "${CMAKE_BINARY_DIR}/temp/sentinel_installed") + file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/temp) + file(WRITE ${CMAKE_BINARY_DIR}/temp/sentinel_installed "0") +endif ("${CMAKE_SOURCE_DIR}/../autobuild.xml" IS_NEWER_THAN "${CMAKE_BINARY_DIR}/temp/sentinel_installed") add_subdirectory(cmake) add_subdirectory(${LIBS_OPEN_PREFIX}llaudio) diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index 6d5860657d..2c974fb4ff 100644 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -36,6 +36,13 @@ if (WINDOWS) # Don't build DLLs. set(BUILD_SHARED_LIBS OFF) + # for "backwards compatibility", cmake sneaks in the Zm1000 option which royally + # screws incredibuild. this hack disables it. + # for details see: http://connect.microsoft.com/VisualStudio/feedback/details/368107/clxx-fatal-error-c1027-inconsistent-values-for-ym-between-creation-and-use-of-precompiled-headers + # http://www.ogre3d.org/forums/viewtopic.php?f=2&t=60015 + # http://www.cmake.org/pipermail/cmake/2009-September/032143.html + string(REPLACE "/Zm1000" " " CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd /MP -D_SCL_SECURE_NO_WARNINGS=1" CACHE STRING "C++ compiler debug options" FORCE) set(CMAKE_CXX_FLAGS_RELWITHDEBINFO diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 881d4caa78..d9efc8f40d 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -131,7 +131,8 @@ elseif (MSVC_VERSION EQUAL 1600) # VisualStudio 2010 PATHS ${MSVC_DEBUG_REDIST_PATH} [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\10.0\\Setup\\VC;ProductDir]/redist/Debug_NonRedist/x86/Microsoft.VC100.DebugCRT - NO_DEFAULT_PATH + [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/SysWOW64 + [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/System32 NO_DEFAULT_PATH ) @@ -155,7 +156,8 @@ elseif (MSVC_VERSION EQUAL 1600) # VisualStudio 2010 PATHS ${MSVC_REDIST_PATH} [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\10.0\\Setup\\VC;ProductDir]/redist/x86/Microsoft.VC100.CRT - NO_DEFAULT_PATH + [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/SysWOW64 + [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/System32 NO_DEFAULT_PATH ) diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake index 3f259f6382..08feab6e36 100644 --- a/indra/cmake/LLAddBuildTest.cmake +++ b/indra/cmake/LLAddBuildTest.cmake @@ -95,7 +95,7 @@ INCLUDE(GoogleMock) IF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND) SET(${name}_test_additional_INCLUDE_DIRS "") ENDIF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND) - INCLUDE_DIRECTORIES(${alltest_INCLUDE_DIRS} ${name}_test_additional_INCLUDE_DIRS ) + INCLUDE_DIRECTORIES(${alltest_INCLUDE_DIRS} ${${name}_test_additional_INCLUDE_DIRS} ) IF(LL_TEST_VERBOSE) MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_INCLUDE_DIRS ${${name}_test_additional_INCLUDE_DIRS}") ENDIF(LL_TEST_VERBOSE) diff --git a/indra/cmake/Prebuilt.cmake b/indra/cmake/Prebuilt.cmake index 1b60d176f1..dbb4dfc46c 100644 --- a/indra/cmake/Prebuilt.cmake +++ b/indra/cmake/Prebuilt.cmake @@ -1,35 +1,49 @@ # -*- cmake -*- include(FindAutobuild) +if(INSTALL_PROPRIETARY) + include(FindSCP) +endif(INSTALL_PROPRIETARY) +# The use_prebuilt_binary macro handles automated installation of package +# dependencies using autobuild. The goal is that 'autobuild install' should +# only be run when we know we need to install a new package. This should be +# the case in a clean checkout, or if autobuild.xml has been updated since the +# last run (encapsulated by the file ${CMAKE_BINARY_DIR}/temp/sentinel_installed), +# or if a previous attempt to install the package has failed (the exit status +# of previous attempts is serialized in the file +# ${CMAKE_BINARY_DIR}/temp/${_binary}_installed) macro (use_prebuilt_binary _binary) if (NOT DEFINED STANDALONE_${_binary}) set(STANDALONE_${_binary} ${STANDALONE}) endif (NOT DEFINED STANDALONE_${_binary}) if (NOT STANDALONE_${_binary}) - if(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed) - if(INSTALL_PROPRIETARY) - include(FindSCP) - endif(INSTALL_PROPRIETARY) - if(DEBUG_PREBUILT) - message("cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install - --install-dir=${AUTOBUILD_INSTALL_DIR} - --skip-license-check - ${_binary} ") - endif(DEBUG_PREBUILT) - execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}" - install - --install-dir=${AUTOBUILD_INSTALL_DIR} - --skip-license-check - ${_binary} - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" - RESULT_VARIABLE ${_binary}_installed - ) + if("${${_binary}_installed}" STREQUAL "" AND EXISTS "${CMAKE_BINARY_DIR}/temp/${_binary}_installed") + file(READ ${CMAKE_BINARY_DIR}/temp/${_binary}_installed "${_binary}_installed") + if(DEBUG_PREBUILT) + message(STATUS "${_binary}_installed: \"${${_binary}_installed}\"") + endif(DEBUG_PREBUILT) + endif("${${_binary}_installed}" STREQUAL "" AND EXISTS "${CMAKE_BINARY_DIR}/temp/${_binary}_installed") + + if(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed OR NOT ${${_binary}_installed} EQUAL 0) + if(DEBUG_PREBUILT) + message("cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install + --install-dir=${AUTOBUILD_INSTALL_DIR} + --skip-license-check + ${_binary} ") + endif(DEBUG_PREBUILT) + execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}" + install + --install-dir=${AUTOBUILD_INSTALL_DIR} + --skip-license-check + ${_binary} + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + RESULT_VARIABLE ${_binary}_installed + ) file(WRITE ${CMAKE_BINARY_DIR}/temp/${_binary}_installed "${${_binary}_installed}") - else(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed) - set(${_binary}_installed 0) - endif(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed) + endif(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed OR NOT ${${_binary}_installed} EQUAL 0) + if(NOT ${_binary}_installed EQUAL 0) message(FATAL_ERROR "Failed to download or unpack prebuilt '${_binary}'." diff --git a/indra/cmake/Pth.cmake b/indra/cmake/Pth.cmake deleted file mode 100644 index a28f6ec696..0000000000 --- a/indra/cmake/Pth.cmake +++ /dev/null @@ -1,21 +0,0 @@ -# -*- cmake -*- -include(Prebuilt) - -set(PTH_FIND_QUIETLY ON) -set(PTH_FIND_REQUIRED ON) - -if (STANDALONE) -# ?? How would I construct FindPTH.cmake? This file was cloned from -# CURL.cmake, which uses include(FindCURL), but there's no FindCURL.cmake? -# include(FindPTH) -else (STANDALONE) - # This library is only needed to support Boost.Coroutine, and only on Mac. - if (DARWIN) - use_prebuilt_binary(pth) - set(PTH_LIBRARIES pth) - set(PTH_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) - else (DARWIN) - set(PTH_LIBRARIES) - set(PTH_INCLUDE_DIRS) - endif (DARWIN) -endif (STANDALONE) diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index 1a8b16dec7..cfccd29def 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -152,7 +152,7 @@ For more information, please see JIRA DEV-14943 - Cmake Linux cannot build both endif (LINUX AND SERVER AND VIEWER) -set(USE_PRECOMPILED_HEADERS OFF CACHE BOOL "Enable use of precompiled header directives where supported.") +set(USE_PRECOMPILED_HEADERS ON CACHE BOOL "Enable use of precompiled header directives where supported.") source_group("CMake Rules" FILES CMakeLists.txt) diff --git a/indra/cmake/run_build_test.py b/indra/cmake/run_build_test.py index 320a9be8ab..ce2d1e0386 100755 --- a/indra/cmake/run_build_test.py +++ b/indra/cmake/run_build_test.py @@ -109,6 +109,8 @@ def main(command, libpath=[], vars={}): os.environ.update(dict([(str(key), str(value)) for key, value in vars.iteritems()])) # Run the child process. print "Running: %s" % " ".join(command) + # Make sure we see all relevant output *before* child-process output. + sys.stdout.flush() return subprocess.call(command) if __name__ == "__main__": diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp index 60ddf63b21..976aae08bb 100644 --- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp +++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp @@ -70,6 +70,10 @@ static const char USAGE[] = "\n" " be used. Blocks must be smaller than precincts. Like precincts, this option adds\n" " PLT, tile markers and uses RPCL.\n" " Only valid for output j2c images. Default is 64.\n" +" -l, --levels <n>\n" +" Number of decomposition levels (aka discard levels) in the output image.\n" +" The maximum number of levels authorized is 32.\n" +" Only valid for output j2c images. Default is 5.\n" " -rev, --reversible\n" " Set the compression to be lossless (reversible in j2c parlance).\n" " Only valid for output j2c images.\n" @@ -147,7 +151,7 @@ LLPointer<LLImageRaw> load_image(const std::string &src_filename, int discard_le } // Save a raw image instance into a file -bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image, int blocks_size, int precincts_size, bool reversible, bool output_stats) +bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image, int blocks_size, int precincts_size, int levels, bool reversible, bool output_stats) { LLPointer<LLImageFormatted> image = create_image(dest_filename); @@ -156,9 +160,9 @@ bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_imag { // That method doesn't exist (and likely, doesn't make sense) for any other image file format // hence the required cryptic cast. - if ((blocks_size != -1) || (precincts_size != -1)) + if ((blocks_size != -1) || (precincts_size != -1) || (levels != 0)) { - ((LLImageJ2C*)(image.get()))->initEncode(*raw_image, blocks_size, precincts_size); + ((LLImageJ2C*)(image.get()))->initEncode(*raw_image, blocks_size, precincts_size, levels); } ((LLImageJ2C*)(image.get()))->setReversible(reversible); } @@ -306,6 +310,7 @@ int main(int argc, char** argv) int discard_level = -1; int precincts_size = -1; int blocks_size = -1; + int levels = 0; bool reversible = false; // Init whatever is necessary @@ -403,7 +408,6 @@ int main(int argc, char** argv) else { precincts_size = atoi(value_str.c_str()); - // *TODO: make sure precincts_size is a power of 2 } } else if (!strcmp(argv[arg], "--blocks") || !strcmp(argv[arg], "-b")) @@ -420,7 +424,22 @@ int main(int argc, char** argv) else { blocks_size = atoi(value_str.c_str()); - // *TODO: make sure blocks_size is a power of 2 + } + } + else if (!strcmp(argv[arg], "--levels") || !strcmp(argv[arg], "-l")) + { + std::string value_str; + if ((arg + 1) < argc) + { + value_str = argv[arg+1]; + } + if (((arg + 1) >= argc) || (value_str[0] == '-')) + { + std::cout << "No valid --levels argument given, default (5) will be used" << std::endl; + } + else + { + levels = atoi(value_str.c_str()); } } else if (!strcmp(argv[arg], "--reversible") || !strcmp(argv[arg], "-rev")) @@ -499,7 +518,7 @@ int main(int argc, char** argv) // Save file if (out_file != out_end) { - if (!save_image(*out_file, raw_image, blocks_size, precincts_size, reversible, image_stats)) + if (!save_image(*out_file, raw_image, blocks_size, precincts_size, levels, reversible, image_stats)) { std::cout << "Error: Image " << *out_file << " could not be saved" << std::endl; } diff --git a/indra/integration_tests/llui_libtest/llui_libtest.cpp b/indra/integration_tests/llui_libtest/llui_libtest.cpp index c34115ee80..217e26c3ca 100644 --- a/indra/integration_tests/llui_libtest/llui_libtest.cpp +++ b/indra/integration_tests/llui_libtest/llui_libtest.cpp @@ -33,6 +33,7 @@ // linden library includes #include "llcontrol.h" // LLControlGroup #include "lldir.h" +#include "lldiriterator.h" #include "llerrorcontrol.h" #include "llfloater.h" #include "llfontfreetype.h" @@ -174,7 +175,9 @@ void export_test_floaters() std::string delim = gDirUtilp->getDirDelimiter(); std::string xui_dir = get_xui_dir() + "en" + delim; std::string filename; - while (gDirUtilp->getNextFileInDir(xui_dir, "floater_test_*.xml", filename)) + + LLDirIterator iter(xui_dir, "floater_test_*.xml"); + while (iter.next(filename)) { if (filename.find("_new.xml") != std::string::npos) { diff --git a/indra/linux_updater/linux_updater.cpp b/indra/linux_updater/linux_updater.cpp index a81de0223c..eed00ac06e 100644 --- a/indra/linux_updater/linux_updater.cpp +++ b/indra/linux_updater/linux_updater.cpp @@ -33,6 +33,7 @@ #include "llerrorcontrol.h" #include "llfile.h" #include "lldir.h" +#include "lldiriterator.h" #include "llxmlnode.h" #include "lltrans.h" @@ -55,6 +56,8 @@ typedef struct _updater_app_state { std::string strings_dirs; std::string strings_file; + LLDirIterator *image_dir_iter; + GtkWidget *window; GtkWidget *progress_bar; GtkWidget *image; @@ -115,7 +118,7 @@ bool translate_init(std::string comma_delim_path_list, void updater_app_ui_init(void); void updater_app_quit(UpdaterAppState *app_state); void parse_args_and_init(int argc, char **argv, UpdaterAppState *app_state); -std::string next_image_filename(std::string& image_path); +std::string next_image_filename(std::string& image_path, LLDirIterator& iter); void display_error(GtkWidget *parent, std::string title, std::string message); BOOL install_package(std::string package_file, std::string destination); BOOL spawn_viewer(UpdaterAppState *app_state); @@ -181,7 +184,7 @@ void updater_app_ui_init(UpdaterAppState *app_state) // load the first image app_state->image = gtk_image_new_from_file - (next_image_filename(app_state->image_dir).c_str()); + (next_image_filename(app_state->image_dir, *app_state->image_dir_iter).c_str()); gtk_widget_set_size_request(app_state->image, 340, 310); gtk_container_add(GTK_CONTAINER(frame), app_state->image); @@ -212,7 +215,7 @@ gboolean rotate_image_cb(gpointer data) llassert(data != NULL); app_state = (UpdaterAppState *) data; - filename = next_image_filename(app_state->image_dir); + filename = next_image_filename(app_state->image_dir, *app_state->image_dir_iter); gdk_threads_enter(); gtk_image_set_from_file(GTK_IMAGE(app_state->image), filename.c_str()); @@ -221,10 +224,10 @@ gboolean rotate_image_cb(gpointer data) return TRUE; } -std::string next_image_filename(std::string& image_path) +std::string next_image_filename(std::string& image_path, LLDirIterator& iter) { std::string image_filename; - gDirUtilp->getNextFileInDir(image_path, "/*.jpg", image_filename); + iter.next(image_filename); return image_path + "/" + image_filename; } @@ -748,6 +751,7 @@ void parse_args_and_init(int argc, char **argv, UpdaterAppState *app_state) else if ((!strcmp(argv[i], "--image-dir")) && (++i < argc)) { app_state->image_dir = argv[i]; + app_state->image_dir_iter = new LLDirIterator(argv[i], "/*.jpg"); } else if ((!strcmp(argv[i], "--dest")) && (++i < argc)) { @@ -832,6 +836,7 @@ int main(int argc, char **argv) } bool success = !app_state->failure; + delete app_state->image_dir_iter; delete app_state; return success ? 0 : 1; } diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 22e0705036..9910281b64 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -7,7 +7,6 @@ include(00-Common) include(LLCommon) include(Linking) include(Boost) -include(Pth) include(LLSharedLibs) include(GoogleBreakpad) include(GooglePerfTools) @@ -18,7 +17,6 @@ include_directories( ${EXPAT_INCLUDE_DIRS} ${LLCOMMON_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS} - ${PTH_INCLUDE_DIRS} ) # add_executable(lltreeiterators lltreeiterators.cpp) @@ -117,6 +115,7 @@ set(llcommon_HEADER_FILES indra_constants.h linden_common.h linked_lists.h + llaccountingquota.h llallocator.h llallocator_heap_profile.h llagentconstants.h @@ -268,6 +267,10 @@ if(LLCOMMON_LINK_SHARED) add_definitions(-fPIC) endif(WINDOWS) endif(NOT WORD_SIZE EQUAL 32) + if(WINDOWS) + # always generate llcommon.pdb, even for "Release" builds + set_target_properties(llcommon PROPERTIES LINK_FLAGS "/DEBUG") + endif(WINDOWS) ll_stage_sharedlib(llcommon) else(LLCOMMON_LINK_SHARED) add_library (llcommon ${llcommon_SOURCE_FILES}) @@ -283,10 +286,15 @@ target_link_libraries( ${WINDOWS_LIBRARIES} ${BOOST_PROGRAM_OPTIONS_LIBRARY} ${BOOST_REGEX_LIBRARY} - ${PTH_LIBRARIES} ${GOOGLE_PERFTOOLS_LIBRARIES} ) +if (DARWIN) + include(CMakeFindFrameworks) + find_library(CARBON_LIBRARY Carbon) + target_link_libraries(llcommon ${CARBON_LIBRARY}) +endif (DARWIN) + add_dependencies(llcommon stage_third_party_libs) if (LL_TESTS) diff --git a/indra/llcommon/llaccountingquota.h b/indra/llcommon/llaccountingquota.h new file mode 100644 index 0000000000..f52d94f868 --- /dev/null +++ b/indra/llcommon/llaccountingquota.h @@ -0,0 +1,78 @@ +/** + * @file llaccountingquota.h + * @ + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_ACCOUNTINGQUOTA_H +#define LL_ACCOUNTINGQUOTA_H + +struct ParcelQuota +{ + ParcelQuota( F32 ownerRenderCost, F32 ownerPhysicsCost, F32 ownerNetworkCost, F32 ownerSimulationCost, + F32 groupRenderCost, F32 groupPhysicsCost, F32 groupNetworkCost, F32 groupSimulationCost, + F32 otherRenderCost, F32 otherPhysicsCost, F32 otherNetworkCost, F32 otherSimulationCost, + F32 totalRenderCost, F32 totalPhysicsCost, F32 totalNetworkCost, F32 totalSimulationCost) + : mOwnerRenderCost( ownerRenderCost ), mOwnerPhysicsCost( ownerPhysicsCost ) + , mOwnerNetworkCost( ownerNetworkCost ), mOwnerSimulationCost( ownerSimulationCost ) + , mGroupRenderCost( groupRenderCost ), mGroupPhysicsCost( groupPhysicsCost ) + , mGroupNetworkCost( groupNetworkCost ), mGroupSimulationCost( groupSimulationCost ) + , mOtherRenderCost( otherRenderCost ), mOtherPhysicsCost( otherPhysicsCost ) + , mOtherNetworkCost( otherNetworkCost ), mOtherSimulationCost( otherSimulationCost ) + , mTotalRenderCost( totalRenderCost ), mTotalPhysicsCost( totalPhysicsCost ) + , mTotalNetworkCost( totalNetworkCost ), mTotalSimulationCost( totalSimulationCost ) + { + } + ParcelQuota(){} + F32 mOwnerRenderCost, mOwnerPhysicsCost, mOwnerNetworkCost, mOwnerSimulationCost; + F32 mGroupRenderCost, mGroupPhysicsCost, mGroupNetworkCost, mGroupSimulationCost; + F32 mOtherRenderCost, mOtherPhysicsCost, mOtherNetworkCost, mOtherSimulationCost; + F32 mTotalRenderCost, mTotalPhysicsCost, mTotalNetworkCost, mTotalSimulationCost; +}; + +struct SelectionQuota +{ + SelectionQuota( S32 localId, F32 renderCost, F32 physicsCost, F32 networkCost, F32 simulationCost ) + : mLocalId( localId) + , mRenderCost( renderCost ) + , mPhysicsCost( physicsCost ) + , mNetworkCost( networkCost ) + , mSimulationCost( simulationCost ) + { + } + SelectionQuota() {} + + F32 mRenderCost, mPhysicsCost, mNetworkCost, mSimulationCost; + S32 mLocalId; +}; + +#endif + + + diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp index 39daefd1ad..ed192a9975 100644 --- a/indra/llcommon/llapp.cpp +++ b/indra/llcommon/llapp.cpp @@ -24,6 +24,10 @@ * $/LicenseInfo$ */ +#include "linden_common.h" + +#include "llapp.h" + #include <cstdlib> #ifdef LL_DARWIN @@ -32,9 +36,6 @@ #include <sys/sysctl.h> #endif -#include "linden_common.h" -#include "llapp.h" - #include "llcommon.h" #include "llapr.h" #include "llerrorcontrol.h" diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h index 0adb78236e..3bd1403576 100644 --- a/indra/llcommon/llmemory.h +++ b/indra/llcommon/llmemory.h @@ -28,7 +28,7 @@ #include "llmemtype.h" -#if 0 //DON'T use ll_aligned_foo now that we use tcmalloc everywhere (tcmalloc aligns automatically at appropriate intervals) +#if LL_DEBUG inline void* ll_aligned_malloc( size_t size, int align ) { void* mem = malloc( size + (align - 1) + sizeof(void*) ); @@ -95,7 +95,15 @@ inline void ll_aligned_free_32(void *p) free(p); // posix_memalign() is compatible with heap deallocator #endif } -#endif +#else // LL_DEBUG +// ll_aligned_foo are noops now that we use tcmalloc everywhere (tcmalloc aligns automatically at appropriate intervals) +#define ll_aligned_malloc( size, align ) malloc(size) +#define ll_aligned_free( ptr ) free(ptr) +#define ll_aligned_malloc_16 malloc +#define ll_aligned_free_16 free +#define ll_aligned_malloc_32 malloc +#define ll_aligned_free_32 free +#endif // LL_DEBUG class LL_COMMON_API LLMemory { diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 10cdc7087b..ca2d3f9181 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -46,6 +46,7 @@ # include <sys/sysctl.h> # include <sys/utsname.h> # include <stdint.h> +# include <Carbon/Carbon.h> #elif LL_LINUX # include <errno.h> # include <sys/utsname.h> @@ -318,7 +319,58 @@ LLOSInfo::LLOSInfo() : } mOSString += compatibility_mode; +#elif LL_DARWIN + + // Initialize mOSStringSimple to something like: + // "Mac OS X 10.6.7" + { + const char * DARWIN_PRODUCT_NAME = "Mac OS X"; + + SInt32 major_version, minor_version, bugfix_version; + OSErr r1 = Gestalt(gestaltSystemVersionMajor, &major_version); + OSErr r2 = Gestalt(gestaltSystemVersionMinor, &minor_version); + OSErr r3 = Gestalt(gestaltSystemVersionBugFix, &bugfix_version); + + if((r1 == noErr) && (r2 == noErr) && (r3 == noErr)) + { + mMajorVer = major_version; + mMinorVer = minor_version; + mBuild = bugfix_version; + + std::stringstream os_version_string; + os_version_string << DARWIN_PRODUCT_NAME << " " << mMajorVer << "." << mMinorVer << "." << mBuild; + + // Put it in the OS string we are compiling + mOSStringSimple.append(os_version_string.str()); + } + else + { + mOSStringSimple.append("Unable to collect OS info"); + } + } + + // Initialize mOSString to something like: + // "Mac OS X 10.6.7 Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386 i386" + struct utsname un; + if(uname(&un) != -1) + { + mOSString = mOSStringSimple; + mOSString.append(" "); + mOSString.append(un.sysname); + mOSString.append(" "); + mOSString.append(un.release); + mOSString.append(" "); + mOSString.append(un.version); + mOSString.append(" "); + mOSString.append(un.machine); + } + else + { + mOSString = mOSStringSimple; + } + #else + struct utsname un; if(uname(&un) != -1) { @@ -334,15 +386,7 @@ LLOSInfo::LLOSInfo() : // Simplify 'Simple' std::string ostype = mOSStringSimple.substr(0, mOSStringSimple.find_first_of(" ", 0)); - if (ostype == "Darwin") - { - // Only care about major Darwin versions, truncate at first '.' - S32 idx1 = mOSStringSimple.find_first_of(".", 0); - std::string simple = mOSStringSimple.substr(0, idx1); - if (simple.length() > 0) - mOSStringSimple = simple; - } - else if (ostype == "Linux") + if (ostype == "Linux") { // Only care about major and minor Linux versions, truncate at second '.' std::string::size_type idx1 = mOSStringSimple.find_first_of(".", 0); diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index 08026c38a6..7703132d90 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -28,8 +28,8 @@ #define LL_LLVERSIONVIEWER_H const S32 LL_VERSION_MAJOR = 2; -const S32 LL_VERSION_MINOR = 6; -const S32 LL_VERSION_PATCH = 8; +const S32 LL_VERSION_MINOR = 7; +const S32 LL_VERSION_PATCH = 0; const S32 LL_VERSION_BUILD = 0; const char * const LL_CHANNEL = "Second Life Developer"; diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h index 18444f3934..c464c3b2b6 100644 --- a/indra/llimage/llimage.h +++ b/indra/llimage/llimage.h @@ -35,8 +35,21 @@ const S32 MIN_IMAGE_MIP = 2; // 4x4, only used for expand/contract power of 2 const S32 MAX_IMAGE_MIP = 11; // 2048x2048 + +// *TODO : Use MAX_IMAGE_MIP as max discard level and modify j2c management so that the number +// of levels is read from the header's file, not inferred from its size. const S32 MAX_DISCARD_LEVEL = 5; +// JPEG2000 size constraints +// Those are declared here as they are germane to other image constraints used in the viewer +// and declared right here. Some come from the JPEG2000 spec, some conventions specific to SL. +const S32 MAX_DECOMPOSITION_LEVELS = 32; // Number of decomposition levels cannot exceed 32 according to jpeg2000 spec +const S32 MIN_DECOMPOSITION_LEVELS = 5; // the SL viewer will *crash* trying to decode images with fewer than 5 decomposition levels (unless image is small that is) +const S32 MAX_PRECINCT_SIZE = 2048; // No reason to be bigger than MAX_IMAGE_SIZE +const S32 MIN_PRECINCT_SIZE = 4; // Can't be smaller than MIN_BLOCK_SIZE +const S32 MAX_BLOCK_SIZE = 64; // Max total block size is 4096, hence 64x64 when using square blocks +const S32 MIN_BLOCK_SIZE = 4; // Min block dim is 4 according to jpeg2000 spec + const S32 MIN_IMAGE_SIZE = (1<<MIN_IMAGE_MIP); // 4, only used for expand/contract power of 2 const S32 MAX_IMAGE_SIZE = (1<<MAX_IMAGE_MIP); // 2048 const S32 MIN_IMAGE_AREA = MIN_IMAGE_SIZE * MIN_IMAGE_SIZE; diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp index a90df0f1c1..44e6b89dd3 100644 --- a/indra/llimage/llimagej2c.cpp +++ b/indra/llimage/llimagej2c.cpp @@ -144,9 +144,9 @@ BOOL LLImageJ2C::initDecode(LLImageRaw &raw_image, int discard_level, int* regio return mImpl->initDecode(*this,raw_image,discard_level,region); } -BOOL LLImageJ2C::initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size) +BOOL LLImageJ2C::initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels) { - return mImpl->initEncode(*this,raw_image,blocks_size,precincts_size); + return mImpl->initEncode(*this,raw_image,blocks_size,precincts_size,levels); } BOOL LLImageJ2C::decode(LLImageRaw *raw_imagep, F32 decode_time) diff --git a/indra/llimage/llimagej2c.h b/indra/llimage/llimagej2c.h index 6bba81aab5..914174fc57 100644 --- a/indra/llimage/llimagej2c.h +++ b/indra/llimage/llimagej2c.h @@ -57,7 +57,7 @@ public: /*virtual*/ void setLastError(const std::string& message, const std::string& filename = std::string()); BOOL initDecode(LLImageRaw &raw_image, int discard_level, int* region); - BOOL initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size); + BOOL initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels); // Encode with comment text BOOL encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time=0.0); @@ -120,7 +120,7 @@ protected: virtual BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible=FALSE) = 0; virtual BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL) = 0; - virtual BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1) = 0; + virtual BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0) = 0; friend class LLImageJ2C; }; diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp index 8288fa1f5c..d15824ce5a 100644 --- a/indra/llimagej2coj/llimagej2coj.cpp +++ b/indra/llimagej2coj/llimagej2coj.cpp @@ -113,7 +113,7 @@ BOOL LLImageJ2COJ::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int disca return FALSE; } -BOOL LLImageJ2COJ::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size) +BOOL LLImageJ2COJ::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels) { // No specific implementation for this method in the OpenJpeg case return FALSE; diff --git a/indra/llimagej2coj/llimagej2coj.h b/indra/llimagej2coj/llimagej2coj.h index 9c7cc09fcb..40ad4edb00 100644 --- a/indra/llimagej2coj/llimagej2coj.h +++ b/indra/llimagej2coj/llimagej2coj.h @@ -40,7 +40,7 @@ protected: /*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible = FALSE); /*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL); - /*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1); + /*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0); }; #endif diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp index 0a4cd51ea0..e8cd871157 100644 --- a/indra/llinventory/llparcel.cpp +++ b/indra/llinventory/llparcel.cpp @@ -1348,3 +1348,12 @@ LLParcel::ECategory category_ui_string_to_category(const std::string& s) // is a distinct option from "None" and "Other" return LLParcel::C_ANY; } + +void LLParcel::updateQuota( const LLUUID& objectId, const ParcelQuota& quota ) +{ + if ( mID == objectId ) + { + mQuota = quota; + } +} + diff --git a/indra/llinventory/llparcel.h b/indra/llinventory/llparcel.h index 71b65d99ce..4893337967 100644 --- a/indra/llinventory/llparcel.h +++ b/indra/llinventory/llparcel.h @@ -34,7 +34,7 @@ #include "llpermissions.h" #include "lltimer.h" #include "v3math.h" - +#include "llaccountingquota.h" // Grid out of which parcels taken is stepped every 4 meters. const F32 PARCEL_GRID_STEP_METERS = 4.f; @@ -586,7 +586,11 @@ public: LLUUID getPreviousOwnerID() const { return mPreviousOwnerID; } BOOL getPreviouslyGroupOwned() const { return mPreviouslyGroupOwned; } BOOL getSellWithObjects() const { return (mParcelFlags & PF_SELL_PARCEL_OBJECTS) ? TRUE : FALSE; } - + + + void updateQuota( const LLUUID& objectId, const ParcelQuota& quota ); + const ParcelQuota& getQuota( void ) { return mQuota; } + protected: LLUUID mID; LLUUID mOwnerID; @@ -657,8 +661,9 @@ protected: BOOL mRegionPushOverride; BOOL mRegionDenyAnonymousOverride; BOOL mRegionDenyAgeUnverifiedOverride; - - + + ParcelQuota mQuota; + public: // HACK, make private S32 mLocalID; diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp index ae456a48be..39ae09650e 100644 --- a/indra/llkdu/llimagej2ckdu.cpp +++ b/indra/llkdu/llimagej2ckdu.cpp @@ -29,6 +29,7 @@ #include "lltimer.h" #include "llpointer.h" +#include "llmath.h" #include "llkdumem.h" @@ -192,7 +193,8 @@ mTileIndicesp(NULL), mRawImagep(NULL), mDecodeState(NULL), mBlocksSize(-1), -mPrecinctsSize(-1) +mPrecinctsSize(-1), +mLevels(0) { } @@ -328,10 +330,29 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int disc return initDecode(base,raw_image,0.0f,MODE_FAST,0,4,discard_level,region); } -BOOL LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size) +BOOL LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels) { - mBlocksSize = blocks_size; mPrecinctsSize = precincts_size; + if (mPrecinctsSize != -1) + { + mPrecinctsSize = get_lower_power_two(mPrecinctsSize,MAX_PRECINCT_SIZE); + mPrecinctsSize = llmax(mPrecinctsSize,MIN_PRECINCT_SIZE); + } + mBlocksSize = blocks_size; + if (mBlocksSize != -1) + { + mBlocksSize = get_lower_power_two(mBlocksSize,MAX_BLOCK_SIZE); + mBlocksSize = llmax(mBlocksSize,MIN_BLOCK_SIZE); + if (mPrecinctsSize != -1) + { + mBlocksSize = llmin(mBlocksSize,mPrecinctsSize); // blocks *must* be smaller than precincts + } + } + mLevels = levels; + if (mLevels != 0) + { + mLevels = llclamp(mLevels,MIN_DECOMPOSITION_LEVELS,MIN_DECOMPOSITION_LEVELS); + } return TRUE; } @@ -373,10 +394,12 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco // Resize raw_image according to the image to be decoded kdu_dims dims; mCodeStreamp->get_dims(0,dims); + // *TODO: Use the real number of levels read from the file throughout the code instead of relying on an infered value from dimensions + //S32 levels = mCodeStreamp->get_min_dwt_levels(); S32 channels = base.getComponents() - first_channel; channels = llmin(channels,max_channel_count); raw_image.resize(dims.size.x, dims.size.y, channels); - // llinfos << "Resizing raw_image to " << dims.size.x << ":" << dims.size.y << llendl; + //llinfos << "j2c image dimension: width = " << dims.size.x << ", height = " << dims.size.y << ", channels = " << channels << ", levels = " << levels << llendl; if (!mTileIndicesp) { @@ -653,6 +676,11 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co std::string Parts_string = llformat("ORGtparts=R"); codestream.access_siz()->parse_string(Parts_string.c_str()); } + if (mLevels != 0) + { + std::string levels_string = llformat("Clevels=%d",mLevels); + codestream.access_siz()->parse_string(levels_string.c_str()); + } codestream.access_siz()->finalize_all(); codestream.change_appearance(transpose,vflip,hflip); diff --git a/indra/llkdu/llimagej2ckdu.h b/indra/llkdu/llimagej2ckdu.h index 9fce58b762..1489dbf704 100644 --- a/indra/llkdu/llimagej2ckdu.h +++ b/indra/llkdu/llimagej2ckdu.h @@ -59,7 +59,7 @@ protected: /*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible=FALSE); /*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL); - /*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1); + /*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0); private: BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level = -1, int* region = NULL); @@ -73,6 +73,7 @@ private: kdu_dims *mTileIndicesp; int mBlocksSize; int mPrecinctsSize; + int mLevels; // Temporary variables for in-progress decodes... LLImageRaw *mRawImagep; diff --git a/indra/llkdu/tests/llimagej2ckdu_test.cpp b/indra/llkdu/tests/llimagej2ckdu_test.cpp index 7ac24a969a..ab60ab6d50 100644 --- a/indra/llkdu/tests/llimagej2ckdu_test.cpp +++ b/indra/llkdu/tests/llimagej2ckdu_test.cpp @@ -134,6 +134,7 @@ kdu_params* kdu_params::access_cluster(const char*) { return NULL; } void kdu_codestream::set_fast() { } void kdu_codestream::set_fussy() { } void kdu_codestream::get_dims(int, kdu_dims&, bool ) { } +int kdu_codestream::get_min_dwt_levels() { return 5; } void kdu_codestream::change_appearance(bool, bool, bool) { } void kdu_codestream::get_tile_dims(kdu_coords, int, kdu_dims&, bool ) { } void kdu_codestream::destroy() { } diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 70e1e1f312..c504215ee5 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -51,6 +51,7 @@ #include "llsdserialize.h" #include "llvector4a.h" #include "llmatrix4a.h" +#include "lltimer.h" #define DEBUG_SILHOUETTE_BINORMALS 0 #define DEBUG_SILHOUETTE_NORMALS 0 // TomY: Use this to display normals using the silhouette @@ -1883,9 +1884,9 @@ LLVolume::~LLVolume() mProfilep = NULL; mVolumeFaces.clear(); - free(mHullPoints); + ll_aligned_free_16(mHullPoints); mHullPoints = NULL; - free(mHullIndices); + ll_aligned_free_16(mHullIndices); mHullIndices = NULL; } @@ -2007,7 +2008,7 @@ void LLVolumeFace::VertexData::init() { if (!mData) { - mData = (LLVector4a*) malloc(sizeof(LLVector4a)*2); + mData = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*2); } } @@ -2036,7 +2037,7 @@ const LLVolumeFace::VertexData& LLVolumeFace::VertexData::operator=(const LLVolu LLVolumeFace::VertexData::~VertexData() { - free(mData); + ll_aligned_free_16(mData); mData = NULL; } @@ -2183,7 +2184,8 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size) } U16* indices = (U16*) &(idx[0]); - for (U32 j = 0; j < idx.size()/2; ++j) + U32 count = idx.size()/2; + for (U32 j = 0; j < count; ++j) { face.mIndices[j] = indices[j]; } @@ -2192,6 +2194,81 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size) U32 num_verts = pos.size()/(3*2); face.resizeVertices(num_verts); + LLVector3 minp; + LLVector3 maxp; + LLVector2 min_tc; + LLVector2 max_tc; + + minp.setValue(mdl[i]["PositionDomain"]["Min"]); + maxp.setValue(mdl[i]["PositionDomain"]["Max"]); + LLVector4a min_pos, max_pos; + min_pos.load3(minp.mV); + max_pos.load3(maxp.mV); + + min_tc.setValue(mdl[i]["TexCoord0Domain"]["Min"]); + max_tc.setValue(mdl[i]["TexCoord0Domain"]["Max"]); + + LLVector4a pos_range; + pos_range.setSub(max_pos, min_pos); + LLVector2 tc_range2 = max_tc - min_tc; + LLVector4a tc_range; + tc_range.set(tc_range2[0], tc_range2[1], tc_range2[0], tc_range2[1]); + LLVector4a min_tc4(min_tc[0], min_tc[1], min_tc[0], min_tc[1]); + + LLVector4a* pos_out = face.mPositions; + LLVector4a* norm_out = face.mNormals; + LLVector4a* tc_out = (LLVector4a*) face.mTexCoords; + + { + U16* v = (U16*) &(pos[0]); + for (U32 j = 0; j < num_verts; ++j) + { + pos_out->set((F32) v[0], (F32) v[1], (F32) v[2]); + pos_out->div(65535.f); + pos_out->mul(pos_range); + pos_out->add(min_pos); + pos_out++; + v += 3; + } + + } + + { + U16* n = (U16*) &(norm[0]); + for (U32 j = 0; j < num_verts; ++j) + { + norm_out->set((F32) n[0], (F32) n[1], (F32) n[2]); + norm_out->div(65535.f); + norm_out->mul(2.f); + norm_out->sub(1.f); + norm_out++; + n += 3; + } + } + + { + U16* t = (U16*) &(tc[0]); + for (U32 j = 0; j < num_verts; j+=2) + { + if (j < num_verts-1) + { + tc_out->set((F32) t[0], (F32) t[1], (F32) t[2], (F32) t[3]); + } + else + { + tc_out->set((F32) t[0], (F32) t[1], 0.f, 0.f); + } + + t += 4; + + tc_out->div(65535.f); + tc_out->mul(tc_range); + tc_out->add(min_tc4); + + tc_out++; + } + } + if (mdl[i].has("Weights")) { face.allocateWeights(num_verts); @@ -2239,56 +2316,6 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size) } - LLVector3 minp; - LLVector3 maxp; - LLVector2 min_tc; - LLVector2 max_tc; - - minp.setValue(mdl[i]["PositionDomain"]["Min"]); - maxp.setValue(mdl[i]["PositionDomain"]["Max"]); - LLVector4a min_pos, max_pos; - min_pos.load3(minp.mV); - max_pos.load3(maxp.mV); - - min_tc.setValue(mdl[i]["TexCoord0Domain"]["Min"]); - max_tc.setValue(mdl[i]["TexCoord0Domain"]["Max"]); - - LLVector4a pos_range; - pos_range.setSub(max_pos, min_pos); - LLVector2 tc_range = max_tc - min_tc; - - LLVector4a* pos_out = face.mPositions; - LLVector4a* norm_out = face.mNormals; - LLVector2* tc_out = face.mTexCoords; - - for (U32 j = 0; j < num_verts; ++j) - { - U16* v = (U16*) &(pos[j*3*2]); - - pos_out->set((F32) v[0], (F32) v[1], (F32) v[2]); - pos_out->div(65535.f); - pos_out->mul(pos_range); - pos_out->add(min_pos); - - pos_out++; - - U16* n = (U16*) &(norm[j*3*2]); - - norm_out->set((F32) n[0], (F32) n[1], (F32) n[2]); - norm_out->div(65535.f); - norm_out->mul(2.f); - norm_out->sub(1.f); - norm_out++; - - U16* t = (U16*) &(tc[j*2*2]); - - tc_out->mV[0] = (F32) t[0] / 65535.f * tc_range.mV[0] + min_tc.mV[0]; - tc_out->mV[1] = (F32) t[1] / 65535.f * tc_range.mV[1] + min_tc.mV[1]; - - tc_out++; - } - - // modifier flags? bool do_mirror = (mParams.getSculptType() & LL_SCULPT_FLAG_MIRROR); bool do_invert = (mParams.getSculptType() &LL_SCULPT_FLAG_INVERT); @@ -2361,7 +2388,7 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size) } } } - + mSculptLevel = 0; // success! cacheOptimize(); @@ -5192,7 +5219,7 @@ LLVolumeFace::LLVolumeFace() : mWeights(NULL), mOctree(NULL) { - mExtents = (LLVector4a*) malloc(sizeof(LLVector4a)*3); + mExtents = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*3); mCenter = mExtents+2; } @@ -5213,7 +5240,7 @@ LLVolumeFace::LLVolumeFace(const LLVolumeFace& src) mWeights(NULL), mOctree(NULL) { - mExtents = (LLVector4a*) malloc(sizeof(LLVector4a)*3); + mExtents = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*3); mCenter = mExtents+2; *this = src; } @@ -5263,7 +5290,7 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src) } else { - free(mBinormals); + ll_aligned_free_16(mBinormals); mBinormals = NULL; } @@ -5274,7 +5301,7 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src) } else { - free(mWeights); + ll_aligned_free_16(mWeights); mWeights = NULL; } } @@ -5292,7 +5319,7 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src) LLVolumeFace::~LLVolumeFace() { - free(mExtents); + ll_aligned_free_16(mExtents); mExtents = NULL; freeData(); @@ -5300,17 +5327,17 @@ LLVolumeFace::~LLVolumeFace() void LLVolumeFace::freeData() { - free(mPositions); + ll_aligned_free_16(mPositions); mPositions = NULL; - free( mNormals); + ll_aligned_free_16( mNormals); mNormals = NULL; - free(mTexCoords); + ll_aligned_free_16(mTexCoords); mTexCoords = NULL; - free(mIndices); + ll_aligned_free_16(mIndices); mIndices = NULL; - free(mBinormals); + ll_aligned_free_16(mBinormals); mBinormals = NULL; - free(mWeights); + ll_aligned_free_16(mWeights); mWeights = NULL; delete mOctree; @@ -5827,21 +5854,21 @@ void LLVolumeFace::cacheOptimize() //allocate space for new buffer S32 num_verts = mNumVertices; - LLVector4a* pos = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); - LLVector4a* norm = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); + LLVector4a* pos = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); + LLVector4a* norm = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); S32 size = ((num_verts*sizeof(LLVector2)) + 0xF) & ~0xF; - LLVector2* tc = (LLVector2*) malloc(size); + LLVector2* tc = (LLVector2*) ll_aligned_malloc_16(size); LLVector4a* wght = NULL; if (mWeights) { - wght = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); + wght = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); } LLVector4a* binorm = NULL; if (mBinormals) { - binorm = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); + binorm = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); } //allocate mapping of old indices to new indices @@ -5878,11 +5905,11 @@ void LLVolumeFace::cacheOptimize() mIndices[i] = new_idx[mIndices[i]]; } - free(mPositions); - free(mNormals); - free(mTexCoords); - free(mWeights); - free(mBinormals); + ll_aligned_free_16(mPositions); + ll_aligned_free_16(mNormals); + ll_aligned_free_16(mTexCoords); + ll_aligned_free_16(mWeights); + ll_aligned_free_16(mBinormals); mPositions = pos; mNormals = norm; @@ -6603,23 +6630,23 @@ void LLVolumeFace::createBinormals() void LLVolumeFace::resizeVertices(S32 num_verts) { - free(mPositions); - free(mNormals); - free(mBinormals); - free(mTexCoords); + ll_aligned_free_16(mPositions); + ll_aligned_free_16(mNormals); + ll_aligned_free_16(mBinormals); + ll_aligned_free_16(mTexCoords); mBinormals = NULL; if (num_verts) { - mPositions = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); + mPositions = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); assert_aligned(mPositions, 16); - mNormals = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); + mNormals = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); assert_aligned(mNormals, 16); //pad texture coordinate block end to allow for QWORD reads S32 size = ((num_verts*sizeof(LLVector2)) + 0xF) & ~0xF; - mTexCoords = (LLVector2*) malloc(size); + mTexCoords = (LLVector2*) ll_aligned_malloc_16(size); assert_aligned(mTexCoords, 16); } else @@ -6655,7 +6682,7 @@ void LLVolumeFace::pushVertex(const LLVector4a& pos, const LLVector4a& norm, con //just clear binormals - free(mBinormals); + ll_aligned_free_16(mBinormals); mBinormals = NULL; mPositions[mNumVertices] = pos; @@ -6667,26 +6694,26 @@ void LLVolumeFace::pushVertex(const LLVector4a& pos, const LLVector4a& norm, con void LLVolumeFace::allocateBinormals(S32 num_verts) { - free(mBinormals); - mBinormals = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); + ll_aligned_free_16(mBinormals); + mBinormals = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); } void LLVolumeFace::allocateWeights(S32 num_verts) { - free(mWeights); - mWeights = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts); + ll_aligned_free_16(mWeights); + mWeights = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); } void LLVolumeFace::resizeIndices(S32 num_indices) { - free(mIndices); + ll_aligned_free_16(mIndices); if (num_indices) { //pad index block end to allow for QWORD reads S32 size = ((num_indices*sizeof(U16)) + 0xF) & ~0xF; - mIndices = (U16*) malloc(size); + mIndices = (U16*) ll_aligned_malloc_16(size); } else { diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp index b0f68df2e8..7c8b7e3584 100644 --- a/indra/llmessage/llcurl.cpp +++ b/indra/llmessage/llcurl.cpp @@ -769,15 +769,7 @@ void LLCurl::Multi::removeEasy(Easy* easy) //static std::string LLCurl::strerror(CURLcode errorcode) { -#if LL_DARWIN - // curl_easy_strerror was added in libcurl 7.12.0. Unfortunately, the version in the Mac OS X 10.3.9 SDK is 7.10.2... - // There's a problem with the custom curl headers in our build that keeps me from #ifdefing this on the libcurl version number - // (the correct check would be #if LIBCURL_VERSION_NUM >= 0x070c00). We'll fix the header problem soon, but for now - // just punt and print the numeric error code on the Mac. - return llformat("%d", errorcode); -#else // LL_DARWIN return std::string(curl_easy_strerror(errorcode)); -#endif // LL_DARWIN } //////////////////////////////////////////////////////////////////////////// diff --git a/indra/llmessage/tests/commtest.h b/indra/llmessage/tests/commtest.h index 32035783e2..0fef596df2 100644 --- a/indra/llmessage/tests/commtest.h +++ b/indra/llmessage/tests/commtest.h @@ -35,6 +35,13 @@ #include "llhost.h" #include "stringize.h" #include <string> +#include <stdexcept> +#include <boost/lexical_cast.hpp> + +struct CommtestError: public std::runtime_error +{ + CommtestError(const std::string& what): std::runtime_error(what) {} +}; /** * This struct is shared by a couple of standalone comm tests (ADD_COMM_BUILD_TEST). @@ -55,13 +62,24 @@ struct commtest_data replyPump("reply"), errorPump("error"), success(false), - host("127.0.0.1", 8000), + host("127.0.0.1", getport("PORT")), server(STRINGIZE("http://" << host.getString() << "/")) { replyPump.listen("self", boost::bind(&commtest_data::outcome, this, _1, true)); errorPump.listen("self", boost::bind(&commtest_data::outcome, this, _1, false)); } + static int getport(const std::string& var) + { + const char* port = getenv(var.c_str()); + if (! port) + { + throw CommtestError("missing $PORT environment variable"); + } + // This will throw, too, if the value of PORT isn't numeric. + return boost::lexical_cast<int>(port); + } + bool outcome(const LLSD& _result, bool _success) { // std::cout << "commtest_data::outcome(" << _result << ", " << _success << ")\n"; diff --git a/indra/llmessage/tests/test_llsdmessage_peer.py b/indra/llmessage/tests/test_llsdmessage_peer.py index 580ee7f8b4..cea5032111 100644 --- a/indra/llmessage/tests/test_llsdmessage_peer.py +++ b/indra/llmessage/tests/test_llsdmessage_peer.py @@ -38,7 +38,7 @@ mydir = os.path.dirname(__file__) # expected to be .../indra/llmessage/tes sys.path.insert(0, os.path.join(mydir, os.pardir, os.pardir, "lib", "python")) from indra.util.fastest_elementtree import parse as xml_parse from indra.base import llsd -from testrunner import run, debug +from testrunner import freeport, run, debug class TestHTTPRequestHandler(BaseHTTPRequestHandler): """This subclass of BaseHTTPRequestHandler is to receive and echo @@ -97,6 +97,10 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler): self.wfile.write(response) else: # fail requested status = data.get("status", 500) + # self.responses maps an int status to a (short, long) pair of + # strings. We want the longer string. That's why we pass a string + # pair to get(): the [1] will select the second string, whether it + # came from self.responses or from our default pair. reason = data.get("reason", self.responses.get(status, ("fail requested", @@ -113,11 +117,17 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler): # Suppress error output as well pass -class TestHTTPServer(Thread): - def run(self): - httpd = HTTPServer(('127.0.0.1', 8000), TestHTTPRequestHandler) - debug("Starting HTTP server...\n") - httpd.serve_forever() - if __name__ == "__main__": - sys.exit(run(server=TestHTTPServer(name="httpd"), *sys.argv[1:])) + # Instantiate an HTTPServer(TestHTTPRequestHandler) on the first free port + # in the specified port range. Doing this inline is better than in a + # daemon thread: if it blows up here, we'll get a traceback. If it blew up + # in some other thread, the traceback would get eaten and we'd run the + # subject test program anyway. + httpd, port = freeport(xrange(8000, 8020), + lambda port: HTTPServer(('127.0.0.1', port), TestHTTPRequestHandler)) + # Pass the selected port number to the subject test program via the + # environment. We don't want to impose requirements on the test program's + # command-line parsing -- and anyway, for C++ integration tests, that's + # performed in TUT code rather than our own. + os.environ["PORT"] = str(port) + sys.exit(run(server=Thread(name="httpd", target=httpd.serve_forever), *sys.argv[1:])) diff --git a/indra/llmessage/tests/testrunner.py b/indra/llmessage/tests/testrunner.py index b70ce91ee7..8ff13e0426 100644 --- a/indra/llmessage/tests/testrunner.py +++ b/indra/llmessage/tests/testrunner.py @@ -29,6 +29,8 @@ $/LicenseInfo$ import os import sys +import errno +import socket def debug(*args): sys.stdout.writelines(args) @@ -36,6 +38,85 @@ def debug(*args): # comment out the line below to enable debug output debug = lambda *args: None +def freeport(portlist, expr): + """ + Find a free server port to use. Specifically, evaluate 'expr' (a + callable(port)) until it stops raising EADDRINUSE exception. + + Pass: + + portlist: an iterable (e.g. xrange()) of ports to try. If you exhaust the + range, freeport() lets the socket.error exception propagate. If you want + unbounded, you could pass itertools.count(baseport), though of course in + practice the ceiling is 2^16-1 anyway. But it seems prudent to constrain + the range much more sharply: if we're iterating an absurd number of times, + probably something else is wrong. + + expr: a callable accepting a port number, specifically one of the items + from portlist. If calling that callable raises socket.error with + EADDRINUSE, freeport() retrieves the next item from portlist and retries. + + Returns: (expr(port), port) + + port: the value from portlist for which expr(port) succeeded + + Raises: + + Any exception raised by expr(port) other than EADDRINUSE. + + socket.error if, for every item from portlist, expr(port) raises + socket.error. The exception you see is the one from the last item in + portlist. + + StopIteration if portlist is completely empty. + + Example: + + server, port = freeport(xrange(8000, 8010), + lambda port: HTTPServer(("localhost", port), + MyRequestHandler)) + # pass 'port' to client code + # call server.serve_forever() + """ + # If portlist is completely empty, let StopIteration propagate: that's an + # error because we can't return meaningful values. We have no 'port', + # therefore no 'expr(port)'. + portiter = iter(portlist) + port = portiter.next() + + while True: + try: + # If this value of port works, return as promised. + return expr(port), port + + except socket.error, err: + # Anything other than 'Address already in use', propagate + if err.args[0] != errno.EADDRINUSE: + raise + + # Here we want the next port from portiter. But on StopIteration, + # we want to raise the original exception rather than + # StopIteration. So save the original exc_info(). + type, value, tb = sys.exc_info() + try: + try: + port = portiter.next() + except StopIteration: + raise type, value, tb + finally: + # Clean up local traceback, see docs for sys.exc_info() + del tb + + # Recap of the control flow above: + # If expr(port) doesn't raise, return as promised. + # If expr(port) raises anything but EADDRINUSE, propagate that + # exception. + # If portiter.next() raises StopIteration -- that is, if the port + # value we just passed to expr(port) was the last available -- reraise + # the EADDRINUSE exception. + # If we've actually arrived at this point, portiter.next() delivered a + # new port value. Loop back to pass that to expr(port). + def run(*args, **kwds): """All positional arguments collectively form a command line, executed as a synchronous child process. diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index 5af1122451..57ac7a143f 100644 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -232,27 +232,16 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa domPRef p = tri->getP(); domListOfUInts& idx = p->getValue(); - domListOfFloats v; - domListOfFloats tc; - domListOfFloats n; + domListOfFloats dummy ; + domListOfFloats& v = pos_source ? pos_source->getFloat_array()->getValue() : dummy ; + domListOfFloats& tc = tc_source ? tc_source->getFloat_array()->getValue() : dummy ; + domListOfFloats& n = norm_source ? norm_source->getFloat_array()->getValue() : dummy ; if (pos_source) { - v = pos_source->getFloat_array()->getValue(); face.mExtents[0].set(v[0], v[1], v[2]); face.mExtents[1].set(v[0], v[1], v[2]); } - - if (tc_source) - { - tc = tc_source->getFloat_array()->getValue(); - } - - if (norm_source) - { - n = norm_source->getFloat_array()->getValue(); - } - LLVolumeFace::VertexMapData::PointMap point_map; @@ -1002,6 +991,9 @@ void LLModel::normalizeVolumeFaces() scale.splat(1.f); scale.div(size); + LLVector4a inv_scale(1.f); + inv_scale.div(scale); + for (U32 i = 0; i < mVolumeFaces.size(); ++i) { LLVolumeFace& face = mVolumeFaces[i]; @@ -1018,10 +1010,14 @@ void LLModel::normalizeVolumeFaces() // For all the positions, we scale // the positions to fit within the unit cube. LLVector4a* pos = (LLVector4a*) face.mPositions; + LLVector4a* norm = (LLVector4a*) face.mNormals; + for (U32 j = 0; j < face.mNumVertices; ++j) { pos[j].add(trans); pos[j].mul(scale); + norm[j].mul(inv_scale); + norm[j].normalize3(); } } diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 99a1e5c826..a460912e70 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -105,7 +105,6 @@ LLMatrix4 gGLObliqueProjectionInverse; #define LL_GL_NAME_POOLING 0 -LLGLNamePool::pool_list_t LLGLNamePool::sInstances; std::list<LLGLUpdate*> LLGLUpdate::sGLQ; #if (LL_WINDOWS || LL_LINUX || LL_SOLARIS) && !LL_MESA_HEADLESS @@ -329,6 +328,7 @@ LLGLManager::LLGLManager() : mHasShaderObjects(FALSE), mHasVertexShader(FALSE), mHasFragmentShader(FALSE), + mNumTextureImageUnits(0), mHasOcclusionQuery(FALSE), mHasOcclusionQuery2(FALSE), mHasPointParameters(FALSE), @@ -535,6 +535,13 @@ bool LLGLManager::initGL() return false; } + if (mHasFragmentShader) + { + GLint num_tex_image_units; + glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &num_tex_image_units); + mNumTextureImageUnits = num_tex_image_units; + } + setToDebugGPU(); initGLStates(); @@ -879,11 +886,13 @@ void LLGLManager::initExtensions() LL_INFOS("RenderInit") << "Disabling mip-map generation for Intel GPUs" << LL_ENDL; mHasMipMapGeneration = FALSE; } +#if !LL_DARWIN if (mIsATI && mHasMipMapGeneration) { LL_INFOS("RenderInit") << "Disabling mip-map generation for ATI GPUs (performance opt)" << LL_ENDL; mHasMipMapGeneration = FALSE; } +#endif // Misc glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, (GLint*) &mGLMaxVertexRange); @@ -1945,22 +1954,8 @@ LLGLNamePool::LLGLNamePool() { } -void LLGLNamePool::registerPool(LLGLNamePool* pool) -{ - pool_list_t::iterator iter = std::find(sInstances.begin(), sInstances.end(), pool); - if (iter == sInstances.end()) - { - sInstances.push_back(pool); - } -} - LLGLNamePool::~LLGLNamePool() { - pool_list_t::iterator iter = std::find(sInstances.begin(), sInstances.end(), this); - if (iter != sInstances.end()) - { - sInstances.erase(iter); - } } void LLGLNamePool::upkeep() @@ -2029,20 +2024,22 @@ void LLGLNamePool::release(GLuint name) void LLGLNamePool::upkeepPools() { LLMemType mt(LLMemType::MTYPE_UPKEEP_POOLS); - for (pool_list_t::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter) + tracker_t::LLInstanceTrackerScopedGuard guard; + for (tracker_t::instance_iter iter = guard.beginInstances(); iter != guard.endInstances(); ++iter) { - LLGLNamePool* pool = *iter; - pool->upkeep(); + LLGLNamePool & pool = *iter; + pool.upkeep(); } } //static void LLGLNamePool::cleanupPools() { - for (pool_list_t::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter) + tracker_t::LLInstanceTrackerScopedGuard guard; + for (tracker_t::instance_iter iter = guard.beginInstances(); iter != guard.endInstances(); ++iter) { - LLGLNamePool* pool = *iter; - pool->cleanup(); + LLGLNamePool & pool = *iter; + pool.cleanup(); } } diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index c77d85ba2b..1d7ab188fc 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -40,6 +40,7 @@ #include "v4math.h" #include "llplane.h" #include "llgltypes.h" +#include "llinstancetracker.h" #include "llglheaders.h" #include "glh/glh_linear.h" @@ -90,6 +91,7 @@ public: BOOL mHasShaderObjects; BOOL mHasVertexShader; BOOL mHasFragmentShader; + S32 mNumTextureImageUnits; BOOL mHasOcclusionQuery; BOOL mHasOcclusionQuery2; BOOL mHasPointParameters; @@ -332,9 +334,11 @@ public: Generic pooling scheme for things which use GL names (used for occlusion queries and vertex buffer objects). Prevents thrashing of GL name caches by avoiding calls to glGenFoo and glDeleteFoo. */ -class LLGLNamePool +class LLGLNamePool : public LLInstanceTracker<LLGLNamePool> { public: + typedef LLInstanceTracker<LLGLNamePool> tracker_t; + struct NameEntry { GLuint name; @@ -361,13 +365,11 @@ public: GLuint allocate(); void release(GLuint name); - static void registerPool(LLGLNamePool* pool); static void upkeepPools(); static void cleanupPools(); protected: typedef std::vector<LLGLNamePool*> pool_list_t; - static pool_list_t sInstances; virtual GLuint allocateName() = 0; virtual void releaseName(GLuint name) = 0; diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index 49e10c4790..c37139ac4c 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -119,14 +119,29 @@ void LLTexUnit::refreshState(void) gGL.flush(); glActiveTextureARB(GL_TEXTURE0_ARB + mIndex); + + // + // Per apple spec, don't call glEnable/glDisable when index exceeds max texture units + // http://www.mailinglistarchive.com/html/mac-opengl@lists.apple.com/2008-07/msg00653.html + // + bool enableDisable = (mIndex < gGLManager.mNumTextureUnits); + if (mCurrTexType != TT_NONE) { - glEnable(sGLTextureType[mCurrTexType]); + if (enableDisable) + { + glEnable(sGLTextureType[mCurrTexType]); + } + glBindTexture(sGLTextureType[mCurrTexType], mCurrTexture); } else { - glDisable(GL_TEXTURE_2D); + if (enableDisable) + { + glDisable(GL_TEXTURE_2D); + } + glBindTexture(GL_TEXTURE_2D, 0); } @@ -167,7 +182,11 @@ void LLTexUnit::enable(eTextureType type) mCurrTexType = type; gGL.flush(); - glEnable(sGLTextureType[type]); + + if (mIndex < gGLManager.mNumTextureUnits) + { + glEnable(sGLTextureType[type]); + } } } @@ -180,7 +199,12 @@ void LLTexUnit::disable(void) activate(); unbind(mCurrTexType); gGL.flush(); - glDisable(sGLTextureType[mCurrTexType]); + + if (mIndex < gGLManager.mNumTextureUnits) + { + glDisable(sGLTextureType[mCurrTexType]); + } + mCurrTexType = TT_NONE; } } diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index cd2556d435..da1e94df64 100644 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -44,6 +44,7 @@ void check_framebuffer_status() case GL_FRAMEBUFFER_COMPLETE: break; default: + llwarns << "check_framebuffer_status failed -- " << std::hex << status << llendl; ll_fail("check_framebuffer_status failed"); break; } diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 21b02fdb71..98a0a93084 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -315,7 +315,7 @@ void LLShaderMgr::dumpObjectLog(GLhandleARB ret, BOOL warns) } else { - LL_DEBUGS("ShaderLoading") << log << LL_ENDL; + LL_INFOS("ShaderLoading") << log << LL_ENDL; } } } diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 73efbfc999..8c9171ccf4 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -383,10 +383,6 @@ void LLVertexBuffer::initClass(bool use_vbo, bool no_vbo_mapping) } sDisableVBOMapping = sEnableVBOs && no_vbo_mapping ; - LLGLNamePool::registerPool(&sDynamicVBOPool); - LLGLNamePool::registerPool(&sDynamicIBOPool); - LLGLNamePool::registerPool(&sStreamVBOPool); - LLGLNamePool::registerPool(&sStreamIBOPool); } //static @@ -633,7 +629,7 @@ void LLVertexBuffer::createGLBuffer() { static int gl_buffer_idx = 0; mGLBuffer = ++gl_buffer_idx; - mMappedData = (U8*) malloc(size); + mMappedData = (U8*) ll_aligned_malloc_16(size); } } @@ -667,7 +663,7 @@ void LLVertexBuffer::createGLIndices() } else { - mMappedIndexData = (U8*) malloc(size); + mMappedIndexData = (U8*) ll_aligned_malloc_16(size); static int gl_buffer_idx = 0; mGLIndices = ++gl_buffer_idx; } @@ -690,7 +686,7 @@ void LLVertexBuffer::destroyGLBuffer() } else { - free(mMappedData); + ll_aligned_free_16(mMappedData); mMappedData = NULL; mEmpty = TRUE; } @@ -719,7 +715,7 @@ void LLVertexBuffer::destroyGLIndices() } else { - free(mMappedIndexData); + ll_aligned_free_16(mMappedIndexData); mMappedIndexData = NULL; mEmpty = TRUE; } @@ -852,8 +848,8 @@ void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices) { if (!useVBOs()) { - free(mMappedData); - mMappedData = (U8*) malloc(newsize); + ll_aligned_free_16(mMappedData); + mMappedData = (U8*) ll_aligned_malloc_16(newsize); } mResized = TRUE; } @@ -873,8 +869,8 @@ void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices) { if (!useVBOs()) { - free(mMappedIndexData); - mMappedIndexData = (U8*) malloc(new_index_size); + ll_aligned_free_16(mMappedIndexData); + mMappedIndexData = (U8*) ll_aligned_malloc_16(new_index_size); } mResized = TRUE; } @@ -915,8 +911,8 @@ void LLVertexBuffer::freeClientBuffer() { if(useVBOs() && sDisableVBOMapping && (mMappedData || mMappedIndexData)) { - free(mMappedData) ; - free(mMappedIndexData) ; + ll_aligned_free_16(mMappedData) ; + ll_aligned_free_16(mMappedIndexData) ; mMappedData = NULL ; mMappedIndexData = NULL ; } @@ -926,7 +922,7 @@ void LLVertexBuffer::allocateClientVertexBuffer() { if(!mMappedData) { - mMappedData = (U8*)malloc(getSize()); + mMappedData = (U8*)ll_aligned_malloc_16(getSize()); } } @@ -934,7 +930,7 @@ void LLVertexBuffer::allocateClientIndexBuffer() { if(!mMappedIndexData) { - mMappedIndexData = (U8*)malloc(getIndicesSize()); + mMappedIndexData = (U8*)ll_aligned_malloc_16(getIndicesSize()); } } diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h index 16aa49b653..0cfc393e05 100644 --- a/indra/llui/llbutton.h +++ b/indra/llui/llbutton.h @@ -27,7 +27,6 @@ #ifndef LL_LLBUTTON_H #define LL_LLBUTTON_H -#include "lluuid.h" #include "llcontrol.h" #include "lluictrl.h" #include "v4color.h" @@ -53,6 +52,8 @@ S32 round_up(S32 grid, S32 value); class LLUICtrlFactory; +class LLUIImage; +class LLUUID; // // Classes diff --git a/indra/llui/llfloaterreg.h b/indra/llui/llfloaterreg.h index 94387fb41a..8414b92113 100644 --- a/indra/llui/llfloaterreg.h +++ b/indra/llui/llfloaterreg.h @@ -27,14 +27,9 @@ #define LLFLOATERREG_H /// llcommon -#include "llboost.h" #include "llrect.h" -#include "llstl.h" #include "llsd.h" -/// llui -#include "lluictrl.h" - #include <boost/function.hpp> //******************************************************* @@ -43,6 +38,7 @@ // class LLFloater; +class LLUICtrl; typedef boost::function<LLFloater* (const LLSD& key)> LLFloaterBuildFunc; diff --git a/indra/llui/llfocusmgr.cpp b/indra/llui/llfocusmgr.cpp index 43e5f6b051..724d190307 100644 --- a/indra/llui/llfocusmgr.cpp +++ b/indra/llui/llfocusmgr.cpp @@ -113,6 +113,16 @@ boost::signals2::connection LLFocusableElement::setTopLostCallback(const focus_s +typedef std::list<LLHandle<LLView> > view_handle_list_t; +typedef std::map<LLHandle<LLView>, LLHandle<LLView> > focus_history_map_t; +struct LLFocusMgr::Impl +{ + // caching list of keyboard focus ancestors for calling onFocusReceived and onFocusLost + view_handle_list_t mCachedKeyboardFocusList; + + focus_history_map_t mFocusHistory; +}; + LLFocusMgr gFocusMgr; LLFocusMgr::LLFocusMgr() @@ -123,10 +133,17 @@ LLFocusMgr::LLFocusMgr() mDefaultKeyboardFocus( NULL ), mKeystrokesOnly(FALSE), mTopCtrl( NULL ), - mAppHasFocus(TRUE) // Macs don't seem to notify us that we've gotten focus, so default to true + mAppHasFocus(TRUE), // Macs don't seem to notify us that we've gotten focus, so default to true + mImpl(new LLFocusMgr::Impl) { } +LLFocusMgr::~LLFocusMgr() +{ + mImpl->mFocusHistory.clear(); + delete mImpl; + mImpl = NULL; +} void LLFocusMgr::releaseFocusIfNeeded( LLView* view ) { @@ -179,7 +196,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL mKeyboardFocus = new_focus; // list of the focus and it's ancestors - view_handle_list_t old_focus_list = mCachedKeyboardFocusList; + view_handle_list_t old_focus_list = mImpl->mCachedKeyboardFocusList; view_handle_list_t new_focus_list; // walk up the tree to root and add all views to the new_focus_list @@ -206,7 +223,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL LLView* old_focus_view = old_focus_iter->get(); if (old_focus_view) { - mCachedKeyboardFocusList.pop_front(); + mImpl->mCachedKeyboardFocusList.pop_front(); old_focus_view->onFocusLost(); } } @@ -219,7 +236,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL LLView* new_focus_view = new_focus_riter->get(); if (new_focus_view) { - mCachedKeyboardFocusList.push_front(new_focus_view->getHandle()); + mImpl->mCachedKeyboardFocusList.push_front(new_focus_view->getHandle()); new_focus_view->onFocusReceived(); } } @@ -254,7 +271,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL if (focus_subtree) { LLView* focused_view = dynamic_cast<LLView*>(mKeyboardFocus); - mFocusHistory[focus_subtree->getHandle()] = focused_view ? focused_view->getHandle() : LLHandle<LLView>(); + mImpl->mFocusHistory[focus_subtree->getHandle()] = focused_view ? focused_view->getHandle() : LLHandle<LLView>(); } } @@ -456,8 +473,8 @@ LLUICtrl* LLFocusMgr::getLastFocusForGroup(LLView* subtree_root) const { if (subtree_root) { - focus_history_map_t::const_iterator found_it = mFocusHistory.find(subtree_root->getHandle()); - if (found_it != mFocusHistory.end()) + focus_history_map_t::const_iterator found_it = mImpl->mFocusHistory.find(subtree_root->getHandle()); + if (found_it != mImpl->mFocusHistory.end()) { // found last focus for this subtree return static_cast<LLUICtrl*>(found_it->second.get()); @@ -470,6 +487,6 @@ void LLFocusMgr::clearLastFocusForGroup(LLView* subtree_root) { if (subtree_root) { - mFocusHistory.erase(subtree_root->getHandle()); + mImpl->mFocusHistory.erase(subtree_root->getHandle()); } } diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h index 22c1895075..25ae1d2579 100644 --- a/indra/llui/llfocusmgr.h +++ b/indra/llui/llfocusmgr.h @@ -74,7 +74,7 @@ class LLFocusMgr { public: LLFocusMgr(); - ~LLFocusMgr() { mFocusHistory.clear(); } + ~LLFocusMgr(); // Mouse Captor void setMouseCapture(LLMouseHandler* new_captor); // new_captor = NULL to release the mouse. @@ -120,6 +120,8 @@ public: bool keyboardFocusHasAccelerators() const; + struct Impl; + private: LLUICtrl* mLockedView; @@ -132,10 +134,6 @@ private: LLFocusableElement* mDefaultKeyboardFocus; BOOL mKeystrokesOnly; - // caching list of keyboard focus ancestors for calling onFocusReceived and onFocusLost - typedef std::list<LLHandle<LLView> > view_handle_list_t; - view_handle_list_t mCachedKeyboardFocusList; - // Top View LLUICtrl* mTopCtrl; @@ -143,8 +141,7 @@ private: BOOL mAppHasFocus; - typedef std::map<LLHandle<LLView>, LLHandle<LLView> > focus_history_map_t; - focus_history_map_t mFocusHistory; + Impl * mImpl; }; extern LLFocusMgr gFocusMgr; diff --git a/indra/llui/lliconctrl.h b/indra/llui/lliconctrl.h index 669e126266..efa0925a4a 100644 --- a/indra/llui/lliconctrl.h +++ b/indra/llui/lliconctrl.h @@ -30,6 +30,7 @@ #include "lluuid.h" #include "v4color.h" #include "lluictrl.h" +#include "lluiimage.h" #include "stdenums.h" class LLTextBox; diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 7b5fa218f2..fe191e5971 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -41,6 +41,7 @@ #include "lleditmenuhandler.h" #include "lluictrl.h" +#include "lluiimage.h" #include "lluistring.h" #include "llviewborder.h" diff --git a/indra/llui/llloadingindicator.h b/indra/llui/llloadingindicator.h index c0cb1cc74a..4c47cc267c 100644 --- a/indra/llui/llloadingindicator.h +++ b/indra/llui/llloadingindicator.h @@ -28,6 +28,7 @@ #define LL_LLLOADINGINDICATOR_H #include "lluictrl.h" +#include "lluiimage.h" /////////////////////////////////////////////////////////////////////////////// // class LLLoadingIndicator diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp index d4e6091ee0..f744e9db41 100644 --- a/indra/llui/llmultislider.cpp +++ b/indra/llui/llmultislider.cpp @@ -35,6 +35,7 @@ #include "llkeyboard.h" // for the MASK constants #include "llcontrol.h" #include "lluictrlfactory.h" +#include "lluiimage.h" #include <sstream> diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index bdac125eb0..6085c61f9a 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -1532,7 +1532,7 @@ bool LLNotifications::loadVisibilityRules() // Add a simple notification (from XUI) void LLNotifications::addFromCallback(const LLSD& name) { - add(LLNotification::Params().name(name.asString())); + add(name.asString(), LLSD(), LLSD()); } LLNotificationPtr LLNotifications::add(const std::string& name, diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h index c1a1a06f39..7bbbeaf709 100644 --- a/indra/llui/llpanel.h +++ b/indra/llui/llpanel.h @@ -32,6 +32,7 @@ #include "llcallbackmap.h" #include "lluictrl.h" #include "llviewborder.h" +#include "lluiimage.h" #include "lluistring.h" #include "v4color.h" #include <list> diff --git a/indra/llui/llprogressbar.cpp b/indra/llui/llprogressbar.cpp index ead22686bc..84a890edfa 100644 --- a/indra/llui/llprogressbar.cpp +++ b/indra/llui/llprogressbar.cpp @@ -38,6 +38,7 @@ #include "llfocusmgr.h" #include "lluictrlfactory.h" +#include "lluiimage.h" static LLDefaultChildRegistry::Register<LLProgressBar> r("progress_bar"); diff --git a/indra/llui/llprogressbar.h b/indra/llui/llprogressbar.h index 3f308e7496..a8ec83ea00 100644 --- a/indra/llui/llprogressbar.h +++ b/indra/llui/llprogressbar.h @@ -27,8 +27,9 @@ #ifndef LL_LLPROGRESSBAR_H #define LL_LLPROGRESSBAR_H -#include "lluictrl.h" #include "llframetimer.h" +#include "lluictrl.h" +#include "lluiimage.h" class LLProgressBar : public LLUICtrl diff --git a/indra/llui/llslider.h b/indra/llui/llslider.h index 68823ed68e..700c17ea3e 100644 --- a/indra/llui/llslider.h +++ b/indra/llui/llslider.h @@ -29,6 +29,7 @@ #include "llf32uictrl.h" #include "v4color.h" +#include "lluiimage.h" class LLSlider : public LLF32UICtrl { diff --git a/indra/llui/llstyle.cpp b/indra/llui/llstyle.cpp index 28a064e6b6..bb731f4f7e 100644 --- a/indra/llui/llstyle.cpp +++ b/indra/llui/llstyle.cpp @@ -88,7 +88,7 @@ void LLStyle::setVisible(BOOL is_visible) mVisible = is_visible; } -LLUIImagePtr LLStyle::getImage() const +LLPointer<LLUIImage> LLStyle::getImage() const { return mImagep; } diff --git a/indra/llui/llstyle.h b/indra/llui/llstyle.h index 322edc343c..9f1eba79d8 100644 --- a/indra/llui/llstyle.h +++ b/indra/llui/llstyle.h @@ -30,6 +30,7 @@ #include "v4color.h" #include "llui.h" #include "llinitparam.h" +#include "lluiimage.h" class LLFontGL; @@ -72,7 +73,7 @@ public: void setLinkHREF(const std::string& href); BOOL isLink() const; - LLUIImagePtr getImage() const; + LLPointer<LLUIImage> getImage() const; void setImage(const LLUUID& src); void setImage(const std::string& name); @@ -108,7 +109,7 @@ private: const LLFontGL* mFont; std::string mLink; bool mIsLink; - LLUIImagePtr mImagep; + LLPointer<LLUIImage> mImagep; }; typedef LLPointer<LLStyle> LLStyleSP; diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 1c19a33c4e..1cc3cc04d6 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1164,7 +1164,7 @@ void LLTextBase::reflow() S32 first_line = getFirstVisibleLine(); // if scroll anchor not on first line, update it to first character of first line - if (!mLineInfoList.empty() + if ((first_line < mLineInfoList.size()) && (mScrollIndex < mLineInfoList[first_line].mDocIndexStart || mScrollIndex >= mLineInfoList[first_line].mDocIndexEnd)) { diff --git a/indra/llui/lltransutil.cpp b/indra/llui/lltransutil.cpp index 9d0ff9d5cb..58fa8a0828 100644 --- a/indra/llui/lltransutil.cpp +++ b/indra/llui/lltransutil.cpp @@ -26,10 +26,11 @@ #include "linden_common.h" +#include "lltransutil.h" + #include "lltrans.h" #include "lluictrlfactory.h" - -#include "lltransutil.h" +#include "llxmlnode.h" bool LLTransUtil::parseStrings(const std::string& xml_filename, const std::set<std::string>& default_args) diff --git a/indra/llui/llui.h b/indra/llui/llui.h index 6a43477693..c583d58d5a 100644 --- a/indra/llui/llui.h +++ b/indra/llui/llui.h @@ -33,15 +33,12 @@ #include "llrect.h" #include "llcontrol.h" #include "llcoord.h" -#include "lluiimage.h" // *TODO: break this dependency, need to add #include "lluiimage.h" to all widgets that hold an Optional<LLUIImage*> in their paramblocks #include "llinitparam.h" #include "llregistry.h" #include "lluicolor.h" #include "lluicolortable.h" #include <boost/signals2.hpp> #include "lllazyvalue.h" -#include "llhandle.h" // *TODO: remove this dependency, added as a - // convenience when LLHandle moved to llhandle.h #include "llframetimer.h" // LLUIFactory @@ -265,8 +262,6 @@ private: // Moved LLLocalClipRect to lllocalcliprect.h -// Moved all LLHandle-related code to llhandle.h - //RN: maybe this needs to moved elsewhere? class LLImageProviderInterface { diff --git a/indra/llui/llview.h b/indra/llui/llview.h index 9ab0797f9e..594a5eec6b 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -34,6 +34,7 @@ #include "stdtypes.h" #include "llcoord.h" #include "llfontgl.h" +#include "llhandle.h" #include "llmortician.h" #include "llmousehandler.h" #include "llstring.h" diff --git a/indra/llui/llviewborder.cpp b/indra/llui/llviewborder.cpp index 89cd34c37c..32d7ea7c25 100644 --- a/indra/llui/llviewborder.cpp +++ b/indra/llui/llviewborder.cpp @@ -28,6 +28,7 @@ #include "llrender.h" #include "llfocusmgr.h" #include "lluictrlfactory.h" +#include "lluiimage.h" static LLDefaultChildRegistry::Register<LLViewBorder> r("view_border"); diff --git a/indra/llui/llwindowshade.h b/indra/llui/llwindowshade.h index 0047195929..09ffc2cd54 100644 --- a/indra/llui/llwindowshade.h +++ b/indra/llui/llwindowshade.h @@ -29,6 +29,7 @@ #include "lluictrl.h" #include "llnotifications.h" +#include "lluiimage.h" class LLWindowShade : public LLUICtrl { diff --git a/indra/llvfs/CMakeLists.txt b/indra/llvfs/CMakeLists.txt index 569674ecf0..b6d1ce61e5 100644 --- a/indra/llvfs/CMakeLists.txt +++ b/indra/llvfs/CMakeLists.txt @@ -12,6 +12,7 @@ include_directories( set(llvfs_SOURCE_FILES lldir.cpp + lldiriterator.cpp lllfsthread.cpp llpidlock.cpp llvfile.cpp @@ -24,6 +25,7 @@ set(llvfs_HEADER_FILES lldir.h lldirguard.h + lldiriterator.h lllfsthread.h llpidlock.h llvfile.h @@ -60,6 +62,11 @@ list(APPEND llvfs_SOURCE_FILES ${llvfs_HEADER_FILES}) add_library (llvfs ${llvfs_SOURCE_FILES}) +target_link_libraries(llvfs + ${BOOST_FILESYSTEM_LIBRARY} + ${BOOST_SYSTEM_LIBRARY} + ) + if (DARWIN) include(CMakeFindFrameworks) find_library(CARBON_LIBRARY Carbon) diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index 341c96f6ea..f3ac17d612 100644 --- a/indra/llvfs/lldir.cpp +++ b/indra/llvfs/lldir.cpp @@ -40,6 +40,8 @@ #include "lltimer.h" // ms_sleep() #include "lluuid.h" +#include "lldiriterator.h" + #if LL_WINDOWS #include "lldir_win32.h" LLDir_Win32 gDirUtil; @@ -83,7 +85,9 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask) std::string filename; std::string fullpath; S32 result; - while (getNextFileInDir(dirname, mask, filename)) + + LLDirIterator iter(dirname, mask); + while (iter.next(filename)) { fullpath = dirname; fullpath += getDirDelimiter(); diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h index 42996fd051..5ee8bdb542 100644 --- a/indra/llvfs/lldir.h +++ b/indra/llvfs/lldir.h @@ -75,31 +75,6 @@ class LLDir // pure virtual functions virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask) = 0; - /// Walk the files in a directory, with file pattern matching - virtual BOOL getNextFileInDir(const std::string& dirname, ///< directory path - must end in trailing slash! - const std::string& mask, ///< file pattern string (use "*" for all) - std::string& fname ///< output: found file name - ) = 0; - /**< - * @returns true if a file was found, false if the entire directory has been scanned. - * - * @note that this function is NOT thread safe - * - * This function may not be used to scan part of a directory, then start a new search of a different - * directory, and then restart the first search where it left off; the entire search must run to - * completion or be abandoned - there is no restart. - * - * @bug: See http://jira.secondlife.com/browse/VWR-23697 - * and/or the tests in test/lldir_test.cpp - * This is known to fail with patterns that have both: - * a wildcard left of a . and more than one sequential ? right of a . - * the pattern foo.??x appears to work - * but *.??x or foo?.??x do not - * - * @todo this really should be rewritten as an iterator object, and the - * filtering should be done in a platform-independent way. - */ - virtual std::string getCurPath() = 0; virtual BOOL fileExists(const std::string &filename) const = 0; diff --git a/indra/llvfs/lldir_linux.cpp b/indra/llvfs/lldir_linux.cpp index 72b54f5380..407f3b93fb 100644 --- a/indra/llvfs/lldir_linux.cpp +++ b/indra/llvfs/lldir_linux.cpp @@ -242,68 +242,6 @@ U32 LLDir_Linux::countFilesInDir(const std::string &dirname, const std::string & return (file_count); } -// get the next file in the directory -BOOL LLDir_Linux::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) -{ - glob_t g; - BOOL result = FALSE; - fname = ""; - - if(!(dirname == mCurrentDir)) - { - // different dir specified, close old search - mCurrentDirIndex = -1; - mCurrentDirCount = -1; - mCurrentDir = dirname; - } - - std::string tmp_str; - tmp_str = dirname; - tmp_str += mask; - - if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0) - { - if(g.gl_pathc > 0) - { - if((int)g.gl_pathc != mCurrentDirCount) - { - // Number of matches has changed since the last search, meaning a file has been added or deleted. - // Reset the index. - mCurrentDirIndex = -1; - mCurrentDirCount = g.gl_pathc; - } - - mCurrentDirIndex++; - - if(mCurrentDirIndex < (int)g.gl_pathc) - { -// llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl; - - // The API wants just the filename, not the full path. - //fname = g.gl_pathv[mCurrentDirIndex]; - - char *s = strrchr(g.gl_pathv[mCurrentDirIndex], '/'); - - if(s == NULL) - s = g.gl_pathv[mCurrentDirIndex]; - else if(s[0] == '/') - s++; - - fname = s; - - result = TRUE; - } - } - - globfree(&g); - } - - return(result); -} - - - - std::string LLDir_Linux::getCurPath() { char tmp_str[LL_MAX_PATH]; /* Flawfinder: ignore */ diff --git a/indra/llvfs/lldir_linux.h b/indra/llvfs/lldir_linux.h index a34de1241d..7603239867 100644 --- a/indra/llvfs/lldir_linux.h +++ b/indra/llvfs/lldir_linux.h @@ -47,7 +47,6 @@ public: virtual std::string getCurPath(); virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); - virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname); /*virtual*/ BOOL fileExists(const std::string &filename) const; /*virtual*/ std::string getLLPluginLauncher(); diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp index f9369b043e..8f48f92e2a 100644 --- a/indra/llvfs/lldir_mac.cpp +++ b/indra/llvfs/lldir_mac.cpp @@ -258,67 +258,6 @@ U32 LLDir_Mac::countFilesInDir(const std::string &dirname, const std::string &ma return (file_count); } -// get the next file in the directory -BOOL LLDir_Mac::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) -{ - glob_t g; - BOOL result = FALSE; - fname = ""; - - if(!(dirname == mCurrentDir)) - { - // different dir specified, close old search - mCurrentDirIndex = -1; - mCurrentDirCount = -1; - mCurrentDir = dirname; - } - - std::string tmp_str; - tmp_str = dirname; - tmp_str += mask; - - if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0) - { - if(g.gl_pathc > 0) - { - if(g.gl_pathc != mCurrentDirCount) - { - // Number of matches has changed since the last search, meaning a file has been added or deleted. - // Reset the index. - mCurrentDirIndex = -1; - mCurrentDirCount = g.gl_pathc; - } - - mCurrentDirIndex++; - - if(mCurrentDirIndex < g.gl_pathc) - { -// llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl; - - // The API wants just the filename, not the full path. - //fname = g.gl_pathv[mCurrentDirIndex]; - - char *s = strrchr(g.gl_pathv[mCurrentDirIndex], '/'); - - if(s == NULL) - s = g.gl_pathv[mCurrentDirIndex]; - else if(s[0] == '/') - s++; - - fname = s; - - result = TRUE; - } - } - - globfree(&g); - } - - return(result); -} - - - S32 LLDir_Mac::deleteFilesInDir(const std::string &dirname, const std::string &mask) { glob_t g; diff --git a/indra/llvfs/lldir_mac.h b/indra/llvfs/lldir_mac.h index b456d3afca..bc3f0fac00 100644 --- a/indra/llvfs/lldir_mac.h +++ b/indra/llvfs/lldir_mac.h @@ -47,7 +47,6 @@ public: virtual S32 deleteFilesInDir(const std::string &dirname, const std::string &mask); virtual std::string getCurPath(); virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); - virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname); virtual BOOL fileExists(const std::string &filename) const; /*virtual*/ std::string getLLPluginLauncher(); diff --git a/indra/llvfs/lldir_solaris.cpp b/indra/llvfs/lldir_solaris.cpp index 515fd66b6e..21f8c3acdb 100644 --- a/indra/llvfs/lldir_solaris.cpp +++ b/indra/llvfs/lldir_solaris.cpp @@ -260,68 +260,6 @@ U32 LLDir_Solaris::countFilesInDir(const std::string &dirname, const std::string return (file_count); } -// get the next file in the directory -BOOL LLDir_Solaris::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) -{ - glob_t g; - BOOL result = FALSE; - fname = ""; - - if(!(dirname == mCurrentDir)) - { - // different dir specified, close old search - mCurrentDirIndex = -1; - mCurrentDirCount = -1; - mCurrentDir = dirname; - } - - std::string tmp_str; - tmp_str = dirname; - tmp_str += mask; - - if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0) - { - if(g.gl_pathc > 0) - { - if((int)g.gl_pathc != mCurrentDirCount) - { - // Number of matches has changed since the last search, meaning a file has been added or deleted. - // Reset the index. - mCurrentDirIndex = -1; - mCurrentDirCount = g.gl_pathc; - } - - mCurrentDirIndex++; - - if(mCurrentDirIndex < (int)g.gl_pathc) - { -// llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl; - - // The API wants just the filename, not the full path. - //fname = g.gl_pathv[mCurrentDirIndex]; - - char *s = strrchr(g.gl_pathv[mCurrentDirIndex], '/'); - - if(s == NULL) - s = g.gl_pathv[mCurrentDirIndex]; - else if(s[0] == '/') - s++; - - fname = s; - - result = TRUE; - } - } - - globfree(&g); - } - - return(result); -} - - - - std::string LLDir_Solaris::getCurPath() { char tmp_str[LL_MAX_PATH]; /* Flawfinder: ignore */ diff --git a/indra/llvfs/lldir_solaris.h b/indra/llvfs/lldir_solaris.h index 70fac6f818..0b58a45b15 100644 --- a/indra/llvfs/lldir_solaris.h +++ b/indra/llvfs/lldir_solaris.h @@ -47,7 +47,6 @@ public: virtual std::string getCurPath(); virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); - virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname); /*virtual*/ BOOL fileExists(const std::string &filename) const; private: diff --git a/indra/llvfs/lldir_win32.cpp b/indra/llvfs/lldir_win32.cpp index 4e2a55f4b3..7709945123 100644 --- a/indra/llvfs/lldir_win32.cpp +++ b/indra/llvfs/lldir_win32.cpp @@ -240,67 +240,6 @@ U32 LLDir_Win32::countFilesInDir(const std::string &dirname, const std::string & return (file_count); } - -// get the next file in the directory -BOOL LLDir_Win32::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) -{ - BOOL fileFound = FALSE; - fname = ""; - - WIN32_FIND_DATAW FileData; - llutf16string pathname = utf8str_to_utf16str(dirname) + utf8str_to_utf16str(mask); - - if (pathname != mCurrentDir) - { - // different dir specified, close old search - if (!mCurrentDir.empty()) - { - FindClose(mDirSearch_h); - } - mCurrentDir = pathname; - - // and open new one - // Check error opening Directory structure - if ((mDirSearch_h = FindFirstFile(pathname.c_str(), &FileData)) != INVALID_HANDLE_VALUE) - { - fileFound = TRUE; - } - } - - // Loop to skip over the current (.) and parent (..) directory entries - // (apparently returned in Win7 but not XP) - do - { - if ( fileFound - && ( (lstrcmp(FileData.cFileName, (LPCTSTR)TEXT(".")) == 0) - ||(lstrcmp(FileData.cFileName, (LPCTSTR)TEXT("..")) == 0) - ) - ) - { - fileFound = FALSE; - } - } while ( mDirSearch_h != INVALID_HANDLE_VALUE - && !fileFound - && (fileFound = FindNextFile(mDirSearch_h, &FileData) - ) - ); - - if (!fileFound && GetLastError() == ERROR_NO_MORE_FILES) - { - // No more files, so reset to beginning of directory - FindClose(mDirSearch_h); - mCurrentDir[0] = '\000'; - } - - if (fileFound) - { - // convert from TCHAR to char - fname = utf16str_to_utf8str(FileData.cFileName); - } - - return fileFound; -} - std::string LLDir_Win32::getCurPath() { WCHAR w_str[MAX_PATH]; diff --git a/indra/llvfs/lldir_win32.h b/indra/llvfs/lldir_win32.h index b170ebbcd7..62fb4713ab 100644 --- a/indra/llvfs/lldir_win32.h +++ b/indra/llvfs/lldir_win32.h @@ -44,15 +44,12 @@ public: /*virtual*/ std::string getCurPath(); /*virtual*/ U32 countFilesInDir(const std::string &dirname, const std::string &mask); - /*virtual*/ BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname); /*virtual*/ BOOL fileExists(const std::string &filename) const; /*virtual*/ std::string getLLPluginLauncher(); /*virtual*/ std::string getLLPluginFilename(std::string base_name); private: - BOOL getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname); - void* mDirSearch_h; llutf16string mCurrentDir; }; diff --git a/indra/llvfs/lldiriterator.cpp b/indra/llvfs/lldiriterator.cpp index 5536ed8f69..041436ed92 100644 --- a/indra/llvfs/lldiriterator.cpp +++ b/indra/llvfs/lldiriterator.cpp @@ -55,7 +55,7 @@ LLDirIterator::Impl::Impl(const std::string &dirname, const std::string &mask) // Check if path exists. if (!fs::exists(dir_path)) { - llerrs << "Invalid path: \"" << dir_path.string() << "\"" << llendl; + llwarns << "Invalid path: \"" << dir_path.string() << "\"" << llendl; return; } @@ -100,7 +100,7 @@ bool LLDirIterator::Impl::next(std::string &fname) if (!mIsValid) { - llerrs << "The iterator is not correctly initialized." << llendl; + llwarns << "The iterator is not correctly initialized." << llendl; return false; } diff --git a/indra/llvfs/llvfs.cpp b/indra/llvfs/llvfs.cpp index 20e10041f4..82c926620a 100644 --- a/indra/llvfs/llvfs.cpp +++ b/indra/llvfs/llvfs.cpp @@ -26,6 +26,8 @@ #include "linden_common.h" +#include "llvfs.h" + #include <sys/stat.h> #include <set> #include <map> @@ -39,8 +41,6 @@ #include <sys/file.h> #endif -#include "llvfs.h" - #include "llstl.h" #include "lltimer.h" @@ -1711,7 +1711,8 @@ void LLVFS::audit() BOOL vfs_corrupt = FALSE; - std::vector<U8> buffer(index_size); + // since we take the address of element 0, we need to have at least one element. + std::vector<U8> buffer(llmax<size_t>(index_size,1U)); if (fread(&buffer[0], 1, index_size, mIndexFP) != index_size) { diff --git a/indra/llvfs/tests/lldir_test.cpp b/indra/llvfs/tests/lldir_test.cpp index 8788bd63e8..ea321c5ae9 100644 --- a/indra/llvfs/tests/lldir_test.cpp +++ b/indra/llvfs/tests/lldir_test.cpp @@ -28,6 +28,7 @@ #include "linden_common.h" #include "../lldir.h" +#include "../lldiriterator.h" #include "../test/lltut.h" @@ -259,13 +260,12 @@ namespace tut std::string makeTestFile( const std::string& dir, const std::string& file ) { - std::string delim = gDirUtilp->getDirDelimiter(); - std::string path = dir + delim + file; + std::string path = dir + file; LLFILE* handle = LLFile::fopen( path, "w" ); ensure("failed to open test file '"+path+"'", handle != NULL ); // Harbison & Steele, 4th ed., p. 366: "If an error occurs, fputs // returns EOF; otherwise, it returns some other, nonnegative value." - ensure("failed to write to test file '"+path+"'", fputs("test file", handle) >= 0); + ensure("failed to write to test file '"+path+"'", EOF != fputs("test file", handle) ); fclose(handle); return path; } @@ -290,7 +290,7 @@ namespace tut } static const char* DirScanFilename[5] = { "file1.abc", "file2.abc", "file1.xyz", "file2.xyz", "file1.mno" }; - + void scanTest(const std::string& directory, const std::string& pattern, bool correctResult[5]) { @@ -300,7 +300,8 @@ namespace tut bool filesFound[5] = { false, false, false, false, false }; //std::cerr << "searching '"+directory+"' for '"+pattern+"'\n"; - while ( found <= 5 && gDirUtilp->getNextFileInDir(directory, pattern, scanResult) ) + LLDirIterator iter(directory, pattern); + while ( found <= 5 && iter.next(scanResult) ) { found++; //std::cerr << " found '"+scanResult+"'\n"; @@ -334,15 +335,15 @@ namespace tut template<> template<> void LLDirTest_object_t::test<5>() - // getNextFileInDir + // LLDirIterator::next { std::string delim = gDirUtilp->getDirDelimiter(); std::string dirTemp = LLFile::tmpdir(); // Create the same 5 file names of the two directories - std::string dir1 = makeTestDir(dirTemp + "getNextFileInDir"); - std::string dir2 = makeTestDir(dirTemp + "getNextFileInDir"); + std::string dir1 = makeTestDir(dirTemp + "LLDirIterator"); + std::string dir2 = makeTestDir(dirTemp + "LLDirIterator"); std::string dir1files[5]; std::string dir2files[5]; for (int i=0; i<5; i++) @@ -380,19 +381,17 @@ namespace tut scanTest(dir2, "file?.x?z", expected7); // Scan dir2 and see if any file?.??c files are found - // THESE FAIL ON Mac and Windows, SO ARE COMMENTED OUT FOR NOW - // bool expected8[5] = { true, true, false, false, false }; - // scanTest(dir2, "file?.??c", expected8); - // scanTest(dir2, "*.??c", expected8); + bool expected8[5] = { true, true, false, false, false }; + scanTest(dir2, "file?.??c", expected8); + scanTest(dir2, "*.??c", expected8); // Scan dir1 and see if any *.?n? files are found bool expected9[5] = { false, false, false, false, true }; scanTest(dir1, "*.?n?", expected9); // Scan dir1 and see if any *.???? files are found - // THIS ONE FAILS ON WINDOWS (returns three charater suffixes) SO IS COMMENTED OUT FOR NOW - // bool expected10[5] = { false, false, false, false, false }; - // scanTest(dir1, "*.????", expected10); + bool expected10[5] = { false, false, false, false, false }; + scanTest(dir1, "*.????", expected10); // Scan dir1 and see if any ?????.* files are found bool expected11[5] = { true, true, true, true, true }; @@ -402,6 +401,15 @@ namespace tut bool expected12[5] = { false, false, true, true, false }; scanTest(dir1, "??l??.xyz", expected12); + bool expected13[5] = { true, false, true, false, false }; + scanTest(dir1, "file1.{abc,xyz}", expected13); + + bool expected14[5] = { true, true, false, false, false }; + scanTest(dir1, "file[0-9].abc", expected14); + + bool expected15[5] = { true, true, false, false, false }; + scanTest(dir1, "file[!a-z].abc", expected15); + // clean up all test files and directories for (int i=0; i<5; i++) { diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index affd7276cc..cb2abc5bc0 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -108,9 +108,6 @@ static long getDictLong (CFDictionaryRef refDict, CFStringRef key); static EventTypeSpec WindowHandlerEventList[] = { // Window-related events - // { kEventClassWindow, kEventWindowCollapsing }, - // { kEventClassWindow, kEventWindowCollapsed }, - // { kEventClassWindow, kEventWindowShown }, { kEventClassWindow, kEventWindowActivated }, { kEventClassWindow, kEventWindowDeactivated }, { kEventClassWindow, kEventWindowShown }, @@ -121,8 +118,7 @@ static EventTypeSpec WindowHandlerEventList[] = { kEventClassWindow, kEventWindowClose }, { kEventClassWindow, kEventWindowBoundsChanging }, { kEventClassWindow, kEventWindowBoundsChanged }, - // { kEventClassWindow, kEventWindowZoomed }, - // { kEventClassWindow, kEventWindowDrawContent }, + { kEventClassWindow, kEventWindowGetIdealSize }, // Mouse events { kEventClassMouse, kEventMouseDown }, @@ -248,6 +244,7 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks, mCursorIgnoreNextDelta = FALSE; mNeedsResize = FALSE; mOverrideAspectRatio = 0.f; + mMaximized = FALSE; mMinimized = FALSE; mTSMDocument = NULL; // Just in case. mLanguageTextInputAllowed = FALSE; @@ -455,24 +452,23 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits if(!mFullscreen && (mWindow == NULL)) { - Rect window_rect; //int displayWidth = CGDisplayPixelsWide(mDisplay); //int displayHeight = CGDisplayPixelsHigh(mDisplay); //const int menuBarPlusTitleBar = 44; // Ugly magic number. LL_DEBUGS("Window") << "createContext: creating window" << LL_ENDL; - window_rect.left = (long) x; - window_rect.right = (long) x + width; - window_rect.top = (long) y; - window_rect.bottom = (long) y + height; + mPreviousWindowRect.left = (long) x; + mPreviousWindowRect.right = (long) x + width; + mPreviousWindowRect.top = (long) y; + mPreviousWindowRect.bottom = (long) y + height; //----------------------------------------------------------------------- // Create the window //----------------------------------------------------------------------- mWindow = NewCWindow( NULL, - &window_rect, + &mPreviousWindowRect, mWindowTitle, false, // Create the window invisible. Whoever calls createContext() should show it after any moving/resizing. // noGrowDocProc, // Window with no grow box and no zoom box @@ -481,8 +477,7 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits kFirstWindowOfClass, true, (long)this); - - + if (!mWindow) { setupFailure("Window creation error", "Error", OSMB_OK); @@ -541,20 +536,20 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits GLint fullscreenAttrib[] = { AGL_RGBA, - AGL_FULLSCREEN, - // AGL_NO_RECOVERY, // MBW -- XXX -- Not sure if we want this attribute - AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0, - AGL_SAMPLES_ARB, mFSAASamples, - AGL_DOUBLEBUFFER, - AGL_CLOSEST_POLICY, - AGL_ACCELERATED, - AGL_RED_SIZE, 8, - AGL_GREEN_SIZE, 8, - AGL_BLUE_SIZE, 8, - AGL_ALPHA_SIZE, 8, - AGL_DEPTH_SIZE, 24, - AGL_STENCIL_SIZE, 8, - AGL_NONE + AGL_FULLSCREEN, + AGL_NO_RECOVERY, + AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0, + AGL_SAMPLES_ARB, mFSAASamples, + AGL_DOUBLEBUFFER, + AGL_CLOSEST_POLICY, + AGL_ACCELERATED, + AGL_RED_SIZE, 8, + AGL_GREEN_SIZE, 8, + AGL_BLUE_SIZE, 8, + AGL_ALPHA_SIZE, 8, + AGL_DEPTH_SIZE, 24, + AGL_STENCIL_SIZE, 8, + AGL_NONE }; LL_DEBUGS("Window") << "createContext: creating fullscreen pixelformat" << LL_ENDL; @@ -567,21 +562,28 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits } else { + // NOTE from Leslie: + // + // AGL_NO_RECOVERY, when combined with AGL_ACCELERATED prevents software rendering + // fallback which means we won't hvae shaders that compile and link but then don't + // work. The drawback is that our shader compilation will be a bit more finicky though. + GLint windowedAttrib[] = { AGL_RGBA, - AGL_DOUBLEBUFFER, - AGL_CLOSEST_POLICY, - AGL_ACCELERATED, - AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0, - AGL_SAMPLES_ARB, mFSAASamples, - AGL_RED_SIZE, 8, - AGL_GREEN_SIZE, 8, - AGL_BLUE_SIZE, 8, - AGL_ALPHA_SIZE, 8, - AGL_DEPTH_SIZE, 24, - AGL_STENCIL_SIZE, 8, - AGL_NONE + AGL_NO_RECOVERY, + AGL_DOUBLEBUFFER, + AGL_CLOSEST_POLICY, + AGL_ACCELERATED, + AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0, + AGL_SAMPLES_ARB, mFSAASamples, + AGL_RED_SIZE, 8, + AGL_GREEN_SIZE, 8, + AGL_BLUE_SIZE, 8, + AGL_ALPHA_SIZE, 8, + AGL_DEPTH_SIZE, 24, + AGL_STENCIL_SIZE, 8, + AGL_NONE }; LL_DEBUGS("Window") << "createContext: creating windowed pixelformat" << LL_ENDL; @@ -1093,31 +1095,22 @@ BOOL LLWindowMacOSX::getVisible() BOOL LLWindowMacOSX::getMinimized() { - BOOL result = FALSE; - - // Since the set of states where we want to act "minimized" is non-trivial, it's easier to - // track things locally than to try and retrieve the state from the window manager. - result = mMinimized; - - return(result); + return mMinimized; } BOOL LLWindowMacOSX::getMaximized() { - BOOL result = FALSE; - - if (mWindow) - { - // TODO - } - - return(result); + return mMaximized; } BOOL LLWindowMacOSX::maximize() { - // TODO - return FALSE; + if (mWindow && !mMaximized) + { + ZoomWindow(mWindow, inContent, true); + } + + return mMaximized; } BOOL LLWindowMacOSX::getFullscreen() @@ -2559,7 +2552,24 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e GetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, ¤tBounds); GetEventParameter(event, kEventParamPreviousBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &previousBounds); - + + // Put an offset into window un-maximize operation since the kEventWindowGetIdealSize + // event only allows the specification of size and not position. + if (mMaximized) + { + short leftOffset = mPreviousWindowRect.left - currentBounds.left; + currentBounds.left += leftOffset; + currentBounds.right += leftOffset; + + short topOffset = mPreviousWindowRect.top - currentBounds.top; + currentBounds.top += topOffset; + currentBounds.bottom += topOffset; + } + else + { + // Store off the size for future un-maximize operations + mPreviousWindowRect = previousBounds; + } if ((currentBounds.right - currentBounds.left) < MIN_WIDTH) { @@ -2578,13 +2588,43 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e case kEventWindowBoundsChanged: { + // Get new window bounds Rect newBounds; - GetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &newBounds); + + // Get previous window bounds + Rect oldBounds; + GetEventParameter(event, kEventParamPreviousBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &oldBounds); + + // Determine if the new size is larger than the old + bool newBoundsLarger = ((newBounds.right - newBounds.left) >= (oldBounds.right - oldBounds.left)); + newBoundsLarger &= ((newBounds.bottom - newBounds.top) >= (oldBounds.bottom - oldBounds.top)); + + // Check to see if this is a zoom event (+ button on window pane) + unsigned int eventParams; + GetEventParameter(event, kEventParamAttributes, typeUInt32, NULL, sizeof(int), NULL, &eventParams); + bool isZoomEvent = ((eventParams & kWindowBoundsChangeZoom) != 0); + + // Maximized flag is if zoom event and increasing window size + mMaximized = (isZoomEvent && newBoundsLarger); + aglUpdateContext(mContext); + mCallbacks->handleResize(this, newBounds.right - newBounds.left, newBounds.bottom - newBounds.top); - - + } + break; + + case kEventWindowGetIdealSize: + // Only recommend a new ideal size when un-maximizing + if (mMaximized == TRUE) + { + Point nonMaximizedSize; + + nonMaximizedSize.v = mPreviousWindowRect.bottom - mPreviousWindowRect.top; + nonMaximizedSize.h = mPreviousWindowRect.right - mPreviousWindowRect.left; + + SetEventParameter(event, kEventParamDimensions, typeQDPoint, sizeof(Point), &nonMaximizedSize); + result = noErr; } break; diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index 6dc093b4be..6c9e075a21 100644 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -156,7 +156,6 @@ protected: static pascal Boolean staticMoveEventComparator( EventRef event, void* data); OSStatus eventHandler (EventHandlerCallRef myHandler, EventRef event); void adjustCursorDecouple(bool warpingMouse = false); - void fixWindowSize(void); void stopDockTileBounce(); static MASK modifiersToMask(SInt16 modifiers); @@ -182,6 +181,7 @@ protected: EventComparatorUPP mMoveEventCampartorUPP; Rect mOldMouseClip; // Screen rect to which the mouse cursor was globally constrained before we changed it in clipMouse() + Rect mPreviousWindowRect; // Save previous window for un-maximize event Str255 mWindowTitle; double mOriginalAspectRatio; BOOL mSimulatedRightClick; @@ -195,6 +195,7 @@ protected: BOOL mNeedsResize; // Constructor figured out the window is too big, it needs a resize. LLCoordScreen mNeedsResizeSize; F32 mOverrideAspectRatio; + BOOL mMaximized; BOOL mMinimized; U32 mFSAASamples; BOOL mForceRebuild; diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp index 6e4364a20d..0809d95628 100644 --- a/indra/llxml/llcontrol.cpp +++ b/indra/llxml/llcontrol.cpp @@ -837,9 +837,7 @@ U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_values, bool save_values) { - std::string name; LLSD settings; - LLSD control_map; llifstream infile; infile.open(filename); if(!infile.is_open()) @@ -863,8 +861,8 @@ U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_v for(LLSD::map_const_iterator itr = settings.beginMap(); itr != settings.endMap(); ++itr) { bool persist = true; - name = (*itr).first; - control_map = (*itr).second; + std::string const & name = itr->first; + LLSD const & control_map = itr->second; if(control_map.has("Persist")) { diff --git a/indra/llxuixml/lltrans.cpp b/indra/llxuixml/lltrans.cpp index e13d73c640..5388069c24 100644 --- a/indra/llxuixml/lltrans.cpp +++ b/indra/llxuixml/lltrans.cpp @@ -30,6 +30,8 @@ #include "llfasttimer.h" // for call count statistics #include "llxuiparser.h" +#include "llsd.h" +#include "llxmlnode.h" #include <map> @@ -154,13 +156,28 @@ std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil:: } else { - LLSD args; - args["STRING_NAME"] = xml_desc; LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL; + return "MissingString("+xml_desc+")"; + } +} - //LLNotificationsUtil::add("MissingString", args); // *TODO: resurrect - //return xml_desc; +//static +std::string LLTrans::getString(const std::string &xml_desc, const LLSD& msg_args) +{ + // Don't care about time as much as call count. Make sure we're not + // calling LLTrans::getString() in an inner loop. JC + LLFastTimer timer(FTM_GET_TRANS); + template_map_t::iterator iter = sStringTemplates.find(xml_desc); + if (iter != sStringTemplates.end()) + { + std::string text = iter->second.mText; + LLStringUtil::format(text, msg_args); + return text; + } + else + { + LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL; return "MissingString("+xml_desc+")"; } } @@ -182,11 +199,27 @@ bool LLTrans::findString(std::string &result, const std::string &xml_desc, const } else { - LLSD args; - args["STRING_NAME"] = xml_desc; - LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL; - //LLNotificationsUtil::add("MissingString", args); - + LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL; + return false; + } +} + +//static +bool LLTrans::findString(std::string &result, const std::string &xml_desc, const LLSD& msg_args) +{ + LLFastTimer timer(FTM_GET_TRANS); + + template_map_t::iterator iter = sStringTemplates.find(xml_desc); + if (iter != sStringTemplates.end()) + { + std::string text = iter->second.mText; + LLStringUtil::format(text, msg_args); + result = text; + return true; + } + else + { + LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL; return false; } } diff --git a/indra/llxuixml/lltrans.h b/indra/llxuixml/lltrans.h index 5b127b53cf..128b51d383 100644 --- a/indra/llxuixml/lltrans.h +++ b/indra/llxuixml/lltrans.h @@ -29,8 +29,12 @@ #include <map> +#include "llpointer.h" #include "llstring.h" -#include "llxmlnode.h" + +class LLXMLNode; + +class LLSD; /** * @brief String template loaded from strings.xml @@ -61,9 +65,9 @@ public: * @param default_args Set of strings (expected to be in the file) to use as default replacement args, e.g. "SECOND_LIFE" * @returns true if the file was parsed successfully, true if something went wrong */ - static bool parseStrings(LLXMLNodePtr& root, const std::set<std::string>& default_args); + static bool parseStrings(LLPointer<LLXMLNode> & root, const std::set<std::string>& default_args); - static bool parseLanguageStrings(LLXMLNodePtr &root); + static bool parseLanguageStrings(LLPointer<LLXMLNode> & root); /** * @brief Returns a translated string @@ -72,7 +76,9 @@ public: * @returns Translated string */ static std::string getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args); + static std::string getString(const std::string &xml_desc, const LLSD& args); static bool findString(std::string &result, const std::string &xml_desc, const LLStringUtil::format_map_t& args); + static bool findString(std::string &result, const std::string &xml_desc, const LLSD& args); // Returns translated string with [COUNT] replaced with a number, following // special per-language logic for plural nouns. For example, some languages diff --git a/indra/llxuixml/llxuiparser.h b/indra/llxuixml/llxuiparser.h index 7a748d8aea..0c38c4da93 100644 --- a/indra/llxuixml/llxuiparser.h +++ b/indra/llxuixml/llxuiparser.h @@ -28,7 +28,6 @@ #define LLXUIPARSER_H #include "llinitparam.h" -#include "llfasttimer.h" #include "llregistry.h" #include "llpointer.h" @@ -95,6 +94,7 @@ public: }; +class LLXUIParserImpl; class LLXUIParser : public LLInitParam::Parser { @@ -176,6 +176,7 @@ private: // ordering of child elements from base file to localized diff file. Then we can use a pair // of coroutines to perform matching of xml nodes during parsing. Not sure if the overhead // of coroutines would offset the gain from SAX parsing +class LLSimpleXUIParserImpl; class LLSimpleXUIParser : public LLInitParam::Parser { diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 1d155add51..769dcf8457 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -76,6 +76,8 @@ include_directories( ) set(viewer_SOURCE_FILES + groupchatlistener.cpp + llaccountingquotamanager.cpp llagent.cpp llagentaccess.cpp llagentcamera.cpp @@ -222,6 +224,7 @@ set(viewer_SOURCE_FILES llfloatersettingsdebug.cpp llfloatersidetraytab.cpp llfloatersnapshot.cpp + llfloatersounddevices.cpp llfloatertelehub.cpp llfloatertestinspectors.cpp llfloatertestlistview.cpp @@ -623,6 +626,8 @@ endif (LINUX) set(viewer_HEADER_FILES CMakeLists.txt ViewerInstall.cmake + groupchatlistener.h + llaccountingquotamanager.h llagent.h llagentaccess.h llagentcamera.h @@ -771,6 +776,7 @@ set(viewer_HEADER_FILES llfloatersettingsdebug.h llfloatersidetraytab.h llfloatersnapshot.h + llfloatersounddevices.h llfloatertelehub.h llfloatertestinspectors.h llfloatertestlistview.h diff --git a/indra/newview/app_settings/high_graphics.xml b/indra/newview/app_settings/high_graphics.xml index f1862f9d72..5bc2e1b7e6 100644 --- a/indra/newview/app_settings/high_graphics.xml +++ b/indra/newview/app_settings/high_graphics.xml @@ -4,15 +4,15 @@ <RenderAvatarCloth value="FALSE"/> <!--Default for now--> <RenderAvatarLODFactor value="1.0"/> - <!--Default for now--> - <RenderAvatarPhysicsLODFactor value="0.9"/> + <!--Default for now--> + <RenderAvatarPhysicsLODFactor value="0.9"/> <!--NO SHADERS--> <RenderAvatarVP value="TRUE"/> <!--Short Range--> <RenderFarClip value="128"/> <!--Default for now--> <RenderFlexTimeFactor value="1"/> - <!--256... but they don't use this--> + <!--256... but they do not use this--> <RenderGlowResolutionPow value="9"/> <!--Low number--> <RenderMaxPartCount value="4096"/> @@ -34,11 +34,10 @@ <VertexShaderEnable value="TRUE"/> <!--NO SHADERS--> <WindLightUseAtmosShaders value="TRUE"/> - <!--Deferred Shading--> - <RenderDeferred value="FALSE"/> - <!--SSAO Disabled--> - <RenderDeferredSSAO value="FALSE"/> - <!--Sun Shadows--> - <RenderShadowDetail value="0"/> - + <!--Deferred Shading--> + <RenderDeferred value="FALSE"/> + <!--SSAO Disabled--> + <RenderDeferredSSAO value="FALSE"/> + <!--Sun Shadows--> + <RenderShadowDetail value="0"/> </settings> diff --git a/indra/newview/app_settings/low_graphics.xml b/indra/newview/app_settings/low_graphics.xml index ad0073dfac..ca1dae0b86 100644 --- a/indra/newview/app_settings/low_graphics.xml +++ b/indra/newview/app_settings/low_graphics.xml @@ -4,17 +4,17 @@ <RenderAvatarCloth value="FALSE"/> <!--Default for now--> <RenderAvatarLODFactor value="0.5"/> - <!--Default for now--> - <RenderAvatarPhysicsLODFactor value="0.0"/> - <!--Default for now--> - <RenderAvatarMaxVisible value="3"/> + <!--Default for now--> + <RenderAvatarPhysicsLODFactor value="0.0"/> + <!--Default for now--> + <RenderAvatarMaxVisible value="3"/> <!--NO SHADERS--> <RenderAvatarVP value="FALSE"/> <!--Short Range--> <RenderFarClip value="64"/> <!--Default for now--> <RenderFlexTimeFactor value="0.5"/> - <!--256... but they don't use this--> + <!--256... but they do not use this--> <RenderGlowResolutionPow value="8"/> <!--Low number--> <RenderMaxPartCount value="1024"/> @@ -36,11 +36,10 @@ <VertexShaderEnable value="FALSE"/> <!--NO SHADERS--> <WindLightUseAtmosShaders value="FALSE"/> - <!--No Deferred Shading--> - <RenderDeferred value="FALSE"/> - <!--SSAO Disabled--> - <RenderDeferredSSAO value="FALSE"/> - <!--No Shadows--> - <RenderShadowDetail value="0"/> - + <!--No Deferred Shading--> + <RenderDeferred value="FALSE"/> + <!--SSAO Disabled--> + <RenderDeferredSSAO value="FALSE"/> + <!--No Shadows--> + <RenderShadowDetail value="0"/> </settings> diff --git a/indra/newview/app_settings/mid_graphics.xml b/indra/newview/app_settings/mid_graphics.xml index 6c4afbd7f0..01822fe64c 100644 --- a/indra/newview/app_settings/mid_graphics.xml +++ b/indra/newview/app_settings/mid_graphics.xml @@ -4,15 +4,15 @@ <RenderAvatarCloth value="FALSE"/> <!--Default for now--> <RenderAvatarLODFactor value="0.5"/> - <!--Default for now--> - <RenderAvatarPhysicsLODFactor value="0.75"/> + <!--Default for now--> + <RenderAvatarPhysicsLODFactor value="0.75"/> <!--NO SHADERS--> <RenderAvatarVP value="TRUE"/> <!--Short Range--> <RenderFarClip value="96"/> <!--Default for now--> <RenderFlexTimeFactor value="1"/> - <!--256... but they don't use this--> + <!--256... but they do not use this--> <RenderGlowResolutionPow value="8"/> <!--Low number--> <RenderMaxPartCount value="2048"/> @@ -34,11 +34,10 @@ <VertexShaderEnable value="TRUE"/> <!--NO SHADERS--> <WindLightUseAtmosShaders value="FALSE"/> - <!--No Deferred Shading--> - <RenderDeferred value="FALSE"/> - <!--SSAO Disabled--> - <RenderDeferredSSAO value="FALSE"/> - <!--No Shadows--> - <RenderShadowDetail value="0"/> - + <!--No Deferred Shading--> + <RenderDeferred value="FALSE"/> + <!--SSAO Disabled--> + <RenderDeferredSSAO value="FALSE"/> + <!--No Shadows--> + <RenderShadowDetail value="0"/> </settings> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index c4af9e2ab6..78db307d64 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -4356,6 +4356,39 @@ <key>Value</key> <real>0.25</real> </map> + <key>Jpeg2000AdvancedCompression</key> + <map> + <key>Comment</key> + <string>Use advanced Jpeg2000 compression options (precincts, blocks, ordering, markers)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>Jpeg2000PrecinctsSize</key> + <map> + <key>Comment</key> + <string>Size of image precincts. Assumed square and same for all levels. Must be power of 2.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>256</integer> + </map> + <key>Jpeg2000BlocksSize</key> + <map> + <key>Comment</key> + <string>Size of encoding blocks. Assumed square and same for all levels. Must be power of 2. Max 64, Min 4.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>64</integer> + </map> <key>KeepAspectForSnapshot</key> <map> <key>Comment</key> @@ -5545,6 +5578,17 @@ <key>Value</key> <real>0</real> </map> + <key>MeshUseWholeModelUpload</key> + <map> + <key>Comment</key> + <string>Upload model in its entirety instead of mesh-by-mesh (new caps)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <real>0</real> + </map> <key>MigrateCacheDirectory</key> <map> <key>Comment</key> @@ -12100,10 +12144,10 @@ <key>Value</key> <integer>0</integer> </map> - <key>VoiceCallsRejectAll</key> + <key>VoiceCallsRejectGroup</key> <map> <key>Comment</key> - <string>Silently reject all incoming voice calls.</string> + <string>Silently reject all incoming group voice calls.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -12995,6 +13039,17 @@ <string>Boolean</string> <key>Value</key> <integer>1</integer> + </map> + <key>EnablePlaceProfile</key> + <map> + <key>Comment</key> + <string>Enable viewing of place profile from web link</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> </map> <key>EnablePicks</key> <map> @@ -13161,5 +13216,27 @@ <key>Value</key> <integer>0</integer> </map> + <key>OpenIMOnVoice</key> + <map> + <key>Comment</key> + <string>Open the corresponding IM window when connecting to a voice call.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>AllowBottomTrayButtonReordering</key> + <map> + <key>Comment</key> + <string>Allow user to move and hide bottom tray buttons</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> </map> </llsd> diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index bc97ec00e9..70a75cb4ca 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -45,15 +45,6 @@ <key>Value</key> <integer>0</integer> </map> - <key>EnableVoiceChat</key> - <map> - <key>Comment</key> - <string>Enable talking to other residents with a microphone</string> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> <key>HelpURLFormat</key> <map> <key>Comment</key> @@ -117,10 +108,10 @@ <key>Value</key> <integer>0</integer> </map> - <key>VoiceCallsRejectAll</key> + <key>VoiceCallsRejectGroup</key> <map> <key>Comment</key> - <string>Silently reject all incoming voice calls.</string> + <string>Silently reject all incoming group voice calls.</string> <key>Type</key> <string>Boolean</string> <key>Value</key> @@ -133,7 +124,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>ScriptsCanShowUI</key> <map> @@ -248,6 +239,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>EnablePlaceProfile</key> + <map> + <key>Comment</key> + <string>Enable viewing of place profile from web link</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>EnablePicks</key> <map> <key>Comment</key> @@ -290,7 +292,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>EnableAvatarShare</key> <map> @@ -435,5 +437,27 @@ <key>Value</key> <integer>0</integer> </map> + <key>OpenIMOnVoice</key> + <map> + <key>Comment</key> + <string>Open the corresponding IM window when connecting to a voice call.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>AllowBottomTrayButtonReordering</key> + <map> + <key>Comment</key> + <string>Allow user to move and hide bottom tray buttons</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> </map> </llsd> diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index 8efec1cff0..ff24efaf2c 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -44,6 +44,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>LastPostcardRecipient</key> + <map> + <key>Comment</key> + <string>Last recipient of postcard</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string /> + </map> <key>LogNearbyChat</key> <map> <key>Comment</key> diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl index 4261f943fb..5addbbb176 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl @@ -12,7 +12,6 @@ mat4 getObjectSkinnedTransform(); void calcAtmospherics(vec3 inPositionEye); float calcDirectionalLight(vec3 n, vec3 l); -float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight); vec3 atmosAmbient(vec3 light); vec3 atmosAffectDirectionalLight(float lightIntensity); @@ -23,11 +22,36 @@ varying vec3 vary_position; varying vec3 vary_ambient; varying vec3 vary_directional; varying vec3 vary_normal; -varying vec3 vary_light; varying vec3 vary_fragcoord; +varying vec3 vary_pointlight_col; uniform float near_clip; +float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, 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 dist2 = d*d/(la*la); + float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 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; +} + void main() { gl_TexCoord[0] = gl_MultiTexCoord0; @@ -53,20 +77,20 @@ void main() vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a); - // Collect normal lights (need to be divided by two, as we later multiply by 2) - col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a); - col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a); - col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a); - col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a); - col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a); - col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a); - col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz); - col.rgb = scaleDownLight(col.rgb); + // Collect normal lights + col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a); + col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation ,gl_LightSource[3].specular.a); + col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].specular.a); + col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation, gl_LightSource[5].specular.a); + col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a); + col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a); + vary_pointlight_col = col.rgb*gl_Color.rgb; + + col.rgb = vec3(0,0,0); + // Add windlight lights - col.rgb += atmosAmbient(vec3(0.)); - - vary_light = gl_LightSource[0].position.xyz; + col.rgb = atmosAmbient(vec3(0.)); vary_ambient = col.rgb*gl_Color.rgb; vary_directional = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a))); diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaF.glsl deleted file mode 100644 index 7d9d6cc0b2..0000000000 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaF.glsl +++ /dev/null @@ -1,70 +0,0 @@ -/** - * @file avatarAlphaF.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * $/LicenseInfo$ - */ - -#version 120 - -uniform sampler2D diffuseMap; -uniform sampler2DShadow shadowMap0; -uniform sampler2DShadow shadowMap1; -uniform sampler2DShadow shadowMap2; -uniform sampler2DShadow shadowMap3; -uniform sampler2D noiseMap; - -uniform mat4 shadow_matrix[6]; -uniform vec4 shadow_clip; - -vec3 atmosLighting(vec3 light); -vec3 scaleSoftClip(vec3 light); - -varying vec3 vary_ambient; -varying vec3 vary_directional; -varying vec4 vary_position; -varying vec3 vary_normal; - -void main() -{ - float shadow = 1.0; - vec4 pos = vary_position; - vec3 norm = normalize(vary_normal); - - vec3 nz = texture2D(noiseMap, gl_FragCoord.xy/128.0).xyz; - - if (pos.z > -shadow_clip.w) - { - - if (pos.z < -shadow_clip.z) - { - vec4 lpos = shadow_matrix[3]*pos; - shadow = shadow2DProj(shadowMap3, lpos).x; - } - else if (pos.z < -shadow_clip.y) - { - vec4 lpos = shadow_matrix[2]*pos; - shadow = shadow2DProj(shadowMap2, lpos).x; - } - else if (pos.z < -shadow_clip.x) - { - vec4 lpos = shadow_matrix[1]*pos; - shadow = shadow2DProj(shadowMap1, lpos).x; - } - else - { - vec4 lpos = shadow_matrix[0]*pos; - shadow = shadow2DProj(shadowMap0, lpos).x; - } - } - - - vec4 col = vec4(vary_ambient + vary_directional*shadow, gl_Color.a); - vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * col; - - color.rgb = atmosLighting(color.rgb); - - color.rgb = scaleSoftClip(color.rgb); - - gl_FragColor = color; -} diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl index 5dfbb91393..a2a7dea20d 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl @@ -22,11 +22,36 @@ vec3 scaleUpLight(vec3 light); varying vec3 vary_position; varying vec3 vary_ambient; varying vec3 vary_directional; -varying vec3 vary_normal; varying vec3 vary_fragcoord; +varying vec3 vary_pointlight_col; uniform float near_clip; +float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, 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 dist2 = d*d/(la*la); + float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 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; +} + void main() { gl_TexCoord[0] = gl_MultiTexCoord0; @@ -49,7 +74,6 @@ void main() gl_Position = frag_pos; vary_position = pos.xyz; - vary_normal = norm; calcAtmospherics(pos.xyz); @@ -57,18 +81,20 @@ void main() vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a); - // Collect normal lights (need to be divided by two, as we later multiply by 2) - col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a); - col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a); - col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a); - col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a); - col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a); - col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a); - col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz); - col.rgb = scaleDownLight(col.rgb); + // Collect normal lights + col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a); + col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation ,gl_LightSource[3].specular.a); + col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].specular.a); + col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation, gl_LightSource[5].specular.a); + col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a); + col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a); + vary_pointlight_col = col.rgb*gl_Color.rgb; + + col.rgb = vec3(0,0,0); + // Add windlight lights - col.rgb += atmosAmbient(vec3(0.)); + col.rgb = atmosAmbient(vec3(0.)); vary_ambient = col.rgb*gl_Color.rgb; vary_directional = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a))); diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl index c5ddf31ac0..609fc4f14f 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl @@ -23,8 +23,9 @@ uniform float sun_wash; uniform int light_count; -uniform vec4 light[16]; -uniform vec4 light_col[16]; +#define MAX_LIGHT_COUNT 16 +uniform vec4 light[MAX_LIGHT_COUNT]; +uniform vec4 light_col[MAX_LIGHT_COUNT]; varying vec4 vary_fragcoord; uniform vec2 screen_res; @@ -63,50 +64,56 @@ void main() float noise = texture2D(noiseMap, frag.xy/128.0).b; vec3 out_col = vec3(0,0,0); vec3 npos = normalize(-pos); - - for (int i = 0; i < light_count; ++i) + + // As of OSX 10.6.7 ATI Apple's crash when using a variable size loop + for (int i = 0; i < MAX_LIGHT_COUNT; ++i) { + bool light_contrib = (i < light_count); + vec3 lv = light[i].xyz-pos; float dist2 = dot(lv,lv); dist2 /= light[i].w; if (dist2 > 1.0) { - continue; + light_contrib = false; } float da = dot(norm, lv); if (da < 0.0) { - continue; + light_contrib = false; } - - lv = normalize(lv); - da = dot(norm, lv); - - float fa = light_col[i].a+1.0; - float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); - dist_atten *= noise; - - float lit = da * dist_atten; - vec3 col = light_col[i].rgb*lit*diff; - //vec3 col = vec3(dist2, light_col[i].a, lit); - - if (spec.a > 0.0) + if (light_contrib) { - //vec3 ref = dot(pos+lv, norm); + lv = normalize(lv); + da = dot(norm, lv); + + float fa = light_col[i].a+1.0; + float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); + dist_atten *= noise; + + float lit = da * dist_atten; - float sa = dot(normalize(lv+npos),norm); + vec3 col = light_col[i].rgb*lit*diff; + //vec3 col = vec3(dist2, light_col[i].a, lit); - if (sa > 0.0) + if (spec.a > 0.0) { - sa = texture2D(lightFunc,vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0); - sa *= noise; - col += da*sa*light_col[i].rgb*spec.rgb; + //vec3 ref = dot(pos+lv, norm); + + float sa = dot(normalize(lv+npos),norm); + + if (sa > 0.0) + { + sa = texture2D(lightFunc,vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0); + sa *= noise; + col += da*sa*light_col[i].rgb*spec.rgb; + } } + + out_col += col; } - - out_col += col; } if (dot(out_col, out_col) <= 0.0) diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl new file mode 100644 index 0000000000..2e3e84dd15 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl @@ -0,0 +1,20 @@ +/** + * @file multiPointLightV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + +#version 120 + +varying vec4 vary_fragcoord; + +void main() +{ + //transform vertex + vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex; + vary_fragcoord = pos; + + gl_Position = pos; + gl_FrontColor = gl_Color; +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index f377685045..77f1b2224c 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -57,11 +57,11 @@ void dofSampleNear(inout vec4 diff, inout float w, float cur_sc, vec2 tc) float sc = calc_cof(d); - float wg = 1.0; + float wg = 0.25; vec4 s = texture2DRect(diffuseRect, tc); // de-weight dull areas to make highlights 'pop' - wg *= s.r+s.g+s.b; + wg += s.r+s.g+s.b; diff += wg*s; @@ -77,11 +77,11 @@ void dofSample(inout vec4 diff, inout float w, float min_sc, float cur_depth, ve if (sc > min_sc //sampled pixel is more "out of focus" than current sample radius || d < cur_depth) //sampled pixel is further away than current pixel { - float wg = 1.0; + float wg = 0.25; vec4 s = texture2DRect(diffuseRect, tc); // de-weight dull areas to make highlights 'pop' - wg *= s.r+s.g+s.b; + wg += s.r+s.g+s.b; diff += wg*s; diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl new file mode 100644 index 0000000000..ab48d08bbb --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl @@ -0,0 +1,24 @@ +/** + * @file postDeferredF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + +#version 120 + +#extension GL_ARB_texture_rectangle : enable + +uniform sampler2DRect diffuseRect; +uniform sampler2D bloomMap; + +uniform vec2 screen_res; +varying vec2 vary_fragcoord; + +void main() +{ + vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy); + + vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res); + gl_FragColor = diff + bloom; +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl index 25ff958107..cd91351ad4 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl @@ -15,8 +15,6 @@ uniform sampler2DRect depthMap; uniform sampler2DRect normalMap; uniform sampler2D noiseMap; -uniform sampler2D lightFunc; - // Inputs uniform mat4 shadow_matrix[6]; diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl index 88ca60318b..6dfc1b952c 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl @@ -28,7 +28,6 @@ varying vec3 vary_ambient; varying vec3 vary_directional; varying vec3 vary_fragcoord; varying vec3 vary_position; -varying vec3 vary_light; varying vec3 vary_pointlight_col; uniform float shadow_bias; diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl index 1da3d95069..d227346163 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl @@ -11,7 +11,6 @@ vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); void calcAtmospherics(vec3 inPositionEye); float calcDirectionalLight(vec3 n, vec3 l); -float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight); mat4 getObjectSkinnedTransform(); vec3 atmosAmbient(vec3 light); vec3 atmosAffectDirectionalLight(float lightIntensity); @@ -22,12 +21,37 @@ varying vec3 vary_ambient; varying vec3 vary_directional; varying vec3 vary_fragcoord; varying vec3 vary_position; -varying vec3 vary_light; +varying vec3 vary_pointlight_col; uniform float near_clip; uniform float shadow_offset; uniform float shadow_bias; +float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, 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 dist2 = d*d/(la*la); + float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 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; +} + void main() { gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; @@ -55,21 +79,21 @@ void main() //vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.)); vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a); - // Collect normal lights (need to be divided by two, as we later multiply by 2) - col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a); - col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a); - col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a); - col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a); - col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a); - col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a); - col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz); - col.rgb = scaleDownLight(col.rgb); + // Collect normal lights + col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a); + col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation ,gl_LightSource[3].specular.a); + col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].specular.a); + col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation, gl_LightSource[5].specular.a); + col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a); + col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a); + vary_pointlight_col = col.rgb*gl_Color.rgb; + + col.rgb = vec3(0,0,0); + // Add windlight lights - col.rgb += atmosAmbient(vec3(0.)); - - vary_light = gl_LightSource[0].position.xyz; - + col.rgb = atmosAmbient(vec3(0.)); + vary_ambient = col.rgb*gl_Color.rgb; vary_directional.rgb = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a))); diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl index ea09d5bb09..86f014df35 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl @@ -21,7 +21,6 @@ varying vec3 vary_ambient; varying vec3 vary_directional; varying vec3 vary_fragcoord; varying vec3 vary_position; -varying vec3 vary_light; varying vec3 vary_pointlight_col; uniform float near_clip; @@ -86,8 +85,6 @@ void main() // Add windlight lights col.rgb = atmosAmbient(vec3(0.)); - vary_light = gl_LightSource[0].position.xyz; - vary_ambient = col.rgb*gl_Color.rgb; vary_directional.rgb = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a))); diff --git a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaF.glsl deleted file mode 100644 index 4671a54078..0000000000 --- a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaF.glsl +++ /dev/null @@ -1,100 +0,0 @@ -/** - * @file avatarAlphaF.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * $/LicenseInfo$ - */ - -#version 120 - -#extension GL_ARB_texture_rectangle : enable - -uniform sampler2D diffuseMap; -uniform sampler2DRectShadow shadowMap0; -uniform sampler2DRectShadow shadowMap1; -uniform sampler2DRectShadow shadowMap2; -uniform sampler2DRectShadow shadowMap3; -uniform sampler2D noiseMap; - -uniform mat4 shadow_matrix[6]; -uniform vec4 shadow_clip; -uniform vec2 screen_res; -uniform vec2 shadow_res; - -vec3 atmosLighting(vec3 light); -vec3 scaleSoftClip(vec3 light); - -varying vec3 vary_ambient; -varying vec3 vary_directional; -varying vec3 vary_position; -varying vec3 vary_normal; - -uniform float shadow_bias; - -float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl) -{ - stc.xyz /= stc.w; - stc.z += shadow_bias; - - float cs = shadow2DRect(shadowMap, stc.xyz).x; - float shadow = cs; - - shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, scl, 0.0)).x, cs); - shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, -scl, 0.0)).x, cs); - shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, scl, 0.0)).x, cs); - shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, -scl, 0.0)).x, cs); - - return shadow/5.0; -} - -void main() -{ - float shadow = 1.0; - vec4 pos = vec4(vary_position, 1.0); - vec3 norm = normalize(vary_normal); - - //vec3 nz = texture2D(noiseMap, gl_FragCoord.xy/128.0).xyz; - - vec4 spos = pos; - - if (spos.z > -shadow_clip.w) - { - vec4 lpos; - - if (spos.z < -shadow_clip.z) - { - lpos = shadow_matrix[3]*spos; - lpos.xy *= shadow_res; - shadow = pcfShadow(shadowMap3, lpos, 1.5); - shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0); - } - else if (spos.z < -shadow_clip.y) - { - lpos = shadow_matrix[2]*spos; - lpos.xy *= shadow_res; - shadow = pcfShadow(shadowMap2, lpos, 1.5); - } - else if (spos.z < -shadow_clip.x) - { - lpos = shadow_matrix[1]*spos; - lpos.xy *= shadow_res; - shadow = pcfShadow(shadowMap1, lpos, 1.5); - } - else - { - lpos = shadow_matrix[0]*spos; - lpos.xy *= shadow_res; - shadow = pcfShadow(shadowMap0, lpos, 1.5); - } - } - - - vec4 col = vec4(vary_ambient + vary_directional*shadow, gl_Color.a); - vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * col; - - color.rgb = atmosLighting(color.rgb); - - color.rgb = scaleSoftClip(color.rgb); - - gl_FragColor = color; -} diff --git a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl index 30954a8677..495e86c8db 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl @@ -22,13 +22,38 @@ vec3 scaleUpLight(vec3 light); varying vec3 vary_position; varying vec3 vary_ambient; varying vec3 vary_directional; -varying vec3 vary_normal; varying vec3 vary_fragcoord; +varying vec3 vary_pointlight_col; uniform float near_clip; uniform float shadow_offset; uniform float shadow_bias; +float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, 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 dist2 = d*d/(la*la); + float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 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; +} + void main() { gl_TexCoord[0] = gl_MultiTexCoord0; @@ -51,7 +76,6 @@ void main() float dp_directional_light = max(0.0, dot(norm, gl_LightSource[0].position.xyz)); vary_position = pos.xyz + gl_LightSource[0].position.xyz * (1.0-dp_directional_light)*shadow_offset; - vary_normal = norm; calcAtmospherics(pos.xyz); @@ -59,18 +83,20 @@ void main() vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a); - // Collect normal lights (need to be divided by two, as we later multiply by 2) - col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a); - col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a); - col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a); - col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a); - col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a); - col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a); - col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz); - col.rgb = scaleDownLight(col.rgb); + // Collect normal lights + col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a); + col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation ,gl_LightSource[3].specular.a); + col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].specular.a); + col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation, gl_LightSource[5].specular.a); + col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a); + col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a); + vary_pointlight_col = col.rgb*gl_Color.rgb; + + col.rgb = vec3(0,0,0); + // Add windlight lights - col.rgb += atmosAmbient(vec3(0.)); + col.rgb = atmosAmbient(vec3(0.)); vary_ambient = col.rgb*gl_Color.rgb; vary_directional = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a))); diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl index 26bc83e0d4..4369b3b34f 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl @@ -19,9 +19,6 @@ uniform sampler2DRectShadow shadowMap2; uniform sampler2DRectShadow shadowMap3; uniform sampler2DShadow shadowMap4; uniform sampler2DShadow shadowMap5; -uniform sampler2D noiseMap; - -uniform sampler2D lightFunc; // Inputs diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl index 08b16d787f..847b36b1ac 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl @@ -21,8 +21,6 @@ uniform sampler2DShadow shadowMap4; uniform sampler2DShadow shadowMap5; uniform sampler2D noiseMap; -uniform sampler2D lightFunc; - // Inputs uniform mat4 shadow_matrix[6]; uniform vec4 shadow_clip; diff --git a/indra/newview/app_settings/ultra_graphics.xml b/indra/newview/app_settings/ultra_graphics.xml index 3d588cf57d..71459e5470 100644 --- a/indra/newview/app_settings/ultra_graphics.xml +++ b/indra/newview/app_settings/ultra_graphics.xml @@ -4,15 +4,15 @@ <RenderAvatarCloth value="TRUE"/> <!--Default for now--> <RenderAvatarLODFactor value="1.0"/> - <!--Default for now--> - <RenderAvatarPhysicsLODFactor value="1.0"/> + <!--Default for now--> + <RenderAvatarPhysicsLODFactor value="1.0"/> <!--NO SHADERS--> <RenderAvatarVP value="TRUE"/> <!--Short Range--> <RenderFarClip value="256"/> <!--Default for now--> <RenderFlexTimeFactor value="1"/> - <!--256... but they don't use this--> + <!--256... but they do not use this--> <RenderGlowResolutionPow value="9"/> <!--Low number--> <RenderMaxPartCount value="4096"/> @@ -34,11 +34,10 @@ <VertexShaderEnable value="TRUE"/> <!--NO SHADERS--> <WindLightUseAtmosShaders value="TRUE"/> - <!--Deferred Shading--> - <RenderDeferred value="TRUE"/> - <!--SSAO Enabled--> - <RenderDeferredSSAO value="TRUE"/> - <!--Full Shadows--> - <RenderShadowDetail value="2"/> - + <!--Deferred Shading--> + <RenderDeferred value="TRUE"/> + <!--SSAO Enabled--> + <RenderDeferredSSAO value="TRUE"/> + <!--Full Shadows--> + <RenderShadowDetail value="2"/> </settings> diff --git a/indra/newview/app_settings/windlight/postprocesseffects.xml b/indra/newview/app_settings/windlight/postprocesseffects.xml index 4645215a47..60fbfd3483 100644 --- a/indra/newview/app_settings/windlight/postprocesseffects.xml +++ b/indra/newview/app_settings/windlight/postprocesseffects.xml @@ -1,2 +1 @@ <llsd><map><key>Asi Weird</key><map><key>bloom_strength</key><real>4.5799999237060547</real><key>bloom_width</key><real>12.539999961853027</real><key>brightness</key><real>0.89999997615814209</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>0.22999998927116394</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><integer>1</integer><key>enable_color_filter</key><integer>1</integer><key>enable_night_vision</key><boolean>0</boolean><key>extract_high</key><real>1</real><key>extract_low</key><real>0.47999998927116394</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>-1</real></map><key>NegativeSaturation</key><map><key>bloom_strength</key><real>1.5</real><key>bloom_width</key><real>2.25</real><key>brightness</key><real>1</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>1</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><boolean>0</boolean><key>enable_color_filter</key><integer>1</integer><key>enable_night_vision</key><boolean>0</boolean><key>extract_high</key><real>1</real><key>extract_low</key><real>0.94999999999999996</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>-1</real></map><key>NightVision</key><map><key>bloom_strength</key><real>1.5</real><key>bloom_width</key><real>2.25</real><key>brightness</key><real>1</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>1</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><boolean>0</boolean><key>enable_color_filter</key><boolean>0</boolean><key>enable_night_vision</key><integer>1</integer><key>extract_high</key><real>1</real><key>extract_low</key><real>0.94999999999999996</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>1</real></map><key>WGhost</key><map><key>bloom_strength</key><real>2.0399999618530273</real><key>bloom_width</key><real>2.25</real><key>brightness</key><real>1</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>1</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><integer>1</integer><key>enable_color_filter</key><boolean>0</boolean><key>enable_night_vision</key><boolean>0</boolean><key>extract_high</key><real>1</real><key>extract_low</key><real>0.22999998927116394</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>1</real></map><key>default</key><map><key>bloom_strength</key><real>1.5</real><key>bloom_width</key><real>2.25</real><key>brightness</key><real>1</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>1</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><boolean>0</boolean><key>enable_color_filter</key><boolean>0</boolean><key>enable_night_vision</key><boolean>0</boolean><key>extract_high</key><real>1</real><key>extract_low</key><real>0.94999999999999996</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>1</real></map></map></llsd> -><map><key>bloom_strength</key><real>1.5</real><key>bloom_width</key><real>2.25</real><key>brightness</key><real>1</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>1</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><boolean>0</boolean><key>enable_color_filter</key><boolean>0</boolean><key>enable_night_vision</key><boolean>0</boolean><key>extract_high</key><real>1</real><key>extract_low</key><real>0.94999999999999996</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>1</real></map></map></llsd> diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index ce15c4b8f7..5d6b10c047 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -11903,7 +11903,7 @@ render_pass="bump"> edit_group="physics_breasts_updown" value_default="0" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param @@ -11956,7 +11956,7 @@ render_pass="bump"> edit_group="physics_breasts_inout" value_default="0" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param @@ -12044,7 +12044,7 @@ render_pass="bump"> edit_group="physics_belly_updown" value_default="0" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param @@ -12130,7 +12130,7 @@ render_pass="bump"> edit_group="physics_butt_updown" value_default="0" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param @@ -12179,7 +12179,7 @@ render_pass="bump"> edit_group="physics_butt_leftright" value_default="0" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param @@ -12229,7 +12229,7 @@ render_pass="bump"> edit_group="physics_breasts_leftright" value_default="0" value_min="0" - value_max="1"> + value_max="3"> <param_driver /> </param> <param diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index e86663b748..058bdcc730 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -59,7 +59,6 @@ Disregard96DefaultDrawDistance 1 1 RenderTextureMemoryMultiple 1 1.0 SkyUseClassicClouds 1 1 RenderShaderLightingMaxLevel 1 3 -RenderDeferred 1 0 RenderDeferred 1 1 RenderDeferredSSAO 1 1 RenderShadowDetail 1 2 diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index e715054c54..e2b979d9e9 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -1,4 +1,4 @@ -version 22 +version 23 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences // Should be combined into one table @@ -24,11 +24,11 @@ version 22 // list all RenderAnisotropic 1 0 -RenderAvatarCloth 0 0 +RenderAvatarCloth 1 1 RenderAvatarLODFactor 1 1.0 RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarMaxVisible 1 12 -RenderAvatarVP 1 0 +RenderAvatarVP 1 1 RenderCubeMap 1 1 RenderDelayVBUpdate 1 0 RenderFarClip 1 256 @@ -41,7 +41,7 @@ RenderLocalLights 1 1 RenderMaxPartCount 1 8192 RenderNightBrightness 1 1.0 RenderObjectBump 1 1 -RenderReflectionDetail 1 3 +RenderReflectionDetail 1 4 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 RenderTransparentWater 1 1 @@ -49,19 +49,21 @@ RenderTreeLODFactor 1 1.0 RenderUseImpostors 1 1 RenderVBOEnable 1 1 RenderVolumeLODFactor 1 2.0 -RenderWaterReflections 1 1 +UseStartScreen 1 1 UseOcclusion 1 1 VertexShaderEnable 1 1 WindLightUseAtmosShaders 1 1 WLSkyDetail 1 128 -RenderUseCleverUI 1 1 Disregard128DefaultDrawDistance 1 1 Disregard96DefaultDrawDistance 1 1 RenderTextureMemoryMultiple 1 0.5 -Disregard128DefaultDrawDistance 1 1 -Disregard96DefaultDrawDistance 1 1 +RenderShaderLightingMaxLevel 1 3 SkyUseClassicClouds 1 1 +RenderDeferred 1 1 +RenderDeferredSSAO 1 1 +RenderShadowDetail 1 2 WatchdogDisabled 1 1 +RenderUseStreamVBO 1 1 // // Low Graphics Settings @@ -86,11 +88,13 @@ RenderTransparentWater 1 0 RenderTreeLODFactor 1 0 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 0.5 -RenderWaterReflections 1 0 VertexShaderEnable 1 0 WindLightUseAtmosShaders 1 0 WLSkyDetail 1 48 SkyUseClassicClouds 1 0 +RenderDeferred 1 0 +RenderDeferredSSAO 1 0 +RenderShadowDetail 1 0 // // Mid Graphics Settings @@ -114,10 +118,12 @@ RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 1.125 -RenderWaterReflections 1 0 VertexShaderEnable 1 1 WindLightUseAtmosShaders 1 0 WLSkyDetail 1 48 +RenderDeferred 1 0 +RenderDeferredSSAO 1 0 +RenderShadowDetail 1 0 // // High Graphics Settings (purty) @@ -141,10 +147,12 @@ RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 1.125 -RenderWaterReflections 1 0 VertexShaderEnable 1 1 WindLightUseAtmosShaders 1 1 WLSkyDetail 1 48 +RenderDeferred 1 0 +RenderDeferredSSAO 1 0 +RenderShadowDetail 1 2 // // Ultra graphics (REALLY PURTY!) @@ -161,17 +169,19 @@ RenderGlowResolutionPow 1 9 RenderLocalLights 1 1 RenderMaxPartCount 1 8192 RenderObjectBump 1 1 -RenderReflectionDetail 1 3 +RenderReflectionDetail 1 4 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 2.0 -RenderWaterReflections 1 1 VertexShaderEnable 1 1 WindLightUseAtmosShaders 1 1 WLSkyDetail 1 128 +RenderDeferred 1 0 +RenderDeferredSSAO 1 0 +RenderShadowDetail 1 2 // // Class Unknown Hardware (unknown) @@ -209,9 +219,12 @@ RenderVBOEnable 1 1 list NoPixelShaders RenderAvatarVP 0 0 RenderAvatarCloth 0 0 -RenderWaterReflections 0 0 +RenderReflectionDetail 0 0 VertexShaderEnable 0 0 WindLightUseAtmosShaders 0 0 +RenderDeferred 0 0 +RenderDeferredSSAO 0 0 +RenderShadowDetail 0 0 // // No Vertex Shaders available @@ -219,10 +232,14 @@ WindLightUseAtmosShaders 0 0 list NoVertexShaders RenderAvatarVP 0 0 RenderAvatarCloth 0 0 -RenderWaterReflections 0 0 +RenderReflectionDetail 0 0 VertexShaderEnable 0 0 WindLightUseAtmosShaders 0 0 +RenderDeferred 0 0 +RenderDeferredSSAO 0 0 +RenderShadowDetail 0 0 +// // "Default" setups for safe, low, medium, high // list safe @@ -235,8 +252,11 @@ RenderMaxPartCount 1 1024 RenderTerrainDetail 1 0 RenderUseImpostors 0 0 RenderVBOEnable 1 0 -RenderWaterReflections 0 0 +RenderReflectionDetail 0 0 WindLightUseAtmosShaders 0 0 +RenderDeferred 0 0 +RenderDeferredSSAO 0 0 +RenderShadowDetail 0 0 // // CPU based feature masks @@ -258,6 +278,12 @@ RenderObjectBump 0 0 list OpenGLPre15 RenderVBOEnable 1 0 +list TexUnit8orLess +RenderDeferredSSAO 0 0 + +list ATI +RenderDeferredSSAO 0 0 + list Intel RenderAnisotropic 1 0 RenderLocalLights 1 0 diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt index 08fb67a0c8..3339172a1a 100644 --- a/indra/newview/featuretable_xp.txt +++ b/indra/newview/featuretable_xp.txt @@ -152,7 +152,7 @@ WindLightUseAtmosShaders 1 1 WLSkyDetail 1 48 RenderDeferred 1 0 RenderDeferredSSAO 1 0 -RenderShadowDetail 1 0 +RenderShadowDetail 1 2 // // Ultra graphics (REALLY PURTY!) @@ -181,7 +181,7 @@ WindLightUseAtmosShaders 1 1 WLSkyDetail 1 128 RenderDeferred 1 0 RenderDeferredSSAO 1 0 -RenderShadowDetail 1 0 +RenderShadowDetail 1 2 // // Class Unknown Hardware (unknown) diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt index 66b3b97f00..6ed4e3b7f7 100644 --- a/indra/newview/gpu_table.txt +++ b/indra/newview/gpu_table.txt @@ -1,10 +1,20 @@ -// +// // Categorizes graphics chips into various classes by name // -// The table contains chip names regular expressions to match +// The table contains regular expressions to match // against driver strings, a class number, and whether we claim // to support them or not. // +// If you modify this table, use the (perl) gpu_table_tester +// to compare the results of recognizing known cards (it is easy +// to mess this up by putting things in the wrong order): +// +// perl ../../scripts/gpu_table_tester -g gpu_table.txt tests/gpus_seen.txt | diff - tests/gpus_results.txt +// +// Format: +// Fields are separated by one or more tab (not space) characters +// <recognizer name> <regular expression> <class> <supported> +// // Class Numbers: // 0 - Defaults to low graphics settings. No shaders on by default // 1 - Defaults to mid graphics settings. Basic shaders on by default @@ -15,336 +25,495 @@ // 0 - We claim to not support this card. // 1 - We claim to support this card. // -// Format: -// <chip name> <regexp> <class> <supported> -// -3Dfx .*3Dfx.* 0 0 -3Dlabs .*3Dlabs.* 0 0 -ATI 3D-Analyze .*ATI.*3D-Analyze.* 0 0 -ATI All-in-Wonder 7500 .*ATI.*All-in-Wonder 75.* 0 1 -ATI All-in-Wonder 8500 .*ATI.*All-in-Wonder 85.* 0 1 -ATI All-in-Wonder 9200 .*ATI.*All-in-Wonder 92.* 0 1 -ATI All-in-Wonder 9xxx .*ATI.*All-in-Wonder 9.* 1 1 -ATI All-in-Wonder HD .*ATI.*All-in-Wonder HD.* 1 1 -ATI All-in-Wonder X600 .*ATI.*All-in-Wonder X6.* 1 1 -ATI All-in-Wonder X800 .*ATI.*All-in-Wonder X8.* 2 1 -ATI All-in-Wonder X1800 .*ATI.*All-in-Wonder X18.* 3 1 -ATI All-in-Wonder X1900 .*ATI.*All-in-Wonder X19.* 3 1 -ATI All-in-Wonder PCI-E .*ATI.*All-in-Wonder.*PCI-E.* 1 1 -ATI All-in-Wonder Radeon .*ATI.*All-in-Wonder Radeon.* 0 1 -ATI ASUS A9xxx .*ATI.*ASUS.*A9.* 1 1 -ATI ASUS AH24xx .*ATI.*ASUS.*AH24.* 1 1 -ATI ASUS AH26xx .*ATI.*ASUS.*AH26.* 3 1 -ATI ASUS AH34xx .*ATI.*ASUS.*AH34.* 1 1 -ATI ASUS AH36xx .*ATI.*ASUS.*AH36.* 3 1 -ATI ASUS AH46xx .*ATI.*ASUS.*AH46.* 3 1 -ATI ASUS AX3xx .*ATI.*ASUS.*AX3.* 1 1 -ATI ASUS AX5xx .*ATI.*ASUS.*AX5.* 1 1 -ATI ASUS AX8xx .*ATI.*ASUS.*AX8.* 2 1 -ATI ASUS EAH24xx .*ATI.*ASUS.*EAH24.* 2 1 -ATI ASUS EAH26xx .*ATI.*ASUS.*EAH26.* 3 1 -ATI ASUS EAH34xx .*ATI.*ASUS.*EAH34.* 1 1 -ATI ASUS EAH36xx .*ATI.*ASUS.*EAH36.* 3 1 -ATI ASUS EAH38xx .*ATI.*ASUS.*EAH38.* 3 1 -ATI ASUS EAH43xx .*ATI.*ASUS.*EAH43.* 1 1 -ATI ASUS EAH45xx .*ATI.*ASUS.*EAH45.* 1 1 -ATI ASUS EAH48xx .*ATI.*ASUS.*EAH48.* 3 1 -ATI ASUS EAH57xx .*ATI.*ASUS.*EAH57.* 3 1 -ATI ASUS EAH58xx .*ATI.*ASUS.*EAH58.* 3 1 -ATI Radeon X1xxx .*ATI.*ASUS.*X1.* 3 1 -ATI Radeon X7xx .*ATI.*ASUS.*X7.* 1 1 -ATI Radeon X500 .*ATI.*Diamond X5.* 1 1 -ATI Radeon X13xx .*ATI.*Diamond X13.* 1 1 -ATI Radeon X16xx .*ATI.*Diamond X16.* 1 1 -ATI Radeon X19xx .*ATI.*Diamond X19.* 1 1 -ATI Display Adapter .*ATI.*display adapter.* 0 1 -ATI FireGL 5200 .*ATI.*FireGL V52.* 0 1 -ATI FireGL 5xxx .*ATI.*FireGL V5.* 1 1 -ATI FireGL .*ATI.*Fire.*GL.* 0 1 -ATI FireMV .*ATI.*FireMV.* 0 0 -ATI Generic .*ATI.*Generic.* 0 0 -ATI Hercules 9800 .*ATI.*Hercules.*9800.* 1 1 -ATI IGP 340M .*ATI.*IGP.*340M.* 0 0 -ATI M52 .*ATI.*M52.* 1 1 -ATI M54 .*ATI.*M54.* 1 1 -ATI M56 .*ATI.*M56.* 1 1 -ATI M71 .*ATI.*M71.* 1 1 -ATI M72 .*ATI.*M72.* 1 1 -ATI M76 .*ATI.*M76.* 3 1 -ATI Mobility Radeon 4100 .*ATI.*Mobility *41.* 0 1 -ATI Mobility Radeon 7xxx .*ATI.*Mobility *Radeon 7.* 0 1 -ATI Mobility Radeon 8xxx .*ATI.*Mobility *Radeon 8.* 0 1 -ATI Mobility Radeon 9800 .*ATI.*Mobility *98.* 0 1 -ATI Mobility Radeon 9700 .*ATI.*Mobility *97.* 0 1 -ATI Mobility Radeon 9600 .*ATI.*Mobility *96.* 0 1 -ATI Mobility Radeon HD 2300 .*ATI.*Mobility *HD *23.* 1 1 -ATI Mobility Radeon HD 2400 .*ATI.*Mobility *HD *24.* 1 1 -ATI Mobility Radeon HD 2600 .*ATI.*Mobility *HD *26.* 3 1 -ATI Mobility Radeon HD 3400 .*ATI.*Mobility *HD *34.* 1 1 -ATI Mobility Radeon HD 3600 .*ATI.*Mobility *HD *36.* 3 1 -ATI Mobility Radeon HD 3800 .*ATI.*Mobility *HD *38.* 3 1 -ATI Mobility Radeon HD 5400 .*ATI.*Mobility *HD *54.* 1 1 -ATI Mobility Radeon HD 5500 .*ATI.*Mobility *HD *55.* 1 1 -ATI Mobility Radeon X1xxx .*ATI.*Mobility *X1.* 0 1 -ATI Mobility Radeon X2xxx .*ATI.*Mobility *X2.* 0 1 -ATI Mobility Radeon X3xx .*ATI.*Mobility *X3.* 1 1 -ATI Mobility Radeon X6xx .*ATI.*Mobility *X6.* 1 1 -ATI Mobility Radeon X7xx .*ATI.*Mobility *X7.* 1 1 -ATI Mobility Radeon Xxxx .*ATI.*Mobility *X.* 0 1 -ATI Radeon HD 2300 .*ATI.*Radeon HD *23.* 0 1 -ATI Radeon HD 2400 .*ATI.*Radeon HD *24.* 1 1 -ATI Radeon HD 2600 .*ATI.*Radeon HD *26.* 2 1 -ATI Radeon HD 2900 .*ATI.*Radeon HD *29.* 3 1 -ATI Radeon HD 3200 .*ATI.*Radeon *HD *32.* 0 1 -ATI Radeon HD 3300 .*ATI.*Radeon HD *33.* 1 1 -ATI Radeon HD 3400 .*ATI.*Radeon HD *34.* 1 1 -ATI Radeon HD 3600 .*ATI.*Radeon HD *36.* 3 1 -ATI Radeon HD 3800 .*ATI.*Radeon HD *38.* 3 1 -ATI Radeon HD 4200 .*ATI.*Radeon HD *42.* 1 1 -ATI Radeon HD 4300 .*ATI.*Radeon HD *43.* 1 1 -ATI Radeon HD 4500 .*ATI.*Radeon HD *45.* 3 1 -ATI Radeon HD 4600 .*ATI.*Radeon HD *46.* 3 1 -ATI Radeon HD 4700 .*ATI.*Radeon HD *47.* 3 1 -ATI Radeon HD 4800 .*ATI.*Radeon.*HD *48.* 3 1 -ATI Radeon HD 5400 .*ATI.*Radeon.*HD *54.* 3 1 -ATI Radeon HD 5500 .*ATI.*Radeon.*HD *55.* 3 1 -ATI Radeon HD 5600 .*ATI.*Radeon.*HD *56.* 3 1 -ATI Radeon HD 5700 .*ATI.*Radeon.*HD *57.* 3 1 -ATI Radeon HD 5800 .*ATI.*Radeon.*HD *58.* 3 1 -ATI Radeon HD 5900 .*ATI.*Radeon.*HD *59.* 3 1 -ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 0 0 -ATI Radeon 2100 .*ATI.*Radeon 21.* 0 1 -ATI Radeon 3000 .*ATI.*Radeon 30.* 0 1 -ATI Radeon 3100 .*ATI.*Radeon 31.* 0 1 -ATI Radeon 7xxx .*ATI.*Radeon 7.* 0 1 -ATI Radeon 8xxx .*ATI.*Radeon 8.* 0 1 -ATI Radeon 9000 .*ATI.*Radeon 90.* 0 1 -ATI Radeon 9100 .*ATI.*Radeon 91.* 0 1 -ATI Radeon 9200 .*ATI.*Radeon 92.* 0 1 -ATI Radeon 9500 .*ATI.*Radeon 95.* 0 1 -ATI Radeon 9600 .*ATI.*Radeon 96.* 0 1 -ATI Radeon 9700 .*ATI.*Radeon 97.* 1 1 -ATI Radeon 9800 .*ATI.*Radeon 98.* 1 1 -ATI Radeon RV250 .*ATI.*RV250.* 0 1 -ATI Radeon RV600 .*ATI.*RV6.* 1 1 -ATI Radeon RX700 .*ATI.*RX70.* 1 1 -ATI Radeon RX800 .*ATI.*Radeon *RX80.* 2 1 -ATI Radeon RX9550 .*ATI.*RX9550.* 1 1 -ATI Radeon VE .*ATI.*Radeon.*VE.* 0 0 -ATI Radeon X1000 .*ATI.*Radeon *X10.* 0 1 -ATI Radeon X1200 .*ATI.*Radeon *X12.* 0 1 -ATI Radeon X1300 .*ATI.*Radeon *X13.* 1 1 -ATI Radeon X1400 .*ATI.*Radeon *X14.* 1 1 -ATI Radeon X1500 .*ATI.*Radeon *X15.* 1 1 -ATI Radeon X1600 .*ATI.*Radeon *X16.* 1 1 -ATI Radeon X1700 .*ATI.*Radeon *X17.* 1 1 -ATI Radeon X1800 .*ATI.*Radeon *X18.* 3 1 -ATI Radeon X1900 .*ATI.*Radeon *X19.* 3 1 -ATI Radeon X300 .*ATI.*Radeon *X3.* 0 1 -ATI Radeon X400 .*ATI.*Radeon X4.* 0 1 -ATI Radeon X500 .*ATI.*Radeon X5.* 0 1 -ATI Radeon X600 .*ATI.*Radeon X6.* 1 1 -ATI Radeon X700 .*ATI.*Radeon X7.* 1 1 -ATI Radeon X800 .*ATI.*Radeon X8.* 2 1 -ATI Radeon X900 .*ATI.*Radeon X9.* 2 1 -ATI Radeon Xpress .*ATI.*Radeon Xpress.* 0 0 -ATI Rage 128 .*ATI.*Rage 128.* 0 1 -ATI RV250 .*ATI.*RV250.* 0 1 -ATI RV380 .*ATI.*RV380.* 0 1 -ATI RV530 .*ATI.*RV530.* 1 1 -ATI RX700 .*ATI.*RX700.* 1 1 -Intel X3100 .*Intel.*X3100.* 0 1 -Intel 830M .*Intel.*830M 0 0 -Intel 845G .*Intel.*845G 0 0 -Intel 855GM .*Intel.*855GM 0 0 -Intel 865G .*Intel.*865G 0 0 -Intel 900 .*Intel.*900.*900 0 0 -Intel 915GM .*Intel.*915GM 0 0 -Intel 915G .*Intel.*915G 0 0 -Intel 945GM .*Intel.*945GM.* 0 1 -Intel 945G .*Intel.*945G.* 0 1 -Intel 950 .*Intel.*950.* 0 1 -Intel 965 .*Intel.*965.* 0 1 -Intel G33 .*Intel.*G33.* 0 0 -Intel G41 .*Intel.*G41.* 0 1 -Intel G45 .*Intel.*G45.* 0 1 -Intel Bear Lake .*Intel.*Bear Lake.* 0 0 -Intel Broadwater .*Intel.*Broadwater.* 0 0 -Intel Brookdale .*Intel.*Brookdale.* 0 0 -Intel Cantiga .*Intel.*Cantiga.* 0 0 -Intel Eaglelake .*Intel.*Eaglelake.* 0 1 -Intel Graphics Media HD .*Intel(R) Graphics Media.*HD.* 0 1 -Intel HD Graphics .*Intel(R) HD Graphics.* 0 1 -Intel Mobile 4 Series .*Intel.*Mobile.*4 Series.* 0 1 -Intel Media Graphics HD .*Intel Media Graphics HD.* 0 1 -Intel Montara .*Intel.*Montara.* 0 0 -Intel Pineview .*Intel.*Pineview.* 0 1 -Intel Springdale .*Intel.*Springdale.* 0 0 -Matrox .*Matrox.* 0 0 -Mesa .*Mesa.* 0 0 -NVIDIA 310M .*NVIDIA.*GeForce 310M.* 0 1 -NVIDIA 310 .*NVIDIA.*GeForce 310.* 0 1 -NVIDIA 320M .*NVIDIA.*GeForce 320M.* 0 1 -NVIDIA G100M .*NVIDIA.*GeForce G *100M.* 0 1 -NVIDIA G102M .*NVIDIA.*GeForce G *102M.* 0 1 -NVIDIA G103M .*NVIDIA.*GeForce G *103M.* 0 1 -NVIDIA G105M .*NVIDIA.*GeForce G *105M.* 0 1 -NVIDIA G210M .*NVIDIA.*GeForce G210M.* 0 1 -NVIDIA GT 120 .*NVIDIA.*GeForce GT 12.* 1 1 -NVIDIA GT 130 .*NVIDIA.*GeForce GT 13.* 1 1 -NVIDIA GT 220 .*NVIDIA.*GeForce GT 22.* 1 1 -NVIDIA GT 230 .*NVIDIA.*GeForce GT 23.* 1 1 -NVIDIA GT 240 .*NVIDIA.*GeForce GT 24.* 1 1 -NVIDIA GT 320 .*NVIDIA.*GeForce GT 32.* 0 1 -NVIDIA GT 330M .*NVIDIA.*GeForce GT 330M.* 1 1 -NVIDIA GTS 240 .*NVIDIA.*GeForce GTS 24.* 1 1 -NVIDIA GTS 250 .*NVIDIA.*GeForce GTS 25.* 3 1 -NVIDIA GTS 360M .*NVIDIA.*GeForce GTS 360M.* 3 1 -NVIDIA GTX 260 .*NVIDIA.*GeForce GTX 26.* 3 1 -NVIDIA GTX 270 .*NVIDIA.*GeForce GTX 27.* 3 1 -NVIDIA GTX 280 .*NVIDIA.*GeForce GTX 28.* 3 1 -NVIDIA GTX 290 .*NVIDIA.*GeForce GTX 29.* 3 1 -NVIDIA GTX 470 .*NVIDIA.*GeForce GTX 47.* 3 1 -NVIDIA GTX 480 .*NVIDIA.*GeForce GTX 48.* 3 1 -NVIDIA GTX 580 .*NVIDIA.*GeForce GTX 58.* 3 1 -NVIDIA C51 .*NVIDIA.*C51.* 0 1 -NVIDIA G72 .*NVIDIA.*G72.* 1 1 -NVIDIA G73 .*NVIDIA.*G73.* 1 1 -NVIDIA G84 .*NVIDIA.*G84.* 3 1 -NVIDIA G86 .*NVIDIA.*G86.* 3 1 -NVIDIA G92 .*NVIDIA.*G92.* 3 1 -NVIDIA GeForce .*GeForce 256.* 0 0 -NVIDIA GeForce 2 .*GeForce2.* 0 1 -NVIDIA GeForce 3 .*GeForce3.* 0 1 -NVIDIA GeForce 4 Go .*NVIDIA.*GeForce4.*Go.* 0 1 -NVIDIA GeForce 4 MX .*NVIDIA.*GeForce4 MX.* 0 1 -NVIDIA GeForce 4 Ti .*NVIDIA.*GeForce4 Ti.* 0 1 -NVIDIA GeForce 6100 .*NVIDIA.*GeForce 61.* 0 1 -NVIDIA GeForce 6200 .*NVIDIA.*GeForce 62.* 0 1 -NVIDIA GeForce 6500 .*NVIDIA.*GeForce 65.* 0 1 -NVIDIA GeForce 6600 .*NVIDIA.*GeForce 66.* 1 1 -NVIDIA GeForce 6700 .*NVIDIA.*GeForce 67.* 2 1 -NVIDIA GeForce 6800 .*NVIDIA.*GeForce 68.* 2 1 -NVIDIA GeForce 7000 .*NVIDIA.*GeForce 70.* 0 1 -NVIDIA GeForce 7100 .*NVIDIA.*GeForce 71.* 0 1 -NVIDIA GeForce 7200 .*NVIDIA.*GeForce 72.* 1 1 -NVIDIA GeForce 7300 .*NVIDIA.*GeForce 73.* 1 1 -NVIDIA GeForce 7500 .*NVIDIA.*GeForce 75.* 1 1 -NVIDIA GeForce 7600 .*NVIDIA.*GeForce 76.* 1 1 -NVIDIA GeForce 7800 .*NVIDIA.*GeForce 78.* 1 1 -NVIDIA GeForce 7900 .*NVIDIA.*GeForce 79.* 1 1 -NVIDIA GeForce 8100 .*NVIDIA.*GeForce 81.* 1 1 -NVIDIA GeForce 8200 .*NVIDIA.*GeForce 82.* 1 1 -NVIDIA GeForce 8300 .*NVIDIA.*GeForce 83.* 1 1 -NVIDIA GeForce 8400 .*NVIDIA.*GeForce 84.* 1 1 -NVIDIA GeForce 8500 .*GeForce 85.* 1 1 -NVIDIA GeForce 8600M .*NVIDIA.*GeForce.*8600M.* 1 1 -NVIDIA GeForce 8600 .*NVIDIA.*GeForce 86.* 3 1 -NVIDIA GeForce 8700 .*NVIDIA.*GeForce 87.* 3 1 -NVIDIA GeForce 8800 .*NVIDIA.*GeForce 88.* 3 1 -NVIDIA GeForce 9100 .*NVIDIA.*GeForce 9100.* 0 1 -NVIDIA GeForce 9200 .*NVIDIA.*GeForce 9200.* 0 1 -NVIDIA GeForce 9300M .*NVIDIA.*GeForce 9300M.* 1 1 -NVIDIA GeForce 9400M .*NVIDIA.*GeForce 9400M.* 1 1 -NVIDIA GeForce 9500M .*NVIDIA.*GeForce 9500M.* 2 1 -NVIDIA GeForce 9600M .*NVIDIA.*GeForce 9600M.* 3 1 -NVIDIA GeForce 9700M .*NVIDIA.*GeForce 9700M.* 3 1 -NVIDIA GeForce 9300 .*NVIDIA.*GeForce 93.* 1 1 -NVIDIA GeForce 9400 .*GeForce 94.* 1 1 -NVIDIA GeForce 9500 .*NVIDIA.*GeForce 95.* 2 1 -NVIDIA GeForce 9600 .*NVIDIA.*GeForce.*96.* 3 1 -NVIDIA GeForce 9800 .*NVIDIA.*GeForce.*98.* 3 1 -NVIDIA GeForce FX 5100 .*NVIDIA.*GeForce FX 51.* 0 1 -NVIDIA GeForce FX 5200 .*NVIDIA.*GeForce FX 52.* 0 1 -NVIDIA GeForce FX 5500 .*NVIDIA.*GeForce FX 55.* 0 1 -NVIDIA GeForce FX 5600 .*NVIDIA.*GeForce FX 56.* 0 1 -NVIDIA GeForce FX 5700 .*NVIDIA.*GeForce FX 57.* 1 1 -NVIDIA GeForce FX 5800 .*NVIDIA.*GeForce FX 58.* 1 1 -NVIDIA GeForce FX 5900 .*NVIDIA.*GeForce FX 59.* 1 1 -NVIDIA GeForce FX Go5100 .*NVIDIA.*GeForce FX Go51.* 0 1 -NVIDIA GeForce FX Go5200 .*NVIDIA.*GeForce FX Go52.* 0 1 -NVIDIA GeForce FX Go5300 .*NVIDIA.*GeForce FX Go53.* 0 1 -NVIDIA GeForce FX Go5500 .*NVIDIA.*GeForce FX Go55.* 0 1 -NVIDIA GeForce FX Go5600 .*NVIDIA.*GeForce FX Go56.* 0 1 -NVIDIA GeForce FX Go5700 .*NVIDIA.*GeForce FX Go57.* 1 1 -NVIDIA GeForce FX Go5800 .*NVIDIA.*GeForce FX Go58.* 1 1 -NVIDIA GeForce FX Go5900 .*NVIDIA.*GeForce FX Go59.* 1 1 -NVIDIA GeForce Go 6100 .*NVIDIA.*GeForce Go 61.* 0 1 -NVIDIA GeForce Go 6200 .*NVIDIA.*GeForce Go 62.* 0 1 -NVIDIA GeForce Go 6500 .*NVIDIA.*GeForce Go 65.* 1 1 -NVIDIA GeForce Go 6600 .*NVIDIA.*GeForce Go 66.* 1 1 -NVIDIA GeForce Go 6700 .*NVIDIA.*GeForce Go 67.* 1 1 -NVIDIA GeForce Go 6800 .*NVIDIA.*GeForce Go 68.* 1 1 -NVIDIA GeForce Go 7200 .*NVIDIA.*GeForce Go 72.* 1 1 -NVIDIA GeForce Go 7300 .*NVIDIA.*GeForce Go 73.* 1 1 -NVIDIA GeForce Go 7300 LE .*NVIDIA.*GeForce Go 73.*LE.* 0 1 -NVIDIA GeForce Go 7400 .*NVIDIA.*GeForce Go 74.* 1 1 -NVIDIA GeForce Go 7600 .*NVIDIA.*GeForce Go 76.* 2 1 -NVIDIA GeForce Go 7700 .*NVIDIA.*GeForce Go 77.* 2 1 -NVIDIA GeForce Go 7800 .*NVIDIA.*GeForce Go 78.* 2 1 -NVIDIA GeForce Go 7900 .*NVIDIA.*GeForce Go 79.* 2 1 -NVIDIA D9M .*D9M.* 1 1 -NVIDIA G84 .*G84.* 1 1 -NVIDIA G92 .*G92.* 3 1 -NVIDIA G94 .*G94.* 3 1 -NVIDIA GeForce Go 6 .*GeForce Go 6.* 1 1 -NVIDIA ION .*NVIDIA ION.* 1 1 -NVIDIA NB9M .*GeForce NB9M.* 1 1 -NVIDIA NB9P .*GeForce NB9P.* 1 1 -NVIDIA GeForce PCX .*GeForce PCX.* 0 1 -NVIDIA Generic .*NVIDIA.*Unknown.* 0 0 -NVIDIA NV17 .*GeForce NV17.* 0 1 -NVIDIA NV34 .*NVIDIA.*NV34.* 0 1 -NVIDIA NV35 .*NVIDIA.*NV35.* 0 1 -NVIDIA NV36 .*GeForce NV36.* 1 1 -NVIDIA NV43 .*NVIDIA.*NV43.* 1 1 -NVIDIA NV44 .*NVIDIA.*NV44.* 1 1 -NVIDIA nForce .*NVIDIA.*nForce.* 0 0 -NVIDIA MCP78 .*NVIDIA.*MCP78.* 1 1 -NVIDIA Quadro2 .*Quadro2.* 0 1 -NVIDIA Quadro4 .*Quadro4.* 0 1 -NVIDIA Quadro DCC .*Quadro DCC.* 0 1 -NVIDIA Quadro FX 1400 .*Quadro.*FX.*1400.* 1 1 -NVIDIA Quadro FX 1500 .*Quadro.*FX.*1500.* 1 1 -NVIDIA Quadro FX 1700 .*Quadro.*FX.*1700.* 2 1 -NVIDIA Quadro FX 1800 .*Quadro.*FX.*1800.* 2 1 -NVIDIA Quadro FX 3400 .*Quadro.*FX.*3400.* 1 1 -NVIDIA Quadro FX 3450 .*Quadro.*FX.*3450.* 1 1 -NVIDIA Quadro FX 3500 .*Quadro.*FX.*3500.* 1 1 -NVIDIA Quadro FX 3700 .*Quadro.*FX.*3700.* 2 1 -NVIDIA Quadro FX 3800 .*Quadro.*FX.*3800.* 2 1 -NVIDIA Quadro FX 370 .*Quadro.*FX.*370.* 2 1 -NVIDIA Quadro FX 380 .*Quadro.*FX.*380.* 2 1 -NVIDIA Quadro FX 4000 .*Quadro.*FX.*4000.* 1 1 -NVIDIA Quadro FX 4500 .*Quadro.*FX.*4500.* 1 1 -NVIDIA Quadro FX 4600 .*Quadro.*FX.*4600.* 2 1 -NVIDIA Quadro FX 4700 .*Quadro.*FX.*4700.* 2 1 -NVIDIA Quadro FX 4800 .*Quadro.*FX.*4800.* 2 1 -NVIDIA Quadro FX 470 .*Quadro.*FX.*470.* 2 1 -NVIDIA Quadro FX 5500 .*Quadro.*FX.*5500.* 1 1 -NVIDIA Quadro FX 5600 .*Quadro.*FX.*5600.* 2 1 -NVIDIA Quadro FX 5700 .*Quadro.*FX.*5700.* 2 1 -NVIDIA Quadro FX 5800 .*Quadro.*FX.*5800.* 2 1 -NVIDIA Quadro FX 540 .*Quadro.*FX.*540.* 1 1 -NVIDIA Quadro FX 550 .*Quadro.*FX.*550.* 1 1 -NVIDIA Quadro FX 560 .*Quadro.*FX.*560.* 1 1 -NVIDIA Quadro FX 570 .*Quadro.*FX.*570.* 2 1 -NVIDIA Quadro FX 580 .*Quadro.*FX.*580.* 2 1 -NVIDIA Quadro FX .*Quadro FX.* 0 1 -NVIDIA Quadro VX 200 .*Quadro VX.*200.* 2 1 -NVIDIA Quadro 2000 .*Quadro.*2000.* 2 1 -NVIDIA Quadro 4000 .*Quadro.*4000.* 2 1 -NVIDIA Quadro 5000 .*Quadro.*5000.* 2 1 -NVIDIA Quadro 6000 .*Quadro.*6000.* 2 1 -NVIDIA Quadro 600 .*Quadro.*600.* 2 1 -NVIDIA Quadro NVS .*Quadro NVS.* 0 1 -NVIDIA RIVA TNT .*RIVA TNT.* 0 0 -S3 .*S3 Graphics.* 0 0 -SiS SiS.* 0 0 -Trident Trident.* 0 0 -Tungsten Graphics Tungsten.* 0 0 -XGI XGI.* 0 0 -VIA VIA.* 0 0 -Apple Generic Apple.*Generic.* 0 0 -Apple Software Renderer Apple.*Software Renderer.* 0 0 +3Dfx .*3Dfx.* 0 0 +3Dlabs .*3Dlabs.* 0 0 +ATI 3D-Analyze .*ATI.*3D-Analyze.* 0 0 +ATI All-in-Wonder 7500 .*ATI.*All-in-Wonder 75.* 0 1 +ATI All-in-Wonder 8500 .*ATI.*All-in-Wonder 85.* 0 1 +ATI All-in-Wonder 9200 .*ATI.*All-in-Wonder 92.* 0 1 +ATI All-in-Wonder 9xxx .*ATI.*All-in-Wonder 9.* 1 1 +ATI All-in-Wonder HD .*ATI.*All-in-Wonder HD.* 1 1 +ATI All-in-Wonder X600 .*ATI.*All-in-Wonder X6.* 1 1 +ATI All-in-Wonder X800 .*ATI.*All-in-Wonder X8.* 2 1 +ATI All-in-Wonder X1800 .*ATI.*All-in-Wonder X18.* 3 1 +ATI All-in-Wonder X1900 .*ATI.*All-in-Wonder X19.* 3 1 +ATI All-in-Wonder PCI-E .*ATI.*All-in-Wonder.*PCI-E.* 1 1 +ATI All-in-Wonder Radeon .*ATI.*All-in-Wonder Radeon.* 0 1 +ATI ASUS A9xxx .*ATI.*ASUS.*A9.* 1 1 +ATI ASUS AH24xx .*ATI.*ASUS.*AH24.* 1 1 +ATI ASUS AH26xx .*ATI.*ASUS.*AH26.* 3 1 +ATI ASUS AH34xx .*ATI.*ASUS.*AH34.* 1 1 +ATI ASUS AH36xx .*ATI.*ASUS.*AH36.* 3 1 +ATI ASUS AH46xx .*ATI.*ASUS.*AH46.* 3 1 +ATI ASUS AX3xx .*ATI.*ASUS.*AX3.* 1 1 +ATI ASUS AX5xx .*ATI.*ASUS.*AX5.* 1 1 +ATI ASUS AX8xx .*ATI.*ASUS.*AX8.* 2 1 +ATI ASUS EAH24xx .*ATI.*ASUS.*EAH24.* 2 1 +ATI ASUS EAH26xx .*ATI.*ASUS.*EAH26.* 3 1 +ATI ASUS EAH34xx .*ATI.*ASUS.*EAH34.* 1 1 +ATI ASUS EAH36xx .*ATI.*ASUS.*EAH36.* 3 1 +ATI ASUS EAH38xx .*ATI.*ASUS.*EAH38.* 3 1 +ATI ASUS EAH43xx .*ATI.*ASUS.*EAH43.* 1 1 +ATI ASUS EAH45xx .*ATI.*ASUS.*EAH45.* 1 1 +ATI ASUS EAH48xx .*ATI.*ASUS.*EAH48.* 3 1 +ATI ASUS EAH57xx .*ATI.*ASUS.*EAH57.* 3 1 +ATI ASUS EAH58xx .*ATI.*ASUS.*EAH58.* 3 1 +ATI ASUS Radeon X1xxx .*ATI.*ASUS.*X1.* 3 1 +ATI Radeon X7xx .*ATI.*ASUS.*X7.* 1 1 +ATI Radeon X1xxx .*ATI.*X1.* 0 1 +ATI Radeon X13xx .*ATI.*Diamond X13.* 1 1 +ATI Radeon X16xx .*ATI.*Diamond X16.* 1 1 +ATI Radeon X19xx .*ATI.*Diamond X19.* 1 1 +ATI Display Adapter .*ATI.*display adapter.* 0 1 +ATI FireGL 5200 .*ATI.*FireGL V52.* 0 1 +ATI FireGL 5xxx .*ATI.*FireGL V5.* 1 1 +ATI FireGL .*ATI.*Fire.*GL.* 0 1 +ATI FirePro M3900 .*ATI.*FirePro.*M39.* 2 1 +ATI FirePro M5800 .*ATI.*FirePro.*M58.* 3 1 +ATI FirePro M7740 .*ATI.*FirePro.*M77.* 3 1 +ATI FirePro M7820 .*ATI.*FirePro.*M78.* 3 1 +ATI FireMV .*ATI.*FireMV.* 0 1 +ATI Geforce 9500 GT .*ATI.*Geforce 9500 *GT 2 1 +ATI Geforce 9800 GT .*ATI.*Geforce 9800 *GT 2 1 +ATI Generic .*ATI.*Generic.* 0 0 +ATI Hercules 9800 .*ATI.*Hercules.*9800.* 1 1 +ATI IGP 340M .*ATI.*IGP.*340M.* 0 0 +ATI M52 .*ATI.*M52.* 1 1 +ATI M54 .*ATI.*M54.* 1 1 +ATI M56 .*ATI.*M56.* 1 1 +ATI M71 .*ATI.*M71.* 1 1 +ATI M72 .*ATI.*M72.* 1 1 +ATI M76 .*ATI.*M76.* 3 1 +ATI Mobility Radeon 4100 .*ATI.*(Mobility|MOBILITY).*41.* 0 1 +ATI Mobility Radeon 7xxx .*ATI.*(Mobility|MOBILITY).*Radeon 7.* 0 1 +ATI Mobility Radeon 8xxx .*ATI.*(Mobility|MOBILITY).*Radeon 8.* 0 1 +ATI Mobility Radeon 9800 .*ATI.*(Mobility|MOBILITY).*98.* 1 1 +ATI Mobility Radeon 9700 .*ATI.*(Mobility|MOBILITY).*97.* 1 1 +ATI Mobility Radeon 9600 .*ATI.*(Mobility|MOBILITY).*96.* 0 1 +ATI Mobility Radeon HD 530v .*ATI.*(Mobility|MOBILITY).*HD *530v.* 1 1 +ATI Mobility Radeon HD 540v .*ATI.*(Mobility|MOBILITY).*HD *540v.* 2 1 +ATI Mobility Radeon HD 545v .*ATI.*(Mobility|MOBILITY).*HD *545v.* 2 1 +ATI Mobility Radeon HD 550v .*ATI.*(Mobility|MOBILITY).*HD *550v.* 2 1 +ATI Mobility Radeon HD 560v .*ATI.*(Mobility|MOBILITY).*HD *560v.* 2 1 +ATI Mobility Radeon HD 565v .*ATI.*(Mobility|MOBILITY).*HD *565v.* 2 1 +ATI Mobility Radeon HD 2300 .*ATI.*(Mobility|MOBILITY).*HD *23.* 1 1 +ATI Mobility Radeon HD 2400 .*ATI.*(Mobility|MOBILITY).*HD *24.* 1 1 +ATI Mobility Radeon HD 2600 .*ATI.*(Mobility|MOBILITY).*HD *26.* 3 1 +ATI Mobility Radeon HD 2700 .*ATI.*(Mobility|MOBILITY).*HD *27.* 3 1 +ATI Mobility Radeon HD 3100 .*ATI.*(Mobility|MOBILITY).*HD *31.* 0 1 +ATI Mobility Radeon HD 3200 .*ATI.*(Mobility|MOBILITY).*HD *32.* 0 1 +ATI Mobility Radeon HD 3400 .*ATI.*(Mobility|MOBILITY).*HD *34.* 2 1 +ATI Mobility Radeon HD 3600 .*ATI.*(Mobility|MOBILITY).*HD *36.* 3 1 +ATI Mobility Radeon HD 3800 .*ATI.*(Mobility|MOBILITY).*HD *38.* 3 1 +ATI Mobility Radeon HD 4200 .*ATI.*(Mobility|MOBILITY).*HD *42.* 2 1 +ATI Mobility Radeon HD 4300 .*ATI.*(Mobility|MOBILITY).*HD *43.* 2 1 +ATI Mobility Radeon HD 4500 .*ATI.*(Mobility|MOBILITY).*HD *45.* 3 1 +ATI Mobility Radeon HD 4600 .*ATI.*(Mobility|MOBILITY).*HD *46.* 3 1 +ATI Mobility Radeon HD 4800 .*ATI.*(Mobility|MOBILITY).*HD *48.* 3 1 +ATI Mobility Radeon HD 5100 .*ATI.*(Mobility|MOBILITY).*HD *51.* 2 1 +ATI Mobility Radeon HD 5300 .*ATI.*(Mobility|MOBILITY).*HD *53.* 2 1 +ATI Mobility Radeon HD 5400 .*ATI.*(Mobility|MOBILITY).*HD *54.* 2 1 +ATI Mobility Radeon HD 5500 .*ATI.*(Mobility|MOBILITY).*HD *55.* 2 1 +ATI Mobility Radeon HD 5600 .*ATI.*(Mobility|MOBILITY).*HD *56.* 2 1 +ATI Mobility Radeon HD 5700 .*ATI.*(Mobility|MOBILITY).*HD *57.* 3 1 +ATI Mobility Radeon HD 6200 .*ATI.*(Mobility|MOBILITY).*HD *62.* 2 1 +ATI Mobility Radeon HD 6300 .*ATI.*(Mobility|MOBILITY).*HD *63.* 2 1 +ATI Mobility Radeon HD 6400M .*ATI.*(Mobility|MOBILITY).*HD *64.* 3 1 +ATI Mobility Radeon HD 6500M .*ATI.*(Mobility|MOBILITY).*HD *65.* 3 1 +ATI Mobility Radeon HD 6600M .*ATI.*(Mobility|MOBILITY).*HD *66.* 3 1 +ATI Mobility Radeon HD 6700M .*ATI.*(Mobility|MOBILITY).*HD *67.* 3 1 +ATI Mobility Radeon HD 6800M .*ATI.*(Mobility|MOBILITY).*HD *68.* 3 1 +ATI Mobility Radeon HD 6900M .*ATI.*(Mobility|MOBILITY).*HD *69.* 3 1 +ATI Mobility Radeon X1xxx .*ATI.*(Mobility|MOBILITY).*X1.* 0 1 +ATI Mobility Radeon X2xxx .*ATI.*(Mobility|MOBILITY).*X2.* 0 1 +ATI Mobility Radeon X3xx .*ATI.*(Mobility|MOBILITY).*X3.* 1 1 +ATI Mobility Radeon X6xx .*ATI.*(Mobility|MOBILITY).*X6.* 1 1 +ATI Mobility Radeon X7xx .*ATI.*(Mobility|MOBILITY).*X7.* 1 1 +ATI Mobility Radeon Xxxx .*ATI.*(Mobility|MOBILITY).*X.* 0 1 +ATI Mobility Radeon .*ATI.*(Mobility|MOBILITY).* 0 1 +ATI Radeon HD 2300 .*ATI.*(Radeon|RADEON) HD *23.* 0 1 +ATI Radeon HD 2400 .*ATI.*(Radeon|RADEON) HD *24.* 1 1 +ATI Radeon HD 2600 .*ATI.*(Radeon|RADEON) HD *26.* 2 1 +ATI Radeon HD 2900 .*ATI.*(Radeon|RADEON) HD *29.* 3 1 +ATI Radeon HD 3000 .*ATI.*(Radeon|RADEON) HD *30.* 0 1 +ATI Radeon HD 3100 .*ATI.*(Radeon|RADEON) HD *31.* 1 1 +ATI Radeon HD 3200 .*ATI.*(Radeon|RADEON) HD *32.* 0 1 +ATI Radeon HD 3300 .*ATI.*(Radeon|RADEON) HD *33.* 1 1 +ATI Radeon HD 3400 .*ATI.*(Radeon|RADEON) HD *34.* 1 1 +ATI Radeon HD 3500 .*ATI.*(Radeon|RADEON) HD *35.* 1 1 +ATI Radeon HD 3600 .*ATI.*(Radeon|RADEON) HD *36.* 3 1 +ATI Radeon HD 3700 .*ATI.*(Radeon|RADEON) HD *37.* 3 1 +ATI Radeon HD 3800 .*ATI.*(Radeon|RADEON) HD *38.* 3 1 +ATI Radeon HD 4200 .*ATI.*(Radeon|RADEON) HD *42.* 1 1 +ATI Radeon HD 4300 .*ATI.*(Radeon|RADEON) HD *43.* 1 1 +ATI Radeon HD 4400 .*ATI.*(Radeon|RADEON) HD *44.* 1 1 +ATI Radeon HD 4500 .*ATI.*(Radeon|RADEON) HD *45.* 3 1 +ATI Radeon HD 4600 .*ATI.*(Radeon|RADEON) HD *46.* 3 1 +ATI Radeon HD 4700 .*ATI.*(Radeon|RADEON) HD *47.* 3 1 +ATI Radeon HD 4800 .*ATI.*(Radeon|RADEON) HD *48.* 3 1 +ATI Radeon HD 5400 .*ATI.*(Radeon|RADEON) HD *54.* 3 1 +ATI Radeon HD 5500 .*ATI.*(Radeon|RADEON) HD *55.* 3 1 +ATI Radeon HD 5600 .*ATI.*(Radeon|RADEON) HD *56.* 3 1 +ATI Radeon HD 5700 .*ATI.*(Radeon|RADEON) HD *57.* 3 1 +ATI Radeon HD 5800 .*ATI.*(Radeon|RADEON) HD *58.* 3 1 +ATI Radeon HD 5900 .*ATI.*(Radeon|RADEON) HD *59.* 3 1 +ATI Radeon HD 6200 .*ATI.*(Radeon|RADEON) HD *62.* 2 1 +ATI Radeon HD 6300 .*ATI.*(Radeon|RADEON) HD *63.* 2 1 +ATI Radeon HD 6400 .*ATI.*(Radeon|RADEON) HD *64.* 3 1 +ATI Radeon HD 6500 .*ATI.*(Radeon|RADEON) HD *65.* 3 1 +ATI Radeon HD 66xx .*ATI.*(Radeon|RADEON) HD *66.* 3 1 +ATI Radeon HD 6700 .*ATI.*(Radeon|RADEON) HD *67.* 3 1 +ATI Radeon HD 6800 .*ATI.*(Radeon|RADEON) HD *68.* 3 1 +ATI Radeon HD 6900 .*ATI.*(Radeon|RADEON) HD *69.* 3 1 +ATI Radeon OpenGL .*ATI.*(Radeon|RADEON) OpenGL.* 0 0 +ATI Radeon 2100 .*ATI.*(Radeon|RADEON) 21.* 0 1 +ATI Radeon 3000 .*ATI.*(Radeon|RADEON) 30.* 0 1 +ATI Radeon 3100 .*ATI.*(Radeon|RADEON) 31.* 1 1 +ATI Radeon 5xxx .*ATI.*(Radeon|RADEON) 5.* 3 1 +ATI Radeon 7xxx .*ATI.*(Radeon|RADEON) 7.* 0 1 +ATI Radeon 8xxx .*ATI.*(Radeon|RADEON) 8.* 0 1 +ATI Radeon 9000 .*ATI.*(Radeon|RADEON) 90.* 0 1 +ATI Radeon 9100 .*ATI.*(Radeon|RADEON) 91.* 0 1 +ATI Radeon 9200 .*ATI.*(Radeon|RADEON) 92.* 0 1 +ATI Radeon 9500 .*ATI.*(Radeon|RADEON) 95.* 0 1 +ATI Radeon 9600 .*ATI.*(Radeon|RADEON) 96.* 0 1 +ATI Radeon 9700 .*ATI.*(Radeon|RADEON) 97.* 1 1 +ATI Radeon 9800 .*ATI.*(Radeon|RADEON) 98.* 1 1 +ATI Radeon RV250 .*ATI.*RV250.* 0 1 +ATI Radeon RV600 .*ATI.*RV6.* 1 1 +ATI Radeon RX700 .*ATI.*RX70.* 1 1 +ATI Radeon RX800 .*ATI.*(Radeon|RADEON) *RX80.* 2 1 +ATI RS880M .*ATI.*RS880M 1 1 +ATI Radeon RX9550 .*ATI.*RX9550.* 1 1 +ATI Radeon VE .*ATI.*(Radeon|RADEON).*VE.* 0 0 +ATI Radeon X1000 .*ATI.*(Radeon|RADEON) *X10.* 0 1 +ATI Radeon X1200 .*ATI.*(Radeon|RADEON) *X12.* 0 1 +ATI Radeon X1300 .*ATI.*(Radeon|RADEON) *X13.* 1 1 +ATI Radeon X1400 .*ATI.*(Radeon|RADEON) *X14.* 1 1 +ATI Radeon X1500 .*ATI.*(Radeon|RADEON) *X15.* 1 1 +ATI Radeon X1600 .*ATI.*(Radeon|RADEON) *X16.* 1 1 +ATI Radeon X1700 .*ATI.*(Radeon|RADEON) *X17.* 1 1 +ATI Radeon X1800 .*ATI.*(Radeon|RADEON) *X18.* 3 1 +ATI Radeon X1900 .*ATI.*(Radeon|RADEON) *X19.* 3 1 +ATI Radeon X300 .*ATI.*(Radeon|RADEON) *X3.* 0 1 +ATI Radeon X400 .*ATI.*(Radeon|RADEON) X4.* 0 1 +ATI Radeon X500 .*ATI.*(Radeon|RADEON) X5.* 0 1 +ATI Radeon X600 .*ATI.*(Radeon|RADEON) X6.* 1 1 +ATI Radeon X700 .*ATI.*(Radeon|RADEON) X7.* 1 1 +ATI Radeon X800 .*ATI.*(Radeon|RADEON) X8.* 2 1 +ATI Radeon X900 .*ATI.*(Radeon|RADEON) X9.* 2 1 +ATI Radeon Xpress .*ATI.*(Radeon|RADEON) (Xpress|XPRESS).* 0 1 +ATI Rage 128 .*ATI.*Rage 128.* 0 1 +ATI R350 (9800) .*(ATI)?.*R350.* 1 1 +ATI R580 (X1900) .*(ATI)?.*R580.* 3 1 +ATI RC410 (Xpress 200) .*(ATI)?.*RC410.* 0 0 +ATI RS48x (Xpress 200x) .*(ATI)?.*RS48.* 0 0 +ATI RS600 (Xpress 3200) .*(ATI)?.*RS600.* 0 0 +ATI RV350 (9600) .*(ATI)?.*RV350.* 0 1 +ATI RV370 (X300) .*(ATI)?.*RV370.* 0 1 +ATI RV410 (X700) .*(ATI)?.*RV410.* 1 1 +ATI RV515 .*(ATI)?.*RV515.* 1 1 +ATI RV570 (X1900 GT/PRO) .*(ATI)?.*RV570.* 3 1 +ATI RV380 .*(ATI)?.*RV380.* 0 1 +ATI RV530 .*(ATI)?.*RV530.* 1 1 +ATI RX480 (Xpress 200P) .*(ATI)?.*RX480.* 0 1 +ATI RX700 .*(ATI)?.*RX700.* 1 1 +AMD ANTILLES (HD 6990) .*(AMD|ATI).*(Antilles|ANTILLES).* 3 1 +AMD BARTS (HD 6800) .*(AMD|ATI).*(Barts|BARTS).* 3 1 +AMD CAICOS (HD 6400) .*(AMD|ATI).*(Caicos|CAICOS).* 3 1 +AMD CAYMAN (HD 6900) .*(AMD|ATI).*(Cayman|CAYMAM).* 3 1 +AMD CEDAR (HD 5450) .*(AMD|ATI).*(Cedar|CEDAR).* 2 1 +AMD CYPRESS (HD 5800) .*(AMD|ATI).*(Cypress|CYPRESS).* 3 1 +AMD HEMLOCK (HD 5970) .*(AMD|ATI).*(Hemlock|HEMLOCK).* 3 1 +AMD JUNIPER (HD 5700) .*(AMD|ATI).*(Juniper|JUNIPER).* 3 1 +AMD PARK .*(AMD|ATI).*(Park|PARK).* 3 1 +AMD REDWOOD (HD 5500/5600) .*(AMD|ATI).*(Redwood|REDWOOD).* 3 1 +AMD TURKS (HD 6500/6600) .*(AMD|ATI).*(Turks|TURKS).* 3 1 +AMD RS780 (HD 3200) .*(AMD|ATI)?.*RS780.* 0 1 +AMD RS880 (HD 4200) .*(AMD|ATI)?.*RS880.* 1 1 +AMD RV610 (HD 2400) .*(AMD|ATI)?.*RV610.* 1 1 +AMD RV620 (HD 3400) .*(AMD|ATI)?.*RV620.* 1 1 +AMD RV630 (HD 2600) .*(AMD|ATI)?.*RV630.* 2 1 +AMD RV635 (HD 3600) .*(AMD|ATI)?.*RV635.* 3 1 +AMD RV670 (HD 3800) .*(AMD|ATI)?.*RV670.* 3 1 +AMD R680 (HD 3870 X2) .*(AMD|ATI)?.*R680.* 3 1 +AMD R700 (HD 4800 X2) .*(AMD|ATI)?.*R700.* 3 1 +AMD RV710 (HD 4300) .*(AMD|ATI)?.*RV710.* 1 1 +AMD RV730 (HD 4600) .*(AMD|ATI)?.*RV730.* 3 1 +AMD RV740 (HD 4700) .*(AMD|ATI)?.*RV740.* 3 1 +AMD RV770 (HD 4800) .*(AMD|ATI)?.*RV770.* 3 1 +AMD RV790 (HD 4800) .*(AMD|ATI)?.*RV790.* 3 1 +ATI 760G/Radeon 3000 .*ATI.*AMD 760G.* 1 1 +ATI 780L/Radeon 3000 .*ATI.*AMD 780L.* 1 1 +ATI Radeon DDR .*ATI.*(Radeon|RADEON) ?DDR.* 0 1 +ATI FirePro 2000 .*ATI.*FirePro 2.* 1 1 +ATI FirePro 3000 .*ATI.*FirePro V3.* 1 1 +ATI FirePro 4000 .*ATI.*FirePro V4.* 2 1 +ATI FirePro 5000 .*ATI.*FirePro V5.* 3 1 +ATI FirePro 7000 .*ATI.*FirePro V7.* 3 1 +ATI FirePro M .*ATI.*FirePro M.* 3 1 +ATI Technologies .*ATI *Technologies.* 0 1 +// This entry is last to work around the "R300" driver problem. +ATI R300 (9700) .*(ATI)?.*R300.* 1 1 +ATI Radeon .*ATI.*Radeon.* 0 1 +Intel X3100 .*Intel.*X3100.* 0 1 +Intel 830M .*Intel.*830M 0 0 +Intel 845G .*Intel.*845G 0 0 +Intel 855GM .*Intel.*855GM 0 0 +Intel 865G .*Intel.*865G 0 0 +Intel 900 .*Intel.*900.*900 0 0 +Intel 915GM .*Intel.*915GM 0 0 +Intel 915G .*Intel.*915G 0 0 +Intel 945GM .*Intel.*945GM.* 0 1 +Intel 945G .*Intel.*945G.* 0 1 +Intel 950 .*Intel.*950.* 0 1 +Intel 965 .*Intel.*965.* 0 1 +Intel G33 .*Intel.*G33.* 0 0 +Intel G41 .*Intel.*G41.* 0 1 +Intel G45 .*Intel.*G45.* 0 1 +Intel Bear Lake .*Intel.*Bear Lake.* 0 0 +Intel Broadwater .*Intel.*Broadwater.* 0 0 +Intel Brookdale .*Intel.*Brookdale.* 0 0 +Intel Cantiga .*Intel.*Cantiga.* 0 0 +Intel Eaglelake .*Intel.*Eaglelake.* 0 1 +Intel Graphics Media HD .*Intel.*Graphics Media.*HD.* 0 1 +Intel HD Graphics .*Intel.*HD Graphics.* 2 1 +Intel Mobile 4 Series .*Intel.*Mobile *4 Series.* 0 1 +Intel Media Graphics HD .*Intel.*Media Graphics HD.* 0 1 +Intel Montara .*Intel.*Montara.* 0 0 +Intel Pineview .*Intel.*Pineview.* 0 1 +Intel Springdale .*Intel.*Springdale.* 0 0 +Intel HD Graphics 2000 .*Intel.*HD2000.* 1 1 +Intel HD Graphics 3000 .*Intel.*HD3000.* 2 1 +Matrox .*Matrox.* 0 0 +Mesa .*Mesa.* 0 0 +NVIDIA 205 .*NVIDIA.*GeForce 205.* 2 1 +NVIDIA 210 .*NVIDIA.*GeForce 210.* 2 1 +NVIDIA 310M .*NVIDIA.*GeForce 310M.* 1 1 +NVIDIA 310 .*NVIDIA.*GeForce 310.* 3 1 +NVIDIA 315M .*NVIDIA.*GeForce 315M.* 2 1 +NVIDIA 315 .*NVIDIA.*GeForce 315.* 3 1 +NVIDIA 320M .*NVIDIA.*GeForce 320M.* 2 1 +NVIDIA G100M .*NVIDIA *(GeForce)? *(G)? ?100M.* 0 1 +NVIDIA G100 .*NVIDIA *(GeForce)? *(G)? ?100.* 0 1 +NVIDIA G102M .*NVIDIA *(GeForce)? *(G)? ?102M.* 0 1 +NVIDIA G103M .*NVIDIA *(GeForce)? *(G)? ?103M.* 0 1 +NVIDIA G105M .*NVIDIA *(GeForce)? *(G)? ?105M.* 0 1 +NVIDIA G 110M .*NVIDIA *(GeForce)? *(G)? ?110M.* 0 1 +NVIDIA G 120M .*NVIDIA *(GeForce)? *(G)? ?120M.* 1 1 +NVIDIA G 200 .*NVIDIA *(GeForce)? *(G)? ?200(M)?.* 0 1 +NVIDIA G 205M .*NVIDIA *(GeForce)? *(G)? ?205(M)?.* 0 1 +NVIDIA G 210 .*NVIDIA *(GeForce)? *(G)? ?210(M)?.* 1 1 +NVIDIA 305M .*NVIDIA *(GeForce)? *(G)? ?305(M)?.* 1 1 +NVIDIA G 310M .*NVIDIA *(GeForce)? *(G)? ?310(M)?.* 2 1 +NVIDIA G 315 .*NVIDIA *(GeForce)? *(G)? ?315(M)?.* 2 1 +NVIDIA G 320M .*NVIDIA *(GeForce)? *(G)? ?320(M)?.* 2 1 +NVIDIA G 405 .*NVIDIA *(GeForce)? *(G)? ?405(M)?.* 1 1 +NVIDIA G 410M .*NVIDIA *(GeForce)? *(G)? ?410(M)?.* 1 1 +NVIDIA GT 120M .*NVIDIA.*(GeForce)? *GT *120(M)?.* 2 1 +NVIDIA GT 120 .*NVIDIA.*GT.*120 2 1 +NVIDIA GT 130M .*NVIDIA.*(GeForce)? *GT *130(M)?.* 2 1 +NVIDIA GT 140M .*NVIDIA.*(GeForce)? *GT *140(M)?.* 2 1 +NVIDIA GT 150M .*NVIDIA.*(GeForce)? *GT(S)? *150(M)?.* 2 1 +NVIDIA GT 160M .*NVIDIA.*(GeForce)? *GT *160(M)?.* 2 1 +NVIDIA GT 220M .*NVIDIA.*(GeForce)? *GT *220(M)?.* 2 1 +NVIDIA GT 230M .*NVIDIA.*(GeForce)? *GT *230(M)?.* 2 1 +NVIDIA GT 240M .*NVIDIA.*(GeForce)? *GT *240(M)?.* 2 1 +NVIDIA GT 250M .*NVIDIA.*(GeForce)? *GT *250(M)?.* 2 1 +NVIDIA GT 260M .*NVIDIA.*(GeForce)? *GT *260(M)?.* 2 1 +NVIDIA GT 320M .*NVIDIA.*(GeForce)? *GT *320(M)?.* 2 1 +NVIDIA GT 325M .*NVIDIA.*(GeForce)? *GT *325(M)?.* 0 1 +NVIDIA GT 330M .*NVIDIA.*(GeForce)? *GT *330(M)?.* 3 1 +NVIDIA GT 335M .*NVIDIA.*(GeForce)? *GT *335(M)?.* 1 1 +NVIDIA GT 340M .*NVIDIA.*(GeForce)? *GT *340(M)?.* 2 1 +NVIDIA GT 415M .*NVIDIA.*(GeForce)? *GT *415(M)?.* 2 1 +NVIDIA GT 420M .*NVIDIA.*(GeForce)? *GT *420(M)?.* 2 1 +NVIDIA GT 425M .*NVIDIA.*(GeForce)? *GT *425(M)?.* 3 1 +NVIDIA GT 430M .*NVIDIA.*(GeForce)? *GT *430(M)?.* 3 1 +NVIDIA GT 435M .*NVIDIA.*(GeForce)? *GT *435(M)?.* 3 1 +NVIDIA GT 440M .*NVIDIA.*(GeForce)? *GT *440(M)?.* 3 1 +NVIDIA GT 445M .*NVIDIA.*(GeForce)? *GT *445(M)?.* 3 1 +NVIDIA GT 450M .*NVIDIA.*(GeForce)? *GT *450(M)?.* 3 1 +NVIDIA GT 520M .*NVIDIA.*(GeForce)? *GT *520(M)?.* 3 1 +NVIDIA GT 525M .*NVIDIA.*(GeForce)? *GT *525(M)?.* 3 1 +NVIDIA GT 540M .*NVIDIA.*(GeForce)? *GT *540(M)?.* 3 1 +NVIDIA GT 550M .*NVIDIA.*(GeForce)? *GT *550(M)?.* 3 1 +NVIDIA GT 555M .*NVIDIA.*(GeForce)? *GT *555(M)?.* 3 1 +NVIDIA GTS 160M .*NVIDIA.*(GeForce)? *GT(S)? *160(M)?.* 2 1 +NVIDIA GTS 240 .*NVIDIA.*(GeForce)? *GTS *24.* 3 1 +NVIDIA GTS 250 .*NVIDIA.*(GeForce)? *GTS *25.* 3 1 +NVIDIA GTS 350M .*NVIDIA.*(GeForce)? *GTS *350M.* 3 1 +NVIDIA GTS 360M .*NVIDIA.*(GeForce)? *GTS *360M.* 3 1 +NVIDIA GTS 360 .*NVIDIA.*(GeForce)? *GTS *360.* 3 1 +NVIDIA GTS 450 .*NVIDIA.*(GeForce)? *GTS *45.* 3 1 +NVIDIA GTX 260 .*NVIDIA.*(GeForce)? *GTX *26.* 3 1 +NVIDIA GTX 275 .*NVIDIA.*(GeForce)? *GTX *275.* 3 1 +NVIDIA GTX 270 .*NVIDIA.*(GeForce)? *GTX *27.* 3 1 +NVIDIA GTX 285 .*NVIDIA.*(GeForce)? *GTX *285.* 3 1 +NVIDIA GTX 280 .*NVIDIA.*(GeForce)? *GTX *280.* 3 1 +NVIDIA GTX 290 .*NVIDIA.*(GeForce)? *GTX *290.* 3 1 +NVIDIA GTX 295 .*NVIDIA.*(GeForce)? *GTX *295.* 3 1 +NVIDIA GTX 460M .*NVIDIA.*(GeForce)? *GTX *460M.* 3 1 +NVIDIA GTX 465 .*NVIDIA.*(GeForce)? *GTX *465.* 3 1 +NVIDIA GTX 460 .*NVIDIA.*(GeForce)? *GTX *46.* 3 1 +NVIDIA GTX 470M .*NVIDIA.*(GeForce)? *GTX *470M.* 3 1 +NVIDIA GTX 470 .*NVIDIA.*(GeForce)? *GTX *47.* 3 1 +NVIDIA GTX 480M .*NVIDIA.*(GeForce)? *GTX *480M.* 3 1 +NVIDIA GTX 485M .*NVIDIA.*(GeForce)? *GTX *485M.* 3 1 +NVIDIA GTX 480 .*NVIDIA.*(GeForce)? *GTX *48.* 3 1 +NVIDIA GTX 530 .*NVIDIA.*(GeForce)? *GTX *53.* 3 1 +NVIDIA GTX 550 .*NVIDIA.*(GeForce)? *GTX *55.* 3 1 +NVIDIA GTX 560 .*NVIDIA.*(GeForce)? *GTX *56.* 3 1 +NVIDIA GTX 570 .*NVIDIA.*(GeForce)? *GTX *57.* 3 1 +NVIDIA GTX 580M .*NVIDIA.*(GeForce)? *GTX *580M.* 3 1 +NVIDIA GTX 580 .*NVIDIA.*(GeForce)? *GTX *58.* 3 1 +NVIDIA GTX 590 .*NVIDIA.*(GeForce)? *GTX *59.* 3 1 +NVIDIA C51 .*NVIDIA.*(GeForce)? *C51.* 0 1 +NVIDIA G72 .*NVIDIA.*(GeForce)? *G72.* 1 1 +NVIDIA G73 .*NVIDIA.*(GeForce)? *G73.* 1 1 +NVIDIA G84 .*NVIDIA.*(GeForce)? *G84.* 2 1 +NVIDIA G86 .*NVIDIA.*(GeForce)? *G86.* 3 1 +NVIDIA G92 .*NVIDIA.*(GeForce)? *G92.* 3 1 +NVIDIA GeForce .*GeForce 256.* 0 0 +NVIDIA GeForce 2 .*GeForce ?2 ?.* 0 1 +NVIDIA GeForce 3 .*GeForce ?3 ?.* 0 1 +NVIDIA GeForce 3 Ti .*GeForce ?3 Ti.* 0 1 +NVIDIA GeForce 4 .*NVIDIA.*GeForce ?4.* 0 1 +NVIDIA GeForce 4 Go .*NVIDIA.*GeForce ?4.*Go.* 0 1 +NVIDIA GeForce 4 MX .*NVIDIA.*GeForce ?4 MX.* 0 1 +NVIDIA GeForce 4 PCX .*NVIDIA.*GeForce ?4 PCX.* 0 1 +NVIDIA GeForce 4 Ti .*NVIDIA.*GeForce ?4 Ti.* 0 1 +NVIDIA GeForce 6100 .*NVIDIA.*GeForce 61.* 0 1 +NVIDIA GeForce 6200 .*NVIDIA.*GeForce 62.* 0 1 +NVIDIA GeForce 6500 .*NVIDIA.*GeForce 65.* 0 1 +NVIDIA GeForce 6600 .*NVIDIA.*GeForce 66.* 1 1 +NVIDIA GeForce 6700 .*NVIDIA.*GeForce 67.* 2 1 +NVIDIA GeForce 6800 .*NVIDIA.*GeForce 68.* 2 1 +NVIDIA GeForce 7000 .*NVIDIA.*GeForce 70.* 0 1 +NVIDIA GeForce 7100 .*NVIDIA.*GeForce 71.* 0 1 +NVIDIA GeForce 7200 .*NVIDIA.*GeForce 72.* 1 1 +NVIDIA GeForce 7300 .*NVIDIA.*GeForce 73.* 1 1 +NVIDIA GeForce 7500 .*NVIDIA.*GeForce 75.* 1 1 +NVIDIA GeForce 7600 .*NVIDIA.*GeForce 76.* 2 1 +NVIDIA GeForce 7800 .*NVIDIA.*GeForce 78.* 2 1 +NVIDIA GeForce 7900 .*NVIDIA.*GeForce 79.* 2 1 +NVIDIA GeForce 8100 .*NVIDIA.*GeForce 81.* 1 1 +NVIDIA GeForce 8200M .*NVIDIA.*GeForce 8200M.* 1 1 +NVIDIA GeForce 8200 .*NVIDIA.*GeForce 82.* 1 1 +NVIDIA GeForce 8300 .*NVIDIA.*GeForce 83.* 1 1 +NVIDIA GeForce 8400M .*NVIDIA.*GeForce 8400M.* 1 1 +NVIDIA GeForce 8400 .*NVIDIA.*GeForce 84.* 1 1 +NVIDIA GeForce 8500 .*NVIDIA.*GeForce 85.* 3 1 +NVIDIA GeForce 8600M .*NVIDIA.*GeForce 8600M.* 1 1 +NVIDIA GeForce 8600 .*NVIDIA.*GeForce 86.* 3 1 +NVIDIA GeForce 8700M .*NVIDIA.*GeForce 8700M.* 3 1 +NVIDIA GeForce 8700 .*NVIDIA.*GeForce 87.* 3 1 +NVIDIA GeForce 8800M .*NVIDIA.*GeForce 8800M.* 3 1 +NVIDIA GeForce 8800 .*NVIDIA.*GeForce 88.* 3 1 +NVIDIA GeForce 9100M .*NVIDIA.*GeForce 9100M.* 0 1 +NVIDIA GeForce 9100 .*NVIDIA.*GeForce 91.* 0 1 +NVIDIA GeForce 9200M .*NVIDIA.*GeForce 9200M.* 1 1 +NVIDIA GeForce 9200 .*NVIDIA.*GeForce 92.* 1 1 +NVIDIA GeForce 9300M .*NVIDIA.*GeForce 9300M.* 1 1 +NVIDIA GeForce 9300 .*NVIDIA.*GeForce 93.* 1 1 +NVIDIA GeForce 9400M .*NVIDIA.*GeForce 9400M.* 1 1 +NVIDIA GeForce 9400 .*NVIDIA.*GeForce 94.* 1 1 +NVIDIA GeForce 9500M .*NVIDIA.*GeForce 9500M.* 2 1 +NVIDIA GeForce 9500 .*NVIDIA.*GeForce 95.* 2 1 +NVIDIA GeForce 9600M .*NVIDIA.*GeForce 9600M.* 3 1 +NVIDIA GeForce 9600 .*NVIDIA.*GeForce 96.* 2 1 +NVIDIA GeForce 9700M .*NVIDIA.*GeForce 9700M.* 2 1 +NVIDIA GeForce 9800M .*NVIDIA.*GeForce 9800M.* 3 1 +NVIDIA GeForce 9800 .*NVIDIA.*GeForce 98.* 3 1 +NVIDIA GeForce FX 5100 .*NVIDIA.*GeForce FX 51.* 0 1 +NVIDIA GeForce FX 5200 .*NVIDIA.*GeForce FX 52.* 0 1 +NVIDIA GeForce FX 5300 .*NVIDIA.*GeForce FX 53.* 0 1 +NVIDIA GeForce FX 5500 .*NVIDIA.*GeForce FX 55.* 0 1 +NVIDIA GeForce FX 5600 .*NVIDIA.*GeForce FX 56.* 0 1 +NVIDIA GeForce FX 5700 .*NVIDIA.*GeForce FX 57.* 1 1 +NVIDIA GeForce FX 5800 .*NVIDIA.*GeForce FX 58.* 1 1 +NVIDIA GeForce FX 5900 .*NVIDIA.*GeForce FX 59.* 1 1 +NVIDIA GeForce FX Go5100 .*NVIDIA.*GeForce FX Go51.* 0 1 +NVIDIA GeForce FX Go5200 .*NVIDIA.*GeForce FX Go52.* 0 1 +NVIDIA GeForce FX Go5300 .*NVIDIA.*GeForce FX Go53.* 0 1 +NVIDIA GeForce FX Go5500 .*NVIDIA.*GeForce FX Go55.* 0 1 +NVIDIA GeForce FX Go5600 .*NVIDIA.*GeForce FX Go56.* 0 1 +NVIDIA GeForce FX Go5700 .*NVIDIA.*GeForce FX Go57.* 1 1 +NVIDIA GeForce FX Go5800 .*NVIDIA.*GeForce FX Go58.* 1 1 +NVIDIA GeForce FX Go5900 .*NVIDIA.*GeForce FX Go59.* 1 1 +NVIDIA GeForce FX Go5xxx .*NVIDIA.*GeForce FX Go.* 0 1 +NVIDIA GeForce Go 6100 .*NVIDIA.*GeForce Go 61.* 0 1 +NVIDIA GeForce Go 6200 .*NVIDIA.*GeForce Go 62.* 0 1 +NVIDIA GeForce Go 6400 .*NVIDIA.*GeForce Go 64.* 1 1 +NVIDIA GeForce Go 6500 .*NVIDIA.*GeForce Go 65.* 1 1 +NVIDIA GeForce Go 6600 .*NVIDIA.*GeForce Go 66.* 1 1 +NVIDIA GeForce Go 6700 .*NVIDIA.*GeForce Go 67.* 1 1 +NVIDIA GeForce Go 6800 .*NVIDIA.*GeForce Go 68.* 1 1 +NVIDIA GeForce Go 7200 .*NVIDIA.*GeForce Go 72.* 1 1 +NVIDIA GeForce Go 7300 LE .*NVIDIA.*GeForce Go 73.*LE.* 0 1 +NVIDIA GeForce Go 7300 .*NVIDIA.*GeForce Go 73.* 1 1 +NVIDIA GeForce Go 7400 .*NVIDIA.*GeForce Go 74.* 1 1 +NVIDIA GeForce Go 7600 .*NVIDIA.*GeForce Go 76.* 2 1 +NVIDIA GeForce Go 7700 .*NVIDIA.*GeForce Go 77.* 2 1 +NVIDIA GeForce Go 7800 .*NVIDIA.*GeForce Go 78.* 2 1 +NVIDIA GeForce Go 7900 .*NVIDIA.*GeForce Go 79.* 2 1 +NVIDIA D9M .*NVIDIA.*D9M.* 1 1 +NVIDIA G94 .*NVIDIA.*G94.* 3 1 +NVIDIA GeForce Go 6 .*GeForce Go 6.* 1 1 +NVIDIA ION 2 .*NVIDIA ION 2.* 2 1 +NVIDIA ION .*NVIDIA ION.* 2 1 +NVIDIA NB9M .*GeForce NB9M.* 1 1 +NVIDIA NB9P .*GeForce NB9P.* 1 1 +NVIDIA GeForce PCX .*GeForce PCX.* 0 1 +NVIDIA Generic .*NVIDIA.*Unknown.* 0 0 +NVIDIA NV17 .*GeForce NV17.* 0 1 +NVIDIA NV34 .*NVIDIA.*NV34.* 0 1 +NVIDIA NV35 .*NVIDIA.*NV35.* 0 1 +NVIDIA NV36 .*GeForce NV36.* 1 1 +NVIDIA NV43 .*NVIDIA *NV43.* 1 1 +NVIDIA NV44 .*NVIDIA *NV44.* 1 1 +NVIDIA nForce .*NVIDIA *nForce.* 0 0 +NVIDIA MCP78 .*NVIDIA *MCP78.* 1 1 +NVIDIA Quadro2 .*Quadro2.* 0 1 +NVIDIA Quadro 1000M .*Quadro.*1000M.* 2 1 +NVIDIA Quadro 2000 M/D .*Quadro.*2000(M|D)?.* 3 1 +NVIDIA Quadro 4000M .*Quadro.*4000M.* 3 1 +NVIDIA Quadro 4000 .*Quadro *4000.* 3 1 +NVIDIA Quadro 50x0 M .*Quadro.*50.0(M)?.* 3 1 +NVIDIA Quadro 6000 .*Quadro.*6000.* 3 1 +NVIDIA Quadro 400 .*Quadro.*400.* 2 1 +NVIDIA Quadro 600 .*Quadro.*600.* 2 1 +NVIDIA Quadro4 .*Quadro4.* 0 1 +NVIDIA Quadro DCC .*Quadro DCC.* 0 1 +NVIDIA Quadro FX 770M .*Quadro.*FX *770M.* 2 1 +NVIDIA Quadro FX 1500M .*Quadro.*FX *1500M.* 1 1 +NVIDIA Quadro FX 1600M .*Quadro.*FX *1600M.* 2 1 +NVIDIA Quadro FX 2500M .*Quadro.*FX *2500M.* 2 1 +NVIDIA Quadro FX 2700M .*Quadro.*FX *2700M.* 3 1 +NVIDIA Quadro FX 2800M .*Quadro.*FX *2800M.* 3 1 +NVIDIA Quadro FX 3500 .*Quadro.*FX *3500.* 2 1 +NVIDIA Quadro FX 3600 .*Quadro.*FX *3600.* 3 1 +NVIDIA Quadro FX 3700 .*Quadro.*FX *3700.* 3 1 +NVIDIA Quadro FX 3800 .*Quadro.*FX *3800.* 3 1 +NVIDIA Quadro FX 4500 .*Quadro.*FX *45.* 3 1 +NVIDIA Quadro FX 880M .*Quadro.*FX *880M.* 3 1 +NVIDIA Quadro FX 4800 .*NVIDIA.*Quadro *FX *4800.* 3 1 +NVIDIA Quadro FX .*Quadro FX.* 1 1 +NVIDIA Quadro NVS 1xxM .*Quadro NVS *1.[05]M.* 0 1 +NVIDIA Quadro NVS 300M .*NVIDIA.*NVS *300M.* 2 1 +NVIDIA Quadro NVS 320M .*NVIDIA.*NVS *320M.* 2 1 +NVIDIA Quadro NVS 2100M .*NVIDIA.*NVS *2100M.* 2 1 +NVIDIA Quadro NVS 3100M .*NVIDIA.*NVS *3100M.* 2 1 +NVIDIA Quadro NVS 4200M .*NVIDIA.*NVS *4200M.* 2 1 +NVIDIA Quadro NVS 5100M .*NVIDIA.*NVS *5100M.* 2 1 +NVIDIA Quadro NVS .*NVIDIA.*NVS 0 1 +NVIDIA RIVA TNT .*RIVA TNT.* 0 0 +S3 .*S3 Graphics.* 0 0 +SiS SiS.* 0 0 +Trident Trident.* 0 0 +Tungsten Graphics Tungsten.* 0 0 +XGI XGI.* 0 0 +VIA VIA.* 0 0 +Apple Generic Apple.*Generic.* 0 0 +Apple Software Renderer Apple.*Software Renderer.* 0 0 diff --git a/indra/newview/groupchatlistener.cpp b/indra/newview/groupchatlistener.cpp new file mode 100644 index 0000000000..3758896b85 --- /dev/null +++ b/indra/newview/groupchatlistener.cpp @@ -0,0 +1,59 @@ +/** + * @file groupchatlistener.cpp + * @author Nat Goodspeed + * @date 2011-04-11 + * @brief Implementation for groupchatlistener. + * + * $LicenseInfo:firstyear=2011&license=internal$ + * Copyright (c) 2011, Linden Research, Inc. + * $/LicenseInfo$ + */ + +// Precompiled header +#include "llviewerprecompiledheaders.h" +// associated header +#include "groupchatlistener.h" +// STL headers +// std headers +// external library headers +// other Linden headers +#include "llgroupactions.h" +#include "llimview.h" + + +namespace { + void startIm_wrapper(LLSD const & event) + { + LLUUID session_id = LLGroupActions::startIM(event["id"].asUUID()); + sendReply(LLSDMap("session_id", LLSD(session_id)), event); + } + + void send_message_wrapper(const std::string& text, const LLUUID& session_id, const LLUUID& group_id) + { + LLIMModel::sendMessage(text, session_id, group_id, IM_SESSION_GROUP_START); + } +} + + +GroupChatListener::GroupChatListener(): + LLEventAPI("GroupChat", + "API to enter, leave, send and intercept group chat messages") +{ + add("startIM", + "Enter a group chat in group with UUID [\"id\"]\n" + "Assumes the logged-in agent is already a member of this group.", + &startIm_wrapper); + add("endIM", + "Leave a group chat in group with UUID [\"id\"]\n" + "Assumes a prior successful startIM request.", + &LLGroupActions::endIM, + LLSDArray("id")); + add("sendIM", + "send a groupchat IM", + &send_message_wrapper, + LLSDArray("text")("session_id")("group_id")); +} +/* + static void sendMessage(const std::string& utf8_text, const LLUUID& im_session_id, + const LLUUID& other_participant_id, EInstantMessage dialog); +*/ diff --git a/indra/newview/groupchatlistener.h b/indra/newview/groupchatlistener.h new file mode 100644 index 0000000000..719e3e877f --- /dev/null +++ b/indra/newview/groupchatlistener.h @@ -0,0 +1,23 @@ +/** + * @file groupchatlistener.h + * @author Nat Goodspeed + * @date 2011-04-11 + * @brief + * + * $LicenseInfo:firstyear=2011&license=internal$ + * Copyright (c) 2011, Linden Research, Inc. + * $/LicenseInfo$ + */ + +#if ! defined(LL_GROUPCHATLISTENER_H) +#define LL_GROUPCHATLISTENER_H + +#include "lleventapi.h" + +class GroupChatListener: public LLEventAPI +{ +public: + GroupChatListener(); +}; + +#endif /* ! defined(LL_GROUPCHATLISTENER_H) */ diff --git a/indra/newview/licenses-mac.txt b/indra/newview/licenses-mac.txt index 1324fa1a86..af80bff5d9 100644 --- a/indra/newview/licenses-mac.txt +++ b/indra/newview/licenses-mac.txt @@ -315,516 +315,6 @@ This product includes cryptographic software written by Eric Young Hudson (tjh@cryptsoft.com). -=========== -Pth License -=========== - ____ _ _ - | _ \| |_| |__ ``Ian Fleming was a UNIX fan! - | |_) | __| '_ \ How do I know? Well, James Bond - | __/| |_| | | | had the (license to kill) number 007, - |_| \__|_| |_| i.e., he could execute anyone!'' - - GNU Pth - The GNU Portable Threads - - LICENSE - ======= - - 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; either version 2.1 of the - License, or (at your option) any later version. - - For some people, it is not clear, what is the real intention of the - author by using the GNU Lesser General Public License (LGPL) as the - distribution license for GNU Pth. This is, because the LGPL and the - GPL can be (and are often) interpreted very differently and some - interpretations seem to be not compatible with others. So an explicit - clarification for the use of the LGPL for GNU Pth from the authors - point of view might be useful. - - The author places this library under the LGPL to make sure that it - can be used both commercially and non-commercially provided that - modifications to the code base are always donated back to the official - code base under the same license conditions. Please keep in mind that - especially using this library in code not staying under the GPL or - the LGPL _is_ allowed and that any taint or license creap into code - that uses the library is not the authors intention. It is just the - case that _including_ this library into the source tree of other - applications is a little bit more inconvinient because of the LGPL. - But it has to be this way for good reasons. And keep in mind that - inconvinient doesn't mean not allowed or even impossible. - - Even if you want to use this library in some BSD-style licensed - packages, this _is_ possible as long as you are a little bit - carefully. Usually this means you have to make sure that the code is - still clearly separated into the source tree and that modifications to - this source area are done under the conditions of the LGPL. Read below - for more details on the conditions. Contact the author if you have - more questions. - - The license text of the GNU Lesser General Public License follows: - __________________________________________________________________________ - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - ======================= Original SSLeay License ======================= diff --git a/indra/newview/llaccountingquotamanager.cpp b/indra/newview/llaccountingquotamanager.cpp new file mode 100644 index 0000000000..ada74ea44c --- /dev/null +++ b/indra/newview/llaccountingquotamanager.cpp @@ -0,0 +1,264 @@ +/**
+ * @file LLAccountingQuotaManager.cpp
+ * @ Handles the setting and accessing for costs associated with mesh
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llaccountingquotamanager.h"
+#include "llagent.h"
+#include "llviewerregion.h"
+#include "llviewerobject.h"
+#include "llviewerobjectlist.h"
+#include "llviewerparcelmgr.h"
+#include "llparcel.h"
+
+//===============================================================================
+LLAccountingQuotaManager::LLAccountingQuotaManager()
+{
+}
+//===============================================================================
+class LLAccountingQuotaResponder : public LLCurl::Responder
+{
+public:
+ LLAccountingQuotaResponder( const LLSD& objectIDs )
+ : mObjectIDs( objectIDs )
+ {
+ }
+
+ void clearPendingRequests ( void )
+ {
+ for ( LLSD::array_iterator iter = mObjectIDs.beginArray(); iter != mObjectIDs.endArray(); ++iter )
+ {
+ LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( iter->asUUID() );
+ }
+ }
+
+ void error( U32 statusNum, const std::string& reason )
+ {
+ llwarns << "Transport error "<<reason<<llendl;
+ //prep#do we really want to remove all because of one failure - verify
+ clearPendingRequests();
+ }
+
+ void result( const LLSD& content )
+ {
+ if ( !content.isMap() || content.has("error") )
+ {
+ llwarns << "Error on fetched data"<< llendl;
+ //prep#do we really want to remove all because of one failure - verify
+ clearPendingRequests();
+ return;
+ }
+
+ //Differentiate what the incoming caps could be from the data
+ //bool VOContent = content.has("Objects");
+ bool containsParcel = content.has("parcel");
+ bool containsSelection = content.has("selected");
+ //bool VORegion = content.has("region");
+
+ //Loop over the stored object ids checking against the incoming data
+ for ( LLSD::array_iterator iter = mObjectIDs.beginArray(); iter != mObjectIDs.endArray(); ++iter )
+ {
+ LLUUID objectID = iter->asUUID();
+
+ LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( objectID );
+
+ if ( containsParcel )
+ {
+ //Typically should be one
+ S32 dataCount = content["parcel"].size();
+ for(S32 i = 0; i < dataCount; i++)
+ {
+ //prep#todo verify that this is safe, otherwise just add a bool
+ S32 parcelId = 0;
+ S32 parcelOwner = 0;
+ if ( content["parcel"][i].has("parcel_id") )
+ {
+ parcelId = content["parcel"][i]["parcel_id"].asInteger();
+ }
+ if ( content["parcel"][i].has("parcel_owner") )
+ {
+ parcelOwner = content["parcel"][i]["parcel_owner"].asInteger();
+ }
+
+ F32 ownerRenderCost = 0;
+ F32 ownerPhysicsCost = 0;
+ F32 ownerNetworkCost = 0;
+ F32 ownerSimulationCost = 0;
+
+ F32 groupRenderCost = 0;
+ F32 groupPhysicsCost = 0;
+ F32 groupNetworkCost = 0;
+ F32 groupSimulationCost = 0;
+
+ F32 otherRenderCost = 0;
+ F32 otherPhysicsCost = 0;
+ F32 otherNetworkCost = 0;
+ F32 otherSimulationCost = 0;
+
+ F32 totalRenderCost = 0;
+ F32 totalPhysicsCost = 0;
+ F32 totalNetworkCost = 0;
+ F32 totalSimulationCost = 0;
+
+ if ( content["parcel"][i].has("owner") )
+ {
+ ownerRenderCost = content["parcel"][i]["owner"]["render"].asReal();
+ ownerPhysicsCost = content["parcel"][i]["owner"]["physics"].asReal();
+ ownerNetworkCost = content["parcel"][i]["owner"]["network"].asReal();
+ ownerSimulationCost = content["parcel"][i]["owner"]["simulation"].asReal();
+
+ }
+ if ( content["parcel"][i].has("group") )
+ {
+ groupRenderCost = content["parcel"][i]["group"]["render"].asReal();
+ groupPhysicsCost = content["parcel"][i]["group"]["physics"].asReal();
+ groupNetworkCost = content["parcel"][i]["group"]["network"].asReal();
+ groupSimulationCost = content["parcel"][i]["group"]["simulation"].asReal();
+
+ }
+ if ( content["parcel"][i].has("other") )
+ {
+ otherRenderCost = content["parcel"][i]["other"]["render"].asReal();
+ otherPhysicsCost = content["parcel"][i]["other"]["physics"].asReal();
+ otherNetworkCost = content["parcel"][i]["other"]["network"].asReal();
+ otherSimulationCost = content["parcel"][i]["other"]["simulation"].asReal();
+ }
+
+ if ( content["parcel"][i].has("total") )
+ {
+ totalRenderCost = content["parcel"][i]["total"]["render"].asReal();
+ totalPhysicsCost = content["parcel"][i]["total"]["physics"].asReal();
+ totalNetworkCost = content["parcel"][i]["total"]["network"].asReal();
+ totalSimulationCost = content["parcel"][i]["total"]["simulation"].asReal();
+
+ }
+
+ ParcelQuota parcelQuota( ownerRenderCost, ownerPhysicsCost, ownerNetworkCost, ownerSimulationCost,
+ groupRenderCost, groupPhysicsCost, groupNetworkCost, groupSimulationCost,
+ otherRenderCost, otherPhysicsCost, otherNetworkCost, otherSimulationCost,
+ totalRenderCost, totalPhysicsCost, totalNetworkCost, totalSimulationCost );
+ //Update the Parcel
+ LLParcel* pParcel = LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel();
+ if ( pParcel )
+ {
+ pParcel->updateQuota( objectID, parcelQuota );
+ }
+ }
+ }
+ else
+ if ( containsSelection )
+ {
+ S32 dataCount = content["selected"].size();
+ for(S32 i = 0; i < dataCount; i++)
+ {
+
+ F32 renderCost = 0;
+ F32 physicsCost = 0;
+ F32 networkCost = 0;
+ F32 simulationCost = 0;
+
+ S32 localId = 0;
+
+ localId = content["selected"][i]["local_id"].asInteger();
+ renderCost = content["selected"][i]["render"].asReal();
+ physicsCost = content["selected"][i]["physics"].asReal();
+ networkCost = content["selected"][i]["network"].asReal();
+ simulationCost = content["selected"][i]["simulation"].asReal();
+
+ SelectionQuota selectionQuota( localId, renderCost, physicsCost, networkCost, simulationCost );
+
+ //Update the objects
+ //gObjectList.updateQuota( localId, selectionQuota );
+
+ }
+ }
+ else
+ {
+ //Nothing in string
+ LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( objectID );
+ }
+ }
+ }
+
+private:
+ //List of posted objects
+ LLSD mObjectIDs;
+};
+//===============================================================================
+void LLAccountingQuotaManager::fetchQuotas( const std::string& url )
+{
+ // Invoking system must have already determined capability availability
+ if ( !url.empty() )
+ {
+ LLSD objectList;
+ U32 objectIndex = 0;
+ IDIt IDIter = mUpdateObjectQuota.begin();
+ IDIt IDIterEnd = mUpdateObjectQuota.end();
+
+ for ( ; IDIter != IDIterEnd; ++IDIter )
+ {
+ // Check to see if a request for this object has already been made.
+ if ( mPendingObjectQuota.find( *IDIter ) == mPendingObjectQuota.end() )
+ {
+ mPendingObjectQuota.insert( *IDIter );
+ objectList[objectIndex++] = *IDIter;
+ }
+ }
+
+ mUpdateObjectQuota.clear();
+
+ //Post results
+ if ( objectList.size() > 0 )
+ {
+ LLSD dataToPost = LLSD::emptyMap();
+ dataToPost["object_ids"] = objectList;
+ LLHTTPClient::post( url, dataToPost, new LLAccountingQuotaResponder( objectList ));
+ }
+ }
+ else
+ {
+ //url was empty - warn & continue
+ llwarns<<"Supplied url is empty "<<llendl;
+ mUpdateObjectQuota.clear();
+ mPendingObjectQuota.clear();
+ }
+}
+//===============================================================================
+void LLAccountingQuotaManager::updateObjectCost( const LLUUID& objectID )
+{
+ mUpdateObjectQuota.insert( objectID );
+}
+//===============================================================================
+void LLAccountingQuotaManager::removePendingObjectQuota( const LLUUID& objectID )
+{
+ mPendingObjectQuota.erase( objectID );
+}
+//===============================================================================
diff --git a/indra/newview/llaccountingquotamanager.h b/indra/newview/llaccountingquotamanager.h new file mode 100644 index 0000000000..4c20561bce --- /dev/null +++ b/indra/newview/llaccountingquotamanager.h @@ -0,0 +1,60 @@ +/** + * @file lllAccountingQuotaManager.h + * @ + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_ACCOUNTINGQUOTAMANAGER_H +#define LL_ACCOUNTINGQUOTAMANAGER_H +//=============================================================================== +#include "llaccountingquota.h" +//=============================================================================== +class LLAccountingQuotaManager : public LLSingleton<LLAccountingQuotaManager> +{ +public: + //Ctor + LLAccountingQuotaManager(); + //Store an object that will be eventually fetched + void updateObjectCost( const LLUUID& objectID ); + //Request quotas for object list + void fetchQuotas( const std::string& url ); + //Delete a specific object from the pending list + void removePendingObjectQuota( const LLUUID& objectID ); + +private: + //Set of objects that need to update their cost + std::set<LLUUID> mUpdateObjectQuota; + //During fetchQuota we move object into a the pending set to signify that + //a fetch has been instigated. + std::set<LLUUID> mPendingObjectQuota; + typedef std::set<LLUUID>::iterator IDIt; +}; +//=============================================================================== + +#endif
\ No newline at end of file diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index f4023502f6..08d71fc8fc 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -25,10 +25,12 @@ */ #include "llviewerprecompiledheaders.h" + #include "llagent.h" #include "pipeline.h" +#include "llagentaccess.h" #include "llagentcamera.h" #include "llagentlistener.h" #include "llagentwearables.h" @@ -36,6 +38,7 @@ #include "llanimationstates.h" #include "llbottomtray.h" #include "llcallingcard.h" +#include "llcapabilitylistener.h" #include "llchannelmanager.h" #include "llconsole.h" #include "llfirstuse.h" @@ -55,13 +58,16 @@ #include "llpaneltopinfobar.h" #include "llparcel.h" #include "llrendersphere.h" +#include "llsdmessage.h" #include "llsdutil.h" #include "llsky.h" +#include "llslurl.h" #include "llsmoothstep.h" #include "llstartup.h" #include "llstatusbar.h" #include "llteleportflags.h" #include "lltool.h" +#include "lltoolpie.h" #include "lltoolmgr.h" #include "lltrans.h" #include "llurlentry.h" @@ -73,6 +79,7 @@ #include "llviewerobjectlist.h" #include "llviewerparcelmgr.h" #include "llviewerstats.h" +#include "llviewerwindow.h" #include "llvoavatarself.h" #include "llwindow.h" #include "llworld.h" @@ -171,7 +178,8 @@ LLAgent::LLAgent() : mbRunning(false), mbTeleportKeepsLookAt(false), - mAgentAccess(gSavedSettings), + mAgentAccess(new LLAgentAccess(gSavedSettings)), + mTeleportSourceSLURL(new LLSLURL), mTeleportState( TELEPORT_NONE ), mRegionp(NULL), @@ -208,7 +216,7 @@ LLAgent::LLAgent() : mAutoPilotFinishedCallback(NULL), mAutoPilotCallbackData(NULL), - mEffectColor(LLColor4(0.f, 1.f, 1.f, 1.f)), + mEffectColor(new LLUIColor(LLColor4(0.f, 1.f, 1.f, 1.f))), mHaveHomePosition(FALSE), mHomeRegionHandle( 0 ), @@ -250,7 +258,7 @@ void LLAgent::init() setFlying( gSavedSettings.getBOOL("FlyingAtExit") ); - mEffectColor = LLUIColorTable::instance().getColor("EffectColor"); + *mEffectColor = LLUIColorTable::instance().getColor("EffectColor"); gSavedSettings.getControl("PreferredMaturity")->getValidateSignal()->connect(boost::bind(&LLAgent::validateMaturity, this, _2)); gSavedSettings.getControl("PreferredMaturity")->getSignal()->connect(boost::bind(&LLAgent::handleMaturity, this, _2)); @@ -274,9 +282,16 @@ LLAgent::~LLAgent() cleanup(); delete mMouselookModeInSignal; + mMouselookModeInSignal = NULL; delete mMouselookModeOutSignal; + mMouselookModeOutSignal = NULL; - // *Note: this is where LLViewerCamera::getInstance() used to be deleted. + delete mAgentAccess; + mAgentAccess = NULL; + delete mEffectColor; + mEffectColor = NULL; + delete mTeleportSourceSLURL; + mTeleportSourceSLURL = NULL; } // Handle any actions that need to be performed when the main app gains focus @@ -559,6 +574,8 @@ void LLAgent::setFlying(BOOL fly) // static void LLAgent::toggleFlying() { + LLToolPie::instance().stopClickToWalk(); + BOOL fly = !gAgent.getFlying(); gAgent.mMoveTimer.reset(); @@ -2145,32 +2162,32 @@ void LLAgent::onAnimStop(const LLUUID& id) bool LLAgent::isGodlike() const { - return mAgentAccess.isGodlike(); + return mAgentAccess->isGodlike(); } bool LLAgent::isGodlikeWithoutAdminMenuFakery() const { - return mAgentAccess.isGodlikeWithoutAdminMenuFakery(); + return mAgentAccess->isGodlikeWithoutAdminMenuFakery(); } U8 LLAgent::getGodLevel() const { - return mAgentAccess.getGodLevel(); + return mAgentAccess->getGodLevel(); } bool LLAgent::wantsPGOnly() const { - return mAgentAccess.wantsPGOnly(); + return mAgentAccess->wantsPGOnly(); } bool LLAgent::canAccessMature() const { - return mAgentAccess.canAccessMature(); + return mAgentAccess->canAccessMature(); } bool LLAgent::canAccessAdult() const { - return mAgentAccess.canAccessAdult(); + return mAgentAccess->canAccessAdult(); } bool LLAgent::canAccessMaturityInRegion( U64 region_handle ) const @@ -2205,37 +2222,37 @@ bool LLAgent::canAccessMaturityAtGlobal( LLVector3d pos_global ) const bool LLAgent::prefersPG() const { - return mAgentAccess.prefersPG(); + return mAgentAccess->prefersPG(); } bool LLAgent::prefersMature() const { - return mAgentAccess.prefersMature(); + return mAgentAccess->prefersMature(); } bool LLAgent::prefersAdult() const { - return mAgentAccess.prefersAdult(); + return mAgentAccess->prefersAdult(); } bool LLAgent::isTeen() const { - return mAgentAccess.isTeen(); + return mAgentAccess->isTeen(); } bool LLAgent::isMature() const { - return mAgentAccess.isMature(); + return mAgentAccess->isMature(); } bool LLAgent::isAdult() const { - return mAgentAccess.isAdult(); + return mAgentAccess->isAdult(); } void LLAgent::setTeen(bool teen) { - mAgentAccess.setTeen(teen); + mAgentAccess->setTeen(teen); } //static @@ -2280,37 +2297,37 @@ bool LLAgent::sendMaturityPreferenceToServer(int preferredMaturity) BOOL LLAgent::getAdminOverride() const { - return mAgentAccess.getAdminOverride(); + return mAgentAccess->getAdminOverride(); } void LLAgent::setMaturity(char text) { - mAgentAccess.setMaturity(text); + mAgentAccess->setMaturity(text); } void LLAgent::setAdminOverride(BOOL b) { - mAgentAccess.setAdminOverride(b); + mAgentAccess->setAdminOverride(b); } void LLAgent::setGodLevel(U8 god_level) { - mAgentAccess.setGodLevel(god_level); + mAgentAccess->setGodLevel(god_level); } void LLAgent::setAOTransition() { - mAgentAccess.setTransition(); + mAgentAccess->setTransition(); } const LLAgentAccess& LLAgent::getAgentAccess() { - return mAgentAccess; + return *mAgentAccess; } bool LLAgent::validateMaturity(const LLSD& newvalue) { - return mAgentAccess.canSetMaturity(newvalue.asInteger()); + return mAgentAccess->canSetMaturity(newvalue.asInteger()); } void LLAgent::handleMaturity(const LLSD& newvalue) @@ -2642,12 +2659,12 @@ BOOL LLAgent::allowOperation(PermissionBit op, const LLColor4 &LLAgent::getEffectColor() { - return mEffectColor; + return *mEffectColor; } void LLAgent::setEffectColor(const LLColor4 &color) { - mEffectColor = color; + *mEffectColor = color; } void LLAgent::initOriginGlobal(const LLVector3d &origin_global) @@ -3475,7 +3492,7 @@ void LLAgent::setTeleportState(ETeleportState state) case TELEPORT_MOVING: // We're outa here. Save "back" slurl. - LLAgentUI::buildSLURL(mTeleportSourceSLURL); + LLAgentUI::buildSLURL(*mTeleportSourceSLURL); break; case TELEPORT_ARRIVING: @@ -3808,6 +3825,11 @@ void LLAgent::parseTeleportMessages(const std::string& xml_filename) }//end for (all message sets in xml file) } +const void LLAgent::getTeleportSourceSLURL(LLSLURL& slurl) const +{ + slurl = *mTeleportSourceSLURL; +} + void LLAgent::sendAgentUpdateUserInfo(bool im_via_email, const std::string& directory_visibility ) { gMessageSystem->newMessageFast(_PREHASH_UpdateUserInfo); diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 896408c0dd..54c5649f97 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -29,15 +29,11 @@ #include "indra_constants.h" #include "llevent.h" // LLObservable base class -#include "llagentaccess.h" #include "llagentconstants.h" #include "llagentdata.h" // gAgentID, gAgentSessionID -#include "llcharacter.h" // LLAnimPauseRequest +#include "llcharacter.h" #include "llcoordframe.h" // for mFrameAgent -#include "llpointer.h" -#include "lluicolor.h" #include "llvoavatardefines.h" -#include "llslurl.h" #include <boost/signals2.hpp> @@ -56,6 +52,10 @@ class LLFriendObserver; class LLPickInfo; class LLViewerObject; class LLAgentDropGroupViewerNode; +class LLAgentAccess; +class LLSLURL; +class LLPauseRequestHandle; +class LLUIColor; //-------------------------------------------------------------------- // Types @@ -80,6 +80,8 @@ struct LLGroupData class LLAgentListener; +class LLAgentImpl; + //------------------------------------------------------------------------ // LLAgent //------------------------------------------------------------------------ @@ -420,7 +422,7 @@ private: camera_signal_t* mMouselookModeInSignal; camera_signal_t* mMouselookModeOutSignal; BOOL mCustomAnim; // Current animation is ANIM_AGENT_CUSTOMIZE ? - LLAnimPauseRequest mPauseRequest; + LLPointer<LLPauseRequestHandle> mPauseRequest; BOOL mViewsPushed; // Keep track of whether or not we have pushed views /** Animation @@ -515,13 +517,13 @@ public: public: static void parseTeleportMessages(const std::string& xml_filename); - const void getTeleportSourceSLURL(LLSLURL& slurl) const { slurl = mTeleportSourceSLURL; } + const void getTeleportSourceSLURL(LLSLURL& slurl) const; public: // ! TODO ! Define ERROR and PROGRESS enums here instead of exposing the mappings. static std::map<std::string, std::string> sTeleportErrorMessages; static std::map<std::string, std::string> sTeleportProgressMessages; private: - LLSLURL mTeleportSourceSLURL; // SLURL where last TP began + LLSLURL * mTeleportSourceSLURL; // SLURL where last TP began //-------------------------------------------------------------------- // Teleport Actions @@ -580,7 +582,7 @@ public: // ! BACKWARDS COMPATIBILITY ! This function can go away after the AO transition (see llstartup.cpp). void setAOTransition(); private: - LLAgentAccess mAgentAccess; + LLAgentAccess * mAgentAccess; //-------------------------------------------------------------------- // God @@ -660,7 +662,7 @@ public: const LLColor4 &getEffectColor(); void setEffectColor(const LLColor4 &color); private: - LLUIColor mEffectColor; + LLUIColor * mEffectColor; /** Rendering ** ** diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index c6b5a0113f..80085dad9d 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -394,7 +394,9 @@ LLVector3 LLAgentCamera::calcFocusOffset(LLViewerObject *object, LLVector3 origi LLQuaternion inv_obj_rot = ~obj_rot; // get inverse of rotation LLVector3 object_extents; const LLVector4a* oe4 = object->mDrawable->getSpatialExtents(); - object_extents.set( oe4[1][0], oe4[1][1], oe4[1][2] ); + LLVector4a size; + size.setSub(oe4[1], oe4[0]); + object_extents.set( size[0], size[1], size[2] ); // make sure they object extents are non-zero object_extents.clamp(0.001f, F32_MAX); diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp index ed24febf41..9cea33c7c6 100644 --- a/indra/newview/llagentlistener.cpp +++ b/indra/newview/llagentlistener.cpp @@ -64,6 +64,12 @@ LLAgentListener::LLAgentListener(LLAgent &agent) "[\"quat\"]: array of [x, y, z, w] quaternion values", &LLAgentListener::getAxes, LLSDMap("reply", LLSD())); + add("getGroups", + "Send on [\"reply\"], in [\"groups\"], an array describing agent's groups:\n" + "[\"id\"]: UUID of group\n" + "[\"name\"]: name of group", + &LLAgentListener::getGroups, + LLSDMap("reply", LLSD())); } void LLAgentListener::requestTeleport(LLSD const & event_data) const @@ -140,3 +146,21 @@ void LLAgentListener::getAxes(const LLSD& event) const ("euler", LLSDMap("roll", roll)("pitch", pitch)("yaw", yaw)), event); } + +void LLAgentListener::getGroups(const LLSD& event) const +{ + LLSD reply(LLSD::emptyArray()); + for (LLDynamicArray<LLGroupData>::const_iterator + gi(mAgent.mGroups.begin()), gend(mAgent.mGroups.end()); + gi != gend; ++gi) + { + reply.append(LLSDMap + ("id", gi->mID) + ("name", gi->mName) + ("insignia", gi->mInsigniaID) + ("notices", bool(gi->mAcceptNotices)) + ("display", bool(gi->mListInProfile)) + ("contrib", gi->mContribution)); + } + sendReply(LLSDMap("groups", reply), event); +} diff --git a/indra/newview/llagentlistener.h b/indra/newview/llagentlistener.h index 0aa58d0b16..5a89a99f6a 100644 --- a/indra/newview/llagentlistener.h +++ b/indra/newview/llagentlistener.h @@ -46,6 +46,7 @@ private: void requestStand(LLSD const & event_data) const; void resetAxes(const LLSD& event) const; void getAxes(const LLSD& event) const; + void getGroups(const LLSD& event) const; private: LLAgent & mAgent; diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index e304729839..75b6c18c57 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -85,13 +85,14 @@ #include "lltextutil.h" #include "lllogininstance.h" #include "llprogressview.h" - +#include "llvocache.h" #include "llweb.h" #include "llsecondlifeurls.h" #include "llupdaterservice.h" // Linden library includes #include "llavatarnamecache.h" +#include "lldiriterator.h" #include "llimagej2c.h" #include "llmemory.h" #include "llprimitive.h" @@ -135,7 +136,6 @@ #include "lltoolmgr.h" #include "llassetstorage.h" #include "llpolymesh.h" -#include "llcachename.h" #include "llaudioengine.h" #include "llstreamingaudio.h" #include "llviewermenu.h" @@ -308,7 +308,7 @@ BOOL gLogoutInProgress = FALSE; //////////////////////////////////////////////////////////// // Internal globals... that should be removed. -static std::string gArgs = "Mesh Beta"; +static std::string gArgs; const std::string MARKER_FILE_NAME("SecondLife.exec_marker"); const std::string ERROR_MARKER_FILE_NAME("SecondLife.error_marker"); @@ -3479,7 +3479,9 @@ void LLAppViewer::migrateCacheDirectory() S32 file_count = 0; std::string file_name; std::string mask = delimiter + "*.*"; - while (gDirUtilp->getNextFileInDir(old_cache_dir, mask, file_name)) + + LLDirIterator iter(old_cache_dir, mask); + while (iter.next(file_name)) { if (file_name == "." || file_name == "..") continue; std::string source_path = old_cache_dir + delimiter + file_name; @@ -3700,7 +3702,8 @@ bool LLAppViewer::initCache() dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""); std::string found_file; - if (gDirUtilp->getNextFileInDir(dir, mask, found_file)) + LLDirIterator iter(dir, mask); + if (iter.next(found_file)) { old_vfs_data_file = dir + gDirUtilp->getDirDelimiter() + found_file; diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index 523c2e3adf..714e0e6163 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -30,6 +30,7 @@ #include "llcommandlineparser.h" +#include "lldiriterator.h" #include "llmemtype.h" #include "llurldispatcher.h" // SLURL from other app instance #include "llviewernetwork.h" @@ -504,7 +505,9 @@ std::string LLAppViewerLinux::generateSerialNumber() // trawl /dev/disk/by-uuid looking for a good-looking UUID to grab std::string this_name; - while (gDirUtilp->getNextFileInDir(uuiddir, "*", this_name)) + + LLDirIterator iter(uuiddir, "*"); + while (iter.next(this_name)) { if (this_name.length() > best.length() || (this_name.length() == best.length() && diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 54689ea808..6396ca91ff 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -26,12 +26,6 @@ #include "llviewerprecompiledheaders.h" -#if defined(_DEBUG) -# if _MSC_VER >= 1400 // Visual C++ 2005 or later -# define WINDOWS_CRT_MEM_CHECKS 1 -# endif -#endif - #include "llappviewerwin32.h" #include "llmemtype.h" diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index b6482e0ec4..f51552aae5 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -218,7 +218,7 @@ LLBottomTray::LLBottomTray(const LLSD&) mLandingTab(NULL), mCheckForDrag(false) { - // Firstly add ourself to IMSession observers, so we catch session events + // Firstly add our self to IMSession observers, so we catch session events // before chiclets do that. LLIMMgr::getInstance()->addSessionObserver(this); @@ -378,12 +378,13 @@ void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, b } // We have to enable/disable right and left parts of speak button separately (EXT-4648) - mSpeakBtn->setSpeakBtnEnabled(enable); + getChild<LLButton>("speak_btn")->setEnabled(enable); + // skipped to avoid button blinking if (status != STATUS_JOINING && status!= STATUS_LEFT_CHANNEL) { bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); - mSpeakBtn->setFlyoutBtnEnabled(voice_status); + getChild<LLButton>("speak_flyout_btn")->setEnabled(voice_status); if (voice_status) { LLFirstUse::speak(true); @@ -546,17 +547,27 @@ BOOL LLBottomTray::postBuild() setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4)); mSpeakPanel = getChild<LLPanel>("speak_panel"); - mSpeakBtn = getChild<LLSpeakButton>("talk"); - LLHints::registerHintTarget("speak_btn", mSpeakBtn->getHandle()); + mSpeakBtn = findChild<LLSpeakButton>("talk"); + if (mSpeakBtn) + { + LLHints::registerHintTarget("speak_btn", mSpeakBtn->getHandle()); + + // Localization tool doesn't understand custom buttons like <talk_button> + mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") ); + mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") ); + } + else + { + LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("speak_btn")); + LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("flyout_btn")); + } + // Both parts of speak button should be initially disabled because // it takes some time between logging in to world and connecting to voice channel. - mSpeakBtn->setSpeakBtnEnabled(false); - mSpeakBtn->setFlyoutBtnEnabled(false); + getChild<LLButton>("speak_btn")->setEnabled(false); + getChild<LLButton>("speak_flyout_btn")->setEnabled(false); - // Localization tool doesn't understand custom buttons like <talk_button> - mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") ); - mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") ); // Registering Chat Bar to receive Voice client status change notifications. LLVoiceClient::getInstance()->addObserver(this); @@ -740,6 +751,8 @@ void LLBottomTray::updateButtonsOrdersAfterDnD() void LLBottomTray::saveButtonsOrder() { + if (!gSavedSettings.getBOOL("AllowBottomTrayButtonReordering")) return; + std::string user_dir = gDirUtilp->getLindenUserDir(); if (user_dir.empty()) return; @@ -760,6 +773,8 @@ void LLBottomTray::saveButtonsOrder() void LLBottomTray::loadButtonsOrder() { + if (!gSavedSettings.getBOOL("AllowBottomTrayButtonReordering")) return; + // load per-resident sorting information std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME); @@ -852,6 +867,10 @@ void LLBottomTray::draw() getChild<LLButton>("show_help_btn")->setToggleState(help_floater_visible); + bool openmic = LLVoiceClient::getInstance()->getUserPTTState(); + bool voiceenabled = LLVoiceClient::getInstance()->voiceEnabled(); + getChild<LLButton>("speak_btn")->setToggleState(openmic && voiceenabled); + getChild<LLOutputMonitorCtrl>("chat_zone_indicator")->setIsMuted(!voiceenabled); } @@ -1309,7 +1328,11 @@ void LLBottomTray::processShrinkButtons(S32& required_width, S32& buttons_freed_ if (possible_shrink_width > 0) { - mSpeakBtn->setLabelVisible(false); + if (mSpeakBtn) + { + mSpeakBtn->setLabelVisible(false); + } + mSpeakPanel->reshape(panel_width - possible_shrink_width, mSpeakPanel->getRect().getHeight()); required_width += possible_shrink_width; @@ -1435,7 +1458,7 @@ bool LLBottomTray::processExtendSpeakButton(S32& available_width) } // Reshape the Speak button to its maximum width. - mSpeakBtn->setLabelVisible(true); + if (mSpeakBtn) mSpeakBtn->setLabelVisible(true); mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight()); available_width -= required_headroom; @@ -1510,21 +1533,35 @@ void LLBottomTray::initResizeStateContainers() mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, getChild<LLPanel>("gesture_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, getChild<LLPanel>("movement_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, getChild<LLPanel>("cam_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_DESTINATIONS, getChild<LLPanel>("destinations_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_AVATARS, getChild<LLPanel>("avatar_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, getChild<LLPanel>("snapshot_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_BUILD, getChild<LLPanel>("build_btn_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SEARCH, getChild<LLPanel>("search_btn_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_WORLD_MAP, getChild<LLPanel>("world_map_btn_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MINI_MAP, getChild<LLPanel>("mini_map_btn_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPLITTER_1, getChild<LLPanel>("splitter_panel_1"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_PEOPLE, getChild<LLPanel>("people_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_PROFILE, getChild<LLPanel>("profile_panel"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPLITTER_2, getChild<LLPanel>("splitter_panel_2"))); + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_HOWTO, getChild<LLPanel>("howto_panel"))); // init an order of processed buttons - mButtonsProcessOrder.push_back(RS_BUTTON_GESTURES); - mButtonsProcessOrder.push_back(RS_BUTTON_MOVEMENT); - mButtonsProcessOrder.push_back(RS_BUTTON_CAMERA); + mButtonsProcessOrder.push_back(RS_BUTTON_DESTINATIONS); + mButtonsProcessOrder.push_back(RS_BUTTON_AVATARS); mButtonsProcessOrder.push_back(RS_BUTTON_SNAPSHOT); mButtonsProcessOrder.push_back(RS_BUTTON_BUILD); mButtonsProcessOrder.push_back(RS_BUTTON_SEARCH); mButtonsProcessOrder.push_back(RS_BUTTON_WORLD_MAP); mButtonsProcessOrder.push_back(RS_BUTTON_MINI_MAP); + mButtonsProcessOrder.push_back(RS_BUTTON_SPLITTER_1); + mButtonsProcessOrder.push_back(RS_BUTTON_PEOPLE); + mButtonsProcessOrder.push_back(RS_BUTTON_PROFILE); + mButtonsProcessOrder.push_back(RS_BUTTON_SPLITTER_2); + mButtonsProcessOrder.push_back(RS_BUTTON_HOWTO); + mButtonsProcessOrder.push_back(RS_BUTTON_MOVEMENT); + mButtonsProcessOrder.push_back(RS_BUTTON_CAMERA); + mButtonsProcessOrder.push_back(RS_BUTTON_GESTURES); mButtonsOrder.push_back(RS_BUTTON_SPEAK); mButtonsOrder.insert(mButtonsOrder.end(), mButtonsProcessOrder.begin(), mButtonsProcessOrder.end()); @@ -1554,7 +1591,7 @@ void LLBottomTray::initResizeStateContainers() // because it resets chatbar's width according to resize logic. void LLBottomTray::initButtonsVisibility() { - setVisibleAndFitWidths(RS_BUTTON_SPEAK, gSavedSettings.getBOOL("EnableVoiceChat")); + setVisibleAndFitWidths(RS_BUTTON_SPEAK, gSavedSettings.getBOOL("EnableVoiceChat") || !mSpeakBtn ); setVisibleAndFitWidths(RS_BUTTON_GESTURES, gSavedSettings.getBOOL("ShowGestureButton")); setVisibleAndFitWidths(RS_BUTTON_MOVEMENT, gSavedSettings.getBOOL("ShowMoveButton")); setVisibleAndFitWidths(RS_BUTTON_CAMERA, gSavedSettings.getBOOL("ShowCameraButton")); @@ -1568,7 +1605,12 @@ void LLBottomTray::initButtonsVisibility() void LLBottomTray::setButtonsControlsAndListeners() { - gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SPEAK, _2)); + // always show the speak panel if using the basic skin + if (mSpeakBtn) + { + gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SPEAK, _2)); + } + gSavedSettings.getControl("ShowGestureButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_GESTURES, _2)); gSavedSettings.getControl("ShowMoveButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MOVEMENT, _2)); gSavedSettings.getControl("ShowCameraButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_CAMERA, _2)); @@ -1857,26 +1899,36 @@ S32 LLBottomTray::getChicletPanelShrinkHeadroom() const // static std::string LLBottomTray::resizeStateToString(EResizeState state) { + const char *rs_string = "UNKNOWN_BUTTON"; + switch (state) { - case RS_NORESIZE: return "RS_NORESIZE"; - case RS_CHICLET_PANEL: return "RS_CHICLET_PANEL"; - case RS_CHATBAR_INPUT: return "RS_CHATBAR_INPUT"; - case RS_BUTTON_SNAPSHOT: return "RS_BUTTON_SNAPSHOT"; - case RS_BUTTON_CAMERA: return "RS_BUTTON_CAMERA"; - case RS_BUTTON_MOVEMENT: return "RS_BUTTON_MOVEMENT"; - case RS_BUTTON_GESTURES: return "RS_BUTTON_GESTURES"; - case RS_BUTTON_SPEAK: return "RS_BUTTON_SPEAK"; - case RS_IM_WELL: return "RS_IM_WELL"; - case RS_NOTIFICATION_WELL: return "RS_NOTIFICATION_WELL"; - case RS_BUTTON_BUILD: return "RS_BUTTON_BUILD"; - case RS_BUTTON_SEARCH: return "RS_BUTTON_SEARCH"; - case RS_BUTTON_WORLD_MAP: return "RS_BUTTON_WORLD_MAP"; - case RS_BUTTON_MINI_MAP: return "RS_BUTTON_MINI_MAP"; - case RS_BUTTONS_CAN_BE_HIDDEN: return "RS_BUTTONS_CAN_BE_HIDDEN"; - // No default to track additions. - } - return "UNKNOWN_BUTTON"; + case RS_NORESIZE: rs_string = "RS_NORESIZE"; break; + case RS_CHICLET_PANEL: rs_string = "RS_CHICLET_PANEL"; break; + case RS_CHATBAR_INPUT: rs_string = "RS_CHATBAR_INPUT"; break; + case RS_BUTTON_SNAPSHOT: rs_string = "RS_BUTTON_SNAPSHOT"; break; + case RS_BUTTON_CAMERA: rs_string = "RS_BUTTON_CAMERA"; break; + case RS_BUTTON_MOVEMENT: rs_string = "RS_BUTTON_MOVEMENT"; break; + case RS_BUTTON_GESTURES: rs_string = "RS_BUTTON_GESTURES"; break; + case RS_BUTTON_SPEAK: rs_string = "RS_BUTTON_SPEAK"; break; + case RS_IM_WELL: rs_string = "RS_IM_WELL"; break; + case RS_NOTIFICATION_WELL: rs_string = "RS_NOTIFICATION_WELL"; break; + case RS_BUTTON_BUILD: rs_string = "RS_BUTTON_BUILD"; break; + case RS_BUTTON_SEARCH: rs_string = "RS_BUTTON_SEARCH"; break; + case RS_BUTTON_WORLD_MAP: rs_string = "RS_BUTTON_WORLD_MAP"; break; + case RS_BUTTON_MINI_MAP: rs_string = "RS_BUTTON_MINI_MAP"; break; + case RS_BUTTON_DESTINATIONS: rs_string = "RS_BUTTON_DESTINATIONS"; break; + case RS_BUTTON_AVATARS: rs_string = "RS_BUTTON_AVATARS"; break; + case RS_BUTTON_PEOPLE: rs_string = "RS_BUTTON_PEOPLE"; break; + case RS_BUTTON_PROFILE: rs_string = "RS_BUTTON_PROFILE"; break; + case RS_BUTTON_HOWTO: rs_string = "RS_BUTTON_HOWTO"; break; + case RS_BUTTON_SPLITTER_1: rs_string = "RS_BUTTON_SPLITTER_1"; break; + case RS_BUTTON_SPLITTER_2: rs_string = "RS_BUTTON_SPLITTER_2"; break; + case RS_BUTTONS_CAN_BE_HIDDEN: rs_string = "RS_BUTTONS_CAN_BE_HIDDEN"; break; + // No default to track additions. + } + + return rs_string; } // static diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index 52bcd2ddac..d9c95d82e5 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -140,22 +140,29 @@ public: private: - typedef enum e_resize_status_type + typedef enum e_resize_state { - RS_NORESIZE = 0x0000 - , RS_CHICLET_PANEL = 0x0001 - , RS_CHATBAR_INPUT = 0x0002 - , RS_BUTTON_SNAPSHOT = 0x0004 - , RS_BUTTON_CAMERA = 0x0008 - , RS_BUTTON_MOVEMENT = 0x0010 - , RS_BUTTON_GESTURES = 0x0020 - , RS_BUTTON_SPEAK = 0x0040 - , RS_IM_WELL = 0x0080 - , RS_NOTIFICATION_WELL = 0x0100 - , RS_BUTTON_BUILD = 0x0200 - , RS_BUTTON_SEARCH = 0x0400 - , RS_BUTTON_WORLD_MAP = 0x0800 - , RS_BUTTON_MINI_MAP = 0x1000 + RS_NORESIZE = 0x0000, + RS_CHICLET_PANEL = 0x0001, + RS_CHATBAR_INPUT = 0x0002, + RS_BUTTON_SNAPSHOT = 0x0004, + RS_BUTTON_CAMERA = 0x0008, + RS_BUTTON_MOVEMENT = 0x0010, + RS_BUTTON_GESTURES = 0x0020, + RS_BUTTON_SPEAK = 0x0040, + RS_IM_WELL = 0x0080, + RS_NOTIFICATION_WELL = 0x0100, + RS_BUTTON_BUILD = 0x0200, + RS_BUTTON_SEARCH = 0x0400, + RS_BUTTON_WORLD_MAP = 0x0800, + RS_BUTTON_MINI_MAP = 0x1000, + RS_BUTTON_DESTINATIONS = 0x2000, + RS_BUTTON_AVATARS = 0x4000, + RS_BUTTON_PEOPLE = 0x8000, + RS_BUTTON_PROFILE = 0x10000, + RS_BUTTON_HOWTO = 0x20000, + RS_BUTTON_SPLITTER_1 = 0x40000, + RS_BUTTON_SPLITTER_2 = 0x80000, /* Once new button that can be hidden on resize is added don't forget to update related places: @@ -166,10 +173,11 @@ private: /** * Specifies buttons which can be hidden when bottom tray is shrunk. * They are: Gestures, Movement (Move), Camera (View), Snapshot - * new: Build, Search, Map, World Map, Mini-Map. + * new: Build, Search, Map, World Map, Mini-Map, destinations, avatars */ - , RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES + RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES | RS_BUTTON_BUILD | RS_BUTTON_SEARCH | RS_BUTTON_WORLD_MAP | RS_BUTTON_MINI_MAP + | RS_BUTTON_DESTINATIONS | RS_BUTTON_AVATARS }EResizeState; // Below are three methods that were introduced to handle drag'n'drop diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 885d553524..3000209aad 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -483,8 +483,9 @@ void LLIMChiclet::setShowSpeaker(bool show) if(needs_resize) { mShowSpeaker = show; - toggleSpeakerControl(); } + + toggleSpeakerControl(); } void LLIMChiclet::enableCounterControl(bool enable) @@ -1183,6 +1184,10 @@ void LLChicletPanel::onCurrentVoiceChannelChanged(const LLUUID& session_id) if(chiclet) { chiclet->setShowSpeaker(true); + if (gSavedSettings.getBOOL("OpenIMOnVoice")) + { + LLIMFloater::show(chiclet->getSessionId()); + } } } diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 2cfd3b0a33..8b5a2ce781 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -107,10 +107,14 @@ S32 LLDrawPoolAlpha::getNumPostDeferredPasses() { //skip depth buffer filling pass when rendering impostors return 1; } - else + else if (gSavedSettings.getBOOL("RenderDepthOfField")) { return 2; } + else + { + return 1; + } } void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass) diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 3f5cb4778e..29b50761d8 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -889,6 +889,11 @@ void LLBumpImageList::destroyGL() void LLBumpImageList::restoreGL() { + if(!gTextureList.isInitialized())
+ {
+ return ;
+ } + LLStandardBumpmap::restoreGL(); // Images will be recreated as they are needed. } diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp index 6b45c5abb0..030d6e1110 100644 --- a/indra/newview/lldrawpoolsky.cpp +++ b/indra/newview/lldrawpoolsky.cpp @@ -63,6 +63,8 @@ void LLDrawPoolSky::prerender() void LLDrawPoolSky::render(S32 pass) { + gGL.flush(); + if (mDrawFace.empty()) { return; @@ -111,13 +113,14 @@ void LLDrawPoolSky::render(S32 pass) S32 face_count = (S32)mDrawFace.size(); + LLVertexBuffer::unbind(); + glColor4f(1,1,1,1); + for (S32 i = 0; i < llmin(6, face_count); ++i) { renderSkyCubeFace(i); } - LLGLEnable blend(GL_BLEND); - glPopMatrix(); } diff --git a/indra/newview/lleventnotifier.h b/indra/newview/lleventnotifier.h index 697a708762..3fee46c2f6 100644 --- a/indra/newview/lleventnotifier.h +++ b/indra/newview/lleventnotifier.h @@ -31,6 +31,7 @@ #include "v3dmath.h" class LLEventNotification; +class LLMessageSystem; class LLEventNotifier diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index 9f0b34becc..d1bff9f423 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -1,791 +1,807 @@ -/** - * @file llfeaturemanager.cpp - * @brief LLFeatureManager class implementation - * - * $LicenseInfo:firstyear=2003&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, 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$ - */ - -#include "llviewerprecompiledheaders.h" - -#include <iostream> -#include <fstream> - -#include <boost/regex.hpp> - -#include "llfeaturemanager.h" -#include "lldir.h" - -#include "llsys.h" -#include "llgl.h" -#include "llsecondlifeurls.h" - -#include "llappviewer.h" -#include "llhttpclient.h" -#include "llnotificationsutil.h" -#include "llviewercontrol.h" -#include "llworld.h" -#include "lldrawpoolterrain.h" -#include "llviewertexturelist.h" -#include "llversioninfo.h" -#include "llwindow.h" -#include "llui.h" -#include "llcontrol.h" -#include "llboost.h" -#include "llweb.h" - -#if LL_WINDOWS -#include "lldxhardware.h" -#endif - - -#if LL_DARWIN -const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt"; -const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_mac.%s.txt"; -#elif LL_LINUX -const char FEATURE_TABLE_FILENAME[] = "featuretable_linux.txt"; -const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_linux.%s.txt"; -#elif LL_SOLARIS -const char FEATURE_TABLE_FILENAME[] = "featuretable_solaris.txt"; -const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_solaris.%s.txt"; -#else -const char FEATURE_TABLE_FILENAME[] = "featuretable%s.txt"; -const char FEATURE_TABLE_VER_FILENAME[] = "featuretable%s.%s.txt"; -#endif - -const char GPU_TABLE_FILENAME[] = "gpu_table.txt"; -const char GPU_TABLE_VER_FILENAME[] = "gpu_table.%s.txt"; - -LLFeatureInfo::LLFeatureInfo(const std::string& name, const BOOL available, const F32 level) - : mValid(TRUE), mName(name), mAvailable(available), mRecommendedLevel(level) -{ -} - -LLFeatureList::LLFeatureList(const std::string& name) - : mName(name) -{ -} - -LLFeatureList::~LLFeatureList() -{ -} - -void LLFeatureList::addFeature(const std::string& name, const BOOL available, const F32 level) -{ - if (mFeatures.count(name)) - { - LL_WARNS("RenderInit") << "LLFeatureList::Attempting to add preexisting feature " << name << LL_ENDL; - } - - LLFeatureInfo fi(name, available, level); - mFeatures[name] = fi; -} - -BOOL LLFeatureList::isFeatureAvailable(const std::string& name) -{ - if (mFeatures.count(name)) - { - return mFeatures[name].mAvailable; - } - - LL_WARNS("RenderInit") << "Feature " << name << " not on feature list!" << LL_ENDL; - - // changing this to TRUE so you have to explicitly disable - // something for it to be disabled - return TRUE; -} - -F32 LLFeatureList::getRecommendedValue(const std::string& name) -{ - if (mFeatures.count(name) && isFeatureAvailable(name)) - { - return mFeatures[name].mRecommendedLevel; - } - - LL_WARNS("RenderInit") << "Feature " << name << " not on feature list or not available!" << LL_ENDL; - return 0; -} - -BOOL LLFeatureList::maskList(LLFeatureList &mask) -{ - //llinfos << "Masking with " << mask.mName << llendl; - // - // Lookup the specified feature mask, and overlay it on top of the - // current feature mask. - // - - LLFeatureInfo mask_fi; - - feature_map_t::iterator feature_it; - for (feature_it = mask.mFeatures.begin(); feature_it != mask.mFeatures.end(); ++feature_it) - { - mask_fi = feature_it->second; - // - // Look for the corresponding feature - // - if (!mFeatures.count(mask_fi.mName)) - { - LL_WARNS("RenderInit") << "Feature " << mask_fi.mName << " in mask not in top level!" << LL_ENDL; - continue; - } - - LLFeatureInfo &cur_fi = mFeatures[mask_fi.mName]; - if (mask_fi.mAvailable && !cur_fi.mAvailable) - { - LL_WARNS("RenderInit") << "Mask attempting to reenabling disabled feature, ignoring " << cur_fi.mName << LL_ENDL; - continue; - } - cur_fi.mAvailable = mask_fi.mAvailable; - cur_fi.mRecommendedLevel = llmin(cur_fi.mRecommendedLevel, mask_fi.mRecommendedLevel); - LL_DEBUGS("RenderInit") << "Feature mask " << mask.mName - << " Feature " << mask_fi.mName - << " Mask: " << mask_fi.mRecommendedLevel - << " Now: " << cur_fi.mRecommendedLevel << LL_ENDL; - } - - LL_DEBUGS("RenderInit") << "After applying mask " << mask.mName << std::endl; - // Will conditionally call dump only if the above message will be logged, thanks - // to it being wrapped by the LL_DEBUGS and LL_ENDL macros. - dump(); - LL_CONT << LL_ENDL; - - return TRUE; -} - -void LLFeatureList::dump() -{ - LL_DEBUGS("RenderInit") << "Feature list: " << mName << LL_ENDL; - LL_DEBUGS("RenderInit") << "--------------" << LL_ENDL; - - LLFeatureInfo fi; - feature_map_t::iterator feature_it; - for (feature_it = mFeatures.begin(); feature_it != mFeatures.end(); ++feature_it) - { - fi = feature_it->second; - LL_DEBUGS("RenderInit") << fi.mName << "\t\t" << fi.mAvailable << ":" << fi.mRecommendedLevel << LL_ENDL; - } - LL_DEBUGS("RenderInit") << LL_ENDL; -} - -LLFeatureList *LLFeatureManager::findMask(const std::string& name) -{ - if (mMaskList.count(name)) - { - return mMaskList[name]; - } - - return NULL; -} - -BOOL LLFeatureManager::maskFeatures(const std::string& name) -{ - LLFeatureList *maskp = findMask(name); - if (!maskp) - { - LL_DEBUGS("RenderInit") << "Unknown feature mask " << name << LL_ENDL; - return FALSE; - } - LL_DEBUGS("RenderInit") << "Applying Feature Mask: " << name << LL_ENDL; - return maskList(*maskp); -} - -BOOL LLFeatureManager::loadFeatureTables() -{ - // *TODO - if I or anyone else adds something else to the skipped list - // make this data driven. Put it in the feature table and parse it - // correctly - mSkippedFeatures.insert("RenderAnisotropic"); - mSkippedFeatures.insert("RenderGamma"); - mSkippedFeatures.insert("RenderVBOEnable"); - mSkippedFeatures.insert("RenderFogRatio"); - - // first table is install with app - std::string app_path = gDirUtilp->getAppRODataDir(); - app_path += gDirUtilp->getDirDelimiter(); - - std::string filename; - std::string http_filename; -#if LL_WINDOWS - std::string os_string = LLAppViewer::instance()->getOSInfo().getOSStringSimple(); - if (os_string.find("Microsoft Windows XP") == 0) - { - filename = llformat(FEATURE_TABLE_FILENAME, "_xp"); - http_filename = llformat(FEATURE_TABLE_VER_FILENAME, "_xp", LLVersionInfo::getVersion().c_str()); - } - else - { - filename = llformat(FEATURE_TABLE_FILENAME, ""); - http_filename = llformat(FEATURE_TABLE_VER_FILENAME, "", LLVersionInfo::getVersion().c_str()); - } -#else - filename = FEATURE_TABLE_FILENAME; - http_filename = llformat(FEATURE_TABLE_VER_FILENAME, LLVersionInfo::getVersion().c_str()); -#endif - - app_path += filename; - - - // second table is downloaded with HTTP - std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename); - - // use HTTP table if it exists - std::string path; - if (gDirUtilp->fileExists(http_path)) - { - path = http_path; - } - else - { - path = app_path; - } - - - return parseFeatureTable(path); -} - - -BOOL LLFeatureManager::parseFeatureTable(std::string filename) -{ - llinfos << "Looking for feature table in " << filename << llendl; - - llifstream file; - std::string name; - U32 version; - - file.open(filename); /*Flawfinder: ignore*/ - - if (!file) - { - LL_WARNS("RenderInit") << "Unable to open feature table " << filename << LL_ENDL; - return FALSE; - } - - // Check file version - file >> name; - file >> version; - if (name != "version") - { - LL_WARNS("RenderInit") << filename << " does not appear to be a valid feature table!" << LL_ENDL; - return FALSE; - } - - mTableVersion = version; - - LLFeatureList *flp = NULL; - while (file >> name) - { - char buffer[MAX_STRING]; /*Flawfinder: ignore*/ - - if (name.substr(0,2) == "//") - { - // This is a comment. - file.getline(buffer, MAX_STRING); - continue; - } - - if (name == "list") - { - if (flp) - { - //flp->dump(); - } - // It's a new mask, create it. - file >> name; - if (mMaskList.count(name)) - { - LL_ERRS("RenderInit") << "Overriding mask " << name << ", this is invalid!" << LL_ENDL; - } - - flp = new LLFeatureList(name); - mMaskList[name] = flp; - } - else - { - if (!flp) - { - LL_ERRS("RenderInit") << "Specified parameter before <list> keyword!" << LL_ENDL; - return FALSE; - } - S32 available; - F32 recommended; - file >> available >> recommended; - flp->addFeature(name, available, recommended); - } - } - file.close(); - - return TRUE; -} - -void LLFeatureManager::loadGPUClass() -{ - // defaults - mGPUClass = GPU_CLASS_UNKNOWN; - mGPUString = gGLManager.getRawGLString(); - mGPUSupported = FALSE; - - // first table is in the app dir - std::string app_path = gDirUtilp->getAppRODataDir(); - app_path += gDirUtilp->getDirDelimiter(); - app_path += GPU_TABLE_FILENAME; - - // second table is downloaded with HTTP - std::string http_filename = llformat(GPU_TABLE_VER_FILENAME, LLVersionInfo::getVersion().c_str()); - std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename); - - // use HTTP table if it exists - std::string path; - if (gDirUtilp->fileExists(http_path)) - { - path = http_path; - } - else - { - path = app_path; - } - - parseGPUTable(path); -} - - -void LLFeatureManager::parseGPUTable(std::string filename) -{ - llifstream file; - - file.open(filename); - - if (!file) - { - LL_WARNS("RenderInit") << "Unable to open GPU table: " << filename << "!" << LL_ENDL; - return; - } - - std::string renderer = gGLManager.getRawGLString(); - for (std::string::iterator i = renderer.begin(); i != renderer.end(); ++i) - { - *i = tolower(*i); - } - - while (!file.eof()) - { - char buffer[MAX_STRING]; /*Flawfinder: ignore*/ - buffer[0] = 0; - - file.getline(buffer, MAX_STRING); - - if (strlen(buffer) >= 2 && /*Flawfinder: ignore*/ - buffer[0] == '/' && - buffer[1] == '/') - { - // This is a comment. - continue; - } - - if (strlen(buffer) == 0) /*Flawfinder: ignore*/ - { - // This is a blank line - continue; - } - - // setup the tokenizer - std::string buf(buffer); - std::string cls, label, expr, supported; - boost_tokenizer tokens(buf, boost::char_separator<char>("\t\n")); - boost_tokenizer::iterator token_iter = tokens.begin(); - - // grab the label, pseudo regular expression, and class - if(token_iter != tokens.end()) - { - label = *token_iter++; - } - if(token_iter != tokens.end()) - { - expr = *token_iter++; - } - if(token_iter != tokens.end()) - { - cls = *token_iter++; - } - if(token_iter != tokens.end()) - { - supported = *token_iter++; - } - - if (label.empty() || expr.empty() || cls.empty() || supported.empty()) - { - continue; - } - - for (U32 i = 0; i < expr.length(); i++) /*Flawfinder: ignore*/ - { - expr[i] = tolower(expr[i]); - } - - // run the regular expression against the renderer - boost::regex re(expr.c_str()); - if(boost::regex_search(renderer, re)) - { - // if we found it, stop! - file.close(); - LL_INFOS("RenderInit") << "GPU is " << label << llendl; - mGPUString = label; - mGPUClass = (EGPUClass) strtol(cls.c_str(), NULL, 10); - mGPUSupported = (BOOL) strtol(supported.c_str(), NULL, 10); - file.close(); - return; - } - } - file.close(); - - LL_WARNS("RenderInit") << "Couldn't match GPU to a class: " << gGLManager.getRawGLString() << LL_ENDL; -} - -// responder saves table into file -class LLHTTPFeatureTableResponder : public LLHTTPClient::Responder -{ -public: - - LLHTTPFeatureTableResponder(std::string filename) : - mFilename(filename) - { - } - - - virtual void completedRaw(U32 status, const std::string& reason, - const LLChannelDescriptors& channels, - const LLIOPipe::buffer_ptr_t& buffer) - { - if (isGoodStatus(status)) - { - // write to file - - llinfos << "writing feature table to " << mFilename << llendl; - - S32 file_size = buffer->countAfter(channels.in(), NULL); - if (file_size > 0) - { - // read from buffer - U8* copy_buffer = new U8[file_size]; - buffer->readAfter(channels.in(), NULL, copy_buffer, file_size); - - // write to file - LLAPRFile out(mFilename, LL_APR_WB); - out.write(copy_buffer, file_size); - out.close(); - } - } - - } - -private: - std::string mFilename; -}; - -void fetch_feature_table(std::string table) -{ - const std::string base = gSavedSettings.getString("FeatureManagerHTTPTable"); - -#if LL_WINDOWS - std::string os_string = LLAppViewer::instance()->getOSInfo().getOSStringSimple(); - std::string filename; - if (os_string.find("Microsoft Windows XP") == 0) - { - filename = llformat(table.c_str(), "_xp", LLVersionInfo::getVersion().c_str()); - } - else - { - filename = llformat(table.c_str(), "", LLVersionInfo::getVersion().c_str()); - } -#else - const std::string filename = llformat(table.c_str(), LLVersionInfo::getVersion().c_str()); -#endif - - const std::string url = base + "/" + filename; - - const std::string path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename); - - llinfos << "LLFeatureManager fetching " << url << " into " << path << llendl; - - LLHTTPClient::get(url, new LLHTTPFeatureTableResponder(path)); -} - -void fetch_gpu_table(std::string table) -{ - const std::string base = gSavedSettings.getString("FeatureManagerHTTPTable"); - - const std::string filename = llformat(table.c_str(), LLVersionInfo::getVersion().c_str()); - - const std::string url = base + "/" + filename; - - const std::string path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename); - - llinfos << "LLFeatureManager fetching " << url << " into " << path << llendl; - - LLHTTPClient::get(url, new LLHTTPFeatureTableResponder(path)); -} - -// fetch table(s) from a website (S3) -void LLFeatureManager::fetchHTTPTables() -{ - fetch_feature_table(FEATURE_TABLE_VER_FILENAME); - fetch_gpu_table(GPU_TABLE_VER_FILENAME); -} - - -void LLFeatureManager::cleanupFeatureTables() -{ - std::for_each(mMaskList.begin(), mMaskList.end(), DeletePairedPointer()); - mMaskList.clear(); -} - -void LLFeatureManager::init() -{ - // load the tables - loadFeatureTables(); - - // get the gpu class - loadGPUClass(); - - // apply the base masks, so we know if anything is disabled - applyBaseMasks(); -} - -void LLFeatureManager::applyRecommendedSettings() -{ - // apply saved settings - // cap the level at 2 (high) - S32 level = llmax(GPU_CLASS_0, llmin(mGPUClass, GPU_CLASS_2)); - - llinfos << "Applying Recommended Features" << llendl; - - setGraphicsLevel(level, false); - gSavedSettings.setU32("RenderQualityPerformance", level); - - // now apply the tweaks to draw distance - // these are double negatives, because feature masks only work by - // downgrading values, so i needed to make a true value go to false - // for certain cards, thus the awkward name, "Disregard..." - if(!gSavedSettings.getBOOL("Disregard96DefaultDrawDistance")) - { - gSavedSettings.setF32("RenderFarClip", 96.0f); - } - else if(!gSavedSettings.getBOOL("Disregard128DefaultDrawDistance")) - { - gSavedSettings.setF32("RenderFarClip", 128.0f); - } -} - -void LLFeatureManager::applyFeatures(bool skipFeatures) -{ - // see featuretable.txt / featuretable_linux.txt / featuretable_mac.txt - -#ifndef LL_RELEASE_FOR_DOWNLOAD - dump(); -#endif - - // scroll through all of these and set their corresponding control value - for(feature_map_t::iterator mIt = mFeatures.begin(); - mIt != mFeatures.end(); - ++mIt) - { - // skip features you want to skip - // do this for when you don't want to change certain settings - if(skipFeatures) - { - if(mSkippedFeatures.find(mIt->first) != mSkippedFeatures.end()) - { - continue; - } - } - - // get the control setting - LLControlVariable* ctrl = gSavedSettings.getControl(mIt->first); - if(ctrl == NULL) - { - llwarns << "AHHH! Control setting " << mIt->first << " does not exist!" << llendl; - continue; - } - - // handle all the different types - if(ctrl->isType(TYPE_BOOLEAN)) - { - gSavedSettings.setBOOL(mIt->first, (BOOL)getRecommendedValue(mIt->first)); - } - else if (ctrl->isType(TYPE_S32)) - { - gSavedSettings.setS32(mIt->first, (S32)getRecommendedValue(mIt->first)); - } - else if (ctrl->isType(TYPE_U32)) - { - gSavedSettings.setU32(mIt->first, (U32)getRecommendedValue(mIt->first)); - } - else if (ctrl->isType(TYPE_F32)) - { - gSavedSettings.setF32(mIt->first, (F32)getRecommendedValue(mIt->first)); - } - else - { - llwarns << "AHHH! Control variable is not a numeric type!" << llendl; - } - } -} - -void LLFeatureManager::setGraphicsLevel(S32 level, bool skipFeatures) -{ - applyBaseMasks(); - - switch (level) - { - case 0: - maskFeatures("Low"); - break; - case 1: - maskFeatures("Mid"); - break; - case 2: - maskFeatures("High"); - break; - case 3: - maskFeatures("Ultra"); - break; - default: - maskFeatures("Low"); - break; - } - - applyFeatures(skipFeatures); -} - -void LLFeatureManager::applyBaseMasks() -{ - // reapply masks - mFeatures.clear(); - - LLFeatureList* maskp = findMask("all"); - if(maskp == NULL) - { - LL_WARNS("RenderInit") << "AHH! No \"all\" in feature table!" << LL_ENDL; - return; - } - - mFeatures = maskp->getFeatures(); - - // mask class - if (mGPUClass >= 0 && mGPUClass < 4) - { - const char* class_table[] = - { - "Class0", - "Class1", - "Class2", - "Class3" - }; - - LL_INFOS("RenderInit") << "Setting GPU Class to " << class_table[mGPUClass] << LL_ENDL; - maskFeatures(class_table[mGPUClass]); - } - else - { - LL_INFOS("RenderInit") << "Setting GPU Class to Unknown" << LL_ENDL; - maskFeatures("Unknown"); - } - - // now all those wacky ones - if (!gGLManager.mHasFragmentShader) - { - maskFeatures("NoPixelShaders"); - } - if (!gGLManager.mHasVertexShader) - { - maskFeatures("NoVertexShaders"); - } - if (gGLManager.mIsNVIDIA) - { - maskFeatures("NVIDIA"); - } - if (gGLManager.mIsGF2or4MX) - { - maskFeatures("GeForce2"); - } - if (gGLManager.mIsATI) - { - maskFeatures("ATI"); - } - if (gGLManager.mHasATIMemInfo && gGLManager.mVRAM < 256) - { - maskFeatures("ATIVramLT256"); - } - if (gGLManager.mATIOldDriver) - { - maskFeatures("ATIOldDriver"); - } - if (gGLManager.mIsGFFX) - { - maskFeatures("GeForceFX"); - } - if (gGLManager.mIsIntel) - { - maskFeatures("Intel"); - } - if (gGLManager.mGLVersion < 1.5f) - { - maskFeatures("OpenGLPre15"); - } - if (gGLManager.mGLVersion < 3.f) - { - maskFeatures("OpenGLPre30"); - } - - // now mask by gpu string - // Replaces ' ' with '_' in mGPUString to deal with inability for parser to handle spaces - std::string gpustr = mGPUString; - for (std::string::iterator iter = gpustr.begin(); iter != gpustr.end(); ++iter) - { - if (*iter == ' ') - { - *iter = '_'; - } - } - - //llinfos << "Masking features from gpu table match: " << gpustr << llendl; - maskFeatures(gpustr); - - // now mask cpu type ones - if (gSysMemory.getPhysicalMemoryClamped() <= 256*1024*1024) - { - maskFeatures("RAM256MB"); - } - -#if LL_SOLARIS && defined(__sparc) // even low MHz SPARCs are fast -#error The 800 is hinky. Would something like a LL_MIN_MHZ make more sense here? - if (gSysCPU.getMHz() < 800) -#else - if (gSysCPU.getMHz() < 1100) -#endif - { - maskFeatures("CPUSlow"); - } - - if (isSafe()) - { - maskFeatures("safe"); - } -} +/**
+ * @file llfeaturemanager.cpp
+ * @brief LLFeatureManager class implementation
+ *
+ * $LicenseInfo:firstyear=2003&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, 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$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include <iostream>
+#include <fstream>
+
+#include <boost/regex.hpp>
+
+#include "llfeaturemanager.h"
+#include "lldir.h"
+
+#include "llsys.h"
+#include "llgl.h"
+#include "llsecondlifeurls.h"
+
+#include "llappviewer.h"
+#include "llhttpclient.h"
+#include "llnotificationsutil.h"
+#include "llviewercontrol.h"
+#include "llworld.h"
+#include "lldrawpoolterrain.h"
+#include "llviewertexturelist.h"
+#include "llversioninfo.h"
+#include "llwindow.h"
+#include "llui.h"
+#include "llcontrol.h"
+#include "llboost.h"
+#include "llweb.h"
+
+#if LL_WINDOWS
+#include "lldxhardware.h"
+#endif
+
+
+#if LL_DARWIN
+const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt";
+const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_mac.%s.txt";
+#elif LL_LINUX
+const char FEATURE_TABLE_FILENAME[] = "featuretable_linux.txt";
+const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_linux.%s.txt";
+#elif LL_SOLARIS
+const char FEATURE_TABLE_FILENAME[] = "featuretable_solaris.txt";
+const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_solaris.%s.txt";
+#else
+const char FEATURE_TABLE_FILENAME[] = "featuretable%s.txt";
+const char FEATURE_TABLE_VER_FILENAME[] = "featuretable%s.%s.txt";
+#endif
+
+const char GPU_TABLE_FILENAME[] = "gpu_table.txt";
+const char GPU_TABLE_VER_FILENAME[] = "gpu_table.%s.txt";
+
+LLFeatureInfo::LLFeatureInfo(const std::string& name, const BOOL available, const F32 level)
+ : mValid(TRUE), mName(name), mAvailable(available), mRecommendedLevel(level)
+{
+}
+
+LLFeatureList::LLFeatureList(const std::string& name)
+ : mName(name)
+{
+}
+
+LLFeatureList::~LLFeatureList()
+{
+}
+
+void LLFeatureList::addFeature(const std::string& name, const BOOL available, const F32 level)
+{
+ if (mFeatures.count(name))
+ {
+ LL_WARNS("RenderInit") << "LLFeatureList::Attempting to add preexisting feature " << name << LL_ENDL;
+ }
+
+ LLFeatureInfo fi(name, available, level);
+ mFeatures[name] = fi;
+}
+
+BOOL LLFeatureList::isFeatureAvailable(const std::string& name)
+{
+ if (mFeatures.count(name))
+ {
+ return mFeatures[name].mAvailable;
+ }
+
+ LL_WARNS("RenderInit") << "Feature " << name << " not on feature list!" << LL_ENDL;
+
+ // changing this to TRUE so you have to explicitly disable
+ // something for it to be disabled
+ return TRUE;
+}
+
+F32 LLFeatureList::getRecommendedValue(const std::string& name)
+{
+ if (mFeatures.count(name) && isFeatureAvailable(name))
+ {
+ return mFeatures[name].mRecommendedLevel;
+ }
+
+ LL_WARNS("RenderInit") << "Feature " << name << " not on feature list or not available!" << LL_ENDL;
+ return 0;
+}
+
+BOOL LLFeatureList::maskList(LLFeatureList &mask)
+{
+ //llinfos << "Masking with " << mask.mName << llendl;
+ //
+ // Lookup the specified feature mask, and overlay it on top of the
+ // current feature mask.
+ //
+
+ LLFeatureInfo mask_fi;
+
+ feature_map_t::iterator feature_it;
+ for (feature_it = mask.mFeatures.begin(); feature_it != mask.mFeatures.end(); ++feature_it)
+ {
+ mask_fi = feature_it->second;
+ //
+ // Look for the corresponding feature
+ //
+ if (!mFeatures.count(mask_fi.mName))
+ {
+ LL_WARNS("RenderInit") << "Feature " << mask_fi.mName << " in mask not in top level!" << LL_ENDL;
+ continue;
+ }
+
+ LLFeatureInfo &cur_fi = mFeatures[mask_fi.mName];
+ if (mask_fi.mAvailable && !cur_fi.mAvailable)
+ {
+ LL_WARNS("RenderInit") << "Mask attempting to reenabling disabled feature, ignoring " << cur_fi.mName << LL_ENDL;
+ continue;
+ }
+ cur_fi.mAvailable = mask_fi.mAvailable;
+ cur_fi.mRecommendedLevel = llmin(cur_fi.mRecommendedLevel, mask_fi.mRecommendedLevel);
+ LL_DEBUGS("RenderInit") << "Feature mask " << mask.mName
+ << " Feature " << mask_fi.mName
+ << " Mask: " << mask_fi.mRecommendedLevel
+ << " Now: " << cur_fi.mRecommendedLevel << LL_ENDL;
+ }
+
+ LL_DEBUGS("RenderInit") << "After applying mask " << mask.mName << std::endl;
+ // Will conditionally call dump only if the above message will be logged, thanks
+ // to it being wrapped by the LL_DEBUGS and LL_ENDL macros.
+ dump();
+ LL_CONT << LL_ENDL;
+
+ return TRUE;
+}
+
+void LLFeatureList::dump()
+{
+ LL_DEBUGS("RenderInit") << "Feature list: " << mName << LL_ENDL;
+ LL_DEBUGS("RenderInit") << "--------------" << LL_ENDL;
+
+ LLFeatureInfo fi;
+ feature_map_t::iterator feature_it;
+ for (feature_it = mFeatures.begin(); feature_it != mFeatures.end(); ++feature_it)
+ {
+ fi = feature_it->second;
+ LL_DEBUGS("RenderInit") << fi.mName << "\t\t" << fi.mAvailable << ":" << fi.mRecommendedLevel << LL_ENDL;
+ }
+ LL_DEBUGS("RenderInit") << LL_ENDL;
+}
+
+LLFeatureList *LLFeatureManager::findMask(const std::string& name)
+{
+ if (mMaskList.count(name))
+ {
+ return mMaskList[name];
+ }
+
+ return NULL;
+}
+
+BOOL LLFeatureManager::maskFeatures(const std::string& name)
+{
+ LLFeatureList *maskp = findMask(name);
+ if (!maskp)
+ {
+ LL_DEBUGS("RenderInit") << "Unknown feature mask " << name << LL_ENDL;
+ return FALSE;
+ }
+ LL_INFOS("RenderInit") << "Applying GPU Feature list: " << name << LL_ENDL;
+ return maskList(*maskp);
+}
+
+BOOL LLFeatureManager::loadFeatureTables()
+{
+ // *TODO - if I or anyone else adds something else to the skipped list
+ // make this data driven. Put it in the feature table and parse it
+ // correctly
+ mSkippedFeatures.insert("RenderAnisotropic");
+ mSkippedFeatures.insert("RenderGamma");
+ mSkippedFeatures.insert("RenderVBOEnable");
+ mSkippedFeatures.insert("RenderFogRatio");
+
+ // first table is install with app
+ std::string app_path = gDirUtilp->getAppRODataDir();
+ app_path += gDirUtilp->getDirDelimiter();
+
+ std::string filename;
+ std::string http_filename;
+#if LL_WINDOWS
+ std::string os_string = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
+ if (os_string.find("Microsoft Windows XP") == 0)
+ {
+ filename = llformat(FEATURE_TABLE_FILENAME, "_xp");
+ http_filename = llformat(FEATURE_TABLE_VER_FILENAME, "_xp", LLVersionInfo::getVersion().c_str());
+ }
+ else
+ {
+ filename = llformat(FEATURE_TABLE_FILENAME, "");
+ http_filename = llformat(FEATURE_TABLE_VER_FILENAME, "", LLVersionInfo::getVersion().c_str());
+ }
+#else
+ filename = FEATURE_TABLE_FILENAME;
+ http_filename = llformat(FEATURE_TABLE_VER_FILENAME, LLVersionInfo::getVersion().c_str());
+#endif
+
+ app_path += filename;
+
+
+ // second table is downloaded with HTTP
+ std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename);
+
+ // use HTTP table if it exists
+ std::string path;
+ if (gDirUtilp->fileExists(http_path))
+ {
+ path = http_path;
+ }
+ else
+ {
+ path = app_path;
+ }
+
+
+ return parseFeatureTable(path);
+}
+
+
+BOOL LLFeatureManager::parseFeatureTable(std::string filename)
+{
+ llinfos << "Looking for feature table in " << filename << llendl;
+
+ llifstream file;
+ std::string name;
+ U32 version;
+
+ file.open(filename); /*Flawfinder: ignore*/
+
+ if (!file)
+ {
+ LL_WARNS("RenderInit") << "Unable to open feature table " << filename << LL_ENDL;
+ return FALSE;
+ }
+
+ // Check file version
+ file >> name;
+ file >> version;
+ if (name != "version")
+ {
+ LL_WARNS("RenderInit") << filename << " does not appear to be a valid feature table!" << LL_ENDL;
+ return FALSE;
+ }
+
+ mTableVersion = version;
+
+ LLFeatureList *flp = NULL;
+ while (file >> name)
+ {
+ char buffer[MAX_STRING]; /*Flawfinder: ignore*/
+
+ if (name.substr(0,2) == "//")
+ {
+ // This is a comment.
+ file.getline(buffer, MAX_STRING);
+ continue;
+ }
+
+ if (name == "list")
+ {
+ if (flp)
+ {
+ //flp->dump();
+ }
+ // It's a new mask, create it.
+ file >> name;
+ if (mMaskList.count(name))
+ {
+ LL_ERRS("RenderInit") << "Overriding mask " << name << ", this is invalid!" << LL_ENDL;
+ }
+
+ flp = new LLFeatureList(name);
+ mMaskList[name] = flp;
+ }
+ else
+ {
+ if (!flp)
+ {
+ LL_ERRS("RenderInit") << "Specified parameter before <list> keyword!" << LL_ENDL;
+ return FALSE;
+ }
+ S32 available;
+ F32 recommended;
+ file >> available >> recommended;
+ flp->addFeature(name, available, recommended);
+ }
+ }
+ file.close();
+
+ return TRUE;
+}
+
+void LLFeatureManager::loadGPUClass()
+{
+ // defaults
+ mGPUClass = GPU_CLASS_UNKNOWN;
+ mGPUString = gGLManager.getRawGLString();
+ mGPUSupported = FALSE;
+
+ // first table is in the app dir
+ std::string app_path = gDirUtilp->getAppRODataDir();
+ app_path += gDirUtilp->getDirDelimiter();
+ app_path += GPU_TABLE_FILENAME;
+
+ // second table is downloaded with HTTP
+ std::string http_filename = llformat(GPU_TABLE_VER_FILENAME, LLVersionInfo::getVersion().c_str());
+ std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename);
+
+ // use HTTP table if it exists
+ std::string path;
+ if (gDirUtilp->fileExists(http_path))
+ {
+ path = http_path;
+ }
+ else
+ {
+ path = app_path;
+ }
+
+ parseGPUTable(path);
+}
+
+
+void LLFeatureManager::parseGPUTable(std::string filename)
+{
+ llifstream file;
+
+ file.open(filename);
+
+ if (!file)
+ {
+ LL_WARNS("RenderInit") << "Unable to open GPU table: " << filename << "!" << LL_ENDL;
+ return;
+ }
+
+ std::string rawRenderer = gGLManager.getRawGLString();
+ std::string renderer = rawRenderer;
+ for (std::string::iterator i = renderer.begin(); i != renderer.end(); ++i)
+ {
+ *i = tolower(*i);
+ }
+
+ bool gpuFound;
+ U32 lineNumber;
+ for (gpuFound = false, lineNumber = 0; !gpuFound && !file.eof(); lineNumber++)
+ {
+ char buffer[MAX_STRING]; /*Flawfinder: ignore*/
+ buffer[0] = 0;
+
+ file.getline(buffer, MAX_STRING);
+
+ if (strlen(buffer) >= 2 && /*Flawfinder: ignore*/
+ buffer[0] == '/' &&
+ buffer[1] == '/')
+ {
+ // This is a comment.
+ continue;
+ }
+
+ if (strlen(buffer) == 0) /*Flawfinder: ignore*/
+ {
+ // This is a blank line
+ continue;
+ }
+
+ // setup the tokenizer
+ std::string buf(buffer);
+ std::string cls, label, expr, supported;
+ boost_tokenizer tokens(buf, boost::char_separator<char>("\t\n"));
+ boost_tokenizer::iterator token_iter = tokens.begin();
+
+ // grab the label, pseudo regular expression, and class
+ if(token_iter != tokens.end())
+ {
+ label = *token_iter++;
+ }
+ if(token_iter != tokens.end())
+ {
+ expr = *token_iter++;
+ }
+ if(token_iter != tokens.end())
+ {
+ cls = *token_iter++;
+ }
+ if(token_iter != tokens.end())
+ {
+ supported = *token_iter++;
+ }
+
+ if (label.empty() || expr.empty() || cls.empty() || supported.empty())
+ {
+ LL_WARNS("RenderInit") << "invald gpu_table.txt:" << lineNumber << ": '" << buffer << "'" << LL_ENDL;
+ continue;
+ }
+
+ for (U32 i = 0; i < expr.length(); i++) /*Flawfinder: ignore*/
+ {
+ expr[i] = tolower(expr[i]);
+ }
+
+ // run the regular expression against the renderer
+ boost::regex re(expr.c_str());
+ if(boost::regex_search(renderer, re))
+ {
+ // if we found it, stop!
+ gpuFound = true;
+ mGPUString = label;
+ mGPUClass = (EGPUClass) strtol(cls.c_str(), NULL, 10);
+ mGPUSupported = (BOOL) strtol(supported.c_str(), NULL, 10);
+ }
+ }
+ file.close();
+
+ if ( gpuFound )
+ {
+ LL_INFOS("RenderInit") << "GPU '" << rawRenderer << "' recognized as '" << mGPUString << "'" << LL_ENDL;
+ if (!mGPUSupported)
+ {
+ LL_INFOS("RenderInit") << "GPU '" << mGPUString << "' is not supported." << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_WARNS("RenderInit") << "GPU '" << rawRenderer << "' not recognized" << LL_ENDL;
+ }
+}
+
+// responder saves table into file
+class LLHTTPFeatureTableResponder : public LLHTTPClient::Responder
+{
+public:
+
+ LLHTTPFeatureTableResponder(std::string filename) :
+ mFilename(filename)
+ {
+ }
+
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ if (isGoodStatus(status))
+ {
+ // write to file
+
+ llinfos << "writing feature table to " << mFilename << llendl;
+
+ S32 file_size = buffer->countAfter(channels.in(), NULL);
+ if (file_size > 0)
+ {
+ // read from buffer
+ U8* copy_buffer = new U8[file_size];
+ buffer->readAfter(channels.in(), NULL, copy_buffer, file_size);
+
+ // write to file
+ LLAPRFile out(mFilename, LL_APR_WB);
+ out.write(copy_buffer, file_size);
+ out.close();
+ }
+ }
+
+ }
+
+private:
+ std::string mFilename;
+};
+
+void fetch_feature_table(std::string table)
+{
+ const std::string base = gSavedSettings.getString("FeatureManagerHTTPTable");
+
+#if LL_WINDOWS
+ std::string os_string = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
+ std::string filename;
+ if (os_string.find("Microsoft Windows XP") == 0)
+ {
+ filename = llformat(table.c_str(), "_xp", LLVersionInfo::getVersion().c_str());
+ }
+ else
+ {
+ filename = llformat(table.c_str(), "", LLVersionInfo::getVersion().c_str());
+ }
+#else
+ const std::string filename = llformat(table.c_str(), LLVersionInfo::getVersion().c_str());
+#endif
+
+ const std::string url = base + "/" + filename;
+
+ const std::string path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename);
+
+ llinfos << "LLFeatureManager fetching " << url << " into " << path << llendl;
+
+ LLHTTPClient::get(url, new LLHTTPFeatureTableResponder(path));
+}
+
+void fetch_gpu_table(std::string table)
+{
+ const std::string base = gSavedSettings.getString("FeatureManagerHTTPTable");
+
+ const std::string filename = llformat(table.c_str(), LLVersionInfo::getVersion().c_str());
+
+ const std::string url = base + "/" + filename;
+
+ const std::string path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename);
+
+ llinfos << "LLFeatureManager fetching " << url << " into " << path << llendl;
+
+ LLHTTPClient::get(url, new LLHTTPFeatureTableResponder(path));
+}
+
+// fetch table(s) from a website (S3)
+void LLFeatureManager::fetchHTTPTables()
+{
+ fetch_feature_table(FEATURE_TABLE_VER_FILENAME);
+ fetch_gpu_table(GPU_TABLE_VER_FILENAME);
+}
+
+
+void LLFeatureManager::cleanupFeatureTables()
+{
+ std::for_each(mMaskList.begin(), mMaskList.end(), DeletePairedPointer());
+ mMaskList.clear();
+}
+
+void LLFeatureManager::init()
+{
+ // load the tables
+ loadFeatureTables();
+
+ // get the gpu class
+ loadGPUClass();
+
+ // apply the base masks, so we know if anything is disabled
+ applyBaseMasks();
+}
+
+void LLFeatureManager::applyRecommendedSettings()
+{
+ // apply saved settings
+ // cap the level at 2 (high)
+ S32 level = llmax(GPU_CLASS_0, llmin(mGPUClass, GPU_CLASS_2));
+
+ llinfos << "Applying Recommended Features" << llendl;
+
+ setGraphicsLevel(level, false);
+ gSavedSettings.setU32("RenderQualityPerformance", level);
+
+ // now apply the tweaks to draw distance
+ // these are double negatives, because feature masks only work by
+ // downgrading values, so i needed to make a true value go to false
+ // for certain cards, thus the awkward name, "Disregard..."
+ if(!gSavedSettings.getBOOL("Disregard96DefaultDrawDistance"))
+ {
+ gSavedSettings.setF32("RenderFarClip", 96.0f);
+ }
+ else if(!gSavedSettings.getBOOL("Disregard128DefaultDrawDistance"))
+ {
+ gSavedSettings.setF32("RenderFarClip", 128.0f);
+ }
+}
+
+void LLFeatureManager::applyFeatures(bool skipFeatures)
+{
+ // see featuretable.txt / featuretable_linux.txt / featuretable_mac.txt
+
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ dump();
+#endif
+
+ // scroll through all of these and set their corresponding control value
+ for(feature_map_t::iterator mIt = mFeatures.begin();
+ mIt != mFeatures.end();
+ ++mIt)
+ {
+ // skip features you want to skip
+ // do this for when you don't want to change certain settings
+ if(skipFeatures)
+ {
+ if(mSkippedFeatures.find(mIt->first) != mSkippedFeatures.end())
+ {
+ continue;
+ }
+ }
+
+ // get the control setting
+ LLControlVariable* ctrl = gSavedSettings.getControl(mIt->first);
+ if(ctrl == NULL)
+ {
+ llwarns << "AHHH! Control setting " << mIt->first << " does not exist!" << llendl;
+ continue;
+ }
+
+ // handle all the different types
+ if(ctrl->isType(TYPE_BOOLEAN))
+ {
+ gSavedSettings.setBOOL(mIt->first, (BOOL)getRecommendedValue(mIt->first));
+ }
+ else if (ctrl->isType(TYPE_S32))
+ {
+ gSavedSettings.setS32(mIt->first, (S32)getRecommendedValue(mIt->first));
+ }
+ else if (ctrl->isType(TYPE_U32))
+ {
+ gSavedSettings.setU32(mIt->first, (U32)getRecommendedValue(mIt->first));
+ }
+ else if (ctrl->isType(TYPE_F32))
+ {
+ gSavedSettings.setF32(mIt->first, (F32)getRecommendedValue(mIt->first));
+ }
+ else
+ {
+ llwarns << "AHHH! Control variable is not a numeric type!" << llendl;
+ }
+ }
+}
+
+void LLFeatureManager::setGraphicsLevel(S32 level, bool skipFeatures)
+{
+ applyBaseMasks();
+
+ switch (level)
+ {
+ case 0:
+ maskFeatures("Low");
+ break;
+ case 1:
+ maskFeatures("Mid");
+ break;
+ case 2:
+ maskFeatures("High");
+ break;
+ case 3:
+ maskFeatures("Ultra");
+ break;
+ default:
+ maskFeatures("Low");
+ break;
+ }
+
+ applyFeatures(skipFeatures);
+}
+
+void LLFeatureManager::applyBaseMasks()
+{
+ // reapply masks
+ mFeatures.clear();
+
+ LLFeatureList* maskp = findMask("all");
+ if(maskp == NULL)
+ {
+ LL_WARNS("RenderInit") << "AHH! No \"all\" in feature table!" << LL_ENDL;
+ return;
+ }
+
+ mFeatures = maskp->getFeatures();
+
+ // mask class
+ if (mGPUClass >= 0 && mGPUClass < 4)
+ {
+ const char* class_table[] =
+ {
+ "Class0",
+ "Class1",
+ "Class2",
+ "Class3"
+ };
+
+ LL_INFOS("RenderInit") << "Setting GPU Class to " << class_table[mGPUClass] << LL_ENDL;
+ maskFeatures(class_table[mGPUClass]);
+ }
+ else
+ {
+ LL_INFOS("RenderInit") << "Setting GPU Class to Unknown" << LL_ENDL;
+ maskFeatures("Unknown");
+ }
+
+ // now all those wacky ones
+ if (!gGLManager.mHasFragmentShader)
+ {
+ maskFeatures("NoPixelShaders");
+ }
+ if (!gGLManager.mHasVertexShader)
+ {
+ maskFeatures("NoVertexShaders");
+ }
+ if (gGLManager.mIsNVIDIA)
+ {
+ maskFeatures("NVIDIA");
+ }
+ if (gGLManager.mIsGF2or4MX)
+ {
+ maskFeatures("GeForce2");
+ }
+ if (gGLManager.mIsATI)
+ {
+ maskFeatures("ATI");
+ }
+ if (gGLManager.mHasATIMemInfo && gGLManager.mVRAM < 256)
+ {
+ maskFeatures("ATIVramLT256");
+ }
+ if (gGLManager.mATIOldDriver)
+ {
+ maskFeatures("ATIOldDriver");
+ }
+ if (gGLManager.mIsGFFX)
+ {
+ maskFeatures("GeForceFX");
+ }
+ if (gGLManager.mIsIntel)
+ {
+ maskFeatures("Intel");
+ }
+ if (gGLManager.mGLVersion < 1.5f)
+ {
+ maskFeatures("OpenGLPre15");
+ }
+ if (gGLManager.mGLVersion < 3.f)
+ {
+ maskFeatures("OpenGLPre30");
+ }
+ if (gGLManager.mNumTextureImageUnits <= 8)
+ {
+ maskFeatures("TexUnit8orLess");
+ }
+
+ // now mask by gpu string
+ // Replaces ' ' with '_' in mGPUString to deal with inability for parser to handle spaces
+ std::string gpustr = mGPUString;
+ for (std::string::iterator iter = gpustr.begin(); iter != gpustr.end(); ++iter)
+ {
+ if (*iter == ' ')
+ {
+ *iter = '_';
+ }
+ }
+
+ //llinfos << "Masking features from gpu table match: " << gpustr << llendl;
+ maskFeatures(gpustr);
+
+ // now mask cpu type ones
+ if (gSysMemory.getPhysicalMemoryClamped() <= 256*1024*1024)
+ {
+ maskFeatures("RAM256MB");
+ }
+
+#if LL_SOLARIS && defined(__sparc) // even low MHz SPARCs are fast
+#error The 800 is hinky. Would something like a LL_MIN_MHZ make more sense here?
+ if (gSysCPU.getMHz() < 800)
+#else
+ if (gSysCPU.getMHz() < 1100)
+#endif
+ {
+ maskFeatures("CPUSlow");
+ }
+
+ if (isSafe())
+ {
+ maskFeatures("safe");
+ }
+}
diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index 2c4153688a..a9f52282a5 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -131,7 +131,7 @@ void LLFirstUse::notMoving(bool enable) // static void LLFirstUse::viewPopup(bool enable) { - firstUseNotification("FirstViewPopup", enable, "HintView", LLSD(), LLSD().with("target", "view_popup").with("direction", "right")); +// firstUseNotification("FirstViewPopup", enable, "HintView", LLSD(), LLSD().with("target", "view_popup").with("direction", "right")); } // static diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp index 83105ef27c..50b19a4221 100644 --- a/indra/newview/llfloaterbuyland.cpp +++ b/indra/newview/llfloaterbuyland.cpp @@ -459,10 +459,18 @@ void LLFloaterBuyLandUI::updateParcelInfo() return; } - if (!authorizedBuyer.isNull() && buyer != authorizedBuyer) + if (!authorizedBuyer.isNull() && buyer != authorizedBuyer) { - mCannotBuyReason = getString("set_to_sell_to_other"); - return; + // Maybe the parcel is set for sale to a group we are in.
+ bool authorized_group =
+ gAgent.hasPowerInGroup(authorizedBuyer,GP_LAND_DEED)
+ && gAgent.hasPowerInGroup(authorizedBuyer,GP_LAND_SET_SALE_INFO);
+
+ if (!authorized_group)
+ {
+ mCannotBuyReason = getString("set_to_sell_to_other");
+ return;
+ } } } else diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 7be4ebc690..0d0c1f594d 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -38,6 +38,7 @@ #include "message.h" #include "llagent.h" +#include "llagentaccess.h" #include "llbutton.h" #include "llcheckboxctrl.h" #include "llcombobox.h" diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h index a096fb64cd..8a70fa24d8 100644 --- a/indra/newview/llfloaterland.h +++ b/indra/newview/llfloaterland.h @@ -43,11 +43,12 @@ class LLButton; class LLCheckBoxCtrl; class LLRadioGroup; class LLComboBox; -class LLNameListCtrl; -class LLSpinCtrl; class LLLineEditor; +class LLMessageSystem; +class LLNameListCtrl; class LLRadioGroup; class LLParcelSelectionObserver; +class LLSpinCtrl; class LLTabContainer; class LLTextBox; class LLTextEditor; diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index c66b2255eb..9dd5269a6b 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -98,12 +98,14 @@ #include "llvfile.h" #include "llvfs.h" #include "llcallbacklist.h" - +#include "llviewerobjectlist.h" +#include "llanimationstates.h" #include "glod/glod.h" //static S32 LLFloaterModelPreview::sUploadAmount = 10; LLFloaterModelPreview* LLFloaterModelPreview::sInstance = NULL; +std::list<LLModelLoader*> LLModelLoader::sActiveLoaderList; const S32 PREVIEW_BORDER_WIDTH = 2; const S32 PREVIEW_RESIZE_HANDLE_SIZE = S32(RESIZE_HANDLE_WIDTH * OO_SQRT2) + PREVIEW_BORDER_WIDTH; @@ -111,8 +113,6 @@ const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE; const S32 PREF_BUTTON_HEIGHT = 16 + 7 + 16; const S32 PREVIEW_TEXTURE_HEIGHT = 300; -const F32 MAXIMUM_PIVOT_OFFSET = 64.0f; - void drawBoxOutline(const LLVector3& pos, const LLVector3& size); @@ -382,12 +382,6 @@ LLFloaterModelPreview::~LLFloaterModelPreview() { sInstance = NULL; - if ( mModelPreview && mModelPreview->getResetJointFlag() ) - { - gAgentAvatarp->resetJointPositions(); - } - - if ( mModelPreview ) { delete mModelPreview; @@ -1087,6 +1081,15 @@ LLModelLoader::LLModelLoader( std::string filename, S32 lod, LLModelPreview* pre { mTrySLM = false; } + + assert_main_thread(); + sActiveLoaderList.push_back(this) ; +} + +LLModelLoader::~LLModelLoader() +{ + assert_main_thread(); + sActiveLoaderList.remove(this); } void stretch_extents(LLModel* model, LLMatrix4a& mat, LLVector4a& min, LLVector4a& max, BOOL& first_transform) @@ -1550,14 +1553,14 @@ bool LLModelLoader::doLoadModel() //(which means we have all the joints that are required for an avatar versus //a skinned asset attached to a node in a file that contains an entire skeleton, //but does not use the skeleton). - + buildJointToNodeMappingFromScene( root ); mPreview->critiqueRigForUploadApplicability( model->mSkinInfo.mJointNames ); if ( !missingSkeletonOrScene ) { //Set the joint translations on the avatar - if it's a full mapping //The joints are reset in the dtor - if ( mPreview->getResetJointFlag() ) + if ( mPreview->getRigWithSceneParity() ) { std::map<std::string, std::string> :: const_iterator masterJointIt = mJointMap.begin(); std::map<std::string, std::string> :: const_iterator masterJointItEnd = mJointMap.end(); @@ -1569,7 +1572,7 @@ bool LLModelLoader::doLoadModel() { //llinfos<<"joint "<<lookingForJoint.c_str()<<llendl; LLMatrix4 jointTransform = mJointList[lookingForJoint]; - LLJoint* pJoint = gAgentAvatarp->getJoint( lookingForJoint ); + LLJoint* pJoint = mPreview->getPreviewAvatar()->getJoint( lookingForJoint ); if ( pJoint ) { pJoint->storeCurrentXform( jointTransform.getTranslation() ); @@ -1762,12 +1765,6 @@ bool LLModelLoader::doLoadModel() processElement(scene); - handlePivotPoint( root ); - - buildJointToNodeMappingFromScene( root ); - - mPreview->critiqueJointToNodeMappingFromScene(); - return true; } @@ -1872,8 +1869,24 @@ bool LLModelLoader::loadFromSLM(const std::string& filename) return true; } +//static +bool LLModelLoader::isAlive(LLModelLoader* loader) +{ + if(!loader) + { + return false ; + } + + std::list<LLModelLoader*>::iterator iter = sActiveLoaderList.begin() ; + for(; iter != sActiveLoaderList.end() && (*iter) != loader; ++iter) ; + + return *iter == loader ; +} + void LLModelLoader::loadModelCallback() { + assert_main_thread(); + if (mPreview) { mPreview->loadModelCallback(mLod); @@ -1884,6 +1897,12 @@ void LLModelLoader::loadModelCallback() apr_sleep(100); } + //doubel check if "this" is valid before deleting it, in case it is aborted during running. + if(!isAlive(this)) + { + return ; + } + //cleanup model loader if (mPreview) { @@ -1935,55 +1954,14 @@ void LLModelLoader::processJointToNodeMapping( domNode* pNode ) } } } -//----------------------------------------------------------------------------- -// handlePivotPoint() -//----------------------------------------------------------------------------- -void LLModelLoader::handlePivotPoint( daeElement* pRoot ) -{ - //Import an optional pivot point - a pivot point is just a node in the visual scene named "AssetPivot" - //If no assetpivot is found then the asset will use the SL default - daeElement* pScene = pRoot->getDescendant("visual_scene"); - if ( pScene ) - { - daeTArray< daeSmartRef<daeElement> > children = pScene->getChildren(); - S32 childCount = children.getCount(); - for (S32 i = 0; i < childCount; ++i) - { - domNode* pNode = daeSafeCast<domNode>(children[i]); - if ( pNode && isNodeAPivotPoint( pNode ) ) - { - LLMatrix4 workingTransform; - daeSIDResolver nodeResolver( pNode, "./translate" ); - domTranslate* pTranslate = daeSafeCast<domTranslate>( nodeResolver.getElement() ); - //Translation via SID was successful - //todo#extract via element as well - if ( pTranslate ) - { - extractTranslation( pTranslate, workingTransform ); - LLVector3 pivotTrans = workingTransform.getTranslation(); - if ( pivotTrans[VX] > MAXIMUM_PIVOT_OFFSET || pivotTrans[VX] < -MAXIMUM_PIVOT_OFFSET || - pivotTrans[VY] > MAXIMUM_PIVOT_OFFSET || pivotTrans[VY] < -MAXIMUM_PIVOT_OFFSET || - pivotTrans[VZ] > MAXIMUM_PIVOT_OFFSET || pivotTrans[VZ] < -MAXIMUM_PIVOT_OFFSET ) - { - llwarns<<"Asset Pivot Node contains an offset that is too large - values should be within (-"<<MAXIMUM_PIVOT_OFFSET<<","<<MAXIMUM_PIVOT_OFFSET<<")."<<llendl; - mPreview->setHasPivot( false ); - } - else - { - mPreview->setModelPivot( pivotTrans ); - mPreview->setHasPivot( true ); - } - } - } - } - } -} //----------------------------------------------------------------------------- // critiqueRigForUploadApplicability() //----------------------------------------------------------------------------- void LLModelPreview::critiqueRigForUploadApplicability( const std::vector<std::string> &jointListFromAsset ) { + critiqueJointToNodeMappingFromScene(); + //Determines the following use cases for a rig: //1. It is suitable for upload with skin weights & joint positions, or //2. It is suitable for upload as standard av with just skin weights @@ -2002,7 +1980,7 @@ void LLModelPreview::critiqueRigForUploadApplicability( const std::vector<std::s setLegacyRigValid( true ); } - if ( isJointPositionUploadOK ) + if ( getRigWithSceneParity() && isJointPositionUploadOK ) { setResetJointFlag( true ); } @@ -2046,12 +2024,11 @@ void LLModelPreview::critiqueJointToNodeMappingFromScene( void ) if ( result ) { setResetJointFlag( true ); - //llinfos<<"Full"<<llendl; + setRigWithSceneParity( true ); } else { setResetJointFlag( false ); - //llinfos<<"Partial"<<llendl; } } //----------------------------------------------------------------------------- @@ -2176,27 +2153,7 @@ bool LLModelLoader::isNodeAJoint( domNode* pNode ) return false; } -//----------------------------------------------------------------------------- -// isNodeAPivotPoint() -//----------------------------------------------------------------------------- -bool LLModelLoader::isNodeAPivotPoint( domNode* pNode ) -{ - bool result = false; - - if ( pNode && pNode->getName() ) - { - std::string name = pNode->getName(); - if ( name == "AssetPivot" ) - { - result = true; - } - else - { - result = false; - } - } - return result; -} + //----------------------------------------------------------------------------- // extractTranslation() //----------------------------------------------------------------------------- @@ -2618,6 +2575,7 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp) , mLegacyRigValid( false ) , mRigValidJointUpload( false ) , mResetJoints( false ) +, mRigParityWithScene( false ) , mLastJointUpdate( false ) { mNeedsUpdate = TRUE; @@ -2634,6 +2592,7 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp) mLoading = false; mLoadState = LLModelLoader::STARTING; mGroup = 0; + mLODFrozen = false; mBuildShareTolerance = 0.f; mBuildQueueMode = GLOD_QUEUE_GREEDY; mBuildBorderMode = GLOD_BORDER_UNLOCK; @@ -2642,6 +2601,13 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp) for (U32 i = 0; i < LLModel::NUM_LODS; ++i) { mRequestedTriangleCount[i] = 0; + mRequestedCreaseAngle[i] = -1.f; + mRequestedLoDMode[i] = 0; + mRequestedErrorThreshold[i] = 0.f; + mRequestedBuildOperator[i] = 0; + mRequestedQueueMode[i] = 0; + mRequestedBorderMode[i] = 0; + mRequestedShareTolerance[i] = 0.f; } mViewOption["show_textures"] = false; @@ -2686,6 +2652,8 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp) mMasterLegacyJointList.push_front("mHipLeft"); mMasterLegacyJointList.push_front("mKneeLeft"); mMasterLegacyJointList.push_front("mFootLeft"); + + createPreviewAvatar(); } LLModelPreview::~LLModelPreview() @@ -2693,7 +2661,7 @@ LLModelPreview::~LLModelPreview() if (mModelLoader) { delete mModelLoader; - mModelLoader->mPreview = NULL; + mModelLoader = NULL; } //*HACK : *TODO : turn this back on when we understand why this crashes //glodShutdown(); @@ -2739,7 +2707,7 @@ U32 LLModelPreview::calcResourceCost() if ( mFMP && mFMP->childGetValue("upload_joints").asBoolean() ) { - gAgentAvatarp->setPelvisOffset( mPelvisZOffset ); + getPreviewAvatar()->setPelvisOffset( mPelvisZOffset ); } F32 streaming_cost = 0.f; @@ -2822,27 +2790,6 @@ void LLFloaterModelPreview::setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, childSetTextArg("physics cost", "[COST]", llformat("%.3f", physics_cost)); } -void LLModelPreview::alterModelsPivot( void ) -{ - for (LLModelLoader::model_list::iterator iter = mBaseModel.begin(); iter != mBaseModel.end(); ++iter) - { - if ( *iter ) - { - (*iter)->offsetMesh( mModelPivot ); - } - } - - for ( int i=0;i<LLModel::NUM_LODS;++i ) - { - for (LLModelLoader::model_list::iterator iter = mModel[i].begin(); iter != mModel[i].end(); ++iter) - { - if ( *iter ) - { - (*iter)->offsetMesh( mModelPivot ); - } - } - } -} void LLModelPreview::rebuildUploadData() { @@ -3305,6 +3252,8 @@ void LLModelPreview::generateNormals() F32 angle_cutoff = mFMP->childGetValue("crease_angle").asReal(); + mRequestedCreaseAngle[which_lod] = angle_cutoff; + angle_cutoff *= DEG_TO_RAD; if (which_lod == 3 && !mBaseModel.empty()) @@ -3324,7 +3273,7 @@ void LLModelPreview::generateNormals() mVertexBuffer[which_lod].clear(); refresh(); - + updateStatusMessages(); } void LLModelPreview::clearMaterials() @@ -3400,6 +3349,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim { lod_mode = iface->getFirstSelectedIndex(); } + mRequestedLoDMode[mPreviewLOD] = lod_mode; F32 lod_error_threshold = mFMP->childGetValue("lod_error_threshold").asReal(); @@ -3423,6 +3373,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim { build_operator = iface->getFirstSelectedIndex(); } + mRequestedBuildOperator[mPreviewLOD] = build_operator; if (build_operator == 0) { @@ -3439,6 +3390,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim { queue_mode = iface->getFirstSelectedIndex(); } + mRequestedQueueMode[mPreviewLOD] = queue_mode; if (queue_mode == 0) { @@ -3460,6 +3412,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim { border_mode = iface->getFirstSelectedIndex(); } + mRequestedBorderMode[mPreviewLOD] = border_mode; if (border_mode == 0) { @@ -3495,6 +3448,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim mBuildShareTolerance = share_tolerance; object_dirty = true; } + mRequestedShareTolerance[mPreviewLOD] = share_tolerance; if (mGroup == 0) { @@ -3603,6 +3557,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim U32 submeshes = 0; mRequestedTriangleCount[lod] = triangle_count; + mRequestedErrorThreshold[lod] = lod_error_threshold; glodGroupParameteri(mGroup, GLOD_ADAPT_MODE, lod_mode); stop_gloderror(); @@ -3613,21 +3568,19 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim glodGroupParameterf(mGroup, GLOD_OBJECT_SPACE_ERROR_THRESHOLD, lod_error_threshold); stop_gloderror(); - glodGroupParameteri(mGroup, GLOD_MAX_TRIANGLES, 0); - stop_gloderror(); - - glodAdaptGroup(mGroup); - stop_gloderror(); - - if (lod_mode == GLOD_TRIANGLE_BUDGET) - { //SH-632 Always adapt to 0 before adapting to actual desired amount, and always - //add 1 to desired amount to avoid decimating below desired amount + if (lod_mode != GLOD_TRIANGLE_BUDGET) + { + glodGroupParameteri(mGroup, GLOD_MAX_TRIANGLES, 0); + } + else + { + //SH-632: always add 1 to desired amount to avoid decimating below desired amount glodGroupParameteri(mGroup, GLOD_MAX_TRIANGLES, triangle_count+1); - stop_gloderror(); - - glodAdaptGroup(mGroup); - stop_gloderror(); } + + stop_gloderror(); + glodAdaptGroup(mGroup); + stop_gloderror(); for (U32 mdl_idx = 0; mdl_idx < mBaseModel.size(); ++mdl_idx) { @@ -3892,6 +3845,18 @@ void LLModelPreview::updateStatusMessages() } } + + //make sure no hulls have more than 256 points in them + for (U32 i = 0; upload_ok && i < mModel[LLModel::LOD_PHYSICS].size(); ++i) + { + LLModel* mdl = mModel[LLModel::LOD_PHYSICS][i]; + + for (U32 j = 0; upload_ok && j < mdl->mPhysics.mHull.size(); ++j) + { + upload_ok = upload_ok && mdl->mPhysics.mHull[i].size() <= 256; + } + } + bool errorStateFromLoader = getLoadState() >= LLModelLoader::ERROR_PARSING ? true : false; bool skinAndRigOk = true; @@ -3915,6 +3880,10 @@ void LLModelPreview::updateStatusMessages() { mFMP->childEnable("ok_btn"); } + else + { + mFMP->childDisable("ok_btn"); + } //add up physics triangles etc S32 start = 0; @@ -4081,6 +4050,9 @@ void LLModelPreview::updateStatusMessages() { // auto generate, also the default case for wizard which has no radio selection fmp->mLODMode[mPreviewLOD] = 1; + //don't actually regenerate lod when refreshing UI + mLODFrozen = true; + for (U32 i = 0; i < num_file_controls; ++i) { mFMP->childDisable(file_controls[i]); @@ -4093,20 +4065,21 @@ void LLModelPreview::updateStatusMessages() //if (threshold) { - U32 lod_mode = 0; - LLCtrlSelectionInterface* iface = mFMP->childGetSelectionInterface("lod_mode"); - if (iface) - { - lod_mode = iface->getFirstSelectedIndex(); - } - LLSpinCtrl* threshold = mFMP->getChild<LLSpinCtrl>("lod_error_threshold"); LLSpinCtrl* limit = mFMP->getChild<LLSpinCtrl>("lod_triangle_limit"); limit->setMaxValue(mMaxTriangleLimit); - limit->setValue(mRequestedTriangleCount[mPreviewLOD]); + limit->forceSetValue(mRequestedTriangleCount[mPreviewLOD]); + + threshold->forceSetValue(mRequestedErrorThreshold[mPreviewLOD]); + + mFMP->getChild<LLComboBox>("lod_mode")->selectNthItem(mRequestedLoDMode[mPreviewLOD]); + mFMP->getChild<LLComboBox>("build_operator")->selectNthItem(mRequestedBuildOperator[mPreviewLOD]); + mFMP->getChild<LLComboBox>("queue_mode")->selectNthItem(mRequestedQueueMode[mPreviewLOD]); + mFMP->getChild<LLComboBox>("border_mode")->selectNthItem(mRequestedBorderMode[mPreviewLOD]); + mFMP->getChild<LLSpinCtrl>("share_tolerance")->setValue(mRequestedShareTolerance[mPreviewLOD]); - if (lod_mode == 0) + if (mRequestedLoDMode[mPreviewLOD] == 0) { limit->setVisible(true); threshold->setVisible(false); @@ -4120,6 +4093,8 @@ void LLModelPreview::updateStatusMessages() threshold->setVisible(true); } } + + mLODFrozen = false; } } @@ -4135,6 +4110,20 @@ void LLModelPreview::updateStatusMessages() mFMP->childDisable("physics_file"); mFMP->childDisable("physics_browse"); } + + LLSpinCtrl* crease = mFMP->getChild<LLSpinCtrl>("crease_angle"); + + if (mRequestedCreaseAngle[mPreviewLOD] == -1.f) + { + mFMP->childSetColor("crease_label", LLColor4::grey); + crease->forceSetValue(75.f); + } + else + { + mFMP->childSetColor("crease_label", LLColor4::white); + crease->forceSetValue(mRequestedCreaseAngle[mPreviewLOD]); + } + } void LLModelPreview::setPreviewTarget(F32 distance) @@ -4301,42 +4290,6 @@ void LLModelPreview::update() } //----------------------------------------------------------------------------- -// changeAvatarsJointPositions() -//----------------------------------------------------------------------------- -void LLModelPreview::changeAvatarsJointPositions( LLModel* pModel ) -{ - if ( mMasterJointList.empty() ) - { - return; - } - - std::vector<std::string> :: const_iterator jointListItBegin = pModel->mSkinInfo.mJointNames.begin(); - std::vector<std::string> :: const_iterator jointListItEnd = pModel->mSkinInfo.mJointNames.end(); - - S32 index = 0; - for ( ; jointListItBegin!=jointListItEnd; ++jointListItBegin, ++index ) - { - std::string elem = *jointListItBegin; - //llinfos<<"joint "<<elem<<llendl; - - S32 matrixCnt = pModel->mSkinInfo.mAlternateBindMatrix.size(); - if ( matrixCnt < 1 ) - { - llinfos<<"Total WTF moment :"<<matrixCnt<<llendl; - } - else - { - LLMatrix4 jointTransform = pModel->mSkinInfo.mAlternateBindMatrix[index]; - - LLJoint* pJoint = gAgentAvatarp->getJoint( elem ); - if ( pJoint ) - { - pJoint->storeCurrentXform( jointTransform.getTranslation() ); - } - } - } -} -//----------------------------------------------------------------------------- // getTranslationForJointOffset() //----------------------------------------------------------------------------- LLVector3 LLModelPreview::getTranslationForJointOffset( std::string joint ) @@ -4350,6 +4303,30 @@ LLVector3 LLModelPreview::getTranslationForJointOffset( std::string joint ) return LLVector3(0.0f,0.0f,0.0f); } //----------------------------------------------------------------------------- +// createPreviewAvatar +//----------------------------------------------------------------------------- +void LLModelPreview::createPreviewAvatar( void ) +{ + mPreviewAvatar = (LLVOAvatar*)gObjectList.createObjectViewer( LL_PCODE_LEGACY_AVATAR, gAgent.getRegion() ); + if ( mPreviewAvatar ) + { + mPreviewAvatar->createDrawable( &gPipeline ); + mPreviewAvatar->mIsDummy = TRUE; + mPreviewAvatar->mSpecialRenderMode = 1; + mPreviewAvatar->setPositionAgent( LLVector3::zero ); + mPreviewAvatar->slamPosition(); + mPreviewAvatar->updateJointLODs(); + mPreviewAvatar->updateGeometry( mPreviewAvatar->mDrawable ); + mPreviewAvatar->startMotion( ANIM_AGENT_STAND ); + mPreviewAvatar->hideSkirt(); + } + else + { + llinfos<<"Failed to create preview avatar for upload model window"<<llendl; + } +} + +//----------------------------------------------------------------------------- // render() //----------------------------------------------------------------------------- BOOL LLModelPreview::render() @@ -4463,25 +4440,6 @@ BOOL LLModelPreview::render() mFMP->childSetEnabled("upload_joints", upload_skin); - //poke at avatar when we upload custom joints - /* - if ( upload_joints ) - { - for (LLModelLoader::scene::iterator iter = mScene[mPreviewLOD].begin(); iter != mScene[mPreviewLOD].end(); ++iter) - { - for (LLModelLoader::model_instance_list::iterator model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter) - { - LLModelInstance& instance = *model_iter; - LLModel* model = instance.mModel; - if ( !model->mSkinWeights.empty() ) - { - changeAvatarsJointPositions( model ); - } - } - } - } - */ - F32 explode = mFMP->childGetValue("physics_explode").asReal(); glClear(GL_DEPTH_BUFFER_BIT); @@ -4501,7 +4459,7 @@ BOOL LLModelPreview::render() if (skin_weight) { - target_pos = gAgentAvatarp->getPositionAgent(); + target_pos = getPreviewAvatar()->getPositionAgent(); z_near = 0.01f; z_far = 1024.f; mCameraDistance = 16.f; @@ -4721,8 +4679,7 @@ BOOL LLModelPreview::render() } else { - LLVOAvatarSelf* avatar = gAgentAvatarp; - target_pos = avatar->getPositionAgent(); + target_pos = getPreviewAvatar()->getPositionAgent(); LLViewerCamera::getInstance()->setOriginAndLookAt( target_pos + ((LLVector3(mCameraDistance, 0.f, 0.f) + offset) * av_rot), // camera @@ -4731,7 +4688,7 @@ BOOL LLModelPreview::render() if (joint_positions) { - avatar->renderCollisionVolumes(); + getPreviewAvatar()->renderCollisionVolumes(); } for (LLModelLoader::scene::iterator iter = mScene[mPreviewLOD].begin(); iter != mScene[mPreviewLOD].end(); ++iter) @@ -4762,7 +4719,7 @@ BOOL LLModelPreview::render() LLMatrix4 mat[64]; for (U32 j = 0; j < model->mSkinInfo.mJointNames.size(); ++j) { - LLJoint* joint = avatar->getJoint(model->mSkinInfo.mJointNames[j]); + LLJoint* joint = getPreviewAvatar()->getJoint(model->mSkinInfo.mJointNames[j]); if (joint) { mat[j] = model->mSkinInfo.mInvBindMatrix[j]; @@ -4943,11 +4900,6 @@ void LLFloaterModelPreview::onUpload(void* user_data) LLFloaterModelPreview* mp = (LLFloaterModelPreview*) user_data; - if ( mp && mp->mModelPreview->mHasPivot ) - { - mp->mModelPreview->alterModelsPivot(); - } - mp->mModelPreview->rebuildUploadData(); bool upload_skinweights = mp->childGetValue("upload_skin").asBoolean(); @@ -4990,9 +4942,12 @@ void LLModelPreview::textureLoadedCallback( BOOL success, LLViewerFetchedTexture void LLModelPreview::onLODParamCommit(bool enforce_tri_limit) { - genLODs(mPreviewLOD, 3, enforce_tri_limit); - updateStatusMessages(); - refresh(); + if (!mLODFrozen) + { + genLODs(mPreviewLOD, 3, enforce_tri_limit); + updateStatusMessages(); + refresh(); + } } LLFloaterModelPreview::DecompRequest::DecompRequest(const std::string& stage, LLModel* mdl) diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 186bf114d1..f6d4a08d1f 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -80,7 +80,7 @@ public: BOOL mFirstTransform; LLVector3 mExtents[2]; bool mTrySLM; - + std::map<daeElement*, LLPointer<LLModel> > mModel; typedef std::vector<LLPointer<LLModel> > model_list; @@ -99,6 +99,8 @@ public: LLModelLoader( std::string filename, S32 lod, LLModelPreview* preview, JointTransformMap& jointMap, std::deque<std::string>& jointsFromNodes ); + ~LLModelLoader() ; + virtual void run(); bool doLoadModel(); bool loadFromSLM(const std::string& filename); @@ -118,9 +120,6 @@ public: void extractTranslation( domTranslate* pTranslate, LLMatrix4& transform ); void extractTranslationViaElement( daeElement* pTranslateElement, LLMatrix4& transform ); - void handlePivotPoint( daeElement* pRoot ); - bool isNodeAPivotPoint( domNode* pNode ); - void setLoadState(U32 state); void buildJointToNodeMappingFromScene( daeElement* pRoot ); @@ -131,6 +130,10 @@ public: std::map<std::string, std::string> mJointMap; JointTransformMap& mJointList; std::deque<std::string>& mJointsFromNode; + +private: + static std::list<LLModelLoader*> sActiveLoaderList; + static bool isAlive(LLModelLoader* loader) ; }; class LLFloaterModelPreview : public LLFloater @@ -292,7 +295,6 @@ public: void loadModelCallback(S32 lod); void genLODs(S32 which_lod = -1, U32 decimation = 3, bool enforce_tri_limit = false); void generateNormals(); - void alterModelsPivot( void ); void clearMaterials(); U32 calcResourceCost(); void rebuildUploadData(); @@ -331,12 +333,17 @@ public: void setLoadState( U32 state ) { mLoadState = state; } U32 getLoadState() { return mLoadState; } - - void setResetJointFlag( bool state ) { mResetJoints = state; } - bool getResetJointFlag( void ) { return mResetJoints; } - + //setRestJointFlag: If an asset comes through that changes the joints, we want the reset to persist + void setResetJointFlag( bool state ) { if ( !mResetJoints ) mResetJoints = state; } + const bool getResetJointFlag( void ) const { return mResetJoints; } + void setRigWithSceneParity( bool state ) { mRigParityWithScene = state; } + const bool getRigWithSceneParity( void ) const { return mRigParityWithScene; } + LLVector3 getTranslationForJointOffset( std::string joint ); + void createPreviewAvatar( void ); + LLVOAvatar* getPreviewAvatar( void ) { return mPreviewAvatar; } + protected: friend class LLModelLoader; friend class LLFloaterModelPreview; @@ -364,16 +371,25 @@ public: bool mLoading; U32 mLoadState; bool mResetJoints; + bool mRigParityWithScene; + std::map<std::string, bool> mViewOption; //GLOD object parameters (must rebuild object if these change) + bool mLODFrozen; F32 mBuildShareTolerance; U32 mBuildQueueMode; U32 mBuildOperator; U32 mBuildBorderMode; + U32 mRequestedLoDMode[LLModel::NUM_LODS]; S32 mRequestedTriangleCount[LLModel::NUM_LODS]; + F32 mRequestedErrorThreshold[LLModel::NUM_LODS]; + U32 mRequestedBuildOperator[LLModel::NUM_LODS]; + U32 mRequestedQueueMode[LLModel::NUM_LODS]; + U32 mRequestedBorderMode[LLModel::NUM_LODS]; + F32 mRequestedShareTolerance[LLModel::NUM_LODS]; + F32 mRequestedCreaseAngle[LLModel::NUM_LODS]; - LLModelLoader* mModelLoader; LLModelLoader::scene mScene[LLModel::NUM_LODS]; @@ -409,6 +425,7 @@ public: std::deque<std::string> mMasterLegacyJointList; std::deque<std::string> mJointsFromNode; JointTransformMap mJointTransformMap; + LLPointer<LLVOAvatar> mPreviewAvatar; }; #endif // LL_LLFLOATERMODELPREVIEW_H diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 18b7a48d7b..4b15695cbf 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -987,9 +987,15 @@ void LLFloaterPreference::refreshEnabledState() LLCheckBoxCtrl* ctrl_avatar_vp = getChild<LLCheckBoxCtrl>("AvatarVertexProgram"); // Avatar Render Mode LLCheckBoxCtrl* ctrl_avatar_cloth = getChild<LLCheckBoxCtrl>("AvatarCloth"); + + bool avatar_vp_enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP"); + if (LLViewerShaderMgr::sInitialized) + { + S32 max_avatar_shader = LLViewerShaderMgr::instance()->mMaxAvatarShaderLevel; + avatar_vp_enabled = (max_avatar_shader > 0) ? TRUE : FALSE; + } - S32 max_avatar_shader = LLViewerShaderMgr::instance()->mMaxAvatarShaderLevel; - ctrl_avatar_vp->setEnabled((max_avatar_shader > 0) ? TRUE : FALSE); + ctrl_avatar_vp->setEnabled(avatar_vp_enabled); if (gSavedSettings.getBOOL("VertexShaderEnable") == FALSE || gSavedSettings.getBOOL("RenderAvatarVP") == FALSE) @@ -1006,7 +1012,7 @@ void LLFloaterPreference::refreshEnabledState() LLCheckBoxCtrl* ctrl_shader_enable = getChild<LLCheckBoxCtrl>("BasicShaders"); // radio set for terrain detail mode LLRadioGroup* mRadioTerrainDetail = getChild<LLRadioGroup>("TerrainDetailRadio"); // can be linked with control var - + ctrl_shader_enable->setEnabled(LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable")); BOOL shaders = ctrl_shader_enable->get(); diff --git a/indra/newview/llfloatersidetraytab.cpp b/indra/newview/llfloatersidetraytab.cpp index 94407e6da0..9f15e62d84 100644 --- a/indra/newview/llfloatersidetraytab.cpp +++ b/indra/newview/llfloatersidetraytab.cpp @@ -47,5 +47,6 @@ LLFloaterSideTrayTab::~LLFloaterSideTrayTab() void LLFloaterSideTrayTab::onClose(bool app_quitting) { - LLSideTray::getInstance()->setTabDocked(getName(), true); + // The floater is already being closed, so don't toggle it once more (that may crash viewer). + LLSideTray::getInstance()->setTabDocked(getName(), /* dock = */ true, /* toggle_floater = */ false); } diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index add591895b..00dc7b1627 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -53,6 +53,7 @@ #include "llfloaterpostcard.h" #include "llcheckboxctrl.h" #include "llradiogroup.h" +#include "llslurl.h" #include "lltoolfocus.h" #include "lltoolmgr.h" #include "llwebsharing.h" diff --git a/indra/newview/llfloatersounddevices.cpp b/indra/newview/llfloatersounddevices.cpp new file mode 100644 index 0000000000..9fe7c7f9dd --- /dev/null +++ b/indra/newview/llfloatersounddevices.cpp @@ -0,0 +1,90 @@ +/** + * @file llfloatersounddevices.cpp + * @author Leyla Farazha + * @brief Sound Preferences used for minimal skin + * +* $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, 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$ + */ +#include "llviewerprecompiledheaders.h" + +#include "llfloatersounddevices.h" + +#include "llbottomtray.h" +#include "lldraghandle.h" + +#include "llpanelvoicedevicesettings.h" + +// Library includes +#include "indra_constants.h" + +// protected +LLFloaterSoundDevices::LLFloaterSoundDevices(const LLSD& key) +: LLTransientDockableFloater(NULL, false, key) +{ + LLTransientFloaterMgr::getInstance()->addControlView(this); + + // force docked state since this floater doesn't save it between recreations + setDocked(true); +} + +LLFloaterSoundDevices::~LLFloaterSoundDevices() +{ + LLTransientFloaterMgr::getInstance()->removeControlView(this); +} + +// virtual +BOOL LLFloaterSoundDevices::postBuild() +{ + LLTransientDockableFloater::postBuild(); + + LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("flyout_btn"); + setDockControl(new LLDockControl(anchor_panel, this, getDockTongue(), LLDockControl::TOP)); + + setIsChrome(TRUE); + if (mDragHandle) + mDragHandle->setTitleVisible(TRUE); + updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730) + + LLPanelVoiceDeviceSettings* panel = findChild<LLPanelVoiceDeviceSettings>("device_settings_panel"); + if (panel) + { + panel->setUseTuningMode(false); + } + return TRUE; +} + +//virtual +void LLFloaterSoundDevices::setDocked(bool docked, bool pop_on_undock/* = true*/) +{ + LLTransientDockableFloater::setDocked(docked, pop_on_undock); +} + +// virtual +void LLFloaterSoundDevices::setFocus( BOOL b ) +{ + LLTransientDockableFloater::setFocus(b); + + // Force using active floater transparency + // We have to override setFocus() for because selecting an item of the + // combobox causes the floater to lose focus and thus become transparent. + updateTransparency(TT_ACTIVE); +} diff --git a/indra/newview/llfloatersounddevices.h b/indra/newview/llfloatersounddevices.h new file mode 100644 index 0000000000..f09ee3b069 --- /dev/null +++ b/indra/newview/llfloatersounddevices.h @@ -0,0 +1,49 @@ +/** + * @file llfloatersounddevices.h + * @author Leyla Farazha + * @brief Sound Preferences used for minimal skin + * +* $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, 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$ + */ + +#ifndef LL_LLFLOATERSOUNDDEVICES_H +#define LL_LLFLOATERSOUNDDEVICES_H + +#include "lltransientdockablefloater.h" + +class LLFloaterSoundDevices : public LLTransientDockableFloater +{ +public: + + LOG_CLASS(LLFloaterSoundDevices); + + LLFloaterSoundDevices(const LLSD& key); + ~LLFloaterSoundDevices(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void setDocked(bool docked, bool pop_on_undock = true); + /*virtual*/ void setFocus( BOOL b ); +}; + + +#endif //LL_LLFLOATERSOUNDDEVICES_H + diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 73c1f99fa0..061a42ab57 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -85,6 +85,7 @@ #include "llviewerwindow.h" #include "llvovolume.h" #include "lluictrlfactory.h" +#include "llaccountingquotamanager.h" // Globals LLFloaterTools *gFloaterTools = NULL; diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index 0d8601410a..4c9c4cb154 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -35,6 +35,7 @@ #include "llfloateruipreview.h" // Own header // Internal utility +#include "lldiriterator.h" #include "lleventtimer.h" #include "llexternaleditor.h" #include "llrender.h" @@ -481,9 +482,11 @@ BOOL LLFloaterUIPreview::postBuild() std::string language_directory; std::string xui_dir = get_xui_dir(); // directory containing localizations -- don't forget trailing delim mLanguageSelection->removeall(); // clear out anything temporarily in list from XML + + LLDirIterator iter(xui_dir, "*"); while(found) // for every directory { - if((found = gDirUtilp->getNextFileInDir(xui_dir, "*", language_directory))) // get next directory + if((found = iter.next(language_directory))) // get next directory { std::string full_path = xui_dir + language_directory; if(LLFile::isfile(full_path.c_str())) // if it's not a directory, skip it @@ -635,42 +638,51 @@ void LLFloaterUIPreview::refreshList() mFileList->clearRows(); // empty list std::string name; BOOL found = TRUE; + + LLDirIterator floater_iter(getLocalizedDirectory(), "floater_*.xml"); while(found) // for every floater file that matches the pattern { - if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "floater_*.xml", name))) // get next file matching pattern + if((found = floater_iter.next(name))) // get next file matching pattern { addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path) } } found = TRUE; + + LLDirIterator inspect_iter(getLocalizedDirectory(), "inspect_*.xml"); while(found) // for every inspector file that matches the pattern { - if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "inspect_*.xml", name))) // get next file matching pattern + if((found = inspect_iter.next(name))) // get next file matching pattern { addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path) } } found = TRUE; + + LLDirIterator menu_iter(getLocalizedDirectory(), "menu_*.xml"); while(found) // for every menu file that matches the pattern { - if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "menu_*.xml", name))) // get next file matching pattern + if((found = menu_iter.next(name))) // get next file matching pattern { addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path) } } found = TRUE; + + LLDirIterator panel_iter(getLocalizedDirectory(), "panel_*.xml"); while(found) // for every panel file that matches the pattern { - if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "panel_*.xml", name))) // get next file matching pattern + if((found = panel_iter.next(name))) // get next file matching pattern { addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path) } } - found = TRUE; + + LLDirIterator sidepanel_iter(getLocalizedDirectory(), "sidepanel_*.xml"); while(found) // for every sidepanel file that matches the pattern { - if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "sidepanel_*.xml", name))) // get next file matching pattern + if((found = sidepanel_iter.next(name))) // get next file matching pattern { addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path) } diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index b3b1ce5743..3884b94b60 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -301,18 +301,6 @@ BOOL LLFolderView::canFocusChildren() const return FALSE; } -void LLFolderView::checkTreeResortForModelChanged() -{ - if (mSortOrder & LLInventoryFilter::SO_DATE && !(mSortOrder & LLInventoryFilter::SO_FOLDERS_BY_NAME)) - { - // This is the case where something got added or removed. If we are date sorting - // everything including folders, then we need to rebuild the whole tree. - // Just set to something not SO_DATE to force the folder most resent date resort. - mSortOrder = mSortOrder & ~LLInventoryFilter::SO_DATE; - setSortOrder(mSortOrder | LLInventoryFilter::SO_DATE); - } -} - static LLFastTimer::DeclareTimer FTM_SORT("Sort Inventory"); void LLFolderView::setSortOrder(U32 order) diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 210ba9eb3c..1464a058d8 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -101,7 +101,6 @@ public: // FolderViews default to sort by name. This will change that, // and resort the items if necessary. void setSortOrder(U32 order); - void checkTreeResortForModelChanged(); void setFilterPermMask(PermissionMask filter_perm_mask); void setAllowMultiSelect(BOOL allow) { mAllowMultiSelect = allow; } diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 3c36248c1f..e9d1ad3a9e 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -1835,7 +1835,7 @@ void LLFolderViewFolder::sortBy(U32 order) return; } - // Propegate this change to sub folders + // Propagate this change to sub folders for (folders_t::iterator iter = mFolders.begin(); iter != mFolders.end();) { diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h index 2006e094a8..fc941510ab 100644 --- a/indra/newview/llfolderviewitem.h +++ b/indra/newview/llfolderviewitem.h @@ -28,6 +28,7 @@ #include "llview.h" #include "lldarray.h" // *TODO: Eliminate, forward declare +#include "lluiimage.h" class LLFontGL; class LLFolderView; diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp index f990b9294d..30858871ec 100644 --- a/indra/newview/llgiveinventory.cpp +++ b/indra/newview/llgiveinventory.cpp @@ -311,6 +311,9 @@ void LLGiveInventory::logInventoryOffer(const LLUUID& to_agent, const LLUUID &im std::string full_name; if (gCacheName->getFullName(to_agent, full_name)) { + // Build a new format username or firstname_lastname for legacy names + // to use it for a history log filename. + full_name = LLCacheName::buildUsername(full_name); LLIMModel::instance().logToFile(full_name, LLTrans::getString("SECOND_LIFE"), im_session_id, LLTrans::getString("inventory_item_offered-im")); } } diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index 7c56e610ce..97fa551441 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -40,10 +40,12 @@ #include "llsidetray.h" #include "llstatusbar.h" // can_afford_transaction() #include "llimfloater.h" +#include "groupchatlistener.h" // // Globals // +static GroupChatListener sGroupChatListener; class LLGroupHandler : public LLCommandHandler { @@ -320,10 +322,9 @@ void LLGroupActions::closeGroup(const LLUUID& group_id) // static -void LLGroupActions::startIM(const LLUUID& group_id) +LLUUID LLGroupActions::startIM(const LLUUID& group_id) { - if (group_id.isNull()) - return; + if (group_id.isNull()) return LLUUID::null; LLGroupData group_data; if (gAgent.getGroupData(group_id, group_data)) @@ -337,12 +338,14 @@ void LLGroupActions::startIM(const LLUUID& group_id) LLIMFloater::show(session_id); } make_ui_sound("UISndStartIM"); + return session_id; } else { // this should never happen, as starting a group IM session // relies on you belonging to the group and hence having the group data make_ui_sound("UISndInvalidOp"); + return LLUUID::null; } } diff --git a/indra/newview/llgroupactions.h b/indra/newview/llgroupactions.h index c52a25818b..3f9852f194 100644 --- a/indra/newview/llgroupactions.h +++ b/indra/newview/llgroupactions.h @@ -87,7 +87,7 @@ public: /** * Start group instant messaging session. */ - static void startIM(const LLUUID& group_id); + static LLUUID startIM(const LLUUID& group_id); /** * End group instant messaging session. diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index ec3fe48151..4de6976534 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -195,7 +195,7 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& // set P2P type by default mSessionType = P2P_SESSION; - if (IM_NOTHING_SPECIAL == type || IM_SESSION_P2P_INVITE == type) + if (IM_NOTHING_SPECIAL == mType || IM_SESSION_P2P_INVITE == mType) { mVoiceChannel = new LLVoiceChannelP2P(session_id, name, other_participant_id); mOtherParticipantIsAvatar = LLVoiceClient::getInstance()->isParticipantAvatar(mSessionID); @@ -249,7 +249,7 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& new LLSessionTimeoutTimer(mSessionID, SESSION_INITIALIZATION_TIMEOUT); } - if (IM_NOTHING_SPECIAL == type) + if (IM_NOTHING_SPECIAL == mType) { mCallBackEnabled = LLVoiceClient::getInstance()->isSessionCallBackPossible(mSessionID); mTextIMPossible = LLVoiceClient::getInstance()->isSessionTextIMPossible(mSessionID); @@ -269,10 +269,10 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& // Localizing name of ad-hoc session. STORM-153 // Changing name should happen here- after the history file was created, so that // history files have consistent (English) names in different locales. - if (isAdHocSessionType() && IM_SESSION_INVITE == type) + if (isAdHocSessionType() && IM_SESSION_INVITE == mType) { - LLAvatarNameCache::get(mOtherParticipantID, - boost::bind(&LLIMModel::LLIMSession::onAdHocNameCache, + LLAvatarNameCache::get(mOtherParticipantID, + boost::bind(&LLIMModel::LLIMSession::onAdHocNameCache, this, _2)); } } @@ -553,23 +553,10 @@ bool LLIMModel::LLIMSession::isOtherParticipantAvaline() return !mOtherParticipantIsAvatar; } -void LLIMModel::LLIMSession::onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name) -{ - if (av_name.mUsername.empty()) - { - // display names is off, use mDisplayName which will be the legacy name - mHistoryFileName = LLCacheName::buildUsername(av_name.mDisplayName); - } - else - { - mHistoryFileName = av_name.mUsername; - } -} - void LLIMModel::LLIMSession::buildHistoryFileName() { mHistoryFileName = mName; - + //ad-hoc requires sophisticated chat history saving schemes if (isAdHoc()) { @@ -583,17 +570,35 @@ void LLIMModel::LLIMSession::buildHistoryFileName() { std::set<LLUUID> sorted_uuids(mInitialTargetIDs.begin(), mInitialTargetIDs.end()); mHistoryFileName = mName + " hash" + generateHash(sorted_uuids); - return; } - - //in case of incoming ad-hoc sessions - mHistoryFileName = mName + " " + LLLogChat::timestamp(true) + " " + mSessionID.asString().substr(0, 4); + else + { + //in case of incoming ad-hoc sessions + mHistoryFileName = mName + " " + LLLogChat::timestamp(true) + " " + mSessionID.asString().substr(0, 4); + } } - - // look up username to use as the log name - if (isP2P()) + else if (isP2P()) // look up username to use as the log name { - LLAvatarNameCache::get(mOtherParticipantID, boost::bind(&LLIMModel::LLIMSession::onAvatarNameCache, this, _1, _2)); + LLAvatarName av_name; + // For outgoing sessions we already have a cached name + // so no need for a callback in LLAvatarNameCache::get() + if (LLAvatarNameCache::get(mOtherParticipantID, &av_name)) + { + if (av_name.mUsername.empty()) + { + // Display names are off, use mDisplayName which will be the legacy name + mHistoryFileName = LLCacheName::buildUsername(av_name.mDisplayName); + } + else + { + mHistoryFileName = av_name.mUsername; + } + } + else + { + // Incoming P2P sessions include a name that we can use to build a history file name + mHistoryFileName = LLCacheName::buildUsername(mName); + } } } @@ -615,7 +620,6 @@ std::string LLIMModel::LLIMSession::generateHash(const std::set<LLUUID>& sorted_ return participants_md5_hash.asString(); } - void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, const LLUUID& new_session_id) { LLIMSession* session = findIMSession(old_session_id); @@ -798,11 +802,6 @@ bool LLIMModel::logToFile(const std::string& file_name, const std::string& from, } } -bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text) -{ - return logToFile(LLIMModel::getInstance()->getHistoryFileName(session_id), from, from_id, utf8_text); -} - bool LLIMModel::proccessOnlineOfflineNotification( const LLUUID& session_id, const std::string& utf8_text) @@ -856,8 +855,11 @@ LLIMModel::LLIMSession* LLIMModel::addMessageSilently(const LLUUID& session_id, } addToHistory(session_id, from_name, from_id, utf8_text); - if (log2file) logToFile(session_id, from_name, from_id, utf8_text); - + if (log2file) + { + logToFile(getHistoryFileName(session_id), from_name, from_id, utf8_text); + } + session->mNumUnread++; //update count of unread messages from real participant @@ -2468,6 +2470,7 @@ void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& mess std::string session_name; // since we select user to share item with - his name is already in cache gCacheName->getFullName(args["user_id"], session_name); + session_name = LLCacheName::buildUsername(session_name); LLIMModel::instance().logToFile(session_name, SYSTEM_FROM, LLUUID::null, message.getString()); } } @@ -2696,10 +2699,10 @@ void LLIMMgr::inviteToSession( if (voice_invite) { - if ( // if we're rejecting all incoming call requests - gSavedSettings.getBOOL("VoiceCallsRejectAll") + if ( // if we are rejecting group calls + (gSavedSettings.getBOOL("VoiceCallsRejectGroup") && notify_box_type == "VoiceInviteGroup") || // or we're rejecting non-friend voice calls and this isn't a friend - || (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL)) + (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL)) ) { // silently decline the call diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index a15776c207..0ee56c8070 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -98,13 +98,6 @@ public: /** ad-hoc sessions involve sophisticated chat history file naming schemes */ void buildHistoryFileName(); - void onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name); - - void onAdHocNameCache(const LLAvatarName& av_name); - - //*TODO make private - static std::string generateHash(const std::set<LLUUID>& sorted_uuids); - LLUUID mSessionID; std::string mName; EInstantMessage mType; @@ -139,6 +132,11 @@ public: //if IM session is created for a voice call bool mStartedAsIMCall; + + private: + void onAdHocNameCache(const LLAvatarName& av_name); + + static std::string generateHash(const std::set<LLUUID>& sorted_uuids); }; @@ -293,12 +291,7 @@ private: /** * Add message to a list of message associated with session specified by session_id */ - bool addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text); - - /** - * Save an IM message into a file - */ - bool logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text); + bool addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text); }; class LLIMSessionObserver diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index f488b2ed1b..39e6f797a2 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -66,10 +66,13 @@ public: FILTERLINK_ONLY_LINKS // only show links }; - // REFACTOR: Change this to an enum. - static const U32 SO_DATE = 1; - static const U32 SO_FOLDERS_BY_NAME = 2; - static const U32 SO_SYSTEM_FOLDERS_TO_TOP = 4; + enum ESortOrderType + { + SO_NAME = 0, // Sort inventory by name + SO_DATE = 0x1, // Sort inventory by date + SO_FOLDERS_BY_NAME = 0x1 << 1, // Force folder sort by name + SO_SYSTEM_FOLDERS_TO_TOP = 0x1 << 2 // Force system folders to be on top + }; LLInventoryFilter(const std::string& name); virtual ~LLInventoryFilter(); diff --git a/indra/newview/lllocationhistory.h b/indra/newview/lllocationhistory.h index 188fbf1f9b..9fef42c5df 100644 --- a/indra/newview/lllocationhistory.h +++ b/indra/newview/lllocationhistory.h @@ -33,6 +33,7 @@ #include <string> #include <map> #include <boost/function.hpp> +#include <boost/signals2.hpp> class LLSD; /** diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 2df683861a..efc4e23838 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -32,6 +32,7 @@ #include "lltrans.h" #include "llviewercontrol.h" +#include "lldiriterator.h" #include "llinstantmessage.h" #include "llsingleton.h" // for LLSingleton @@ -602,7 +603,8 @@ std::string LLLogChat::oldLogFileName(std::string filename) //LL_INFOS("") << "Checking:" << directory << " for " << pattern << LL_ENDL;/* uncomment if you want to verify step, delete on commit */ std::vector<std::string> allfiles; - while (gDirUtilp->getNextFileInDir(directory, pattern, scanResult)) + LLDirIterator iter(directory, pattern); + while (iter.next(scanResult)) { //LL_INFOS("") << "Found :" << scanResult << LL_ENDL; allfiles.push_back(scanResult); diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index 36c5d12897..00de6a86e1 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -608,6 +608,7 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia request_params["channel"] = LLVersionInfo::getChannel(); request_params["id0"] = mSerialNumber; request_params["host_id"] = gSavedSettings.getString("HostID"); + request_params["extended_errors"] = true; // request message_id and message_args mRequestData.clear(); mRequestData["method"] = "login_to_simulator"; diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 5007f1c17a..b3ad9efeb2 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -68,7 +68,6 @@ LLMediaCtrl::Params::Params() : start_url("start_url"), border_visible("border_visible", true), ignore_ui_scale("ignore_ui_scale", true), - hide_loading("hide_loading", false), decouple_texture_size("decouple_texture_size", false), texture_width("texture_width", 1024), texture_height("texture_height", 1024), @@ -97,8 +96,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : mCurrentNavUrl( "" ), mStretchToFill( true ), mMaintainAspectRatio ( true ), - mHideLoading (false), - mHidingInitialLoad (false), mDecoupleTextureSize ( false ), mTextureWidth ( 1024 ), mTextureHeight ( 1024 ), @@ -121,8 +118,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : setBorderVisible(p.border_visible); - mHideLoading = p.hide_loading; - setDecoupleTextureSize(p.decouple_texture_size); setTextureSize(p.texture_width, p.texture_height); @@ -684,11 +679,6 @@ bool LLMediaCtrl::ensureMediaSourceExists() mMediaSource->clearCache(); mClearCache = false; } - - if(mHideLoading) - { - mHidingInitialLoad = true; - } } else { @@ -756,11 +746,11 @@ void LLMediaCtrl::draw() } } - if(mHidingInitialLoad) - { - // If we're hiding loading, don't draw at all. - draw_media = false; - } +// if(mHidingInitialLoad) +// { +// // If we're hiding loading, don't draw at all. +// draw_media = false; +// } bool background_visible = isBackgroundVisible(); bool background_opaque = isBackgroundOpaque(); diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index e20e918a2a..d9a58d56fe 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -35,6 +35,7 @@ #include "llappviewer.h" #include "llbufferstream.h" #include "llcurl.h" +#include "lldatapacker.h" #include "llfasttimer.h" #include "llfloatermodelpreview.h" #include "llfloaterperms.h" @@ -58,6 +59,8 @@ #include "llworld.h" #include "material_codes.h" #include "pipeline.h" +#include "llinventorymodel.h" +#include "llfoldertype.h" #ifndef LL_WINDOWS #include "netdb.h" @@ -82,6 +85,8 @@ U32 LLMeshRepository::sPeakKbps = 0; const U32 MAX_TEXTURE_UPLOAD_RETRIES = 5; +void dumpLLSDToFile(const LLSD& content, std::string filename); + std::string header_lod[] = { "lowest_lod", @@ -454,6 +459,69 @@ public: }; +class LLModelObjectUploadResponder: public LLCurl::Responder +{ + LLSD mObjectAsset; + LLMeshUploadThread* mThread; + +public: + LLModelObjectUploadResponder(LLMeshUploadThread* thread, const LLSD& object_asset): + mThread(thread), + mObjectAsset(object_asset) + { + } + + virtual void completedRaw(U32 status, const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer) + { + assert_main_thread(); + + llinfos << "completed" << llendl; + mThread->mPendingUploads--; + mThread->mFinished = true; + } +}; + +class LLWholeModelFeeResponder: public LLCurl::Responder +{ + LLMeshUploadThread* mThread; +public: + LLWholeModelFeeResponder(LLMeshUploadThread* thread): + mThread(thread) + { + } + virtual void completed(U32 status, + const std::string& reason, + const LLSD& content) + { + //assert_main_thread(); + llinfos << "completed" << llendl; + mThread->mPendingUploads--; + dumpLLSDToFile(content,"whole_model_response.xml"); + + mThread->mWholeModelUploadURL = content["uploader"].asString(); + } +}; + +class LLWholeModelUploadResponder: public LLCurl::Responder +{ + LLMeshUploadThread* mThread; +public: + LLWholeModelUploadResponder(LLMeshUploadThread* thread): + mThread(thread) + { + } + virtual void completed(U32 status, + const std::string& reason, + const LLSD& content) + { + //assert_main_thread(); + llinfos << "upload completed" << llendl; + mThread->mPendingUploads--; + dumpLLSDToFile(content,"whole_model_upload_response.xml"); + } +}; LLMeshRepoThread::LLMeshRepoThread() : LLThread("mesh repo", NULL) @@ -1216,6 +1284,7 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, mUploadObjectAssetCapability = gAgent.getRegion()->getCapability("UploadObjectAsset"); mNewInventoryCapability = gAgent.getRegion()->getCapability("NewFileAgentInventoryVariablePrice"); + mWholeModelFeeCapability = gAgent.getRegion()->getCapability("NewFileAgentInventory"); mOrigin += gAgent.getAtAxis() * scale.magVec(); } @@ -1307,17 +1376,47 @@ BOOL LLMeshUploadThread::isDiscarded() void LLMeshUploadThread::run() { - if(isDiscarded()) + if (gSavedSettings.getBOOL("MeshUseWholeModelUpload")) { - mFinished = true; - return ; + doWholeModelUpload(); } - - mCurlRequest = new LLCurlRequest(); + else + { + doIterativeUpload(); + } +} + +#if 1 +void dumpLLSDToFile(const LLSD& content, std::string filename) +{ + std::ofstream of(filename.c_str()); + LLSDSerialize::toPrettyXML(content,of); +} +#endif + +void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures) +{ + // TODO where do textures go? + + LLSD result; + LLSD res; + result["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT); + result["asset_type"] = "mesh"; + result["inventory_type"] = "object"; + result["name"] = "your name here"; + result["description"] = "your description here"; + + // TODO "optional" fields from the spec + + res["mesh_list"] = LLSD::emptyArray(); +// TODO Textures + //res["texture_list"] = LLSD::emptyArray(); + S32 mesh_num = 0; + S32 texture_num = 0; + std::set<LLViewerTexture* > textures; - //populate upload queue with relevant models for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter) { LLMeshUploadData data; @@ -1330,8 +1429,51 @@ void LLMeshUploadThread::run() data.mModel[i] = instance.mLOD[i]; } - uploadModel(data); + std::stringstream ostr; + + LLModel::Decomposition& decomp = + data.mModel[LLModel::LOD_PHYSICS].notNull() ? + data.mModel[LLModel::LOD_PHYSICS]->mPhysics : + data.mBaseModel->mPhysics; + + decomp.mBaseHull = mHullMap[data.mBaseModel]; + + LLSD mesh_header = LLModel::writeModel( + ostr, + data.mModel[LLModel::LOD_PHYSICS], + data.mModel[LLModel::LOD_HIGH], + data.mModel[LLModel::LOD_MEDIUM], + data.mModel[LLModel::LOD_LOW], + data.mModel[LLModel::LOD_IMPOSTOR], + decomp, + mUploadSkin, + mUploadJoints); + + data.mAssetData = ostr.str(); + + LLSD mesh_entry; + + LLVector3 pos, scale; + LLQuaternion rot; + LLMatrix4 transformation = instance.mTransform; + decomposeMeshMatrix(transformation,pos,rot,scale); + +#if 0 + mesh_entry["childpos"] = ll_sd_from_vector3(pos); + mesh_entry["childrot"] = ll_sd_from_quaternion(rot); + mesh_entry["scale"] = ll_sd_from_vector3(scale); +#endif + mesh_entry["position"] = ll_sd_from_vector3(LLVector3()); + mesh_entry["rotation"] = ll_sd_from_quaternion(rot); + mesh_entry["scale"] = ll_sd_from_vector3(scale); + + // TODO should be binary. + std::string str = ostr.str(); + mesh_entry["mesh_data"] = LLSD::Binary(str.begin(),str.end()); + + res["mesh_list"][mesh_num] = mesh_entry; + // TODO how do textures in the list map to textures in the meshes? if (mUploadTextures) { for (std::vector<LLImportMaterial>::iterator material_iter = instance.mMaterial.begin(); @@ -1341,13 +1483,56 @@ void LLMeshUploadThread::run() if (textures.find(material_iter->mDiffuseMap.get()) == textures.end()) { textures.insert(material_iter->mDiffuseMap.get()); - - LLTextureUploadData data(material_iter->mDiffuseMap.get(), material_iter->mDiffuseMapLabel); - uploadTexture(data); + + std::stringstream ostr; + if (include_textures) // otherwise data is blank. + { + LLTextureUploadData data(material_iter->mDiffuseMap.get(), material_iter->mDiffuseMapLabel); + if (!data.mTexture->isRawImageValid()) + { + data.mTexture->reloadRawImage(data.mTexture->getDiscardLevel()); + } + + LLPointer<LLImageJ2C> upload_file = + LLViewerTextureList::convertToUploadFile(data.mTexture->getRawImage()); + ostr.write((const char*) upload_file->getData(), upload_file->getDataSize()); + } + LLSD texture_entry; + texture_entry["texture_data"] = ostr.str(); + res["texture_list"][texture_num] = texture_entry; + texture_num++; } } } + mesh_num++; + } + + result["asset_resources"] = res; +#if 1 + dumpLLSDToFile(result,"whole_model.xml"); +#endif + + dest = result; +} + +void LLMeshUploadThread::doWholeModelUpload() +{ + mCurlRequest = new LLCurlRequest(); + + // Queue up models for hull generation (viewer-side) + for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter) + { + LLMeshUploadData data; + data.mBaseModel = iter->first; + + LLModelInstance& instance = *(iter->second.begin()); + + for (S32 i = 0; i < 5; i++) + { + data.mModel[i] = instance.mLOD[i]; + } + //queue up models for hull generation LLModel* physics = NULL; @@ -1378,6 +1563,87 @@ void LLMeshUploadThread::run() apr_sleep(100); } + bool do_include_textures = false; // not needed for initial cost/validation check. + LLSD model_data; + wholeModelToLLSD(model_data, do_include_textures); + + mPendingUploads++; + LLCurlRequest::headers_t headers; + mCurlRequest->post(mWholeModelFeeCapability, headers, model_data, + new LLWholeModelFeeResponder(this)); + + do + { + mCurlRequest->process(); + } while (mCurlRequest->getQueued() > 0); + + mCurlRequest->post(mWholeModelUploadURL, headers, model_data["asset_resources"], new LLWholeModelUploadResponder(this)); + + do + { + mCurlRequest->process(); + } while (mCurlRequest->getQueued() > 0); + + delete mCurlRequest; + mCurlRequest = NULL; + + // Currently a no-op. + mFinished = true; +} + +void LLMeshUploadThread::doIterativeUpload() +{ + if(isDiscarded()) + { + mFinished = true; + return ; + } + + mCurlRequest = new LLCurlRequest(); + + std::set<LLViewerTexture* > textures; + + //populate upload queue with relevant models + for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter) + { + LLMeshUploadData data; + data.mBaseModel = iter->first; + + LLModelInstance& instance = *(iter->second.begin()); + + for (S32 i = 0; i < 5; i++) + { + data.mModel[i] = instance.mLOD[i]; + } + + uploadModel(data); + + if (mUploadTextures) + { + for (std::vector<LLImportMaterial>::iterator material_iter = instance.mMaterial.begin(); + material_iter != instance.mMaterial.end(); ++material_iter) + { + + if (textures.find(material_iter->mDiffuseMap.get()) == textures.end()) + { + textures.insert(material_iter->mDiffuseMap.get()); + + LLTextureUploadData data(material_iter->mDiffuseMap.get(), material_iter->mDiffuseMapLabel); + uploadTexture(data); + } + } + } + + //queue up models for hull generation + DecompRequest* request = new DecompRequest(data.mModel[LLModel::LOD_HIGH], data.mBaseModel, this); + gMeshRepo.mDecompThread->submitRequest(request); + } + + while (!mPhysicsComplete) + { + apr_sleep(100); + } + //upload textures bool done = false; do @@ -1467,10 +1733,13 @@ void LLMeshUploadThread::run() if(!isDiscarded()) { - LLHTTPClient::post(url, object_asset, new LLHTTPClient::Responder()); + mPendingUploads++; + LLHTTPClient::post(url, object_asset, new LLModelObjectUploadResponder(this,object_asset)); + } + else + { + mFinished = true; } - - mFinished = true; } void LLMeshUploadThread::uploadModel(LLMeshUploadData& data) @@ -2761,6 +3030,47 @@ void LLMeshUploadThread::createObjects(LLMeshUploadData& data) } } +void LLMeshUploadThread::decomposeMeshMatrix(LLMatrix4& transformation, + LLVector3& result_pos, + LLQuaternion& result_rot, + LLVector3& result_scale) +{ + // check for reflection + BOOL reflected = (transformation.determinant() < 0); + + // compute position + LLVector3 position = LLVector3(0, 0, 0) * transformation; + + // compute scale + LLVector3 x_transformed = LLVector3(1, 0, 0) * transformation - position; + LLVector3 y_transformed = LLVector3(0, 1, 0) * transformation - position; + LLVector3 z_transformed = LLVector3(0, 0, 1) * transformation - position; + F32 x_length = x_transformed.normalize(); + F32 y_length = y_transformed.normalize(); + F32 z_length = z_transformed.normalize(); + LLVector3 scale = LLVector3(x_length, y_length, z_length); + + // adjust for "reflected" geometry + LLVector3 x_transformed_reflected = x_transformed; + if (reflected) + { + x_transformed_reflected *= -1.0; + } + + // compute rotation + LLMatrix3 rotation_matrix; + rotation_matrix.setRows(x_transformed_reflected, y_transformed, z_transformed); + LLQuaternion quat_rotation = rotation_matrix.quaternion(); + quat_rotation.normalize(); // the rotation_matrix might not have been orthoginal. make it so here. + LLVector3 euler_rotation; + quat_rotation.getEulerAngles(&euler_rotation.mV[VX], &euler_rotation.mV[VY], &euler_rotation.mV[VZ]); + + result_pos = position + mOrigin; + result_scale = scale; + result_rot = quat_rotation; +} + + LLSD LLMeshUploadThread::createObject(LLModelInstance& instance) { LLMatrix4 transformation = instance.mTransform; diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index 5983a282a2..f859e29c07 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -387,6 +387,8 @@ public: LLHost mHost; std::string mUploadObjectAssetCapability; std::string mNewInventoryCapability; + std::string mWholeModelFeeCapability; + std::string mWholeModelUploadURL; std::queue<LLMeshUploadData> mUploadQ; std::queue<LLMeshUploadData> mConfirmedQ; @@ -420,6 +422,16 @@ public: void preStart(); void discard() ; BOOL isDiscarded(); + + void doWholeModelUpload(); + void doIterativeUpload(); + + void wholeModelToLLSD(LLSD& dest, bool include_textures); + + void decomposeMeshMatrix(LLMatrix4& transformation, + LLVector3& result_pos, + LLQuaternion& result_rot, + LLVector3& result_scale); }; class LLMeshRepository diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp index 70d588db52..de90023f3b 100644 --- a/indra/newview/llnotificationhandlerutil.cpp +++ b/indra/newview/llnotificationhandlerutil.cpp @@ -27,13 +27,17 @@ #include "llviewerprecompiledheaders.h" // must be first include -#include "llnotificationhandler.h" +#include "llavatarnamecache.h" + +#include "llfloaterreg.h" #include "llnotifications.h" -#include "llimview.h" +#include "llurlaction.h" + #include "llagent.h" -#include "llfloaterreg.h" -#include "llnearbychat.h" #include "llimfloater.h" +#include "llimview.h" +#include "llnearbychat.h" +#include "llnotificationhandler.h" using namespace LLNotificationsUI; @@ -275,7 +279,11 @@ void LLHandlerUtil::logToIM(const EInstantMessage& session_type, { from = SYSTEM_FROM; } - LLIMModel::instance().logToFile(session_name, from, from_id, message); + + // Build a new format username or firstname_lastname for legacy names + // to use it for a history log filename. + std::string user_name = LLCacheName::buildUsername(session_name); + LLIMModel::instance().logToFile(user_name, from, from_id, message); } else { diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h index 026803584d..2d23753d46 100644 --- a/indra/newview/lloutputmonitorctrl.h +++ b/indra/newview/lloutputmonitorctrl.h @@ -31,6 +31,7 @@ #include "llview.h" #include "llmutelist.h" #include "llspeakingindicatormanager.h" +#include "lluiimage.h" class LLTextBox; class LLUICtrlFactory; diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 73c4722b82..d58a1cb663 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -36,6 +36,7 @@ #include "llimview.h" #include "llmenubutton.h" #include "llnotificationsutil.h" +#include "llslurl.h" #include "lltexteditor.h" #include "lltexturectrl.h" #include "lltoggleablemenu.h" diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index ec340dc258..1576ccccdf 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -44,6 +44,7 @@ #include "llnotificationsutil.h" #include "llscrolllistitem.h" #include "llspinctrl.h" +#include "llslurl.h" #include "lltextbox.h" #include "lltexteditor.h" #include "lltexturectrl.h" diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 3dbc637318..fbe331c7ab 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -42,6 +42,7 @@ #include "llscrolllistctrl.h" #include "llscrolllistitem.h" #include "llscrolllistcell.h" +#include "llslurl.h" #include "lltabcontainer.h" #include "lltextbox.h" #include "lltexteditor.h" diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 979d96ca0d..d0810d0772 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -34,6 +34,7 @@ #include "llmd5.h" #include "llsecondlifeurls.h" #include "v4color.h" +#include "llversionviewer.h" #include "llappviewer.h" #include "llbutton.h" @@ -100,58 +101,6 @@ public: } }; -LLLoginRefreshHandler gLoginRefreshHandler; - - -// helper class that trys to download a URL from a web site and calls a method -// on parent class indicating if the web server is working or not -class LLIamHereLogin : public LLHTTPClient::Responder -{ - private: - LLIamHereLogin( LLPanelLogin* parent ) : - mParent( parent ) - {} - - LLPanelLogin* mParent; - - public: - static boost::intrusive_ptr< LLIamHereLogin > build( LLPanelLogin* parent ) - { - return boost::intrusive_ptr< LLIamHereLogin >( new LLIamHereLogin( parent ) ); - }; - - virtual void setParent( LLPanelLogin* parentIn ) - { - mParent = parentIn; - }; - - // We don't actually expect LLSD back, so need to override completedRaw - virtual void completedRaw(U32 status, const std::string& reason, - const LLChannelDescriptors& channels, - const LLIOPipe::buffer_ptr_t& buffer) - { - completed(status, reason, LLSD()); // will call result() or error() - } - - virtual void result( const LLSD& content ) - { - if ( mParent ) - mParent->setSiteIsAlive( true ); - }; - - virtual void error( U32 status, const std::string& reason ) - { - if ( mParent ) - mParent->setSiteIsAlive( false ); - }; -}; - -// this is global and not a class member to keep crud out of the header file -namespace { - boost::intrusive_ptr< LLIamHereLogin > gResponsePtr = 0; -}; - - //--------------------------------------------------------------------------- // Public methods //--------------------------------------------------------------------------- @@ -163,7 +112,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, mLogoImage(), mCallback(callback), mCallbackData(cb_data), - mHtmlAvailable( TRUE ), mListener(new LLPanelLoginListener(this)) { setBackgroundVisible(FALSE); @@ -193,21 +141,11 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, buildFromFile( "panel_login.xml"); - // Legacy login web page is hidden under the menu bar. - // Adjust reg-in-client web browser widget to not be hidden. - if (gSavedSettings.getBOOL("RegInClient")) - { - reshape(rect.getWidth(), rect.getHeight() - MENU_BAR_HEIGHT); - } - else - { - reshape(rect.getWidth(), rect.getHeight()); - } + reshape(rect.getWidth(), rect.getHeight()); getChild<LLLineEditor>("password_edit")->setKeystrokeCallback(onPassKey, this); // change z sort of clickable text to be behind buttons - //sendChildToBack(getChildView("channel_text")); sendChildToBack(getChildView("forgot_password_text")); if(LLStartUp::getStartSLURL().getType() != LLSLURL::LOCATION) @@ -252,16 +190,10 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html"); web_browser->addObserver(this); - // Clear the browser's cache to avoid any potential for the cache messing up the login screen. - web_browser->clearCache(); - reshapeBrowser(); - // kick off a request to grab the url manually - gResponsePtr = LLIamHereLogin::build( this ); - - LLHTTPClient::head( LLGridManager::getInstance()->getLoginPage(), gResponsePtr ); - + loadLoginPage(); + // Show last logged in user favorites in "Start at" combo. addUsersWithFavoritesToUsername(); getChild<LLComboBox>("username_combo")->setTextChangedCallback(boost::bind(&LLPanelLogin::addFavoritesToStartLocation, this)); @@ -344,46 +276,10 @@ void LLPanelLogin::reshapeBrowser() reshape( rect.getWidth(), rect.getHeight(), 1 ); } -void LLPanelLogin::setSiteIsAlive( bool alive ) -{ - LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html"); - // if the contents of the site was retrieved - if ( alive ) - { - if ( web_browser ) - { - loadLoginPage(); - - // mark as available - mHtmlAvailable = TRUE; - } - } - else - // the site is not available (missing page, server down, other badness) - { - if ( web_browser ) - { - // hide browser control (revealing default one) - web_browser->setVisible( FALSE ); - - // mark as unavailable - mHtmlAvailable = FALSE; - } - } -} - - LLPanelLogin::~LLPanelLogin() { LLPanelLogin::sInstance = NULL; - // tell the responder we're not here anymore - if ( gResponsePtr ) - gResponsePtr->setParent( 0 ); - - //// We know we're done with the image, so be rid of it. - //gTextureList.deleteImage( mLogoImage ); - // Controls having keyboard focus by default // must reset it on destroy. (EXT-2748) gFocusMgr.setDefaultKeyboardFocus(NULL); @@ -406,22 +302,13 @@ void LLPanelLogin::draw() S32 width = getRect().getWidth(); S32 height = getRect().getHeight(); - if ( mHtmlAvailable ) - { - if (getChild<LLView>("login_widgets")->getVisible()) - { - // draw a background box in black - gl_rect_2d( 0, height - 264, width, 264, LLColor4::black ); - // draw the bottom part of the background image - // just the blue background to the native client UI - mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight()); - } - } - else + if (getChild<LLView>("login_widgets")->getVisible()) { - // the HTML login page is not available so default to the original screen - S32 offscreen_part = height / 3; - mLogoImage->draw(0, -offscreen_part, width, height+offscreen_part); + // draw a background box in black + gl_rect_2d( 0, height - 264, width, 264, LLColor4::black ); + // draw the bottom part of the background image + // just the blue background to the native client UI + mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight()); }; } glPopMatrix(); @@ -861,12 +748,20 @@ void LLPanelLogin::loadLoginPage() LLVersionInfo::getShortVersion().c_str(), LLVersionInfo::getBuild()); - char* curl_channel = curl_escape(LLVersionInfo::getChannel().c_str(), 0); + char* curl_channel ; char* curl_version = curl_escape(version.c_str(), 0); + if(strcmp(LLVersionInfo::getChannel().c_str(), LL_CHANNEL)) + { + curl_channel = curl_escape(LLVersionInfo::getChannel().c_str(), 0); + } + else //if LL_CHANNEL, direct it to "Second Life Beta Viewer". + { + curl_channel = curl_escape("Second Life Beta Viewer", 0); + } oStr << "&channel=" << curl_channel; oStr << "&version=" << curl_version; - + curl_free(curl_channel); curl_free(curl_version); @@ -880,20 +775,10 @@ void LLPanelLogin::loadLoginPage() oStr << "&os=" << os_info; curl_free(os_info); - gViewerWindow->setMenuBackgroundColor(false, !LLGridManager::getInstance()->isInProductionGrid()); - gLoginMenuBarView->setBackgroundColor(gMenuBarView->getBackgroundColor()); LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html"); - - // navigate to the "real" page - if (gSavedSettings.getBOOL("RegInClient")) - { - web_browser->setFocus(TRUE); - login_page = sInstance->getString("reg_in_client_url"); - web_browser->navigateTo(login_page, "text/html"); - } - else + if (web_browser->getCurrentNavUrl() != oStr.str()) { web_browser->navigateTo( oStr.str(), "text/html" ); } @@ -927,10 +812,6 @@ void LLPanelLogin::onClickConnect(void *) { if (sInstance && sInstance->mCallback) { - // tell the responder we're not here anymore - if ( gResponsePtr ) - gResponsePtr->setParent( 0 ); - // JC - Make sure the fields all get committed. sInstance->setFocus(FALSE); @@ -998,24 +879,6 @@ void LLPanelLogin::onClickConnect(void *) } } -/* -// static -bool LLPanelLogin::newAccountAlertCallback(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - if (0 == option) - { - llinfos << "Going to account creation URL" << llendl; - LLWeb::loadURLExternal( LLNotifications::instance().getGlobalString("CREATE_ACCOUNT_URL")); - } - else - { - sInstance->setFocus(TRUE); - } - return false; -} -*/ - // static void LLPanelLogin::onClickNewAccount(void*) { diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h index 9cc5e3456a..11273453ba 100644 --- a/indra/newview/llpanellogin.h +++ b/indra/newview/llpanellogin.h @@ -89,7 +89,6 @@ private: void addUsersWithFavoritesToUsername(); static void onClickConnect(void*); static void onClickNewAccount(void*); -// static bool newAccountAlertCallback(const LLSD& notification, const LLSD& response); static void onClickVersion(void*); static void onClickForgotPassword(void*); static void onClickHelp(void*); @@ -114,7 +113,6 @@ private: static LLPanelLogin* sInstance; static BOOL sCapslockDidNotification; - BOOL mHtmlAvailable; }; std::string load_password_from_disk(void); diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 85c57b4900..bc4998dd0c 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -139,6 +139,7 @@ BOOL LLPanelMainInventory::postBuild() mActivePanel->getFilter()->markDefault(); mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2)); + mResortActivePanel = true; } LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items"); if (recent_items_panel) @@ -528,6 +529,17 @@ void LLPanelMainInventory::draw() { mFilterEditor->setText(mFilterSubString); } + if (mActivePanel && mResortActivePanel) + { + // EXP-756: Force resorting of the list the first time we draw the list: + // In the case of date sorting, we don't have enough information at initialization time + // to correctly sort the folders. Later manual resort doesn't do anything as the order value is + // set correctly. The workaround is to reset the order to alphabetical (or anything) then to the correct order. + U32 order = mActivePanel->getSortOrder(); + mActivePanel->setSortOrder(LLInventoryFilter::SO_NAME); + mActivePanel->setSortOrder(order); + mResortActivePanel = false; + } LLPanel::draw(); updateItemcountText(); } diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index c2b78ff9ea..2b2ee1c0c9 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -121,6 +121,7 @@ private: LLTabContainer* mFilterTabs; LLHandle<LLFloater> mFinderHandle; LLInventoryPanel* mActivePanel; + bool mResortActivePanel; LLSaveFolderState* mSavedFolderState; std::string mFilterText; std::string mFilterSubString; diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index 204c146f3c..74f48907d2 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -1,1999 +1,1999 @@ -/** - * @file llpanelobject.cpp - * @brief Object editing (position, scale, etc.) in the tools floater - * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, 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$ - */ - -#include "llviewerprecompiledheaders.h" - -// file include -#include "llpanelobject.h" - -// linden library includes -#include "lleconomy.h" -#include "llerror.h" -#include "llfontgl.h" -#include "llpermissionsflags.h" -#include "llstring.h" -#include "llvolume.h" -#include "m3math.h" - -// project includes -#include "llagent.h" -#include "llbutton.h" -#include "llcheckboxctrl.h" -#include "llcolorswatch.h" -#include "llcombobox.h" -#include "llfocusmgr.h" -#include "llmanipscale.h" -#include "llpreviewscript.h" -#include "llresmgr.h" -#include "llselectmgr.h" -#include "llspinctrl.h" -#include "lltexturectrl.h" -#include "lltextbox.h" -#include "lltool.h" -#include "lltoolcomp.h" -#include "lltoolmgr.h" -#include "llui.h" -#include "llviewerobject.h" -#include "llviewerregion.h" -#include "llviewerwindow.h" -#include "llvovolume.h" -#include "llworld.h" -#include "pipeline.h" -#include "llviewercontrol.h" -#include "lluictrlfactory.h" -//#include "llfirstuse.h" - -#include "lldrawpool.h" - -// -// Constants -// -enum { - MI_BOX, - MI_CYLINDER, - MI_PRISM, - MI_SPHERE, - MI_TORUS, - MI_TUBE, - MI_RING, - MI_SCULPT, - MI_NONE, - MI_VOLUME_COUNT -}; - -enum { - MI_HOLE_SAME, - MI_HOLE_CIRCLE, - MI_HOLE_SQUARE, - MI_HOLE_TRIANGLE, - MI_HOLE_COUNT -}; - -//static const std::string LEGACY_FULLBRIGHT_DESC =LLTrans::getString("Fullbright"); - -BOOL LLPanelObject::postBuild() -{ - setMouseOpaque(FALSE); - - //-------------------------------------------------------- - // Top - //-------------------------------------------------------- - - // Lock checkbox - mCheckLock = getChild<LLCheckBoxCtrl>("checkbox locked"); - childSetCommitCallback("checkbox locked",onCommitLock,this); - - // Physical checkbox - mCheckPhysics = getChild<LLCheckBoxCtrl>("Physical Checkbox Ctrl"); - childSetCommitCallback("Physical Checkbox Ctrl",onCommitPhysics,this); - - // Temporary checkbox - mCheckTemporary = getChild<LLCheckBoxCtrl>("Temporary Checkbox Ctrl"); - childSetCommitCallback("Temporary Checkbox Ctrl",onCommitTemporary,this); - - // Phantom checkbox - mCheckPhantom = getChild<LLCheckBoxCtrl>("Phantom Checkbox Ctrl"); - childSetCommitCallback("Phantom Checkbox Ctrl",onCommitPhantom,this); - - - // Position - mLabelPosition = getChild<LLTextBox>("label position"); - mCtrlPosX = getChild<LLSpinCtrl>("Pos X"); - childSetCommitCallback("Pos X",onCommitPosition,this); - mCtrlPosY = getChild<LLSpinCtrl>("Pos Y"); - childSetCommitCallback("Pos Y",onCommitPosition,this); - mCtrlPosZ = getChild<LLSpinCtrl>("Pos Z"); - childSetCommitCallback("Pos Z",onCommitPosition,this); - - // Scale - mLabelSize = getChild<LLTextBox>("label size"); - mCtrlScaleX = getChild<LLSpinCtrl>("Scale X"); - childSetCommitCallback("Scale X",onCommitScale,this); - - // Scale Y - mCtrlScaleY = getChild<LLSpinCtrl>("Scale Y"); - childSetCommitCallback("Scale Y",onCommitScale,this); - - // Scale Z - mCtrlScaleZ = getChild<LLSpinCtrl>("Scale Z"); - childSetCommitCallback("Scale Z",onCommitScale,this); - - // Rotation - mLabelRotation = getChild<LLTextBox>("label rotation"); - mCtrlRotX = getChild<LLSpinCtrl>("Rot X"); - childSetCommitCallback("Rot X",onCommitRotation,this); - mCtrlRotY = getChild<LLSpinCtrl>("Rot Y"); - childSetCommitCallback("Rot Y",onCommitRotation,this); - mCtrlRotZ = getChild<LLSpinCtrl>("Rot Z"); - childSetCommitCallback("Rot Z",onCommitRotation,this); - - //-------------------------------------------------------- - - // Base Type - mComboBaseType = getChild<LLComboBox>("comboBaseType"); - childSetCommitCallback("comboBaseType",onCommitParametric,this); - - // Cut - mLabelCut = getChild<LLTextBox>("text cut"); - mSpinCutBegin = getChild<LLSpinCtrl>("cut begin"); - childSetCommitCallback("cut begin",onCommitParametric,this); - mSpinCutBegin->setValidateBeforeCommit( precommitValidate ); - mSpinCutEnd = getChild<LLSpinCtrl>("cut end"); - childSetCommitCallback("cut end",onCommitParametric,this); - mSpinCutEnd->setValidateBeforeCommit( &precommitValidate ); - - // Hollow / Skew - mLabelHollow = getChild<LLTextBox>("text hollow"); - mLabelSkew = getChild<LLTextBox>("text skew"); - mSpinHollow = getChild<LLSpinCtrl>("Scale 1"); - childSetCommitCallback("Scale 1",onCommitParametric,this); - mSpinHollow->setValidateBeforeCommit( &precommitValidate ); - mSpinSkew = getChild<LLSpinCtrl>("Skew"); - childSetCommitCallback("Skew",onCommitParametric,this); - mSpinSkew->setValidateBeforeCommit( &precommitValidate ); - mLabelHoleType = getChild<LLTextBox>("Hollow Shape"); - - // Hole Type - mComboHoleType = getChild<LLComboBox>("hole"); - childSetCommitCallback("hole",onCommitParametric,this); - - // Twist - mLabelTwist = getChild<LLTextBox>("text twist"); - mSpinTwistBegin = getChild<LLSpinCtrl>("Twist Begin"); - childSetCommitCallback("Twist Begin",onCommitParametric,this); - mSpinTwistBegin->setValidateBeforeCommit( precommitValidate ); - mSpinTwist = getChild<LLSpinCtrl>("Twist End"); - childSetCommitCallback("Twist End",onCommitParametric,this); - mSpinTwist->setValidateBeforeCommit( &precommitValidate ); - - // Scale - mSpinScaleX = getChild<LLSpinCtrl>("Taper Scale X"); - childSetCommitCallback("Taper Scale X",onCommitParametric,this); - mSpinScaleX->setValidateBeforeCommit( &precommitValidate ); - mSpinScaleY = getChild<LLSpinCtrl>("Taper Scale Y"); - childSetCommitCallback("Taper Scale Y",onCommitParametric,this); - mSpinScaleY->setValidateBeforeCommit( &precommitValidate ); - - // Shear - mLabelShear = getChild<LLTextBox>("text topshear"); - mSpinShearX = getChild<LLSpinCtrl>("Shear X"); - childSetCommitCallback("Shear X",onCommitParametric,this); - mSpinShearX->setValidateBeforeCommit( &precommitValidate ); - mSpinShearY = getChild<LLSpinCtrl>("Shear Y"); - childSetCommitCallback("Shear Y",onCommitParametric,this); - mSpinShearY->setValidateBeforeCommit( &precommitValidate ); - - // Path / Profile - mCtrlPathBegin = getChild<LLSpinCtrl>("Path Limit Begin"); - childSetCommitCallback("Path Limit Begin",onCommitParametric,this); - mCtrlPathBegin->setValidateBeforeCommit( &precommitValidate ); - mCtrlPathEnd = getChild<LLSpinCtrl>("Path Limit End"); - childSetCommitCallback("Path Limit End",onCommitParametric,this); - mCtrlPathEnd->setValidateBeforeCommit( &precommitValidate ); - - // Taper - mLabelTaper = getChild<LLTextBox>("text taper2"); - mSpinTaperX = getChild<LLSpinCtrl>("Taper X"); - childSetCommitCallback("Taper X",onCommitParametric,this); - mSpinTaperX->setValidateBeforeCommit( precommitValidate ); - mSpinTaperY = getChild<LLSpinCtrl>("Taper Y"); - childSetCommitCallback("Taper Y",onCommitParametric,this); - mSpinTaperY->setValidateBeforeCommit( precommitValidate ); - - // Radius Offset / Revolutions - mLabelRadiusOffset = getChild<LLTextBox>("text radius delta"); - mLabelRevolutions = getChild<LLTextBox>("text revolutions"); - mSpinRadiusOffset = getChild<LLSpinCtrl>("Radius Offset"); - childSetCommitCallback("Radius Offset",onCommitParametric,this); - mSpinRadiusOffset->setValidateBeforeCommit( &precommitValidate ); - mSpinRevolutions = getChild<LLSpinCtrl>("Revolutions"); - childSetCommitCallback("Revolutions",onCommitParametric,this); - mSpinRevolutions->setValidateBeforeCommit( &precommitValidate ); - - // Sculpt - mCtrlSculptTexture = getChild<LLTextureCtrl>("sculpt texture control"); - if (mCtrlSculptTexture) - { - mCtrlSculptTexture->setDefaultImageAssetID(LLUUID(SCULPT_DEFAULT_TEXTURE)); - mCtrlSculptTexture->setCommitCallback( boost::bind(&LLPanelObject::onCommitSculpt, this, _2 )); - mCtrlSculptTexture->setOnCancelCallback( boost::bind(&LLPanelObject::onCancelSculpt, this, _2 )); - mCtrlSculptTexture->setOnSelectCallback( boost::bind(&LLPanelObject::onSelectSculpt, this, _2 )); - mCtrlSculptTexture->setDropCallback( boost::bind(&LLPanelObject::onDropSculpt, this, _2 )); - // Don't allow (no copy) or (no transfer) textures to be selected during immediate mode - mCtrlSculptTexture->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER); - // Allow any texture to be used during non-immediate mode. - mCtrlSculptTexture->setNonImmediateFilterPermMask(PERM_NONE); - LLAggregatePermissions texture_perms; - if (LLSelectMgr::getInstance()->selectGetAggregateTexturePermissions(texture_perms)) - { - BOOL can_copy = - texture_perms.getValue(PERM_COPY) == LLAggregatePermissions::AP_EMPTY || - texture_perms.getValue(PERM_COPY) == LLAggregatePermissions::AP_ALL; - BOOL can_transfer = - texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_EMPTY || - texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_ALL; - mCtrlSculptTexture->setCanApplyImmediately(can_copy && can_transfer); - } - else - { - mCtrlSculptTexture->setCanApplyImmediately(FALSE); - } - } - - mLabelSculptType = getChild<LLTextBox>("label sculpt type"); - mCtrlSculptType = getChild<LLComboBox>("sculpt type control"); - childSetCommitCallback("sculpt type control", onCommitSculptType, this); - mCtrlSculptMirror = getChild<LLCheckBoxCtrl>("sculpt mirror control"); - childSetCommitCallback("sculpt mirror control", onCommitSculptType, this); - mCtrlSculptInvert = getChild<LLCheckBoxCtrl>("sculpt invert control"); - childSetCommitCallback("sculpt invert control", onCommitSculptType, this); - - // Start with everyone disabled - clearCtrls(); - - return TRUE; -} - -LLPanelObject::LLPanelObject() -: LLPanel(), - mIsPhysical(FALSE), - mIsTemporary(FALSE), - mIsPhantom(FALSE), - mCastShadows(TRUE), - mSelectedType(MI_BOX), - mSculptTextureRevert(LLUUID::null), - mSculptTypeRevert(0) -{ -} - - -LLPanelObject::~LLPanelObject() -{ - // Children all cleaned up by default view destructor. -} - -void LLPanelObject::getState( ) -{ - LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject(); - LLViewerObject* root_objectp = objectp; - if(!objectp) - { - objectp = LLSelectMgr::getInstance()->getSelection()->getFirstObject(); - // *FIX: shouldn't we just keep the child? - if (objectp) - { - LLViewerObject* parentp = objectp->getRootEdit(); - - if (parentp) - { - root_objectp = parentp; - } - else - { - root_objectp = objectp; - } - } - } - - LLVOVolume *volobjp = NULL; - if ( objectp && (objectp->getPCode() == LL_PCODE_VOLUME)) - { - volobjp = (LLVOVolume *)objectp; - } - - if( !objectp ) - { - //forfeit focus - if (gFocusMgr.childHasKeyboardFocus(this)) - { - gFocusMgr.setKeyboardFocus(NULL); - } - - // Disable all text input fields - clearCtrls(); - return; - } - - // can move or rotate only linked group with move permissions, or sub-object with move and modify perms - BOOL enable_move = objectp->permMove() && !objectp->isAttachment() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts")); - BOOL enable_scale = objectp->permMove() && objectp->permModify(); - BOOL enable_rotate = objectp->permMove() && ( (objectp->permModify() && !objectp->isAttachment()) || !gSavedSettings.getBOOL("EditLinkedParts")); - - S32 selected_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount(); - BOOL single_volume = (LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME )) - && (selected_count == 1); - - if (LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() > 1) - { - enable_move = FALSE; - enable_scale = FALSE; - enable_rotate = FALSE; - } - - LLVector3 vec; - if (enable_move) - { - vec = objectp->getPositionEdit(); - mCtrlPosX->set( vec.mV[VX] ); - mCtrlPosY->set( vec.mV[VY] ); - mCtrlPosZ->set( vec.mV[VZ] ); - } - else - { - mCtrlPosX->clear(); - mCtrlPosY->clear(); - mCtrlPosZ->clear(); - } - - - mLabelPosition->setEnabled( enable_move ); - mCtrlPosX->setEnabled(enable_move); - mCtrlPosY->setEnabled(enable_move); - mCtrlPosZ->setEnabled(enable_move); - - if (enable_scale) - { - vec = objectp->getScale(); - mCtrlScaleX->set( vec.mV[VX] ); - mCtrlScaleY->set( vec.mV[VY] ); - mCtrlScaleZ->set( vec.mV[VZ] ); - } - else - { - mCtrlScaleX->clear(); - mCtrlScaleY->clear(); - mCtrlScaleZ->clear(); - } - - mLabelSize->setEnabled( enable_scale ); - mCtrlScaleX->setEnabled( enable_scale ); - mCtrlScaleY->setEnabled( enable_scale ); - mCtrlScaleZ->setEnabled( enable_scale ); - - LLQuaternion object_rot = objectp->getRotationEdit(); - object_rot.getEulerAngles(&(mCurEulerDegrees.mV[VX]), &(mCurEulerDegrees.mV[VY]), &(mCurEulerDegrees.mV[VZ])); - mCurEulerDegrees *= RAD_TO_DEG; - mCurEulerDegrees.mV[VX] = fmod(llround(mCurEulerDegrees.mV[VX], OBJECT_ROTATION_PRECISION) + 360.f, 360.f); - mCurEulerDegrees.mV[VY] = fmod(llround(mCurEulerDegrees.mV[VY], OBJECT_ROTATION_PRECISION) + 360.f, 360.f); - mCurEulerDegrees.mV[VZ] = fmod(llround(mCurEulerDegrees.mV[VZ], OBJECT_ROTATION_PRECISION) + 360.f, 360.f); - - if (enable_rotate) - { - mCtrlRotX->set( mCurEulerDegrees.mV[VX] ); - mCtrlRotY->set( mCurEulerDegrees.mV[VY] ); - mCtrlRotZ->set( mCurEulerDegrees.mV[VZ] ); - } - else - { - mCtrlRotX->clear(); - mCtrlRotY->clear(); - mCtrlRotZ->clear(); - } - - mLabelRotation->setEnabled( enable_rotate ); - mCtrlRotX->setEnabled( enable_rotate ); - mCtrlRotY->setEnabled( enable_rotate ); - mCtrlRotZ->setEnabled( enable_rotate ); - - BOOL owners_identical; - LLUUID owner_id; - std::string owner_name; - owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name); - - // BUG? Check for all objects being editable? - S32 roots_selected = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount(); - BOOL editable = root_objectp->permModify(); - - // Select Single Message - getChildView("select_single")->setVisible( FALSE); - getChildView("edit_object")->setVisible( FALSE); - if (!editable || single_volume || selected_count <= 1) - { - getChildView("edit_object")->setVisible( TRUE); - getChildView("edit_object")->setEnabled(TRUE); - } - else - { - getChildView("select_single")->setVisible( TRUE); - getChildView("select_single")->setEnabled(TRUE); - } - // Lock checkbox - only modifiable if you own the object. - BOOL self_owned = (gAgent.getID() == owner_id); - mCheckLock->setEnabled( roots_selected > 0 && self_owned ); - - // More lock and debit checkbox - get the values - BOOL valid; - U32 owner_mask_on; - U32 owner_mask_off; - valid = LLSelectMgr::getInstance()->selectGetPerm(PERM_OWNER, &owner_mask_on, &owner_mask_off); - - if(valid) - { - if(owner_mask_on & PERM_MOVE) - { - // owner can move, so not locked - mCheckLock->set(FALSE); - mCheckLock->setTentative(FALSE); - } - else if(owner_mask_off & PERM_MOVE) - { - // owner can't move, so locked - mCheckLock->set(TRUE); - mCheckLock->setTentative(FALSE); - } - else - { - // some locked, some not locked - mCheckLock->set(FALSE); - mCheckLock->setTentative(TRUE); - } - } - - BOOL is_flexible = volobjp && volobjp->isFlexible(); - - // Physics checkbox - mIsPhysical = root_objectp->usePhysics(); - mCheckPhysics->set( mIsPhysical ); - mCheckPhysics->setEnabled( roots_selected>0 - && (editable || gAgent.isGodlike()) - && !is_flexible); - - mIsTemporary = root_objectp->flagTemporaryOnRez(); - mCheckTemporary->set( mIsTemporary ); - mCheckTemporary->setEnabled( roots_selected>0 && editable ); - - mIsPhantom = root_objectp->flagPhantom(); - mCheckPhantom->set( mIsPhantom ); - mCheckPhantom->setEnabled( roots_selected>0 && editable && !is_flexible ); - - -#if 0 // 1.9.2 - mCastShadows = root_objectp->flagCastShadows(); - mCheckCastShadows->set( mCastShadows ); - mCheckCastShadows->setEnabled( roots_selected==1 && editable ); -#endif - - //---------------------------------------------------------------------------- - - S32 selected_item = MI_BOX; - S32 selected_hole = MI_HOLE_SAME; - BOOL enabled = FALSE; - BOOL hole_enabled = FALSE; - F32 scale_x=1.f, scale_y=1.f; - BOOL isMesh = FALSE; - - if( !objectp || !objectp->getVolume() || !editable || !single_volume) - { - // Clear out all geometry fields. - mComboBaseType->clear(); - mSpinHollow->clear(); - mSpinCutBegin->clear(); - mSpinCutEnd->clear(); - mCtrlPathBegin->clear(); - mCtrlPathEnd->clear(); - mSpinScaleX->clear(); - mSpinScaleY->clear(); - mSpinTwist->clear(); - mSpinTwistBegin->clear(); - mComboHoleType->clear(); - mSpinShearX->clear(); - mSpinShearY->clear(); - mSpinTaperX->clear(); - mSpinTaperY->clear(); - mSpinRadiusOffset->clear(); - mSpinRevolutions->clear(); - mSpinSkew->clear(); - - mSelectedType = MI_NONE; - } - else - { - // Only allowed to change these parameters for objects - // that you have permissions on AND are not attachments. - enabled = root_objectp->permModify(); - - // Volume type - const LLVolumeParams &volume_params = objectp->getVolume()->getParams(); - U8 path = volume_params.getPathParams().getCurveType(); - U8 profile_and_hole = volume_params.getProfileParams().getCurveType(); - U8 profile = profile_and_hole & LL_PCODE_PROFILE_MASK; - U8 hole = profile_and_hole & LL_PCODE_HOLE_MASK; - - // Scale goes first so we can differentiate between a sphere and a torus, - // which have the same profile and path types. - - // Scale - scale_x = volume_params.getRatioX(); - scale_y = volume_params.getRatioY(); - - BOOL linear_path = (path == LL_PCODE_PATH_LINE) || (path == LL_PCODE_PATH_FLEXIBLE); - if ( linear_path && profile == LL_PCODE_PROFILE_CIRCLE ) - { - selected_item = MI_CYLINDER; - } - else if ( linear_path && profile == LL_PCODE_PROFILE_SQUARE ) - { - selected_item = MI_BOX; - } - else if ( linear_path && profile == LL_PCODE_PROFILE_ISOTRI ) - { - selected_item = MI_PRISM; - } - else if ( linear_path && profile == LL_PCODE_PROFILE_EQUALTRI ) - { - selected_item = MI_PRISM; - } - else if ( linear_path && profile == LL_PCODE_PROFILE_RIGHTTRI ) - { - selected_item = MI_PRISM; - } - else if (path == LL_PCODE_PATH_FLEXIBLE) // shouldn't happen - { - selected_item = MI_CYLINDER; // reasonable default - } - else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_CIRCLE && scale_y > 0.75f) - { - selected_item = MI_SPHERE; - } - else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_CIRCLE && scale_y <= 0.75f) - { - selected_item = MI_TORUS; - } - else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_CIRCLE_HALF) - { - selected_item = MI_SPHERE; - } - else if ( path == LL_PCODE_PATH_CIRCLE2 && profile == LL_PCODE_PROFILE_CIRCLE ) - { - // Spirals aren't supported. Make it into a sphere. JC - selected_item = MI_SPHERE; - } - else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_EQUALTRI ) - { - selected_item = MI_RING; - } - else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_SQUARE && scale_y <= 0.75f) - { - selected_item = MI_TUBE; - } - else - { - llinfos << "Unknown path " << (S32) path << " profile " << (S32) profile << " in getState" << llendl; - selected_item = MI_BOX; - } - - - if (objectp->getParameterEntryInUse(LLNetworkData::PARAMS_SCULPT)) - { - selected_item = MI_SCULPT; - //LLFirstUse::useSculptedPrim(); - } - - - mComboBaseType ->setCurrentByIndex( selected_item ); - mSelectedType = selected_item; - - // Grab S path - F32 begin_s = volume_params.getBeginS(); - F32 end_s = volume_params.getEndS(); - - // Compute cut and advanced cut from S and T - F32 begin_t = volume_params.getBeginT(); - F32 end_t = volume_params.getEndT(); - - // Hollowness - F32 hollow = volume_params.getHollow(); - mSpinHollow->set( 100.f * hollow ); - - // All hollow objects allow a shape to be selected. - if (hollow > 0.f) - { - switch (hole) - { - case LL_PCODE_HOLE_CIRCLE: - selected_hole = MI_HOLE_CIRCLE; - break; - case LL_PCODE_HOLE_SQUARE: - selected_hole = MI_HOLE_SQUARE; - break; - case LL_PCODE_HOLE_TRIANGLE: - selected_hole = MI_HOLE_TRIANGLE; - break; - case LL_PCODE_HOLE_SAME: - default: - selected_hole = MI_HOLE_SAME; - break; - } - mComboHoleType->setCurrentByIndex( selected_hole ); - hole_enabled = enabled; - } - else - { - mComboHoleType->setCurrentByIndex( MI_HOLE_SAME ); - hole_enabled = FALSE; - } - - // Cut interpretation varies based on base object type - F32 cut_begin, cut_end, adv_cut_begin, adv_cut_end; - - if ( selected_item == MI_SPHERE || selected_item == MI_TORUS || - selected_item == MI_TUBE || selected_item == MI_RING ) - { - cut_begin = begin_t; - cut_end = end_t; - adv_cut_begin = begin_s; - adv_cut_end = end_s; - } - else - { - cut_begin = begin_s; - cut_end = end_s; - adv_cut_begin = begin_t; - adv_cut_end = end_t; - } - - mSpinCutBegin ->set( cut_begin ); - mSpinCutEnd ->set( cut_end ); - mCtrlPathBegin ->set( adv_cut_begin ); - mCtrlPathEnd ->set( adv_cut_end ); - - // Twist - F32 twist = volume_params.getTwist(); - F32 twist_begin = volume_params.getTwistBegin(); - // Check the path type for conversion. - if (path == LL_PCODE_PATH_LINE || path == LL_PCODE_PATH_FLEXIBLE) - { - twist *= OBJECT_TWIST_LINEAR_MAX; - twist_begin *= OBJECT_TWIST_LINEAR_MAX; - } - else - { - twist *= OBJECT_TWIST_MAX; - twist_begin *= OBJECT_TWIST_MAX; - } - - mSpinTwist ->set( twist ); - mSpinTwistBegin ->set( twist_begin ); - - // Shear - F32 shear_x = volume_params.getShearX(); - F32 shear_y = volume_params.getShearY(); - mSpinShearX->set( shear_x ); - mSpinShearY->set( shear_y ); - - // Taper - F32 taper_x = volume_params.getTaperX(); - F32 taper_y = volume_params.getTaperY(); - mSpinTaperX->set( taper_x ); - mSpinTaperY->set( taper_y ); - - // Radius offset. - F32 radius_offset = volume_params.getRadiusOffset(); - // Limit radius offset, based on taper and hole size y. - F32 radius_mag = fabs(radius_offset); - F32 hole_y_mag = fabs(scale_y); - F32 taper_y_mag = fabs(taper_y); - // Check to see if the taper effects us. - if ( (radius_offset > 0.f && taper_y < 0.f) || - (radius_offset < 0.f && taper_y > 0.f) ) - { - // The taper does not help increase the radius offset range. - taper_y_mag = 0.f; - } - F32 max_radius_mag = 1.f - hole_y_mag * (1.f - taper_y_mag) / (1.f - hole_y_mag); - // Enforce the maximum magnitude. - if (radius_mag > max_radius_mag) - { - // Check radius offset sign. - if (radius_offset < 0.f) - { - radius_offset = -max_radius_mag; - } - else - { - radius_offset = max_radius_mag; - } - } - mSpinRadiusOffset->set( radius_offset); - - // Revolutions - F32 revolutions = volume_params.getRevolutions(); - mSpinRevolutions->set( revolutions ); - - // Skew - F32 skew = volume_params.getSkew(); - // Limit skew, based on revolutions hole size x. - F32 skew_mag= fabs(skew); - F32 min_skew_mag = 1.0f - 1.0f / (revolutions * scale_x + 1.0f); - // Discontinuity; A revolution of 1 allows skews below 0.5. - if ( fabs(revolutions - 1.0f) < 0.001) - min_skew_mag = 0.0f; - - // Clip skew. - if (skew_mag < min_skew_mag) - { - // Check skew sign. - if (skew < 0.0f) - { - skew = -min_skew_mag; - } - else - { - skew = min_skew_mag; - } - } - mSpinSkew->set( skew ); - } - - // Compute control visibility, label names, and twist range. - // Start with defaults. - BOOL cut_visible = TRUE; - BOOL hollow_visible = TRUE; - BOOL top_size_x_visible = TRUE; - BOOL top_size_y_visible = TRUE; - BOOL top_shear_x_visible = TRUE; - BOOL top_shear_y_visible = TRUE; - BOOL twist_visible = TRUE; - BOOL advanced_cut_visible = FALSE; - BOOL taper_visible = FALSE; - BOOL skew_visible = FALSE; - BOOL radius_offset_visible = FALSE; - BOOL revolutions_visible = FALSE; - BOOL sculpt_texture_visible = FALSE; - F32 twist_min = OBJECT_TWIST_LINEAR_MIN; - F32 twist_max = OBJECT_TWIST_LINEAR_MAX; - F32 twist_inc = OBJECT_TWIST_LINEAR_INC; - - BOOL advanced_is_dimple = FALSE; - BOOL advanced_is_slice = FALSE; - BOOL size_is_hole = FALSE; - - // Tune based on overall volume type - switch (selected_item) - { - case MI_SPHERE: - top_size_x_visible = FALSE; - top_size_y_visible = FALSE; - top_shear_x_visible = FALSE; - top_shear_y_visible = FALSE; - //twist_visible = FALSE; - advanced_cut_visible = TRUE; - advanced_is_dimple = TRUE; - twist_min = OBJECT_TWIST_MIN; - twist_max = OBJECT_TWIST_MAX; - twist_inc = OBJECT_TWIST_INC; - break; - - case MI_TORUS: - case MI_TUBE: - case MI_RING: - //top_size_x_visible = FALSE; - //top_size_y_visible = FALSE; - size_is_hole = TRUE; - skew_visible = TRUE; - advanced_cut_visible = TRUE; - taper_visible = TRUE; - radius_offset_visible = TRUE; - revolutions_visible = TRUE; - twist_min = OBJECT_TWIST_MIN; - twist_max = OBJECT_TWIST_MAX; - twist_inc = OBJECT_TWIST_INC; - - break; - - case MI_SCULPT: - cut_visible = FALSE; - hollow_visible = FALSE; - twist_visible = FALSE; - top_size_x_visible = FALSE; - top_size_y_visible = FALSE; - top_shear_x_visible = FALSE; - top_shear_y_visible = FALSE; - skew_visible = FALSE; - advanced_cut_visible = FALSE; - taper_visible = FALSE; - radius_offset_visible = FALSE; - revolutions_visible = FALSE; - sculpt_texture_visible = TRUE; - - break; - - case MI_BOX: - advanced_cut_visible = TRUE; - advanced_is_slice = TRUE; - break; - - case MI_CYLINDER: - advanced_cut_visible = TRUE; - advanced_is_slice = TRUE; - break; - - case MI_PRISM: - advanced_cut_visible = TRUE; - advanced_is_slice = TRUE; - break; - - default: - break; - } - - // Check if we need to change top size/hole size params. - switch (selected_item) - { - case MI_SPHERE: - case MI_TORUS: - case MI_TUBE: - case MI_RING: - mSpinScaleX->set( scale_x ); - mSpinScaleY->set( scale_y ); - mSpinScaleX->setMinValue(OBJECT_MIN_HOLE_SIZE); - mSpinScaleX->setMaxValue(OBJECT_MAX_HOLE_SIZE_X); - mSpinScaleY->setMinValue(OBJECT_MIN_HOLE_SIZE); - mSpinScaleY->setMaxValue(OBJECT_MAX_HOLE_SIZE_Y); - break; - default: - if (editable) - { - mSpinScaleX->set( 1.f - scale_x ); - mSpinScaleY->set( 1.f - scale_y ); - mSpinScaleX->setMinValue(-1.f); - mSpinScaleX->setMaxValue(1.f); - mSpinScaleY->setMinValue(-1.f); - mSpinScaleY->setMaxValue(1.f); - } - break; - } - - // Check if we need to limit the hollow based on the hole type. - if ( selected_hole == MI_HOLE_SQUARE && - ( selected_item == MI_CYLINDER || selected_item == MI_TORUS || - selected_item == MI_PRISM || selected_item == MI_RING || - selected_item == MI_SPHERE ) ) - { - mSpinHollow->setMinValue(0.f); - mSpinHollow->setMaxValue(70.f); - } - else - { - mSpinHollow->setMinValue(0.f); - mSpinHollow->setMaxValue(95.f); - } - - // Update field enablement - mComboBaseType ->setEnabled( enabled ); - - mLabelCut ->setEnabled( enabled ); - mSpinCutBegin ->setEnabled( enabled ); - mSpinCutEnd ->setEnabled( enabled ); - - mLabelHollow ->setEnabled( enabled ); - mSpinHollow ->setEnabled( enabled ); - mLabelHoleType ->setEnabled( hole_enabled ); - mComboHoleType ->setEnabled( hole_enabled ); - - mLabelTwist ->setEnabled( enabled ); - mSpinTwist ->setEnabled( enabled ); - mSpinTwistBegin ->setEnabled( enabled ); - - mLabelSkew ->setEnabled( enabled ); - mSpinSkew ->setEnabled( enabled ); - - getChildView("scale_hole")->setVisible( FALSE); - getChildView("scale_taper")->setVisible( FALSE); - if (top_size_x_visible || top_size_y_visible) - { - if (size_is_hole) - { - getChildView("scale_hole")->setVisible( TRUE); - getChildView("scale_hole")->setEnabled(enabled); - } - else - { - getChildView("scale_taper")->setVisible( TRUE); - getChildView("scale_taper")->setEnabled(enabled); - } - } - - mSpinScaleX ->setEnabled( enabled ); - mSpinScaleY ->setEnabled( enabled ); - - mLabelShear ->setEnabled( enabled ); - mSpinShearX ->setEnabled( enabled ); - mSpinShearY ->setEnabled( enabled ); - - getChildView("advanced_cut")->setVisible( FALSE); - getChildView("advanced_dimple")->setVisible( FALSE); - getChildView("advanced_slice")->setVisible( FALSE); - - if (advanced_cut_visible) - { - if (advanced_is_dimple) - { - getChildView("advanced_dimple")->setVisible( TRUE); - getChildView("advanced_dimple")->setEnabled(enabled); - } - - else if (advanced_is_slice) - { - getChildView("advanced_slice")->setVisible( TRUE); - getChildView("advanced_slice")->setEnabled(enabled); - } - else - { - getChildView("advanced_cut")->setVisible( TRUE); - getChildView("advanced_cut")->setEnabled(enabled); - } - } - - mCtrlPathBegin ->setEnabled( enabled ); - mCtrlPathEnd ->setEnabled( enabled ); - - mLabelTaper ->setEnabled( enabled ); - mSpinTaperX ->setEnabled( enabled ); - mSpinTaperY ->setEnabled( enabled ); - - mLabelRadiusOffset->setEnabled( enabled ); - mSpinRadiusOffset ->setEnabled( enabled ); - - mLabelRevolutions->setEnabled( enabled ); - mSpinRevolutions ->setEnabled( enabled ); - - // Update field visibility - mLabelCut ->setVisible( cut_visible ); - mSpinCutBegin ->setVisible( cut_visible ); - mSpinCutEnd ->setVisible( cut_visible ); - - mLabelHollow ->setVisible( hollow_visible ); - mSpinHollow ->setVisible( hollow_visible ); - mLabelHoleType ->setVisible( hollow_visible ); - mComboHoleType ->setVisible( hollow_visible ); - - mLabelTwist ->setVisible( twist_visible ); - mSpinTwist ->setVisible( twist_visible ); - mSpinTwistBegin ->setVisible( twist_visible ); - mSpinTwist ->setMinValue( twist_min ); - mSpinTwist ->setMaxValue( twist_max ); - mSpinTwist ->setIncrement( twist_inc ); - mSpinTwistBegin ->setMinValue( twist_min ); - mSpinTwistBegin ->setMaxValue( twist_max ); - mSpinTwistBegin ->setIncrement( twist_inc ); - - mSpinScaleX ->setVisible( top_size_x_visible ); - mSpinScaleY ->setVisible( top_size_y_visible ); - - mLabelSkew ->setVisible( skew_visible ); - mSpinSkew ->setVisible( skew_visible ); - - mLabelShear ->setVisible( top_shear_x_visible || top_shear_y_visible ); - mSpinShearX ->setVisible( top_shear_x_visible ); - mSpinShearY ->setVisible( top_shear_y_visible ); - - mCtrlPathBegin ->setVisible( advanced_cut_visible ); - mCtrlPathEnd ->setVisible( advanced_cut_visible ); - - mLabelTaper ->setVisible( taper_visible ); - mSpinTaperX ->setVisible( taper_visible ); - mSpinTaperY ->setVisible( taper_visible ); - - mLabelRadiusOffset->setVisible( radius_offset_visible ); - mSpinRadiusOffset ->setVisible( radius_offset_visible ); - - mLabelRevolutions->setVisible( revolutions_visible ); - mSpinRevolutions ->setVisible( revolutions_visible ); - - mCtrlSculptTexture->setVisible(sculpt_texture_visible); - mLabelSculptType->setVisible(sculpt_texture_visible); - mCtrlSculptType->setVisible(sculpt_texture_visible); - mCtrlSculptMirror->setVisible(sculpt_texture_visible); - mCtrlSculptInvert->setVisible(sculpt_texture_visible); - - - // sculpt texture - - if (selected_item == MI_SCULPT) - { - - - LLUUID id; - LLSculptParams *sculpt_params = (LLSculptParams *)objectp->getParameterEntry(LLNetworkData::PARAMS_SCULPT); - - - if (sculpt_params) // if we have a legal sculpt param block for this object: - { - if (mObject != objectp) // we've just selected a new object, so save for undo - { - mSculptTextureRevert = sculpt_params->getSculptTexture(); - mSculptTypeRevert = sculpt_params->getSculptType(); - } - - U8 sculpt_type = sculpt_params->getSculptType(); - U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK; - BOOL sculpt_invert = sculpt_type & LL_SCULPT_FLAG_INVERT; - BOOL sculpt_mirror = sculpt_type & LL_SCULPT_FLAG_MIRROR; - isMesh = (sculpt_stitching == LL_SCULPT_TYPE_MESH); - - LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control"); - if(mTextureCtrl) - { - mTextureCtrl->setTentative(FALSE); - mTextureCtrl->setEnabled(editable && !isMesh); - if (editable) - mTextureCtrl->setImageAssetID(sculpt_params->getSculptTexture()); - else - mTextureCtrl->setImageAssetID(LLUUID::null); - } - - mComboBaseType->setEnabled(!isMesh); - - if (mCtrlSculptType) - { - mCtrlSculptType->setCurrentByIndex(sculpt_stitching); - mCtrlSculptType->setEnabled(editable && !isMesh); - } - - if (mCtrlSculptMirror) - { - mCtrlSculptMirror->set(sculpt_mirror); - mCtrlSculptMirror->setEnabled(editable); - } - - if (mCtrlSculptInvert) - { - mCtrlSculptInvert->set(sculpt_invert); - mCtrlSculptInvert->setEnabled(editable); - } - - if (mLabelSculptType) - { - mLabelSculptType->setEnabled(TRUE); - } - - } - } - else - { - mSculptTextureRevert = LLUUID::null; - } - - //---------------------------------------------------------------------------- - - mObject = objectp; - mRootObject = root_objectp; -} - -// static -bool LLPanelObject::precommitValidate( const LLSD& data ) -{ - // TODO: Richard will fill this in later. - return TRUE; // FALSE means that validation failed and new value should not be commited. -} - -void LLPanelObject::sendIsPhysical() -{ - BOOL value = mCheckPhysics->get(); - if( mIsPhysical != value ) - { - LLSelectMgr::getInstance()->selectionUpdatePhysics(value); - mIsPhysical = value; - - llinfos << "update physics sent" << llendl; - } - else - { - llinfos << "update physics not changed" << llendl; - } -} - -void LLPanelObject::sendIsTemporary() -{ - BOOL value = mCheckTemporary->get(); - if( mIsTemporary != value ) - { - LLSelectMgr::getInstance()->selectionUpdateTemporary(value); - mIsTemporary = value; - - llinfos << "update temporary sent" << llendl; - } - else - { - llinfos << "update temporary not changed" << llendl; - } -} - - -void LLPanelObject::sendIsPhantom() -{ - BOOL value = mCheckPhantom->get(); - if( mIsPhantom != value ) - { - LLSelectMgr::getInstance()->selectionUpdatePhantom(value); - mIsPhantom = value; - - llinfos << "update phantom sent" << llendl; - } - else - { - llinfos << "update phantom not changed" << llendl; - } -} - -void LLPanelObject::sendCastShadows() -{ - BOOL value = mCheckCastShadows->get(); - if( mCastShadows != value ) - { - LLSelectMgr::getInstance()->selectionUpdateCastShadows(value); - mCastShadows = value; - - llinfos << "update cast shadows sent" << llendl; - } - else - { - llinfos << "update cast shadows not changed" << llendl; - } -} - -// static -void LLPanelObject::onCommitParametric( LLUICtrl* ctrl, void* userdata ) -{ - LLPanelObject* self = (LLPanelObject*) userdata; - - if (self->mObject.isNull()) - { - return; - } - - if (self->mObject->getPCode() != LL_PCODE_VOLUME) - { - // Don't allow modification of non-volume objects. - return; - } - - LLVolume *volume = self->mObject->getVolume(); - if (!volume) - { - return; - } - - LLVolumeParams volume_params; - self->getVolumeParams(volume_params); - - - - // set sculpting - S32 selected_type = self->mComboBaseType->getCurrentIndex(); - - if (selected_type == MI_SCULPT) - { - self->mObject->setParameterEntryInUse(LLNetworkData::PARAMS_SCULPT, TRUE, TRUE); - LLSculptParams *sculpt_params = (LLSculptParams *)self->mObject->getParameterEntry(LLNetworkData::PARAMS_SCULPT); - if (sculpt_params) - volume_params.setSculptID(sculpt_params->getSculptTexture(), sculpt_params->getSculptType()); - } - else - { - LLSculptParams *sculpt_params = (LLSculptParams *)self->mObject->getParameterEntry(LLNetworkData::PARAMS_SCULPT); - if (sculpt_params) - self->mObject->setParameterEntryInUse(LLNetworkData::PARAMS_SCULPT, FALSE, TRUE); - } - - // Update the volume, if necessary. - self->mObject->updateVolume(volume_params); - - - // This was added to make sure thate when changes are made, the UI - // adjusts to present valid options. - // *FIX: only some changes, ie, hollow or primitive type changes, - // require a refresh. - self->refresh(); - -} - -void LLPanelObject::getVolumeParams(LLVolumeParams& volume_params) -{ - // Figure out what type of volume to make - S32 was_selected_type = mSelectedType; - S32 selected_type = mComboBaseType->getCurrentIndex(); - U8 profile; - U8 path; - switch ( selected_type ) - { - case MI_CYLINDER: - profile = LL_PCODE_PROFILE_CIRCLE; - path = LL_PCODE_PATH_LINE; - break; - - case MI_BOX: - profile = LL_PCODE_PROFILE_SQUARE; - path = LL_PCODE_PATH_LINE; - break; - - case MI_PRISM: - profile = LL_PCODE_PROFILE_EQUALTRI; - path = LL_PCODE_PATH_LINE; - break; - - case MI_SPHERE: - profile = LL_PCODE_PROFILE_CIRCLE_HALF; - path = LL_PCODE_PATH_CIRCLE; - break; - - case MI_TORUS: - profile = LL_PCODE_PROFILE_CIRCLE; - path = LL_PCODE_PATH_CIRCLE; - break; - - case MI_TUBE: - profile = LL_PCODE_PROFILE_SQUARE; - path = LL_PCODE_PATH_CIRCLE; - break; - - case MI_RING: - profile = LL_PCODE_PROFILE_EQUALTRI; - path = LL_PCODE_PATH_CIRCLE; - break; - - case MI_SCULPT: - profile = LL_PCODE_PROFILE_CIRCLE; - path = LL_PCODE_PATH_CIRCLE; - break; - - default: - llwarns << "Unknown base type " << selected_type - << " in getVolumeParams()" << llendl; - // assume a box - selected_type = MI_BOX; - profile = LL_PCODE_PROFILE_SQUARE; - path = LL_PCODE_PATH_LINE; - break; - } - - - if (path == LL_PCODE_PATH_LINE) - { - LLVOVolume *volobjp = (LLVOVolume *)(LLViewerObject*)(mObject); - if (volobjp->isFlexible()) - { - path = LL_PCODE_PATH_FLEXIBLE; - } - } - - S32 selected_hole = mComboHoleType->getCurrentIndex(); - U8 hole; - switch (selected_hole) - { - case MI_HOLE_CIRCLE: - hole = LL_PCODE_HOLE_CIRCLE; - break; - case MI_HOLE_SQUARE: - hole = LL_PCODE_HOLE_SQUARE; - break; - case MI_HOLE_TRIANGLE: - hole = LL_PCODE_HOLE_TRIANGLE; - break; - case MI_HOLE_SAME: - default: - hole = LL_PCODE_HOLE_SAME; - break; - } - - volume_params.setType(profile | hole, path); - mSelectedType = selected_type; - - // Compute cut start/end - F32 cut_begin = mSpinCutBegin->get(); - F32 cut_end = mSpinCutEnd->get(); - - // Make sure at least OBJECT_CUT_INC of the object survives - if (cut_begin > cut_end - OBJECT_MIN_CUT_INC) - { - cut_begin = cut_end - OBJECT_MIN_CUT_INC; - mSpinCutBegin->set(cut_begin); - } - - F32 adv_cut_begin = mCtrlPathBegin->get(); - F32 adv_cut_end = mCtrlPathEnd->get(); - - // Make sure at least OBJECT_CUT_INC of the object survives - if (adv_cut_begin > adv_cut_end - OBJECT_MIN_CUT_INC) - { - adv_cut_begin = adv_cut_end - OBJECT_MIN_CUT_INC; - mCtrlPathBegin->set(adv_cut_begin); - } - - F32 begin_s, end_s; - F32 begin_t, end_t; - - if (selected_type == MI_SPHERE || selected_type == MI_TORUS || - selected_type == MI_TUBE || selected_type == MI_RING) - { - begin_s = adv_cut_begin; - end_s = adv_cut_end; - - begin_t = cut_begin; - end_t = cut_end; - } - else - { - begin_s = cut_begin; - end_s = cut_end; - - begin_t = adv_cut_begin; - end_t = adv_cut_end; - } - - volume_params.setBeginAndEndS(begin_s, end_s); - volume_params.setBeginAndEndT(begin_t, end_t); - - // Hollowness - F32 hollow = mSpinHollow->get() / 100.f; - - if ( selected_hole == MI_HOLE_SQUARE && - ( selected_type == MI_CYLINDER || selected_type == MI_TORUS || - selected_type == MI_PRISM || selected_type == MI_RING || - selected_type == MI_SPHERE ) ) - { - if (hollow > 0.7f) hollow = 0.7f; - } - - volume_params.setHollow( hollow ); - - // Twist Begin,End - F32 twist_begin = mSpinTwistBegin->get(); - F32 twist = mSpinTwist->get(); - // Check the path type for twist conversion. - if (path == LL_PCODE_PATH_LINE || path == LL_PCODE_PATH_FLEXIBLE) - { - twist_begin /= OBJECT_TWIST_LINEAR_MAX; - twist /= OBJECT_TWIST_LINEAR_MAX; - } - else - { - twist_begin /= OBJECT_TWIST_MAX; - twist /= OBJECT_TWIST_MAX; - } - - volume_params.setTwistBegin(twist_begin); - volume_params.setTwist(twist); - - // Scale X,Y - F32 scale_x = mSpinScaleX->get(); - F32 scale_y = mSpinScaleY->get(); - if ( was_selected_type == MI_BOX || was_selected_type == MI_CYLINDER || was_selected_type == MI_PRISM) - { - scale_x = 1.f - scale_x; - scale_y = 1.f - scale_y; - } - - // Skew - F32 skew = mSpinSkew->get(); - - // Taper X,Y - F32 taper_x = mSpinTaperX->get(); - F32 taper_y = mSpinTaperY->get(); - - // Radius offset - F32 radius_offset = mSpinRadiusOffset->get(); - - // Revolutions - F32 revolutions = mSpinRevolutions->get(); - - if ( selected_type == MI_SPHERE ) - { - // Snap values to valid sphere parameters. - scale_x = 1.0f; - scale_y = 1.0f; - skew = 0.0f; - taper_x = 0.0f; - taper_y = 0.0f; - radius_offset = 0.0f; - revolutions = 1.0f; - } - else if ( selected_type == MI_TORUS || selected_type == MI_TUBE || - selected_type == MI_RING ) - { - scale_x = llclamp( - scale_x, - OBJECT_MIN_HOLE_SIZE, - OBJECT_MAX_HOLE_SIZE_X); - scale_y = llclamp( - scale_y, - OBJECT_MIN_HOLE_SIZE, - OBJECT_MAX_HOLE_SIZE_Y); - - // Limit radius offset, based on taper and hole size y. - F32 radius_mag = fabs(radius_offset); - F32 hole_y_mag = fabs(scale_y); - F32 taper_y_mag = fabs(taper_y); - // Check to see if the taper effects us. - if ( (radius_offset > 0.f && taper_y < 0.f) || - (radius_offset < 0.f && taper_y > 0.f) ) - { - // The taper does not help increase the radius offset range. - taper_y_mag = 0.f; - } - F32 max_radius_mag = 1.f - hole_y_mag * (1.f - taper_y_mag) / (1.f - hole_y_mag); - // Enforce the maximum magnitude. - if (radius_mag > max_radius_mag) - { - // Check radius offset sign. - if (radius_offset < 0.f) - { - radius_offset = -max_radius_mag; - } - else - { - radius_offset = max_radius_mag; - } - } - - // Check the skew value against the revolutions. - F32 skew_mag= fabs(skew); - F32 min_skew_mag = 1.0f - 1.0f / (revolutions * scale_x + 1.0f); - // Discontinuity; A revolution of 1 allows skews below 0.5. - if ( fabs(revolutions - 1.0f) < 0.001) - min_skew_mag = 0.0f; - - // Clip skew. - if (skew_mag < min_skew_mag) - { - // Check skew sign. - if (skew < 0.0f) - { - skew = -min_skew_mag; - } - else - { - skew = min_skew_mag; - } - } - } - - volume_params.setRatio( scale_x, scale_y ); - volume_params.setSkew(skew); - volume_params.setTaper( taper_x, taper_y ); - volume_params.setRadiusOffset(radius_offset); - volume_params.setRevolutions(revolutions); - - // Shear X,Y - F32 shear_x = mSpinShearX->get(); - F32 shear_y = mSpinShearY->get(); - volume_params.setShear( shear_x, shear_y ); - - if (selected_type == MI_SCULPT) - { - volume_params.setSculptID(LLUUID::null, 0); - volume_params.setBeginAndEndT (0, 1); - volume_params.setBeginAndEndS (0, 1); - volume_params.setHollow (0); - volume_params.setTwistBegin (0); - volume_params.setTwistEnd (0); - volume_params.setRatio (1, 0.5); - volume_params.setShear (0, 0); - volume_params.setTaper (0, 0); - volume_params.setRevolutions (1); - volume_params.setRadiusOffset (0); - volume_params.setSkew (0); - } - -} - -// BUG: Make work with multiple objects -void LLPanelObject::sendRotation(BOOL btn_down) -{ - if (mObject.isNull()) return; - - LLVector3 new_rot(mCtrlRotX->get(), mCtrlRotY->get(), mCtrlRotZ->get()); - new_rot.mV[VX] = llround(new_rot.mV[VX], OBJECT_ROTATION_PRECISION); - new_rot.mV[VY] = llround(new_rot.mV[VY], OBJECT_ROTATION_PRECISION); - new_rot.mV[VZ] = llround(new_rot.mV[VZ], OBJECT_ROTATION_PRECISION); - - // Note: must compare before conversion to radians - LLVector3 delta = new_rot - mCurEulerDegrees; - - if (delta.magVec() >= 0.0005f) - { - mCurEulerDegrees = new_rot; - new_rot *= DEG_TO_RAD; - - LLQuaternion rotation; - rotation.setQuat(new_rot.mV[VX], new_rot.mV[VY], new_rot.mV[VZ]); - - if (mRootObject != mObject) - { - rotation = rotation * ~mRootObject->getRotationRegion(); - } - std::vector<LLVector3>& child_positions = mObject->mUnselectedChildrenPositions ; - std::vector<LLQuaternion> child_rotations; - if (mObject->isRootEdit()) - { - mObject->saveUnselectedChildrenRotation(child_rotations) ; - mObject->saveUnselectedChildrenPosition(child_positions) ; - } - - mObject->setRotation(rotation); - LLManip::rebuild(mObject) ; - - // for individually selected roots, we need to counterrotate all the children - if (mObject->isRootEdit()) - { - mObject->resetChildrenRotationAndPosition(child_rotations, child_positions) ; - } - - if(!btn_down) - { - child_positions.clear() ; - LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_ROTATION | UPD_POSITION); - } - } -} - - -// BUG: Make work with multiple objects -void LLPanelObject::sendScale(BOOL btn_down) -{ - if (mObject.isNull()) return; - - LLVector3 newscale(mCtrlScaleX->get(), mCtrlScaleY->get(), mCtrlScaleZ->get()); - - LLVector3 delta = newscale - mObject->getScale(); - if (delta.magVec() >= 0.0005f) - { - // scale changed by more than 1/2 millimeter - - // check to see if we aren't scaling the textures - // (in which case the tex coord's need to be recomputed) - BOOL dont_stretch_textures = !LLManipScale::getStretchTextures(); - if (dont_stretch_textures) - { - LLSelectMgr::getInstance()->saveSelectedObjectTransform(SELECT_ACTION_TYPE_SCALE); - } - - mObject->setScale(newscale, TRUE); - - if(!btn_down) - { - LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_SCALE | UPD_POSITION); - } - - LLSelectMgr::getInstance()->adjustTexturesByScale(TRUE, !dont_stretch_textures); -// llinfos << "scale sent" << llendl; - } - else - { -// llinfos << "scale not changed" << llendl; - } -} - - -void LLPanelObject::sendPosition(BOOL btn_down) -{ - if (mObject.isNull()) return; - - LLVector3 newpos(mCtrlPosX->get(), mCtrlPosY->get(), mCtrlPosZ->get()); - LLViewerRegion* regionp = mObject->getRegion(); - - // Clamp the Z height - const F32 height = newpos.mV[VZ]; - const F32 min_height = LLWorld::getInstance()->getMinAllowedZ(mObject, mObject->getPositionGlobal()); - const F32 max_height = LLWorld::getInstance()->getRegionMaxHeight(); - - if (!mObject->isAttachment()) - { - if ( height < min_height) - { - newpos.mV[VZ] = min_height; - mCtrlPosZ->set( min_height ); - } - else if ( height > max_height ) - { - newpos.mV[VZ] = max_height; - mCtrlPosZ->set( max_height ); - } - - // Grass is always drawn on the ground, so clamp its position to the ground - if (mObject->getPCode() == LL_PCODE_LEGACY_GRASS) - { - mCtrlPosZ->set(LLWorld::getInstance()->resolveLandHeightAgent(newpos) + 1.f); - } - } - - // Make sure new position is in a valid region, so the object - // won't get dumped by the simulator. - LLVector3d new_pos_global = regionp->getPosGlobalFromRegion(newpos); - - if ( LLWorld::getInstance()->positionRegionValidGlobal(new_pos_global) ) - { - // send only if the position is changed, that is, the delta vector is not zero - LLVector3d old_pos_global = mObject->getPositionGlobal(); - LLVector3d delta = new_pos_global - old_pos_global; - // moved more than 1/2 millimeter - if (delta.magVec() >= 0.0005f) - { - if (mRootObject != mObject) - { - newpos = newpos - mRootObject->getPositionRegion(); - newpos = newpos * ~mRootObject->getRotationRegion(); - mObject->setPositionParent(newpos); - } - else - { - mObject->setPositionEdit(newpos); - } - - LLManip::rebuild(mObject) ; - - // for individually selected roots, we need to counter-translate all unselected children - if (mObject->isRootEdit()) - { - // only offset by parent's translation - mObject->resetChildrenPosition(LLVector3(-delta), TRUE) ; - } - - if(!btn_down) - { - LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_POSITION); - } - - LLSelectMgr::getInstance()->updateSelectionCenter(); - } - } - else - { - // move failed, so we update the UI with the correct values - LLVector3 vec = mRootObject->getPositionRegion(); - mCtrlPosX->set(vec.mV[VX]); - mCtrlPosY->set(vec.mV[VY]); - mCtrlPosZ->set(vec.mV[VZ]); - } -} - -void LLPanelObject::sendSculpt() -{ - if (mObject.isNull()) - return; - - LLSculptParams sculpt_params; - - if (mCtrlSculptTexture) - sculpt_params.setSculptTexture(mCtrlSculptTexture->getImageAssetID()); - - U8 sculpt_type = 0; - - if (mCtrlSculptType) - sculpt_type |= mCtrlSculptType->getCurrentIndex(); - - bool enabled = sculpt_type != LL_SCULPT_TYPE_MESH; - - if (mCtrlSculptMirror) - { - mCtrlSculptMirror->setEnabled(enabled ? TRUE : FALSE); - } - if (mCtrlSculptInvert) - { - mCtrlSculptInvert->setEnabled(enabled ? TRUE : FALSE); - } - - if ((mCtrlSculptMirror) && (mCtrlSculptMirror->get())) - sculpt_type |= LL_SCULPT_FLAG_MIRROR; - - if ((mCtrlSculptInvert) && (mCtrlSculptInvert->get())) - sculpt_type |= LL_SCULPT_FLAG_INVERT; - - sculpt_params.setSculptType(sculpt_type); - mObject->setParameterEntry(LLNetworkData::PARAMS_SCULPT, sculpt_params, TRUE); -} - -void LLPanelObject::refresh() -{ - getState(); - if (mObject.notNull() && mObject->isDead()) - { - mObject = NULL; - } - - if (mRootObject.notNull() && mRootObject->isDead()) - { - mRootObject = NULL; - } - - bool enable_mesh = gSavedSettings.getBOOL("MeshEnabled") && - gAgent.getRegion() && - !gAgent.getRegion()->getCapability("GetMesh").empty(); - - F32 max_scale = get_default_max_prim_scale(LLPickInfo::isFlora(mObject)); - - getChild<LLSpinCtrl>("Scale X")->setMaxValue(max_scale); - getChild<LLSpinCtrl>("Scale Y")->setMaxValue(max_scale); - getChild<LLSpinCtrl>("Scale Z")->setMaxValue(max_scale); - - BOOL found = mCtrlSculptType->itemExists("Mesh"); - if (enable_mesh && !found) - { - mCtrlSculptType->add("Mesh"); - } - else if (!enable_mesh && found) - { - mCtrlSculptType->remove("Mesh"); - } -} - - -void LLPanelObject::draw() -{ - const LLColor4 white( 1.0f, 1.0f, 1.0f, 1); - const LLColor4 red( 1.0f, 0.25f, 0.f, 1); - const LLColor4 green( 0.f, 1.0f, 0.f, 1); - const LLColor4 blue( 0.f, 0.5f, 1.0f, 1); - - // Tune the colors of the labels - LLTool* tool = LLToolMgr::getInstance()->getCurrentTool(); - - if (tool == LLToolCompTranslate::getInstance()) - { - mCtrlPosX ->setLabelColor(red); - mCtrlPosY ->setLabelColor(green); - mCtrlPosZ ->setLabelColor(blue); - - mCtrlScaleX ->setLabelColor(white); - mCtrlScaleY ->setLabelColor(white); - mCtrlScaleZ ->setLabelColor(white); - - mCtrlRotX ->setLabelColor(white); - mCtrlRotY ->setLabelColor(white); - mCtrlRotZ ->setLabelColor(white); - } - else if ( tool == LLToolCompScale::getInstance() ) - { - mCtrlPosX ->setLabelColor(white); - mCtrlPosY ->setLabelColor(white); - mCtrlPosZ ->setLabelColor(white); - - mCtrlScaleX ->setLabelColor(red); - mCtrlScaleY ->setLabelColor(green); - mCtrlScaleZ ->setLabelColor(blue); - - mCtrlRotX ->setLabelColor(white); - mCtrlRotY ->setLabelColor(white); - mCtrlRotZ ->setLabelColor(white); - } - else if ( tool == LLToolCompRotate::getInstance() ) - { - mCtrlPosX ->setLabelColor(white); - mCtrlPosY ->setLabelColor(white); - mCtrlPosZ ->setLabelColor(white); - - mCtrlScaleX ->setLabelColor(white); - mCtrlScaleY ->setLabelColor(white); - mCtrlScaleZ ->setLabelColor(white); - - mCtrlRotX ->setLabelColor(red); - mCtrlRotY ->setLabelColor(green); - mCtrlRotZ ->setLabelColor(blue); - } - else - { - mCtrlPosX ->setLabelColor(white); - mCtrlPosY ->setLabelColor(white); - mCtrlPosZ ->setLabelColor(white); - - mCtrlScaleX ->setLabelColor(white); - mCtrlScaleY ->setLabelColor(white); - mCtrlScaleZ ->setLabelColor(white); - - mCtrlRotX ->setLabelColor(white); - mCtrlRotY ->setLabelColor(white); - mCtrlRotZ ->setLabelColor(white); - } - - LLPanel::draw(); -} - -// virtual -void LLPanelObject::clearCtrls() -{ - LLPanel::clearCtrls(); - - mCheckLock ->set(FALSE); - mCheckLock ->setEnabled( FALSE ); - mCheckPhysics ->set(FALSE); - mCheckPhysics ->setEnabled( FALSE ); - mCheckTemporary ->set(FALSE); - mCheckTemporary ->setEnabled( FALSE ); - mCheckPhantom ->set(FALSE); - mCheckPhantom ->setEnabled( FALSE ); - -#if 0 // 1.9.2 - mCheckCastShadows->set(FALSE); - mCheckCastShadows->setEnabled( FALSE ); -#endif - // Disable text labels - mLabelPosition ->setEnabled( FALSE ); - mLabelSize ->setEnabled( FALSE ); - mLabelRotation ->setEnabled( FALSE ); - mLabelCut ->setEnabled( FALSE ); - mLabelHollow ->setEnabled( FALSE ); - mLabelHoleType ->setEnabled( FALSE ); - mLabelTwist ->setEnabled( FALSE ); - mLabelSkew ->setEnabled( FALSE ); - mLabelShear ->setEnabled( FALSE ); - mLabelTaper ->setEnabled( FALSE ); - mLabelRadiusOffset->setEnabled( FALSE ); - mLabelRevolutions->setEnabled( FALSE ); - - getChildView("select_single")->setVisible( FALSE); - getChildView("edit_object")->setVisible( TRUE); - getChildView("edit_object")->setEnabled(FALSE); - - getChildView("scale_hole")->setEnabled(FALSE); - getChildView("scale_taper")->setEnabled(FALSE); - getChildView("advanced_cut")->setEnabled(FALSE); - getChildView("advanced_dimple")->setEnabled(FALSE); - getChildView("advanced_slice")->setVisible( FALSE); -} - -// -// Static functions -// - -// static -void LLPanelObject::onCommitLock(LLUICtrl *ctrl, void *data) -{ - // Checkbox will have toggled itself - LLPanelObject *self = (LLPanelObject *)data; - - if(self->mRootObject.isNull()) return; - - BOOL new_state = self->mCheckLock->get(); - - LLSelectMgr::getInstance()->selectionSetObjectPermissions(PERM_OWNER, !new_state, PERM_MOVE | PERM_MODIFY); -} - -// static -void LLPanelObject::onCommitPosition( LLUICtrl* ctrl, void* userdata ) -{ - LLPanelObject* self = (LLPanelObject*) userdata; - BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ; - self->sendPosition(btn_down); -} - -// static -void LLPanelObject::onCommitScale( LLUICtrl* ctrl, void* userdata ) -{ - LLPanelObject* self = (LLPanelObject*) userdata; - BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ; - self->sendScale(btn_down); -} - -// static -void LLPanelObject::onCommitRotation( LLUICtrl* ctrl, void* userdata ) -{ - LLPanelObject* self = (LLPanelObject*) userdata; - BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ; - self->sendRotation(btn_down); -} - -// static -void LLPanelObject::onCommitPhysics( LLUICtrl* ctrl, void* userdata ) -{ - LLPanelObject* self = (LLPanelObject*) userdata; - self->sendIsPhysical(); -} - -// static -void LLPanelObject::onCommitTemporary( LLUICtrl* ctrl, void* userdata ) -{ - LLPanelObject* self = (LLPanelObject*) userdata; - self->sendIsTemporary(); -} - -// static -void LLPanelObject::onCommitPhantom( LLUICtrl* ctrl, void* userdata ) -{ - LLPanelObject* self = (LLPanelObject*) userdata; - self->sendIsPhantom(); -} - -// static -void LLPanelObject::onCommitCastShadows( LLUICtrl* ctrl, void* userdata ) -{ - LLPanelObject* self = (LLPanelObject*) userdata; - self->sendCastShadows(); -} - - -void LLPanelObject::onSelectSculpt(const LLSD& data) -{ - LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control"); - - if (mTextureCtrl) - { - mSculptTextureRevert = mTextureCtrl->getImageAssetID(); - } - - sendSculpt(); -} - - -void LLPanelObject::onCommitSculpt( const LLSD& data ) -{ - sendSculpt(); -} - -BOOL LLPanelObject::onDropSculpt(LLInventoryItem* item) -{ - LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control"); - - if (mTextureCtrl) - { - LLUUID asset = item->getAssetUUID(); - - mTextureCtrl->setImageAssetID(asset); - mSculptTextureRevert = asset; - } - - return TRUE; -} - - -void LLPanelObject::onCancelSculpt(const LLSD& data) -{ - LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control"); - if(!mTextureCtrl) - return; - - mTextureCtrl->setImageAssetID(mSculptTextureRevert); - - sendSculpt(); -} - -// static -void LLPanelObject::onCommitSculptType(LLUICtrl *ctrl, void* userdata) -{ - LLPanelObject* self = (LLPanelObject*) userdata; - - self->sendSculpt(); -} +/**
+ * @file llpanelobject.cpp
+ * @brief Object editing (position, scale, etc.) in the tools floater
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, 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$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+// file include
+#include "llpanelobject.h"
+
+// linden library includes
+#include "lleconomy.h"
+#include "llerror.h"
+#include "llfontgl.h"
+#include "llpermissionsflags.h"
+#include "llstring.h"
+#include "llvolume.h"
+#include "m3math.h"
+
+// project includes
+#include "llagent.h"
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llcolorswatch.h"
+#include "llcombobox.h"
+#include "llfocusmgr.h"
+#include "llmanipscale.h"
+#include "llpreviewscript.h"
+#include "llresmgr.h"
+#include "llselectmgr.h"
+#include "llspinctrl.h"
+#include "lltexturectrl.h"
+#include "lltextbox.h"
+#include "lltool.h"
+#include "lltoolcomp.h"
+#include "lltoolmgr.h"
+#include "llui.h"
+#include "llviewerobject.h"
+#include "llviewerregion.h"
+#include "llviewerwindow.h"
+#include "llvovolume.h"
+#include "llworld.h"
+#include "pipeline.h"
+#include "llviewercontrol.h"
+#include "lluictrlfactory.h"
+//#include "llfirstuse.h"
+
+#include "lldrawpool.h"
+
+//
+// Constants
+//
+enum {
+ MI_BOX,
+ MI_CYLINDER,
+ MI_PRISM,
+ MI_SPHERE,
+ MI_TORUS,
+ MI_TUBE,
+ MI_RING,
+ MI_SCULPT,
+ MI_NONE,
+ MI_VOLUME_COUNT
+};
+
+enum {
+ MI_HOLE_SAME,
+ MI_HOLE_CIRCLE,
+ MI_HOLE_SQUARE,
+ MI_HOLE_TRIANGLE,
+ MI_HOLE_COUNT
+};
+
+//static const std::string LEGACY_FULLBRIGHT_DESC =LLTrans::getString("Fullbright");
+
+BOOL LLPanelObject::postBuild()
+{
+ setMouseOpaque(FALSE);
+
+ //--------------------------------------------------------
+ // Top
+ //--------------------------------------------------------
+
+ // Lock checkbox
+ mCheckLock = getChild<LLCheckBoxCtrl>("checkbox locked");
+ childSetCommitCallback("checkbox locked",onCommitLock,this);
+
+ // Physical checkbox
+ mCheckPhysics = getChild<LLCheckBoxCtrl>("Physical Checkbox Ctrl");
+ childSetCommitCallback("Physical Checkbox Ctrl",onCommitPhysics,this);
+
+ // Temporary checkbox
+ mCheckTemporary = getChild<LLCheckBoxCtrl>("Temporary Checkbox Ctrl");
+ childSetCommitCallback("Temporary Checkbox Ctrl",onCommitTemporary,this);
+
+ // Phantom checkbox
+ mCheckPhantom = getChild<LLCheckBoxCtrl>("Phantom Checkbox Ctrl");
+ childSetCommitCallback("Phantom Checkbox Ctrl",onCommitPhantom,this);
+
+
+ // Position
+ mLabelPosition = getChild<LLTextBox>("label position");
+ mCtrlPosX = getChild<LLSpinCtrl>("Pos X");
+ childSetCommitCallback("Pos X",onCommitPosition,this);
+ mCtrlPosY = getChild<LLSpinCtrl>("Pos Y");
+ childSetCommitCallback("Pos Y",onCommitPosition,this);
+ mCtrlPosZ = getChild<LLSpinCtrl>("Pos Z");
+ childSetCommitCallback("Pos Z",onCommitPosition,this);
+
+ // Scale
+ mLabelSize = getChild<LLTextBox>("label size");
+ mCtrlScaleX = getChild<LLSpinCtrl>("Scale X");
+ childSetCommitCallback("Scale X",onCommitScale,this);
+
+ // Scale Y
+ mCtrlScaleY = getChild<LLSpinCtrl>("Scale Y");
+ childSetCommitCallback("Scale Y",onCommitScale,this);
+
+ // Scale Z
+ mCtrlScaleZ = getChild<LLSpinCtrl>("Scale Z");
+ childSetCommitCallback("Scale Z",onCommitScale,this);
+
+ // Rotation
+ mLabelRotation = getChild<LLTextBox>("label rotation");
+ mCtrlRotX = getChild<LLSpinCtrl>("Rot X");
+ childSetCommitCallback("Rot X",onCommitRotation,this);
+ mCtrlRotY = getChild<LLSpinCtrl>("Rot Y");
+ childSetCommitCallback("Rot Y",onCommitRotation,this);
+ mCtrlRotZ = getChild<LLSpinCtrl>("Rot Z");
+ childSetCommitCallback("Rot Z",onCommitRotation,this);
+
+ //--------------------------------------------------------
+
+ // Base Type
+ mComboBaseType = getChild<LLComboBox>("comboBaseType");
+ childSetCommitCallback("comboBaseType",onCommitParametric,this);
+
+ // Cut
+ mLabelCut = getChild<LLTextBox>("text cut");
+ mSpinCutBegin = getChild<LLSpinCtrl>("cut begin");
+ childSetCommitCallback("cut begin",onCommitParametric,this);
+ mSpinCutBegin->setValidateBeforeCommit( precommitValidate );
+ mSpinCutEnd = getChild<LLSpinCtrl>("cut end");
+ childSetCommitCallback("cut end",onCommitParametric,this);
+ mSpinCutEnd->setValidateBeforeCommit( &precommitValidate );
+
+ // Hollow / Skew
+ mLabelHollow = getChild<LLTextBox>("text hollow");
+ mLabelSkew = getChild<LLTextBox>("text skew");
+ mSpinHollow = getChild<LLSpinCtrl>("Scale 1");
+ childSetCommitCallback("Scale 1",onCommitParametric,this);
+ mSpinHollow->setValidateBeforeCommit( &precommitValidate );
+ mSpinSkew = getChild<LLSpinCtrl>("Skew");
+ childSetCommitCallback("Skew",onCommitParametric,this);
+ mSpinSkew->setValidateBeforeCommit( &precommitValidate );
+ mLabelHoleType = getChild<LLTextBox>("Hollow Shape");
+
+ // Hole Type
+ mComboHoleType = getChild<LLComboBox>("hole");
+ childSetCommitCallback("hole",onCommitParametric,this);
+
+ // Twist
+ mLabelTwist = getChild<LLTextBox>("text twist");
+ mSpinTwistBegin = getChild<LLSpinCtrl>("Twist Begin");
+ childSetCommitCallback("Twist Begin",onCommitParametric,this);
+ mSpinTwistBegin->setValidateBeforeCommit( precommitValidate );
+ mSpinTwist = getChild<LLSpinCtrl>("Twist End");
+ childSetCommitCallback("Twist End",onCommitParametric,this);
+ mSpinTwist->setValidateBeforeCommit( &precommitValidate );
+
+ // Scale
+ mSpinScaleX = getChild<LLSpinCtrl>("Taper Scale X");
+ childSetCommitCallback("Taper Scale X",onCommitParametric,this);
+ mSpinScaleX->setValidateBeforeCommit( &precommitValidate );
+ mSpinScaleY = getChild<LLSpinCtrl>("Taper Scale Y");
+ childSetCommitCallback("Taper Scale Y",onCommitParametric,this);
+ mSpinScaleY->setValidateBeforeCommit( &precommitValidate );
+
+ // Shear
+ mLabelShear = getChild<LLTextBox>("text topshear");
+ mSpinShearX = getChild<LLSpinCtrl>("Shear X");
+ childSetCommitCallback("Shear X",onCommitParametric,this);
+ mSpinShearX->setValidateBeforeCommit( &precommitValidate );
+ mSpinShearY = getChild<LLSpinCtrl>("Shear Y");
+ childSetCommitCallback("Shear Y",onCommitParametric,this);
+ mSpinShearY->setValidateBeforeCommit( &precommitValidate );
+
+ // Path / Profile
+ mCtrlPathBegin = getChild<LLSpinCtrl>("Path Limit Begin");
+ childSetCommitCallback("Path Limit Begin",onCommitParametric,this);
+ mCtrlPathBegin->setValidateBeforeCommit( &precommitValidate );
+ mCtrlPathEnd = getChild<LLSpinCtrl>("Path Limit End");
+ childSetCommitCallback("Path Limit End",onCommitParametric,this);
+ mCtrlPathEnd->setValidateBeforeCommit( &precommitValidate );
+
+ // Taper
+ mLabelTaper = getChild<LLTextBox>("text taper2");
+ mSpinTaperX = getChild<LLSpinCtrl>("Taper X");
+ childSetCommitCallback("Taper X",onCommitParametric,this);
+ mSpinTaperX->setValidateBeforeCommit( precommitValidate );
+ mSpinTaperY = getChild<LLSpinCtrl>("Taper Y");
+ childSetCommitCallback("Taper Y",onCommitParametric,this);
+ mSpinTaperY->setValidateBeforeCommit( precommitValidate );
+
+ // Radius Offset / Revolutions
+ mLabelRadiusOffset = getChild<LLTextBox>("text radius delta");
+ mLabelRevolutions = getChild<LLTextBox>("text revolutions");
+ mSpinRadiusOffset = getChild<LLSpinCtrl>("Radius Offset");
+ childSetCommitCallback("Radius Offset",onCommitParametric,this);
+ mSpinRadiusOffset->setValidateBeforeCommit( &precommitValidate );
+ mSpinRevolutions = getChild<LLSpinCtrl>("Revolutions");
+ childSetCommitCallback("Revolutions",onCommitParametric,this);
+ mSpinRevolutions->setValidateBeforeCommit( &precommitValidate );
+
+ // Sculpt
+ mCtrlSculptTexture = getChild<LLTextureCtrl>("sculpt texture control");
+ if (mCtrlSculptTexture)
+ {
+ mCtrlSculptTexture->setDefaultImageAssetID(LLUUID(SCULPT_DEFAULT_TEXTURE));
+ mCtrlSculptTexture->setCommitCallback( boost::bind(&LLPanelObject::onCommitSculpt, this, _2 ));
+ mCtrlSculptTexture->setOnCancelCallback( boost::bind(&LLPanelObject::onCancelSculpt, this, _2 ));
+ mCtrlSculptTexture->setOnSelectCallback( boost::bind(&LLPanelObject::onSelectSculpt, this, _2 ));
+ mCtrlSculptTexture->setDropCallback( boost::bind(&LLPanelObject::onDropSculpt, this, _2 ));
+ // Don't allow (no copy) or (no transfer) textures to be selected during immediate mode
+ mCtrlSculptTexture->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
+ // Allow any texture to be used during non-immediate mode.
+ mCtrlSculptTexture->setNonImmediateFilterPermMask(PERM_NONE);
+ LLAggregatePermissions texture_perms;
+ if (LLSelectMgr::getInstance()->selectGetAggregateTexturePermissions(texture_perms))
+ {
+ BOOL can_copy =
+ texture_perms.getValue(PERM_COPY) == LLAggregatePermissions::AP_EMPTY ||
+ texture_perms.getValue(PERM_COPY) == LLAggregatePermissions::AP_ALL;
+ BOOL can_transfer =
+ texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_EMPTY ||
+ texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_ALL;
+ mCtrlSculptTexture->setCanApplyImmediately(can_copy && can_transfer);
+ }
+ else
+ {
+ mCtrlSculptTexture->setCanApplyImmediately(FALSE);
+ }
+ }
+
+ mLabelSculptType = getChild<LLTextBox>("label sculpt type");
+ mCtrlSculptType = getChild<LLComboBox>("sculpt type control");
+ childSetCommitCallback("sculpt type control", onCommitSculptType, this);
+ mCtrlSculptMirror = getChild<LLCheckBoxCtrl>("sculpt mirror control");
+ childSetCommitCallback("sculpt mirror control", onCommitSculptType, this);
+ mCtrlSculptInvert = getChild<LLCheckBoxCtrl>("sculpt invert control");
+ childSetCommitCallback("sculpt invert control", onCommitSculptType, this);
+
+ // Start with everyone disabled
+ clearCtrls();
+
+ return TRUE;
+}
+
+LLPanelObject::LLPanelObject()
+: LLPanel(),
+ mIsPhysical(FALSE),
+ mIsTemporary(FALSE),
+ mIsPhantom(FALSE),
+ mCastShadows(TRUE),
+ mSelectedType(MI_BOX),
+ mSculptTextureRevert(LLUUID::null),
+ mSculptTypeRevert(0)
+{
+}
+
+
+LLPanelObject::~LLPanelObject()
+{
+ // Children all cleaned up by default view destructor.
+}
+
+void LLPanelObject::getState( )
+{
+ LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject();
+ LLViewerObject* root_objectp = objectp;
+ if(!objectp)
+ {
+ objectp = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
+ // *FIX: shouldn't we just keep the child?
+ if (objectp)
+ {
+ LLViewerObject* parentp = objectp->getRootEdit();
+
+ if (parentp)
+ {
+ root_objectp = parentp;
+ }
+ else
+ {
+ root_objectp = objectp;
+ }
+ }
+ }
+
+ LLVOVolume *volobjp = NULL;
+ if ( objectp && (objectp->getPCode() == LL_PCODE_VOLUME))
+ {
+ volobjp = (LLVOVolume *)objectp;
+ }
+
+ if( !objectp )
+ {
+ //forfeit focus
+ if (gFocusMgr.childHasKeyboardFocus(this))
+ {
+ gFocusMgr.setKeyboardFocus(NULL);
+ }
+
+ // Disable all text input fields
+ clearCtrls();
+ return;
+ }
+
+ // can move or rotate only linked group with move permissions, or sub-object with move and modify perms
+ BOOL enable_move = objectp->permMove() && !objectp->isAttachment() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts"));
+ BOOL enable_scale = objectp->permMove() && objectp->permModify();
+ BOOL enable_rotate = objectp->permMove() && ( (objectp->permModify() && !objectp->isAttachment()) || !gSavedSettings.getBOOL("EditLinkedParts"));
+
+ S32 selected_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
+ BOOL single_volume = (LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME ))
+ && (selected_count == 1);
+
+ if (LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() > 1)
+ {
+ enable_move = FALSE;
+ enable_scale = FALSE;
+ enable_rotate = FALSE;
+ }
+
+ LLVector3 vec;
+ if (enable_move)
+ {
+ vec = objectp->getPositionEdit();
+ mCtrlPosX->set( vec.mV[VX] );
+ mCtrlPosY->set( vec.mV[VY] );
+ mCtrlPosZ->set( vec.mV[VZ] );
+ }
+ else
+ {
+ mCtrlPosX->clear();
+ mCtrlPosY->clear();
+ mCtrlPosZ->clear();
+ }
+
+
+ mLabelPosition->setEnabled( enable_move );
+ mCtrlPosX->setEnabled(enable_move);
+ mCtrlPosY->setEnabled(enable_move);
+ mCtrlPosZ->setEnabled(enable_move);
+
+ if (enable_scale)
+ {
+ vec = objectp->getScale();
+ mCtrlScaleX->set( vec.mV[VX] );
+ mCtrlScaleY->set( vec.mV[VY] );
+ mCtrlScaleZ->set( vec.mV[VZ] );
+ }
+ else
+ {
+ mCtrlScaleX->clear();
+ mCtrlScaleY->clear();
+ mCtrlScaleZ->clear();
+ }
+
+ mLabelSize->setEnabled( enable_scale );
+ mCtrlScaleX->setEnabled( enable_scale );
+ mCtrlScaleY->setEnabled( enable_scale );
+ mCtrlScaleZ->setEnabled( enable_scale );
+
+ LLQuaternion object_rot = objectp->getRotationEdit();
+ object_rot.getEulerAngles(&(mCurEulerDegrees.mV[VX]), &(mCurEulerDegrees.mV[VY]), &(mCurEulerDegrees.mV[VZ]));
+ mCurEulerDegrees *= RAD_TO_DEG;
+ mCurEulerDegrees.mV[VX] = fmod(llround(mCurEulerDegrees.mV[VX], OBJECT_ROTATION_PRECISION) + 360.f, 360.f);
+ mCurEulerDegrees.mV[VY] = fmod(llround(mCurEulerDegrees.mV[VY], OBJECT_ROTATION_PRECISION) + 360.f, 360.f);
+ mCurEulerDegrees.mV[VZ] = fmod(llround(mCurEulerDegrees.mV[VZ], OBJECT_ROTATION_PRECISION) + 360.f, 360.f);
+
+ if (enable_rotate)
+ {
+ mCtrlRotX->set( mCurEulerDegrees.mV[VX] );
+ mCtrlRotY->set( mCurEulerDegrees.mV[VY] );
+ mCtrlRotZ->set( mCurEulerDegrees.mV[VZ] );
+ }
+ else
+ {
+ mCtrlRotX->clear();
+ mCtrlRotY->clear();
+ mCtrlRotZ->clear();
+ }
+
+ mLabelRotation->setEnabled( enable_rotate );
+ mCtrlRotX->setEnabled( enable_rotate );
+ mCtrlRotY->setEnabled( enable_rotate );
+ mCtrlRotZ->setEnabled( enable_rotate );
+
+ BOOL owners_identical;
+ LLUUID owner_id;
+ std::string owner_name;
+ owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name);
+
+ // BUG? Check for all objects being editable?
+ S32 roots_selected = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount();
+ BOOL editable = root_objectp->permModify();
+
+ // Select Single Message
+ getChildView("select_single")->setVisible( FALSE);
+ getChildView("edit_object")->setVisible( FALSE);
+ if (!editable || single_volume || selected_count <= 1)
+ {
+ getChildView("edit_object")->setVisible( TRUE);
+ getChildView("edit_object")->setEnabled(TRUE);
+ }
+ else
+ {
+ getChildView("select_single")->setVisible( TRUE);
+ getChildView("select_single")->setEnabled(TRUE);
+ }
+ // Lock checkbox - only modifiable if you own the object.
+ BOOL self_owned = (gAgent.getID() == owner_id);
+ mCheckLock->setEnabled( roots_selected > 0 && self_owned );
+
+ // More lock and debit checkbox - get the values
+ BOOL valid;
+ U32 owner_mask_on;
+ U32 owner_mask_off;
+ valid = LLSelectMgr::getInstance()->selectGetPerm(PERM_OWNER, &owner_mask_on, &owner_mask_off);
+
+ if(valid)
+ {
+ if(owner_mask_on & PERM_MOVE)
+ {
+ // owner can move, so not locked
+ mCheckLock->set(FALSE);
+ mCheckLock->setTentative(FALSE);
+ }
+ else if(owner_mask_off & PERM_MOVE)
+ {
+ // owner can't move, so locked
+ mCheckLock->set(TRUE);
+ mCheckLock->setTentative(FALSE);
+ }
+ else
+ {
+ // some locked, some not locked
+ mCheckLock->set(FALSE);
+ mCheckLock->setTentative(TRUE);
+ }
+ }
+
+ BOOL is_flexible = volobjp && volobjp->isFlexible();
+
+ // Physics checkbox
+ mIsPhysical = root_objectp->usePhysics();
+ mCheckPhysics->set( mIsPhysical );
+ mCheckPhysics->setEnabled( roots_selected>0
+ && (editable || gAgent.isGodlike())
+ && !is_flexible);
+
+ mIsTemporary = root_objectp->flagTemporaryOnRez();
+ mCheckTemporary->set( mIsTemporary );
+ mCheckTemporary->setEnabled( roots_selected>0 && editable );
+
+ mIsPhantom = root_objectp->flagPhantom();
+ mCheckPhantom->set( mIsPhantom );
+ mCheckPhantom->setEnabled( roots_selected>0 && editable && !is_flexible );
+
+
+#if 0 // 1.9.2
+ mCastShadows = root_objectp->flagCastShadows();
+ mCheckCastShadows->set( mCastShadows );
+ mCheckCastShadows->setEnabled( roots_selected==1 && editable );
+#endif
+
+ //----------------------------------------------------------------------------
+
+ S32 selected_item = MI_BOX;
+ S32 selected_hole = MI_HOLE_SAME;
+ BOOL enabled = FALSE;
+ BOOL hole_enabled = FALSE;
+ F32 scale_x=1.f, scale_y=1.f;
+ BOOL isMesh = FALSE;
+
+ if( !objectp || !objectp->getVolume() || !editable || !single_volume)
+ {
+ // Clear out all geometry fields.
+ mComboBaseType->clear();
+ mSpinHollow->clear();
+ mSpinCutBegin->clear();
+ mSpinCutEnd->clear();
+ mCtrlPathBegin->clear();
+ mCtrlPathEnd->clear();
+ mSpinScaleX->clear();
+ mSpinScaleY->clear();
+ mSpinTwist->clear();
+ mSpinTwistBegin->clear();
+ mComboHoleType->clear();
+ mSpinShearX->clear();
+ mSpinShearY->clear();
+ mSpinTaperX->clear();
+ mSpinTaperY->clear();
+ mSpinRadiusOffset->clear();
+ mSpinRevolutions->clear();
+ mSpinSkew->clear();
+
+ mSelectedType = MI_NONE;
+ }
+ else
+ {
+ // Only allowed to change these parameters for objects
+ // that you have permissions on AND are not attachments.
+ enabled = root_objectp->permModify();
+
+ // Volume type
+ const LLVolumeParams &volume_params = objectp->getVolume()->getParams();
+ U8 path = volume_params.getPathParams().getCurveType();
+ U8 profile_and_hole = volume_params.getProfileParams().getCurveType();
+ U8 profile = profile_and_hole & LL_PCODE_PROFILE_MASK;
+ U8 hole = profile_and_hole & LL_PCODE_HOLE_MASK;
+
+ // Scale goes first so we can differentiate between a sphere and a torus,
+ // which have the same profile and path types.
+
+ // Scale
+ scale_x = volume_params.getRatioX();
+ scale_y = volume_params.getRatioY();
+
+ BOOL linear_path = (path == LL_PCODE_PATH_LINE) || (path == LL_PCODE_PATH_FLEXIBLE);
+ if ( linear_path && profile == LL_PCODE_PROFILE_CIRCLE )
+ {
+ selected_item = MI_CYLINDER;
+ }
+ else if ( linear_path && profile == LL_PCODE_PROFILE_SQUARE )
+ {
+ selected_item = MI_BOX;
+ }
+ else if ( linear_path && profile == LL_PCODE_PROFILE_ISOTRI )
+ {
+ selected_item = MI_PRISM;
+ }
+ else if ( linear_path && profile == LL_PCODE_PROFILE_EQUALTRI )
+ {
+ selected_item = MI_PRISM;
+ }
+ else if ( linear_path && profile == LL_PCODE_PROFILE_RIGHTTRI )
+ {
+ selected_item = MI_PRISM;
+ }
+ else if (path == LL_PCODE_PATH_FLEXIBLE) // shouldn't happen
+ {
+ selected_item = MI_CYLINDER; // reasonable default
+ }
+ else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_CIRCLE && scale_y > 0.75f)
+ {
+ selected_item = MI_SPHERE;
+ }
+ else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_CIRCLE && scale_y <= 0.75f)
+ {
+ selected_item = MI_TORUS;
+ }
+ else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_CIRCLE_HALF)
+ {
+ selected_item = MI_SPHERE;
+ }
+ else if ( path == LL_PCODE_PATH_CIRCLE2 && profile == LL_PCODE_PROFILE_CIRCLE )
+ {
+ // Spirals aren't supported. Make it into a sphere. JC
+ selected_item = MI_SPHERE;
+ }
+ else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_EQUALTRI )
+ {
+ selected_item = MI_RING;
+ }
+ else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_SQUARE && scale_y <= 0.75f)
+ {
+ selected_item = MI_TUBE;
+ }
+ else
+ {
+ llinfos << "Unknown path " << (S32) path << " profile " << (S32) profile << " in getState" << llendl;
+ selected_item = MI_BOX;
+ }
+
+
+ if (objectp->getParameterEntryInUse(LLNetworkData::PARAMS_SCULPT))
+ {
+ selected_item = MI_SCULPT;
+ //LLFirstUse::useSculptedPrim();
+ }
+
+
+ mComboBaseType ->setCurrentByIndex( selected_item );
+ mSelectedType = selected_item;
+
+ // Grab S path
+ F32 begin_s = volume_params.getBeginS();
+ F32 end_s = volume_params.getEndS();
+
+ // Compute cut and advanced cut from S and T
+ F32 begin_t = volume_params.getBeginT();
+ F32 end_t = volume_params.getEndT();
+
+ // Hollowness
+ F32 hollow = volume_params.getHollow();
+ mSpinHollow->set( 100.f * hollow );
+
+ // All hollow objects allow a shape to be selected.
+ if (hollow > 0.f)
+ {
+ switch (hole)
+ {
+ case LL_PCODE_HOLE_CIRCLE:
+ selected_hole = MI_HOLE_CIRCLE;
+ break;
+ case LL_PCODE_HOLE_SQUARE:
+ selected_hole = MI_HOLE_SQUARE;
+ break;
+ case LL_PCODE_HOLE_TRIANGLE:
+ selected_hole = MI_HOLE_TRIANGLE;
+ break;
+ case LL_PCODE_HOLE_SAME:
+ default:
+ selected_hole = MI_HOLE_SAME;
+ break;
+ }
+ mComboHoleType->setCurrentByIndex( selected_hole );
+ hole_enabled = enabled;
+ }
+ else
+ {
+ mComboHoleType->setCurrentByIndex( MI_HOLE_SAME );
+ hole_enabled = FALSE;
+ }
+
+ // Cut interpretation varies based on base object type
+ F32 cut_begin, cut_end, adv_cut_begin, adv_cut_end;
+
+ if ( selected_item == MI_SPHERE || selected_item == MI_TORUS ||
+ selected_item == MI_TUBE || selected_item == MI_RING )
+ {
+ cut_begin = begin_t;
+ cut_end = end_t;
+ adv_cut_begin = begin_s;
+ adv_cut_end = end_s;
+ }
+ else
+ {
+ cut_begin = begin_s;
+ cut_end = end_s;
+ adv_cut_begin = begin_t;
+ adv_cut_end = end_t;
+ }
+
+ mSpinCutBegin ->set( cut_begin );
+ mSpinCutEnd ->set( cut_end );
+ mCtrlPathBegin ->set( adv_cut_begin );
+ mCtrlPathEnd ->set( adv_cut_end );
+
+ // Twist
+ F32 twist = volume_params.getTwist();
+ F32 twist_begin = volume_params.getTwistBegin();
+ // Check the path type for conversion.
+ if (path == LL_PCODE_PATH_LINE || path == LL_PCODE_PATH_FLEXIBLE)
+ {
+ twist *= OBJECT_TWIST_LINEAR_MAX;
+ twist_begin *= OBJECT_TWIST_LINEAR_MAX;
+ }
+ else
+ {
+ twist *= OBJECT_TWIST_MAX;
+ twist_begin *= OBJECT_TWIST_MAX;
+ }
+
+ mSpinTwist ->set( twist );
+ mSpinTwistBegin ->set( twist_begin );
+
+ // Shear
+ F32 shear_x = volume_params.getShearX();
+ F32 shear_y = volume_params.getShearY();
+ mSpinShearX->set( shear_x );
+ mSpinShearY->set( shear_y );
+
+ // Taper
+ F32 taper_x = volume_params.getTaperX();
+ F32 taper_y = volume_params.getTaperY();
+ mSpinTaperX->set( taper_x );
+ mSpinTaperY->set( taper_y );
+
+ // Radius offset.
+ F32 radius_offset = volume_params.getRadiusOffset();
+ // Limit radius offset, based on taper and hole size y.
+ F32 radius_mag = fabs(radius_offset);
+ F32 hole_y_mag = fabs(scale_y);
+ F32 taper_y_mag = fabs(taper_y);
+ // Check to see if the taper effects us.
+ if ( (radius_offset > 0.f && taper_y < 0.f) ||
+ (radius_offset < 0.f && taper_y > 0.f) )
+ {
+ // The taper does not help increase the radius offset range.
+ taper_y_mag = 0.f;
+ }
+ F32 max_radius_mag = 1.f - hole_y_mag * (1.f - taper_y_mag) / (1.f - hole_y_mag);
+ // Enforce the maximum magnitude.
+ if (radius_mag > max_radius_mag)
+ {
+ // Check radius offset sign.
+ if (radius_offset < 0.f)
+ {
+ radius_offset = -max_radius_mag;
+ }
+ else
+ {
+ radius_offset = max_radius_mag;
+ }
+ }
+ mSpinRadiusOffset->set( radius_offset);
+
+ // Revolutions
+ F32 revolutions = volume_params.getRevolutions();
+ mSpinRevolutions->set( revolutions );
+
+ // Skew
+ F32 skew = volume_params.getSkew();
+ // Limit skew, based on revolutions hole size x.
+ F32 skew_mag= fabs(skew);
+ F32 min_skew_mag = 1.0f - 1.0f / (revolutions * scale_x + 1.0f);
+ // Discontinuity; A revolution of 1 allows skews below 0.5.
+ if ( fabs(revolutions - 1.0f) < 0.001)
+ min_skew_mag = 0.0f;
+
+ // Clip skew.
+ if (skew_mag < min_skew_mag)
+ {
+ // Check skew sign.
+ if (skew < 0.0f)
+ {
+ skew = -min_skew_mag;
+ }
+ else
+ {
+ skew = min_skew_mag;
+ }
+ }
+ mSpinSkew->set( skew );
+ }
+
+ // Compute control visibility, label names, and twist range.
+ // Start with defaults.
+ BOOL cut_visible = TRUE;
+ BOOL hollow_visible = TRUE;
+ BOOL top_size_x_visible = TRUE;
+ BOOL top_size_y_visible = TRUE;
+ BOOL top_shear_x_visible = TRUE;
+ BOOL top_shear_y_visible = TRUE;
+ BOOL twist_visible = TRUE;
+ BOOL advanced_cut_visible = FALSE;
+ BOOL taper_visible = FALSE;
+ BOOL skew_visible = FALSE;
+ BOOL radius_offset_visible = FALSE;
+ BOOL revolutions_visible = FALSE;
+ BOOL sculpt_texture_visible = FALSE;
+ F32 twist_min = OBJECT_TWIST_LINEAR_MIN;
+ F32 twist_max = OBJECT_TWIST_LINEAR_MAX;
+ F32 twist_inc = OBJECT_TWIST_LINEAR_INC;
+
+ BOOL advanced_is_dimple = FALSE;
+ BOOL advanced_is_slice = FALSE;
+ BOOL size_is_hole = FALSE;
+
+ // Tune based on overall volume type
+ switch (selected_item)
+ {
+ case MI_SPHERE:
+ top_size_x_visible = FALSE;
+ top_size_y_visible = FALSE;
+ top_shear_x_visible = FALSE;
+ top_shear_y_visible = FALSE;
+ //twist_visible = FALSE;
+ advanced_cut_visible = TRUE;
+ advanced_is_dimple = TRUE;
+ twist_min = OBJECT_TWIST_MIN;
+ twist_max = OBJECT_TWIST_MAX;
+ twist_inc = OBJECT_TWIST_INC;
+ break;
+
+ case MI_TORUS:
+ case MI_TUBE:
+ case MI_RING:
+ //top_size_x_visible = FALSE;
+ //top_size_y_visible = FALSE;
+ size_is_hole = TRUE;
+ skew_visible = TRUE;
+ advanced_cut_visible = TRUE;
+ taper_visible = TRUE;
+ radius_offset_visible = TRUE;
+ revolutions_visible = TRUE;
+ twist_min = OBJECT_TWIST_MIN;
+ twist_max = OBJECT_TWIST_MAX;
+ twist_inc = OBJECT_TWIST_INC;
+
+ break;
+
+ case MI_SCULPT:
+ cut_visible = FALSE;
+ hollow_visible = FALSE;
+ twist_visible = FALSE;
+ top_size_x_visible = FALSE;
+ top_size_y_visible = FALSE;
+ top_shear_x_visible = FALSE;
+ top_shear_y_visible = FALSE;
+ skew_visible = FALSE;
+ advanced_cut_visible = FALSE;
+ taper_visible = FALSE;
+ radius_offset_visible = FALSE;
+ revolutions_visible = FALSE;
+ sculpt_texture_visible = TRUE;
+
+ break;
+
+ case MI_BOX:
+ advanced_cut_visible = TRUE;
+ advanced_is_slice = TRUE;
+ break;
+
+ case MI_CYLINDER:
+ advanced_cut_visible = TRUE;
+ advanced_is_slice = TRUE;
+ break;
+
+ case MI_PRISM:
+ advanced_cut_visible = TRUE;
+ advanced_is_slice = TRUE;
+ break;
+
+ default:
+ break;
+ }
+
+ // Check if we need to change top size/hole size params.
+ switch (selected_item)
+ {
+ case MI_SPHERE:
+ case MI_TORUS:
+ case MI_TUBE:
+ case MI_RING:
+ mSpinScaleX->set( scale_x );
+ mSpinScaleY->set( scale_y );
+ mSpinScaleX->setMinValue(OBJECT_MIN_HOLE_SIZE);
+ mSpinScaleX->setMaxValue(OBJECT_MAX_HOLE_SIZE_X);
+ mSpinScaleY->setMinValue(OBJECT_MIN_HOLE_SIZE);
+ mSpinScaleY->setMaxValue(OBJECT_MAX_HOLE_SIZE_Y);
+ break;
+ default:
+ if (editable)
+ {
+ mSpinScaleX->set( 1.f - scale_x );
+ mSpinScaleY->set( 1.f - scale_y );
+ mSpinScaleX->setMinValue(-1.f);
+ mSpinScaleX->setMaxValue(1.f);
+ mSpinScaleY->setMinValue(-1.f);
+ mSpinScaleY->setMaxValue(1.f);
+ }
+ break;
+ }
+
+ // Check if we need to limit the hollow based on the hole type.
+ if ( selected_hole == MI_HOLE_SQUARE &&
+ ( selected_item == MI_CYLINDER || selected_item == MI_TORUS ||
+ selected_item == MI_PRISM || selected_item == MI_RING ||
+ selected_item == MI_SPHERE ) )
+ {
+ mSpinHollow->setMinValue(0.f);
+ mSpinHollow->setMaxValue(70.f);
+ }
+ else
+ {
+ mSpinHollow->setMinValue(0.f);
+ mSpinHollow->setMaxValue(95.f);
+ }
+
+ // Update field enablement
+ mComboBaseType ->setEnabled( enabled );
+
+ mLabelCut ->setEnabled( enabled );
+ mSpinCutBegin ->setEnabled( enabled );
+ mSpinCutEnd ->setEnabled( enabled );
+
+ mLabelHollow ->setEnabled( enabled );
+ mSpinHollow ->setEnabled( enabled );
+ mLabelHoleType ->setEnabled( hole_enabled );
+ mComboHoleType ->setEnabled( hole_enabled );
+
+ mLabelTwist ->setEnabled( enabled );
+ mSpinTwist ->setEnabled( enabled );
+ mSpinTwistBegin ->setEnabled( enabled );
+
+ mLabelSkew ->setEnabled( enabled );
+ mSpinSkew ->setEnabled( enabled );
+
+ getChildView("scale_hole")->setVisible( FALSE);
+ getChildView("scale_taper")->setVisible( FALSE);
+ if (top_size_x_visible || top_size_y_visible)
+ {
+ if (size_is_hole)
+ {
+ getChildView("scale_hole")->setVisible( TRUE);
+ getChildView("scale_hole")->setEnabled(enabled);
+ }
+ else
+ {
+ getChildView("scale_taper")->setVisible( TRUE);
+ getChildView("scale_taper")->setEnabled(enabled);
+ }
+ }
+
+ mSpinScaleX ->setEnabled( enabled );
+ mSpinScaleY ->setEnabled( enabled );
+
+ mLabelShear ->setEnabled( enabled );
+ mSpinShearX ->setEnabled( enabled );
+ mSpinShearY ->setEnabled( enabled );
+
+ getChildView("advanced_cut")->setVisible( FALSE);
+ getChildView("advanced_dimple")->setVisible( FALSE);
+ getChildView("advanced_slice")->setVisible( FALSE);
+
+ if (advanced_cut_visible)
+ {
+ if (advanced_is_dimple)
+ {
+ getChildView("advanced_dimple")->setVisible( TRUE);
+ getChildView("advanced_dimple")->setEnabled(enabled);
+ }
+
+ else if (advanced_is_slice)
+ {
+ getChildView("advanced_slice")->setVisible( TRUE);
+ getChildView("advanced_slice")->setEnabled(enabled);
+ }
+ else
+ {
+ getChildView("advanced_cut")->setVisible( TRUE);
+ getChildView("advanced_cut")->setEnabled(enabled);
+ }
+ }
+
+ mCtrlPathBegin ->setEnabled( enabled );
+ mCtrlPathEnd ->setEnabled( enabled );
+
+ mLabelTaper ->setEnabled( enabled );
+ mSpinTaperX ->setEnabled( enabled );
+ mSpinTaperY ->setEnabled( enabled );
+
+ mLabelRadiusOffset->setEnabled( enabled );
+ mSpinRadiusOffset ->setEnabled( enabled );
+
+ mLabelRevolutions->setEnabled( enabled );
+ mSpinRevolutions ->setEnabled( enabled );
+
+ // Update field visibility
+ mLabelCut ->setVisible( cut_visible );
+ mSpinCutBegin ->setVisible( cut_visible );
+ mSpinCutEnd ->setVisible( cut_visible );
+
+ mLabelHollow ->setVisible( hollow_visible );
+ mSpinHollow ->setVisible( hollow_visible );
+ mLabelHoleType ->setVisible( hollow_visible );
+ mComboHoleType ->setVisible( hollow_visible );
+
+ mLabelTwist ->setVisible( twist_visible );
+ mSpinTwist ->setVisible( twist_visible );
+ mSpinTwistBegin ->setVisible( twist_visible );
+ mSpinTwist ->setMinValue( twist_min );
+ mSpinTwist ->setMaxValue( twist_max );
+ mSpinTwist ->setIncrement( twist_inc );
+ mSpinTwistBegin ->setMinValue( twist_min );
+ mSpinTwistBegin ->setMaxValue( twist_max );
+ mSpinTwistBegin ->setIncrement( twist_inc );
+
+ mSpinScaleX ->setVisible( top_size_x_visible );
+ mSpinScaleY ->setVisible( top_size_y_visible );
+
+ mLabelSkew ->setVisible( skew_visible );
+ mSpinSkew ->setVisible( skew_visible );
+
+ mLabelShear ->setVisible( top_shear_x_visible || top_shear_y_visible );
+ mSpinShearX ->setVisible( top_shear_x_visible );
+ mSpinShearY ->setVisible( top_shear_y_visible );
+
+ mCtrlPathBegin ->setVisible( advanced_cut_visible );
+ mCtrlPathEnd ->setVisible( advanced_cut_visible );
+
+ mLabelTaper ->setVisible( taper_visible );
+ mSpinTaperX ->setVisible( taper_visible );
+ mSpinTaperY ->setVisible( taper_visible );
+
+ mLabelRadiusOffset->setVisible( radius_offset_visible );
+ mSpinRadiusOffset ->setVisible( radius_offset_visible );
+
+ mLabelRevolutions->setVisible( revolutions_visible );
+ mSpinRevolutions ->setVisible( revolutions_visible );
+
+ mCtrlSculptTexture->setVisible(sculpt_texture_visible);
+ mLabelSculptType->setVisible(sculpt_texture_visible);
+ mCtrlSculptType->setVisible(sculpt_texture_visible);
+
+
+ // sculpt texture
+ if (selected_item == MI_SCULPT)
+ {
+
+
+ LLUUID id;
+ LLSculptParams *sculpt_params = (LLSculptParams *)objectp->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+
+
+ if (sculpt_params) // if we have a legal sculpt param block for this object:
+ {
+ if (mObject != objectp) // we've just selected a new object, so save for undo
+ {
+ mSculptTextureRevert = sculpt_params->getSculptTexture();
+ mSculptTypeRevert = sculpt_params->getSculptType();
+ }
+
+ U8 sculpt_type = sculpt_params->getSculptType();
+ U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK;
+ BOOL sculpt_invert = sculpt_type & LL_SCULPT_FLAG_INVERT;
+ BOOL sculpt_mirror = sculpt_type & LL_SCULPT_FLAG_MIRROR;
+ isMesh = (sculpt_stitching == LL_SCULPT_TYPE_MESH);
+
+ LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
+ if(mTextureCtrl)
+ {
+ mTextureCtrl->setTentative(FALSE);
+ mTextureCtrl->setEnabled(editable && !isMesh);
+ if (editable)
+ mTextureCtrl->setImageAssetID(sculpt_params->getSculptTexture());
+ else
+ mTextureCtrl->setImageAssetID(LLUUID::null);
+ }
+
+ mComboBaseType->setEnabled(!isMesh);
+
+ if (mCtrlSculptType)
+ {
+ mCtrlSculptType->setCurrentByIndex(sculpt_stitching);
+ mCtrlSculptType->setEnabled(editable && !isMesh);
+ }
+
+ if (mCtrlSculptMirror)
+ {
+ mCtrlSculptMirror->set(sculpt_mirror);
+ mCtrlSculptMirror->setEnabled(editable && !isMesh);
+ }
+
+ if (mCtrlSculptInvert)
+ {
+ mCtrlSculptInvert->set(sculpt_invert);
+ mCtrlSculptInvert->setEnabled(editable);
+ }
+
+ if (mLabelSculptType)
+ {
+ mLabelSculptType->setEnabled(TRUE);
+ }
+
+ }
+ }
+ else
+ {
+ mSculptTextureRevert = LLUUID::null;
+ }
+
+ mCtrlSculptMirror->setVisible(sculpt_texture_visible && !isMesh);
+ mCtrlSculptInvert->setVisible(sculpt_texture_visible && !isMesh);
+
+ //----------------------------------------------------------------------------
+
+ mObject = objectp;
+ mRootObject = root_objectp;
+}
+
+// static
+bool LLPanelObject::precommitValidate( const LLSD& data )
+{
+ // TODO: Richard will fill this in later.
+ return TRUE; // FALSE means that validation failed and new value should not be commited.
+}
+
+void LLPanelObject::sendIsPhysical()
+{
+ BOOL value = mCheckPhysics->get();
+ if( mIsPhysical != value )
+ {
+ LLSelectMgr::getInstance()->selectionUpdatePhysics(value);
+ mIsPhysical = value;
+
+ llinfos << "update physics sent" << llendl;
+ }
+ else
+ {
+ llinfos << "update physics not changed" << llendl;
+ }
+}
+
+void LLPanelObject::sendIsTemporary()
+{
+ BOOL value = mCheckTemporary->get();
+ if( mIsTemporary != value )
+ {
+ LLSelectMgr::getInstance()->selectionUpdateTemporary(value);
+ mIsTemporary = value;
+
+ llinfos << "update temporary sent" << llendl;
+ }
+ else
+ {
+ llinfos << "update temporary not changed" << llendl;
+ }
+}
+
+
+void LLPanelObject::sendIsPhantom()
+{
+ BOOL value = mCheckPhantom->get();
+ if( mIsPhantom != value )
+ {
+ LLSelectMgr::getInstance()->selectionUpdatePhantom(value);
+ mIsPhantom = value;
+
+ llinfos << "update phantom sent" << llendl;
+ }
+ else
+ {
+ llinfos << "update phantom not changed" << llendl;
+ }
+}
+
+void LLPanelObject::sendCastShadows()
+{
+ BOOL value = mCheckCastShadows->get();
+ if( mCastShadows != value )
+ {
+ LLSelectMgr::getInstance()->selectionUpdateCastShadows(value);
+ mCastShadows = value;
+
+ llinfos << "update cast shadows sent" << llendl;
+ }
+ else
+ {
+ llinfos << "update cast shadows not changed" << llendl;
+ }
+}
+
+// static
+void LLPanelObject::onCommitParametric( LLUICtrl* ctrl, void* userdata )
+{
+ LLPanelObject* self = (LLPanelObject*) userdata;
+
+ if (self->mObject.isNull())
+ {
+ return;
+ }
+
+ if (self->mObject->getPCode() != LL_PCODE_VOLUME)
+ {
+ // Don't allow modification of non-volume objects.
+ return;
+ }
+
+ LLVolume *volume = self->mObject->getVolume();
+ if (!volume)
+ {
+ return;
+ }
+
+ LLVolumeParams volume_params;
+ self->getVolumeParams(volume_params);
+
+
+
+ // set sculpting
+ S32 selected_type = self->mComboBaseType->getCurrentIndex();
+
+ if (selected_type == MI_SCULPT)
+ {
+ self->mObject->setParameterEntryInUse(LLNetworkData::PARAMS_SCULPT, TRUE, TRUE);
+ LLSculptParams *sculpt_params = (LLSculptParams *)self->mObject->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+ if (sculpt_params)
+ volume_params.setSculptID(sculpt_params->getSculptTexture(), sculpt_params->getSculptType());
+ }
+ else
+ {
+ LLSculptParams *sculpt_params = (LLSculptParams *)self->mObject->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+ if (sculpt_params)
+ self->mObject->setParameterEntryInUse(LLNetworkData::PARAMS_SCULPT, FALSE, TRUE);
+ }
+
+ // Update the volume, if necessary.
+ self->mObject->updateVolume(volume_params);
+
+
+ // This was added to make sure thate when changes are made, the UI
+ // adjusts to present valid options.
+ // *FIX: only some changes, ie, hollow or primitive type changes,
+ // require a refresh.
+ self->refresh();
+
+}
+
+void LLPanelObject::getVolumeParams(LLVolumeParams& volume_params)
+{
+ // Figure out what type of volume to make
+ S32 was_selected_type = mSelectedType;
+ S32 selected_type = mComboBaseType->getCurrentIndex();
+ U8 profile;
+ U8 path;
+ switch ( selected_type )
+ {
+ case MI_CYLINDER:
+ profile = LL_PCODE_PROFILE_CIRCLE;
+ path = LL_PCODE_PATH_LINE;
+ break;
+
+ case MI_BOX:
+ profile = LL_PCODE_PROFILE_SQUARE;
+ path = LL_PCODE_PATH_LINE;
+ break;
+
+ case MI_PRISM:
+ profile = LL_PCODE_PROFILE_EQUALTRI;
+ path = LL_PCODE_PATH_LINE;
+ break;
+
+ case MI_SPHERE:
+ profile = LL_PCODE_PROFILE_CIRCLE_HALF;
+ path = LL_PCODE_PATH_CIRCLE;
+ break;
+
+ case MI_TORUS:
+ profile = LL_PCODE_PROFILE_CIRCLE;
+ path = LL_PCODE_PATH_CIRCLE;
+ break;
+
+ case MI_TUBE:
+ profile = LL_PCODE_PROFILE_SQUARE;
+ path = LL_PCODE_PATH_CIRCLE;
+ break;
+
+ case MI_RING:
+ profile = LL_PCODE_PROFILE_EQUALTRI;
+ path = LL_PCODE_PATH_CIRCLE;
+ break;
+
+ case MI_SCULPT:
+ profile = LL_PCODE_PROFILE_CIRCLE;
+ path = LL_PCODE_PATH_CIRCLE;
+ break;
+
+ default:
+ llwarns << "Unknown base type " << selected_type
+ << " in getVolumeParams()" << llendl;
+ // assume a box
+ selected_type = MI_BOX;
+ profile = LL_PCODE_PROFILE_SQUARE;
+ path = LL_PCODE_PATH_LINE;
+ break;
+ }
+
+
+ if (path == LL_PCODE_PATH_LINE)
+ {
+ LLVOVolume *volobjp = (LLVOVolume *)(LLViewerObject*)(mObject);
+ if (volobjp->isFlexible())
+ {
+ path = LL_PCODE_PATH_FLEXIBLE;
+ }
+ }
+
+ S32 selected_hole = mComboHoleType->getCurrentIndex();
+ U8 hole;
+ switch (selected_hole)
+ {
+ case MI_HOLE_CIRCLE:
+ hole = LL_PCODE_HOLE_CIRCLE;
+ break;
+ case MI_HOLE_SQUARE:
+ hole = LL_PCODE_HOLE_SQUARE;
+ break;
+ case MI_HOLE_TRIANGLE:
+ hole = LL_PCODE_HOLE_TRIANGLE;
+ break;
+ case MI_HOLE_SAME:
+ default:
+ hole = LL_PCODE_HOLE_SAME;
+ break;
+ }
+
+ volume_params.setType(profile | hole, path);
+ mSelectedType = selected_type;
+
+ // Compute cut start/end
+ F32 cut_begin = mSpinCutBegin->get();
+ F32 cut_end = mSpinCutEnd->get();
+
+ // Make sure at least OBJECT_CUT_INC of the object survives
+ if (cut_begin > cut_end - OBJECT_MIN_CUT_INC)
+ {
+ cut_begin = cut_end - OBJECT_MIN_CUT_INC;
+ mSpinCutBegin->set(cut_begin);
+ }
+
+ F32 adv_cut_begin = mCtrlPathBegin->get();
+ F32 adv_cut_end = mCtrlPathEnd->get();
+
+ // Make sure at least OBJECT_CUT_INC of the object survives
+ if (adv_cut_begin > adv_cut_end - OBJECT_MIN_CUT_INC)
+ {
+ adv_cut_begin = adv_cut_end - OBJECT_MIN_CUT_INC;
+ mCtrlPathBegin->set(adv_cut_begin);
+ }
+
+ F32 begin_s, end_s;
+ F32 begin_t, end_t;
+
+ if (selected_type == MI_SPHERE || selected_type == MI_TORUS ||
+ selected_type == MI_TUBE || selected_type == MI_RING)
+ {
+ begin_s = adv_cut_begin;
+ end_s = adv_cut_end;
+
+ begin_t = cut_begin;
+ end_t = cut_end;
+ }
+ else
+ {
+ begin_s = cut_begin;
+ end_s = cut_end;
+
+ begin_t = adv_cut_begin;
+ end_t = adv_cut_end;
+ }
+
+ volume_params.setBeginAndEndS(begin_s, end_s);
+ volume_params.setBeginAndEndT(begin_t, end_t);
+
+ // Hollowness
+ F32 hollow = mSpinHollow->get() / 100.f;
+
+ if ( selected_hole == MI_HOLE_SQUARE &&
+ ( selected_type == MI_CYLINDER || selected_type == MI_TORUS ||
+ selected_type == MI_PRISM || selected_type == MI_RING ||
+ selected_type == MI_SPHERE ) )
+ {
+ if (hollow > 0.7f) hollow = 0.7f;
+ }
+
+ volume_params.setHollow( hollow );
+
+ // Twist Begin,End
+ F32 twist_begin = mSpinTwistBegin->get();
+ F32 twist = mSpinTwist->get();
+ // Check the path type for twist conversion.
+ if (path == LL_PCODE_PATH_LINE || path == LL_PCODE_PATH_FLEXIBLE)
+ {
+ twist_begin /= OBJECT_TWIST_LINEAR_MAX;
+ twist /= OBJECT_TWIST_LINEAR_MAX;
+ }
+ else
+ {
+ twist_begin /= OBJECT_TWIST_MAX;
+ twist /= OBJECT_TWIST_MAX;
+ }
+
+ volume_params.setTwistBegin(twist_begin);
+ volume_params.setTwist(twist);
+
+ // Scale X,Y
+ F32 scale_x = mSpinScaleX->get();
+ F32 scale_y = mSpinScaleY->get();
+ if ( was_selected_type == MI_BOX || was_selected_type == MI_CYLINDER || was_selected_type == MI_PRISM)
+ {
+ scale_x = 1.f - scale_x;
+ scale_y = 1.f - scale_y;
+ }
+
+ // Skew
+ F32 skew = mSpinSkew->get();
+
+ // Taper X,Y
+ F32 taper_x = mSpinTaperX->get();
+ F32 taper_y = mSpinTaperY->get();
+
+ // Radius offset
+ F32 radius_offset = mSpinRadiusOffset->get();
+
+ // Revolutions
+ F32 revolutions = mSpinRevolutions->get();
+
+ if ( selected_type == MI_SPHERE )
+ {
+ // Snap values to valid sphere parameters.
+ scale_x = 1.0f;
+ scale_y = 1.0f;
+ skew = 0.0f;
+ taper_x = 0.0f;
+ taper_y = 0.0f;
+ radius_offset = 0.0f;
+ revolutions = 1.0f;
+ }
+ else if ( selected_type == MI_TORUS || selected_type == MI_TUBE ||
+ selected_type == MI_RING )
+ {
+ scale_x = llclamp(
+ scale_x,
+ OBJECT_MIN_HOLE_SIZE,
+ OBJECT_MAX_HOLE_SIZE_X);
+ scale_y = llclamp(
+ scale_y,
+ OBJECT_MIN_HOLE_SIZE,
+ OBJECT_MAX_HOLE_SIZE_Y);
+
+ // Limit radius offset, based on taper and hole size y.
+ F32 radius_mag = fabs(radius_offset);
+ F32 hole_y_mag = fabs(scale_y);
+ F32 taper_y_mag = fabs(taper_y);
+ // Check to see if the taper effects us.
+ if ( (radius_offset > 0.f && taper_y < 0.f) ||
+ (radius_offset < 0.f && taper_y > 0.f) )
+ {
+ // The taper does not help increase the radius offset range.
+ taper_y_mag = 0.f;
+ }
+ F32 max_radius_mag = 1.f - hole_y_mag * (1.f - taper_y_mag) / (1.f - hole_y_mag);
+ // Enforce the maximum magnitude.
+ if (radius_mag > max_radius_mag)
+ {
+ // Check radius offset sign.
+ if (radius_offset < 0.f)
+ {
+ radius_offset = -max_radius_mag;
+ }
+ else
+ {
+ radius_offset = max_radius_mag;
+ }
+ }
+
+ // Check the skew value against the revolutions.
+ F32 skew_mag= fabs(skew);
+ F32 min_skew_mag = 1.0f - 1.0f / (revolutions * scale_x + 1.0f);
+ // Discontinuity; A revolution of 1 allows skews below 0.5.
+ if ( fabs(revolutions - 1.0f) < 0.001)
+ min_skew_mag = 0.0f;
+
+ // Clip skew.
+ if (skew_mag < min_skew_mag)
+ {
+ // Check skew sign.
+ if (skew < 0.0f)
+ {
+ skew = -min_skew_mag;
+ }
+ else
+ {
+ skew = min_skew_mag;
+ }
+ }
+ }
+
+ volume_params.setRatio( scale_x, scale_y );
+ volume_params.setSkew(skew);
+ volume_params.setTaper( taper_x, taper_y );
+ volume_params.setRadiusOffset(radius_offset);
+ volume_params.setRevolutions(revolutions);
+
+ // Shear X,Y
+ F32 shear_x = mSpinShearX->get();
+ F32 shear_y = mSpinShearY->get();
+ volume_params.setShear( shear_x, shear_y );
+
+ if (selected_type == MI_SCULPT)
+ {
+ volume_params.setSculptID(LLUUID::null, 0);
+ volume_params.setBeginAndEndT (0, 1);
+ volume_params.setBeginAndEndS (0, 1);
+ volume_params.setHollow (0);
+ volume_params.setTwistBegin (0);
+ volume_params.setTwistEnd (0);
+ volume_params.setRatio (1, 0.5);
+ volume_params.setShear (0, 0);
+ volume_params.setTaper (0, 0);
+ volume_params.setRevolutions (1);
+ volume_params.setRadiusOffset (0);
+ volume_params.setSkew (0);
+ }
+
+}
+
+// BUG: Make work with multiple objects
+void LLPanelObject::sendRotation(BOOL btn_down)
+{
+ if (mObject.isNull()) return;
+
+ LLVector3 new_rot(mCtrlRotX->get(), mCtrlRotY->get(), mCtrlRotZ->get());
+ new_rot.mV[VX] = llround(new_rot.mV[VX], OBJECT_ROTATION_PRECISION);
+ new_rot.mV[VY] = llround(new_rot.mV[VY], OBJECT_ROTATION_PRECISION);
+ new_rot.mV[VZ] = llround(new_rot.mV[VZ], OBJECT_ROTATION_PRECISION);
+
+ // Note: must compare before conversion to radians
+ LLVector3 delta = new_rot - mCurEulerDegrees;
+
+ if (delta.magVec() >= 0.0005f)
+ {
+ mCurEulerDegrees = new_rot;
+ new_rot *= DEG_TO_RAD;
+
+ LLQuaternion rotation;
+ rotation.setQuat(new_rot.mV[VX], new_rot.mV[VY], new_rot.mV[VZ]);
+
+ if (mRootObject != mObject)
+ {
+ rotation = rotation * ~mRootObject->getRotationRegion();
+ }
+ std::vector<LLVector3>& child_positions = mObject->mUnselectedChildrenPositions ;
+ std::vector<LLQuaternion> child_rotations;
+ if (mObject->isRootEdit())
+ {
+ mObject->saveUnselectedChildrenRotation(child_rotations) ;
+ mObject->saveUnselectedChildrenPosition(child_positions) ;
+ }
+
+ mObject->setRotation(rotation);
+ LLManip::rebuild(mObject) ;
+
+ // for individually selected roots, we need to counterrotate all the children
+ if (mObject->isRootEdit())
+ {
+ mObject->resetChildrenRotationAndPosition(child_rotations, child_positions) ;
+ }
+
+ if(!btn_down)
+ {
+ child_positions.clear() ;
+ LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_ROTATION | UPD_POSITION);
+ }
+ }
+}
+
+
+// BUG: Make work with multiple objects
+void LLPanelObject::sendScale(BOOL btn_down)
+{
+ if (mObject.isNull()) return;
+
+ LLVector3 newscale(mCtrlScaleX->get(), mCtrlScaleY->get(), mCtrlScaleZ->get());
+
+ LLVector3 delta = newscale - mObject->getScale();
+ if (delta.magVec() >= 0.0005f)
+ {
+ // scale changed by more than 1/2 millimeter
+
+ // check to see if we aren't scaling the textures
+ // (in which case the tex coord's need to be recomputed)
+ BOOL dont_stretch_textures = !LLManipScale::getStretchTextures();
+ if (dont_stretch_textures)
+ {
+ LLSelectMgr::getInstance()->saveSelectedObjectTransform(SELECT_ACTION_TYPE_SCALE);
+ }
+
+ mObject->setScale(newscale, TRUE);
+
+ if(!btn_down)
+ {
+ LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_SCALE | UPD_POSITION);
+ }
+
+ LLSelectMgr::getInstance()->adjustTexturesByScale(TRUE, !dont_stretch_textures);
+// llinfos << "scale sent" << llendl;
+ }
+ else
+ {
+// llinfos << "scale not changed" << llendl;
+ }
+}
+
+
+void LLPanelObject::sendPosition(BOOL btn_down)
+{
+ if (mObject.isNull()) return;
+
+ LLVector3 newpos(mCtrlPosX->get(), mCtrlPosY->get(), mCtrlPosZ->get());
+ LLViewerRegion* regionp = mObject->getRegion();
+
+ // Clamp the Z height
+ const F32 height = newpos.mV[VZ];
+ const F32 min_height = LLWorld::getInstance()->getMinAllowedZ(mObject, mObject->getPositionGlobal());
+ const F32 max_height = LLWorld::getInstance()->getRegionMaxHeight();
+
+ if (!mObject->isAttachment())
+ {
+ if ( height < min_height)
+ {
+ newpos.mV[VZ] = min_height;
+ mCtrlPosZ->set( min_height );
+ }
+ else if ( height > max_height )
+ {
+ newpos.mV[VZ] = max_height;
+ mCtrlPosZ->set( max_height );
+ }
+
+ // Grass is always drawn on the ground, so clamp its position to the ground
+ if (mObject->getPCode() == LL_PCODE_LEGACY_GRASS)
+ {
+ mCtrlPosZ->set(LLWorld::getInstance()->resolveLandHeightAgent(newpos) + 1.f);
+ }
+ }
+
+ // Make sure new position is in a valid region, so the object
+ // won't get dumped by the simulator.
+ LLVector3d new_pos_global = regionp->getPosGlobalFromRegion(newpos);
+
+ if ( LLWorld::getInstance()->positionRegionValidGlobal(new_pos_global) )
+ {
+ // send only if the position is changed, that is, the delta vector is not zero
+ LLVector3d old_pos_global = mObject->getPositionGlobal();
+ LLVector3d delta = new_pos_global - old_pos_global;
+ // moved more than 1/2 millimeter
+ if (delta.magVec() >= 0.0005f)
+ {
+ if (mRootObject != mObject)
+ {
+ newpos = newpos - mRootObject->getPositionRegion();
+ newpos = newpos * ~mRootObject->getRotationRegion();
+ mObject->setPositionParent(newpos);
+ }
+ else
+ {
+ mObject->setPositionEdit(newpos);
+ }
+
+ LLManip::rebuild(mObject) ;
+
+ // for individually selected roots, we need to counter-translate all unselected children
+ if (mObject->isRootEdit())
+ {
+ // only offset by parent's translation
+ mObject->resetChildrenPosition(LLVector3(-delta), TRUE) ;
+ }
+
+ if(!btn_down)
+ {
+ LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_POSITION);
+ }
+
+ LLSelectMgr::getInstance()->updateSelectionCenter();
+ }
+ }
+ else
+ {
+ // move failed, so we update the UI with the correct values
+ LLVector3 vec = mRootObject->getPositionRegion();
+ mCtrlPosX->set(vec.mV[VX]);
+ mCtrlPosY->set(vec.mV[VY]);
+ mCtrlPosZ->set(vec.mV[VZ]);
+ }
+}
+
+void LLPanelObject::sendSculpt()
+{
+ if (mObject.isNull())
+ return;
+
+ LLSculptParams sculpt_params;
+
+ if (mCtrlSculptTexture)
+ sculpt_params.setSculptTexture(mCtrlSculptTexture->getImageAssetID());
+
+ U8 sculpt_type = 0;
+
+ if (mCtrlSculptType)
+ sculpt_type |= mCtrlSculptType->getCurrentIndex();
+
+ bool enabled = sculpt_type != LL_SCULPT_TYPE_MESH;
+
+ if (mCtrlSculptMirror)
+ {
+ mCtrlSculptMirror->setEnabled(enabled ? TRUE : FALSE);
+ }
+ if (mCtrlSculptInvert)
+ {
+ mCtrlSculptInvert->setEnabled(enabled ? TRUE : FALSE);
+ }
+
+ if ((mCtrlSculptMirror) && (mCtrlSculptMirror->get()))
+ sculpt_type |= LL_SCULPT_FLAG_MIRROR;
+
+ if ((mCtrlSculptInvert) && (mCtrlSculptInvert->get()))
+ sculpt_type |= LL_SCULPT_FLAG_INVERT;
+
+ sculpt_params.setSculptType(sculpt_type);
+ mObject->setParameterEntry(LLNetworkData::PARAMS_SCULPT, sculpt_params, TRUE);
+}
+
+void LLPanelObject::refresh()
+{
+ getState();
+ if (mObject.notNull() && mObject->isDead())
+ {
+ mObject = NULL;
+ }
+
+ if (mRootObject.notNull() && mRootObject->isDead())
+ {
+ mRootObject = NULL;
+ }
+
+ bool enable_mesh = gSavedSettings.getBOOL("MeshEnabled") &&
+ gAgent.getRegion() &&
+ !gAgent.getRegion()->getCapability("GetMesh").empty();
+
+ F32 max_scale = get_default_max_prim_scale(LLPickInfo::isFlora(mObject));
+
+ getChild<LLSpinCtrl>("Scale X")->setMaxValue(max_scale);
+ getChild<LLSpinCtrl>("Scale Y")->setMaxValue(max_scale);
+ getChild<LLSpinCtrl>("Scale Z")->setMaxValue(max_scale);
+
+ BOOL found = mCtrlSculptType->itemExists("Mesh");
+ if (enable_mesh && !found)
+ {
+ mCtrlSculptType->add("Mesh");
+ }
+ else if (!enable_mesh && found)
+ {
+ mCtrlSculptType->remove("Mesh");
+ }
+}
+
+
+void LLPanelObject::draw()
+{
+ const LLColor4 white( 1.0f, 1.0f, 1.0f, 1);
+ const LLColor4 red( 1.0f, 0.25f, 0.f, 1);
+ const LLColor4 green( 0.f, 1.0f, 0.f, 1);
+ const LLColor4 blue( 0.f, 0.5f, 1.0f, 1);
+
+ // Tune the colors of the labels
+ LLTool* tool = LLToolMgr::getInstance()->getCurrentTool();
+
+ if (tool == LLToolCompTranslate::getInstance())
+ {
+ mCtrlPosX ->setLabelColor(red);
+ mCtrlPosY ->setLabelColor(green);
+ mCtrlPosZ ->setLabelColor(blue);
+
+ mCtrlScaleX ->setLabelColor(white);
+ mCtrlScaleY ->setLabelColor(white);
+ mCtrlScaleZ ->setLabelColor(white);
+
+ mCtrlRotX ->setLabelColor(white);
+ mCtrlRotY ->setLabelColor(white);
+ mCtrlRotZ ->setLabelColor(white);
+ }
+ else if ( tool == LLToolCompScale::getInstance() )
+ {
+ mCtrlPosX ->setLabelColor(white);
+ mCtrlPosY ->setLabelColor(white);
+ mCtrlPosZ ->setLabelColor(white);
+
+ mCtrlScaleX ->setLabelColor(red);
+ mCtrlScaleY ->setLabelColor(green);
+ mCtrlScaleZ ->setLabelColor(blue);
+
+ mCtrlRotX ->setLabelColor(white);
+ mCtrlRotY ->setLabelColor(white);
+ mCtrlRotZ ->setLabelColor(white);
+ }
+ else if ( tool == LLToolCompRotate::getInstance() )
+ {
+ mCtrlPosX ->setLabelColor(white);
+ mCtrlPosY ->setLabelColor(white);
+ mCtrlPosZ ->setLabelColor(white);
+
+ mCtrlScaleX ->setLabelColor(white);
+ mCtrlScaleY ->setLabelColor(white);
+ mCtrlScaleZ ->setLabelColor(white);
+
+ mCtrlRotX ->setLabelColor(red);
+ mCtrlRotY ->setLabelColor(green);
+ mCtrlRotZ ->setLabelColor(blue);
+ }
+ else
+ {
+ mCtrlPosX ->setLabelColor(white);
+ mCtrlPosY ->setLabelColor(white);
+ mCtrlPosZ ->setLabelColor(white);
+
+ mCtrlScaleX ->setLabelColor(white);
+ mCtrlScaleY ->setLabelColor(white);
+ mCtrlScaleZ ->setLabelColor(white);
+
+ mCtrlRotX ->setLabelColor(white);
+ mCtrlRotY ->setLabelColor(white);
+ mCtrlRotZ ->setLabelColor(white);
+ }
+
+ LLPanel::draw();
+}
+
+// virtual
+void LLPanelObject::clearCtrls()
+{
+ LLPanel::clearCtrls();
+
+ mCheckLock ->set(FALSE);
+ mCheckLock ->setEnabled( FALSE );
+ mCheckPhysics ->set(FALSE);
+ mCheckPhysics ->setEnabled( FALSE );
+ mCheckTemporary ->set(FALSE);
+ mCheckTemporary ->setEnabled( FALSE );
+ mCheckPhantom ->set(FALSE);
+ mCheckPhantom ->setEnabled( FALSE );
+
+#if 0 // 1.9.2
+ mCheckCastShadows->set(FALSE);
+ mCheckCastShadows->setEnabled( FALSE );
+#endif
+ // Disable text labels
+ mLabelPosition ->setEnabled( FALSE );
+ mLabelSize ->setEnabled( FALSE );
+ mLabelRotation ->setEnabled( FALSE );
+ mLabelCut ->setEnabled( FALSE );
+ mLabelHollow ->setEnabled( FALSE );
+ mLabelHoleType ->setEnabled( FALSE );
+ mLabelTwist ->setEnabled( FALSE );
+ mLabelSkew ->setEnabled( FALSE );
+ mLabelShear ->setEnabled( FALSE );
+ mLabelTaper ->setEnabled( FALSE );
+ mLabelRadiusOffset->setEnabled( FALSE );
+ mLabelRevolutions->setEnabled( FALSE );
+
+ getChildView("select_single")->setVisible( FALSE);
+ getChildView("edit_object")->setVisible( TRUE);
+ getChildView("edit_object")->setEnabled(FALSE);
+
+ getChildView("scale_hole")->setEnabled(FALSE);
+ getChildView("scale_taper")->setEnabled(FALSE);
+ getChildView("advanced_cut")->setEnabled(FALSE);
+ getChildView("advanced_dimple")->setEnabled(FALSE);
+ getChildView("advanced_slice")->setVisible( FALSE);
+}
+
+//
+// Static functions
+//
+
+// static
+void LLPanelObject::onCommitLock(LLUICtrl *ctrl, void *data)
+{
+ // Checkbox will have toggled itself
+ LLPanelObject *self = (LLPanelObject *)data;
+
+ if(self->mRootObject.isNull()) return;
+
+ BOOL new_state = self->mCheckLock->get();
+
+ LLSelectMgr::getInstance()->selectionSetObjectPermissions(PERM_OWNER, !new_state, PERM_MOVE | PERM_MODIFY);
+}
+
+// static
+void LLPanelObject::onCommitPosition( LLUICtrl* ctrl, void* userdata )
+{
+ LLPanelObject* self = (LLPanelObject*) userdata;
+ BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ;
+ self->sendPosition(btn_down);
+}
+
+// static
+void LLPanelObject::onCommitScale( LLUICtrl* ctrl, void* userdata )
+{
+ LLPanelObject* self = (LLPanelObject*) userdata;
+ BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ;
+ self->sendScale(btn_down);
+}
+
+// static
+void LLPanelObject::onCommitRotation( LLUICtrl* ctrl, void* userdata )
+{
+ LLPanelObject* self = (LLPanelObject*) userdata;
+ BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ;
+ self->sendRotation(btn_down);
+}
+
+// static
+void LLPanelObject::onCommitPhysics( LLUICtrl* ctrl, void* userdata )
+{
+ LLPanelObject* self = (LLPanelObject*) userdata;
+ self->sendIsPhysical();
+}
+
+// static
+void LLPanelObject::onCommitTemporary( LLUICtrl* ctrl, void* userdata )
+{
+ LLPanelObject* self = (LLPanelObject*) userdata;
+ self->sendIsTemporary();
+}
+
+// static
+void LLPanelObject::onCommitPhantom( LLUICtrl* ctrl, void* userdata )
+{
+ LLPanelObject* self = (LLPanelObject*) userdata;
+ self->sendIsPhantom();
+}
+
+// static
+void LLPanelObject::onCommitCastShadows( LLUICtrl* ctrl, void* userdata )
+{
+ LLPanelObject* self = (LLPanelObject*) userdata;
+ self->sendCastShadows();
+}
+
+
+void LLPanelObject::onSelectSculpt(const LLSD& data)
+{
+ LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
+
+ if (mTextureCtrl)
+ {
+ mSculptTextureRevert = mTextureCtrl->getImageAssetID();
+ }
+
+ sendSculpt();
+}
+
+
+void LLPanelObject::onCommitSculpt( const LLSD& data )
+{
+ sendSculpt();
+}
+
+BOOL LLPanelObject::onDropSculpt(LLInventoryItem* item)
+{
+ LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
+
+ if (mTextureCtrl)
+ {
+ LLUUID asset = item->getAssetUUID();
+
+ mTextureCtrl->setImageAssetID(asset);
+ mSculptTextureRevert = asset;
+ }
+
+ return TRUE;
+}
+
+
+void LLPanelObject::onCancelSculpt(const LLSD& data)
+{
+ LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
+ if(!mTextureCtrl)
+ return;
+
+ mTextureCtrl->setImageAssetID(mSculptTextureRevert);
+
+ sendSculpt();
+}
+
+// static
+void LLPanelObject::onCommitSculptType(LLUICtrl *ctrl, void* userdata)
+{
+ LLPanelObject* self = (LLPanelObject*) userdata;
+
+ self->sendSculpt();
+}
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 00ac34efa5..46262832dc 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -91,11 +91,18 @@ public: LLParcelHandler() : LLCommandHandler("parcel", UNTRUSTED_THROTTLE) { } bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web) - { + { if (params.size() < 2) { return false; } + + if (!LLUI::sSettingGroups["config"]->getBOOL("EnablePlaceProfile")) + { + LLNotificationsUtil::add("NoPlaceInfo", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit")); + return true; + } + LLUUID parcel_id; if (!parcel_id.set(params[0], FALSE)) { diff --git a/indra/newview/llpanelvoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp index aef870d352..dc87bd0077 100644 --- a/indra/newview/llpanelvoicedevicesettings.cpp +++ b/indra/newview/llpanelvoicedevicesettings.cpp @@ -51,6 +51,7 @@ LLPanelVoiceDeviceSettings::LLPanelVoiceDeviceSettings() mInputDevice = gSavedSettings.getString("VoiceInputAudioDevice"); mOutputDevice = gSavedSettings.getString("VoiceOutputAudioDevice"); mDevicesUpdated = FALSE; + mUseTuningMode = true; // grab "live" mic volume level mMicVolume = gSavedSettings.getF32("AudioLevelMic"); @@ -96,7 +97,7 @@ void LLPanelVoiceDeviceSettings::draw() // let user know that volume indicator is not yet available bool is_in_tuning_mode = LLVoiceClient::getInstance()->inTuningMode(); - getChildView("wait_text")->setVisible( !is_in_tuning_mode); + getChildView("wait_text")->setVisible( !is_in_tuning_mode && mUseTuningMode); LLPanel::draw(); @@ -220,23 +221,7 @@ void LLPanelVoiceDeviceSettings::refresh() iter != LLVoiceClient::getInstance()->getCaptureDevices().end(); iter++) { - // Lets try to localize some system device names. EXT-8375 - std::string device_name = *iter; - LLStringUtil::toLower(device_name); //compare in low case - if ("default system device" == device_name) - { - device_name = getString(device_name); - } - else if ("no device" == device_name) - { - device_name = getString(device_name); - } - else - { - // restore original value - device_name = *iter; - } - mCtrlInputDevices->add(device_name, ADD_BOTTOM ); + mCtrlInputDevices->add( *iter, ADD_BOTTOM ); } if(!mCtrlInputDevices->setSimple(mInputDevice)) @@ -253,23 +238,7 @@ void LLPanelVoiceDeviceSettings::refresh() for(iter= LLVoiceClient::getInstance()->getRenderDevices().begin(); iter != LLVoiceClient::getInstance()->getRenderDevices().end(); iter++) { - // Lets try to localize some system device names. EXT-8375 - std::string device_name = *iter; - LLStringUtil::toLower(device_name); //compare in low case - if ("default system device" == device_name) - { - device_name = getString(device_name); - } - else if ("no device" == device_name) - { - device_name = getString(device_name); - } - else - { - // restore original value - device_name = *iter; - } - mCtrlOutputDevices->add(device_name, ADD_BOTTOM ); + mCtrlOutputDevices->add( *iter, ADD_BOTTOM ); } if(!mCtrlOutputDevices->setSimple(mOutputDevice)) @@ -292,14 +261,20 @@ void LLPanelVoiceDeviceSettings::initialize() LLVoiceClient::getInstance()->refreshDeviceLists(); // put voice client in "tuning" mode - LLVoiceClient::getInstance()->tuningStart(); - LLVoiceChannel::suspend(); + if (mUseTuningMode) + { + LLVoiceClient::getInstance()->tuningStart(); + LLVoiceChannel::suspend(); + } } void LLPanelVoiceDeviceSettings::cleanup() { - LLVoiceClient::getInstance()->tuningStop(); - LLVoiceChannel::resume(); + if (mUseTuningMode) + { + LLVoiceClient::getInstance()->tuningStop(); + LLVoiceChannel::resume(); + } } void LLPanelVoiceDeviceSettings::onCommitInputDevice() @@ -316,6 +291,6 @@ void LLPanelVoiceDeviceSettings::onCommitOutputDevice() if(LLVoiceClient::getInstance()) { LLVoiceClient::getInstance()->setRenderDevice( - getChild<LLComboBox>("voice_input_device")->getValue().asString()); + getChild<LLComboBox>("voice_output_device")->getValue().asString()); } } diff --git a/indra/newview/llpanelvoicedevicesettings.h b/indra/newview/llpanelvoicedevicesettings.h index 636b8b9948..d09476d469 100644 --- a/indra/newview/llpanelvoicedevicesettings.h +++ b/indra/newview/llpanelvoicedevicesettings.h @@ -45,6 +45,8 @@ public: void cleanup(); /*virtual*/ void handleVisibilityChange ( BOOL new_visibility ); + + void setUseTuningMode(bool use) { mUseTuningMode = use; }; protected: void onCommitInputDevice(); @@ -56,6 +58,7 @@ protected: class LLComboBox *mCtrlInputDevices; class LLComboBox *mCtrlOutputDevices; BOOL mDevicesUpdated; + bool mUseTuningMode; }; #endif // LL_LLPANELVOICEDEVICESETTINGS_H diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index 4b2c569cc3..450f9b2be7 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -770,7 +770,7 @@ LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_ int nverts = mSharedData->mNumVertices; int nfloats = nverts * (2*4 + 3*3 + 2 + 4); //use 16 byte aligned vertex data to make LLPolyMesh SSE friendly - mVertexData = (F32*) malloc(nfloats*4); + mVertexData = (F32*) ll_aligned_malloc_16(nfloats*4); int offset = 0; mCoords = (LLVector4*)(mVertexData + offset); offset += 4*nverts; mNormals = (LLVector4*)(mVertexData + offset); offset += 4*nverts; @@ -799,7 +799,7 @@ LLPolyMesh::~LLPolyMesh() mJointRenderData[i] = NULL; } - free(mVertexData); + ll_aligned_free_16(mVertexData); } diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index 8e5beb33ce..9f5c55bad1 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -34,6 +34,7 @@ #include "llassetuploadresponders.h" #include "llcheckboxctrl.h" #include "llcombobox.h" +#include "lldatapacker.h" #include "lldelayedgestureerror.h" #include "llfloaterreg.h" #include "llgesturemgr.h" diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index c8c6858b81..fbd2f7ca83 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -39,6 +39,7 @@ #include "llinventoryobserver.h" #include "lllineeditor.h" #include "llradiogroup.h" +#include "llslurl.h" #include "llviewercontrol.h" #include "llviewerinventory.h" #include "llviewerobjectlist.h" diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index e4c2293938..631b244785 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -127,8 +127,6 @@ protected: void undock(LLFloater* floater_tab); LLSideTray* getSideTray(); - - void onFloaterClose(LLSD::Boolean app_quitting); public: virtual ~LLSideTrayTab(); @@ -146,7 +144,7 @@ public: void onOpen (const LLSD& key); - void toggleTabDocked(); + void toggleTabDocked(bool toggle_floater = true); void setDocked(bool dock); bool isDocked() const; @@ -160,7 +158,6 @@ private: std::string mDescription; LLView* mMainPanel; - boost::signals2::connection mFloaterCloseConn; }; LLSideTrayTab::LLSideTrayTab(const Params& p) @@ -196,8 +193,8 @@ BOOL LLSideTrayTab::postBuild() title_panel->getChild<LLTextBox>(TAB_PANEL_CAPTION_TITLE_BOX)->setValue(mTabTitle); - getChild<LLButton>("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::toggleTabDocked, this)); - getChild<LLButton>("dock")->setCommitCallback(boost::bind(&LLSideTrayTab::toggleTabDocked, this)); + getChild<LLButton>("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, false)); + getChild<LLButton>("dock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, true)); return true; } @@ -253,14 +250,16 @@ LLSideTray* LLSideTrayTab::getSideTray() return side_tray; } -void LLSideTrayTab::toggleTabDocked() +void LLSideTrayTab::toggleTabDocked(bool toggle_floater /* = true */) { + // *FIX: Calling this method twice per frame would crash the viewer. + std::string tab_name = getName(); LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name); if (!floater_tab) return; - bool docking = LLFloater::isShown(floater_tab); + bool docking = !isDocked(); // Hide the "Tear Off" button when a tab gets undocked // and show "Dock" button instead. @@ -278,7 +277,10 @@ void LLSideTrayTab::toggleTabDocked() // Open/close the floater *after* we reparent the tab panel, // so that it doesn't receive redundant visibility change notifications. - LLFloaterReg::toggleInstance("side_bar_tab", tab_name); + if (toggle_floater) + { + LLFloaterReg::toggleInstance("side_bar_tab", tab_name); + } } // Same as toggleTabDocked() apart from making sure that we do exactly what we want. @@ -298,18 +300,6 @@ bool LLSideTrayTab::isDocked() const return dynamic_cast<LLSideTray*>(getParent()) != NULL; } -void LLSideTrayTab::onFloaterClose(LLSD::Boolean app_quitting) -{ - // If user presses Ctrl-Shift-W, handle that gracefully by docking all - // undocked tabs before their floaters get destroyed (STORM-1016). - - // Don't dock on quit for the current dock state to be correctly saved. - if (app_quitting) return; - - lldebugs << "Forcibly docking tab " << getName() << llendl; - setDocked(true); -} - BOOL LLSideTrayTab::handleScrollWheel(S32 x, S32 y, S32 clicks) { // Let children handle the event @@ -333,7 +323,6 @@ void LLSideTrayTab::dock(LLFloater* floater_tab) return; } - mFloaterCloseConn.disconnect(); setRect(side_tray->getLocalRect()); reshape(getRect().getWidth(), getRect().getHeight()); @@ -382,7 +371,6 @@ void LLSideTrayTab::undock(LLFloater* floater_tab) } floater_tab->addChild(this); - mFloaterCloseConn = floater_tab->setCloseCallback(boost::bind(&LLSideTrayTab::onFloaterClose, this, _2)); floater_tab->setTitle(mTabTitle); floater_tab->setName(getName()); @@ -510,7 +498,7 @@ public: LLSideTrayTab* tab = side_tray->getTab(getName()); if (!tab) return FALSE; - tab->toggleTabDocked(); + tab->setDocked(false); LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab->getName()); if (!floater_tab) return FALSE; @@ -681,7 +669,7 @@ LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel if (tab_attached && LLUI::sSettingGroups["config"]->getBOOL("OpenSidePanelsInFloaters")) { - tab->toggleTabDocked(); + tab->setDocked(false); tab_attached = false; } @@ -1102,7 +1090,7 @@ void LLSideTray::detachTabs() if (!is_visible) continue; llassert(isTabAttached(tab->getName())); - tab->toggleTabDocked(); + tab->setDocked(false); } } @@ -1354,8 +1342,9 @@ bool LLSideTray::isPanelActive(const std::string& panel_name) return (panel->getName() == panel_name); } -void LLSideTray::setTabDocked(const std::string& tab_name, bool dock) +void LLSideTray::setTabDocked(const std::string& tab_name, bool dock, bool toggle_floater /* = true*/) { + // Lookup tab by name. LLSideTrayTab* tab = getTab(tab_name); if (!tab) { // not a docked tab, look through detached tabs @@ -1372,20 +1361,12 @@ void LLSideTray::setTabDocked(const std::string& tab_name, bool dock) } - if (tab) - { - bool tab_attached = isTabAttached(tab_name); - LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name); - if (!floater_tab) return; + llassert(tab != NULL); - if (dock && !tab_attached) - { - tab->dock(floater_tab); - } - else if (!dock && tab_attached) - { - tab->undock(floater_tab); - } + // Toggle its dock state. + if (tab && tab->isDocked() != dock) + { + tab->toggleTabDocked(toggle_floater); } } diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 46765bfbcc..24882411f4 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -121,7 +121,7 @@ public: LLPanel* getActivePanel (); bool isPanelActive (const std::string& panel_name); - void setTabDocked(const std::string& tab_name, bool dock); + void setTabDocked(const std::string& tab_name, bool dock, bool toggle_floater = true); /* * get the panel of given type T (don't show it or do anything else with it) diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 65f7d299bc..fa329eb0ae 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -1742,8 +1742,6 @@ LLSpatialPartition::LLSpatialPartition(U32 data_mask, BOOL render_by_group, U32 mSlopRatio = 0.25f; mInfiniteFarClip = FALSE; - LLGLNamePool::registerPool(&sQueryPool); - LLVector4a center, size; center.splat(0.f); size.splat(1.f); @@ -3169,11 +3167,11 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume) LLConvexDecomposition::getInstance()->generateSingleHullMeshFromMesh( &mesh, &res ); //copy res into phys_volume - phys_volume->mHullPoints = (LLVector4a*) malloc(sizeof(LLVector4a)*res.mNumVertices); + phys_volume->mHullPoints = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*res.mNumVertices); phys_volume->mNumHullPoints = res.mNumVertices; S32 idx_size = (res.mNumTriangles*3*2+0xF) & ~0xF; - phys_volume->mHullIndices = (U16*) malloc(idx_size); + phys_volume->mHullIndices = (U16*) ll_aligned_malloc_16(idx_size); phys_volume->mNumHullIndices = res.mNumTriangles*3; const F32* v = res.mVertexBase; diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp index d52e0a6c86..d3e96f8dfb 100644 --- a/indra/newview/llspeakbutton.cpp +++ b/indra/newview/llspeakbutton.cpp @@ -54,26 +54,6 @@ LLSpeakButton::Params::Params() // See widgets/talk_button.xml } -void LLSpeakButton::draw() -{ - // LLVoiceClient::getInstance() is the authoritative global source of info regarding our open-mic state, we merely reflect that state. - bool openmic = LLVoiceClient::getInstance()->getUserPTTState(); - bool voiceenabled = LLVoiceClient::getInstance()->voiceEnabled(); - mSpeakBtn->setToggleState(openmic && voiceenabled); - mOutputMonitor->setIsMuted(!voiceenabled); - LLUICtrl::draw(); -} -void LLSpeakButton::setSpeakBtnEnabled(bool enabled) -{ - LLButton* speak_btn = getChild<LLButton>("speak_btn"); - speak_btn->setEnabled(enabled); -} -void LLSpeakButton::setFlyoutBtnEnabled(bool enabled) -{ - LLButton* show_btn = getChild<LLBottomtrayButton>("speak_flyout_btn"); - show_btn->setEnabled(enabled); -} - LLSpeakButton::LLSpeakButton(const Params& p) : LLUICtrl(p) , mOutputMonitor(NULL) diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h index 2fdf80c1f2..7db01112ef 100644 --- a/indra/newview/llspeakbutton.h +++ b/indra/newview/llspeakbutton.h @@ -53,12 +53,7 @@ public: }; /*virtual*/ ~LLSpeakButton(); - /*virtual*/ void draw(); - // methods for enabling/disabling right and left parts of speak button separately(EXT-4648) - void setSpeakBtnEnabled(bool enabled); - void setFlyoutBtnEnabled(bool enabled); - // *HACK: Need to put tooltips in a translatable location, // the panel that contains this button. void setSpeakToolTip(const std::string& msg); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 277d2430ce..141a81c717 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -995,6 +995,7 @@ bool idle_startup() if(STATE_LOGIN_PROCESS_RESPONSE == LLStartUp::getStartupState()) { + // Generic failure message std::ostringstream emsg; emsg << LLTrans::getString("LoginFailed") << "\n"; if(LLLoginInstance::getInstance()->authFailure()) @@ -1003,24 +1004,32 @@ bool idle_startup() << LLLoginInstance::getInstance()->getResponse() << LL_ENDL; LLSD response = LLLoginInstance::getInstance()->getResponse(); // Still have error conditions that may need some - // sort of handling. + // sort of handling - dig up specific message std::string reason_response = response["reason"]; std::string message_response = response["message"]; - - if(!message_response.empty()) + std::string message_id = response["message_id"]; + std::string message; // actual string to show the user + + if(!message_id.empty() && LLTrans::findString(message, message_id, response["message_args"])) { - // XUI: fix translation for strings returned during login - // We need a generic table for translations - std::string big_reason = LLAgent::sTeleportErrorMessages[ message_response ]; - if ( big_reason.size() == 0 ) - { - emsg << message_response; - } - else - { - emsg << big_reason; - } + // message will be filled in with the template and arguments } + else if(!message_response.empty()) + { + // *HACK: "no_inventory_host" sent as the message itself. + // Remove this clause when server is sending message_id as well. + message = LLAgent::sTeleportErrorMessages[ message_response ]; + } + + if (message.empty()) + { + // Fallback to server-supplied string; necessary since server + // may add strings that this viewer is not yet aware of + message = message_response; + } + + emsg << message; + if(reason_response == "key") { diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 09918c28d8..d23d2b3abd 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -35,7 +35,6 @@ #include "llagentwearables.h" #include "llappearancemgr.h" #include "lldictionary.h" -//#include "llfirstuse.h" #include "llfloaterreg.h" #include "llfloatertools.h" #include "llgesturemgr.h" diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 06e0d17b8c..9ec4d33036 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -688,6 +688,15 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask) return LLTool::handleMouseUp(x, y, mask); } +void LLToolPie::stopClickToWalk() +{ + mPick.mPosGlobal = gAgent.getPositionGlobal(); + handle_go_to(); + if(mAutoPilotDestination) + { + mAutoPilotDestination->markDead(); + } +} BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask) { diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h index 22359a6db8..d7c79ee223 100644 --- a/indra/newview/lltoolpie.h +++ b/indra/newview/lltoolpie.h @@ -67,6 +67,7 @@ public: LLObjectSelection* getLeftClickSelection() { return (LLObjectSelection*)mLeftClickSelection; } void resetSelection(); void blockClickToWalk() { mBlockClickToWalk = true; } + void stopClickToWalk(); static void selectionPropertiesReceived(); diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp index 23b0845f31..7f7366dd3d 100644 --- a/indra/newview/llviewercamera.cpp +++ b/indra/newview/llviewercamera.cpp @@ -756,6 +756,10 @@ LLVector3 LLViewerCamera::roundToPixel(const LLVector3 &pos_agent) BOOL LLViewerCamera::cameraUnderWater() const { + if(!gAgent.getRegion()) + { + return FALSE ; + } return getOrigin().mV[VZ] < gAgent.getRegion()->getWaterHeight(); } diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp index e7a0d17c3a..e06fe7bda0 100644 --- a/indra/newview/llviewerchat.cpp +++ b/indra/newview/llviewerchat.cpp @@ -29,6 +29,8 @@ // newview includes #include "llagent.h" // gAgent +#include "llslurl.h" +#include "lluicolor.h" #include "lluicolortable.h" #include "llviewercontrol.h" // gSavedSettings #include "llviewerregion.h" diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index a60d7e0793..e41773d273 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -825,7 +825,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) //} LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater() ? TRUE : FALSE; - LLPipeline::updateRenderDeferred(); + LLPipeline::refreshRenderDeferred(); stop_glerror(); diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 11686740f7..a1c2c926af 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -92,6 +92,7 @@ #include "llfloatersettingsdebug.h" #include "llfloatersidetraytab.h" #include "llfloatersnapshot.h" +#include "llfloatersounddevices.h" #include "llfloatertelehub.h" #include "llfloatertestinspectors.h" #include "llfloatertestlistview.h" @@ -266,6 +267,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater); LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>); LLFloaterReg::add("side_bar_tab", "floater_side_bar_tab.xml", &LLFloaterReg::build<LLFloaterSideTrayTab>); + LLFloaterReg::add("sound_devices", "floater_sound_devices.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundDevices>); LLFloaterReg::add("stats", "floater_stats.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloater>); LLFloaterReg::add("start_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRunQueue>); LLFloaterReg::add("stop_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotRunQueue>); diff --git a/indra/newview/llviewerkeyboard.h b/indra/newview/llviewerkeyboard.h index 925244e89b..ca73212ed1 100644 --- a/indra/newview/llviewerkeyboard.h +++ b/indra/newview/llviewerkeyboard.h @@ -28,6 +28,7 @@ #define LL_LLVIEWERKEYBOARD_H #include "llkeyboard.h" // For EKeystate +#include "llinitparam.h" const S32 MAX_NAMED_FUNCTIONS = 100; const S32 MAX_KEY_BINDINGS = 128; // was 60 diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 9d2b2f38c5..79c6c8db75 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -54,6 +54,7 @@ #include "llfilepicker.h" #include "llnotifications.h" #include "lldir.h" +#include "lldiriterator.h" #include "llevent.h" // LLSimpleListener #include "llnotificationsutil.h" #include "lluuid.h" @@ -1154,7 +1155,8 @@ void LLViewerMedia::clearAllCookies() } // the hard part: iterate over all user directories and delete the cookie file from each one - while(gDirUtilp->getNextFileInDir(base_dir, "*_*", filename)) + LLDirIterator dir_iter(base_dir, "*_*"); + while (dir_iter.next(filename)) { target = base_dir; target += filename; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 1764db48a2..2ed208bad1 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -37,6 +37,7 @@ // newview includes #include "llagent.h" +#include "llagentaccess.h" #include "llagentcamera.h" #include "llagentwearables.h" #include "llagentpilot.h" @@ -999,6 +1000,10 @@ U32 info_display_from_string(std::string info_display) { return LLPipeline::RENDER_DEBUG_AGENT_TARGET; } + else if ("sculpt" == info_display) + { + return LLPipeline::RENDER_DEBUG_SCULPTED; + } else { return 0; @@ -5618,6 +5623,14 @@ class LLToggleHelp : public view_listener_t } }; +class LLToggleSpeak : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + LLVoiceClient::getInstance()->toggleUserPTTState(); + return true; + } +}; class LLShowSidetrayPanel : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -8214,6 +8227,7 @@ void initialize_menus() commit.add("BuyCurrency", boost::bind(&handle_buy_currency)); view_listener_t::addMenu(new LLShowHelp(), "ShowHelp"); view_listener_t::addMenu(new LLToggleHelp(), "ToggleHelp"); + view_listener_t::addMenu(new LLToggleSpeak(), "ToggleSpeak"); view_listener_t::addMenu(new LLPromptShowURL(), "PromptShowURL"); view_listener_t::addMenu(new LLShowAgentProfile(), "ShowAgentProfile"); view_listener_t::addMenu(new LLToggleAgentProfile(), "ToggleAgentProfile"); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 9c13a96b81..86b56df556 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -344,6 +344,11 @@ void process_layer_data(LLMessageSystem *mesgsys, void **user_data) { LLViewerRegion *regionp = LLWorld::getInstance()->getRegion(mesgsys->getSender()); + if(!regionp) + { + llwarns << "Invalid region for layer data." << llendl; + return; + } S32 size; S8 type; @@ -2208,7 +2213,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) name = clean_name_from_im(name, dialog); BOOL is_busy = gAgent.getBusy(); - BOOL is_muted = LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat); + BOOL is_muted = LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat) + // object IMs contain sender object id in session_id (STORM-1209) + || dialog == IM_FROM_TASK && LLMuteList::getInstance()->isMuted(session_id); BOOL is_linden = LLMuteList::getInstance()->isLinden(name); BOOL is_owned_by_me = FALSE; BOOL is_friend = (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL) ? false : true; @@ -2596,6 +2603,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) args["NAME"] = LLSLURL("agent", from_id, "completename").getSLURLString();; LLSD payload; payload["from_id"] = from_id; + // Passing the "SESSION_NAME" to use it for IM notification logging + // in LLTipHandler::processNotification(). See STORM-941. + payload["SESSION_NAME"] = name; LLNotificationsUtil::add("InventoryAccepted", args, payload); break; } @@ -5366,6 +5376,12 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem) { // notification was specified using the new mechanism, so we can just handle it here std::string notificationID; + msgsystem->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, notificationID);
+ if (!LLNotifications::getInstance()->templateExists(notificationID))
+ {
+ return false;
+ } + std::string llsdRaw; LLSD llsdBlock; msgsystem->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, notificationID); @@ -5522,14 +5538,19 @@ void process_alert_core(const std::string& message, BOOL modal) } else { - LLSD args; - std::string new_msg =LLNotifications::instance().getGlobalString(message); + // Hack fix for EXP-623 (blame fix on RN :)) to avoid a sim deploy + const std::string AUTOPILOT_CANCELED_MSG("Autopilot canceled"); + if (message.find(AUTOPILOT_CANCELED_MSG) == std::string::npos ) + { + LLSD args; + std::string new_msg =LLNotifications::instance().getGlobalString(message); - std::string localized_msg; - bool is_message_localized = LLTrans::findString(localized_msg, new_msg); + std::string localized_msg; + bool is_message_localized = LLTrans::findString(localized_msg, new_msg); - args["MESSAGE"] = is_message_localized ? localized_msg : new_msg; - LLNotificationsUtil::add("SystemMessageTip", args); + args["MESSAGE"] = is_message_localized ? localized_msg : new_msg; + LLNotificationsUtil::add("SystemMessageTip", args); + } } } diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index f5fee662e6..929f3ad188 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -1,5704 +1,5712 @@ -/** - * @file llviewerobject.cpp - * @brief Base class for viewer objects - * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, 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$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llviewerobject.h" - -#include "llaudioengine.h" -#include "imageids.h" -#include "indra_constants.h" -#include "llmath.h" -#include "llflexibleobject.h" -#include "llviewercontrol.h" -#include "lldatapacker.h" -#include "llfasttimer.h" -#include "llfloaterreg.h" -#include "llfontgl.h" -#include "llframetimer.h" -#include "llinventory.h" -#include "llinventorydefines.h" -#include "llmaterialtable.h" -#include "llmutelist.h" -#include "llnamevalue.h" -#include "llprimitive.h" -#include "llquantize.h" -#include "llregionhandle.h" -#include "llsdserialize.h" -#include "lltree_common.h" -#include "llxfermanager.h" -#include "message.h" -#include "object_flags.h" -#include "timing.h" - -#include "llaudiosourcevo.h" -#include "llagent.h" -#include "llagentcamera.h" -#include "llbbox.h" -#include "llbox.h" -#include "llcylinder.h" -#include "lldrawable.h" -#include "llface.h" -#include "llfloaterproperties.h" -#include "llfloatertools.h" -#include "llfollowcam.h" -#include "llhudtext.h" -#include "llselectmgr.h" -#include "llrendersphere.h" -#include "lltooldraganddrop.h" -#include "llviewercamera.h" -#include "llviewertexturelist.h" -#include "llviewerinventory.h" -#include "llviewerobjectlist.h" -#include "llviewerparceloverlay.h" -#include "llviewerpartsource.h" -#include "llviewerregion.h" -#include "llviewerstats.h" -#include "llviewertextureanim.h" -#include "llviewerwindow.h" // For getSpinAxis -#include "llvoavatar.h" -#include "llvoavatarself.h" -#include "llvoclouds.h" -#include "llvograss.h" -#include "llvoground.h" -#include "llvolume.h" -#include "llvolumemessage.h" -#include "llvopartgroup.h" -#include "llvosky.h" -#include "llvosurfacepatch.h" -#include "llvotextbubble.h" -#include "llvotree.h" -#include "llvovolume.h" -#include "llvowater.h" -#include "llworld.h" -#include "llui.h" -#include "pipeline.h" -#include "llviewernetwork.h" -#include "llvowlsky.h" -#include "llmanip.h" -#include "lltrans.h" -#include "llsdutil.h" -#include "llmediaentry.h" - -//#define DEBUG_UPDATE_TYPE - -BOOL LLViewerObject::sVelocityInterpolate = TRUE; -BOOL LLViewerObject::sPingInterpolate = TRUE; - -U32 LLViewerObject::sNumZombieObjects = 0; -S32 LLViewerObject::sNumObjects = 0; -BOOL LLViewerObject::sMapDebug = TRUE; -LLColor4 LLViewerObject::sEditSelectColor( 1.0f, 1.f, 0.f, 0.3f); // Edit OK -LLColor4 LLViewerObject::sNoEditSelectColor( 1.0f, 0.f, 0.f, 0.3f); // Can't edit -S32 LLViewerObject::sAxisArrowLength(50); -BOOL LLViewerObject::sPulseEnabled(FALSE); -BOOL LLViewerObject::sUseSharedDrawables(FALSE); // TRUE - -// sMaxUpdateInterpolationTime must be greater than sPhaseOutUpdateInterpolationTime -F64 LLViewerObject::sMaxUpdateInterpolationTime = 3.0; // For motion interpolation: after X seconds with no updates, don't predict object motion -F64 LLViewerObject::sPhaseOutUpdateInterpolationTime = 2.0; // For motion interpolation: after Y seconds with no updates, taper off motion prediction - - -static LLFastTimer::DeclareTimer FTM_CREATE_OBJECT("Create Object"); - -// static -LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) -{ - LLViewerObject *res = NULL; - LLFastTimer t1(FTM_CREATE_OBJECT); - - switch (pcode) - { - case LL_PCODE_VOLUME: - res = new LLVOVolume(id, pcode, regionp); break; - case LL_PCODE_LEGACY_AVATAR: - { - if (id == gAgentID) - { - if (!gAgentAvatarp) - { - gAgentAvatarp = new LLVOAvatarSelf(id, pcode, regionp); - } - else - { - gAgentAvatarp->updateRegion(regionp); - } - res = gAgentAvatarp; - } - else - { - res = new LLVOAvatar(id, pcode, regionp); - } - static_cast<LLVOAvatar*>(res)->initInstance(); - break; - } - case LL_PCODE_LEGACY_GRASS: - res = new LLVOGrass(id, pcode, regionp); break; - case LL_PCODE_LEGACY_PART_SYS: -// llwarns << "Creating old part sys!" << llendl; -// res = new LLVOPart(id, pcode, regionp); break; - res = NULL; break; - case LL_PCODE_LEGACY_TREE: - res = new LLVOTree(id, pcode, regionp); break; - case LL_PCODE_TREE_NEW: -// llwarns << "Creating new tree!" << llendl; -// res = new LLVOTree(id, pcode, regionp); break; - res = NULL; break; - case LL_PCODE_LEGACY_TEXT_BUBBLE: - res = new LLVOTextBubble(id, pcode, regionp); break; - case LL_VO_CLOUDS: - res = new LLVOClouds(id, pcode, regionp); break; - case LL_VO_SURFACE_PATCH: - res = new LLVOSurfacePatch(id, pcode, regionp); break; - case LL_VO_SKY: - res = new LLVOSky(id, pcode, regionp); break; - case LL_VO_VOID_WATER: - res = new LLVOVoidWater(id, pcode, regionp); break; - case LL_VO_WATER: - res = new LLVOWater(id, pcode, regionp); break; - case LL_VO_GROUND: - res = new LLVOGround(id, pcode, regionp); break; - case LL_VO_PART_GROUP: - res = new LLVOPartGroup(id, pcode, regionp); break; - case LL_VO_HUD_PART_GROUP: - res = new LLVOHUDPartGroup(id, pcode, regionp); break; - case LL_VO_WL_SKY: - res = new LLVOWLSky(id, pcode, regionp); break; - default: - llwarns << "Unknown object pcode " << (S32)pcode << llendl; - res = NULL; break; - } - return res; -} - -LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp, BOOL is_global) -: LLPrimitive(), - mChildList(), - mID(id), - mLocalID(0), - mTotalCRC(0), - mTEImages(NULL), - mGLName(0), - mbCanSelect(TRUE), - mFlags(0), - mPhysicsShapeType(0), - mPhysicsGravity(0), - mPhysicsFriction(0), - mPhysicsDensity(0), - mPhysicsRestitution(0), - mDrawable(), - mCreateSelected(FALSE), - mRenderMedia(FALSE), - mBestUpdatePrecision(0), - mText(), - mLastInterpUpdateSecs(0.f), - mLastMessageUpdateSecs(0.f), - mLatestRecvPacketID(0), - mData(NULL), - mAudioSourcep(NULL), - mAudioGain(1.f), - mAppAngle(0.f), - mPixelArea(1024.f), - mInventory(NULL), - mInventorySerialNum(0), - mRegionp( regionp ), - mInventoryPending(FALSE), - mInventoryDirty(FALSE), - mDead(FALSE), - mOrphaned(FALSE), - mUserSelected(FALSE), - mOnActiveList(FALSE), - mOnMap(FALSE), - mStatic(FALSE), - mNumFaces(0), - mTimeDilation(1.f), - mRotTime(0.f), - mJointInfo(NULL), - mState(0), - mMedia(NULL), - mClickAction(0), - mObjectCost(0), - mLinksetCost(0), - mPhysicsCost(0), - mLinksetPhysicsCost(0.f), - mCostStale(true), - mPhysicsShapeUnknown(true), - mAttachmentItemID(LLUUID::null), - mLastUpdateType(OUT_UNKNOWN), - mLastUpdateCached(FALSE) -{ - if (!is_global) - { - llassert(mRegionp); - } - - LLPrimitive::init_primitive(pcode); - - // CP: added 12/2/2005 - this was being initialised to 0, not the current frame time - mLastInterpUpdateSecs = LLFrameTimer::getElapsedSeconds(); - - mPositionRegion = LLVector3(0.f, 0.f, 0.f); - - if (!is_global && mRegionp) - { - mPositionAgent = mRegionp->getOriginAgent(); - } - - LLViewerObject::sNumObjects++; -} - -LLViewerObject::~LLViewerObject() -{ - deleteTEImages(); - - if(mInventory) - { - mInventory->clear(); // will deref and delete entries - delete mInventory; - mInventory = NULL; - } - - if (mJointInfo) - { - delete mJointInfo; - mJointInfo = NULL; - } - - if (mPartSourcep) - { - mPartSourcep->setDead(); - mPartSourcep = NULL; - } - - // Delete memory associated with extra parameters. - std::map<U16, ExtraParameter*>::iterator iter; - for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter) - { - if(iter->second != NULL) - { - delete iter->second->data; - delete iter->second; - } - } - mExtraParameterList.clear(); - - for_each(mNameValuePairs.begin(), mNameValuePairs.end(), DeletePairedPointer()) ; - mNameValuePairs.clear(); - - delete[] mData; - mData = NULL; - - delete mMedia; - mMedia = NULL; - - sNumObjects--; - sNumZombieObjects--; - llassert(mChildList.size() == 0); - - clearInventoryListeners(); -} - -void LLViewerObject::deleteTEImages() -{ - delete[] mTEImages; - mTEImages = NULL; -} - -void LLViewerObject::markDead() -{ - if (!mDead) - { - //llinfos << "Marking self " << mLocalID << " as dead." << llendl; - - // Root object of this hierarchy unlinks itself. - if (getParent()) - { - ((LLViewerObject *)getParent())->removeChild(this); - // go ahead and delete any jointinfo's that we find - delete mJointInfo; - mJointInfo = NULL; - } - - // Mark itself as dead - mDead = TRUE; - gObjectList.cleanupReferences(this); - - LLViewerObject *childp; - while (mChildList.size() > 0) - { - childp = mChildList.back(); - if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR) - { - //llinfos << "Marking child " << childp->getLocalID() << " as dead." << llendl; - childp->setParent(NULL); // LLViewerObject::markDead 1 - childp->markDead(); - } - else - { - // make sure avatar is no longer parented, - // so we can properly set it's position - childp->setDrawableParent(NULL); - ((LLVOAvatar*)childp)->getOffObject(); - childp->setParent(NULL); // LLViewerObject::markDead 2 - } - mChildList.pop_back(); - } - - if (mDrawable.notNull()) - { - // Drawables are reference counted, mark as dead, then nuke the pointer. - mDrawable->markDead(); - mDrawable = NULL; - } - - if (mText) - { - mText->markDead(); - mText = NULL; - } - - if (mIcon) - { - mIcon->markDead(); - mIcon = NULL; - } - - if (mPartSourcep) - { - mPartSourcep->setDead(); - mPartSourcep = NULL; - } - - if (mAudioSourcep) - { - // Do some cleanup - if (gAudiop) - { - gAudiop->cleanupAudioSource(mAudioSourcep); - } - mAudioSourcep = NULL; - } - - if (flagAnimSource()) - { - if (isAgentAvatarValid()) - { - // stop motions associated with this object - gAgentAvatarp->stopMotionFromSource(mID); - } - } - - if (flagCameraSource()) - { - LLFollowCamMgr::removeFollowCamParams(mID); - } - - sNumZombieObjects++; - } -} - -void LLViewerObject::dump() const -{ - llinfos << "Type: " << pCodeToString(mPrimitiveCode) << llendl; - llinfos << "Drawable: " << (LLDrawable *)mDrawable << llendl; - llinfos << "Update Age: " << LLFrameTimer::getElapsedSeconds() - mLastMessageUpdateSecs << llendl; - - llinfos << "Parent: " << getParent() << llendl; - llinfos << "ID: " << mID << llendl; - llinfos << "LocalID: " << mLocalID << llendl; - llinfos << "PositionRegion: " << getPositionRegion() << llendl; - llinfos << "PositionAgent: " << getPositionAgent() << llendl; - llinfos << "PositionGlobal: " << getPositionGlobal() << llendl; - llinfos << "Velocity: " << getVelocity() << llendl; - if (mDrawable.notNull() && mDrawable->getNumFaces()) - { - LLFacePool *poolp = mDrawable->getFace(0)->getPool(); - if (poolp) - { - llinfos << "Pool: " << poolp << llendl; - llinfos << "Pool reference count: " << poolp->mReferences.size() << llendl; - } - } - //llinfos << "BoxTree Min: " << mDrawable->getBox()->getMin() << llendl; - //llinfos << "BoxTree Max: " << mDrawable->getBox()->getMin() << llendl; - /* - llinfos << "Velocity: " << getVelocity() << llendl; - llinfos << "AnyOwner: " << permAnyOwner() << " YouOwner: " << permYouOwner() << " Edit: " << mPermEdit << llendl; - llinfos << "UsePhysics: " << usePhysics() << " CanSelect " << mbCanSelect << " UserSelected " << mUserSelected << llendl; - llinfos << "AppAngle: " << mAppAngle << llendl; - llinfos << "PixelArea: " << mPixelArea << llendl; - - char buffer[1000]; - char *key; - for (key = mNameValuePairs.getFirstKey(); key; key = mNameValuePairs.getNextKey() ) - { - mNameValuePairs[key]->printNameValue(buffer); - llinfos << buffer << llendl; - } - for (child_list_t::iterator iter = mChildList.begin(); - iter != mChildList.end(); iter++) - { - LLViewerObject* child = *iter; - llinfos << " child " << child->getID() << llendl; - } - */ -} - -void LLViewerObject::printNameValuePairs() const -{ - for (name_value_map_t::const_iterator iter = mNameValuePairs.begin(); - iter != mNameValuePairs.end(); iter++) - { - LLNameValue* nv = iter->second; - llinfos << nv->printNameValue() << llendl; - } -} - -void LLViewerObject::initVOClasses() -{ - // Initialized shared class stuff first. - LLVOAvatar::initClass(); - LLVOTree::initClass(); - llinfos << "Viewer Object size: " << sizeof(LLViewerObject) << llendl; - LLVOGrass::initClass(); - LLVOWater::initClass(); - LLVOVolume::initClass(); -} - -void LLViewerObject::cleanupVOClasses() -{ - LLVOGrass::cleanupClass(); - LLVOWater::cleanupClass(); - LLVOTree::cleanupClass(); - LLVOAvatar::cleanupClass(); - LLVOVolume::cleanupClass(); -} - -// Replaces all name value pairs with data from \n delimited list -// Does not update server -void LLViewerObject::setNameValueList(const std::string& name_value_list) -{ - // Clear out the old - for_each(mNameValuePairs.begin(), mNameValuePairs.end(), DeletePairedPointer()) ; - mNameValuePairs.clear(); - - // Bring in the new - std::string::size_type length = name_value_list.length(); - std::string::size_type start = 0; - while (start < length) - { - std::string::size_type end = name_value_list.find_first_of("\n", start); - if (end == std::string::npos) end = length; - if (end > start) - { - std::string tok = name_value_list.substr(start, end - start); - addNVPair(tok); - } - start = end+1; - } -} - - -// This method returns true if the object is over land owned by the -// agent. -bool LLViewerObject::isReturnable() -{ - if (isAttachment()) - { - return false; - } - std::vector<LLBBox> boxes; - boxes.push_back(LLBBox(getPositionRegion(), getRotationRegion(), getScale() * -0.5f, getScale() * 0.5f).getAxisAligned()); - for (child_list_t::iterator iter = mChildList.begin(); - iter != mChildList.end(); iter++) - { - LLViewerObject* child = *iter; - boxes.push_back(LLBBox(child->getPositionRegion(), child->getRotationRegion(), child->getScale() * -0.5f, child->getScale() * 0.5f).getAxisAligned()); - } - - return mRegionp - && mRegionp->objectIsReturnable(getPositionRegion(), boxes); -} - -BOOL LLViewerObject::setParent(LLViewerObject* parent) -{ - if(mParent != parent) - { - LLViewerObject* old_parent = (LLViewerObject*)mParent ; - BOOL ret = LLPrimitive::setParent(parent); - if(ret && old_parent && parent) - { - old_parent->removeChild(this) ; - } - return ret ; - } - - return FALSE ; -} - -void LLViewerObject::addChild(LLViewerObject *childp) -{ - for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i) - { - if (*i == childp) - { //already has child - return; - } - } - - if (!isAvatar()) - { - // propagate selection properties - childp->mbCanSelect = mbCanSelect; - } - - if(childp->setParent(this)) - { - mChildList.push_back(childp); - } -} - -void LLViewerObject::removeChild(LLViewerObject *childp) -{ - for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i) - { - if (*i == childp) - { - if (!childp->isAvatar() && mDrawable.notNull() && mDrawable->isActive() && childp->mDrawable.notNull() && !isAvatar()) - { - gPipeline.markRebuild(childp->mDrawable, LLDrawable::REBUILD_VOLUME); - } - - mChildList.erase(i); - - if(childp->getParent() == this) - { - childp->setParent(NULL); - } - break; - } - } - - if (childp->isSelected()) - { - LLSelectMgr::getInstance()->deselectObjectAndFamily(childp); - BOOL add_to_end = TRUE; - LLSelectMgr::getInstance()->selectObjectAndFamily(childp, add_to_end); - } -} - -void LLViewerObject::addThisAndAllChildren(std::vector<LLViewerObject*>& objects) -{ - objects.push_back(this); - for (child_list_t::iterator iter = mChildList.begin(); - iter != mChildList.end(); iter++) - { - LLViewerObject* child = *iter; - if (!child->isAvatar()) - { - child->addThisAndAllChildren(objects); - } - } -} - -void LLViewerObject::addThisAndNonJointChildren(std::vector<LLViewerObject*>& objects) -{ - objects.push_back(this); - // don't add any attachments when temporarily selecting avatar - if (isAvatar()) - { - return; - } - for (child_list_t::iterator iter = mChildList.begin(); - iter != mChildList.end(); iter++) - { - LLViewerObject* child = *iter; - if ( (!child->isAvatar()) && (!child->isJointChild())) - { - child->addThisAndNonJointChildren(objects); - } - } -} - -BOOL LLViewerObject::isChild(LLViewerObject *childp) const -{ - for (child_list_t::const_iterator iter = mChildList.begin(); - iter != mChildList.end(); iter++) - { - LLViewerObject* testchild = *iter; - if (testchild == childp) - return TRUE; - } - return FALSE; -} - - -// returns TRUE if at least one avatar is sitting on this object -BOOL LLViewerObject::isSeat() const -{ - for (child_list_t::const_iterator iter = mChildList.begin(); - iter != mChildList.end(); iter++) - { - LLViewerObject* child = *iter; - if (child->isAvatar()) - { - return TRUE; - } - } - return FALSE; - -} - -BOOL LLViewerObject::setDrawableParent(LLDrawable* parentp) -{ - if (mDrawable.isNull()) - { - return FALSE; - } - - BOOL ret = mDrawable->mXform.setParent(parentp ? &parentp->mXform : NULL); - if(!ret) - { - return FALSE ; - } - LLDrawable* old_parent = mDrawable->mParent; - mDrawable->mParent = parentp; - - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE); - if( (old_parent != parentp && old_parent) - || (parentp && parentp->isActive())) - { - // *TODO we should not be relying on setDrawable parent to call markMoved - gPipeline.markMoved(mDrawable, FALSE); - } - else if (!mDrawable->isAvatar()) - { - mDrawable->updateXform(TRUE); - /*if (!mDrawable->getSpatialGroup()) - { - mDrawable->movePartition(); - }*/ - } - - return ret; -} - -// Show or hide particles, icon and HUD -void LLViewerObject::hideExtraDisplayItems( BOOL hidden ) -{ - if( mPartSourcep.notNull() ) - { - LLViewerPartSourceScript *partSourceScript = mPartSourcep.get(); - partSourceScript->setSuspended( hidden ); - } - - if( mText.notNull() ) - { - LLHUDText *hudText = mText.get(); - hudText->setHidden( hidden ); - } - - if( mIcon.notNull() ) - { - LLHUDIcon *hudIcon = mIcon.get(); - hudIcon->setHidden( hidden ); - } -} - -U32 LLViewerObject::checkMediaURL(const std::string &media_url) -{ - U32 retval = (U32)0x0; - if (!mMedia && !media_url.empty()) - { - retval |= MEDIA_URL_ADDED; - mMedia = new LLViewerObjectMedia; - mMedia->mMediaURL = media_url; - mMedia->mMediaType = LLViewerObject::MEDIA_SET; - mMedia->mPassedWhitelist = FALSE; - } - else if (mMedia) - { - if (media_url.empty()) - { - retval |= MEDIA_URL_REMOVED; - delete mMedia; - mMedia = NULL; - } - else if (mMedia->mMediaURL != media_url) // <-- This is an optimization. If they are equal don't bother with below's test. - { - /*if (! (LLTextureEntry::getAgentIDFromMediaVersionString(media_url) == gAgent.getID() && - LLTextureEntry::getVersionFromMediaVersionString(media_url) == - LLTextureEntry::getVersionFromMediaVersionString(mMedia->mMediaURL) + 1)) - */ - { - // If the media URL is different and WE were not the one who - // changed it, mark dirty. - retval |= MEDIA_URL_UPDATED; - } - mMedia->mMediaURL = media_url; - mMedia->mPassedWhitelist = FALSE; - } - } - return retval; -} - -U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, - void **user_data, - U32 block_num, - const EObjectUpdateType update_type, - LLDataPacker *dp) -{ - LLMemType mt(LLMemType::MTYPE_OBJECT); - U32 retval = 0x0; - - // Coordinates of objects on simulators are region-local. - U64 region_handle; - mesgsys->getU64Fast(_PREHASH_RegionData, _PREHASH_RegionHandle, region_handle); - - { - LLViewerRegion* regionp = LLWorld::getInstance()->getRegionFromHandle(region_handle); - if(regionp != mRegionp && regionp && mRegionp)//region cross - { - //this is the redundant position and region update, but it is necessary in case the viewer misses the following - //position and region update messages from sim. - //this redundant update should not cause any problems. - LLVector3 delta_pos = mRegionp->getOriginAgent() - regionp->getOriginAgent(); - setPositionParent(getPosition() + delta_pos); //update to the new region position immediately. - setRegion(regionp) ; //change the region. - } - else - { - mRegionp = regionp ; - } - } - - if (!mRegionp) - { - U32 x, y; - from_region_handle(region_handle, &x, &y); - - llerrs << "Object has invalid region " << x << ":" << y << "!" << llendl; - return retval; - } - - U16 time_dilation16; - mesgsys->getU16Fast(_PREHASH_RegionData, _PREHASH_TimeDilation, time_dilation16); - F32 time_dilation = ((F32) time_dilation16) / 65535.f; - mTimeDilation = time_dilation; - mRegionp->setTimeDilation(time_dilation); - - // this will be used to determine if we've really changed position - // Use getPosition, not getPositionRegion, since this is what we're comparing directly against. - LLVector3 test_pos_parent = getPosition(); - - U8 data[60+16]; // This needs to match the largest size below. -#ifdef LL_BIG_ENDIAN - U16 valswizzle[4]; -#endif - U16 *val; - const F32 size = LLWorld::getInstance()->getRegionWidthInMeters(); - const F32 MAX_HEIGHT = LLWorld::getInstance()->getRegionMaxHeight(); - const F32 MIN_HEIGHT = LLWorld::getInstance()->getRegionMinHeight(); - S32 length; - S32 count; - S32 this_update_precision = 32; // in bits - - // Temporaries, because we need to compare w/ previous to set dirty flags... - LLVector3 new_pos_parent; - LLVector3 new_vel; - LLVector3 new_acc; - LLVector3 new_angv; - LLVector3 old_angv = getAngularVelocity(); - LLQuaternion new_rot; - LLVector3 new_scale = getScale(); - - U32 parent_id = 0; - U8 material = 0; - U8 click_action = 0; - U32 crc = 0; - - bool old_special_hover_cursor = specialHoverCursor(); - - LLViewerObject *cur_parentp = (LLViewerObject *)getParent(); - - if (cur_parentp) - { - parent_id = cur_parentp->mLocalID; - } - - if (!dp) - { - switch(update_type) - { - case OUT_FULL: - { -#ifdef DEBUG_UPDATE_TYPE - llinfos << "Full:" << getID() << llendl; -#endif - //clear cost and linkset cost - mCostStale = true; - if (isSelected()) - { - gFloaterTools->dirty(); - } - - LLUUID audio_uuid; - LLUUID owner_id; // only valid if audio_uuid or particle system is not null - F32 gain; - U8 sound_flags; - - mesgsys->getU32Fast( _PREHASH_ObjectData, _PREHASH_CRC, crc, block_num); - mesgsys->getU32Fast( _PREHASH_ObjectData, _PREHASH_ParentID, parent_id, block_num); - mesgsys->getUUIDFast(_PREHASH_ObjectData, _PREHASH_Sound, audio_uuid, block_num ); - // HACK: Owner id only valid if non-null sound id or particle system - mesgsys->getUUIDFast(_PREHASH_ObjectData, _PREHASH_OwnerID, owner_id, block_num ); - mesgsys->getF32Fast( _PREHASH_ObjectData, _PREHASH_Gain, gain, block_num ); - mesgsys->getU8Fast( _PREHASH_ObjectData, _PREHASH_Flags, sound_flags, block_num ); - mesgsys->getU8Fast( _PREHASH_ObjectData, _PREHASH_Material, material, block_num ); - mesgsys->getU8Fast( _PREHASH_ObjectData, _PREHASH_ClickAction, click_action, block_num); - mesgsys->getVector3Fast(_PREHASH_ObjectData, _PREHASH_Scale, new_scale, block_num ); - length = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_ObjectData); - mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_ObjectData, data, length, block_num); - - mTotalCRC = crc; - - // Owner ID used for sound muting or particle system muting - setAttachedSound(audio_uuid, owner_id, gain, sound_flags); - - U8 old_material = getMaterial(); - if (old_material != material) - { - setMaterial(material); - if (mDrawable.notNull()) - { - gPipeline.markMoved(mDrawable, FALSE); // undamped - } - } - setClickAction(click_action); - - count = 0; - LLVector4 collision_plane; - - switch(length) - { - case (60 + 16): - // pull out collision normal for avatar - htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4)); - ((LLVOAvatar*)this)->setFootPlane(collision_plane); - count += sizeof(LLVector4); - // fall through - case 60: - this_update_precision = 32; - // this is a terse update - // pos - htonmemcpy(new_pos_parent.mV, &data[count], MVT_LLVector3, sizeof(LLVector3)); - count += sizeof(LLVector3); - // vel - htonmemcpy((void*)getVelocity().mV, &data[count], MVT_LLVector3, sizeof(LLVector3)); - count += sizeof(LLVector3); - // acc - htonmemcpy((void*)getAcceleration().mV, &data[count], MVT_LLVector3, sizeof(LLVector3)); - count += sizeof(LLVector3); - // theta - { - LLVector3 vec; - htonmemcpy(vec.mV, &data[count], MVT_LLVector3, sizeof(LLVector3)); - new_rot.unpackFromVector3(vec); - } - count += sizeof(LLVector3); - // omega - htonmemcpy((void*)new_angv.mV, &data[count], MVT_LLVector3, sizeof(LLVector3)); - if (new_angv.isExactlyZero()) - { - // reset rotation time - resetRot(); - } - setAngularVelocity(new_angv); -#if LL_DARWIN - if (length == 76) - { - setAngularVelocity(LLVector3::zero); - } -#endif - break; - case(32 + 16): - // pull out collision normal for avatar - htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4)); - ((LLVOAvatar*)this)->setFootPlane(collision_plane); - count += sizeof(LLVector4); - // fall through - case 32: - this_update_precision = 16; - test_pos_parent.quantize16(-0.5f*size, 1.5f*size, MIN_HEIGHT, MAX_HEIGHT); - - // This is a terse 16 update, so treat data as an array of U16's. -#ifdef LL_BIG_ENDIAN - htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); - val = valswizzle; -#else - val = (U16 *) &data[count]; -#endif - count += sizeof(U16)*3; - new_pos_parent.mV[VX] = U16_to_F32(val[VX], -0.5f*size, 1.5f*size); - new_pos_parent.mV[VY] = U16_to_F32(val[VY], -0.5f*size, 1.5f*size); - new_pos_parent.mV[VZ] = U16_to_F32(val[VZ], MIN_HEIGHT, MAX_HEIGHT); - -#ifdef LL_BIG_ENDIAN - htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); - val = valswizzle; -#else - val = (U16 *) &data[count]; -#endif - count += sizeof(U16)*3; - setVelocity(LLVector3(U16_to_F32(val[VX], -size, size), - U16_to_F32(val[VY], -size, size), - U16_to_F32(val[VZ], -size, size))); - -#ifdef LL_BIG_ENDIAN - htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); - val = valswizzle; -#else - val = (U16 *) &data[count]; -#endif - count += sizeof(U16)*3; - setAcceleration(LLVector3(U16_to_F32(val[VX], -size, size), - U16_to_F32(val[VY], -size, size), - U16_to_F32(val[VZ], -size, size))); - -#ifdef LL_BIG_ENDIAN - htonmemcpy(valswizzle, &data[count], MVT_U16Quat, 4); - val = valswizzle; -#else - val = (U16 *) &data[count]; -#endif - count += sizeof(U16)*4; - new_rot.mQ[VX] = U16_to_F32(val[VX], -1.f, 1.f); - new_rot.mQ[VY] = U16_to_F32(val[VY], -1.f, 1.f); - new_rot.mQ[VZ] = U16_to_F32(val[VZ], -1.f, 1.f); - new_rot.mQ[VW] = U16_to_F32(val[VW], -1.f, 1.f); - -#ifdef LL_BIG_ENDIAN - htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); - val = valswizzle; -#else - val = (U16 *) &data[count]; -#endif - new_angv.setVec(U16_to_F32(val[VX], -size, size), - U16_to_F32(val[VY], -size, size), - U16_to_F32(val[VZ], -size, size)); - if (new_angv.isExactlyZero()) - { - // reset rotation time - resetRot(); - } - setAngularVelocity(new_angv); - break; - - case 16: - this_update_precision = 8; - test_pos_parent.quantize8(-0.5f*size, 1.5f*size, MIN_HEIGHT, MAX_HEIGHT); - // this is a terse 8 update - new_pos_parent.mV[VX] = U8_to_F32(data[0], -0.5f*size, 1.5f*size); - new_pos_parent.mV[VY] = U8_to_F32(data[1], -0.5f*size, 1.5f*size); - new_pos_parent.mV[VZ] = U8_to_F32(data[2], MIN_HEIGHT, MAX_HEIGHT); - - setVelocity(U8_to_F32(data[3], -size, size), - U8_to_F32(data[4], -size, size), - U8_to_F32(data[5], -size, size) ); - - setAcceleration(U8_to_F32(data[6], -size, size), - U8_to_F32(data[7], -size, size), - U8_to_F32(data[8], -size, size) ); - - new_rot.mQ[VX] = U8_to_F32(data[9], -1.f, 1.f); - new_rot.mQ[VY] = U8_to_F32(data[10], -1.f, 1.f); - new_rot.mQ[VZ] = U8_to_F32(data[11], -1.f, 1.f); - new_rot.mQ[VW] = U8_to_F32(data[12], -1.f, 1.f); - - new_angv.setVec(U8_to_F32(data[13], -size, size), - U8_to_F32(data[14], -size, size), - U8_to_F32(data[15], -size, size) ); - if (new_angv.isExactlyZero()) - { - // reset rotation time - resetRot(); - } - setAngularVelocity(new_angv); - break; - } - - //////////////////////////////////////////////////// - // - // Here we handle data specific to the full message. - // - - U32 flags; - mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_UpdateFlags, flags, block_num); - // clear all but local flags - mFlags &= FLAGS_LOCAL; - mFlags |= flags; - - U8 state; - mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_State, state, block_num ); - mState = state; - - // ...new objects that should come in selected need to be added to the selected list - mCreateSelected = ((flags & FLAGS_CREATE_SELECTED) != 0); - - // Set all name value pairs - S32 nv_size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_NameValue); - if (nv_size > 0) - { - std::string name_value_list; - mesgsys->getStringFast(_PREHASH_ObjectData, _PREHASH_NameValue, name_value_list, block_num); - setNameValueList(name_value_list); - } - - // Clear out any existing generic data - if (mData) - { - delete [] mData; - } - - // Check for appended generic data - S32 data_size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_Data); - if (data_size <= 0) - { - mData = NULL; - } - else - { - // ...has generic data - mData = new U8[data_size]; - mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_Data, mData, data_size, block_num); - } - - S32 text_size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_Text); - if (text_size > 1) - { - // Setup object text - if (!mText) - { - mText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT); - mText->setFont(LLFontGL::getFontSansSerif()); - mText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP); - mText->setMaxLines(-1); - mText->setSourceObject(this); - mText->setOnHUDAttachment(isHUDAttachment()); - } - - std::string temp_string; - mesgsys->getStringFast(_PREHASH_ObjectData, _PREHASH_Text, temp_string, block_num ); - - LLColor4U coloru; - mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_TextColor, coloru.mV, 4, block_num); - - // alpha was flipped so that it zero encoded better - coloru.mV[3] = 255 - coloru.mV[3]; - mText->setColor(LLColor4(coloru)); - mText->setString(temp_string); - - if (mDrawable.notNull()) - { - setChanged(MOVED | SILHOUETTE); - gPipeline.markMoved(mDrawable, FALSE); // undamped - } - } - else if (mText.notNull()) - { - mText->markDead(); - mText = NULL; - } - - std::string media_url; - mesgsys->getStringFast(_PREHASH_ObjectData, _PREHASH_MediaURL, media_url, block_num); - retval |= checkMediaURL(media_url); - - // - // Unpack particle system data - // - unpackParticleSource(block_num, owner_id); - - // Mark all extra parameters not used - std::map<U16, ExtraParameter*>::iterator iter; - for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter) - { - iter->second->in_use = FALSE; - } - - // Unpack extra parameters - S32 size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_ExtraParams); - if (size > 0) - { - U8 *buffer = new U8[size]; - mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_ExtraParams, buffer, size, block_num); - LLDataPackerBinaryBuffer dp(buffer, size); - - U8 num_parameters; - dp.unpackU8(num_parameters, "num_params"); - U8 param_block[MAX_OBJECT_PARAMS_SIZE]; - for (U8 param=0; param<num_parameters; ++param) - { - U16 param_type; - S32 param_size; - dp.unpackU16(param_type, "param_type"); - dp.unpackBinaryData(param_block, param_size, "param_data"); - //llinfos << "Param type: " << param_type << ", Size: " << param_size << llendl; - LLDataPackerBinaryBuffer dp2(param_block, param_size); - unpackParameterEntry(param_type, &dp2); - } - delete[] buffer; - } - - for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter) - { - if (!iter->second->in_use) - { - // Send an update message in case it was formerly in use - parameterChanged(iter->first, iter->second->data, FALSE, false); - } - } - - U8 joint_type = 0; - mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_JointType, joint_type, block_num); - if (joint_type) - { - // create new joint info - if (!mJointInfo) - { - mJointInfo = new LLVOJointInfo; - } - mJointInfo->mJointType = (EHavokJointType) joint_type; - mesgsys->getVector3Fast(_PREHASH_ObjectData, _PREHASH_JointPivot, mJointInfo->mPivot, block_num); - mesgsys->getVector3Fast(_PREHASH_ObjectData, _PREHASH_JointAxisOrAnchor, mJointInfo->mAxisOrAnchor, block_num); - } - else if (mJointInfo) - { - // this joint info is no longer needed - delete mJointInfo; - mJointInfo = NULL; - } - - break; - } - - case OUT_TERSE_IMPROVED: - { -#ifdef DEBUG_UPDATE_TYPE - llinfos << "TI:" << getID() << llendl; -#endif - length = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_ObjectData); - mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_ObjectData, data, length, block_num); - count = 0; - LLVector4 collision_plane; - - switch(length) - { - case(60 + 16): - // pull out collision normal for avatar - htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4)); - ((LLVOAvatar*)this)->setFootPlane(collision_plane); - count += sizeof(LLVector4); - // fall through - case 60: - // this is a terse 32 update - // pos - this_update_precision = 32; - htonmemcpy(new_pos_parent.mV, &data[count], MVT_LLVector3, sizeof(LLVector3)); - count += sizeof(LLVector3); - // vel - htonmemcpy((void*)getVelocity().mV, &data[count], MVT_LLVector3, sizeof(LLVector3)); - count += sizeof(LLVector3); - // acc - htonmemcpy((void*)getAcceleration().mV, &data[count], MVT_LLVector3, sizeof(LLVector3)); - count += sizeof(LLVector3); - // theta - { - LLVector3 vec; - htonmemcpy(vec.mV, &data[count], MVT_LLVector3, sizeof(LLVector3)); - new_rot.unpackFromVector3(vec); - } - count += sizeof(LLVector3); - // omega - htonmemcpy((void*)new_angv.mV, &data[count], MVT_LLVector3, sizeof(LLVector3)); - if (new_angv.isExactlyZero()) - { - // reset rotation time - resetRot(); - } - setAngularVelocity(new_angv); -#if LL_DARWIN - if (length == 76) - { - setAngularVelocity(LLVector3::zero); - } -#endif - break; - case(32 + 16): - // pull out collision normal for avatar - htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4)); - ((LLVOAvatar*)this)->setFootPlane(collision_plane); - count += sizeof(LLVector4); - // fall through - case 32: - // this is a terse 16 update - this_update_precision = 16; - test_pos_parent.quantize16(-0.5f*size, 1.5f*size, MIN_HEIGHT, MAX_HEIGHT); - -#ifdef LL_BIG_ENDIAN - htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); - val = valswizzle; -#else - val = (U16 *) &data[count]; -#endif - count += sizeof(U16)*3; - new_pos_parent.mV[VX] = U16_to_F32(val[VX], -0.5f*size, 1.5f*size); - new_pos_parent.mV[VY] = U16_to_F32(val[VY], -0.5f*size, 1.5f*size); - new_pos_parent.mV[VZ] = U16_to_F32(val[VZ], MIN_HEIGHT, MAX_HEIGHT); - -#ifdef LL_BIG_ENDIAN - htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); - val = valswizzle; -#else - val = (U16 *) &data[count]; -#endif - count += sizeof(U16)*3; - setVelocity(U16_to_F32(val[VX], -size, size), - U16_to_F32(val[VY], -size, size), - U16_to_F32(val[VZ], -size, size)); - -#ifdef LL_BIG_ENDIAN - htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); - val = valswizzle; -#else - val = (U16 *) &data[count]; -#endif - count += sizeof(U16)*3; - setAcceleration(U16_to_F32(val[VX], -size, size), - U16_to_F32(val[VY], -size, size), - U16_to_F32(val[VZ], -size, size)); - -#ifdef LL_BIG_ENDIAN - htonmemcpy(valswizzle, &data[count], MVT_U16Quat, 8); - val = valswizzle; -#else - val = (U16 *) &data[count]; -#endif - count += sizeof(U16)*4; - new_rot.mQ[VX] = U16_to_F32(val[VX], -1.f, 1.f); - new_rot.mQ[VY] = U16_to_F32(val[VY], -1.f, 1.f); - new_rot.mQ[VZ] = U16_to_F32(val[VZ], -1.f, 1.f); - new_rot.mQ[VW] = U16_to_F32(val[VW], -1.f, 1.f); - -#ifdef LL_BIG_ENDIAN - htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); - val = valswizzle; -#else - val = (U16 *) &data[count]; -#endif - setAngularVelocity( U16_to_F32(val[VX], -size, size), - U16_to_F32(val[VY], -size, size), - U16_to_F32(val[VZ], -size, size)); - break; - - case 16: - // this is a terse 8 update - this_update_precision = 8; - test_pos_parent.quantize8(-0.5f*size, 1.5f*size, MIN_HEIGHT, MAX_HEIGHT); - new_pos_parent.mV[VX] = U8_to_F32(data[0], -0.5f*size, 1.5f*size); - new_pos_parent.mV[VY] = U8_to_F32(data[1], -0.5f*size, 1.5f*size); - new_pos_parent.mV[VZ] = U8_to_F32(data[2], MIN_HEIGHT, MAX_HEIGHT); - - setVelocity(U8_to_F32(data[3], -size, size), - U8_to_F32(data[4], -size, size), - U8_to_F32(data[5], -size, size) ); - - setAcceleration(U8_to_F32(data[6], -size, size), - U8_to_F32(data[7], -size, size), - U8_to_F32(data[8], -size, size) ); - - new_rot.mQ[VX] = U8_to_F32(data[9], -1.f, 1.f); - new_rot.mQ[VY] = U8_to_F32(data[10], -1.f, 1.f); - new_rot.mQ[VZ] = U8_to_F32(data[11], -1.f, 1.f); - new_rot.mQ[VW] = U8_to_F32(data[12], -1.f, 1.f); - - setAngularVelocity( U8_to_F32(data[13], -size, size), - U8_to_F32(data[14], -size, size), - U8_to_F32(data[15], -size, size) ); - break; - } - - U8 state; - mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_State, state, block_num ); - mState = state; - break; - } - - default: - break; - - } - } - else - { - // handle the compressed case - LLUUID sound_uuid; - LLUUID owner_id; - F32 gain = 0; - U8 sound_flags = 0; - F32 cutoff = 0; - - U16 val[4]; - - U8 state; - - dp->unpackU8(state, "State"); - mState = state; - - switch(update_type) - { - case OUT_TERSE_IMPROVED: - { -#ifdef DEBUG_UPDATE_TYPE - llinfos << "CompTI:" << getID() << llendl; -#endif - U8 value; - dp->unpackU8(value, "agent"); - if (value) - { - LLVector4 collision_plane; - dp->unpackVector4(collision_plane, "Plane"); - ((LLVOAvatar*)this)->setFootPlane(collision_plane); - } - test_pos_parent = getPosition(); - dp->unpackVector3(new_pos_parent, "Pos"); - dp->unpackU16(val[VX], "VelX"); - dp->unpackU16(val[VY], "VelY"); - dp->unpackU16(val[VZ], "VelZ"); - setVelocity(U16_to_F32(val[VX], -128.f, 128.f), - U16_to_F32(val[VY], -128.f, 128.f), - U16_to_F32(val[VZ], -128.f, 128.f)); - dp->unpackU16(val[VX], "AccX"); - dp->unpackU16(val[VY], "AccY"); - dp->unpackU16(val[VZ], "AccZ"); - setAcceleration(U16_to_F32(val[VX], -64.f, 64.f), - U16_to_F32(val[VY], -64.f, 64.f), - U16_to_F32(val[VZ], -64.f, 64.f)); - - dp->unpackU16(val[VX], "ThetaX"); - dp->unpackU16(val[VY], "ThetaY"); - dp->unpackU16(val[VZ], "ThetaZ"); - dp->unpackU16(val[VS], "ThetaS"); - new_rot.mQ[VX] = U16_to_F32(val[VX], -1.f, 1.f); - new_rot.mQ[VY] = U16_to_F32(val[VY], -1.f, 1.f); - new_rot.mQ[VZ] = U16_to_F32(val[VZ], -1.f, 1.f); - new_rot.mQ[VS] = U16_to_F32(val[VS], -1.f, 1.f); - dp->unpackU16(val[VX], "AccX"); - dp->unpackU16(val[VY], "AccY"); - dp->unpackU16(val[VZ], "AccZ"); - setAngularVelocity( U16_to_F32(val[VX], -64.f, 64.f), - U16_to_F32(val[VY], -64.f, 64.f), - U16_to_F32(val[VZ], -64.f, 64.f)); - } - break; - case OUT_FULL_COMPRESSED: - case OUT_FULL_CACHED: - { -#ifdef DEBUG_UPDATE_TYPE - llinfos << "CompFull:" << getID() << llendl; -#endif - mCostStale = true; - - if (isSelected()) - { - gFloaterTools->dirty(); - } - - dp->unpackU32(crc, "CRC"); - mTotalCRC = crc; - dp->unpackU8(material, "Material"); - U8 old_material = getMaterial(); - if (old_material != material) - { - setMaterial(material); - if (mDrawable.notNull()) - { - gPipeline.markMoved(mDrawable, FALSE); // undamped - } - } - dp->unpackU8(click_action, "ClickAction"); - setClickAction(click_action); - dp->unpackVector3(new_scale, "Scale"); - dp->unpackVector3(new_pos_parent, "Pos"); - LLVector3 vec; - dp->unpackVector3(vec, "Rot"); - new_rot.unpackFromVector3(vec); - setAcceleration(LLVector3::zero); - - U32 value; - dp->unpackU32(value, "SpecialCode"); - dp->setPassFlags(value); - dp->unpackUUID(owner_id, "Owner"); - - if (value & 0x80) - { - dp->unpackVector3(vec, "Omega"); - setAngularVelocity(vec); - } - - if (value & 0x20) - { - dp->unpackU32(parent_id, "ParentID"); - } - else - { - parent_id = 0; - } - - S32 sp_size; - U32 size; - if (value & 0x2) - { - sp_size = 1; - delete [] mData; - mData = new U8[1]; - dp->unpackU8(((U8*)mData)[0], "TreeData"); - } - else if (value & 0x1) - { - dp->unpackU32(size, "ScratchPadSize"); - delete [] mData; - mData = new U8[size]; - dp->unpackBinaryData((U8 *)mData, sp_size, "PartData"); - } - else - { - mData = NULL; - } - - // Setup object text - if (!mText && (value & 0x4)) - { - mText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT); - mText->setFont(LLFontGL::getFontSansSerif()); - mText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP); - mText->setMaxLines(-1); // Set to match current agni behavior. - mText->setSourceObject(this); - mText->setOnHUDAttachment(isHUDAttachment()); - } - - if (value & 0x4) - { - std::string temp_string; - dp->unpackString(temp_string, "Text"); - LLColor4U coloru; - dp->unpackBinaryDataFixed(coloru.mV, 4, "Color"); - coloru.mV[3] = 255 - coloru.mV[3]; - mText->setColor(LLColor4(coloru)); - mText->setString(temp_string); - - setChanged(TEXTURE); - } - else if(mText.notNull()) - { - mText->markDead(); - mText = NULL; - } - - std::string media_url; - if (value & 0x200) - { - dp->unpackString(media_url, "MediaURL"); - } - retval |= checkMediaURL(media_url); - - // - // Unpack particle system data - // - if (value & 0x8) - { - unpackParticleSource(*dp, owner_id); - } - else - { - deleteParticleSource(); - } - - // Mark all extra parameters not used - std::map<U16, ExtraParameter*>::iterator iter; - for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter) - { - iter->second->in_use = FALSE; - } - - // Unpack extra params - U8 num_parameters; - dp->unpackU8(num_parameters, "num_params"); - U8 param_block[MAX_OBJECT_PARAMS_SIZE]; - for (U8 param=0; param<num_parameters; ++param) - { - U16 param_type; - S32 param_size; - dp->unpackU16(param_type, "param_type"); - dp->unpackBinaryData(param_block, param_size, "param_data"); - //llinfos << "Param type: " << param_type << ", Size: " << param_size << llendl; - LLDataPackerBinaryBuffer dp2(param_block, param_size); - unpackParameterEntry(param_type, &dp2); - } - - for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter) - { - if (!iter->second->in_use) - { - // Send an update message in case it was formerly in use - parameterChanged(iter->first, iter->second->data, FALSE, false); - } - } - - if (value & 0x10) - { - dp->unpackUUID(sound_uuid, "SoundUUID"); - dp->unpackF32(gain, "SoundGain"); - dp->unpackU8(sound_flags, "SoundFlags"); - dp->unpackF32(cutoff, "SoundRadius"); - } - - if (value & 0x100) - { - std::string name_value_list; - dp->unpackString(name_value_list, "NV"); - - setNameValueList(name_value_list); - } - - mTotalCRC = crc; - - setAttachedSound(sound_uuid, owner_id, gain, sound_flags); - - // only get these flags on updates from sim, not cached ones - // Preload these five flags for every object. - // Finer shades require the object to be selected, and the selection manager - // stores the extended permission info. - U32 flags; - mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_UpdateFlags, flags, block_num); - // keep local flags and overwrite remote-controlled flags - mFlags = (mFlags & FLAGS_LOCAL) | flags; - - // ...new objects that should come in selected need to be added to the selected list - mCreateSelected = ((flags & FLAGS_CREATE_SELECTED) != 0); - } - break; - - default: - break; - } - } - - // - // Fix object parenting. - // - BOOL b_changed_status = FALSE; - - if (OUT_TERSE_IMPROVED != update_type) - { - // We only need to update parenting on full updates, terse updates - // don't send parenting information. - if (!cur_parentp) - { - if (parent_id == 0) - { - // No parent now, no parent in message -> do nothing - } - else - { - // No parent now, new parent in message -> attach to that parent if possible - LLUUID parent_uuid; - LLViewerObjectList::getUUIDFromLocal(parent_uuid, - parent_id, - mesgsys->getSenderIP(), - mesgsys->getSenderPort()); - - LLViewerObject *sent_parentp = gObjectList.findObject(parent_uuid); - - // - // Check to see if we have the corresponding viewer object for the parent. - // - if (sent_parentp && sent_parentp->getParent() == this) - { - // Try to recover if we attempt to attach a parent to its child - llwarns << "Attempt to attach a parent to it's child: " << this->getID() << " to " << sent_parentp->getID() << llendl; - this->removeChild(sent_parentp); - sent_parentp->setDrawableParent(NULL); - } - - if (sent_parentp && (sent_parentp != this) && !sent_parentp->isDead()) - { - // - // We have a viewer object for the parent, and it's not dead. - // Do the actual reparenting here. - // - - // new parent is valid - b_changed_status = TRUE; - // ...no current parent, so don't try to remove child - if (mDrawable.notNull()) - { - if (mDrawable->isDead() || !mDrawable->getVObj()) - { - llwarns << "Drawable is dead or no VObj!" << llendl; - sent_parentp->addChild(this); - } - else - { - if (!setDrawableParent(sent_parentp->mDrawable)) // LLViewerObject::processUpdateMessage 1 - { - // Bad, we got a cycle somehow. - // Kill both the parent and the child, and - // set cache misses for both of them. - llwarns << "Attempting to recover from parenting cycle!" << llendl; - llwarns << "Killing " << sent_parentp->getID() << " and " << getID() << llendl; - llwarns << "Adding to cache miss list" << llendl; - setParent(NULL); - sent_parentp->setParent(NULL); - getRegion()->addCacheMissFull(getLocalID()); - getRegion()->addCacheMissFull(sent_parentp->getLocalID()); - gObjectList.killObject(sent_parentp); - gObjectList.killObject(this); - return retval; - } - sent_parentp->addChild(this); - // make sure this object gets a non-damped update - if (sent_parentp->mDrawable.notNull()) - { - gPipeline.markMoved(sent_parentp->mDrawable, FALSE); // undamped - } - } - } - else - { - sent_parentp->addChild(this); - } - - // Show particles, icon and HUD - hideExtraDisplayItems( FALSE ); - - setChanged(MOVED | SILHOUETTE); - } - else - { - // - // No corresponding viewer object for the parent, put the various - // pieces on the orphan list. - // - - //parent_id - U32 ip = mesgsys->getSenderIP(); - U32 port = mesgsys->getSenderPort(); - - gObjectList.orphanize(this, parent_id, ip, port); - - // Hide particles, icon and HUD - hideExtraDisplayItems( TRUE ); - } - } - } - else - { - // BUG: this is a bad assumption once border crossing is alowed - if ( (parent_id == cur_parentp->mLocalID) - &&(update_type == OUT_TERSE_IMPROVED)) - { - // Parent now, same parent in message -> do nothing - - // Debugging for suspected problems with local ids. - //LLUUID parent_uuid; - //LLViewerObjectList::getUUIDFromLocal(parent_uuid, parent_id, mesgsys->getSenderIP(), mesgsys->getSenderPort() ); - //if (parent_uuid != cur_parentp->getID() ) - //{ - // llerrs << "Local ID match but UUID mismatch of viewer object" << llendl; - //} - } - else - { - // Parented now, different parent in message - LLViewerObject *sent_parentp; - if (parent_id == 0) - { - // - // This object is no longer parented, we sent in a zero parent ID. - // - sent_parentp = NULL; - } - else - { - LLUUID parent_uuid; - LLViewerObjectList::getUUIDFromLocal(parent_uuid, - parent_id, - gMessageSystem->getSenderIP(), - gMessageSystem->getSenderPort()); - sent_parentp = gObjectList.findObject(parent_uuid); - - if (isAvatar()) - { - // This logic is meant to handle the case where a sitting avatar has reached a new sim - // ahead of the object she was sitting on (which is common as objects are transfered through - // a slower route than agents)... - // In this case, the local id for the object will not be valid, since the viewer has not received - // a full update for the object from that sim yet, so we assume that the agent is still sitting - // where she was originally. --RN - if (!sent_parentp) - { - sent_parentp = cur_parentp; - } - } - else if (!sent_parentp) - { - // - // Switching parents, but we don't know the new parent. - // - U32 ip = mesgsys->getSenderIP(); - U32 port = mesgsys->getSenderPort(); - - // We're an orphan, flag things appropriately. - gObjectList.orphanize(this, parent_id, ip, port); - } - } - - // Reattach if possible. - if (sent_parentp && sent_parentp != cur_parentp && sent_parentp != this) - { - // New parent is valid, detach and reattach - b_changed_status = TRUE; - if (mDrawable.notNull()) - { - if (!setDrawableParent(sent_parentp->mDrawable)) // LLViewerObject::processUpdateMessage 2 - { - // Bad, we got a cycle somehow. - // Kill both the parent and the child, and - // set cache misses for both of them. - llwarns << "Attempting to recover from parenting cycle!" << llendl; - llwarns << "Killing " << sent_parentp->getID() << " and " << getID() << llendl; - llwarns << "Adding to cache miss list" << llendl; - setParent(NULL); - sent_parentp->setParent(NULL); - getRegion()->addCacheMissFull(getLocalID()); - getRegion()->addCacheMissFull(sent_parentp->getLocalID()); - gObjectList.killObject(sent_parentp); - gObjectList.killObject(this); - return retval; - } - // make sure this object gets a non-damped update - } - cur_parentp->removeChild(this); - sent_parentp->addChild(this); - setChanged(MOVED | SILHOUETTE); - sent_parentp->setChanged(MOVED | SILHOUETTE); - if (sent_parentp->mDrawable.notNull()) - { - gPipeline.markMoved(sent_parentp->mDrawable, FALSE); // undamped - } - } - else if (!sent_parentp) - { - bool remove_parent = true; - // No new parent, or the parent that we sent doesn't exist on the viewer. - LLViewerObject *parentp = (LLViewerObject *)getParent(); - if (parentp) - { - if (parentp->getRegion() != getRegion()) - { - // This is probably an object flying across a region boundary, the - // object probably ISN'T being reparented, but just got an object - // update out of order (child update before parent). - //llinfos << "Don't reparent object handoffs!" << llendl; - remove_parent = false; - } - } - - if (remove_parent) - { - b_changed_status = TRUE; - if (mDrawable.notNull()) - { - // clear parent to removeChild can put the drawable on the damped list - setDrawableParent(NULL); // LLViewerObject::processUpdateMessage 3 - } - - cur_parentp->removeChild(this); - - if (mJointInfo && !parent_id) - { - // since this object is no longer parent-relative - // we make sure we delete any joint info - delete mJointInfo; - mJointInfo = NULL; - } - - setChanged(MOVED | SILHOUETTE); - - if (mDrawable.notNull()) - { - // make sure this object gets a non-damped update - gPipeline.markMoved(mDrawable, FALSE); // undamped - } - } - } - } - } - } - - new_rot.normQuat(); - - if (sPingInterpolate) - { - LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mesgsys->getSender()); - if (cdp) - { - F32 ping_delay = 0.5f * mTimeDilation * ( ((F32)cdp->getPingDelay()) * 0.001f + gFrameDTClamped); - LLVector3 diff = getVelocity() * ping_delay; - new_pos_parent += diff; - } - else - { - llwarns << "findCircuit() returned NULL; skipping interpolation" << llendl; - } - } - - ////////////////////////// - // - // Set the generic change flags... - // - // - - // WTF? If we're going to skip this message, why are we - // doing all the parenting, etc above? - U32 packet_id = mesgsys->getCurrentRecvPacketID(); - if (packet_id < mLatestRecvPacketID && - mLatestRecvPacketID - packet_id < 65536) - { - //skip application of this message, it's old - return retval; - } - - mLatestRecvPacketID = packet_id; - - // Set the change flags for scale - if (new_scale != getScale()) - { - setChanged(SCALED | SILHOUETTE); - setScale(new_scale); // Must follow setting permYouOwner() - } - - // first, let's see if the new position is actually a change - - //static S32 counter = 0; - - F32 vel_mag_sq = getVelocity().magVecSquared(); - F32 accel_mag_sq = getAcceleration().magVecSquared(); - - if ( ((b_changed_status)||(test_pos_parent != new_pos_parent)) - ||( (!isSelected()) - &&( (vel_mag_sq != 0.f) - ||(accel_mag_sq != 0.f) - ||(this_update_precision > mBestUpdatePrecision)))) - { - mBestUpdatePrecision = this_update_precision; - - LLVector3 diff = new_pos_parent - test_pos_parent ; - F32 mag_sqr = diff.magVecSquared() ; - if(llfinite(mag_sqr)) - { - setPositionParent(new_pos_parent); - } - else - { - llwarns << "Can not move the object/avatar to an infinite location!" << llendl ; - - retval |= INVALID_UPDATE ; - } - - if (mParent && ((LLViewerObject*)mParent)->isAvatar()) - { - // we have changed the position of an attachment, so we need to clamp it - LLVOAvatar *avatar = (LLVOAvatar*)mParent; - - avatar->clampAttachmentPositions(); - } - - // If we're snapping the position by more than 0.5m, update LLViewerStats::mAgentPositionSnaps - if ( asAvatar() && asAvatar()->isSelf() && (mag_sqr > 0.25f) ) - { - LLViewerStats::getInstance()->mAgentPositionSnaps.push( diff.length() ); - } - } - - if (new_rot != mLastRot - || new_angv != old_angv) - { - if (new_rot != mLastRot) - { - mLastRot = new_rot; - setRotation(new_rot); - } - - setChanged(ROTATED | SILHOUETTE); - - resetRot(); - } - - - if ( gShowObjectUpdates ) - { - if (!((mPrimitiveCode == LL_PCODE_LEGACY_AVATAR) && (((LLVOAvatar *) this)->isSelf())) - && mRegionp) - { - LLViewerObject* object = gObjectList.createObjectViewer(LL_PCODE_LEGACY_TEXT_BUBBLE, mRegionp); - LLVOTextBubble* bubble = (LLVOTextBubble*) object; - - if (update_type == OUT_TERSE_IMPROVED) - { - bubble->mColor.setVec(0.f, 0.f, 1.f, 1.f); - } - else - { - bubble->mColor.setVec(1.f, 0.f, 0.f, 1.f); - } - object->setPositionGlobal(getPositionGlobal()); - gPipeline.addObject(object); - } - } - - if ((0.0f == vel_mag_sq) && - (0.0f == accel_mag_sq) && - (0.0f == getAngularVelocity().magVecSquared())) - { - mStatic = TRUE; // This object doesn't move! - } - else - { - mStatic = FALSE; - } - -// BUG: This code leads to problems during group rotate and any scale operation. -// Small discepencies between the simulator and viewer representations cause the -// selection center to creep, leading to objects moving around the wrong center. -// -// Removing this, however, means that if someone else drags an object you have -// selected, your selection center and dialog boxes will be wrong. It also means -// that higher precision information on selected objects will be ignored. -// -// I believe the group rotation problem is fixed. JNC 1.21.2002 -// - // Additionally, if any child is selected, need to update the dialogs and selection - // center. - BOOL needs_refresh = mUserSelected; - for (child_list_t::iterator iter = mChildList.begin(); - iter != mChildList.end(); iter++) - { - LLViewerObject* child = *iter; - needs_refresh = needs_refresh || child->mUserSelected; - } - - if (needs_refresh) - { - LLSelectMgr::getInstance()->updateSelectionCenter(); - dialog_refresh_all(); - } - - - // Mark update time as approx. now, with the ping delay. - // Ping delay is off because it's not set for velocity interpolation, causing - // much jumping and hopping around... - -// U32 ping_delay = mesgsys->mCircuitInfo.getPingDelay(); - mLastInterpUpdateSecs = LLFrameTimer::getElapsedSeconds(); - mLastMessageUpdateSecs = mLastInterpUpdateSecs; - if (mDrawable.notNull()) - { - // Don't clear invisibility flag on update if still orphaned! - if (mDrawable->isState(LLDrawable::FORCE_INVISIBLE) && !mOrphaned) - { -// lldebugs << "Clearing force invisible: " << mID << ":" << getPCodeString() << ":" << getPositionAgent() << llendl; - mDrawable->setState(LLDrawable::CLEAR_INVISIBLE); - } - } - - // Update special hover cursor status - bool special_hover_cursor = specialHoverCursor(); - if (old_special_hover_cursor != special_hover_cursor - && mDrawable.notNull()) - { - mDrawable->updateSpecialHoverCursor(special_hover_cursor); - } - - return retval; -} - -BOOL LLViewerObject::isActive() const -{ - return TRUE; -} - - - -BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) -{ - static LLFastTimer::DeclareTimer ftm("Viewer Object"); - LLFastTimer t(ftm); - - if (mDead) - { - // It's dead. Don't update it. - return TRUE; - } - - // CRO - don't velocity interp linked objects! - // Leviathan - but DO velocity interp joints - if (!mStatic && sVelocityInterpolate && !isSelected()) - { - // calculate dt from last update - F32 dt_raw = (F32)(time - mLastInterpUpdateSecs); - F32 dt = mTimeDilation * dt_raw; - - if (!mJointInfo) - { - applyAngularVelocity(dt); - } - - LLViewerObject *parentp = (LLViewerObject *) getParent(); - if (mJointInfo) - { - if (parentp) - { - // do parent-relative stuff - LLVector3 ang_vel = getAngularVelocity(); - F32 omega = ang_vel.magVecSquared(); - F32 angle = 0.0f; - LLQuaternion dQ; - if (omega > 0.00001f) - { - omega = sqrt(omega); - angle = omega * dt; - dQ.setQuat(angle, ang_vel); - } - LLVector3 pos = getPosition(); - - if (HJT_HINGE == mJointInfo->mJointType) - { - // hinge = uniform circular motion - LLVector3 parent_pivot = getVelocity(); - LLVector3 parent_axis = getAcceleration(); - - angle = dt * (ang_vel * mJointInfo->mAxisOrAnchor); // AxisOrAnchor = axis - dQ.setQuat(angle, mJointInfo->mAxisOrAnchor); // AxisOrAnchor = axis - LLVector3 pivot_offset = pos - mJointInfo->mPivot; // pos in pivot-frame - pivot_offset = pivot_offset * dQ; // new rotated pivot-frame pos - pos = mJointInfo->mPivot + pivot_offset; // parent-frame - LLViewerObject::setPosition(pos); - LLQuaternion Q_PC = getRotation(); - setRotation(Q_PC * dQ); - mLastInterpUpdateSecs = time; - } - else if (HJT_POINT == mJointInfo->mJointType) - // || HJT_LPOINT == mJointInfo->mJointType) - { - // point-to-point = spin about axis and uniform circular motion - // of axis about the pivot point - // - // NOTE: this interpolation scheme is not quite good enough to - // reduce the bandwidth -- needs a gravitational correction. - // Similarly for hinges with axes that deviate from vertical. - - LLQuaternion Q_PC = getRotation(); - Q_PC = Q_PC * dQ; - setRotation(Q_PC); - - LLVector3 pivot_to_child = - mJointInfo->mAxisOrAnchor; // AxisOrAnchor = anchor - pos = mJointInfo->mPivot + pivot_to_child * Q_PC; - LLViewerObject::setPosition(pos); - mLastInterpUpdateSecs = time; - } - /* else if (HJT_WHEEL == mJointInfo->mJointInfo) - { - // wheel = uniform rotation about axis, with linear - // velocity interpolation (if any) - LLVector3 parent_axis = getAcceleration(); // HACK -- accel stores the parent-axis (parent-frame) - - LLQuaternion Q_PC = getRotation(); - - angle = dt * (parent_axis * ang_vel); - dQ.setQuat(angle, parent_axis); - - Q_PC = Q_PC * dQ; - setRotation(Q_PC); - - pos = getPosition() + dt * getVelocity(); - LLViewerObject::setPosition(pos); - mLastInterpUpdateSecs = time; - }*/ - } - } - else if (isAttachment()) - { - mLastInterpUpdateSecs = time; - return TRUE; - } - else - { // Move object based on it's velocity and rotation - interpolateLinearMotion(time, dt); - } - } - - updateDrawable(FALSE); - - return TRUE; -} - - -// Move an object due to idle-time viewer side updates by iterpolating motion -void LLViewerObject::interpolateLinearMotion(const F64 & time, const F32 & dt) -{ - // linear motion - // PHYSICS_TIMESTEP is used below to correct for the fact that the velocity in object - // updates represents the average velocity of the last timestep, rather than the final velocity. - // the time dilation above should guarantee that dt is never less than PHYSICS_TIMESTEP, theoretically - // - // *TODO: should also wrap linear accel/velocity in check - // to see if object is selected, instead of explicitly - // zeroing it out - - F64 time_since_last_update = time - mLastMessageUpdateSecs; - if (time_since_last_update <= 0.0 || dt <= 0.f) - { - return; - } - - LLVector3 accel = getAcceleration(); - LLVector3 vel = getVelocity(); - - if (sMaxUpdateInterpolationTime <= 0.0) - { // Old code path ... unbounded, simple interpolation - if (!(accel.isExactlyZero() && vel.isExactlyZero())) - { - LLVector3 pos = (vel + (0.5f * (dt-PHYSICS_TIMESTEP)) * accel) * dt; - - // region local - setPositionRegion(pos + getPositionRegion()); - setVelocity(vel + accel*dt); - - // for objects that are spinning but not translating, make sure to flag them as having moved - setChanged(MOVED | SILHOUETTE); - } - } - else if (!accel.isExactlyZero() || !vel.isExactlyZero()) // object is moving - { // Object is moving, and hasn't been too long since we got an update from the server - - // Calculate predicted position and velocity - LLVector3 new_pos = (vel + (0.5f * (dt-PHYSICS_TIMESTEP)) * accel) * dt; - LLVector3 new_v = accel * dt; - - if (time_since_last_update > sPhaseOutUpdateInterpolationTime && - sPhaseOutUpdateInterpolationTime > 0.0) - { // Haven't seen a viewer update in a while, check to see if the ciruit is still active - if (mRegionp) - { // The simulator will NOT send updates if the object continues normally on the path - // predicted by the velocity and the acceleration (often gravity) sent to the viewer - // So check to see if the circuit is blocked, which means the sim is likely in a long lag - LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit( mRegionp->getHost() ); - if (cdp) - { - // Find out how many seconds since last packet arrived on the circuit - F64 time_since_last_packet = LLMessageSystem::getMessageTimeSeconds() - cdp->getLastPacketInTime(); - - if (!cdp->isAlive() || // Circuit is dead or blocked - cdp->isBlocked() || // or doesn't seem to be getting any packets - (time_since_last_packet > sPhaseOutUpdateInterpolationTime)) - { - // Start to reduce motion interpolation since we haven't seen a server update in a while - F64 time_since_last_interpolation = time - mLastInterpUpdateSecs; - F64 phase_out = 1.0; - if (time_since_last_update > sMaxUpdateInterpolationTime) - { // Past the time limit, so stop the object - phase_out = 0.0; - //llinfos << "Motion phase out to zero" << llendl; - - // Kill angular motion as well. Note - not adding this due to paranoia - // about stopping rotation for llTargetOmega objects and not having it restart - // setAngularVelocity(LLVector3::zero); - } - else if (mLastInterpUpdateSecs - mLastMessageUpdateSecs > sPhaseOutUpdateInterpolationTime) - { // Last update was already phased out a bit - phase_out = (sMaxUpdateInterpolationTime - time_since_last_update) / - (sMaxUpdateInterpolationTime - time_since_last_interpolation); - //llinfos << "Continuing motion phase out of " << (F32) phase_out << llendl; - } - else - { // Phase out from full value - phase_out = (sMaxUpdateInterpolationTime - time_since_last_update) / - (sMaxUpdateInterpolationTime - sPhaseOutUpdateInterpolationTime); - //llinfos << "Starting motion phase out of " << (F32) phase_out << llendl; - } - phase_out = llclamp(phase_out, 0.0, 1.0); - - new_pos = new_pos * ((F32) phase_out); - new_v = new_v * ((F32) phase_out); - } - } - } - } - - new_pos = new_pos + getPositionRegion(); - new_v = new_v + vel; - - - // Clamp interpolated position to minimum underground and maximum region height - LLVector3d new_pos_global = mRegionp->getPosGlobalFromRegion(new_pos); - F32 min_height; - if (isAvatar()) - { // Make a better guess about AVs not going underground - min_height = LLWorld::getInstance()->resolveLandHeightGlobal(new_pos_global); - min_height += (0.5f * getScale().mV[VZ]); - } - else - { // This will put the object underground, but we can't tell if it will stop - // at ground level or not - min_height = LLWorld::getInstance()->getMinAllowedZ(this, new_pos_global); - } - - new_pos.mV[VZ] = llmax(min_height, new_pos.mV[VZ]); - new_pos.mV[VZ] = llmin(LLWorld::getInstance()->getRegionMaxHeight(), new_pos.mV[VZ]); - - // Check to see if it's going off the region - LLVector3 temp(new_pos); - if (temp.clamp(0.f, mRegionp->getWidth())) - { // Going off this region, so see if we might end up on another region - LLVector3d old_pos_global = mRegionp->getPosGlobalFromRegion(getPositionRegion()); - new_pos_global = mRegionp->getPosGlobalFromRegion(new_pos); // Re-fetch in case it got clipped above - - // Clip the positions to known regions - LLVector3d clip_pos_global = LLWorld::getInstance()->clipToVisibleRegions(old_pos_global, new_pos_global); - if (clip_pos_global != new_pos_global) - { // Was clipped, so this means we hit a edge where there is no region to enter - - //llinfos << "Hit empty region edge, clipped predicted position to " << mRegionp->getPosRegionFromGlobal(clip_pos_global) - // << " from " << new_pos << llendl; - new_pos = mRegionp->getPosRegionFromGlobal(clip_pos_global); - - // Stop motion and get server update for bouncing on the edge - new_v.clear(); - setAcceleration(LLVector3::zero); - } - else - { // Let predicted movement cross into another region - //llinfos << "Predicting region crossing to " << new_pos << llendl; - } - } - - // Set new position and velocity - setPositionRegion(new_pos); - setVelocity(new_v); - - // for objects that are spinning but not translating, make sure to flag them as having moved - setChanged(MOVED | SILHOUETTE); - } - - // Update the last time we did anything - mLastInterpUpdateSecs = time; -} - - - -BOOL LLViewerObject::setData(const U8 *datap, const U32 data_size) -{ - LLMemType mt(LLMemType::MTYPE_OBJECT); - - delete [] mData; - - if (datap) - { - mData = new U8[data_size]; - if (!mData) - { - return FALSE; - } - memcpy(mData, datap, data_size); /* Flawfinder: ignore */ - } - return TRUE; -} - -// delete an item in the inventory, but don't tell the server. This is -// used internally by remove, update, and savescript. -// This will only delete the first item with an item_id in the list -void LLViewerObject::deleteInventoryItem(const LLUUID& item_id) -{ - if(mInventory) - { - LLInventoryObject::object_list_t::iterator it = mInventory->begin(); - LLInventoryObject::object_list_t::iterator end = mInventory->end(); - for( ; it != end; ++it ) - { - if((*it)->getUUID() == item_id) - { - // This is safe only because we return immediatly. - mInventory->erase(it); // will deref and delete it - return; - } - } - doInventoryCallback(); - } -} - -void LLViewerObject::doUpdateInventory( - LLPointer<LLViewerInventoryItem>& item, - U8 key, - bool is_new) -{ - LLMemType mt(LLMemType::MTYPE_OBJECT); - - LLViewerInventoryItem* old_item = NULL; - if(TASK_INVENTORY_ITEM_KEY == key) - { - old_item = (LLViewerInventoryItem*)getInventoryObject(item->getUUID()); - } - else if(TASK_INVENTORY_ASSET_KEY == key) - { - old_item = getInventoryItemByAsset(item->getAssetUUID()); - } - LLUUID item_id; - LLUUID new_owner; - LLUUID new_group; - BOOL group_owned = FALSE; - if(old_item) - { - item_id = old_item->getUUID(); - new_owner = old_item->getPermissions().getOwner(); - new_group = old_item->getPermissions().getGroup(); - group_owned = old_item->getPermissions().isGroupOwned(); - old_item = NULL; - } - else - { - item_id = item->getUUID(); - } - if(!is_new && mInventory) - { - // Attempt to update the local inventory. If we can get the - // object perm, we have perfect visibility, so we want the - // serial number to match. Otherwise, take our best guess and - // make sure that the serial number does not match. - deleteInventoryItem(item_id); - LLPermissions perm(item->getPermissions()); - LLPermissions* obj_perm = LLSelectMgr::getInstance()->findObjectPermissions(this); - bool is_atomic = ((S32)LLAssetType::AT_OBJECT == item->getType()) ? false : true; - if(obj_perm) - { - perm.setOwnerAndGroup(LLUUID::null, obj_perm->getOwner(), obj_perm->getGroup(), is_atomic); - } - else - { - if(group_owned) - { - perm.setOwnerAndGroup(LLUUID::null, new_owner, new_group, is_atomic); - } - else if(!new_owner.isNull()) - { - // The object used to be in inventory, so we can - // assume the owner and group will match what they are - // there. - perm.setOwnerAndGroup(LLUUID::null, new_owner, new_group, is_atomic); - } - // *FIX: can make an even better guess by using the mPermGroup flags - else if(permYouOwner()) - { - // best guess. - perm.setOwnerAndGroup(LLUUID::null, gAgent.getID(), item->getPermissions().getGroup(), is_atomic); - --mInventorySerialNum; - } - else - { - // dummy it up. - perm.setOwnerAndGroup(LLUUID::null, LLUUID::null, LLUUID::null, is_atomic); - --mInventorySerialNum; - } - } - LLViewerInventoryItem* oldItem = item; - LLViewerInventoryItem* new_item = new LLViewerInventoryItem(oldItem); - new_item->setPermissions(perm); - mInventory->push_front(new_item); - doInventoryCallback(); - ++mInventorySerialNum; - } -} - -// save a script, which involves removing the old one, and rezzing -// in the new one. This method should be called with the asset id -// of the new and old script AFTER the bytecode has been saved. -void LLViewerObject::saveScript( - const LLViewerInventoryItem* item, - BOOL active, - bool is_new) -{ - LLMemType mt(LLMemType::MTYPE_OBJECT); - - /* - * XXXPAM Investigate not making this copy. Seems unecessary, but I'm unsure about the - * interaction with doUpdateInventory() called below. - */ - lldebugs << "LLViewerObject::saveScript() " << item->getUUID() << " " << item->getAssetUUID() << llendl; - LLPointer<LLViewerInventoryItem> task_item = - new LLViewerInventoryItem(item->getUUID(), mID, item->getPermissions(), - item->getAssetUUID(), item->getType(), - item->getInventoryType(), - item->getName(), item->getDescription(), - item->getSaleInfo(), item->getFlags(), - item->getCreationDate()); - task_item->setTransactionID(item->getTransactionID()); - - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_RezScript); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID()); - msg->nextBlockFast(_PREHASH_UpdateBlock); - msg->addU32Fast(_PREHASH_ObjectLocalID, (mLocalID)); - U8 enabled = active; - msg->addBOOLFast(_PREHASH_Enabled, enabled); - msg->nextBlockFast(_PREHASH_InventoryBlock); - task_item->packMessage(msg); - msg->sendReliable(mRegionp->getHost()); - - // do the internal logic - doUpdateInventory(task_item, TASK_INVENTORY_ITEM_KEY, is_new); -} - -void LLViewerObject::moveInventory(const LLUUID& folder_id, - const LLUUID& item_id) -{ - lldebugs << "LLViewerObject::moveInventory " << item_id << llendl; - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_MoveTaskInventory); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addUUIDFast(_PREHASH_FolderID, folder_id); - msg->nextBlockFast(_PREHASH_InventoryData); - msg->addU32Fast(_PREHASH_LocalID, mLocalID); - msg->addUUIDFast(_PREHASH_ItemID, item_id); - msg->sendReliable(mRegionp->getHost()); - - LLInventoryObject* inv_obj = getInventoryObject(item_id); - if(inv_obj) - { - LLViewerInventoryItem* item = (LLViewerInventoryItem*)inv_obj; - if(!item->getPermissions().allowCopyBy(gAgent.getID())) - { - deleteInventoryItem(item_id); - ++mInventorySerialNum; - } - } -} - -void LLViewerObject::dirtyInventory() -{ - // If there aren't any LLVOInventoryListeners, we won't be - // able to update our mInventory when it comes back from the - // simulator, so we should not clear the inventory either. - if(mInventory && !mInventoryCallbacks.empty()) - { - mInventory->clear(); // will deref and delete entries - delete mInventory; - mInventory = NULL; - mInventoryDirty = TRUE; - } -} - -void LLViewerObject::registerInventoryListener(LLVOInventoryListener* listener, void* user_data) -{ - LLMemType mt(LLMemType::MTYPE_OBJECT); - - LLInventoryCallbackInfo* info = new LLInventoryCallbackInfo; - info->mListener = listener; - info->mInventoryData = user_data; - mInventoryCallbacks.push_front(info); -} - -void LLViewerObject::removeInventoryListener(LLVOInventoryListener* listener) -{ - if (listener == NULL) - return; - for (callback_list_t::iterator iter = mInventoryCallbacks.begin(); - iter != mInventoryCallbacks.end(); ) - { - callback_list_t::iterator curiter = iter++; - LLInventoryCallbackInfo* info = *curiter; - if (info->mListener == listener) - { - delete info; - mInventoryCallbacks.erase(curiter); - break; - } - } -} - -void LLViewerObject::clearInventoryListeners() -{ - for_each(mInventoryCallbacks.begin(), mInventoryCallbacks.end(), DeletePointer()); - mInventoryCallbacks.clear(); -} - -void LLViewerObject::requestInventory() -{ - mInventoryDirty = FALSE; - if(mInventory) - { - //mInventory->clear() // will deref and delete it - //delete mInventory; - //mInventory = NULL; - doInventoryCallback(); - } - // throw away duplicate requests - else - { - fetchInventoryFromServer(); - } -} - -void LLViewerObject::fetchInventoryFromServer() -{ - if (!mInventoryPending) - { - delete mInventory; - mInventory = NULL; - mInventoryDirty = FALSE; - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_RequestTaskInventory); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_InventoryData); - msg->addU32Fast(_PREHASH_LocalID, mLocalID); - msg->sendReliable(mRegionp->getHost()); - - // this will get reset by dirtyInventory or doInventoryCallback - mInventoryPending = TRUE; - } -} - -struct LLFilenameAndTask -{ - LLUUID mTaskID; - std::string mFilename; -#ifdef _DEBUG - static S32 sCount; - LLFilenameAndTask() - { - ++sCount; - lldebugs << "Constructing LLFilenameAndTask: " << sCount << llendl; - } - ~LLFilenameAndTask() - { - --sCount; - lldebugs << "Destroying LLFilenameAndTask: " << sCount << llendl; - } -private: - LLFilenameAndTask(const LLFilenameAndTask& rhs); - const LLFilenameAndTask& operator=(const LLFilenameAndTask& rhs) const; -#endif -}; - -#ifdef _DEBUG -S32 LLFilenameAndTask::sCount = 0; -#endif - -// static -void LLViewerObject::processTaskInv(LLMessageSystem* msg, void** user_data) -{ - LLMemType mt(LLMemType::MTYPE_OBJECT); - - LLUUID task_id; - msg->getUUIDFast(_PREHASH_InventoryData, _PREHASH_TaskID, task_id); - LLViewerObject* object = gObjectList.findObject(task_id); - if(!object) - { - llwarns << "LLViewerObject::processTaskInv object " - << task_id << " does not exist." << llendl; - return; - } - - msg->getS16Fast(_PREHASH_InventoryData, _PREHASH_Serial, object->mInventorySerialNum); - LLFilenameAndTask* ft = new LLFilenameAndTask; - ft->mTaskID = task_id; - - std::string unclean_filename; - msg->getStringFast(_PREHASH_InventoryData, _PREHASH_Filename, unclean_filename); - ft->mFilename = LLDir::getScrubbedFileName(unclean_filename); - - if(ft->mFilename.empty()) - { - lldebugs << "Task has no inventory" << llendl; - // mock up some inventory to make a drop target. - if(object->mInventory) - { - object->mInventory->clear(); // will deref and delete it - } - else - { - object->mInventory = new LLInventoryObject::object_list_t(); - } - LLPointer<LLInventoryObject> obj; - obj = new LLInventoryObject(object->mID, LLUUID::null, - LLAssetType::AT_CATEGORY, - LLTrans::getString("ViewerObjectContents").c_str()); - object->mInventory->push_front(obj); - object->doInventoryCallback(); - delete ft; - return; - } - gXferManager->requestFile(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ft->mFilename), - ft->mFilename, LL_PATH_CACHE, - object->mRegionp->getHost(), - TRUE, - &LLViewerObject::processTaskInvFile, - (void**)ft, - LLXferManager::HIGH_PRIORITY); -} - -void LLViewerObject::processTaskInvFile(void** user_data, S32 error_code, LLExtStat ext_status) -{ - LLFilenameAndTask* ft = (LLFilenameAndTask*)user_data; - LLViewerObject* object = NULL; - if(ft && (0 == error_code) && - (object = gObjectList.findObject(ft->mTaskID))) - { - object->loadTaskInvFile(ft->mFilename); - } - else - { - // This Occurs When to requests were made, and the first one - // has already handled it. - lldebugs << "Problem loading task inventory. Return code: " - << error_code << llendl; - } - delete ft; -} - -void LLViewerObject::loadTaskInvFile(const std::string& filename) -{ - LLMemType mt(LLMemType::MTYPE_OBJECT); - - std::string filename_and_local_path = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, filename); - llifstream ifs(filename_and_local_path); - if(ifs.good()) - { - char buffer[MAX_STRING]; /* Flawfinder: ignore */ - // *NOTE: This buffer size is hard coded into scanf() below. - char keyword[MAX_STRING]; /* Flawfinder: ignore */ - if(mInventory) - { - mInventory->clear(); // will deref and delete it - } - else - { - mInventory = new LLInventoryObject::object_list_t; - } - while(ifs.good()) - { - ifs.getline(buffer, MAX_STRING); - sscanf(buffer, " %254s", keyword); /* Flawfinder: ignore */ - if(0 == strcmp("inv_item", keyword)) - { - LLPointer<LLInventoryObject> inv = new LLViewerInventoryItem; - inv->importLegacyStream(ifs); - mInventory->push_front(inv); - } - else if(0 == strcmp("inv_object", keyword)) - { - LLPointer<LLInventoryObject> inv = new LLInventoryObject; - inv->importLegacyStream(ifs); - inv->rename(LLTrans::getString("ViewerObjectContents").c_str()); - mInventory->push_front(inv); - } - else - { - llwarns << "Unknown token in inventory file '" - << keyword << "'" << llendl; - } - } - ifs.close(); - LLFile::remove(filename_and_local_path); - } - else - { - llwarns << "unable to load task inventory: " << filename_and_local_path - << llendl; - } - doInventoryCallback(); -} - -void LLViewerObject::doInventoryCallback() -{ - for (callback_list_t::iterator iter = mInventoryCallbacks.begin(); - iter != mInventoryCallbacks.end(); ) - { - callback_list_t::iterator curiter = iter++; - LLInventoryCallbackInfo* info = *curiter; - if (info->mListener != NULL) - { - info->mListener->inventoryChanged(this, - mInventory, - mInventorySerialNum, - info->mInventoryData); - } - else - { - llinfos << "LLViewerObject::doInventoryCallback() deleting bad listener entry." << llendl; - delete info; - mInventoryCallbacks.erase(curiter); - } - } - mInventoryPending = FALSE; -} - -void LLViewerObject::removeInventory(const LLUUID& item_id) -{ - // close any associated floater properties - LLFloaterReg::hideInstance("properties", item_id); - - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_RemoveTaskInventory); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_InventoryData); - msg->addU32Fast(_PREHASH_LocalID, mLocalID); - msg->addUUIDFast(_PREHASH_ItemID, item_id); - msg->sendReliable(mRegionp->getHost()); - deleteInventoryItem(item_id); - ++mInventorySerialNum; -} - -void LLViewerObject::updateInventory( - LLViewerInventoryItem* item, - U8 key, - bool is_new) -{ - LLMemType mt(LLMemType::MTYPE_OBJECT); - - // This slices the object into what we're concerned about on the - // viewer. The simulator will take the permissions and transfer - // ownership. - LLPointer<LLViewerInventoryItem> task_item = - new LLViewerInventoryItem(item->getUUID(), mID, item->getPermissions(), - item->getAssetUUID(), item->getType(), - item->getInventoryType(), - item->getName(), item->getDescription(), - item->getSaleInfo(), - item->getFlags(), - item->getCreationDate()); - task_item->setTransactionID(item->getTransactionID()); - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_UpdateTaskInventory); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_UpdateData); - msg->addU32Fast(_PREHASH_LocalID, mLocalID); - msg->addU8Fast(_PREHASH_Key, key); - msg->nextBlockFast(_PREHASH_InventoryData); - task_item->packMessage(msg); - msg->sendReliable(mRegionp->getHost()); - - // do the internal logic - doUpdateInventory(task_item, key, is_new); -} - -void LLViewerObject::updateInventoryLocal(LLInventoryItem* item, U8 key) -{ - LLPointer<LLViewerInventoryItem> task_item = - new LLViewerInventoryItem(item->getUUID(), mID, item->getPermissions(), - item->getAssetUUID(), item->getType(), - item->getInventoryType(), - item->getName(), item->getDescription(), - item->getSaleInfo(), item->getFlags(), - item->getCreationDate()); - - // do the internal logic - const bool is_new = false; - doUpdateInventory(task_item, key, is_new); -} - -LLInventoryObject* LLViewerObject::getInventoryObject(const LLUUID& item_id) -{ - LLInventoryObject* rv = NULL; - if(mInventory) - { - LLInventoryObject::object_list_t::iterator it = mInventory->begin(); - LLInventoryObject::object_list_t::iterator end = mInventory->end(); - for ( ; it != end; ++it) - { - if((*it)->getUUID() == item_id) - { - rv = *it; - break; - } - } - } - return rv; -} - -void LLViewerObject::getInventoryContents(LLInventoryObject::object_list_t& objects) -{ - if(mInventory) - { - LLInventoryObject::object_list_t::iterator it = mInventory->begin(); - LLInventoryObject::object_list_t::iterator end = mInventory->end(); - for( ; it != end; ++it) - { - if ((*it)->getType() != LLAssetType::AT_CATEGORY) - { - objects.push_back(*it); - } - } - } -} - -LLInventoryObject* LLViewerObject::getInventoryRoot() -{ - if (!mInventory || !mInventory->size()) - { - return NULL; - } - return mInventory->back(); -} - -LLViewerInventoryItem* LLViewerObject::getInventoryItemByAsset(const LLUUID& asset_id) -{ - if (mInventoryDirty) - llwarns << "Peforming inventory lookup for object " << mID << " that has dirty inventory!" << llendl; - - LLViewerInventoryItem* rv = NULL; - if(mInventory) - { - LLViewerInventoryItem* item = NULL; - - LLInventoryObject::object_list_t::iterator it = mInventory->begin(); - LLInventoryObject::object_list_t::iterator end = mInventory->end(); - for( ; it != end; ++it) - { - LLInventoryObject* obj = *it; - if(obj->getType() != LLAssetType::AT_CATEGORY) - { - // *FIX: gank-ass down cast! - item = (LLViewerInventoryItem*)obj; - if(item->getAssetUUID() == asset_id) - { - rv = item; - break; - } - } - } - } - return rv; -} - -void LLViewerObject::updateViewerInventoryAsset( - const LLViewerInventoryItem* item, - const LLUUID& new_asset) -{ - LLPointer<LLViewerInventoryItem> task_item = - new LLViewerInventoryItem(item); - task_item->setAssetUUID(new_asset); - - // do the internal logic - doUpdateInventory(task_item, TASK_INVENTORY_ITEM_KEY, false); -} - -void LLViewerObject::setPixelAreaAndAngle(LLAgent &agent) -{ - if (getVolume()) - { //volumes calculate pixel area and angle per face - return; - } - - LLVector3 viewer_pos_agent = gAgentCamera.getCameraPositionAgent(); - LLVector3 pos_agent = getRenderPosition(); - - F32 dx = viewer_pos_agent.mV[VX] - pos_agent.mV[VX]; - F32 dy = viewer_pos_agent.mV[VY] - pos_agent.mV[VY]; - F32 dz = viewer_pos_agent.mV[VZ] - pos_agent.mV[VZ]; - - F32 max_scale = getMaxScale(); - F32 mid_scale = getMidScale(); - F32 min_scale = getMinScale(); - - // IW: estimate - when close to large objects, computing range based on distance from center is no good - // to try to get a min distance from face, subtract min_scale/2 from the range. - // This means we'll load too much detail sometimes, but that's better than not enough - // I don't think there's a better way to do this without calculating distance per-poly - F32 range = sqrt(dx*dx + dy*dy + dz*dz) - min_scale/2; - - LLViewerCamera* camera = LLViewerCamera::getInstance(); - if (range < 0.001f || isHUDAttachment()) // range == zero - { - mAppAngle = 180.f; - mPixelArea = (F32)camera->getScreenPixelArea(); - } - else - { - mAppAngle = (F32) atan2( max_scale, range) * RAD_TO_DEG; - - F32 pixels_per_meter = camera->getPixelMeterRatio() / range; - - mPixelArea = (pixels_per_meter * max_scale) * (pixels_per_meter * mid_scale); - if (mPixelArea > camera->getScreenPixelArea()) - { - mAppAngle = 180.f; - mPixelArea = (F32)camera->getScreenPixelArea(); - } - } -} - -BOOL LLViewerObject::updateLOD() -{ - return FALSE; -} - -BOOL LLViewerObject::updateGeometry(LLDrawable *drawable) -{ - return TRUE; -} - -void LLViewerObject::updateGL() -{ - -} - -void LLViewerObject::updateFaceSize(S32 idx) -{ - -} - -LLDrawable* LLViewerObject::createDrawable(LLPipeline *pipeline) -{ - return NULL; -} - -void LLViewerObject::setScale(const LLVector3 &scale, BOOL damped) -{ - LLPrimitive::setScale(scale); - if (mDrawable.notNull()) - { - //encompass completely sheared objects by taking - //the most extreme point possible (<1,1,0.5>) - mDrawable->setRadius(LLVector3(1,1,0.5f).scaleVec(scale).magVec()); - updateDrawable(damped); - } - - if( (LL_PCODE_VOLUME == getPCode()) && !isDead() ) - { - if (permYouOwner() || (scale.magVecSquared() > (7.5f * 7.5f)) ) - { - if (!mOnMap) - { - llassert_always(LLWorld::getInstance()->getRegionFromHandle(getRegion()->getHandle())); - - gObjectList.addToMap(this); - mOnMap = TRUE; - } - } - else - { - if (mOnMap) - { - gObjectList.removeFromMap(this); - mOnMap = FALSE; - } - } - } -} - -void LLViewerObject::setObjectCost(F32 cost) -{ - mObjectCost = cost; - mCostStale = false; - - if (isSelected()) - { - gFloaterTools->dirty(); - } -} - -void LLViewerObject::setLinksetCost(F32 cost) -{ - mLinksetCost = cost; - mCostStale = false; - - if (isSelected()) - { - gFloaterTools->dirty(); - } -} - -void LLViewerObject::setPhysicsCost(F32 cost) -{ - mPhysicsCost = cost; - mCostStale = false; - - if (isSelected()) - { - gFloaterTools->dirty(); - } -} - -void LLViewerObject::setLinksetPhysicsCost(F32 cost) -{ - mLinksetPhysicsCost = cost; - mCostStale = false; - - if (isSelected()) - { - gFloaterTools->dirty(); - } -} - - -F32 LLViewerObject::getObjectCost() -{ - if (mCostStale) - { - gObjectList.updateObjectCost(this); - } - - return mObjectCost; -} - -F32 LLViewerObject::getLinksetCost() -{ - if (mCostStale) - { - gObjectList.updateObjectCost(this); - } - - return mLinksetCost; -} - -F32 LLViewerObject::getPhysicsCost() -{ - if (mCostStale) - { - gObjectList.updateObjectCost(this); - } - - return mPhysicsCost; -} - -F32 LLViewerObject::getLinksetPhysicsCost() -{ - if (mCostStale) - { - gObjectList.updateObjectCost(this); - } - - return mLinksetPhysicsCost; -} - -F32 LLViewerObject::getStreamingCost(S32* bytes, S32* visible_bytes) -{ - return 0.f; -} - -U32 LLViewerObject::getTriangleCount() -{ - return 0; -} - -U32 LLViewerObject::getHighLODTriangleCount() -{ - return 0; -} - -void LLViewerObject::updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax) -{ - LLVector4a center; - center.load3(getRenderPosition().mV); - LLVector4a size; - size.load3(getScale().mV); - newMin.setSub(center, size); - newMax.setAdd(center, size); - - mDrawable->setPositionGroup(center); -} - -F32 LLViewerObject::getBinRadius() -{ - if (mDrawable.notNull()) - { - const LLVector4a* ext = mDrawable->getSpatialExtents(); - LLVector4a diff; - diff.setSub(ext[1], ext[0]); - return diff.getLength3().getF32(); - } - - return getScale().magVec(); -} - -F32 LLViewerObject::getMaxScale() const -{ - return llmax(getScale().mV[VX],getScale().mV[VY], getScale().mV[VZ]); -} - -F32 LLViewerObject::getMinScale() const -{ - return llmin(getScale().mV[0],getScale().mV[1],getScale().mV[2]); -} - -F32 LLViewerObject::getMidScale() const -{ - if (getScale().mV[VX] < getScale().mV[VY]) - { - if (getScale().mV[VY] < getScale().mV[VZ]) - { - return getScale().mV[VY]; - } - else if (getScale().mV[VX] < getScale().mV[VZ]) - { - return getScale().mV[VZ]; - } - else - { - return getScale().mV[VX]; - } - } - else if (getScale().mV[VX] < getScale().mV[VZ]) - { - return getScale().mV[VX]; - } - else if (getScale().mV[VY] < getScale().mV[VZ]) - { - return getScale().mV[VZ]; - } - else - { - return getScale().mV[VY]; - } -} - - -void LLViewerObject::updateTextures() -{ -} - -void LLViewerObject::boostTexturePriority(BOOL boost_children /* = TRUE */) -{ - if (isDead()) - { - return; - } - - S32 i; - S32 tex_count = getNumTEs(); - for (i = 0; i < tex_count; i++) - { - getTEImage(i)->setBoostLevel(LLViewerTexture::BOOST_SELECTED); - } - - if (isSculpted() && !isMesh()) - { - LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); - LLUUID sculpt_id = sculpt_params->getSculptTexture(); - LLViewerTextureManager::getFetchedTexture(sculpt_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLViewerTexture::BOOST_SELECTED); - } - - if (boost_children) - { - for (child_list_t::iterator iter = mChildList.begin(); - iter != mChildList.end(); iter++) - { - LLViewerObject* child = *iter; - child->boostTexturePriority(); - } - } -} - - -void LLViewerObject::setLineWidthForWindowSize(S32 window_width) -{ - if (window_width < 700) - { - LLUI::setLineWidth(2.0f); - } - else if (window_width < 1100) - { - LLUI::setLineWidth(3.0f); - } - else if (window_width < 2000) - { - LLUI::setLineWidth(4.0f); - } - else - { - // _damn_, what a nice monitor! - LLUI::setLineWidth(5.0f); - } -} - -void LLViewerObject::increaseArrowLength() -{ -/* ??? - if (mAxisArrowLength == 50) - { - mAxisArrowLength = 100; - } - else - { - mAxisArrowLength = 150; - } -*/ -} - - -void LLViewerObject::decreaseArrowLength() -{ -/* ??? - if (mAxisArrowLength == 150) - { - mAxisArrowLength = 100; - } - else - { - mAxisArrowLength = 50; - } -*/ -} - -// Culled from newsim LLTask::addNVPair -void LLViewerObject::addNVPair(const std::string& data) -{ - // cout << "LLViewerObject::addNVPair() with ---" << data << "---" << endl; - LLNameValue *nv = new LLNameValue(data.c_str()); - -// char splat[MAX_STRING]; -// temp->printNameValue(splat); -// llinfos << "addNVPair " << splat << llendl; - - name_value_map_t::iterator iter = mNameValuePairs.find(nv->mName); - if (iter != mNameValuePairs.end()) - { - LLNameValue* foundnv = iter->second; - if (foundnv->mClass != NVC_READ_ONLY) - { - delete foundnv; - mNameValuePairs.erase(iter); - } - else - { - delete nv; -// llinfos << "Trying to write to Read Only NVPair " << temp->mName << " in addNVPair()" << llendl; - return; - } - } - mNameValuePairs[nv->mName] = nv; -} - -BOOL LLViewerObject::removeNVPair(const std::string& name) -{ - char* canonical_name = gNVNameTable.addString(name); - - lldebugs << "LLViewerObject::removeNVPair(): " << name << llendl; - - name_value_map_t::iterator iter = mNameValuePairs.find(canonical_name); - if (iter != mNameValuePairs.end()) - { - if( mRegionp ) - { - LLNameValue* nv = iter->second; -/* - std::string buffer = nv->printNameValue(); - gMessageSystem->newMessageFast(_PREHASH_RemoveNameValuePair); - gMessageSystem->nextBlockFast(_PREHASH_TaskData); - gMessageSystem->addUUIDFast(_PREHASH_ID, mID); - - gMessageSystem->nextBlockFast(_PREHASH_NameValueData); - gMessageSystem->addStringFast(_PREHASH_NVPair, buffer); - - gMessageSystem->sendReliable( mRegionp->getHost() ); -*/ - // Remove the NV pair from the local list. - delete nv; - mNameValuePairs.erase(iter); - return TRUE; - } - else - { - lldebugs << "removeNVPair - No region for object" << llendl; - } - } - return FALSE; -} - - -LLNameValue *LLViewerObject::getNVPair(const std::string& name) const -{ - char *canonical_name; - - canonical_name = gNVNameTable.addString(name); - - // If you access a map with a name that isn't in it, it will add the name and a null pointer. - // So first check if the data is in the map. - name_value_map_t::const_iterator iter = mNameValuePairs.find(canonical_name); - if (iter != mNameValuePairs.end()) - { - return iter->second; - } - else - { - return NULL; - } -} - -void LLViewerObject::updatePositionCaches() const -{ - if(mRegionp) - { - if (!isRoot()) - { - mPositionRegion = ((LLViewerObject *)getParent())->getPositionRegion() + getPosition() * getParent()->getRotation(); - mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion); - } - else - { - mPositionRegion = getPosition(); - mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion); - } - } -} - -const LLVector3d LLViewerObject::getPositionGlobal() const -{ - if(mRegionp) - { - LLVector3d position_global = mRegionp->getPosGlobalFromRegion(getPositionRegion()); - - if (isAttachment()) - { - position_global = gAgent.getPosGlobalFromAgent(getRenderPosition()); - } - return position_global; - } - else - { - LLVector3d position_global(getPosition()); - return position_global; - } -} - -const LLVector3 &LLViewerObject::getPositionAgent() const -{ - if (mRegionp) - { - if (mDrawable.notNull() && (!mDrawable->isRoot() && getParent())) - { - // Don't return cached position if you have a parent, recalc (until all dirtying is done correctly. - LLVector3 position_region; - position_region = ((LLViewerObject *)getParent())->getPositionRegion() + getPosition() * getParent()->getRotation(); - mPositionAgent = mRegionp->getPosAgentFromRegion(position_region); - } - else - { - mPositionAgent = mRegionp->getPosAgentFromRegion(getPosition()); - } - } - return mPositionAgent; -} - -const LLVector3 &LLViewerObject::getPositionRegion() const -{ - if (!isRoot()) - { - LLViewerObject *parent = (LLViewerObject *)getParent(); - mPositionRegion = parent->getPositionRegion() + (getPosition() * parent->getRotation()); - } - else - { - mPositionRegion = getPosition(); - } - - return mPositionRegion; -} - -const LLVector3 LLViewerObject::getPositionEdit() const -{ - if (isRootEdit()) - { - return getPosition(); - } - else - { - LLViewerObject *parent = (LLViewerObject *)getParent(); - LLVector3 position_edit = parent->getPositionEdit() + getPosition() * parent->getRotationEdit(); - return position_edit; - } -} - -const LLVector3 LLViewerObject::getRenderPosition() const -{ - if (mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED)) - { - LLVOAvatar* avatar = getAvatar(); - if (avatar) - { - return avatar->getPositionAgent(); - } - } - - if (mDrawable.isNull() || mDrawable->getGeneration() < 0) - { - return getPositionAgent(); - } - else - { - return mDrawable->getPositionAgent(); - } -} - -const LLVector3 LLViewerObject::getPivotPositionAgent() const -{ - return getRenderPosition(); -} - -const LLQuaternion LLViewerObject::getRenderRotation() const -{ - LLQuaternion ret; - if (mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED)) - { - return ret; - } - - if (mDrawable.isNull() || mDrawable->isStatic()) - { - ret = getRotationEdit(); - } - else - { - if (!mDrawable->isRoot()) - { - ret = getRotation() * LLQuaternion(mDrawable->getParent()->getWorldMatrix()); - } - else - { - ret = LLQuaternion(mDrawable->getWorldMatrix()); - } - } - - return ret; -} - -const LLMatrix4 LLViewerObject::getRenderMatrix() const -{ - return mDrawable->getWorldMatrix(); -} - -const LLQuaternion LLViewerObject::getRotationRegion() const -{ - LLQuaternion global_rotation = getRotation(); - if (!((LLXform *)this)->isRoot()) - { - global_rotation = global_rotation * getParent()->getRotation(); - } - return global_rotation; -} - -const LLQuaternion LLViewerObject::getRotationEdit() const -{ - LLQuaternion global_rotation = getRotation(); - if (!((LLXform *)this)->isRootEdit()) - { - global_rotation = global_rotation * getParent()->getRotation(); - } - return global_rotation; -} - -void LLViewerObject::setPositionAbsoluteGlobal( const LLVector3d &pos_global, BOOL damped ) -{ - if (isAttachment()) - { - LLVector3 new_pos = mRegionp->getPosRegionFromGlobal(pos_global); - if (isRootEdit()) - { - new_pos -= mDrawable->mXform.getParent()->getWorldPosition(); - LLQuaternion world_rotation = mDrawable->mXform.getParent()->getWorldRotation(); - new_pos = new_pos * ~world_rotation; - } - else - { - LLViewerObject* parentp = (LLViewerObject*)getParent(); - new_pos -= parentp->getPositionAgent(); - new_pos = new_pos * ~parentp->getRotationRegion(); - } - LLViewerObject::setPosition(new_pos); - - if (mParent && ((LLViewerObject*)mParent)->isAvatar()) - { - // we have changed the position of an attachment, so we need to clamp it - LLVOAvatar *avatar = (LLVOAvatar*)mParent; - - avatar->clampAttachmentPositions(); - } - } - else - { - if( isRoot() ) - { - setPositionRegion(mRegionp->getPosRegionFromGlobal(pos_global)); - } - else - { - // the relative position with the parent is not constant - LLViewerObject* parent = (LLViewerObject *)getParent(); - //RN: this assumes we are only calling this function from the edit tools - gPipeline.updateMoveNormalAsync(parent->mDrawable); - - LLVector3 pos_local = mRegionp->getPosRegionFromGlobal(pos_global) - parent->getPositionRegion(); - pos_local = pos_local * ~parent->getRotationRegion(); - LLViewerObject::setPosition( pos_local ); - } - } - //RN: assumes we always want to snap the object when calling this function - gPipeline.updateMoveNormalAsync(mDrawable); -} - -void LLViewerObject::setPosition(const LLVector3 &pos, BOOL damped) -{ - if (getPosition() != pos) - { - setChanged(TRANSLATED | SILHOUETTE); - } - - LLXform::setPosition(pos); - updateDrawable(damped); - if (isRoot()) - { - // position caches need to be up to date on root objects - updatePositionCaches(); - } -} - -void LLViewerObject::setPositionGlobal(const LLVector3d &pos_global, BOOL damped) -{ - if (isAttachment()) - { - if (isRootEdit()) - { - LLVector3 newPos = mRegionp->getPosRegionFromGlobal(pos_global); - newPos = newPos - mDrawable->mXform.getParent()->getWorldPosition(); - - LLQuaternion invWorldRotation = mDrawable->mXform.getParent()->getWorldRotation(); - invWorldRotation.transQuat(); - - newPos = newPos * invWorldRotation; - LLViewerObject::setPosition(newPos); - } - else - { - // assumes parent is root editable (root of attachment) - LLVector3 newPos = mRegionp->getPosRegionFromGlobal(pos_global); - newPos = newPos - mDrawable->mXform.getParent()->getWorldPosition(); - LLVector3 delta_pos = newPos - getPosition(); - - LLQuaternion invRotation = mDrawable->getRotation(); - invRotation.transQuat(); - - delta_pos = delta_pos * invRotation; - - // *FIX: is this right? Shouldn't we be calling the - // LLViewerObject version of setPosition? - LLVector3 old_pos = mDrawable->mXform.getParent()->getPosition(); - mDrawable->mXform.getParent()->setPosition(old_pos + delta_pos); - setChanged(TRANSLATED | SILHOUETTE); - } - if (mParent && ((LLViewerObject*)mParent)->isAvatar()) - { - // we have changed the position of an attachment, so we need to clamp it - LLVOAvatar *avatar = (LLVOAvatar*)mParent; - - avatar->clampAttachmentPositions(); - } - } - else - { - if (isRoot()) - { - setPositionRegion(mRegionp->getPosRegionFromGlobal(pos_global)); - } - else - { - // the relative position with the parent is constant, but the parent's position needs to be changed - LLVector3d position_offset; - position_offset.setVec(getPosition()*getParent()->getRotation()); - LLVector3d new_pos_global = pos_global - position_offset; - ((LLViewerObject *)getParent())->setPositionGlobal(new_pos_global); - } - } - updateDrawable(damped); -} - - -void LLViewerObject::setPositionParent(const LLVector3 &pos_parent, BOOL damped) -{ - // Set position relative to parent, if no parent, relative to region - if (!isRoot()) - { - LLViewerObject::setPosition(pos_parent, damped); - //updateDrawable(damped); - } - else - { - setPositionRegion(pos_parent, damped); - } -} - -void LLViewerObject::setPositionRegion(const LLVector3 &pos_region, BOOL damped) -{ - if (!isRootEdit()) - { - LLViewerObject* parent = (LLViewerObject*) getParent(); - LLViewerObject::setPosition((pos_region-parent->getPositionRegion())*~parent->getRotationRegion()); - } - else - { - LLViewerObject::setPosition(pos_region); - mPositionRegion = pos_region; - mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion); - } -} - -void LLViewerObject::setPositionAgent(const LLVector3 &pos_agent, BOOL damped) -{ - LLVector3 pos_region = getRegion()->getPosRegionFromAgent(pos_agent); - setPositionRegion(pos_region, damped); -} - -// identical to setPositionRegion() except it checks for child-joints -// and doesn't also move the joint-parent -// TODO -- implement similar intelligence for joint-parents toward -// their joint-children -void LLViewerObject::setPositionEdit(const LLVector3 &pos_edit, BOOL damped) -{ - if (!isRootEdit()) - { - // the relative position with the parent is constant, but the parent's position needs to be changed - LLVector3 position_offset = getPosition() * getParent()->getRotation(); - - ((LLViewerObject *)getParent())->setPositionEdit(pos_edit - position_offset); - updateDrawable(damped); - } - else if (isJointChild()) - { - // compute new parent-relative position - LLViewerObject *parent = (LLViewerObject *) getParent(); - LLQuaternion inv_parent_rot = parent->getRotation(); - inv_parent_rot.transQuat(); - LLVector3 pos_parent = (pos_edit - parent->getPositionRegion()) * inv_parent_rot; - LLViewerObject::setPosition(pos_parent, damped); - } - else - { - LLViewerObject::setPosition(pos_edit, damped); - mPositionRegion = pos_edit; - mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion); - } -} - - -LLViewerObject* LLViewerObject::getRootEdit() const -{ - const LLViewerObject* root = this; - while (root->mParent - && !(root->mJointInfo - || ((LLViewerObject*)root->mParent)->isAvatar()) ) - { - root = (LLViewerObject*)root->mParent; - } - return (LLViewerObject*)root; -} - - -BOOL LLViewerObject::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, - S32 face, - BOOL pick_transparent, - S32* face_hit, - LLVector3* intersection, - LLVector2* tex_coord, - LLVector3* normal, - LLVector3* bi_normal) -{ - return false; -} - -BOOL LLViewerObject::lineSegmentBoundingBox(const LLVector3& start, const LLVector3& end) -{ - if (mDrawable.isNull() || mDrawable->isDead()) - { - return FALSE; - } - - const LLVector4a* ext = mDrawable->getSpatialExtents(); - - //VECTORIZE THIS - LLVector4a center; - center.setAdd(ext[1], ext[0]); - center.mul(0.5f); - LLVector4a size; - size.setSub(ext[1], ext[0]); - size.mul(0.5f); - - LLVector4a starta, enda; - starta.load3(start.mV); - enda.load3(end.mV); - - return LLLineSegmentBoxIntersect(starta, enda, center, size); -} - -U8 LLViewerObject::getMediaType() const -{ - if (mMedia) - { - return mMedia->mMediaType; - } - else - { - return LLViewerObject::MEDIA_NONE; - } -} - -void LLViewerObject::setMediaType(U8 media_type) -{ - if (!mMedia) - { - // TODO what if we don't have a media pointer? - } - else if (mMedia->mMediaType != media_type) - { - mMedia->mMediaType = media_type; - - // TODO: update materials with new image - } -} - -std::string LLViewerObject::getMediaURL() const -{ - if (mMedia) - { - return mMedia->mMediaURL; - } - else - { - return std::string(); - } -} - -void LLViewerObject::setMediaURL(const std::string& media_url) -{ - LLMemType mt(LLMemType::MTYPE_OBJECT); - - if (!mMedia) - { - mMedia = new LLViewerObjectMedia; - mMedia->mMediaURL = media_url; - mMedia->mPassedWhitelist = FALSE; - - // TODO: update materials with new image - } - else if (mMedia->mMediaURL != media_url) - { - mMedia->mMediaURL = media_url; - mMedia->mPassedWhitelist = FALSE; - - // TODO: update materials with new image - } -} - -BOOL LLViewerObject::getMediaPassedWhitelist() const -{ - if (mMedia) - { - return mMedia->mPassedWhitelist; - } - else - { - return FALSE; - } -} - -void LLViewerObject::setMediaPassedWhitelist(BOOL passed) -{ - if (mMedia) - { - mMedia->mPassedWhitelist = passed; - } -} - -BOOL LLViewerObject::setMaterial(const U8 material) -{ - BOOL res = LLPrimitive::setMaterial(material); - if (res) - { - setChanged(TEXTURE); - } - return res; -} - -void LLViewerObject::setNumTEs(const U8 num_tes) -{ - LLMemType mt(LLMemType::MTYPE_OBJECT); - - U32 i; - if (num_tes != getNumTEs()) - { - if (num_tes) - { - LLPointer<LLViewerTexture> *new_images; - new_images = new LLPointer<LLViewerTexture>[num_tes]; - for (i = 0; i < num_tes; i++) - { - if (i < getNumTEs()) - { - new_images[i] = mTEImages[i]; - } - else if (getNumTEs()) - { - new_images[i] = mTEImages[getNumTEs()-1]; - } - else - { - new_images[i] = NULL; - } - } - - deleteTEImages(); - - mTEImages = new_images; - } - else - { - deleteTEImages(); - } - LLPrimitive::setNumTEs(num_tes); - setChanged(TEXTURE); - - if (mDrawable.notNull()) - { - gPipeline.markTextured(mDrawable); - } - } -} - -void LLViewerObject::sendMaterialUpdate() const -{ - LLViewerRegion* regionp = getRegion(); - if(!regionp) return; - gMessageSystem->newMessageFast(_PREHASH_ObjectMaterial); - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, mLocalID ); - gMessageSystem->addU8Fast(_PREHASH_Material, getMaterial() ); - gMessageSystem->sendReliable( regionp->getHost() ); - -} - -// formerly send_object_rotation -void LLViewerObject::sendRotationUpdate() const -{ - LLViewerRegion* regionp = getRegion(); - if(!regionp) return; - gMessageSystem->newMessageFast(_PREHASH_ObjectRotation); - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, mLocalID); - gMessageSystem->addQuatFast(_PREHASH_Rotation, getRotationEdit()); - //llinfos << "Sent rotation " << getRotationEdit() << llendl; - gMessageSystem->sendReliable( regionp->getHost() ); -} - -/* Obsolete, we use MultipleObjectUpdate instead -//// formerly send_object_position_global -//void LLViewerObject::sendPositionUpdate() const -//{ -// gMessageSystem->newMessageFast(_PREHASH_ObjectPosition); -// gMessageSystem->nextBlockFast(_PREHASH_AgentData); -// gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); -// gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -// gMessageSystem->nextBlockFast(_PREHASH_ObjectData); -// gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, mLocalID ); -// gMessageSystem->addVector3Fast(_PREHASH_Position, getPositionRegion()); -// LLViewerRegion* regionp = getRegion(); -// gMessageSystem->sendReliable(regionp->getHost()); -//} -*/ - -//formerly send_object_shape(LLViewerObject *object) -void LLViewerObject::sendShapeUpdate() -{ - gMessageSystem->newMessageFast(_PREHASH_ObjectShape); - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, mLocalID ); - - LLVolumeMessage::packVolumeParams(&getVolume()->getParams(), gMessageSystem); - - LLViewerRegion *regionp = getRegion(); - gMessageSystem->sendReliable( regionp->getHost() ); -} - - -void LLViewerObject::sendTEUpdate() const -{ - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_ObjectImage); - - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - - msg->nextBlockFast(_PREHASH_ObjectData); - msg->addU32Fast(_PREHASH_ObjectLocalID, mLocalID ); - if (mMedia) - { - msg->addString("MediaURL", mMedia->mMediaURL); - } - else - { - msg->addString("MediaURL", NULL); - } - - // TODO send media type - - packTEMessage(msg); - - LLViewerRegion *regionp = getRegion(); - msg->sendReliable( regionp->getHost() ); -} - -void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry) -{ - LLPrimitive::setTE(te, texture_entry); -// This doesn't work, don't get any textures. -// if (mDrawable.notNull() && mDrawable->isVisible()) -// { - const LLUUID& image_id = getTE(te)->getID(); - mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); -// } -} - -void LLViewerObject::setTEImage(const U8 te, LLViewerTexture *imagep) -{ - if (mTEImages[te] != imagep) - { - mTEImages[te] = imagep; - LLPrimitive::setTETexture(te, imagep->getID()); - setChanged(TEXTURE); - if (mDrawable.notNull()) - { - gPipeline.markTextured(mDrawable); - } - } -} - - -S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, LLHost host) -{ - S32 retval = 0; - if (uuid != getTE(te)->getID() || - uuid == LLUUID::null) - { - retval = LLPrimitive::setTETexture(te, uuid); - mTEImages[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); - setChanged(TEXTURE); - if (mDrawable.notNull()) - { - gPipeline.markTextured(mDrawable); - } - } - return retval; -} - - -void LLViewerObject::changeTEImage(S32 index, LLViewerTexture* new_image) -{ - if(index < 0 || index >= getNumTEs()) - { - return ; - } - mTEImages[index] = new_image ; -} - -S32 LLViewerObject::setTETexture(const U8 te, const LLUUID& uuid) -{ - // Invalid host == get from the agent's sim - return setTETextureCore(te, uuid, LLHost::invalid); -} - - -S32 LLViewerObject::setTEColor(const U8 te, const LLColor3& color) -{ - return setTEColor(te, LLColor4(color)); -} - -S32 LLViewerObject::setTEColor(const U8 te, const LLColor4& color) -{ - S32 retval = 0; - const LLTextureEntry *tep = getTE(te); - if (!tep) - { - llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl; - } - else if (color != tep->getColor()) - { - retval = LLPrimitive::setTEColor(te, color); - if (mDrawable.notNull() && retval) - { - // These should only happen on updates which are not the initial update. - dirtyMesh(); - } - } - return retval; -} - -S32 LLViewerObject::setTEBumpmap(const U8 te, const U8 bump) -{ - S32 retval = 0; - const LLTextureEntry *tep = getTE(te); - if (!tep) - { - llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl; - } - else if (bump != tep->getBumpmap()) - { - retval = LLPrimitive::setTEBumpmap(te, bump); - setChanged(TEXTURE); - if (mDrawable.notNull() && retval) - { - gPipeline.markTextured(mDrawable); - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, TRUE); - } - } - return retval; -} - -S32 LLViewerObject::setTETexGen(const U8 te, const U8 texgen) -{ - S32 retval = 0; - const LLTextureEntry *tep = getTE(te); - if (!tep) - { - llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl; - } - else if (texgen != tep->getTexGen()) - { - retval = LLPrimitive::setTETexGen(te, texgen); - setChanged(TEXTURE); - } - return retval; -} - -S32 LLViewerObject::setTEMediaTexGen(const U8 te, const U8 media) -{ - S32 retval = 0; - const LLTextureEntry *tep = getTE(te); - if (!tep) - { - llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl; - } - else if (media != tep->getMediaTexGen()) - { - retval = LLPrimitive::setTEMediaTexGen(te, media); - setChanged(TEXTURE); - } - return retval; -} - -S32 LLViewerObject::setTEShiny(const U8 te, const U8 shiny) -{ - S32 retval = 0; - const LLTextureEntry *tep = getTE(te); - if (!tep) - { - llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl; - } - else if (shiny != tep->getShiny()) - { - retval = LLPrimitive::setTEShiny(te, shiny); - setChanged(TEXTURE); - } - return retval; -} - -S32 LLViewerObject::setTEFullbright(const U8 te, const U8 fullbright) -{ - S32 retval = 0; - const LLTextureEntry *tep = getTE(te); - if (!tep) - { - llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl; - } - else if (fullbright != tep->getFullbright()) - { - retval = LLPrimitive::setTEFullbright(te, fullbright); - setChanged(TEXTURE); - if (mDrawable.notNull() && retval) - { - gPipeline.markTextured(mDrawable); - } - } - return retval; -} - - -S32 LLViewerObject::setTEMediaFlags(const U8 te, const U8 media_flags) -{ - // this might need work for media type - S32 retval = 0; - const LLTextureEntry *tep = getTE(te); - if (!tep) - { - llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl; - } - else if (media_flags != tep->getMediaFlags()) - { - retval = LLPrimitive::setTEMediaFlags(te, media_flags); - setChanged(TEXTURE); - if (mDrawable.notNull() && retval) - { - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD, TRUE); - gPipeline.markTextured(mDrawable); - // JC - probably only need this if changes texture coords - //gPipeline.markRebuild(mDrawable); - } - } - return retval; -} - -S32 LLViewerObject::setTEGlow(const U8 te, const F32 glow) -{ - S32 retval = 0; - const LLTextureEntry *tep = getTE(te); - if (!tep) - { - llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl; - } - else if (glow != tep->getGlow()) - { - retval = LLPrimitive::setTEGlow(te, glow); - setChanged(TEXTURE); - if (mDrawable.notNull() && retval) - { - gPipeline.markTextured(mDrawable); - } - } - return retval; -} - - -S32 LLViewerObject::setTEScale(const U8 te, const F32 s, const F32 t) -{ - S32 retval = 0; - retval = LLPrimitive::setTEScale(te, s, t); - setChanged(TEXTURE); - if (mDrawable.notNull() && retval) - { - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD); - } - return retval; -} - -S32 LLViewerObject::setTEScaleS(const U8 te, const F32 s) -{ - S32 retval = LLPrimitive::setTEScaleS(te, s); - if (mDrawable.notNull() && retval) - { - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD); - } - - return retval; -} - -S32 LLViewerObject::setTEScaleT(const U8 te, const F32 t) -{ - S32 retval = LLPrimitive::setTEScaleT(te, t); - if (mDrawable.notNull() && retval) - { - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD); - } - - return retval; -} - -S32 LLViewerObject::setTEOffset(const U8 te, const F32 s, const F32 t) -{ - S32 retval = LLPrimitive::setTEOffset(te, s, t); - if (mDrawable.notNull() && retval) - { - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD); - } - return retval; -} - -S32 LLViewerObject::setTEOffsetS(const U8 te, const F32 s) -{ - S32 retval = LLPrimitive::setTEOffsetS(te, s); - if (mDrawable.notNull() && retval) - { - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD); - } - - return retval; -} - -S32 LLViewerObject::setTEOffsetT(const U8 te, const F32 t) -{ - S32 retval = LLPrimitive::setTEOffsetT(te, t); - if (mDrawable.notNull() && retval) - { - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD); - } - - return retval; -} - -S32 LLViewerObject::setTERotation(const U8 te, const F32 r) -{ - S32 retval = LLPrimitive::setTERotation(te, r); - if (mDrawable.notNull() && retval) - { - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD); - } - return retval; -} - - -LLViewerTexture *LLViewerObject::getTEImage(const U8 face) const -{ -// llassert(mTEImages); - - if (face < getNumTEs()) - { - LLViewerTexture* image = mTEImages[face]; - if (image) - { - return image; - } - else - { - return (LLViewerTexture*)(LLViewerFetchedTexture::sDefaultImagep); - } - } - - llerrs << llformat("Requested Image from invalid face: %d/%d",face,getNumTEs()) << llendl; - - return NULL; -} - - -void LLViewerObject::fitFaceTexture(const U8 face) -{ - llinfos << "fitFaceTexture not implemented" << llendl; -} - - -LLBBox LLViewerObject::getBoundingBoxAgent() const -{ - LLVector3 position_agent; - LLQuaternion rot; - LLViewerObject* avatar_parent = NULL; - LLViewerObject* root_edit = (LLViewerObject*)getRootEdit(); - if (root_edit) - { - avatar_parent = (LLViewerObject*)root_edit->getParent(); - } - - if (avatar_parent && avatar_parent->isAvatar() && - root_edit && root_edit->mDrawable.notNull() && root_edit->mDrawable->getXform()->getParent()) - { - LLXform* parent_xform = root_edit->mDrawable->getXform()->getParent(); - position_agent = (getPositionEdit() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition(); - rot = getRotationEdit() * parent_xform->getWorldRotation(); - } - else - { - position_agent = getPositionAgent(); - rot = getRotationRegion(); - } - - return LLBBox( position_agent, rot, getScale() * -0.5f, getScale() * 0.5f ); -} - -U32 LLViewerObject::getNumVertices() const -{ - U32 num_vertices = 0; - if (mDrawable.notNull()) - { - S32 i, num_faces; - num_faces = mDrawable->getNumFaces(); - for (i = 0; i < num_faces; i++) - { - num_vertices += mDrawable->getFace(i)->getGeomCount(); - } - } - return num_vertices; -} - -U32 LLViewerObject::getNumIndices() const -{ - U32 num_indices = 0; - if (mDrawable.notNull()) - { - S32 i, num_faces; - num_faces = mDrawable->getNumFaces(); - for (i = 0; i < num_faces; i++) - { - num_indices += mDrawable->getFace(i)->getIndicesCount(); - } - } - return num_indices; -} - -// Find the number of instances of this object's inventory that are of the given type -S32 LLViewerObject::countInventoryContents(LLAssetType::EType type) -{ - S32 count = 0; - if( mInventory ) - { - LLInventoryObject::object_list_t::const_iterator it = mInventory->begin(); - LLInventoryObject::object_list_t::const_iterator end = mInventory->end(); - for( ; it != end ; ++it ) - { - if( (*it)->getType() == type ) - { - ++count; - } - } - } - return count; -} - - -void LLViewerObject::setCanSelect(BOOL canSelect) -{ - mbCanSelect = canSelect; - for (child_list_t::iterator iter = mChildList.begin(); - iter != mChildList.end(); iter++) - { - LLViewerObject* child = *iter; - child->mbCanSelect = canSelect; - } -} - -void LLViewerObject::setDebugText(const std::string &utf8text) -{ - if (utf8text.empty() && !mText) - { - return; - } - - if (!mText) - { - mText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT); - mText->setFont(LLFontGL::getFontSansSerif()); - mText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP); - mText->setMaxLines(-1); - mText->setSourceObject(this); - mText->setOnHUDAttachment(isHUDAttachment()); - } - mText->setColor(LLColor4::white); - mText->setString(utf8text); - mText->setZCompare(FALSE); - mText->setDoFade(FALSE); - updateText(); -} - -void LLViewerObject::setIcon(LLViewerTexture* icon_image) -{ - if (!mIcon) - { - mIcon = (LLHUDIcon *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_ICON); - mIcon->setSourceObject(this); - mIcon->setImage(icon_image); - // *TODO: make this user configurable - mIcon->setScale(0.03f); - } - else - { - mIcon->restartLifeTimer(); - } -} - -void LLViewerObject::clearIcon() -{ - if (mIcon) - { - mIcon = NULL; - } -} - -LLViewerObject* LLViewerObject::getSubParent() -{ - if (isJointChild()) - { - return this; - } - return (LLViewerObject*) getParent(); -} - -const LLViewerObject* LLViewerObject::getSubParent() const -{ - if (isJointChild()) - { - return this; - } - return (const LLViewerObject*) getParent(); -} - -BOOL LLViewerObject::isOnMap() -{ - return mOnMap; -} - - -void LLViewerObject::updateText() -{ - if (!isDead()) - { - if (mText.notNull()) - { - LLVector3 up_offset(0,0,0); - up_offset.mV[2] = getScale().mV[VZ]*0.6f; - - if (mDrawable.notNull()) - { - mText->setPositionAgent(getRenderPosition() + up_offset); - } - else - { - mText->setPositionAgent(getPositionAgent() + up_offset); - } - } - } -} - -LLVOAvatar* LLViewerObject::asAvatar() -{ - return NULL; -} - -BOOL LLViewerObject::isParticleSource() const -{ - return !mPartSourcep.isNull() && !mPartSourcep->isDead(); -} - -void LLViewerObject::setParticleSource(const LLPartSysData& particle_parameters, const LLUUID& owner_id) -{ - if (mPartSourcep) - { - deleteParticleSource(); - } - - LLPointer<LLViewerPartSourceScript> pss = LLViewerPartSourceScript::createPSS(this, particle_parameters); - mPartSourcep = pss; - - if (mPartSourcep) - { - mPartSourcep->setOwnerUUID(owner_id); - - if (mPartSourcep->getImage()->getID() != mPartSourcep->mPartSysData.mPartImageID) - { - LLViewerTexture* image; - if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null) - { - image = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.tga"); - } - else - { - image = LLViewerTextureManager::getFetchedTexture(mPartSourcep->mPartSysData.mPartImageID); - } - mPartSourcep->setImage(image); - } - } - LLViewerPartSim::getInstance()->addPartSource(pss); -} - -void LLViewerObject::unpackParticleSource(const S32 block_num, const LLUUID& owner_id) -{ - if (!mPartSourcep.isNull() && mPartSourcep->isDead()) - { - mPartSourcep = NULL; - } - if (mPartSourcep) - { - // If we've got one already, just update the existing source (or remove it) - if (!LLViewerPartSourceScript::unpackPSS(this, mPartSourcep, block_num)) - { - mPartSourcep->setDead(); - mPartSourcep = NULL; - } - } - else - { - LLPointer<LLViewerPartSourceScript> pss = LLViewerPartSourceScript::unpackPSS(this, NULL, block_num); - //If the owner is muted, don't create the system - if(LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagParticles)) return; - - // We need to be able to deal with a particle source that hasn't changed, but still got an update! - if (pss) - { -// llinfos << "Making particle system with owner " << owner_id << llendl; - pss->setOwnerUUID(owner_id); - mPartSourcep = pss; - LLViewerPartSim::getInstance()->addPartSource(pss); - } - } - if (mPartSourcep) - { - if (mPartSourcep->getImage()->getID() != mPartSourcep->mPartSysData.mPartImageID) - { - LLViewerTexture* image; - if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null) - { - image = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.j2c"); - } - else - { - image = LLViewerTextureManager::getFetchedTexture(mPartSourcep->mPartSysData.mPartImageID); - } - mPartSourcep->setImage(image); - } - } -} - -void LLViewerObject::unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_id) -{ - if (!mPartSourcep.isNull() && mPartSourcep->isDead()) - { - mPartSourcep = NULL; - } - if (mPartSourcep) - { - // If we've got one already, just update the existing source (or remove it) - if (!LLViewerPartSourceScript::unpackPSS(this, mPartSourcep, dp)) - { - mPartSourcep->setDead(); - mPartSourcep = NULL; - } - } - else - { - LLPointer<LLViewerPartSourceScript> pss = LLViewerPartSourceScript::unpackPSS(this, NULL, dp); - //If the owner is muted, don't create the system - if(LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagParticles)) return; - // We need to be able to deal with a particle source that hasn't changed, but still got an update! - if (pss) - { -// llinfos << "Making particle system with owner " << owner_id << llendl; - pss->setOwnerUUID(owner_id); - mPartSourcep = pss; - LLViewerPartSim::getInstance()->addPartSource(pss); - } - } - if (mPartSourcep) - { - if (mPartSourcep->getImage()->getID() != mPartSourcep->mPartSysData.mPartImageID) - { - LLViewerTexture* image; - if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null) - { - image = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.j2c"); - } - else - { - image = LLViewerTextureManager::getFetchedTexture(mPartSourcep->mPartSysData.mPartImageID); - } - mPartSourcep->setImage(image); - } - } -} - -void LLViewerObject::deleteParticleSource() -{ - if (mPartSourcep.notNull()) - { - mPartSourcep->setDead(); - mPartSourcep = NULL; - } -} - -// virtual -void LLViewerObject::updateDrawable(BOOL force_damped) -{ - if (mDrawable.notNull() && - !mDrawable->isState(LLDrawable::ON_MOVE_LIST) && - isChanged(MOVED)) - { - BOOL damped_motion = - !isChanged(SHIFTED) && // not shifted between regions this frame and... - ( force_damped || // ...forced into damped motion by application logic or... - ( !isSelected() && // ...not selected and... - ( mDrawable->isRoot() || // ... is root or ... - (getParent() && !((LLViewerObject*)getParent())->isSelected())// ... parent is not selected and ... - ) && - getPCode() == LL_PCODE_VOLUME && // ...is a volume object and... - getVelocity().isExactlyZero() && // ...is not moving physically and... - mDrawable->getGeneration() != -1 // ...was not created this frame. - ) - ); - gPipeline.markMoved(mDrawable, damped_motion); - } - clearChanged(SHIFTED); -} - -// virtual, overridden by LLVOVolume -F32 LLViewerObject::getVObjRadius() const -{ - return mDrawable.notNull() ? mDrawable->getRadius() : 0.f; -} - -void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& owner_id, const F32 gain, const U8 flags) -{ - if (!gAudiop) - { - return; - } - - if (audio_uuid.isNull()) - { - if (!mAudioSourcep) - { - return; - } - if (mAudioSourcep->isLoop() && !mAudioSourcep->hasPendingPreloads()) - { - // We don't clear the sound if it's a loop, it'll go away on its own. - // At least, this appears to be how the scripts work. - // The attached sound ID is set to NULL to avoid it playing back when the - // object rezzes in on non-looping sounds. - //llinfos << "Clearing attached sound " << mAudioSourcep->getCurrentData()->getID() << llendl; - gAudiop->cleanupAudioSource(mAudioSourcep); - mAudioSourcep = NULL; - } - else if (flags & LL_SOUND_FLAG_STOP) - { - // Just shut off the sound - mAudioSourcep->play(LLUUID::null); - } - return; - } - if (flags & LL_SOUND_FLAG_LOOP - && mAudioSourcep && mAudioSourcep->isLoop() && mAudioSourcep->getCurrentData() - && mAudioSourcep->getCurrentData()->getID() == audio_uuid) - { - //llinfos << "Already playing this sound on a loop, ignoring" << llendl; - return; - } - - // don't clean up before previous sound is done. Solves: SL-33486 - if ( mAudioSourcep && mAudioSourcep->isDone() ) - { - gAudiop->cleanupAudioSource(mAudioSourcep); - mAudioSourcep = NULL; - } - - if (mAudioSourcep && mAudioSourcep->isMuted() && - mAudioSourcep->getCurrentData() && mAudioSourcep->getCurrentData()->getID() == audio_uuid) - { - //llinfos << "Already having this sound as muted sound, ignoring" << llendl; - return; - } - - getAudioSource(owner_id); - - if (mAudioSourcep) - { - BOOL queue = flags & LL_SOUND_FLAG_QUEUE; - mAudioGain = gain; - mAudioSourcep->setGain(gain); - mAudioSourcep->setLoop(flags & LL_SOUND_FLAG_LOOP); - mAudioSourcep->setSyncMaster(flags & LL_SOUND_FLAG_SYNC_MASTER); - mAudioSourcep->setSyncSlave(flags & LL_SOUND_FLAG_SYNC_SLAVE); - mAudioSourcep->setQueueSounds(queue); - if(!queue) // stop any current sound first to avoid "farts of doom" (SL-1541) -MG - { - mAudioSourcep->play(LLUUID::null); - } - - // Play this sound if region maturity permits - if( gAgent.canAccessMaturityAtGlobal(this->getPositionGlobal()) ) - { - //llinfos << "Playing attached sound " << audio_uuid << llendl; - mAudioSourcep->play(audio_uuid); - } - } -} - -LLAudioSource *LLViewerObject::getAudioSource(const LLUUID& owner_id) -{ - if (!mAudioSourcep) - { - // Arbitrary low gain for a sound that's not playing. - // This is used for sound preloads, for example. - LLAudioSourceVO *asvop = new LLAudioSourceVO(mID, owner_id, 0.01f, this); - - mAudioSourcep = asvop; - if(gAudiop) gAudiop->addAudioSource(asvop); - } - - return mAudioSourcep; -} - -void LLViewerObject::adjustAudioGain(const F32 gain) -{ - if (!gAudiop) - { - return; - } - if (mAudioSourcep) - { - mAudioGain = gain; - mAudioSourcep->setGain(mAudioGain); - } -} - -//---------------------------------------------------------------------------- - -bool LLViewerObject::unpackParameterEntry(U16 param_type, LLDataPacker *dp) -{ - ExtraParameter* param = getExtraParameterEntryCreate(param_type); - if (param) - { - param->data->unpack(*dp); - param->in_use = TRUE; - parameterChanged(param_type, param->data, TRUE, false); - return true; - } - else - { - return false; - } -} - -LLViewerObject::ExtraParameter* LLViewerObject::createNewParameterEntry(U16 param_type) -{ - LLNetworkData* new_block = NULL; - switch (param_type) - { - case LLNetworkData::PARAMS_FLEXIBLE: - { - new_block = new LLFlexibleObjectData(); - break; - } - case LLNetworkData::PARAMS_LIGHT: - { - new_block = new LLLightParams(); - break; - } - case LLNetworkData::PARAMS_SCULPT: - { - new_block = new LLSculptParams(); - break; - } - case LLNetworkData::PARAMS_LIGHT_IMAGE: - { - new_block = new LLLightImageParams(); - break; - } - default: - { - llinfos << "Unknown param type." << llendl; - break; - } - }; - - if (new_block) - { - ExtraParameter* new_entry = new ExtraParameter; - new_entry->data = new_block; - new_entry->in_use = false; // not in use yet - mExtraParameterList[param_type] = new_entry; - return new_entry; - } - return NULL; -} - -LLViewerObject::ExtraParameter* LLViewerObject::getExtraParameterEntry(U16 param_type) const -{ - std::map<U16, ExtraParameter*>::const_iterator itor = mExtraParameterList.find(param_type); - if (itor != mExtraParameterList.end()) - { - return itor->second; - } - return NULL; -} - -LLViewerObject::ExtraParameter* LLViewerObject::getExtraParameterEntryCreate(U16 param_type) -{ - ExtraParameter* param = getExtraParameterEntry(param_type); - if (!param) - { - param = createNewParameterEntry(param_type); - } - return param; -} - -LLNetworkData* LLViewerObject::getParameterEntry(U16 param_type) const -{ - ExtraParameter* param = getExtraParameterEntry(param_type); - if (param) - { - return param->data; - } - else - { - return NULL; - } -} - -BOOL LLViewerObject::getParameterEntryInUse(U16 param_type) const -{ - ExtraParameter* param = getExtraParameterEntry(param_type); - if (param) - { - return param->in_use; - } - else - { - return FALSE; - } -} - -bool LLViewerObject::setParameterEntry(U16 param_type, const LLNetworkData& new_value, bool local_origin) -{ - ExtraParameter* param = getExtraParameterEntryCreate(param_type); - if (param) - { - if (param->in_use && new_value == *(param->data)) - { - return false; - } - param->in_use = true; - param->data->copy(new_value); - parameterChanged(param_type, param->data, TRUE, local_origin); - return true; - } - else - { - return false; - } -} - -// Assumed to be called locally -// If in_use is TRUE, will crate a new extra parameter if none exists. -// Should always return true. -bool LLViewerObject::setParameterEntryInUse(U16 param_type, BOOL in_use, bool local_origin) -{ - ExtraParameter* param = getExtraParameterEntryCreate(param_type); - if (param && param->in_use != in_use) - { - param->in_use = in_use; - parameterChanged(param_type, param->data, in_use, local_origin); - return true; - } - return false; -} - -void LLViewerObject::parameterChanged(U16 param_type, bool local_origin) -{ - ExtraParameter* param = getExtraParameterEntry(param_type); - if (param) - { - parameterChanged(param_type, param->data, param->in_use, local_origin); - } -} - -void LLViewerObject::parameterChanged(U16 param_type, LLNetworkData* data, BOOL in_use, bool local_origin) -{ - if (local_origin) - { - LLViewerRegion* regionp = getRegion(); - if(!regionp) return; - - // Change happened on the viewer. Send the change up - U8 tmp[MAX_OBJECT_PARAMS_SIZE]; - LLDataPackerBinaryBuffer dpb(tmp, MAX_OBJECT_PARAMS_SIZE); - if (data->pack(dpb)) - { - U32 datasize = (U32)dpb.getCurrentSize(); - - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_ObjectExtraParams); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_ObjectData); - msg->addU32Fast(_PREHASH_ObjectLocalID, mLocalID ); - - msg->addU16Fast(_PREHASH_ParamType, param_type); - msg->addBOOLFast(_PREHASH_ParamInUse, in_use); - - msg->addU32Fast(_PREHASH_ParamSize, datasize); - msg->addBinaryDataFast(_PREHASH_ParamData, tmp, datasize); - - msg->sendReliable( regionp->getHost() ); - } - else - { - llwarns << "Failed to send object extra parameters: " << param_type << llendl; - } - } -} - -void LLViewerObject::setDrawableState(U32 state, BOOL recursive) -{ - if (mDrawable) - { - mDrawable->setState(state); - } - if (recursive) - { - for (child_list_t::iterator iter = mChildList.begin(); - iter != mChildList.end(); iter++) - { - LLViewerObject* child = *iter; - child->setDrawableState(state, recursive); - } - } -} - -void LLViewerObject::clearDrawableState(U32 state, BOOL recursive) -{ - if (mDrawable) - { - mDrawable->clearState(state); - } - if (recursive) - { - for (child_list_t::iterator iter = mChildList.begin(); - iter != mChildList.end(); iter++) - { - LLViewerObject* child = *iter; - child->clearDrawableState(state, recursive); - } - } -} - -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -// RN: these functions assume a 2-level hierarchy -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -// Owned by anyone? -BOOL LLViewerObject::permAnyOwner() const -{ - if (isRootEdit()) - { - return ((mFlags & FLAGS_OBJECT_ANY_OWNER) != 0); - } - else - { - return ((LLViewerObject*)getParent())->permAnyOwner(); - } -} -// Owned by this viewer? -BOOL LLViewerObject::permYouOwner() const -{ - if (isRootEdit()) - { -#ifdef HACKED_GODLIKE_VIEWER - return TRUE; -#else -# ifdef TOGGLE_HACKED_GODLIKE_VIEWER - if (!LLGridManager::getInstance()->isInProductionGrid() - && (gAgent.getGodLevel() >= GOD_MAINTENANCE)) - { - return TRUE; - } -# endif - return ((mFlags & FLAGS_OBJECT_YOU_OWNER) != 0); -#endif - } - else - { - return ((LLViewerObject*)getParent())->permYouOwner(); - } -} - -// Owned by a group? -BOOL LLViewerObject::permGroupOwner() const -{ - if (isRootEdit()) - { - return ((mFlags & FLAGS_OBJECT_GROUP_OWNED) != 0); - } - else - { - return ((LLViewerObject*)getParent())->permGroupOwner(); - } -} - -// Can the owner edit -BOOL LLViewerObject::permOwnerModify() const -{ - if (isRootEdit()) - { -#ifdef HACKED_GODLIKE_VIEWER - return TRUE; -#else -# ifdef TOGGLE_HACKED_GODLIKE_VIEWER - if (!LLGridManager::getInstance()->isInProductionGrid() - && (gAgent.getGodLevel() >= GOD_MAINTENANCE)) - { - return TRUE; - } -# endif - return ((mFlags & FLAGS_OBJECT_OWNER_MODIFY) != 0); -#endif - } - else - { - return ((LLViewerObject*)getParent())->permOwnerModify(); - } -} - -// Can edit -BOOL LLViewerObject::permModify() const -{ - if (isRootEdit()) - { -#ifdef HACKED_GODLIKE_VIEWER - return TRUE; -#else -# ifdef TOGGLE_HACKED_GODLIKE_VIEWER - if (!LLGridManager::getInstance()->isInProductionGrid() - && (gAgent.getGodLevel() >= GOD_MAINTENANCE)) - { - return TRUE; - } -# endif - return ((mFlags & FLAGS_OBJECT_MODIFY) != 0); -#endif - } - else - { - return ((LLViewerObject*)getParent())->permModify(); - } -} - -// Can copy -BOOL LLViewerObject::permCopy() const -{ - if (isRootEdit()) - { -#ifdef HACKED_GODLIKE_VIEWER - return TRUE; -#else -# ifdef TOGGLE_HACKED_GODLIKE_VIEWER - if (!LLGridManager::getInstance()->isInProductionGrid() - && (gAgent.getGodLevel() >= GOD_MAINTENANCE)) - { - return TRUE; - } -# endif - return ((mFlags & FLAGS_OBJECT_COPY) != 0); -#endif - } - else - { - return ((LLViewerObject*)getParent())->permCopy(); - } -} - -// Can move -BOOL LLViewerObject::permMove() const -{ - if (isRootEdit()) - { -#ifdef HACKED_GODLIKE_VIEWER - return TRUE; -#else -# ifdef TOGGLE_HACKED_GODLIKE_VIEWER - if (!LLGridManager::getInstance()->isInProductionGrid() - && (gAgent.getGodLevel() >= GOD_MAINTENANCE)) - { - return TRUE; - } -# endif - return ((mFlags & FLAGS_OBJECT_MOVE) != 0); -#endif - } - else - { - return ((LLViewerObject*)getParent())->permMove(); - } -} - -// Can be transferred -BOOL LLViewerObject::permTransfer() const -{ - if (isRootEdit()) - { -#ifdef HACKED_GODLIKE_VIEWER - return TRUE; -#else -# ifdef TOGGLE_HACKED_GODLIKE_VIEWER - if (!LLGridManager::getInstance()->isInProductionGrid() - && (gAgent.getGodLevel() >= GOD_MAINTENANCE)) - { - return TRUE; - } -# endif - return ((mFlags & FLAGS_OBJECT_TRANSFER) != 0); -#endif - } - else - { - return ((LLViewerObject*)getParent())->permTransfer(); - } -} - -// Can only open objects that you own, or that someone has -// given you modify rights to. JC -BOOL LLViewerObject::allowOpen() const -{ - return !flagInventoryEmpty() && (permYouOwner() || permModify()); -} - -LLViewerObject::LLInventoryCallbackInfo::~LLInventoryCallbackInfo() -{ - if (mListener) - { - mListener->clearVOInventoryListener(); - } -} - -void LLViewerObject::updateVolume(const LLVolumeParams& volume_params) -{ - if (setVolume(volume_params, 1)) // *FIX: magic number, ack! - { - // Transmit the update to the simulator - sendShapeUpdate(); - markForUpdate(TRUE); - } -} - -void LLViewerObject::markForUpdate(BOOL priority) -{ - if (mDrawable.notNull()) - { - gPipeline.markTextured(mDrawable); - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, priority); - } -} - -bool LLViewerObject::getIncludeInSearch() const -{ - return ((mFlags & FLAGS_INCLUDE_IN_SEARCH) != 0); -} - -void LLViewerObject::setIncludeInSearch(bool include_in_search) -{ - if (include_in_search) - { - mFlags |= FLAGS_INCLUDE_IN_SEARCH; - } - else - { - mFlags &= ~FLAGS_INCLUDE_IN_SEARCH; - } -} - -void LLViewerObject::setRegion(LLViewerRegion *regionp) -{ - if (!regionp) - { - llwarns << "viewer object set region to NULL" << llendl; - } - - mLatestRecvPacketID = 0; - mRegionp = regionp; - - for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i) - { - LLViewerObject* child = *i; - child->setRegion(regionp); - } - - setChanged(MOVED | SILHOUETTE); - updateDrawable(FALSE); -} - -// virtual -void LLViewerObject::updateRegion(LLViewerRegion *regionp) -{ -// if (regionp) -// { -// F64 now = LLFrameTimer::getElapsedSeconds(); -// llinfos << "Updating to region " << regionp->getName() -// << ", ms since last update message: " << (F32)((now - mLastMessageUpdateSecs) * 1000.0) -// << ", ms since last interpolation: " << (F32)((now - mLastInterpUpdateSecs) * 1000.0) -// << llendl; -// } -} - - -bool LLViewerObject::specialHoverCursor() const -{ - return (mFlags & FLAGS_USE_PHYSICS) - || (mFlags & FLAGS_HANDLE_TOUCH) - || (mClickAction != 0); -} - -void LLViewerObject::updateFlags(BOOL physics_changed) -{ - LLViewerRegion* regionp = getRegion(); - if(!regionp) return; - gMessageSystem->newMessage("ObjectFlagUpdate"); - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, getLocalID() ); - gMessageSystem->addBOOLFast(_PREHASH_UsePhysics, usePhysics() ); - gMessageSystem->addBOOL("IsTemporary", flagTemporaryOnRez() ); - gMessageSystem->addBOOL("IsPhantom", flagPhantom() ); - gMessageSystem->addBOOL("CastsShadows", flagCastShadows() ); - if (physics_changed) - { - gMessageSystem->nextBlock("ExtraPhysics"); - gMessageSystem->addU8("PhysicsShapeType", getPhysicsShapeType() ); - gMessageSystem->addF32("Density", getPhysicsDensity() ); - gMessageSystem->addF32("Friction", getPhysicsFriction() ); - gMessageSystem->addF32("Restitution", getPhysicsRestitution() ); - gMessageSystem->addF32("GravityMultiplier", getPhysicsGravity() ); - } - gMessageSystem->sendReliable( regionp->getHost() ); -} - -BOOL LLViewerObject::setFlags(U32 flags, BOOL state) -{ - BOOL setit = FALSE; - if (state) - { - if ((mFlags & flags) != flags) - { - mFlags |= flags; - setit = TRUE; - } - } - else - { - if ((mFlags & flags) != 0) - { - mFlags &= ~flags; - setit = TRUE; - } - } - - // BUG: Sometimes viewer physics and simulator physics get - // out of sync. To fix this, always send update to simulator. -// if (setit) - { - updateFlags(); - } - return setit; -} - -void LLViewerObject::setPhysicsShapeType(U8 type) -{ - mPhysicsShapeUnknown = false; - mPhysicsShapeType = type; - mCostStale = true; -} - -void LLViewerObject::setPhysicsGravity(F32 gravity) -{ - mPhysicsGravity = gravity; -} - -void LLViewerObject::setPhysicsFriction(F32 friction) -{ - mPhysicsFriction = friction; -} - -void LLViewerObject::setPhysicsDensity(F32 density) -{ - mPhysicsDensity = density; -} - -void LLViewerObject::setPhysicsRestitution(F32 restitution) -{ - mPhysicsRestitution = restitution; -} - -U8 LLViewerObject::getPhysicsShapeType() const -{ - if (mPhysicsShapeUnknown) - { - mPhysicsShapeUnknown = false; - gObjectList.updatePhysicsFlags(this); - } - - return mPhysicsShapeType; -} - -void LLViewerObject::applyAngularVelocity(F32 dt) -{ - //do target omega here - mRotTime += dt; - LLVector3 ang_vel = getAngularVelocity(); - F32 omega = ang_vel.magVecSquared(); - F32 angle = 0.0f; - LLQuaternion dQ; - if (omega > 0.00001f) - { - omega = sqrt(omega); - angle = omega * dt; - - ang_vel *= 1.f/omega; - - dQ.setQuat(angle, ang_vel); - - setRotation(getRotation()*dQ); - setChanged(MOVED | SILHOUETTE); - } -} - -void LLViewerObject::resetRot() -{ - mRotTime = 0.0f; -} - -U32 LLViewerObject::getPartitionType() const -{ - return LLViewerRegion::PARTITION_NONE; -} - -void LLViewerObject::dirtySpatialGroup(BOOL priority) const -{ - if (mDrawable) - { - LLSpatialGroup* group = mDrawable->getSpatialGroup(); - if (group) - { - group->dirtyGeom(); - gPipeline.markRebuild(group, priority); - } - } -} - -void LLViewerObject::dirtyMesh() -{ - if (mDrawable) - { - LLSpatialGroup* group = mDrawable->getSpatialGroup(); - if (group) - { - group->dirtyMesh(); - } - } -} - -F32 LLAlphaObject::getPartSize(S32 idx) -{ - return 0.f; -} - -// virtual -void LLStaticViewerObject::updateDrawable(BOOL force_damped) -{ - // Force an immediate rebuild on any update - if (mDrawable.notNull()) - { - mDrawable->updateXform(TRUE); - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE); - } - clearChanged(SHIFTED); -} - -void LLViewerObject::saveUnselectedChildrenPosition(std::vector<LLVector3>& positions) -{ - if(mChildList.empty() || !positions.empty()) - { - return ; - } - - for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin(); - iter != mChildList.end(); iter++) - { - LLViewerObject* childp = *iter; - if (!childp->isSelected() && childp->mDrawable.notNull()) - { - positions.push_back(childp->getPositionEdit()); - } - } - - return ; -} - -void LLViewerObject::saveUnselectedChildrenRotation(std::vector<LLQuaternion>& rotations) -{ - if(mChildList.empty()) - { - return ; - } - - for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin(); - iter != mChildList.end(); iter++) - { - LLViewerObject* childp = *iter; - if (!childp->isSelected() && childp->mDrawable.notNull()) - { - rotations.push_back(childp->getRotationEdit()); - } - } - - return ; -} - -//counter-rotation -void LLViewerObject::resetChildrenRotationAndPosition(const std::vector<LLQuaternion>& rotations, - const std::vector<LLVector3>& positions) -{ - if(mChildList.empty()) - { - return ; - } - - S32 index = 0 ; - LLQuaternion inv_rotation = ~getRotationEdit() ; - LLVector3 offset = getPositionEdit() ; - for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin(); - iter != mChildList.end(); iter++) - { - LLViewerObject* childp = *iter; - if (!childp->isSelected() && childp->mDrawable.notNull()) - { - if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR) - { - childp->setRotation(rotations[index] * inv_rotation); - childp->setPosition((positions[index] - offset) * inv_rotation); - LLManip::rebuild(childp); - } - else //avatar - { - LLVector3 reset_pos = (positions[index] - offset) * inv_rotation ; - LLQuaternion reset_rot = rotations[index] * inv_rotation ; - - ((LLVOAvatar*)childp)->mDrawable->mXform.setPosition(reset_pos); - ((LLVOAvatar*)childp)->mDrawable->mXform.setRotation(reset_rot) ; - - ((LLVOAvatar*)childp)->mDrawable->getVObj()->setPosition(reset_pos, TRUE); - ((LLVOAvatar*)childp)->mDrawable->getVObj()->setRotation(reset_rot, TRUE) ; - - LLManip::rebuild(childp); - } - index++; - } - } - - return ; -} - -//counter-translation -void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplified) -{ - if(mChildList.empty()) - { - return ; - } - - LLVector3 child_offset; - if(simplified) //translation only, rotation matrix does not change - { - child_offset = offset * ~getRotation(); - } - else //rotation matrix might change too. - { - if (isAttachment() && mDrawable.notNull()) - { - LLXform* attachment_point_xform = mDrawable->getXform()->getParent(); - LLQuaternion parent_rotation = getRotation() * attachment_point_xform->getWorldRotation(); - child_offset = offset * ~parent_rotation; - } - else - { - child_offset = offset * ~getRenderRotation(); - } - } - - for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin(); - iter != mChildList.end(); iter++) - { - LLViewerObject* childp = *iter; - if (!childp->isSelected() && childp->mDrawable.notNull()) - { - if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR) - { - childp->setPosition(childp->getPosition() + child_offset); - LLManip::rebuild(childp); - } - else //avatar - { - LLVector3 reset_pos = ((LLVOAvatar*)childp)->mDrawable->mXform.getPosition() + child_offset ; - - ((LLVOAvatar*)childp)->mDrawable->mXform.setPosition(reset_pos); - ((LLVOAvatar*)childp)->mDrawable->getVObj()->setPosition(reset_pos); - - LLManip::rebuild(childp); - } - } - } - - return ; -} - -const LLUUID &LLViewerObject::getAttachmentItemID() const -{ - return mAttachmentItemID; -} - -void LLViewerObject::setAttachmentItemID(const LLUUID &id) -{ - mAttachmentItemID = id; -} - -EObjectUpdateType LLViewerObject::getLastUpdateType() const -{ - return mLastUpdateType; -} - -void LLViewerObject::setLastUpdateType(EObjectUpdateType last_update_type) -{ - mLastUpdateType = last_update_type; -} - -BOOL LLViewerObject::getLastUpdateCached() const -{ - return mLastUpdateCached; -} - -void LLViewerObject::setLastUpdateCached(BOOL last_update_cached) -{ - mLastUpdateCached = last_update_cached; -} - -const LLUUID &LLViewerObject::extractAttachmentItemID() -{ - LLUUID item_id = LLUUID::null; - LLNameValue* item_id_nv = getNVPair("AttachItemID"); - if( item_id_nv ) - { - const char* s = item_id_nv->getString(); - if( s ) - { - item_id.set(s); - } - } - setAttachmentItemID(item_id); - return getAttachmentItemID(); -} - -//virtual -LLVOAvatar* LLViewerObject::getAvatar() const -{ - if (isAttachment()) - { - LLViewerObject* vobj = (LLViewerObject*) getParent(); - - while (vobj && !vobj->asAvatar()) - { - vobj = (LLViewerObject*) vobj->getParent(); - } - - return (LLVOAvatar*) vobj; - } - - return NULL; -} - - -class ObjectPhysicsProperties : public LLHTTPNode -{ -public: - virtual void post( - ResponsePtr responder, - const LLSD& context, - const LLSD& input) const - { - LLSD object_data = input["body"]["ObjectData"]; - S32 num_entries = object_data.size(); - - for ( S32 i = 0; i < num_entries; i++ ) - { - LLSD& curr_object_data = object_data[i]; - U32 local_id = curr_object_data["LocalID"].asInteger(); - - // Iterate through nodes at end, since it can be on both the regular AND hover list - struct f : public LLSelectedNodeFunctor - { - U32 mID; - f(const U32& id) : mID(id) {} - virtual bool apply(LLSelectNode* node) - { - return (node->getObject() && node->getObject()->mLocalID == mID ); - } - } func(local_id); - - LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode(&func); - - if (node) - { - // The LLSD message builder doesn't know how to handle U8, so we need to send as S8 and cast - U8 type = (U8)curr_object_data["PhysicsShapeType"].asInteger(); - F32 density = (F32)curr_object_data["Density"].asReal(); - F32 friction = (F32)curr_object_data["Friction"].asReal(); - F32 restitution = (F32)curr_object_data["Restitution"].asReal(); - F32 gravity = (F32)curr_object_data["GravityMultiplier"].asReal(); - - node->getObject()->setPhysicsShapeType(type); - node->getObject()->setPhysicsGravity(gravity); - node->getObject()->setPhysicsFriction(friction); - node->getObject()->setPhysicsDensity(density); - node->getObject()->setPhysicsRestitution(restitution); - } - } - - dialog_refresh_all(); - }; -}; - -LLHTTPRegistration<ObjectPhysicsProperties> - gHTTPRegistrationObjectPhysicsProperties("/message/ObjectPhysicsProperties"); +/**
+ * @file llviewerobject.cpp
+ * @brief Base class for viewer objects
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, 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$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llviewerobject.h"
+
+#include "llaudioengine.h"
+#include "imageids.h"
+#include "indra_constants.h"
+#include "llmath.h"
+#include "llflexibleobject.h"
+#include "llviewercontrol.h"
+#include "lldatapacker.h"
+#include "llfasttimer.h"
+#include "llfloaterreg.h"
+#include "llfontgl.h"
+#include "llframetimer.h"
+#include "llinventory.h"
+#include "llinventorydefines.h"
+#include "llmaterialtable.h"
+#include "llmutelist.h"
+#include "llnamevalue.h"
+#include "llprimitive.h"
+#include "llquantize.h"
+#include "llregionhandle.h"
+#include "llsdserialize.h"
+#include "lltree_common.h"
+#include "llxfermanager.h"
+#include "message.h"
+#include "object_flags.h"
+#include "timing.h"
+
+#include "llaudiosourcevo.h"
+#include "llagent.h"
+#include "llagentcamera.h"
+#include "llbbox.h"
+#include "llbox.h"
+#include "llcylinder.h"
+#include "lldrawable.h"
+#include "llface.h"
+#include "llfloaterproperties.h"
+#include "llfloatertools.h"
+#include "llfollowcam.h"
+#include "llhudtext.h"
+#include "llselectmgr.h"
+#include "llrendersphere.h"
+#include "lltooldraganddrop.h"
+#include "llviewercamera.h"
+#include "llviewertexturelist.h"
+#include "llviewerinventory.h"
+#include "llviewerobjectlist.h"
+#include "llviewerparceloverlay.h"
+#include "llviewerpartsource.h"
+#include "llviewerregion.h"
+#include "llviewerstats.h"
+#include "llviewertextureanim.h"
+#include "llviewerwindow.h" // For getSpinAxis
+#include "llvoavatar.h"
+#include "llvoavatarself.h"
+#include "llvoclouds.h"
+#include "llvograss.h"
+#include "llvoground.h"
+#include "llvolume.h"
+#include "llvolumemessage.h"
+#include "llvopartgroup.h"
+#include "llvosky.h"
+#include "llvosurfacepatch.h"
+#include "llvotextbubble.h"
+#include "llvotree.h"
+#include "llvovolume.h"
+#include "llvowater.h"
+#include "llworld.h"
+#include "llui.h"
+#include "pipeline.h"
+#include "llviewernetwork.h"
+#include "llvowlsky.h"
+#include "llmanip.h"
+#include "lltrans.h"
+#include "llsdutil.h"
+#include "llmediaentry.h"
+#include "llaccountingquota.h"
+
+//#define DEBUG_UPDATE_TYPE
+
+BOOL LLViewerObject::sVelocityInterpolate = TRUE;
+BOOL LLViewerObject::sPingInterpolate = TRUE;
+
+U32 LLViewerObject::sNumZombieObjects = 0;
+S32 LLViewerObject::sNumObjects = 0;
+BOOL LLViewerObject::sMapDebug = TRUE;
+LLColor4 LLViewerObject::sEditSelectColor( 1.0f, 1.f, 0.f, 0.3f); // Edit OK
+LLColor4 LLViewerObject::sNoEditSelectColor( 1.0f, 0.f, 0.f, 0.3f); // Can't edit
+S32 LLViewerObject::sAxisArrowLength(50);
+BOOL LLViewerObject::sPulseEnabled(FALSE);
+BOOL LLViewerObject::sUseSharedDrawables(FALSE); // TRUE
+
+// sMaxUpdateInterpolationTime must be greater than sPhaseOutUpdateInterpolationTime
+F64 LLViewerObject::sMaxUpdateInterpolationTime = 3.0; // For motion interpolation: after X seconds with no updates, don't predict object motion
+F64 LLViewerObject::sPhaseOutUpdateInterpolationTime = 2.0; // For motion interpolation: after Y seconds with no updates, taper off motion prediction
+
+
+static LLFastTimer::DeclareTimer FTM_CREATE_OBJECT("Create Object");
+
+// static
+LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
+{
+ LLViewerObject *res = NULL;
+ LLFastTimer t1(FTM_CREATE_OBJECT);
+
+ switch (pcode)
+ {
+ case LL_PCODE_VOLUME:
+ res = new LLVOVolume(id, pcode, regionp); break;
+ case LL_PCODE_LEGACY_AVATAR:
+ {
+ if (id == gAgentID)
+ {
+ if (!gAgentAvatarp)
+ {
+ gAgentAvatarp = new LLVOAvatarSelf(id, pcode, regionp);
+ }
+ else
+ {
+ gAgentAvatarp->updateRegion(regionp);
+ }
+ res = gAgentAvatarp;
+ }
+ else
+ {
+ res = new LLVOAvatar(id, pcode, regionp);
+ }
+ static_cast<LLVOAvatar*>(res)->initInstance();
+ break;
+ }
+ case LL_PCODE_LEGACY_GRASS:
+ res = new LLVOGrass(id, pcode, regionp); break;
+ case LL_PCODE_LEGACY_PART_SYS:
+// llwarns << "Creating old part sys!" << llendl;
+// res = new LLVOPart(id, pcode, regionp); break;
+ res = NULL; break;
+ case LL_PCODE_LEGACY_TREE:
+ res = new LLVOTree(id, pcode, regionp); break;
+ case LL_PCODE_TREE_NEW:
+// llwarns << "Creating new tree!" << llendl;
+// res = new LLVOTree(id, pcode, regionp); break;
+ res = NULL; break;
+ case LL_PCODE_LEGACY_TEXT_BUBBLE:
+ res = new LLVOTextBubble(id, pcode, regionp); break;
+ case LL_VO_CLOUDS:
+ res = new LLVOClouds(id, pcode, regionp); break;
+ case LL_VO_SURFACE_PATCH:
+ res = new LLVOSurfacePatch(id, pcode, regionp); break;
+ case LL_VO_SKY:
+ res = new LLVOSky(id, pcode, regionp); break;
+ case LL_VO_VOID_WATER:
+ res = new LLVOVoidWater(id, pcode, regionp); break;
+ case LL_VO_WATER:
+ res = new LLVOWater(id, pcode, regionp); break;
+ case LL_VO_GROUND:
+ res = new LLVOGround(id, pcode, regionp); break;
+ case LL_VO_PART_GROUP:
+ res = new LLVOPartGroup(id, pcode, regionp); break;
+ case LL_VO_HUD_PART_GROUP:
+ res = new LLVOHUDPartGroup(id, pcode, regionp); break;
+ case LL_VO_WL_SKY:
+ res = new LLVOWLSky(id, pcode, regionp); break;
+ default:
+ llwarns << "Unknown object pcode " << (S32)pcode << llendl;
+ res = NULL; break;
+ }
+ return res;
+}
+
+LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp, BOOL is_global)
+: LLPrimitive(),
+ mChildList(),
+ mID(id),
+ mLocalID(0),
+ mTotalCRC(0),
+ mTEImages(NULL),
+ mGLName(0),
+ mbCanSelect(TRUE),
+ mFlags(0),
+ mPhysicsShapeType(0),
+ mPhysicsGravity(0),
+ mPhysicsFriction(0),
+ mPhysicsDensity(0),
+ mPhysicsRestitution(0),
+ mDrawable(),
+ mCreateSelected(FALSE),
+ mRenderMedia(FALSE),
+ mBestUpdatePrecision(0),
+ mText(),
+ mLastInterpUpdateSecs(0.f),
+ mLastMessageUpdateSecs(0.f),
+ mLatestRecvPacketID(0),
+ mData(NULL),
+ mAudioSourcep(NULL),
+ mAudioGain(1.f),
+ mAppAngle(0.f),
+ mPixelArea(1024.f),
+ mInventory(NULL),
+ mInventorySerialNum(0),
+ mRegionp( regionp ),
+ mInventoryPending(FALSE),
+ mInventoryDirty(FALSE),
+ mDead(FALSE),
+ mOrphaned(FALSE),
+ mUserSelected(FALSE),
+ mOnActiveList(FALSE),
+ mOnMap(FALSE),
+ mStatic(FALSE),
+ mNumFaces(0),
+ mTimeDilation(1.f),
+ mRotTime(0.f),
+ mJointInfo(NULL),
+ mState(0),
+ mMedia(NULL),
+ mClickAction(0),
+ mObjectCost(0),
+ mLinksetCost(0),
+ mPhysicsCost(0),
+ mLinksetPhysicsCost(0.f),
+ mCostStale(true),
+ mPhysicsShapeUnknown(true),
+ mAttachmentItemID(LLUUID::null),
+ mLastUpdateType(OUT_UNKNOWN),
+ mLastUpdateCached(FALSE)
+{
+ if (!is_global)
+ {
+ llassert(mRegionp);
+ }
+
+ LLPrimitive::init_primitive(pcode);
+
+ // CP: added 12/2/2005 - this was being initialised to 0, not the current frame time
+ mLastInterpUpdateSecs = LLFrameTimer::getElapsedSeconds();
+
+ mPositionRegion = LLVector3(0.f, 0.f, 0.f);
+
+ if (!is_global && mRegionp)
+ {
+ mPositionAgent = mRegionp->getOriginAgent();
+ }
+
+ LLViewerObject::sNumObjects++;
+}
+
+LLViewerObject::~LLViewerObject()
+{
+ deleteTEImages();
+
+ if(mInventory)
+ {
+ mInventory->clear(); // will deref and delete entries
+ delete mInventory;
+ mInventory = NULL;
+ }
+
+ if (mJointInfo)
+ {
+ delete mJointInfo;
+ mJointInfo = NULL;
+ }
+
+ if (mPartSourcep)
+ {
+ mPartSourcep->setDead();
+ mPartSourcep = NULL;
+ }
+
+ // Delete memory associated with extra parameters.
+ std::map<U16, ExtraParameter*>::iterator iter;
+ for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter)
+ {
+ if(iter->second != NULL)
+ {
+ delete iter->second->data;
+ delete iter->second;
+ }
+ }
+ mExtraParameterList.clear();
+
+ for_each(mNameValuePairs.begin(), mNameValuePairs.end(), DeletePairedPointer()) ;
+ mNameValuePairs.clear();
+
+ delete[] mData;
+ mData = NULL;
+
+ delete mMedia;
+ mMedia = NULL;
+
+ sNumObjects--;
+ sNumZombieObjects--;
+ llassert(mChildList.size() == 0);
+
+ clearInventoryListeners();
+}
+
+void LLViewerObject::deleteTEImages()
+{
+ delete[] mTEImages;
+ mTEImages = NULL;
+}
+
+void LLViewerObject::markDead()
+{
+ if (!mDead)
+ {
+ //llinfos << "Marking self " << mLocalID << " as dead." << llendl;
+
+ // Root object of this hierarchy unlinks itself.
+ if (getParent())
+ {
+ ((LLViewerObject *)getParent())->removeChild(this);
+ // go ahead and delete any jointinfo's that we find
+ delete mJointInfo;
+ mJointInfo = NULL;
+ }
+
+ // Mark itself as dead
+ mDead = TRUE;
+ gObjectList.cleanupReferences(this);
+
+ LLViewerObject *childp;
+ while (mChildList.size() > 0)
+ {
+ childp = mChildList.back();
+ if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR)
+ {
+ //llinfos << "Marking child " << childp->getLocalID() << " as dead." << llendl;
+ childp->setParent(NULL); // LLViewerObject::markDead 1
+ childp->markDead();
+ }
+ else
+ {
+ // make sure avatar is no longer parented,
+ // so we can properly set it's position
+ childp->setDrawableParent(NULL);
+ ((LLVOAvatar*)childp)->getOffObject();
+ childp->setParent(NULL); // LLViewerObject::markDead 2
+ }
+ mChildList.pop_back();
+ }
+
+ if (mDrawable.notNull())
+ {
+ // Drawables are reference counted, mark as dead, then nuke the pointer.
+ mDrawable->markDead();
+ mDrawable = NULL;
+ }
+
+ if (mText)
+ {
+ mText->markDead();
+ mText = NULL;
+ }
+
+ if (mIcon)
+ {
+ mIcon->markDead();
+ mIcon = NULL;
+ }
+
+ if (mPartSourcep)
+ {
+ mPartSourcep->setDead();
+ mPartSourcep = NULL;
+ }
+
+ if (mAudioSourcep)
+ {
+ // Do some cleanup
+ if (gAudiop)
+ {
+ gAudiop->cleanupAudioSource(mAudioSourcep);
+ }
+ mAudioSourcep = NULL;
+ }
+
+ if (flagAnimSource())
+ {
+ if (isAgentAvatarValid())
+ {
+ // stop motions associated with this object
+ gAgentAvatarp->stopMotionFromSource(mID);
+ }
+ }
+
+ if (flagCameraSource())
+ {
+ LLFollowCamMgr::removeFollowCamParams(mID);
+ }
+
+ sNumZombieObjects++;
+ }
+}
+
+void LLViewerObject::dump() const
+{
+ llinfos << "Type: " << pCodeToString(mPrimitiveCode) << llendl;
+ llinfos << "Drawable: " << (LLDrawable *)mDrawable << llendl;
+ llinfos << "Update Age: " << LLFrameTimer::getElapsedSeconds() - mLastMessageUpdateSecs << llendl;
+
+ llinfos << "Parent: " << getParent() << llendl;
+ llinfos << "ID: " << mID << llendl;
+ llinfos << "LocalID: " << mLocalID << llendl;
+ llinfos << "PositionRegion: " << getPositionRegion() << llendl;
+ llinfos << "PositionAgent: " << getPositionAgent() << llendl;
+ llinfos << "PositionGlobal: " << getPositionGlobal() << llendl;
+ llinfos << "Velocity: " << getVelocity() << llendl;
+ if (mDrawable.notNull() && mDrawable->getNumFaces())
+ {
+ LLFacePool *poolp = mDrawable->getFace(0)->getPool();
+ if (poolp)
+ {
+ llinfos << "Pool: " << poolp << llendl;
+ llinfos << "Pool reference count: " << poolp->mReferences.size() << llendl;
+ }
+ }
+ //llinfos << "BoxTree Min: " << mDrawable->getBox()->getMin() << llendl;
+ //llinfos << "BoxTree Max: " << mDrawable->getBox()->getMin() << llendl;
+ /*
+ llinfos << "Velocity: " << getVelocity() << llendl;
+ llinfos << "AnyOwner: " << permAnyOwner() << " YouOwner: " << permYouOwner() << " Edit: " << mPermEdit << llendl;
+ llinfos << "UsePhysics: " << usePhysics() << " CanSelect " << mbCanSelect << " UserSelected " << mUserSelected << llendl;
+ llinfos << "AppAngle: " << mAppAngle << llendl;
+ llinfos << "PixelArea: " << mPixelArea << llendl;
+
+ char buffer[1000];
+ char *key;
+ for (key = mNameValuePairs.getFirstKey(); key; key = mNameValuePairs.getNextKey() )
+ {
+ mNameValuePairs[key]->printNameValue(buffer);
+ llinfos << buffer << llendl;
+ }
+ for (child_list_t::iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* child = *iter;
+ llinfos << " child " << child->getID() << llendl;
+ }
+ */
+}
+
+void LLViewerObject::printNameValuePairs() const
+{
+ for (name_value_map_t::const_iterator iter = mNameValuePairs.begin();
+ iter != mNameValuePairs.end(); iter++)
+ {
+ LLNameValue* nv = iter->second;
+ llinfos << nv->printNameValue() << llendl;
+ }
+}
+
+void LLViewerObject::initVOClasses()
+{
+ // Initialized shared class stuff first.
+ LLVOAvatar::initClass();
+ LLVOTree::initClass();
+ llinfos << "Viewer Object size: " << sizeof(LLViewerObject) << llendl;
+ LLVOGrass::initClass();
+ LLVOWater::initClass();
+ LLVOVolume::initClass();
+}
+
+void LLViewerObject::cleanupVOClasses()
+{
+ LLVOGrass::cleanupClass();
+ LLVOWater::cleanupClass();
+ LLVOTree::cleanupClass();
+ LLVOAvatar::cleanupClass();
+ LLVOVolume::cleanupClass();
+}
+
+// Replaces all name value pairs with data from \n delimited list
+// Does not update server
+void LLViewerObject::setNameValueList(const std::string& name_value_list)
+{
+ // Clear out the old
+ for_each(mNameValuePairs.begin(), mNameValuePairs.end(), DeletePairedPointer()) ;
+ mNameValuePairs.clear();
+
+ // Bring in the new
+ std::string::size_type length = name_value_list.length();
+ std::string::size_type start = 0;
+ while (start < length)
+ {
+ std::string::size_type end = name_value_list.find_first_of("\n", start);
+ if (end == std::string::npos) end = length;
+ if (end > start)
+ {
+ std::string tok = name_value_list.substr(start, end - start);
+ addNVPair(tok);
+ }
+ start = end+1;
+ }
+}
+
+
+// This method returns true if the object is over land owned by the
+// agent.
+bool LLViewerObject::isReturnable()
+{
+ if (isAttachment())
+ {
+ return false;
+ }
+ std::vector<LLBBox> boxes;
+ boxes.push_back(LLBBox(getPositionRegion(), getRotationRegion(), getScale() * -0.5f, getScale() * 0.5f).getAxisAligned());
+ for (child_list_t::iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* child = *iter;
+ boxes.push_back(LLBBox(child->getPositionRegion(), child->getRotationRegion(), child->getScale() * -0.5f, child->getScale() * 0.5f).getAxisAligned());
+ }
+
+ return mRegionp
+ && mRegionp->objectIsReturnable(getPositionRegion(), boxes);
+}
+
+BOOL LLViewerObject::setParent(LLViewerObject* parent)
+{
+ if(mParent != parent)
+ {
+ LLViewerObject* old_parent = (LLViewerObject*)mParent ;
+ BOOL ret = LLPrimitive::setParent(parent);
+ if(ret && old_parent && parent)
+ {
+ old_parent->removeChild(this) ;
+ }
+ return ret ;
+ }
+
+ return FALSE ;
+}
+
+void LLViewerObject::addChild(LLViewerObject *childp)
+{
+ for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i)
+ {
+ if (*i == childp)
+ { //already has child
+ return;
+ }
+ }
+
+ if (!isAvatar())
+ {
+ // propagate selection properties
+ childp->mbCanSelect = mbCanSelect;
+ }
+
+ if(childp->setParent(this))
+ {
+ mChildList.push_back(childp);
+ }
+}
+
+void LLViewerObject::removeChild(LLViewerObject *childp)
+{
+ for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i)
+ {
+ if (*i == childp)
+ {
+ if (!childp->isAvatar() && mDrawable.notNull() && mDrawable->isActive() && childp->mDrawable.notNull() && !isAvatar())
+ {
+ gPipeline.markRebuild(childp->mDrawable, LLDrawable::REBUILD_VOLUME);
+ }
+
+ mChildList.erase(i);
+
+ if(childp->getParent() == this)
+ {
+ childp->setParent(NULL);
+ }
+ break;
+ }
+ }
+
+ if (childp->isSelected())
+ {
+ LLSelectMgr::getInstance()->deselectObjectAndFamily(childp);
+ BOOL add_to_end = TRUE;
+ LLSelectMgr::getInstance()->selectObjectAndFamily(childp, add_to_end);
+ }
+}
+
+void LLViewerObject::addThisAndAllChildren(std::vector<LLViewerObject*>& objects)
+{
+ objects.push_back(this);
+ for (child_list_t::iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* child = *iter;
+ if (!child->isAvatar())
+ {
+ child->addThisAndAllChildren(objects);
+ }
+ }
+}
+
+void LLViewerObject::addThisAndNonJointChildren(std::vector<LLViewerObject*>& objects)
+{
+ objects.push_back(this);
+ // don't add any attachments when temporarily selecting avatar
+ if (isAvatar())
+ {
+ return;
+ }
+ for (child_list_t::iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* child = *iter;
+ if ( (!child->isAvatar()) && (!child->isJointChild()))
+ {
+ child->addThisAndNonJointChildren(objects);
+ }
+ }
+}
+
+BOOL LLViewerObject::isChild(LLViewerObject *childp) const
+{
+ for (child_list_t::const_iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* testchild = *iter;
+ if (testchild == childp)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+// returns TRUE if at least one avatar is sitting on this object
+BOOL LLViewerObject::isSeat() const
+{
+ for (child_list_t::const_iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* child = *iter;
+ if (child->isAvatar())
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+
+}
+
+BOOL LLViewerObject::setDrawableParent(LLDrawable* parentp)
+{
+ if (mDrawable.isNull())
+ {
+ return FALSE;
+ }
+
+ BOOL ret = mDrawable->mXform.setParent(parentp ? &parentp->mXform : NULL);
+ if(!ret)
+ {
+ return FALSE ;
+ }
+ LLDrawable* old_parent = mDrawable->mParent;
+ mDrawable->mParent = parentp;
+
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE);
+ if( (old_parent != parentp && old_parent)
+ || (parentp && parentp->isActive()))
+ {
+ // *TODO we should not be relying on setDrawable parent to call markMoved
+ gPipeline.markMoved(mDrawable, FALSE);
+ }
+ else if (!mDrawable->isAvatar())
+ {
+ mDrawable->updateXform(TRUE);
+ /*if (!mDrawable->getSpatialGroup())
+ {
+ mDrawable->movePartition();
+ }*/
+ }
+
+ return ret;
+}
+
+// Show or hide particles, icon and HUD
+void LLViewerObject::hideExtraDisplayItems( BOOL hidden )
+{
+ if( mPartSourcep.notNull() )
+ {
+ LLViewerPartSourceScript *partSourceScript = mPartSourcep.get();
+ partSourceScript->setSuspended( hidden );
+ }
+
+ if( mText.notNull() )
+ {
+ LLHUDText *hudText = mText.get();
+ hudText->setHidden( hidden );
+ }
+
+ if( mIcon.notNull() )
+ {
+ LLHUDIcon *hudIcon = mIcon.get();
+ hudIcon->setHidden( hidden );
+ }
+}
+
+U32 LLViewerObject::checkMediaURL(const std::string &media_url)
+{
+ U32 retval = (U32)0x0;
+ if (!mMedia && !media_url.empty())
+ {
+ retval |= MEDIA_URL_ADDED;
+ mMedia = new LLViewerObjectMedia;
+ mMedia->mMediaURL = media_url;
+ mMedia->mMediaType = LLViewerObject::MEDIA_SET;
+ mMedia->mPassedWhitelist = FALSE;
+ }
+ else if (mMedia)
+ {
+ if (media_url.empty())
+ {
+ retval |= MEDIA_URL_REMOVED;
+ delete mMedia;
+ mMedia = NULL;
+ }
+ else if (mMedia->mMediaURL != media_url) // <-- This is an optimization. If they are equal don't bother with below's test.
+ {
+ /*if (! (LLTextureEntry::getAgentIDFromMediaVersionString(media_url) == gAgent.getID() &&
+ LLTextureEntry::getVersionFromMediaVersionString(media_url) ==
+ LLTextureEntry::getVersionFromMediaVersionString(mMedia->mMediaURL) + 1))
+ */
+ {
+ // If the media URL is different and WE were not the one who
+ // changed it, mark dirty.
+ retval |= MEDIA_URL_UPDATED;
+ }
+ mMedia->mMediaURL = media_url;
+ mMedia->mPassedWhitelist = FALSE;
+ }
+ }
+ return retval;
+}
+
+U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
+ void **user_data,
+ U32 block_num,
+ const EObjectUpdateType update_type,
+ LLDataPacker *dp)
+{
+ LLMemType mt(LLMemType::MTYPE_OBJECT);
+ U32 retval = 0x0;
+
+ // Coordinates of objects on simulators are region-local.
+ U64 region_handle;
+ mesgsys->getU64Fast(_PREHASH_RegionData, _PREHASH_RegionHandle, region_handle);
+
+ {
+ LLViewerRegion* regionp = LLWorld::getInstance()->getRegionFromHandle(region_handle);
+ if(regionp != mRegionp && regionp && mRegionp)//region cross
+ {
+ //this is the redundant position and region update, but it is necessary in case the viewer misses the following
+ //position and region update messages from sim.
+ //this redundant update should not cause any problems.
+ LLVector3 delta_pos = mRegionp->getOriginAgent() - regionp->getOriginAgent();
+ setPositionParent(getPosition() + delta_pos); //update to the new region position immediately.
+ setRegion(regionp) ; //change the region.
+ }
+ else
+ {
+ mRegionp = regionp ;
+ }
+ }
+
+ if (!mRegionp)
+ {
+ U32 x, y;
+ from_region_handle(region_handle, &x, &y);
+
+ llerrs << "Object has invalid region " << x << ":" << y << "!" << llendl;
+ return retval;
+ }
+
+ U16 time_dilation16;
+ mesgsys->getU16Fast(_PREHASH_RegionData, _PREHASH_TimeDilation, time_dilation16);
+ F32 time_dilation = ((F32) time_dilation16) / 65535.f;
+ mTimeDilation = time_dilation;
+ mRegionp->setTimeDilation(time_dilation);
+
+ // this will be used to determine if we've really changed position
+ // Use getPosition, not getPositionRegion, since this is what we're comparing directly against.
+ LLVector3 test_pos_parent = getPosition();
+
+ U8 data[60+16]; // This needs to match the largest size below.
+#ifdef LL_BIG_ENDIAN
+ U16 valswizzle[4];
+#endif
+ U16 *val;
+ const F32 size = LLWorld::getInstance()->getRegionWidthInMeters();
+ const F32 MAX_HEIGHT = LLWorld::getInstance()->getRegionMaxHeight();
+ const F32 MIN_HEIGHT = LLWorld::getInstance()->getRegionMinHeight();
+ S32 length;
+ S32 count;
+ S32 this_update_precision = 32; // in bits
+
+ // Temporaries, because we need to compare w/ previous to set dirty flags...
+ LLVector3 new_pos_parent;
+ LLVector3 new_vel;
+ LLVector3 new_acc;
+ LLVector3 new_angv;
+ LLVector3 old_angv = getAngularVelocity();
+ LLQuaternion new_rot;
+ LLVector3 new_scale = getScale();
+
+ U32 parent_id = 0;
+ U8 material = 0;
+ U8 click_action = 0;
+ U32 crc = 0;
+
+ bool old_special_hover_cursor = specialHoverCursor();
+
+ LLViewerObject *cur_parentp = (LLViewerObject *)getParent();
+
+ if (cur_parentp)
+ {
+ parent_id = cur_parentp->mLocalID;
+ }
+
+ if (!dp)
+ {
+ switch(update_type)
+ {
+ case OUT_FULL:
+ {
+#ifdef DEBUG_UPDATE_TYPE
+ llinfos << "Full:" << getID() << llendl;
+#endif
+ //clear cost and linkset cost
+ mCostStale = true;
+ if (isSelected())
+ {
+ gFloaterTools->dirty();
+ }
+
+ LLUUID audio_uuid;
+ LLUUID owner_id; // only valid if audio_uuid or particle system is not null
+ F32 gain;
+ U8 sound_flags;
+
+ mesgsys->getU32Fast( _PREHASH_ObjectData, _PREHASH_CRC, crc, block_num);
+ mesgsys->getU32Fast( _PREHASH_ObjectData, _PREHASH_ParentID, parent_id, block_num);
+ mesgsys->getUUIDFast(_PREHASH_ObjectData, _PREHASH_Sound, audio_uuid, block_num );
+ // HACK: Owner id only valid if non-null sound id or particle system
+ mesgsys->getUUIDFast(_PREHASH_ObjectData, _PREHASH_OwnerID, owner_id, block_num );
+ mesgsys->getF32Fast( _PREHASH_ObjectData, _PREHASH_Gain, gain, block_num );
+ mesgsys->getU8Fast( _PREHASH_ObjectData, _PREHASH_Flags, sound_flags, block_num );
+ mesgsys->getU8Fast( _PREHASH_ObjectData, _PREHASH_Material, material, block_num );
+ mesgsys->getU8Fast( _PREHASH_ObjectData, _PREHASH_ClickAction, click_action, block_num);
+ mesgsys->getVector3Fast(_PREHASH_ObjectData, _PREHASH_Scale, new_scale, block_num );
+ length = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_ObjectData);
+ mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_ObjectData, data, length, block_num);
+
+ mTotalCRC = crc;
+
+ // Owner ID used for sound muting or particle system muting
+ setAttachedSound(audio_uuid, owner_id, gain, sound_flags);
+
+ U8 old_material = getMaterial();
+ if (old_material != material)
+ {
+ setMaterial(material);
+ if (mDrawable.notNull())
+ {
+ gPipeline.markMoved(mDrawable, FALSE); // undamped
+ }
+ }
+ setClickAction(click_action);
+
+ count = 0;
+ LLVector4 collision_plane;
+
+ switch(length)
+ {
+ case (60 + 16):
+ // pull out collision normal for avatar
+ htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
+ ((LLVOAvatar*)this)->setFootPlane(collision_plane);
+ count += sizeof(LLVector4);
+ // fall through
+ case 60:
+ this_update_precision = 32;
+ // this is a terse update
+ // pos
+ htonmemcpy(new_pos_parent.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
+ count += sizeof(LLVector3);
+ // vel
+ htonmemcpy((void*)getVelocity().mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
+ count += sizeof(LLVector3);
+ // acc
+ htonmemcpy((void*)getAcceleration().mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
+ count += sizeof(LLVector3);
+ // theta
+ {
+ LLVector3 vec;
+ htonmemcpy(vec.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
+ new_rot.unpackFromVector3(vec);
+ }
+ count += sizeof(LLVector3);
+ // omega
+ htonmemcpy((void*)new_angv.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
+ if (new_angv.isExactlyZero())
+ {
+ // reset rotation time
+ resetRot();
+ }
+ setAngularVelocity(new_angv);
+#if LL_DARWIN
+ if (length == 76)
+ {
+ setAngularVelocity(LLVector3::zero);
+ }
+#endif
+ break;
+ case(32 + 16):
+ // pull out collision normal for avatar
+ htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
+ ((LLVOAvatar*)this)->setFootPlane(collision_plane);
+ count += sizeof(LLVector4);
+ // fall through
+ case 32:
+ this_update_precision = 16;
+ test_pos_parent.quantize16(-0.5f*size, 1.5f*size, MIN_HEIGHT, MAX_HEIGHT);
+
+ // This is a terse 16 update, so treat data as an array of U16's.
+#ifdef LL_BIG_ENDIAN
+ htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
+ val = valswizzle;
+#else
+ val = (U16 *) &data[count];
+#endif
+ count += sizeof(U16)*3;
+ new_pos_parent.mV[VX] = U16_to_F32(val[VX], -0.5f*size, 1.5f*size);
+ new_pos_parent.mV[VY] = U16_to_F32(val[VY], -0.5f*size, 1.5f*size);
+ new_pos_parent.mV[VZ] = U16_to_F32(val[VZ], MIN_HEIGHT, MAX_HEIGHT);
+
+#ifdef LL_BIG_ENDIAN
+ htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
+ val = valswizzle;
+#else
+ val = (U16 *) &data[count];
+#endif
+ count += sizeof(U16)*3;
+ setVelocity(LLVector3(U16_to_F32(val[VX], -size, size),
+ U16_to_F32(val[VY], -size, size),
+ U16_to_F32(val[VZ], -size, size)));
+
+#ifdef LL_BIG_ENDIAN
+ htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
+ val = valswizzle;
+#else
+ val = (U16 *) &data[count];
+#endif
+ count += sizeof(U16)*3;
+ setAcceleration(LLVector3(U16_to_F32(val[VX], -size, size),
+ U16_to_F32(val[VY], -size, size),
+ U16_to_F32(val[VZ], -size, size)));
+
+#ifdef LL_BIG_ENDIAN
+ htonmemcpy(valswizzle, &data[count], MVT_U16Quat, 4);
+ val = valswizzle;
+#else
+ val = (U16 *) &data[count];
+#endif
+ count += sizeof(U16)*4;
+ new_rot.mQ[VX] = U16_to_F32(val[VX], -1.f, 1.f);
+ new_rot.mQ[VY] = U16_to_F32(val[VY], -1.f, 1.f);
+ new_rot.mQ[VZ] = U16_to_F32(val[VZ], -1.f, 1.f);
+ new_rot.mQ[VW] = U16_to_F32(val[VW], -1.f, 1.f);
+
+#ifdef LL_BIG_ENDIAN
+ htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
+ val = valswizzle;
+#else
+ val = (U16 *) &data[count];
+#endif
+ new_angv.setVec(U16_to_F32(val[VX], -size, size),
+ U16_to_F32(val[VY], -size, size),
+ U16_to_F32(val[VZ], -size, size));
+ if (new_angv.isExactlyZero())
+ {
+ // reset rotation time
+ resetRot();
+ }
+ setAngularVelocity(new_angv);
+ break;
+
+ case 16:
+ this_update_precision = 8;
+ test_pos_parent.quantize8(-0.5f*size, 1.5f*size, MIN_HEIGHT, MAX_HEIGHT);
+ // this is a terse 8 update
+ new_pos_parent.mV[VX] = U8_to_F32(data[0], -0.5f*size, 1.5f*size);
+ new_pos_parent.mV[VY] = U8_to_F32(data[1], -0.5f*size, 1.5f*size);
+ new_pos_parent.mV[VZ] = U8_to_F32(data[2], MIN_HEIGHT, MAX_HEIGHT);
+
+ setVelocity(U8_to_F32(data[3], -size, size),
+ U8_to_F32(data[4], -size, size),
+ U8_to_F32(data[5], -size, size) );
+
+ setAcceleration(U8_to_F32(data[6], -size, size),
+ U8_to_F32(data[7], -size, size),
+ U8_to_F32(data[8], -size, size) );
+
+ new_rot.mQ[VX] = U8_to_F32(data[9], -1.f, 1.f);
+ new_rot.mQ[VY] = U8_to_F32(data[10], -1.f, 1.f);
+ new_rot.mQ[VZ] = U8_to_F32(data[11], -1.f, 1.f);
+ new_rot.mQ[VW] = U8_to_F32(data[12], -1.f, 1.f);
+
+ new_angv.setVec(U8_to_F32(data[13], -size, size),
+ U8_to_F32(data[14], -size, size),
+ U8_to_F32(data[15], -size, size) );
+ if (new_angv.isExactlyZero())
+ {
+ // reset rotation time
+ resetRot();
+ }
+ setAngularVelocity(new_angv);
+ break;
+ }
+
+ ////////////////////////////////////////////////////
+ //
+ // Here we handle data specific to the full message.
+ //
+
+ U32 flags;
+ mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_UpdateFlags, flags, block_num);
+ // clear all but local flags
+ mFlags &= FLAGS_LOCAL;
+ mFlags |= flags;
+
+ U8 state;
+ mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_State, state, block_num );
+ mState = state;
+
+ // ...new objects that should come in selected need to be added to the selected list
+ mCreateSelected = ((flags & FLAGS_CREATE_SELECTED) != 0);
+
+ // Set all name value pairs
+ S32 nv_size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_NameValue);
+ if (nv_size > 0)
+ {
+ std::string name_value_list;
+ mesgsys->getStringFast(_PREHASH_ObjectData, _PREHASH_NameValue, name_value_list, block_num);
+ setNameValueList(name_value_list);
+ }
+
+ // Clear out any existing generic data
+ if (mData)
+ {
+ delete [] mData;
+ }
+
+ // Check for appended generic data
+ S32 data_size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_Data);
+ if (data_size <= 0)
+ {
+ mData = NULL;
+ }
+ else
+ {
+ // ...has generic data
+ mData = new U8[data_size];
+ mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_Data, mData, data_size, block_num);
+ }
+
+ S32 text_size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_Text);
+ if (text_size > 1)
+ {
+ // Setup object text
+ if (!mText)
+ {
+ mText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT);
+ mText->setFont(LLFontGL::getFontSansSerif());
+ mText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP);
+ mText->setMaxLines(-1);
+ mText->setSourceObject(this);
+ mText->setOnHUDAttachment(isHUDAttachment());
+ }
+
+ std::string temp_string;
+ mesgsys->getStringFast(_PREHASH_ObjectData, _PREHASH_Text, temp_string, block_num );
+
+ LLColor4U coloru;
+ mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_TextColor, coloru.mV, 4, block_num);
+
+ // alpha was flipped so that it zero encoded better
+ coloru.mV[3] = 255 - coloru.mV[3];
+ mText->setColor(LLColor4(coloru));
+ mText->setString(temp_string);
+
+ if (mDrawable.notNull())
+ {
+ setChanged(MOVED | SILHOUETTE);
+ gPipeline.markMoved(mDrawable, FALSE); // undamped
+ }
+ }
+ else if (mText.notNull())
+ {
+ mText->markDead();
+ mText = NULL;
+ }
+
+ std::string media_url;
+ mesgsys->getStringFast(_PREHASH_ObjectData, _PREHASH_MediaURL, media_url, block_num);
+ retval |= checkMediaURL(media_url);
+
+ //
+ // Unpack particle system data
+ //
+ unpackParticleSource(block_num, owner_id);
+
+ // Mark all extra parameters not used
+ std::map<U16, ExtraParameter*>::iterator iter;
+ for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter)
+ {
+ iter->second->in_use = FALSE;
+ }
+
+ // Unpack extra parameters
+ S32 size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_ExtraParams);
+ if (size > 0)
+ {
+ U8 *buffer = new U8[size];
+ mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_ExtraParams, buffer, size, block_num);
+ LLDataPackerBinaryBuffer dp(buffer, size);
+
+ U8 num_parameters;
+ dp.unpackU8(num_parameters, "num_params");
+ U8 param_block[MAX_OBJECT_PARAMS_SIZE];
+ for (U8 param=0; param<num_parameters; ++param)
+ {
+ U16 param_type;
+ S32 param_size;
+ dp.unpackU16(param_type, "param_type");
+ dp.unpackBinaryData(param_block, param_size, "param_data");
+ //llinfos << "Param type: " << param_type << ", Size: " << param_size << llendl;
+ LLDataPackerBinaryBuffer dp2(param_block, param_size);
+ unpackParameterEntry(param_type, &dp2);
+ }
+ delete[] buffer;
+ }
+
+ for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter)
+ {
+ if (!iter->second->in_use)
+ {
+ // Send an update message in case it was formerly in use
+ parameterChanged(iter->first, iter->second->data, FALSE, false);
+ }
+ }
+
+ U8 joint_type = 0;
+ mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_JointType, joint_type, block_num);
+ if (joint_type)
+ {
+ // create new joint info
+ if (!mJointInfo)
+ {
+ mJointInfo = new LLVOJointInfo;
+ }
+ mJointInfo->mJointType = (EHavokJointType) joint_type;
+ mesgsys->getVector3Fast(_PREHASH_ObjectData, _PREHASH_JointPivot, mJointInfo->mPivot, block_num);
+ mesgsys->getVector3Fast(_PREHASH_ObjectData, _PREHASH_JointAxisOrAnchor, mJointInfo->mAxisOrAnchor, block_num);
+ }
+ else if (mJointInfo)
+ {
+ // this joint info is no longer needed
+ delete mJointInfo;
+ mJointInfo = NULL;
+ }
+
+ break;
+ }
+
+ case OUT_TERSE_IMPROVED:
+ {
+#ifdef DEBUG_UPDATE_TYPE
+ llinfos << "TI:" << getID() << llendl;
+#endif
+ length = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_ObjectData);
+ mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_ObjectData, data, length, block_num);
+ count = 0;
+ LLVector4 collision_plane;
+
+ switch(length)
+ {
+ case(60 + 16):
+ // pull out collision normal for avatar
+ htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
+ ((LLVOAvatar*)this)->setFootPlane(collision_plane);
+ count += sizeof(LLVector4);
+ // fall through
+ case 60:
+ // this is a terse 32 update
+ // pos
+ this_update_precision = 32;
+ htonmemcpy(new_pos_parent.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
+ count += sizeof(LLVector3);
+ // vel
+ htonmemcpy((void*)getVelocity().mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
+ count += sizeof(LLVector3);
+ // acc
+ htonmemcpy((void*)getAcceleration().mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
+ count += sizeof(LLVector3);
+ // theta
+ {
+ LLVector3 vec;
+ htonmemcpy(vec.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
+ new_rot.unpackFromVector3(vec);
+ }
+ count += sizeof(LLVector3);
+ // omega
+ htonmemcpy((void*)new_angv.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
+ if (new_angv.isExactlyZero())
+ {
+ // reset rotation time
+ resetRot();
+ }
+ setAngularVelocity(new_angv);
+#if LL_DARWIN
+ if (length == 76)
+ {
+ setAngularVelocity(LLVector3::zero);
+ }
+#endif
+ break;
+ case(32 + 16):
+ // pull out collision normal for avatar
+ htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
+ ((LLVOAvatar*)this)->setFootPlane(collision_plane);
+ count += sizeof(LLVector4);
+ // fall through
+ case 32:
+ // this is a terse 16 update
+ this_update_precision = 16;
+ test_pos_parent.quantize16(-0.5f*size, 1.5f*size, MIN_HEIGHT, MAX_HEIGHT);
+
+#ifdef LL_BIG_ENDIAN
+ htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
+ val = valswizzle;
+#else
+ val = (U16 *) &data[count];
+#endif
+ count += sizeof(U16)*3;
+ new_pos_parent.mV[VX] = U16_to_F32(val[VX], -0.5f*size, 1.5f*size);
+ new_pos_parent.mV[VY] = U16_to_F32(val[VY], -0.5f*size, 1.5f*size);
+ new_pos_parent.mV[VZ] = U16_to_F32(val[VZ], MIN_HEIGHT, MAX_HEIGHT);
+
+#ifdef LL_BIG_ENDIAN
+ htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
+ val = valswizzle;
+#else
+ val = (U16 *) &data[count];
+#endif
+ count += sizeof(U16)*3;
+ setVelocity(U16_to_F32(val[VX], -size, size),
+ U16_to_F32(val[VY], -size, size),
+ U16_to_F32(val[VZ], -size, size));
+
+#ifdef LL_BIG_ENDIAN
+ htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
+ val = valswizzle;
+#else
+ val = (U16 *) &data[count];
+#endif
+ count += sizeof(U16)*3;
+ setAcceleration(U16_to_F32(val[VX], -size, size),
+ U16_to_F32(val[VY], -size, size),
+ U16_to_F32(val[VZ], -size, size));
+
+#ifdef LL_BIG_ENDIAN
+ htonmemcpy(valswizzle, &data[count], MVT_U16Quat, 8);
+ val = valswizzle;
+#else
+ val = (U16 *) &data[count];
+#endif
+ count += sizeof(U16)*4;
+ new_rot.mQ[VX] = U16_to_F32(val[VX], -1.f, 1.f);
+ new_rot.mQ[VY] = U16_to_F32(val[VY], -1.f, 1.f);
+ new_rot.mQ[VZ] = U16_to_F32(val[VZ], -1.f, 1.f);
+ new_rot.mQ[VW] = U16_to_F32(val[VW], -1.f, 1.f);
+
+#ifdef LL_BIG_ENDIAN
+ htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6);
+ val = valswizzle;
+#else
+ val = (U16 *) &data[count];
+#endif
+ setAngularVelocity( U16_to_F32(val[VX], -size, size),
+ U16_to_F32(val[VY], -size, size),
+ U16_to_F32(val[VZ], -size, size));
+ break;
+
+ case 16:
+ // this is a terse 8 update
+ this_update_precision = 8;
+ test_pos_parent.quantize8(-0.5f*size, 1.5f*size, MIN_HEIGHT, MAX_HEIGHT);
+ new_pos_parent.mV[VX] = U8_to_F32(data[0], -0.5f*size, 1.5f*size);
+ new_pos_parent.mV[VY] = U8_to_F32(data[1], -0.5f*size, 1.5f*size);
+ new_pos_parent.mV[VZ] = U8_to_F32(data[2], MIN_HEIGHT, MAX_HEIGHT);
+
+ setVelocity(U8_to_F32(data[3], -size, size),
+ U8_to_F32(data[4], -size, size),
+ U8_to_F32(data[5], -size, size) );
+
+ setAcceleration(U8_to_F32(data[6], -size, size),
+ U8_to_F32(data[7], -size, size),
+ U8_to_F32(data[8], -size, size) );
+
+ new_rot.mQ[VX] = U8_to_F32(data[9], -1.f, 1.f);
+ new_rot.mQ[VY] = U8_to_F32(data[10], -1.f, 1.f);
+ new_rot.mQ[VZ] = U8_to_F32(data[11], -1.f, 1.f);
+ new_rot.mQ[VW] = U8_to_F32(data[12], -1.f, 1.f);
+
+ setAngularVelocity( U8_to_F32(data[13], -size, size),
+ U8_to_F32(data[14], -size, size),
+ U8_to_F32(data[15], -size, size) );
+ break;
+ }
+
+ U8 state;
+ mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_State, state, block_num );
+ mState = state;
+ break;
+ }
+
+ default:
+ break;
+
+ }
+ }
+ else
+ {
+ // handle the compressed case
+ LLUUID sound_uuid;
+ LLUUID owner_id;
+ F32 gain = 0;
+ U8 sound_flags = 0;
+ F32 cutoff = 0;
+
+ U16 val[4];
+
+ U8 state;
+
+ dp->unpackU8(state, "State");
+ mState = state;
+
+ switch(update_type)
+ {
+ case OUT_TERSE_IMPROVED:
+ {
+#ifdef DEBUG_UPDATE_TYPE
+ llinfos << "CompTI:" << getID() << llendl;
+#endif
+ U8 value;
+ dp->unpackU8(value, "agent");
+ if (value)
+ {
+ LLVector4 collision_plane;
+ dp->unpackVector4(collision_plane, "Plane");
+ ((LLVOAvatar*)this)->setFootPlane(collision_plane);
+ }
+ test_pos_parent = getPosition();
+ dp->unpackVector3(new_pos_parent, "Pos");
+ dp->unpackU16(val[VX], "VelX");
+ dp->unpackU16(val[VY], "VelY");
+ dp->unpackU16(val[VZ], "VelZ");
+ setVelocity(U16_to_F32(val[VX], -128.f, 128.f),
+ U16_to_F32(val[VY], -128.f, 128.f),
+ U16_to_F32(val[VZ], -128.f, 128.f));
+ dp->unpackU16(val[VX], "AccX");
+ dp->unpackU16(val[VY], "AccY");
+ dp->unpackU16(val[VZ], "AccZ");
+ setAcceleration(U16_to_F32(val[VX], -64.f, 64.f),
+ U16_to_F32(val[VY], -64.f, 64.f),
+ U16_to_F32(val[VZ], -64.f, 64.f));
+
+ dp->unpackU16(val[VX], "ThetaX");
+ dp->unpackU16(val[VY], "ThetaY");
+ dp->unpackU16(val[VZ], "ThetaZ");
+ dp->unpackU16(val[VS], "ThetaS");
+ new_rot.mQ[VX] = U16_to_F32(val[VX], -1.f, 1.f);
+ new_rot.mQ[VY] = U16_to_F32(val[VY], -1.f, 1.f);
+ new_rot.mQ[VZ] = U16_to_F32(val[VZ], -1.f, 1.f);
+ new_rot.mQ[VS] = U16_to_F32(val[VS], -1.f, 1.f);
+ dp->unpackU16(val[VX], "AccX");
+ dp->unpackU16(val[VY], "AccY");
+ dp->unpackU16(val[VZ], "AccZ");
+ setAngularVelocity( U16_to_F32(val[VX], -64.f, 64.f),
+ U16_to_F32(val[VY], -64.f, 64.f),
+ U16_to_F32(val[VZ], -64.f, 64.f));
+ }
+ break;
+ case OUT_FULL_COMPRESSED:
+ case OUT_FULL_CACHED:
+ {
+#ifdef DEBUG_UPDATE_TYPE
+ llinfos << "CompFull:" << getID() << llendl;
+#endif
+ mCostStale = true;
+
+ if (isSelected())
+ {
+ gFloaterTools->dirty();
+ }
+
+ dp->unpackU32(crc, "CRC");
+ mTotalCRC = crc;
+ dp->unpackU8(material, "Material");
+ U8 old_material = getMaterial();
+ if (old_material != material)
+ {
+ setMaterial(material);
+ if (mDrawable.notNull())
+ {
+ gPipeline.markMoved(mDrawable, FALSE); // undamped
+ }
+ }
+ dp->unpackU8(click_action, "ClickAction");
+ setClickAction(click_action);
+ dp->unpackVector3(new_scale, "Scale");
+ dp->unpackVector3(new_pos_parent, "Pos");
+ LLVector3 vec;
+ dp->unpackVector3(vec, "Rot");
+ new_rot.unpackFromVector3(vec);
+ setAcceleration(LLVector3::zero);
+
+ U32 value;
+ dp->unpackU32(value, "SpecialCode");
+ dp->setPassFlags(value);
+ dp->unpackUUID(owner_id, "Owner");
+
+ if (value & 0x80)
+ {
+ dp->unpackVector3(vec, "Omega");
+ setAngularVelocity(vec);
+ }
+
+ if (value & 0x20)
+ {
+ dp->unpackU32(parent_id, "ParentID");
+ }
+ else
+ {
+ parent_id = 0;
+ }
+
+ S32 sp_size;
+ U32 size;
+ if (value & 0x2)
+ {
+ sp_size = 1;
+ delete [] mData;
+ mData = new U8[1];
+ dp->unpackU8(((U8*)mData)[0], "TreeData");
+ }
+ else if (value & 0x1)
+ {
+ dp->unpackU32(size, "ScratchPadSize");
+ delete [] mData;
+ mData = new U8[size];
+ dp->unpackBinaryData((U8 *)mData, sp_size, "PartData");
+ }
+ else
+ {
+ mData = NULL;
+ }
+
+ // Setup object text
+ if (!mText && (value & 0x4))
+ {
+ mText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT);
+ mText->setFont(LLFontGL::getFontSansSerif());
+ mText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP);
+ mText->setMaxLines(-1); // Set to match current agni behavior.
+ mText->setSourceObject(this);
+ mText->setOnHUDAttachment(isHUDAttachment());
+ }
+
+ if (value & 0x4)
+ {
+ std::string temp_string;
+ dp->unpackString(temp_string, "Text");
+ LLColor4U coloru;
+ dp->unpackBinaryDataFixed(coloru.mV, 4, "Color");
+ coloru.mV[3] = 255 - coloru.mV[3];
+ mText->setColor(LLColor4(coloru));
+ mText->setString(temp_string);
+
+ setChanged(TEXTURE);
+ }
+ else if(mText.notNull())
+ {
+ mText->markDead();
+ mText = NULL;
+ }
+
+ std::string media_url;
+ if (value & 0x200)
+ {
+ dp->unpackString(media_url, "MediaURL");
+ }
+ retval |= checkMediaURL(media_url);
+
+ //
+ // Unpack particle system data
+ //
+ if (value & 0x8)
+ {
+ unpackParticleSource(*dp, owner_id);
+ }
+ else
+ {
+ deleteParticleSource();
+ }
+
+ // Mark all extra parameters not used
+ std::map<U16, ExtraParameter*>::iterator iter;
+ for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter)
+ {
+ iter->second->in_use = FALSE;
+ }
+
+ // Unpack extra params
+ U8 num_parameters;
+ dp->unpackU8(num_parameters, "num_params");
+ U8 param_block[MAX_OBJECT_PARAMS_SIZE];
+ for (U8 param=0; param<num_parameters; ++param)
+ {
+ U16 param_type;
+ S32 param_size;
+ dp->unpackU16(param_type, "param_type");
+ dp->unpackBinaryData(param_block, param_size, "param_data");
+ //llinfos << "Param type: " << param_type << ", Size: " << param_size << llendl;
+ LLDataPackerBinaryBuffer dp2(param_block, param_size);
+ unpackParameterEntry(param_type, &dp2);
+ }
+
+ for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter)
+ {
+ if (!iter->second->in_use)
+ {
+ // Send an update message in case it was formerly in use
+ parameterChanged(iter->first, iter->second->data, FALSE, false);
+ }
+ }
+
+ if (value & 0x10)
+ {
+ dp->unpackUUID(sound_uuid, "SoundUUID");
+ dp->unpackF32(gain, "SoundGain");
+ dp->unpackU8(sound_flags, "SoundFlags");
+ dp->unpackF32(cutoff, "SoundRadius");
+ }
+
+ if (value & 0x100)
+ {
+ std::string name_value_list;
+ dp->unpackString(name_value_list, "NV");
+
+ setNameValueList(name_value_list);
+ }
+
+ mTotalCRC = crc;
+
+ setAttachedSound(sound_uuid, owner_id, gain, sound_flags);
+
+ // only get these flags on updates from sim, not cached ones
+ // Preload these five flags for every object.
+ // Finer shades require the object to be selected, and the selection manager
+ // stores the extended permission info.
+ U32 flags;
+ mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_UpdateFlags, flags, block_num);
+ // keep local flags and overwrite remote-controlled flags
+ mFlags = (mFlags & FLAGS_LOCAL) | flags;
+
+ // ...new objects that should come in selected need to be added to the selected list
+ mCreateSelected = ((flags & FLAGS_CREATE_SELECTED) != 0);
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ //
+ // Fix object parenting.
+ //
+ BOOL b_changed_status = FALSE;
+
+ if (OUT_TERSE_IMPROVED != update_type)
+ {
+ // We only need to update parenting on full updates, terse updates
+ // don't send parenting information.
+ if (!cur_parentp)
+ {
+ if (parent_id == 0)
+ {
+ // No parent now, no parent in message -> do nothing
+ }
+ else
+ {
+ // No parent now, new parent in message -> attach to that parent if possible
+ LLUUID parent_uuid;
+ LLViewerObjectList::getUUIDFromLocal(parent_uuid,
+ parent_id,
+ mesgsys->getSenderIP(),
+ mesgsys->getSenderPort());
+
+ LLViewerObject *sent_parentp = gObjectList.findObject(parent_uuid);
+
+ //
+ // Check to see if we have the corresponding viewer object for the parent.
+ //
+ if (sent_parentp && sent_parentp->getParent() == this)
+ {
+ // Try to recover if we attempt to attach a parent to its child
+ llwarns << "Attempt to attach a parent to it's child: " << this->getID() << " to " << sent_parentp->getID() << llendl;
+ this->removeChild(sent_parentp);
+ sent_parentp->setDrawableParent(NULL);
+ }
+
+ if (sent_parentp && (sent_parentp != this) && !sent_parentp->isDead())
+ {
+ //
+ // We have a viewer object for the parent, and it's not dead.
+ // Do the actual reparenting here.
+ //
+
+ // new parent is valid
+ b_changed_status = TRUE;
+ // ...no current parent, so don't try to remove child
+ if (mDrawable.notNull())
+ {
+ if (mDrawable->isDead() || !mDrawable->getVObj())
+ {
+ llwarns << "Drawable is dead or no VObj!" << llendl;
+ sent_parentp->addChild(this);
+ }
+ else
+ {
+ if (!setDrawableParent(sent_parentp->mDrawable)) // LLViewerObject::processUpdateMessage 1
+ {
+ // Bad, we got a cycle somehow.
+ // Kill both the parent and the child, and
+ // set cache misses for both of them.
+ llwarns << "Attempting to recover from parenting cycle!" << llendl;
+ llwarns << "Killing " << sent_parentp->getID() << " and " << getID() << llendl;
+ llwarns << "Adding to cache miss list" << llendl;
+ setParent(NULL);
+ sent_parentp->setParent(NULL);
+ getRegion()->addCacheMissFull(getLocalID());
+ getRegion()->addCacheMissFull(sent_parentp->getLocalID());
+ gObjectList.killObject(sent_parentp);
+ gObjectList.killObject(this);
+ return retval;
+ }
+ sent_parentp->addChild(this);
+ // make sure this object gets a non-damped update
+ if (sent_parentp->mDrawable.notNull())
+ {
+ gPipeline.markMoved(sent_parentp->mDrawable, FALSE); // undamped
+ }
+ }
+ }
+ else
+ {
+ sent_parentp->addChild(this);
+ }
+
+ // Show particles, icon and HUD
+ hideExtraDisplayItems( FALSE );
+
+ setChanged(MOVED | SILHOUETTE);
+ }
+ else
+ {
+ //
+ // No corresponding viewer object for the parent, put the various
+ // pieces on the orphan list.
+ //
+
+ //parent_id
+ U32 ip = mesgsys->getSenderIP();
+ U32 port = mesgsys->getSenderPort();
+
+ gObjectList.orphanize(this, parent_id, ip, port);
+
+ // Hide particles, icon and HUD
+ hideExtraDisplayItems( TRUE );
+ }
+ }
+ }
+ else
+ {
+ // BUG: this is a bad assumption once border crossing is alowed
+ if ( (parent_id == cur_parentp->mLocalID)
+ &&(update_type == OUT_TERSE_IMPROVED))
+ {
+ // Parent now, same parent in message -> do nothing
+
+ // Debugging for suspected problems with local ids.
+ //LLUUID parent_uuid;
+ //LLViewerObjectList::getUUIDFromLocal(parent_uuid, parent_id, mesgsys->getSenderIP(), mesgsys->getSenderPort() );
+ //if (parent_uuid != cur_parentp->getID() )
+ //{
+ // llerrs << "Local ID match but UUID mismatch of viewer object" << llendl;
+ //}
+ }
+ else
+ {
+ // Parented now, different parent in message
+ LLViewerObject *sent_parentp;
+ if (parent_id == 0)
+ {
+ //
+ // This object is no longer parented, we sent in a zero parent ID.
+ //
+ sent_parentp = NULL;
+ }
+ else
+ {
+ LLUUID parent_uuid;
+ LLViewerObjectList::getUUIDFromLocal(parent_uuid,
+ parent_id,
+ gMessageSystem->getSenderIP(),
+ gMessageSystem->getSenderPort());
+ sent_parentp = gObjectList.findObject(parent_uuid);
+
+ if (isAvatar())
+ {
+ // This logic is meant to handle the case where a sitting avatar has reached a new sim
+ // ahead of the object she was sitting on (which is common as objects are transfered through
+ // a slower route than agents)...
+ // In this case, the local id for the object will not be valid, since the viewer has not received
+ // a full update for the object from that sim yet, so we assume that the agent is still sitting
+ // where she was originally. --RN
+ if (!sent_parentp)
+ {
+ sent_parentp = cur_parentp;
+ }
+ }
+ else if (!sent_parentp)
+ {
+ //
+ // Switching parents, but we don't know the new parent.
+ //
+ U32 ip = mesgsys->getSenderIP();
+ U32 port = mesgsys->getSenderPort();
+
+ // We're an orphan, flag things appropriately.
+ gObjectList.orphanize(this, parent_id, ip, port);
+ }
+ }
+
+ // Reattach if possible.
+ if (sent_parentp && sent_parentp != cur_parentp && sent_parentp != this)
+ {
+ // New parent is valid, detach and reattach
+ b_changed_status = TRUE;
+ if (mDrawable.notNull())
+ {
+ if (!setDrawableParent(sent_parentp->mDrawable)) // LLViewerObject::processUpdateMessage 2
+ {
+ // Bad, we got a cycle somehow.
+ // Kill both the parent and the child, and
+ // set cache misses for both of them.
+ llwarns << "Attempting to recover from parenting cycle!" << llendl;
+ llwarns << "Killing " << sent_parentp->getID() << " and " << getID() << llendl;
+ llwarns << "Adding to cache miss list" << llendl;
+ setParent(NULL);
+ sent_parentp->setParent(NULL);
+ getRegion()->addCacheMissFull(getLocalID());
+ getRegion()->addCacheMissFull(sent_parentp->getLocalID());
+ gObjectList.killObject(sent_parentp);
+ gObjectList.killObject(this);
+ return retval;
+ }
+ // make sure this object gets a non-damped update
+ }
+ cur_parentp->removeChild(this);
+ sent_parentp->addChild(this);
+ setChanged(MOVED | SILHOUETTE);
+ sent_parentp->setChanged(MOVED | SILHOUETTE);
+ if (sent_parentp->mDrawable.notNull())
+ {
+ gPipeline.markMoved(sent_parentp->mDrawable, FALSE); // undamped
+ }
+ }
+ else if (!sent_parentp)
+ {
+ bool remove_parent = true;
+ // No new parent, or the parent that we sent doesn't exist on the viewer.
+ LLViewerObject *parentp = (LLViewerObject *)getParent();
+ if (parentp)
+ {
+ if (parentp->getRegion() != getRegion())
+ {
+ // This is probably an object flying across a region boundary, the
+ // object probably ISN'T being reparented, but just got an object
+ // update out of order (child update before parent).
+ //llinfos << "Don't reparent object handoffs!" << llendl;
+ remove_parent = false;
+ }
+ }
+
+ if (remove_parent)
+ {
+ b_changed_status = TRUE;
+ if (mDrawable.notNull())
+ {
+ // clear parent to removeChild can put the drawable on the damped list
+ setDrawableParent(NULL); // LLViewerObject::processUpdateMessage 3
+ }
+
+ cur_parentp->removeChild(this);
+
+ if (mJointInfo && !parent_id)
+ {
+ // since this object is no longer parent-relative
+ // we make sure we delete any joint info
+ delete mJointInfo;
+ mJointInfo = NULL;
+ }
+
+ setChanged(MOVED | SILHOUETTE);
+
+ if (mDrawable.notNull())
+ {
+ // make sure this object gets a non-damped update
+ gPipeline.markMoved(mDrawable, FALSE); // undamped
+ }
+ }
+ }
+ }
+ }
+ }
+
+ new_rot.normQuat();
+
+ if (sPingInterpolate)
+ {
+ LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mesgsys->getSender());
+ if (cdp)
+ {
+ F32 ping_delay = 0.5f * mTimeDilation * ( ((F32)cdp->getPingDelay()) * 0.001f + gFrameDTClamped);
+ LLVector3 diff = getVelocity() * ping_delay;
+ new_pos_parent += diff;
+ }
+ else
+ {
+ llwarns << "findCircuit() returned NULL; skipping interpolation" << llendl;
+ }
+ }
+
+ //////////////////////////
+ //
+ // Set the generic change flags...
+ //
+ //
+
+ // WTF? If we're going to skip this message, why are we
+ // doing all the parenting, etc above?
+ U32 packet_id = mesgsys->getCurrentRecvPacketID();
+ if (packet_id < mLatestRecvPacketID &&
+ mLatestRecvPacketID - packet_id < 65536)
+ {
+ //skip application of this message, it's old
+ return retval;
+ }
+
+ mLatestRecvPacketID = packet_id;
+
+ // Set the change flags for scale
+ if (new_scale != getScale())
+ {
+ setChanged(SCALED | SILHOUETTE);
+ setScale(new_scale); // Must follow setting permYouOwner()
+ }
+
+ // first, let's see if the new position is actually a change
+
+ //static S32 counter = 0;
+
+ F32 vel_mag_sq = getVelocity().magVecSquared();
+ F32 accel_mag_sq = getAcceleration().magVecSquared();
+
+ if ( ((b_changed_status)||(test_pos_parent != new_pos_parent))
+ ||( (!isSelected())
+ &&( (vel_mag_sq != 0.f)
+ ||(accel_mag_sq != 0.f)
+ ||(this_update_precision > mBestUpdatePrecision))))
+ {
+ mBestUpdatePrecision = this_update_precision;
+
+ LLVector3 diff = new_pos_parent - test_pos_parent ;
+ F32 mag_sqr = diff.magVecSquared() ;
+ if(llfinite(mag_sqr))
+ {
+ setPositionParent(new_pos_parent);
+ }
+ else
+ {
+ llwarns << "Can not move the object/avatar to an infinite location!" << llendl ;
+
+ retval |= INVALID_UPDATE ;
+ }
+
+ if (mParent && ((LLViewerObject*)mParent)->isAvatar())
+ {
+ // we have changed the position of an attachment, so we need to clamp it
+ LLVOAvatar *avatar = (LLVOAvatar*)mParent;
+
+ avatar->clampAttachmentPositions();
+ }
+
+ // If we're snapping the position by more than 0.5m, update LLViewerStats::mAgentPositionSnaps
+ if ( asAvatar() && asAvatar()->isSelf() && (mag_sqr > 0.25f) )
+ {
+ LLViewerStats::getInstance()->mAgentPositionSnaps.push( diff.length() );
+ }
+ }
+
+ if (new_rot != mLastRot
+ || new_angv != old_angv)
+ {
+ if (new_rot != mLastRot)
+ {
+ mLastRot = new_rot;
+ setRotation(new_rot);
+ }
+
+ setChanged(ROTATED | SILHOUETTE);
+
+ resetRot();
+ }
+
+
+ if ( gShowObjectUpdates )
+ {
+ if (!((mPrimitiveCode == LL_PCODE_LEGACY_AVATAR) && (((LLVOAvatar *) this)->isSelf()))
+ && mRegionp)
+ {
+ LLViewerObject* object = gObjectList.createObjectViewer(LL_PCODE_LEGACY_TEXT_BUBBLE, mRegionp);
+ LLVOTextBubble* bubble = (LLVOTextBubble*) object;
+
+ if (update_type == OUT_TERSE_IMPROVED)
+ {
+ bubble->mColor.setVec(0.f, 0.f, 1.f, 1.f);
+ }
+ else
+ {
+ bubble->mColor.setVec(1.f, 0.f, 0.f, 1.f);
+ }
+ object->setPositionGlobal(getPositionGlobal());
+ gPipeline.addObject(object);
+ }
+ }
+
+ if ((0.0f == vel_mag_sq) &&
+ (0.0f == accel_mag_sq) &&
+ (0.0f == getAngularVelocity().magVecSquared()))
+ {
+ mStatic = TRUE; // This object doesn't move!
+ }
+ else
+ {
+ mStatic = FALSE;
+ }
+
+// BUG: This code leads to problems during group rotate and any scale operation.
+// Small discepencies between the simulator and viewer representations cause the
+// selection center to creep, leading to objects moving around the wrong center.
+//
+// Removing this, however, means that if someone else drags an object you have
+// selected, your selection center and dialog boxes will be wrong. It also means
+// that higher precision information on selected objects will be ignored.
+//
+// I believe the group rotation problem is fixed. JNC 1.21.2002
+//
+ // Additionally, if any child is selected, need to update the dialogs and selection
+ // center.
+ BOOL needs_refresh = mUserSelected;
+ for (child_list_t::iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* child = *iter;
+ needs_refresh = needs_refresh || child->mUserSelected;
+ }
+
+ if (needs_refresh)
+ {
+ LLSelectMgr::getInstance()->updateSelectionCenter();
+ dialog_refresh_all();
+ }
+
+
+ // Mark update time as approx. now, with the ping delay.
+ // Ping delay is off because it's not set for velocity interpolation, causing
+ // much jumping and hopping around...
+
+// U32 ping_delay = mesgsys->mCircuitInfo.getPingDelay();
+ mLastInterpUpdateSecs = LLFrameTimer::getElapsedSeconds();
+ mLastMessageUpdateSecs = mLastInterpUpdateSecs;
+ if (mDrawable.notNull())
+ {
+ // Don't clear invisibility flag on update if still orphaned!
+ if (mDrawable->isState(LLDrawable::FORCE_INVISIBLE) && !mOrphaned)
+ {
+// lldebugs << "Clearing force invisible: " << mID << ":" << getPCodeString() << ":" << getPositionAgent() << llendl;
+ mDrawable->setState(LLDrawable::CLEAR_INVISIBLE);
+ }
+ }
+
+ // Update special hover cursor status
+ bool special_hover_cursor = specialHoverCursor();
+ if (old_special_hover_cursor != special_hover_cursor
+ && mDrawable.notNull())
+ {
+ mDrawable->updateSpecialHoverCursor(special_hover_cursor);
+ }
+
+ return retval;
+}
+
+BOOL LLViewerObject::isActive() const
+{
+ return TRUE;
+}
+
+
+
+BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
+{
+ static LLFastTimer::DeclareTimer ftm("Viewer Object");
+ LLFastTimer t(ftm);
+
+ if (mDead)
+ {
+ // It's dead. Don't update it.
+ return TRUE;
+ }
+
+ // CRO - don't velocity interp linked objects!
+ // Leviathan - but DO velocity interp joints
+ if (!mStatic && sVelocityInterpolate && !isSelected())
+ {
+ // calculate dt from last update
+ F32 dt_raw = (F32)(time - mLastInterpUpdateSecs);
+ F32 dt = mTimeDilation * dt_raw;
+
+ if (!mJointInfo)
+ {
+ applyAngularVelocity(dt);
+ }
+
+ LLViewerObject *parentp = (LLViewerObject *) getParent();
+ if (mJointInfo)
+ {
+ if (parentp)
+ {
+ // do parent-relative stuff
+ LLVector3 ang_vel = getAngularVelocity();
+ F32 omega = ang_vel.magVecSquared();
+ F32 angle = 0.0f;
+ LLQuaternion dQ;
+ if (omega > 0.00001f)
+ {
+ omega = sqrt(omega);
+ angle = omega * dt;
+ dQ.setQuat(angle, ang_vel);
+ }
+ LLVector3 pos = getPosition();
+
+ if (HJT_HINGE == mJointInfo->mJointType)
+ {
+ // hinge = uniform circular motion
+ LLVector3 parent_pivot = getVelocity();
+ LLVector3 parent_axis = getAcceleration();
+
+ angle = dt * (ang_vel * mJointInfo->mAxisOrAnchor); // AxisOrAnchor = axis
+ dQ.setQuat(angle, mJointInfo->mAxisOrAnchor); // AxisOrAnchor = axis
+ LLVector3 pivot_offset = pos - mJointInfo->mPivot; // pos in pivot-frame
+ pivot_offset = pivot_offset * dQ; // new rotated pivot-frame pos
+ pos = mJointInfo->mPivot + pivot_offset; // parent-frame
+ LLViewerObject::setPosition(pos);
+ LLQuaternion Q_PC = getRotation();
+ setRotation(Q_PC * dQ);
+ mLastInterpUpdateSecs = time;
+ }
+ else if (HJT_POINT == mJointInfo->mJointType)
+ // || HJT_LPOINT == mJointInfo->mJointType)
+ {
+ // point-to-point = spin about axis and uniform circular motion
+ // of axis about the pivot point
+ //
+ // NOTE: this interpolation scheme is not quite good enough to
+ // reduce the bandwidth -- needs a gravitational correction.
+ // Similarly for hinges with axes that deviate from vertical.
+
+ LLQuaternion Q_PC = getRotation();
+ Q_PC = Q_PC * dQ;
+ setRotation(Q_PC);
+
+ LLVector3 pivot_to_child = - mJointInfo->mAxisOrAnchor; // AxisOrAnchor = anchor
+ pos = mJointInfo->mPivot + pivot_to_child * Q_PC;
+ LLViewerObject::setPosition(pos);
+ mLastInterpUpdateSecs = time;
+ }
+ /* else if (HJT_WHEEL == mJointInfo->mJointInfo)
+ {
+ // wheel = uniform rotation about axis, with linear
+ // velocity interpolation (if any)
+ LLVector3 parent_axis = getAcceleration(); // HACK -- accel stores the parent-axis (parent-frame)
+
+ LLQuaternion Q_PC = getRotation();
+
+ angle = dt * (parent_axis * ang_vel);
+ dQ.setQuat(angle, parent_axis);
+
+ Q_PC = Q_PC * dQ;
+ setRotation(Q_PC);
+
+ pos = getPosition() + dt * getVelocity();
+ LLViewerObject::setPosition(pos);
+ mLastInterpUpdateSecs = time;
+ }*/
+ }
+ }
+ else if (isAttachment())
+ {
+ mLastInterpUpdateSecs = time;
+ return TRUE;
+ }
+ else
+ { // Move object based on it's velocity and rotation
+ interpolateLinearMotion(time, dt);
+ }
+ }
+
+ updateDrawable(FALSE);
+
+ return TRUE;
+}
+
+
+// Move an object due to idle-time viewer side updates by iterpolating motion
+void LLViewerObject::interpolateLinearMotion(const F64 & time, const F32 & dt)
+{
+ // linear motion
+ // PHYSICS_TIMESTEP is used below to correct for the fact that the velocity in object
+ // updates represents the average velocity of the last timestep, rather than the final velocity.
+ // the time dilation above should guarantee that dt is never less than PHYSICS_TIMESTEP, theoretically
+ //
+ // *TODO: should also wrap linear accel/velocity in check
+ // to see if object is selected, instead of explicitly
+ // zeroing it out
+
+ F64 time_since_last_update = time - mLastMessageUpdateSecs;
+ if (time_since_last_update <= 0.0 || dt <= 0.f)
+ {
+ return;
+ }
+
+ LLVector3 accel = getAcceleration();
+ LLVector3 vel = getVelocity();
+
+ if (sMaxUpdateInterpolationTime <= 0.0)
+ { // Old code path ... unbounded, simple interpolation
+ if (!(accel.isExactlyZero() && vel.isExactlyZero()))
+ {
+ LLVector3 pos = (vel + (0.5f * (dt-PHYSICS_TIMESTEP)) * accel) * dt;
+
+ // region local
+ setPositionRegion(pos + getPositionRegion());
+ setVelocity(vel + accel*dt);
+
+ // for objects that are spinning but not translating, make sure to flag them as having moved
+ setChanged(MOVED | SILHOUETTE);
+ }
+ }
+ else if (!accel.isExactlyZero() || !vel.isExactlyZero()) // object is moving
+ { // Object is moving, and hasn't been too long since we got an update from the server
+
+ // Calculate predicted position and velocity
+ LLVector3 new_pos = (vel + (0.5f * (dt-PHYSICS_TIMESTEP)) * accel) * dt;
+ LLVector3 new_v = accel * dt;
+
+ if (time_since_last_update > sPhaseOutUpdateInterpolationTime &&
+ sPhaseOutUpdateInterpolationTime > 0.0)
+ { // Haven't seen a viewer update in a while, check to see if the ciruit is still active
+ if (mRegionp)
+ { // The simulator will NOT send updates if the object continues normally on the path
+ // predicted by the velocity and the acceleration (often gravity) sent to the viewer
+ // So check to see if the circuit is blocked, which means the sim is likely in a long lag
+ LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit( mRegionp->getHost() );
+ if (cdp)
+ {
+ // Find out how many seconds since last packet arrived on the circuit
+ F64 time_since_last_packet = LLMessageSystem::getMessageTimeSeconds() - cdp->getLastPacketInTime();
+
+ if (!cdp->isAlive() || // Circuit is dead or blocked
+ cdp->isBlocked() || // or doesn't seem to be getting any packets
+ (time_since_last_packet > sPhaseOutUpdateInterpolationTime))
+ {
+ // Start to reduce motion interpolation since we haven't seen a server update in a while
+ F64 time_since_last_interpolation = time - mLastInterpUpdateSecs;
+ F64 phase_out = 1.0;
+ if (time_since_last_update > sMaxUpdateInterpolationTime)
+ { // Past the time limit, so stop the object
+ phase_out = 0.0;
+ //llinfos << "Motion phase out to zero" << llendl;
+
+ // Kill angular motion as well. Note - not adding this due to paranoia
+ // about stopping rotation for llTargetOmega objects and not having it restart
+ // setAngularVelocity(LLVector3::zero);
+ }
+ else if (mLastInterpUpdateSecs - mLastMessageUpdateSecs > sPhaseOutUpdateInterpolationTime)
+ { // Last update was already phased out a bit
+ phase_out = (sMaxUpdateInterpolationTime - time_since_last_update) /
+ (sMaxUpdateInterpolationTime - time_since_last_interpolation);
+ //llinfos << "Continuing motion phase out of " << (F32) phase_out << llendl;
+ }
+ else
+ { // Phase out from full value
+ phase_out = (sMaxUpdateInterpolationTime - time_since_last_update) /
+ (sMaxUpdateInterpolationTime - sPhaseOutUpdateInterpolationTime);
+ //llinfos << "Starting motion phase out of " << (F32) phase_out << llendl;
+ }
+ phase_out = llclamp(phase_out, 0.0, 1.0);
+
+ new_pos = new_pos * ((F32) phase_out);
+ new_v = new_v * ((F32) phase_out);
+ }
+ }
+ }
+ }
+
+ new_pos = new_pos + getPositionRegion();
+ new_v = new_v + vel;
+
+
+ // Clamp interpolated position to minimum underground and maximum region height
+ LLVector3d new_pos_global = mRegionp->getPosGlobalFromRegion(new_pos);
+ F32 min_height;
+ if (isAvatar())
+ { // Make a better guess about AVs not going underground
+ min_height = LLWorld::getInstance()->resolveLandHeightGlobal(new_pos_global);
+ min_height += (0.5f * getScale().mV[VZ]);
+ }
+ else
+ { // This will put the object underground, but we can't tell if it will stop
+ // at ground level or not
+ min_height = LLWorld::getInstance()->getMinAllowedZ(this, new_pos_global);
+ }
+
+ new_pos.mV[VZ] = llmax(min_height, new_pos.mV[VZ]);
+ new_pos.mV[VZ] = llmin(LLWorld::getInstance()->getRegionMaxHeight(), new_pos.mV[VZ]);
+
+ // Check to see if it's going off the region
+ LLVector3 temp(new_pos);
+ if (temp.clamp(0.f, mRegionp->getWidth()))
+ { // Going off this region, so see if we might end up on another region
+ LLVector3d old_pos_global = mRegionp->getPosGlobalFromRegion(getPositionRegion());
+ new_pos_global = mRegionp->getPosGlobalFromRegion(new_pos); // Re-fetch in case it got clipped above
+
+ // Clip the positions to known regions
+ LLVector3d clip_pos_global = LLWorld::getInstance()->clipToVisibleRegions(old_pos_global, new_pos_global);
+ if (clip_pos_global != new_pos_global)
+ { // Was clipped, so this means we hit a edge where there is no region to enter
+
+ //llinfos << "Hit empty region edge, clipped predicted position to " << mRegionp->getPosRegionFromGlobal(clip_pos_global)
+ // << " from " << new_pos << llendl;
+ new_pos = mRegionp->getPosRegionFromGlobal(clip_pos_global);
+
+ // Stop motion and get server update for bouncing on the edge
+ new_v.clear();
+ setAcceleration(LLVector3::zero);
+ }
+ else
+ { // Let predicted movement cross into another region
+ //llinfos << "Predicting region crossing to " << new_pos << llendl;
+ }
+ }
+
+ // Set new position and velocity
+ setPositionRegion(new_pos);
+ setVelocity(new_v);
+
+ // for objects that are spinning but not translating, make sure to flag them as having moved
+ setChanged(MOVED | SILHOUETTE);
+ }
+
+ // Update the last time we did anything
+ mLastInterpUpdateSecs = time;
+}
+
+
+
+BOOL LLViewerObject::setData(const U8 *datap, const U32 data_size)
+{
+ LLMemType mt(LLMemType::MTYPE_OBJECT);
+
+ delete [] mData;
+
+ if (datap)
+ {
+ mData = new U8[data_size];
+ if (!mData)
+ {
+ return FALSE;
+ }
+ memcpy(mData, datap, data_size); /* Flawfinder: ignore */
+ }
+ return TRUE;
+}
+
+// delete an item in the inventory, but don't tell the server. This is
+// used internally by remove, update, and savescript.
+// This will only delete the first item with an item_id in the list
+void LLViewerObject::deleteInventoryItem(const LLUUID& item_id)
+{
+ if(mInventory)
+ {
+ LLInventoryObject::object_list_t::iterator it = mInventory->begin();
+ LLInventoryObject::object_list_t::iterator end = mInventory->end();
+ for( ; it != end; ++it )
+ {
+ if((*it)->getUUID() == item_id)
+ {
+ // This is safe only because we return immediatly.
+ mInventory->erase(it); // will deref and delete it
+ return;
+ }
+ }
+ doInventoryCallback();
+ }
+}
+
+void LLViewerObject::doUpdateInventory(
+ LLPointer<LLViewerInventoryItem>& item,
+ U8 key,
+ bool is_new)
+{
+ LLMemType mt(LLMemType::MTYPE_OBJECT);
+
+ LLViewerInventoryItem* old_item = NULL;
+ if(TASK_INVENTORY_ITEM_KEY == key)
+ {
+ old_item = (LLViewerInventoryItem*)getInventoryObject(item->getUUID());
+ }
+ else if(TASK_INVENTORY_ASSET_KEY == key)
+ {
+ old_item = getInventoryItemByAsset(item->getAssetUUID());
+ }
+ LLUUID item_id;
+ LLUUID new_owner;
+ LLUUID new_group;
+ BOOL group_owned = FALSE;
+ if(old_item)
+ {
+ item_id = old_item->getUUID();
+ new_owner = old_item->getPermissions().getOwner();
+ new_group = old_item->getPermissions().getGroup();
+ group_owned = old_item->getPermissions().isGroupOwned();
+ old_item = NULL;
+ }
+ else
+ {
+ item_id = item->getUUID();
+ }
+ if(!is_new && mInventory)
+ {
+ // Attempt to update the local inventory. If we can get the
+ // object perm, we have perfect visibility, so we want the
+ // serial number to match. Otherwise, take our best guess and
+ // make sure that the serial number does not match.
+ deleteInventoryItem(item_id);
+ LLPermissions perm(item->getPermissions());
+ LLPermissions* obj_perm = LLSelectMgr::getInstance()->findObjectPermissions(this);
+ bool is_atomic = ((S32)LLAssetType::AT_OBJECT == item->getType()) ? false : true;
+ if(obj_perm)
+ {
+ perm.setOwnerAndGroup(LLUUID::null, obj_perm->getOwner(), obj_perm->getGroup(), is_atomic);
+ }
+ else
+ {
+ if(group_owned)
+ {
+ perm.setOwnerAndGroup(LLUUID::null, new_owner, new_group, is_atomic);
+ }
+ else if(!new_owner.isNull())
+ {
+ // The object used to be in inventory, so we can
+ // assume the owner and group will match what they are
+ // there.
+ perm.setOwnerAndGroup(LLUUID::null, new_owner, new_group, is_atomic);
+ }
+ // *FIX: can make an even better guess by using the mPermGroup flags
+ else if(permYouOwner())
+ {
+ // best guess.
+ perm.setOwnerAndGroup(LLUUID::null, gAgent.getID(), item->getPermissions().getGroup(), is_atomic);
+ --mInventorySerialNum;
+ }
+ else
+ {
+ // dummy it up.
+ perm.setOwnerAndGroup(LLUUID::null, LLUUID::null, LLUUID::null, is_atomic);
+ --mInventorySerialNum;
+ }
+ }
+ LLViewerInventoryItem* oldItem = item;
+ LLViewerInventoryItem* new_item = new LLViewerInventoryItem(oldItem);
+ new_item->setPermissions(perm);
+ mInventory->push_front(new_item);
+ doInventoryCallback();
+ ++mInventorySerialNum;
+ }
+}
+
+// save a script, which involves removing the old one, and rezzing
+// in the new one. This method should be called with the asset id
+// of the new and old script AFTER the bytecode has been saved.
+void LLViewerObject::saveScript(
+ const LLViewerInventoryItem* item,
+ BOOL active,
+ bool is_new)
+{
+ LLMemType mt(LLMemType::MTYPE_OBJECT);
+
+ /*
+ * XXXPAM Investigate not making this copy. Seems unecessary, but I'm unsure about the
+ * interaction with doUpdateInventory() called below.
+ */
+ lldebugs << "LLViewerObject::saveScript() " << item->getUUID() << " " << item->getAssetUUID() << llendl;
+ LLPointer<LLViewerInventoryItem> task_item =
+ new LLViewerInventoryItem(item->getUUID(), mID, item->getPermissions(),
+ item->getAssetUUID(), item->getType(),
+ item->getInventoryType(),
+ item->getName(), item->getDescription(),
+ item->getSaleInfo(), item->getFlags(),
+ item->getCreationDate());
+ task_item->setTransactionID(item->getTransactionID());
+
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_RezScript);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID());
+ msg->nextBlockFast(_PREHASH_UpdateBlock);
+ msg->addU32Fast(_PREHASH_ObjectLocalID, (mLocalID));
+ U8 enabled = active;
+ msg->addBOOLFast(_PREHASH_Enabled, enabled);
+ msg->nextBlockFast(_PREHASH_InventoryBlock);
+ task_item->packMessage(msg);
+ msg->sendReliable(mRegionp->getHost());
+
+ // do the internal logic
+ doUpdateInventory(task_item, TASK_INVENTORY_ITEM_KEY, is_new);
+}
+
+void LLViewerObject::moveInventory(const LLUUID& folder_id,
+ const LLUUID& item_id)
+{
+ lldebugs << "LLViewerObject::moveInventory " << item_id << llendl;
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_MoveTaskInventory);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->addUUIDFast(_PREHASH_FolderID, folder_id);
+ msg->nextBlockFast(_PREHASH_InventoryData);
+ msg->addU32Fast(_PREHASH_LocalID, mLocalID);
+ msg->addUUIDFast(_PREHASH_ItemID, item_id);
+ msg->sendReliable(mRegionp->getHost());
+
+ LLInventoryObject* inv_obj = getInventoryObject(item_id);
+ if(inv_obj)
+ {
+ LLViewerInventoryItem* item = (LLViewerInventoryItem*)inv_obj;
+ if(!item->getPermissions().allowCopyBy(gAgent.getID()))
+ {
+ deleteInventoryItem(item_id);
+ ++mInventorySerialNum;
+ }
+ }
+}
+
+void LLViewerObject::dirtyInventory()
+{
+ // If there aren't any LLVOInventoryListeners, we won't be
+ // able to update our mInventory when it comes back from the
+ // simulator, so we should not clear the inventory either.
+ if(mInventory && !mInventoryCallbacks.empty())
+ {
+ mInventory->clear(); // will deref and delete entries
+ delete mInventory;
+ mInventory = NULL;
+ mInventoryDirty = TRUE;
+ }
+}
+
+void LLViewerObject::registerInventoryListener(LLVOInventoryListener* listener, void* user_data)
+{
+ LLMemType mt(LLMemType::MTYPE_OBJECT);
+
+ LLInventoryCallbackInfo* info = new LLInventoryCallbackInfo;
+ info->mListener = listener;
+ info->mInventoryData = user_data;
+ mInventoryCallbacks.push_front(info);
+}
+
+void LLViewerObject::removeInventoryListener(LLVOInventoryListener* listener)
+{
+ if (listener == NULL)
+ return;
+ for (callback_list_t::iterator iter = mInventoryCallbacks.begin();
+ iter != mInventoryCallbacks.end(); )
+ {
+ callback_list_t::iterator curiter = iter++;
+ LLInventoryCallbackInfo* info = *curiter;
+ if (info->mListener == listener)
+ {
+ delete info;
+ mInventoryCallbacks.erase(curiter);
+ break;
+ }
+ }
+}
+
+void LLViewerObject::clearInventoryListeners()
+{
+ for_each(mInventoryCallbacks.begin(), mInventoryCallbacks.end(), DeletePointer());
+ mInventoryCallbacks.clear();
+}
+
+void LLViewerObject::requestInventory()
+{
+ mInventoryDirty = FALSE;
+ if(mInventory)
+ {
+ //mInventory->clear() // will deref and delete it
+ //delete mInventory;
+ //mInventory = NULL;
+ doInventoryCallback();
+ }
+ // throw away duplicate requests
+ else
+ {
+ fetchInventoryFromServer();
+ }
+}
+
+void LLViewerObject::fetchInventoryFromServer()
+{
+ if (!mInventoryPending)
+ {
+ delete mInventory;
+ mInventory = NULL;
+ mInventoryDirty = FALSE;
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_RequestTaskInventory);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_InventoryData);
+ msg->addU32Fast(_PREHASH_LocalID, mLocalID);
+ msg->sendReliable(mRegionp->getHost());
+
+ // this will get reset by dirtyInventory or doInventoryCallback
+ mInventoryPending = TRUE;
+ }
+}
+
+struct LLFilenameAndTask
+{
+ LLUUID mTaskID;
+ std::string mFilename;
+#ifdef _DEBUG
+ static S32 sCount;
+ LLFilenameAndTask()
+ {
+ ++sCount;
+ lldebugs << "Constructing LLFilenameAndTask: " << sCount << llendl;
+ }
+ ~LLFilenameAndTask()
+ {
+ --sCount;
+ lldebugs << "Destroying LLFilenameAndTask: " << sCount << llendl;
+ }
+private:
+ LLFilenameAndTask(const LLFilenameAndTask& rhs);
+ const LLFilenameAndTask& operator=(const LLFilenameAndTask& rhs) const;
+#endif
+};
+
+#ifdef _DEBUG
+S32 LLFilenameAndTask::sCount = 0;
+#endif
+
+// static
+void LLViewerObject::processTaskInv(LLMessageSystem* msg, void** user_data)
+{
+ LLMemType mt(LLMemType::MTYPE_OBJECT);
+
+ LLUUID task_id;
+ msg->getUUIDFast(_PREHASH_InventoryData, _PREHASH_TaskID, task_id);
+ LLViewerObject* object = gObjectList.findObject(task_id);
+ if(!object)
+ {
+ llwarns << "LLViewerObject::processTaskInv object "
+ << task_id << " does not exist." << llendl;
+ return;
+ }
+
+ msg->getS16Fast(_PREHASH_InventoryData, _PREHASH_Serial, object->mInventorySerialNum);
+ LLFilenameAndTask* ft = new LLFilenameAndTask;
+ ft->mTaskID = task_id;
+
+ std::string unclean_filename;
+ msg->getStringFast(_PREHASH_InventoryData, _PREHASH_Filename, unclean_filename);
+ ft->mFilename = LLDir::getScrubbedFileName(unclean_filename);
+
+ if(ft->mFilename.empty())
+ {
+ lldebugs << "Task has no inventory" << llendl;
+ // mock up some inventory to make a drop target.
+ if(object->mInventory)
+ {
+ object->mInventory->clear(); // will deref and delete it
+ }
+ else
+ {
+ object->mInventory = new LLInventoryObject::object_list_t();
+ }
+ LLPointer<LLInventoryObject> obj;
+ obj = new LLInventoryObject(object->mID, LLUUID::null,
+ LLAssetType::AT_CATEGORY,
+ LLTrans::getString("ViewerObjectContents").c_str());
+ object->mInventory->push_front(obj);
+ object->doInventoryCallback();
+ delete ft;
+ return;
+ }
+ gXferManager->requestFile(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ft->mFilename),
+ ft->mFilename, LL_PATH_CACHE,
+ object->mRegionp->getHost(),
+ TRUE,
+ &LLViewerObject::processTaskInvFile,
+ (void**)ft,
+ LLXferManager::HIGH_PRIORITY);
+}
+
+void LLViewerObject::processTaskInvFile(void** user_data, S32 error_code, LLExtStat ext_status)
+{
+ LLFilenameAndTask* ft = (LLFilenameAndTask*)user_data;
+ LLViewerObject* object = NULL;
+ if(ft && (0 == error_code) &&
+ (object = gObjectList.findObject(ft->mTaskID)))
+ {
+ object->loadTaskInvFile(ft->mFilename);
+ }
+ else
+ {
+ // This Occurs When to requests were made, and the first one
+ // has already handled it.
+ lldebugs << "Problem loading task inventory. Return code: "
+ << error_code << llendl;
+ }
+ delete ft;
+}
+
+void LLViewerObject::loadTaskInvFile(const std::string& filename)
+{
+ LLMemType mt(LLMemType::MTYPE_OBJECT);
+
+ std::string filename_and_local_path = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, filename);
+ llifstream ifs(filename_and_local_path);
+ if(ifs.good())
+ {
+ char buffer[MAX_STRING]; /* Flawfinder: ignore */
+ // *NOTE: This buffer size is hard coded into scanf() below.
+ char keyword[MAX_STRING]; /* Flawfinder: ignore */
+ if(mInventory)
+ {
+ mInventory->clear(); // will deref and delete it
+ }
+ else
+ {
+ mInventory = new LLInventoryObject::object_list_t;
+ }
+ while(ifs.good())
+ {
+ ifs.getline(buffer, MAX_STRING);
+ sscanf(buffer, " %254s", keyword); /* Flawfinder: ignore */
+ if(0 == strcmp("inv_item", keyword))
+ {
+ LLPointer<LLInventoryObject> inv = new LLViewerInventoryItem;
+ inv->importLegacyStream(ifs);
+ mInventory->push_front(inv);
+ }
+ else if(0 == strcmp("inv_object", keyword))
+ {
+ LLPointer<LLInventoryObject> inv = new LLInventoryObject;
+ inv->importLegacyStream(ifs);
+ inv->rename(LLTrans::getString("ViewerObjectContents").c_str());
+ mInventory->push_front(inv);
+ }
+ else
+ {
+ llwarns << "Unknown token in inventory file '"
+ << keyword << "'" << llendl;
+ }
+ }
+ ifs.close();
+ LLFile::remove(filename_and_local_path);
+ }
+ else
+ {
+ llwarns << "unable to load task inventory: " << filename_and_local_path
+ << llendl;
+ }
+ doInventoryCallback();
+}
+
+void LLViewerObject::doInventoryCallback()
+{
+ for (callback_list_t::iterator iter = mInventoryCallbacks.begin();
+ iter != mInventoryCallbacks.end(); )
+ {
+ callback_list_t::iterator curiter = iter++;
+ LLInventoryCallbackInfo* info = *curiter;
+ if (info->mListener != NULL)
+ {
+ info->mListener->inventoryChanged(this,
+ mInventory,
+ mInventorySerialNum,
+ info->mInventoryData);
+ }
+ else
+ {
+ llinfos << "LLViewerObject::doInventoryCallback() deleting bad listener entry." << llendl;
+ delete info;
+ mInventoryCallbacks.erase(curiter);
+ }
+ }
+ mInventoryPending = FALSE;
+}
+
+void LLViewerObject::removeInventory(const LLUUID& item_id)
+{
+ // close any associated floater properties
+ LLFloaterReg::hideInstance("properties", item_id);
+
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_RemoveTaskInventory);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_InventoryData);
+ msg->addU32Fast(_PREHASH_LocalID, mLocalID);
+ msg->addUUIDFast(_PREHASH_ItemID, item_id);
+ msg->sendReliable(mRegionp->getHost());
+ deleteInventoryItem(item_id);
+ ++mInventorySerialNum;
+}
+
+void LLViewerObject::updateInventory(
+ LLViewerInventoryItem* item,
+ U8 key,
+ bool is_new)
+{
+ LLMemType mt(LLMemType::MTYPE_OBJECT);
+
+ // This slices the object into what we're concerned about on the
+ // viewer. The simulator will take the permissions and transfer
+ // ownership.
+ LLPointer<LLViewerInventoryItem> task_item =
+ new LLViewerInventoryItem(item->getUUID(), mID, item->getPermissions(),
+ item->getAssetUUID(), item->getType(),
+ item->getInventoryType(),
+ item->getName(), item->getDescription(),
+ item->getSaleInfo(),
+ item->getFlags(),
+ item->getCreationDate());
+ task_item->setTransactionID(item->getTransactionID());
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_UpdateTaskInventory);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_UpdateData);
+ msg->addU32Fast(_PREHASH_LocalID, mLocalID);
+ msg->addU8Fast(_PREHASH_Key, key);
+ msg->nextBlockFast(_PREHASH_InventoryData);
+ task_item->packMessage(msg);
+ msg->sendReliable(mRegionp->getHost());
+
+ // do the internal logic
+ doUpdateInventory(task_item, key, is_new);
+}
+
+void LLViewerObject::updateInventoryLocal(LLInventoryItem* item, U8 key)
+{
+ LLPointer<LLViewerInventoryItem> task_item =
+ new LLViewerInventoryItem(item->getUUID(), mID, item->getPermissions(),
+ item->getAssetUUID(), item->getType(),
+ item->getInventoryType(),
+ item->getName(), item->getDescription(),
+ item->getSaleInfo(), item->getFlags(),
+ item->getCreationDate());
+
+ // do the internal logic
+ const bool is_new = false;
+ doUpdateInventory(task_item, key, is_new);
+}
+
+LLInventoryObject* LLViewerObject::getInventoryObject(const LLUUID& item_id)
+{
+ LLInventoryObject* rv = NULL;
+ if(mInventory)
+ {
+ LLInventoryObject::object_list_t::iterator it = mInventory->begin();
+ LLInventoryObject::object_list_t::iterator end = mInventory->end();
+ for ( ; it != end; ++it)
+ {
+ if((*it)->getUUID() == item_id)
+ {
+ rv = *it;
+ break;
+ }
+ }
+ }
+ return rv;
+}
+
+void LLViewerObject::getInventoryContents(LLInventoryObject::object_list_t& objects)
+{
+ if(mInventory)
+ {
+ LLInventoryObject::object_list_t::iterator it = mInventory->begin();
+ LLInventoryObject::object_list_t::iterator end = mInventory->end();
+ for( ; it != end; ++it)
+ {
+ if ((*it)->getType() != LLAssetType::AT_CATEGORY)
+ {
+ objects.push_back(*it);
+ }
+ }
+ }
+}
+
+LLInventoryObject* LLViewerObject::getInventoryRoot()
+{
+ if (!mInventory || !mInventory->size())
+ {
+ return NULL;
+ }
+ return mInventory->back();
+}
+
+LLViewerInventoryItem* LLViewerObject::getInventoryItemByAsset(const LLUUID& asset_id)
+{
+ if (mInventoryDirty)
+ llwarns << "Peforming inventory lookup for object " << mID << " that has dirty inventory!" << llendl;
+
+ LLViewerInventoryItem* rv = NULL;
+ if(mInventory)
+ {
+ LLViewerInventoryItem* item = NULL;
+
+ LLInventoryObject::object_list_t::iterator it = mInventory->begin();
+ LLInventoryObject::object_list_t::iterator end = mInventory->end();
+ for( ; it != end; ++it)
+ {
+ LLInventoryObject* obj = *it;
+ if(obj->getType() != LLAssetType::AT_CATEGORY)
+ {
+ // *FIX: gank-ass down cast!
+ item = (LLViewerInventoryItem*)obj;
+ if(item->getAssetUUID() == asset_id)
+ {
+ rv = item;
+ break;
+ }
+ }
+ }
+ }
+ return rv;
+}
+
+void LLViewerObject::updateViewerInventoryAsset(
+ const LLViewerInventoryItem* item,
+ const LLUUID& new_asset)
+{
+ LLPointer<LLViewerInventoryItem> task_item =
+ new LLViewerInventoryItem(item);
+ task_item->setAssetUUID(new_asset);
+
+ // do the internal logic
+ doUpdateInventory(task_item, TASK_INVENTORY_ITEM_KEY, false);
+}
+
+void LLViewerObject::setPixelAreaAndAngle(LLAgent &agent)
+{
+ if (getVolume())
+ { //volumes calculate pixel area and angle per face
+ return;
+ }
+
+ LLVector3 viewer_pos_agent = gAgentCamera.getCameraPositionAgent();
+ LLVector3 pos_agent = getRenderPosition();
+
+ F32 dx = viewer_pos_agent.mV[VX] - pos_agent.mV[VX];
+ F32 dy = viewer_pos_agent.mV[VY] - pos_agent.mV[VY];
+ F32 dz = viewer_pos_agent.mV[VZ] - pos_agent.mV[VZ];
+
+ F32 max_scale = getMaxScale();
+ F32 mid_scale = getMidScale();
+ F32 min_scale = getMinScale();
+
+ // IW: estimate - when close to large objects, computing range based on distance from center is no good
+ // to try to get a min distance from face, subtract min_scale/2 from the range.
+ // This means we'll load too much detail sometimes, but that's better than not enough
+ // I don't think there's a better way to do this without calculating distance per-poly
+ F32 range = sqrt(dx*dx + dy*dy + dz*dz) - min_scale/2;
+
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
+ if (range < 0.001f || isHUDAttachment()) // range == zero
+ {
+ mAppAngle = 180.f;
+ mPixelArea = (F32)camera->getScreenPixelArea();
+ }
+ else
+ {
+ mAppAngle = (F32) atan2( max_scale, range) * RAD_TO_DEG;
+
+ F32 pixels_per_meter = camera->getPixelMeterRatio() / range;
+
+ mPixelArea = (pixels_per_meter * max_scale) * (pixels_per_meter * mid_scale);
+ if (mPixelArea > camera->getScreenPixelArea())
+ {
+ mAppAngle = 180.f;
+ mPixelArea = (F32)camera->getScreenPixelArea();
+ }
+ }
+}
+
+BOOL LLViewerObject::updateLOD()
+{
+ return FALSE;
+}
+
+BOOL LLViewerObject::updateGeometry(LLDrawable *drawable)
+{
+ return TRUE;
+}
+
+void LLViewerObject::updateGL()
+{
+
+}
+
+void LLViewerObject::updateFaceSize(S32 idx)
+{
+
+}
+
+LLDrawable* LLViewerObject::createDrawable(LLPipeline *pipeline)
+{
+ return NULL;
+}
+
+void LLViewerObject::setScale(const LLVector3 &scale, BOOL damped)
+{
+ LLPrimitive::setScale(scale);
+ if (mDrawable.notNull())
+ {
+ //encompass completely sheared objects by taking
+ //the most extreme point possible (<1,1,0.5>)
+ mDrawable->setRadius(LLVector3(1,1,0.5f).scaleVec(scale).magVec());
+ updateDrawable(damped);
+ }
+
+ if( (LL_PCODE_VOLUME == getPCode()) && !isDead() )
+ {
+ if (permYouOwner() || (scale.magVecSquared() > (7.5f * 7.5f)) )
+ {
+ if (!mOnMap)
+ {
+ llassert_always(LLWorld::getInstance()->getRegionFromHandle(getRegion()->getHandle()));
+
+ gObjectList.addToMap(this);
+ mOnMap = TRUE;
+ }
+ }
+ else
+ {
+ if (mOnMap)
+ {
+ gObjectList.removeFromMap(this);
+ mOnMap = FALSE;
+ }
+ }
+ }
+}
+
+void LLViewerObject::setObjectCost(F32 cost)
+{
+ mObjectCost = cost;
+ mCostStale = false;
+
+ if (isSelected())
+ {
+ gFloaterTools->dirty();
+ }
+}
+
+void LLViewerObject::setLinksetCost(F32 cost)
+{
+ mLinksetCost = cost;
+ mCostStale = false;
+
+ if (isSelected())
+ {
+ gFloaterTools->dirty();
+ }
+}
+
+void LLViewerObject::setPhysicsCost(F32 cost)
+{
+ mPhysicsCost = cost;
+ mCostStale = false;
+
+ if (isSelected())
+ {
+ gFloaterTools->dirty();
+ }
+}
+
+void LLViewerObject::setLinksetPhysicsCost(F32 cost)
+{
+ mLinksetPhysicsCost = cost;
+ mCostStale = false;
+
+ if (isSelected())
+ {
+ gFloaterTools->dirty();
+ }
+}
+
+
+F32 LLViewerObject::getObjectCost()
+{
+ if (mCostStale)
+ {
+ gObjectList.updateObjectCost(this);
+ }
+
+ return mObjectCost;
+}
+
+F32 LLViewerObject::getLinksetCost()
+{
+ if (mCostStale)
+ {
+ gObjectList.updateObjectCost(this);
+ }
+
+ return mLinksetCost;
+}
+
+F32 LLViewerObject::getPhysicsCost()
+{
+ if (mCostStale)
+ {
+ gObjectList.updateObjectCost(this);
+ }
+
+ return mPhysicsCost;
+}
+
+F32 LLViewerObject::getLinksetPhysicsCost()
+{
+ if (mCostStale)
+ {
+ gObjectList.updateObjectCost(this);
+ }
+
+ return mLinksetPhysicsCost;
+}
+
+F32 LLViewerObject::getStreamingCost(S32* bytes, S32* visible_bytes)
+{
+ return 0.f;
+}
+
+U32 LLViewerObject::getTriangleCount()
+{
+ return 0;
+}
+
+U32 LLViewerObject::getHighLODTriangleCount()
+{
+ return 0;
+}
+
+void LLViewerObject::updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax)
+{
+ LLVector4a center;
+ center.load3(getRenderPosition().mV);
+ LLVector4a size;
+ size.load3(getScale().mV);
+ newMin.setSub(center, size);
+ newMax.setAdd(center, size);
+
+ mDrawable->setPositionGroup(center);
+}
+
+F32 LLViewerObject::getBinRadius()
+{
+ if (mDrawable.notNull())
+ {
+ const LLVector4a* ext = mDrawable->getSpatialExtents();
+ LLVector4a diff;
+ diff.setSub(ext[1], ext[0]);
+ return diff.getLength3().getF32();
+ }
+
+ return getScale().magVec();
+}
+
+F32 LLViewerObject::getMaxScale() const
+{
+ return llmax(getScale().mV[VX],getScale().mV[VY], getScale().mV[VZ]);
+}
+
+F32 LLViewerObject::getMinScale() const
+{
+ return llmin(getScale().mV[0],getScale().mV[1],getScale().mV[2]);
+}
+
+F32 LLViewerObject::getMidScale() const
+{
+ if (getScale().mV[VX] < getScale().mV[VY])
+ {
+ if (getScale().mV[VY] < getScale().mV[VZ])
+ {
+ return getScale().mV[VY];
+ }
+ else if (getScale().mV[VX] < getScale().mV[VZ])
+ {
+ return getScale().mV[VZ];
+ }
+ else
+ {
+ return getScale().mV[VX];
+ }
+ }
+ else if (getScale().mV[VX] < getScale().mV[VZ])
+ {
+ return getScale().mV[VX];
+ }
+ else if (getScale().mV[VY] < getScale().mV[VZ])
+ {
+ return getScale().mV[VZ];
+ }
+ else
+ {
+ return getScale().mV[VY];
+ }
+}
+
+
+void LLViewerObject::updateTextures()
+{
+}
+
+void LLViewerObject::boostTexturePriority(BOOL boost_children /* = TRUE */)
+{
+ if (isDead())
+ {
+ return;
+ }
+
+ S32 i;
+ S32 tex_count = getNumTEs();
+ for (i = 0; i < tex_count; i++)
+ {
+ getTEImage(i)->setBoostLevel(LLViewerTexture::BOOST_SELECTED);
+ }
+
+ if (isSculpted() && !isMesh())
+ {
+ LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+ LLUUID sculpt_id = sculpt_params->getSculptTexture();
+ LLViewerTextureManager::getFetchedTexture(sculpt_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLViewerTexture::BOOST_SELECTED);
+ }
+
+ if (boost_children)
+ {
+ for (child_list_t::iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* child = *iter;
+ child->boostTexturePriority();
+ }
+ }
+}
+
+
+void LLViewerObject::setLineWidthForWindowSize(S32 window_width)
+{
+ if (window_width < 700)
+ {
+ LLUI::setLineWidth(2.0f);
+ }
+ else if (window_width < 1100)
+ {
+ LLUI::setLineWidth(3.0f);
+ }
+ else if (window_width < 2000)
+ {
+ LLUI::setLineWidth(4.0f);
+ }
+ else
+ {
+ // _damn_, what a nice monitor!
+ LLUI::setLineWidth(5.0f);
+ }
+}
+
+void LLViewerObject::increaseArrowLength()
+{
+/* ???
+ if (mAxisArrowLength == 50)
+ {
+ mAxisArrowLength = 100;
+ }
+ else
+ {
+ mAxisArrowLength = 150;
+ }
+*/
+}
+
+
+void LLViewerObject::decreaseArrowLength()
+{
+/* ???
+ if (mAxisArrowLength == 150)
+ {
+ mAxisArrowLength = 100;
+ }
+ else
+ {
+ mAxisArrowLength = 50;
+ }
+*/
+}
+
+// Culled from newsim LLTask::addNVPair
+void LLViewerObject::addNVPair(const std::string& data)
+{
+ // cout << "LLViewerObject::addNVPair() with ---" << data << "---" << endl;
+ LLNameValue *nv = new LLNameValue(data.c_str());
+
+// char splat[MAX_STRING];
+// temp->printNameValue(splat);
+// llinfos << "addNVPair " << splat << llendl;
+
+ name_value_map_t::iterator iter = mNameValuePairs.find(nv->mName);
+ if (iter != mNameValuePairs.end())
+ {
+ LLNameValue* foundnv = iter->second;
+ if (foundnv->mClass != NVC_READ_ONLY)
+ {
+ delete foundnv;
+ mNameValuePairs.erase(iter);
+ }
+ else
+ {
+ delete nv;
+// llinfos << "Trying to write to Read Only NVPair " << temp->mName << " in addNVPair()" << llendl;
+ return;
+ }
+ }
+ mNameValuePairs[nv->mName] = nv;
+}
+
+BOOL LLViewerObject::removeNVPair(const std::string& name)
+{
+ char* canonical_name = gNVNameTable.addString(name);
+
+ lldebugs << "LLViewerObject::removeNVPair(): " << name << llendl;
+
+ name_value_map_t::iterator iter = mNameValuePairs.find(canonical_name);
+ if (iter != mNameValuePairs.end())
+ {
+ if( mRegionp )
+ {
+ LLNameValue* nv = iter->second;
+/*
+ std::string buffer = nv->printNameValue();
+ gMessageSystem->newMessageFast(_PREHASH_RemoveNameValuePair);
+ gMessageSystem->nextBlockFast(_PREHASH_TaskData);
+ gMessageSystem->addUUIDFast(_PREHASH_ID, mID);
+
+ gMessageSystem->nextBlockFast(_PREHASH_NameValueData);
+ gMessageSystem->addStringFast(_PREHASH_NVPair, buffer);
+
+ gMessageSystem->sendReliable( mRegionp->getHost() );
+*/
+ // Remove the NV pair from the local list.
+ delete nv;
+ mNameValuePairs.erase(iter);
+ return TRUE;
+ }
+ else
+ {
+ lldebugs << "removeNVPair - No region for object" << llendl;
+ }
+ }
+ return FALSE;
+}
+
+
+LLNameValue *LLViewerObject::getNVPair(const std::string& name) const
+{
+ char *canonical_name;
+
+ canonical_name = gNVNameTable.addString(name);
+
+ // If you access a map with a name that isn't in it, it will add the name and a null pointer.
+ // So first check if the data is in the map.
+ name_value_map_t::const_iterator iter = mNameValuePairs.find(canonical_name);
+ if (iter != mNameValuePairs.end())
+ {
+ return iter->second;
+ }
+ else
+ {
+ return NULL;
+ }
+}
+
+void LLViewerObject::updatePositionCaches() const
+{
+ if(mRegionp)
+ {
+ if (!isRoot())
+ {
+ mPositionRegion = ((LLViewerObject *)getParent())->getPositionRegion() + getPosition() * getParent()->getRotation();
+ mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
+ }
+ else
+ {
+ mPositionRegion = getPosition();
+ mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
+ }
+ }
+}
+
+const LLVector3d LLViewerObject::getPositionGlobal() const
+{
+ if(mRegionp)
+ {
+ LLVector3d position_global = mRegionp->getPosGlobalFromRegion(getPositionRegion());
+
+ if (isAttachment())
+ {
+ position_global = gAgent.getPosGlobalFromAgent(getRenderPosition());
+ }
+ return position_global;
+ }
+ else
+ {
+ LLVector3d position_global(getPosition());
+ return position_global;
+ }
+}
+
+const LLVector3 &LLViewerObject::getPositionAgent() const
+{
+ if (mRegionp)
+ {
+ if (mDrawable.notNull() && (!mDrawable->isRoot() && getParent()))
+ {
+ // Don't return cached position if you have a parent, recalc (until all dirtying is done correctly.
+ LLVector3 position_region;
+ position_region = ((LLViewerObject *)getParent())->getPositionRegion() + getPosition() * getParent()->getRotation();
+ mPositionAgent = mRegionp->getPosAgentFromRegion(position_region);
+ }
+ else
+ {
+ mPositionAgent = mRegionp->getPosAgentFromRegion(getPosition());
+ }
+ }
+ return mPositionAgent;
+}
+
+const LLVector3 &LLViewerObject::getPositionRegion() const
+{
+ if (!isRoot())
+ {
+ LLViewerObject *parent = (LLViewerObject *)getParent();
+ mPositionRegion = parent->getPositionRegion() + (getPosition() * parent->getRotation());
+ }
+ else
+ {
+ mPositionRegion = getPosition();
+ }
+
+ return mPositionRegion;
+}
+
+const LLVector3 LLViewerObject::getPositionEdit() const
+{
+ if (isRootEdit())
+ {
+ return getPosition();
+ }
+ else
+ {
+ LLViewerObject *parent = (LLViewerObject *)getParent();
+ LLVector3 position_edit = parent->getPositionEdit() + getPosition() * parent->getRotationEdit();
+ return position_edit;
+ }
+}
+
+const LLVector3 LLViewerObject::getRenderPosition() const
+{
+ if (mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED))
+ {
+ LLVOAvatar* avatar = getAvatar();
+ if (avatar)
+ {
+ return avatar->getPositionAgent();
+ }
+ }
+
+ if (mDrawable.isNull() || mDrawable->getGeneration() < 0)
+ {
+ return getPositionAgent();
+ }
+ else
+ {
+ return mDrawable->getPositionAgent();
+ }
+}
+
+const LLVector3 LLViewerObject::getPivotPositionAgent() const
+{
+ return getRenderPosition();
+}
+
+const LLQuaternion LLViewerObject::getRenderRotation() const
+{
+ LLQuaternion ret;
+ if (mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED))
+ {
+ return ret;
+ }
+
+ if (mDrawable.isNull() || mDrawable->isStatic())
+ {
+ ret = getRotationEdit();
+ }
+ else
+ {
+ if (!mDrawable->isRoot())
+ {
+ ret = getRotation() * LLQuaternion(mDrawable->getParent()->getWorldMatrix());
+ }
+ else
+ {
+ ret = LLQuaternion(mDrawable->getWorldMatrix());
+ }
+ }
+
+ return ret;
+}
+
+const LLMatrix4 LLViewerObject::getRenderMatrix() const
+{
+ return mDrawable->getWorldMatrix();
+}
+
+const LLQuaternion LLViewerObject::getRotationRegion() const
+{
+ LLQuaternion global_rotation = getRotation();
+ if (!((LLXform *)this)->isRoot())
+ {
+ global_rotation = global_rotation * getParent()->getRotation();
+ }
+ return global_rotation;
+}
+
+const LLQuaternion LLViewerObject::getRotationEdit() const
+{
+ LLQuaternion global_rotation = getRotation();
+ if (!((LLXform *)this)->isRootEdit())
+ {
+ global_rotation = global_rotation * getParent()->getRotation();
+ }
+ return global_rotation;
+}
+
+void LLViewerObject::setPositionAbsoluteGlobal( const LLVector3d &pos_global, BOOL damped )
+{
+ if (isAttachment())
+ {
+ LLVector3 new_pos = mRegionp->getPosRegionFromGlobal(pos_global);
+ if (isRootEdit())
+ {
+ new_pos -= mDrawable->mXform.getParent()->getWorldPosition();
+ LLQuaternion world_rotation = mDrawable->mXform.getParent()->getWorldRotation();
+ new_pos = new_pos * ~world_rotation;
+ }
+ else
+ {
+ LLViewerObject* parentp = (LLViewerObject*)getParent();
+ new_pos -= parentp->getPositionAgent();
+ new_pos = new_pos * ~parentp->getRotationRegion();
+ }
+ LLViewerObject::setPosition(new_pos);
+
+ if (mParent && ((LLViewerObject*)mParent)->isAvatar())
+ {
+ // we have changed the position of an attachment, so we need to clamp it
+ LLVOAvatar *avatar = (LLVOAvatar*)mParent;
+
+ avatar->clampAttachmentPositions();
+ }
+ }
+ else
+ {
+ if( isRoot() )
+ {
+ setPositionRegion(mRegionp->getPosRegionFromGlobal(pos_global));
+ }
+ else
+ {
+ // the relative position with the parent is not constant
+ LLViewerObject* parent = (LLViewerObject *)getParent();
+ //RN: this assumes we are only calling this function from the edit tools
+ gPipeline.updateMoveNormalAsync(parent->mDrawable);
+
+ LLVector3 pos_local = mRegionp->getPosRegionFromGlobal(pos_global) - parent->getPositionRegion();
+ pos_local = pos_local * ~parent->getRotationRegion();
+ LLViewerObject::setPosition( pos_local );
+ }
+ }
+ //RN: assumes we always want to snap the object when calling this function
+ gPipeline.updateMoveNormalAsync(mDrawable);
+}
+
+void LLViewerObject::setPosition(const LLVector3 &pos, BOOL damped)
+{
+ if (getPosition() != pos)
+ {
+ setChanged(TRANSLATED | SILHOUETTE);
+ }
+
+ LLXform::setPosition(pos);
+ updateDrawable(damped);
+ if (isRoot())
+ {
+ // position caches need to be up to date on root objects
+ updatePositionCaches();
+ }
+}
+
+void LLViewerObject::setPositionGlobal(const LLVector3d &pos_global, BOOL damped)
+{
+ if (isAttachment())
+ {
+ if (isRootEdit())
+ {
+ LLVector3 newPos = mRegionp->getPosRegionFromGlobal(pos_global);
+ newPos = newPos - mDrawable->mXform.getParent()->getWorldPosition();
+
+ LLQuaternion invWorldRotation = mDrawable->mXform.getParent()->getWorldRotation();
+ invWorldRotation.transQuat();
+
+ newPos = newPos * invWorldRotation;
+ LLViewerObject::setPosition(newPos);
+ }
+ else
+ {
+ // assumes parent is root editable (root of attachment)
+ LLVector3 newPos = mRegionp->getPosRegionFromGlobal(pos_global);
+ newPos = newPos - mDrawable->mXform.getParent()->getWorldPosition();
+ LLVector3 delta_pos = newPos - getPosition();
+
+ LLQuaternion invRotation = mDrawable->getRotation();
+ invRotation.transQuat();
+
+ delta_pos = delta_pos * invRotation;
+
+ // *FIX: is this right? Shouldn't we be calling the
+ // LLViewerObject version of setPosition?
+ LLVector3 old_pos = mDrawable->mXform.getParent()->getPosition();
+ mDrawable->mXform.getParent()->setPosition(old_pos + delta_pos);
+ setChanged(TRANSLATED | SILHOUETTE);
+ }
+ if (mParent && ((LLViewerObject*)mParent)->isAvatar())
+ {
+ // we have changed the position of an attachment, so we need to clamp it
+ LLVOAvatar *avatar = (LLVOAvatar*)mParent;
+
+ avatar->clampAttachmentPositions();
+ }
+ }
+ else
+ {
+ if (isRoot())
+ {
+ setPositionRegion(mRegionp->getPosRegionFromGlobal(pos_global));
+ }
+ else
+ {
+ // the relative position with the parent is constant, but the parent's position needs to be changed
+ LLVector3d position_offset;
+ position_offset.setVec(getPosition()*getParent()->getRotation());
+ LLVector3d new_pos_global = pos_global - position_offset;
+ ((LLViewerObject *)getParent())->setPositionGlobal(new_pos_global);
+ }
+ }
+ updateDrawable(damped);
+}
+
+
+void LLViewerObject::setPositionParent(const LLVector3 &pos_parent, BOOL damped)
+{
+ // Set position relative to parent, if no parent, relative to region
+ if (!isRoot())
+ {
+ LLViewerObject::setPosition(pos_parent, damped);
+ //updateDrawable(damped);
+ }
+ else
+ {
+ setPositionRegion(pos_parent, damped);
+ }
+}
+
+void LLViewerObject::setPositionRegion(const LLVector3 &pos_region, BOOL damped)
+{
+ if (!isRootEdit())
+ {
+ LLViewerObject* parent = (LLViewerObject*) getParent();
+ LLViewerObject::setPosition((pos_region-parent->getPositionRegion())*~parent->getRotationRegion());
+ }
+ else
+ {
+ LLViewerObject::setPosition(pos_region);
+ mPositionRegion = pos_region;
+ mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
+ }
+}
+
+void LLViewerObject::setPositionAgent(const LLVector3 &pos_agent, BOOL damped)
+{
+ LLVector3 pos_region = getRegion()->getPosRegionFromAgent(pos_agent);
+ setPositionRegion(pos_region, damped);
+}
+
+// identical to setPositionRegion() except it checks for child-joints
+// and doesn't also move the joint-parent
+// TODO -- implement similar intelligence for joint-parents toward
+// their joint-children
+void LLViewerObject::setPositionEdit(const LLVector3 &pos_edit, BOOL damped)
+{
+ if (!isRootEdit())
+ {
+ // the relative position with the parent is constant, but the parent's position needs to be changed
+ LLVector3 position_offset = getPosition() * getParent()->getRotation();
+
+ ((LLViewerObject *)getParent())->setPositionEdit(pos_edit - position_offset);
+ updateDrawable(damped);
+ }
+ else if (isJointChild())
+ {
+ // compute new parent-relative position
+ LLViewerObject *parent = (LLViewerObject *) getParent();
+ LLQuaternion inv_parent_rot = parent->getRotation();
+ inv_parent_rot.transQuat();
+ LLVector3 pos_parent = (pos_edit - parent->getPositionRegion()) * inv_parent_rot;
+ LLViewerObject::setPosition(pos_parent, damped);
+ }
+ else
+ {
+ LLViewerObject::setPosition(pos_edit, damped);
+ mPositionRegion = pos_edit;
+ mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
+ }
+}
+
+
+LLViewerObject* LLViewerObject::getRootEdit() const
+{
+ const LLViewerObject* root = this;
+ while (root->mParent
+ && !(root->mJointInfo
+ || ((LLViewerObject*)root->mParent)->isAvatar()) )
+ {
+ root = (LLViewerObject*)root->mParent;
+ }
+ return (LLViewerObject*)root;
+}
+
+
+BOOL LLViewerObject::lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
+ S32 face,
+ BOOL pick_transparent,
+ S32* face_hit,
+ LLVector3* intersection,
+ LLVector2* tex_coord,
+ LLVector3* normal,
+ LLVector3* bi_normal)
+{
+ return false;
+}
+
+BOOL LLViewerObject::lineSegmentBoundingBox(const LLVector3& start, const LLVector3& end)
+{
+ if (mDrawable.isNull() || mDrawable->isDead())
+ {
+ return FALSE;
+ }
+
+ const LLVector4a* ext = mDrawable->getSpatialExtents();
+
+ //VECTORIZE THIS
+ LLVector4a center;
+ center.setAdd(ext[1], ext[0]);
+ center.mul(0.5f);
+ LLVector4a size;
+ size.setSub(ext[1], ext[0]);
+ size.mul(0.5f);
+
+ LLVector4a starta, enda;
+ starta.load3(start.mV);
+ enda.load3(end.mV);
+
+ return LLLineSegmentBoxIntersect(starta, enda, center, size);
+}
+
+U8 LLViewerObject::getMediaType() const
+{
+ if (mMedia)
+ {
+ return mMedia->mMediaType;
+ }
+ else
+ {
+ return LLViewerObject::MEDIA_NONE;
+ }
+}
+
+void LLViewerObject::setMediaType(U8 media_type)
+{
+ if (!mMedia)
+ {
+ // TODO what if we don't have a media pointer?
+ }
+ else if (mMedia->mMediaType != media_type)
+ {
+ mMedia->mMediaType = media_type;
+
+ // TODO: update materials with new image
+ }
+}
+
+std::string LLViewerObject::getMediaURL() const
+{
+ if (mMedia)
+ {
+ return mMedia->mMediaURL;
+ }
+ else
+ {
+ return std::string();
+ }
+}
+
+void LLViewerObject::setMediaURL(const std::string& media_url)
+{
+ LLMemType mt(LLMemType::MTYPE_OBJECT);
+
+ if (!mMedia)
+ {
+ mMedia = new LLViewerObjectMedia;
+ mMedia->mMediaURL = media_url;
+ mMedia->mPassedWhitelist = FALSE;
+
+ // TODO: update materials with new image
+ }
+ else if (mMedia->mMediaURL != media_url)
+ {
+ mMedia->mMediaURL = media_url;
+ mMedia->mPassedWhitelist = FALSE;
+
+ // TODO: update materials with new image
+ }
+}
+
+BOOL LLViewerObject::getMediaPassedWhitelist() const
+{
+ if (mMedia)
+ {
+ return mMedia->mPassedWhitelist;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+void LLViewerObject::setMediaPassedWhitelist(BOOL passed)
+{
+ if (mMedia)
+ {
+ mMedia->mPassedWhitelist = passed;
+ }
+}
+
+BOOL LLViewerObject::setMaterial(const U8 material)
+{
+ BOOL res = LLPrimitive::setMaterial(material);
+ if (res)
+ {
+ setChanged(TEXTURE);
+ }
+ return res;
+}
+
+void LLViewerObject::setNumTEs(const U8 num_tes)
+{
+ LLMemType mt(LLMemType::MTYPE_OBJECT);
+
+ U32 i;
+ if (num_tes != getNumTEs())
+ {
+ if (num_tes)
+ {
+ LLPointer<LLViewerTexture> *new_images;
+ new_images = new LLPointer<LLViewerTexture>[num_tes];
+ for (i = 0; i < num_tes; i++)
+ {
+ if (i < getNumTEs())
+ {
+ new_images[i] = mTEImages[i];
+ }
+ else if (getNumTEs())
+ {
+ new_images[i] = mTEImages[getNumTEs()-1];
+ }
+ else
+ {
+ new_images[i] = NULL;
+ }
+ }
+
+ deleteTEImages();
+
+ mTEImages = new_images;
+ }
+ else
+ {
+ deleteTEImages();
+ }
+ LLPrimitive::setNumTEs(num_tes);
+ setChanged(TEXTURE);
+
+ if (mDrawable.notNull())
+ {
+ gPipeline.markTextured(mDrawable);
+ }
+ }
+}
+
+void LLViewerObject::sendMaterialUpdate() const
+{
+ LLViewerRegion* regionp = getRegion();
+ if(!regionp) return;
+ gMessageSystem->newMessageFast(_PREHASH_ObjectMaterial);
+ gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+ gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
+ gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, mLocalID );
+ gMessageSystem->addU8Fast(_PREHASH_Material, getMaterial() );
+ gMessageSystem->sendReliable( regionp->getHost() );
+
+}
+
+// formerly send_object_rotation
+void LLViewerObject::sendRotationUpdate() const
+{
+ LLViewerRegion* regionp = getRegion();
+ if(!regionp) return;
+ gMessageSystem->newMessageFast(_PREHASH_ObjectRotation);
+ gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+ gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
+ gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, mLocalID);
+ gMessageSystem->addQuatFast(_PREHASH_Rotation, getRotationEdit());
+ //llinfos << "Sent rotation " << getRotationEdit() << llendl;
+ gMessageSystem->sendReliable( regionp->getHost() );
+}
+
+/* Obsolete, we use MultipleObjectUpdate instead
+//// formerly send_object_position_global
+//void LLViewerObject::sendPositionUpdate() const
+//{
+// gMessageSystem->newMessageFast(_PREHASH_ObjectPosition);
+// gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+// gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+// gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+// gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
+// gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, mLocalID );
+// gMessageSystem->addVector3Fast(_PREHASH_Position, getPositionRegion());
+// LLViewerRegion* regionp = getRegion();
+// gMessageSystem->sendReliable(regionp->getHost());
+//}
+*/
+
+//formerly send_object_shape(LLViewerObject *object)
+void LLViewerObject::sendShapeUpdate()
+{
+ gMessageSystem->newMessageFast(_PREHASH_ObjectShape);
+ gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+ gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
+ gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, mLocalID );
+
+ LLVolumeMessage::packVolumeParams(&getVolume()->getParams(), gMessageSystem);
+
+ LLViewerRegion *regionp = getRegion();
+ gMessageSystem->sendReliable( regionp->getHost() );
+}
+
+
+void LLViewerObject::sendTEUpdate() const
+{
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_ObjectImage);
+
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+
+ msg->nextBlockFast(_PREHASH_ObjectData);
+ msg->addU32Fast(_PREHASH_ObjectLocalID, mLocalID );
+ if (mMedia)
+ {
+ msg->addString("MediaURL", mMedia->mMediaURL);
+ }
+ else
+ {
+ msg->addString("MediaURL", NULL);
+ }
+
+ // TODO send media type
+
+ packTEMessage(msg);
+
+ LLViewerRegion *regionp = getRegion();
+ msg->sendReliable( regionp->getHost() );
+}
+
+void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry)
+{
+ LLPrimitive::setTE(te, texture_entry);
+// This doesn't work, don't get any textures.
+// if (mDrawable.notNull() && mDrawable->isVisible())
+// {
+ const LLUUID& image_id = getTE(te)->getID();
+ mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+// }
+}
+
+void LLViewerObject::setTEImage(const U8 te, LLViewerTexture *imagep)
+{
+ if (mTEImages[te] != imagep)
+ {
+ mTEImages[te] = imagep;
+ LLPrimitive::setTETexture(te, imagep->getID());
+ setChanged(TEXTURE);
+ if (mDrawable.notNull())
+ {
+ gPipeline.markTextured(mDrawable);
+ }
+ }
+}
+
+
+S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, LLHost host)
+{
+ S32 retval = 0;
+ if (uuid != getTE(te)->getID() ||
+ uuid == LLUUID::null)
+ {
+ retval = LLPrimitive::setTETexture(te, uuid);
+ mTEImages[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host);
+ setChanged(TEXTURE);
+ if (mDrawable.notNull())
+ {
+ gPipeline.markTextured(mDrawable);
+ }
+ }
+ return retval;
+}
+
+
+void LLViewerObject::changeTEImage(S32 index, LLViewerTexture* new_image)
+{
+ if(index < 0 || index >= getNumTEs())
+ {
+ return ;
+ }
+ mTEImages[index] = new_image ;
+}
+
+S32 LLViewerObject::setTETexture(const U8 te, const LLUUID& uuid)
+{
+ // Invalid host == get from the agent's sim
+ return setTETextureCore(te, uuid, LLHost::invalid);
+}
+
+
+S32 LLViewerObject::setTEColor(const U8 te, const LLColor3& color)
+{
+ return setTEColor(te, LLColor4(color));
+}
+
+S32 LLViewerObject::setTEColor(const U8 te, const LLColor4& color)
+{
+ S32 retval = 0;
+ const LLTextureEntry *tep = getTE(te);
+ if (!tep)
+ {
+ llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
+ }
+ else if (color != tep->getColor())
+ {
+ retval = LLPrimitive::setTEColor(te, color);
+ if (mDrawable.notNull() && retval)
+ {
+ // These should only happen on updates which are not the initial update.
+ dirtyMesh();
+ }
+ }
+ return retval;
+}
+
+S32 LLViewerObject::setTEBumpmap(const U8 te, const U8 bump)
+{
+ S32 retval = 0;
+ const LLTextureEntry *tep = getTE(te);
+ if (!tep)
+ {
+ llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
+ }
+ else if (bump != tep->getBumpmap())
+ {
+ retval = LLPrimitive::setTEBumpmap(te, bump);
+ setChanged(TEXTURE);
+ if (mDrawable.notNull() && retval)
+ {
+ gPipeline.markTextured(mDrawable);
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, TRUE);
+ }
+ }
+ return retval;
+}
+
+S32 LLViewerObject::setTETexGen(const U8 te, const U8 texgen)
+{
+ S32 retval = 0;
+ const LLTextureEntry *tep = getTE(te);
+ if (!tep)
+ {
+ llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
+ }
+ else if (texgen != tep->getTexGen())
+ {
+ retval = LLPrimitive::setTETexGen(te, texgen);
+ setChanged(TEXTURE);
+ }
+ return retval;
+}
+
+S32 LLViewerObject::setTEMediaTexGen(const U8 te, const U8 media)
+{
+ S32 retval = 0;
+ const LLTextureEntry *tep = getTE(te);
+ if (!tep)
+ {
+ llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
+ }
+ else if (media != tep->getMediaTexGen())
+ {
+ retval = LLPrimitive::setTEMediaTexGen(te, media);
+ setChanged(TEXTURE);
+ }
+ return retval;
+}
+
+S32 LLViewerObject::setTEShiny(const U8 te, const U8 shiny)
+{
+ S32 retval = 0;
+ const LLTextureEntry *tep = getTE(te);
+ if (!tep)
+ {
+ llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
+ }
+ else if (shiny != tep->getShiny())
+ {
+ retval = LLPrimitive::setTEShiny(te, shiny);
+ setChanged(TEXTURE);
+ }
+ return retval;
+}
+
+S32 LLViewerObject::setTEFullbright(const U8 te, const U8 fullbright)
+{
+ S32 retval = 0;
+ const LLTextureEntry *tep = getTE(te);
+ if (!tep)
+ {
+ llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
+ }
+ else if (fullbright != tep->getFullbright())
+ {
+ retval = LLPrimitive::setTEFullbright(te, fullbright);
+ setChanged(TEXTURE);
+ if (mDrawable.notNull() && retval)
+ {
+ gPipeline.markTextured(mDrawable);
+ }
+ }
+ return retval;
+}
+
+
+S32 LLViewerObject::setTEMediaFlags(const U8 te, const U8 media_flags)
+{
+ // this might need work for media type
+ S32 retval = 0;
+ const LLTextureEntry *tep = getTE(te);
+ if (!tep)
+ {
+ llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
+ }
+ else if (media_flags != tep->getMediaFlags())
+ {
+ retval = LLPrimitive::setTEMediaFlags(te, media_flags);
+ setChanged(TEXTURE);
+ if (mDrawable.notNull() && retval)
+ {
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD, TRUE);
+ gPipeline.markTextured(mDrawable);
+ // JC - probably only need this if changes texture coords
+ //gPipeline.markRebuild(mDrawable);
+ }
+ }
+ return retval;
+}
+
+S32 LLViewerObject::setTEGlow(const U8 te, const F32 glow)
+{
+ S32 retval = 0;
+ const LLTextureEntry *tep = getTE(te);
+ if (!tep)
+ {
+ llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
+ }
+ else if (glow != tep->getGlow())
+ {
+ retval = LLPrimitive::setTEGlow(te, glow);
+ setChanged(TEXTURE);
+ if (mDrawable.notNull() && retval)
+ {
+ gPipeline.markTextured(mDrawable);
+ }
+ }
+ return retval;
+}
+
+
+S32 LLViewerObject::setTEScale(const U8 te, const F32 s, const F32 t)
+{
+ S32 retval = 0;
+ retval = LLPrimitive::setTEScale(te, s, t);
+ setChanged(TEXTURE);
+ if (mDrawable.notNull() && retval)
+ {
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
+ }
+ return retval;
+}
+
+S32 LLViewerObject::setTEScaleS(const U8 te, const F32 s)
+{
+ S32 retval = LLPrimitive::setTEScaleS(te, s);
+ if (mDrawable.notNull() && retval)
+ {
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
+ }
+
+ return retval;
+}
+
+S32 LLViewerObject::setTEScaleT(const U8 te, const F32 t)
+{
+ S32 retval = LLPrimitive::setTEScaleT(te, t);
+ if (mDrawable.notNull() && retval)
+ {
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
+ }
+
+ return retval;
+}
+
+S32 LLViewerObject::setTEOffset(const U8 te, const F32 s, const F32 t)
+{
+ S32 retval = LLPrimitive::setTEOffset(te, s, t);
+ if (mDrawable.notNull() && retval)
+ {
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
+ }
+ return retval;
+}
+
+S32 LLViewerObject::setTEOffsetS(const U8 te, const F32 s)
+{
+ S32 retval = LLPrimitive::setTEOffsetS(te, s);
+ if (mDrawable.notNull() && retval)
+ {
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
+ }
+
+ return retval;
+}
+
+S32 LLViewerObject::setTEOffsetT(const U8 te, const F32 t)
+{
+ S32 retval = LLPrimitive::setTEOffsetT(te, t);
+ if (mDrawable.notNull() && retval)
+ {
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
+ }
+
+ return retval;
+}
+
+S32 LLViewerObject::setTERotation(const U8 te, const F32 r)
+{
+ S32 retval = LLPrimitive::setTERotation(te, r);
+ if (mDrawable.notNull() && retval)
+ {
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
+ }
+ return retval;
+}
+
+
+LLViewerTexture *LLViewerObject::getTEImage(const U8 face) const
+{
+// llassert(mTEImages);
+
+ if (face < getNumTEs())
+ {
+ LLViewerTexture* image = mTEImages[face];
+ if (image)
+ {
+ return image;
+ }
+ else
+ {
+ return (LLViewerTexture*)(LLViewerFetchedTexture::sDefaultImagep);
+ }
+ }
+
+ llerrs << llformat("Requested Image from invalid face: %d/%d",face,getNumTEs()) << llendl;
+
+ return NULL;
+}
+
+
+void LLViewerObject::fitFaceTexture(const U8 face)
+{
+ llinfos << "fitFaceTexture not implemented" << llendl;
+}
+
+
+LLBBox LLViewerObject::getBoundingBoxAgent() const
+{
+ LLVector3 position_agent;
+ LLQuaternion rot;
+ LLViewerObject* avatar_parent = NULL;
+ LLViewerObject* root_edit = (LLViewerObject*)getRootEdit();
+ if (root_edit)
+ {
+ avatar_parent = (LLViewerObject*)root_edit->getParent();
+ }
+
+ if (avatar_parent && avatar_parent->isAvatar() &&
+ root_edit && root_edit->mDrawable.notNull() && root_edit->mDrawable->getXform()->getParent())
+ {
+ LLXform* parent_xform = root_edit->mDrawable->getXform()->getParent();
+ position_agent = (getPositionEdit() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition();
+ rot = getRotationEdit() * parent_xform->getWorldRotation();
+ }
+ else
+ {
+ position_agent = getPositionAgent();
+ rot = getRotationRegion();
+ }
+
+ return LLBBox( position_agent, rot, getScale() * -0.5f, getScale() * 0.5f );
+}
+
+U32 LLViewerObject::getNumVertices() const
+{
+ U32 num_vertices = 0;
+ if (mDrawable.notNull())
+ {
+ S32 i, num_faces;
+ num_faces = mDrawable->getNumFaces();
+ for (i = 0; i < num_faces; i++)
+ {
+ num_vertices += mDrawable->getFace(i)->getGeomCount();
+ }
+ }
+ return num_vertices;
+}
+
+U32 LLViewerObject::getNumIndices() const
+{
+ U32 num_indices = 0;
+ if (mDrawable.notNull())
+ {
+ S32 i, num_faces;
+ num_faces = mDrawable->getNumFaces();
+ for (i = 0; i < num_faces; i++)
+ {
+ num_indices += mDrawable->getFace(i)->getIndicesCount();
+ }
+ }
+ return num_indices;
+}
+
+// Find the number of instances of this object's inventory that are of the given type
+S32 LLViewerObject::countInventoryContents(LLAssetType::EType type)
+{
+ S32 count = 0;
+ if( mInventory )
+ {
+ LLInventoryObject::object_list_t::const_iterator it = mInventory->begin();
+ LLInventoryObject::object_list_t::const_iterator end = mInventory->end();
+ for( ; it != end ; ++it )
+ {
+ if( (*it)->getType() == type )
+ {
+ ++count;
+ }
+ }
+ }
+ return count;
+}
+
+
+void LLViewerObject::setCanSelect(BOOL canSelect)
+{
+ mbCanSelect = canSelect;
+ for (child_list_t::iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* child = *iter;
+ child->mbCanSelect = canSelect;
+ }
+}
+
+void LLViewerObject::setDebugText(const std::string &utf8text)
+{
+ if (utf8text.empty() && !mText)
+ {
+ return;
+ }
+
+ if (!mText)
+ {
+ mText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT);
+ mText->setFont(LLFontGL::getFontSansSerif());
+ mText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP);
+ mText->setMaxLines(-1);
+ mText->setSourceObject(this);
+ mText->setOnHUDAttachment(isHUDAttachment());
+ }
+ mText->setColor(LLColor4::white);
+ mText->setString(utf8text);
+ mText->setZCompare(FALSE);
+ mText->setDoFade(FALSE);
+ updateText();
+}
+
+void LLViewerObject::setIcon(LLViewerTexture* icon_image)
+{
+ if (!mIcon)
+ {
+ mIcon = (LLHUDIcon *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_ICON);
+ mIcon->setSourceObject(this);
+ mIcon->setImage(icon_image);
+ // *TODO: make this user configurable
+ mIcon->setScale(0.03f);
+ }
+ else
+ {
+ mIcon->restartLifeTimer();
+ }
+}
+
+void LLViewerObject::clearIcon()
+{
+ if (mIcon)
+ {
+ mIcon = NULL;
+ }
+}
+
+LLViewerObject* LLViewerObject::getSubParent()
+{
+ if (isJointChild())
+ {
+ return this;
+ }
+ return (LLViewerObject*) getParent();
+}
+
+const LLViewerObject* LLViewerObject::getSubParent() const
+{
+ if (isJointChild())
+ {
+ return this;
+ }
+ return (const LLViewerObject*) getParent();
+}
+
+BOOL LLViewerObject::isOnMap()
+{
+ return mOnMap;
+}
+
+
+void LLViewerObject::updateText()
+{
+ if (!isDead())
+ {
+ if (mText.notNull())
+ {
+ LLVector3 up_offset(0,0,0);
+ up_offset.mV[2] = getScale().mV[VZ]*0.6f;
+
+ if (mDrawable.notNull())
+ {
+ mText->setPositionAgent(getRenderPosition() + up_offset);
+ }
+ else
+ {
+ mText->setPositionAgent(getPositionAgent() + up_offset);
+ }
+ }
+ }
+}
+
+LLVOAvatar* LLViewerObject::asAvatar()
+{
+ return NULL;
+}
+
+BOOL LLViewerObject::isParticleSource() const
+{
+ return !mPartSourcep.isNull() && !mPartSourcep->isDead();
+}
+
+void LLViewerObject::setParticleSource(const LLPartSysData& particle_parameters, const LLUUID& owner_id)
+{
+ if (mPartSourcep)
+ {
+ deleteParticleSource();
+ }
+
+ LLPointer<LLViewerPartSourceScript> pss = LLViewerPartSourceScript::createPSS(this, particle_parameters);
+ mPartSourcep = pss;
+
+ if (mPartSourcep)
+ {
+ mPartSourcep->setOwnerUUID(owner_id);
+
+ if (mPartSourcep->getImage()->getID() != mPartSourcep->mPartSysData.mPartImageID)
+ {
+ LLViewerTexture* image;
+ if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null)
+ {
+ image = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.tga");
+ }
+ else
+ {
+ image = LLViewerTextureManager::getFetchedTexture(mPartSourcep->mPartSysData.mPartImageID);
+ }
+ mPartSourcep->setImage(image);
+ }
+ }
+ LLViewerPartSim::getInstance()->addPartSource(pss);
+}
+
+void LLViewerObject::unpackParticleSource(const S32 block_num, const LLUUID& owner_id)
+{
+ if (!mPartSourcep.isNull() && mPartSourcep->isDead())
+ {
+ mPartSourcep = NULL;
+ }
+ if (mPartSourcep)
+ {
+ // If we've got one already, just update the existing source (or remove it)
+ if (!LLViewerPartSourceScript::unpackPSS(this, mPartSourcep, block_num))
+ {
+ mPartSourcep->setDead();
+ mPartSourcep = NULL;
+ }
+ }
+ else
+ {
+ LLPointer<LLViewerPartSourceScript> pss = LLViewerPartSourceScript::unpackPSS(this, NULL, block_num);
+ //If the owner is muted, don't create the system
+ if(LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagParticles)) return;
+
+ // We need to be able to deal with a particle source that hasn't changed, but still got an update!
+ if (pss)
+ {
+// llinfos << "Making particle system with owner " << owner_id << llendl;
+ pss->setOwnerUUID(owner_id);
+ mPartSourcep = pss;
+ LLViewerPartSim::getInstance()->addPartSource(pss);
+ }
+ }
+ if (mPartSourcep)
+ {
+ if (mPartSourcep->getImage()->getID() != mPartSourcep->mPartSysData.mPartImageID)
+ {
+ LLViewerTexture* image;
+ if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null)
+ {
+ image = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.j2c");
+ }
+ else
+ {
+ image = LLViewerTextureManager::getFetchedTexture(mPartSourcep->mPartSysData.mPartImageID);
+ }
+ mPartSourcep->setImage(image);
+ }
+ }
+}
+
+void LLViewerObject::unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_id)
+{
+ if (!mPartSourcep.isNull() && mPartSourcep->isDead())
+ {
+ mPartSourcep = NULL;
+ }
+ if (mPartSourcep)
+ {
+ // If we've got one already, just update the existing source (or remove it)
+ if (!LLViewerPartSourceScript::unpackPSS(this, mPartSourcep, dp))
+ {
+ mPartSourcep->setDead();
+ mPartSourcep = NULL;
+ }
+ }
+ else
+ {
+ LLPointer<LLViewerPartSourceScript> pss = LLViewerPartSourceScript::unpackPSS(this, NULL, dp);
+ //If the owner is muted, don't create the system
+ if(LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagParticles)) return;
+ // We need to be able to deal with a particle source that hasn't changed, but still got an update!
+ if (pss)
+ {
+// llinfos << "Making particle system with owner " << owner_id << llendl;
+ pss->setOwnerUUID(owner_id);
+ mPartSourcep = pss;
+ LLViewerPartSim::getInstance()->addPartSource(pss);
+ }
+ }
+ if (mPartSourcep)
+ {
+ if (mPartSourcep->getImage()->getID() != mPartSourcep->mPartSysData.mPartImageID)
+ {
+ LLViewerTexture* image;
+ if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null)
+ {
+ image = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.j2c");
+ }
+ else
+ {
+ image = LLViewerTextureManager::getFetchedTexture(mPartSourcep->mPartSysData.mPartImageID);
+ }
+ mPartSourcep->setImage(image);
+ }
+ }
+}
+
+void LLViewerObject::deleteParticleSource()
+{
+ if (mPartSourcep.notNull())
+ {
+ mPartSourcep->setDead();
+ mPartSourcep = NULL;
+ }
+}
+
+// virtual
+void LLViewerObject::updateDrawable(BOOL force_damped)
+{
+ if (mDrawable.notNull() &&
+ !mDrawable->isState(LLDrawable::ON_MOVE_LIST) &&
+ isChanged(MOVED))
+ {
+ BOOL damped_motion =
+ !isChanged(SHIFTED) && // not shifted between regions this frame and...
+ ( force_damped || // ...forced into damped motion by application logic or...
+ ( !isSelected() && // ...not selected and...
+ ( mDrawable->isRoot() || // ... is root or ...
+ (getParent() && !((LLViewerObject*)getParent())->isSelected())// ... parent is not selected and ...
+ ) &&
+ getPCode() == LL_PCODE_VOLUME && // ...is a volume object and...
+ getVelocity().isExactlyZero() && // ...is not moving physically and...
+ mDrawable->getGeneration() != -1 // ...was not created this frame.
+ )
+ );
+ gPipeline.markMoved(mDrawable, damped_motion);
+ }
+ clearChanged(SHIFTED);
+}
+
+// virtual, overridden by LLVOVolume
+F32 LLViewerObject::getVObjRadius() const
+{
+ return mDrawable.notNull() ? mDrawable->getRadius() : 0.f;
+}
+
+void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& owner_id, const F32 gain, const U8 flags)
+{
+ if (!gAudiop)
+ {
+ return;
+ }
+
+ if (audio_uuid.isNull())
+ {
+ if (!mAudioSourcep)
+ {
+ return;
+ }
+ if (mAudioSourcep->isLoop() && !mAudioSourcep->hasPendingPreloads())
+ {
+ // We don't clear the sound if it's a loop, it'll go away on its own.
+ // At least, this appears to be how the scripts work.
+ // The attached sound ID is set to NULL to avoid it playing back when the
+ // object rezzes in on non-looping sounds.
+ //llinfos << "Clearing attached sound " << mAudioSourcep->getCurrentData()->getID() << llendl;
+ gAudiop->cleanupAudioSource(mAudioSourcep);
+ mAudioSourcep = NULL;
+ }
+ else if (flags & LL_SOUND_FLAG_STOP)
+ {
+ // Just shut off the sound
+ mAudioSourcep->play(LLUUID::null);
+ }
+ return;
+ }
+ if (flags & LL_SOUND_FLAG_LOOP
+ && mAudioSourcep && mAudioSourcep->isLoop() && mAudioSourcep->getCurrentData()
+ && mAudioSourcep->getCurrentData()->getID() == audio_uuid)
+ {
+ //llinfos << "Already playing this sound on a loop, ignoring" << llendl;
+ return;
+ }
+
+ // don't clean up before previous sound is done. Solves: SL-33486
+ if ( mAudioSourcep && mAudioSourcep->isDone() )
+ {
+ gAudiop->cleanupAudioSource(mAudioSourcep);
+ mAudioSourcep = NULL;
+ }
+
+ if (mAudioSourcep && mAudioSourcep->isMuted() &&
+ mAudioSourcep->getCurrentData() && mAudioSourcep->getCurrentData()->getID() == audio_uuid)
+ {
+ //llinfos << "Already having this sound as muted sound, ignoring" << llendl;
+ return;
+ }
+
+ getAudioSource(owner_id);
+
+ if (mAudioSourcep)
+ {
+ BOOL queue = flags & LL_SOUND_FLAG_QUEUE;
+ mAudioGain = gain;
+ mAudioSourcep->setGain(gain);
+ mAudioSourcep->setLoop(flags & LL_SOUND_FLAG_LOOP);
+ mAudioSourcep->setSyncMaster(flags & LL_SOUND_FLAG_SYNC_MASTER);
+ mAudioSourcep->setSyncSlave(flags & LL_SOUND_FLAG_SYNC_SLAVE);
+ mAudioSourcep->setQueueSounds(queue);
+ if(!queue) // stop any current sound first to avoid "farts of doom" (SL-1541) -MG
+ {
+ mAudioSourcep->play(LLUUID::null);
+ }
+
+ // Play this sound if region maturity permits
+ if( gAgent.canAccessMaturityAtGlobal(this->getPositionGlobal()) )
+ {
+ //llinfos << "Playing attached sound " << audio_uuid << llendl;
+ mAudioSourcep->play(audio_uuid);
+ }
+ }
+}
+
+LLAudioSource *LLViewerObject::getAudioSource(const LLUUID& owner_id)
+{
+ if (!mAudioSourcep)
+ {
+ // Arbitrary low gain for a sound that's not playing.
+ // This is used for sound preloads, for example.
+ LLAudioSourceVO *asvop = new LLAudioSourceVO(mID, owner_id, 0.01f, this);
+
+ mAudioSourcep = asvop;
+ if(gAudiop) gAudiop->addAudioSource(asvop);
+ }
+
+ return mAudioSourcep;
+}
+
+void LLViewerObject::adjustAudioGain(const F32 gain)
+{
+ if (!gAudiop)
+ {
+ return;
+ }
+ if (mAudioSourcep)
+ {
+ mAudioGain = gain;
+ mAudioSourcep->setGain(mAudioGain);
+ }
+}
+
+//----------------------------------------------------------------------------
+
+bool LLViewerObject::unpackParameterEntry(U16 param_type, LLDataPacker *dp)
+{
+ ExtraParameter* param = getExtraParameterEntryCreate(param_type);
+ if (param)
+ {
+ param->data->unpack(*dp);
+ param->in_use = TRUE;
+ parameterChanged(param_type, param->data, TRUE, false);
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+LLViewerObject::ExtraParameter* LLViewerObject::createNewParameterEntry(U16 param_type)
+{
+ LLNetworkData* new_block = NULL;
+ switch (param_type)
+ {
+ case LLNetworkData::PARAMS_FLEXIBLE:
+ {
+ new_block = new LLFlexibleObjectData();
+ break;
+ }
+ case LLNetworkData::PARAMS_LIGHT:
+ {
+ new_block = new LLLightParams();
+ break;
+ }
+ case LLNetworkData::PARAMS_SCULPT:
+ {
+ new_block = new LLSculptParams();
+ break;
+ }
+ case LLNetworkData::PARAMS_LIGHT_IMAGE:
+ {
+ new_block = new LLLightImageParams();
+ break;
+ }
+ default:
+ {
+ llinfos << "Unknown param type." << llendl;
+ break;
+ }
+ };
+
+ if (new_block)
+ {
+ ExtraParameter* new_entry = new ExtraParameter;
+ new_entry->data = new_block;
+ new_entry->in_use = false; // not in use yet
+ mExtraParameterList[param_type] = new_entry;
+ return new_entry;
+ }
+ return NULL;
+}
+
+LLViewerObject::ExtraParameter* LLViewerObject::getExtraParameterEntry(U16 param_type) const
+{
+ std::map<U16, ExtraParameter*>::const_iterator itor = mExtraParameterList.find(param_type);
+ if (itor != mExtraParameterList.end())
+ {
+ return itor->second;
+ }
+ return NULL;
+}
+
+LLViewerObject::ExtraParameter* LLViewerObject::getExtraParameterEntryCreate(U16 param_type)
+{
+ ExtraParameter* param = getExtraParameterEntry(param_type);
+ if (!param)
+ {
+ param = createNewParameterEntry(param_type);
+ }
+ return param;
+}
+
+LLNetworkData* LLViewerObject::getParameterEntry(U16 param_type) const
+{
+ ExtraParameter* param = getExtraParameterEntry(param_type);
+ if (param)
+ {
+ return param->data;
+ }
+ else
+ {
+ return NULL;
+ }
+}
+
+BOOL LLViewerObject::getParameterEntryInUse(U16 param_type) const
+{
+ ExtraParameter* param = getExtraParameterEntry(param_type);
+ if (param)
+ {
+ return param->in_use;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+bool LLViewerObject::setParameterEntry(U16 param_type, const LLNetworkData& new_value, bool local_origin)
+{
+ ExtraParameter* param = getExtraParameterEntryCreate(param_type);
+ if (param)
+ {
+ if (param->in_use && new_value == *(param->data))
+ {
+ return false;
+ }
+ param->in_use = true;
+ param->data->copy(new_value);
+ parameterChanged(param_type, param->data, TRUE, local_origin);
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+// Assumed to be called locally
+// If in_use is TRUE, will crate a new extra parameter if none exists.
+// Should always return true.
+bool LLViewerObject::setParameterEntryInUse(U16 param_type, BOOL in_use, bool local_origin)
+{
+ ExtraParameter* param = getExtraParameterEntryCreate(param_type);
+ if (param && param->in_use != in_use)
+ {
+ param->in_use = in_use;
+ parameterChanged(param_type, param->data, in_use, local_origin);
+ return true;
+ }
+ return false;
+}
+
+void LLViewerObject::parameterChanged(U16 param_type, bool local_origin)
+{
+ ExtraParameter* param = getExtraParameterEntry(param_type);
+ if (param)
+ {
+ parameterChanged(param_type, param->data, param->in_use, local_origin);
+ }
+}
+
+void LLViewerObject::parameterChanged(U16 param_type, LLNetworkData* data, BOOL in_use, bool local_origin)
+{
+ if (local_origin)
+ {
+ LLViewerRegion* regionp = getRegion();
+ if(!regionp) return;
+
+ // Change happened on the viewer. Send the change up
+ U8 tmp[MAX_OBJECT_PARAMS_SIZE];
+ LLDataPackerBinaryBuffer dpb(tmp, MAX_OBJECT_PARAMS_SIZE);
+ if (data->pack(dpb))
+ {
+ U32 datasize = (U32)dpb.getCurrentSize();
+
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_ObjectExtraParams);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_ObjectData);
+ msg->addU32Fast(_PREHASH_ObjectLocalID, mLocalID );
+
+ msg->addU16Fast(_PREHASH_ParamType, param_type);
+ msg->addBOOLFast(_PREHASH_ParamInUse, in_use);
+
+ msg->addU32Fast(_PREHASH_ParamSize, datasize);
+ msg->addBinaryDataFast(_PREHASH_ParamData, tmp, datasize);
+
+ msg->sendReliable( regionp->getHost() );
+ }
+ else
+ {
+ llwarns << "Failed to send object extra parameters: " << param_type << llendl;
+ }
+ }
+}
+
+void LLViewerObject::setDrawableState(U32 state, BOOL recursive)
+{
+ if (mDrawable)
+ {
+ mDrawable->setState(state);
+ }
+ if (recursive)
+ {
+ for (child_list_t::iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* child = *iter;
+ child->setDrawableState(state, recursive);
+ }
+ }
+}
+
+void LLViewerObject::clearDrawableState(U32 state, BOOL recursive)
+{
+ if (mDrawable)
+ {
+ mDrawable->clearState(state);
+ }
+ if (recursive)
+ {
+ for (child_list_t::iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* child = *iter;
+ child->clearDrawableState(state, recursive);
+ }
+ }
+}
+
+//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+// RN: these functions assume a 2-level hierarchy
+//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+// Owned by anyone?
+BOOL LLViewerObject::permAnyOwner() const
+{
+ if (isRootEdit())
+ {
+ return ((mFlags & FLAGS_OBJECT_ANY_OWNER) != 0);
+ }
+ else
+ {
+ return ((LLViewerObject*)getParent())->permAnyOwner();
+ }
+}
+// Owned by this viewer?
+BOOL LLViewerObject::permYouOwner() const
+{
+ if (isRootEdit())
+ {
+#ifdef HACKED_GODLIKE_VIEWER
+ return TRUE;
+#else
+# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
+ if (!LLGridManager::getInstance()->isInProductionGrid()
+ && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+ {
+ return TRUE;
+ }
+# endif
+ return ((mFlags & FLAGS_OBJECT_YOU_OWNER) != 0);
+#endif
+ }
+ else
+ {
+ return ((LLViewerObject*)getParent())->permYouOwner();
+ }
+}
+
+// Owned by a group?
+BOOL LLViewerObject::permGroupOwner() const
+{
+ if (isRootEdit())
+ {
+ return ((mFlags & FLAGS_OBJECT_GROUP_OWNED) != 0);
+ }
+ else
+ {
+ return ((LLViewerObject*)getParent())->permGroupOwner();
+ }
+}
+
+// Can the owner edit
+BOOL LLViewerObject::permOwnerModify() const
+{
+ if (isRootEdit())
+ {
+#ifdef HACKED_GODLIKE_VIEWER
+ return TRUE;
+#else
+# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
+ if (!LLGridManager::getInstance()->isInProductionGrid()
+ && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+ {
+ return TRUE;
+ }
+# endif
+ return ((mFlags & FLAGS_OBJECT_OWNER_MODIFY) != 0);
+#endif
+ }
+ else
+ {
+ return ((LLViewerObject*)getParent())->permOwnerModify();
+ }
+}
+
+// Can edit
+BOOL LLViewerObject::permModify() const
+{
+ if (isRootEdit())
+ {
+#ifdef HACKED_GODLIKE_VIEWER
+ return TRUE;
+#else
+# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
+ if (!LLGridManager::getInstance()->isInProductionGrid()
+ && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+ {
+ return TRUE;
+ }
+# endif
+ return ((mFlags & FLAGS_OBJECT_MODIFY) != 0);
+#endif
+ }
+ else
+ {
+ return ((LLViewerObject*)getParent())->permModify();
+ }
+}
+
+// Can copy
+BOOL LLViewerObject::permCopy() const
+{
+ if (isRootEdit())
+ {
+#ifdef HACKED_GODLIKE_VIEWER
+ return TRUE;
+#else
+# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
+ if (!LLGridManager::getInstance()->isInProductionGrid()
+ && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+ {
+ return TRUE;
+ }
+# endif
+ return ((mFlags & FLAGS_OBJECT_COPY) != 0);
+#endif
+ }
+ else
+ {
+ return ((LLViewerObject*)getParent())->permCopy();
+ }
+}
+
+// Can move
+BOOL LLViewerObject::permMove() const
+{
+ if (isRootEdit())
+ {
+#ifdef HACKED_GODLIKE_VIEWER
+ return TRUE;
+#else
+# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
+ if (!LLGridManager::getInstance()->isInProductionGrid()
+ && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+ {
+ return TRUE;
+ }
+# endif
+ return ((mFlags & FLAGS_OBJECT_MOVE) != 0);
+#endif
+ }
+ else
+ {
+ return ((LLViewerObject*)getParent())->permMove();
+ }
+}
+
+// Can be transferred
+BOOL LLViewerObject::permTransfer() const
+{
+ if (isRootEdit())
+ {
+#ifdef HACKED_GODLIKE_VIEWER
+ return TRUE;
+#else
+# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
+ if (!LLGridManager::getInstance()->isInProductionGrid()
+ && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+ {
+ return TRUE;
+ }
+# endif
+ return ((mFlags & FLAGS_OBJECT_TRANSFER) != 0);
+#endif
+ }
+ else
+ {
+ return ((LLViewerObject*)getParent())->permTransfer();
+ }
+}
+
+// Can only open objects that you own, or that someone has
+// given you modify rights to. JC
+BOOL LLViewerObject::allowOpen() const
+{
+ return !flagInventoryEmpty() && (permYouOwner() || permModify());
+}
+
+LLViewerObject::LLInventoryCallbackInfo::~LLInventoryCallbackInfo()
+{
+ if (mListener)
+ {
+ mListener->clearVOInventoryListener();
+ }
+}
+
+void LLViewerObject::updateVolume(const LLVolumeParams& volume_params)
+{
+ if (setVolume(volume_params, 1)) // *FIX: magic number, ack!
+ {
+ // Transmit the update to the simulator
+ sendShapeUpdate();
+ markForUpdate(TRUE);
+ }
+}
+
+void LLViewerObject::markForUpdate(BOOL priority)
+{
+ if (mDrawable.notNull())
+ {
+ gPipeline.markTextured(mDrawable);
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, priority);
+ }
+}
+
+bool LLViewerObject::getIncludeInSearch() const
+{
+ return ((mFlags & FLAGS_INCLUDE_IN_SEARCH) != 0);
+}
+
+void LLViewerObject::setIncludeInSearch(bool include_in_search)
+{
+ if (include_in_search)
+ {
+ mFlags |= FLAGS_INCLUDE_IN_SEARCH;
+ }
+ else
+ {
+ mFlags &= ~FLAGS_INCLUDE_IN_SEARCH;
+ }
+}
+
+void LLViewerObject::setRegion(LLViewerRegion *regionp)
+{
+ if (!regionp)
+ {
+ llwarns << "viewer object set region to NULL" << llendl;
+ }
+
+ mLatestRecvPacketID = 0;
+ mRegionp = regionp;
+
+ for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i)
+ {
+ LLViewerObject* child = *i;
+ child->setRegion(regionp);
+ }
+
+ setChanged(MOVED | SILHOUETTE);
+ updateDrawable(FALSE);
+}
+
+// virtual
+void LLViewerObject::updateRegion(LLViewerRegion *regionp)
+{
+// if (regionp)
+// {
+// F64 now = LLFrameTimer::getElapsedSeconds();
+// llinfos << "Updating to region " << regionp->getName()
+// << ", ms since last update message: " << (F32)((now - mLastMessageUpdateSecs) * 1000.0)
+// << ", ms since last interpolation: " << (F32)((now - mLastInterpUpdateSecs) * 1000.0)
+// << llendl;
+// }
+}
+
+
+bool LLViewerObject::specialHoverCursor() const
+{
+ return (mFlags & FLAGS_USE_PHYSICS)
+ || (mFlags & FLAGS_HANDLE_TOUCH)
+ || (mClickAction != 0);
+}
+
+void LLViewerObject::updateFlags(BOOL physics_changed)
+{
+ LLViewerRegion* regionp = getRegion();
+ if(!regionp) return;
+ gMessageSystem->newMessage("ObjectFlagUpdate");
+ gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+ gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, getLocalID() );
+ gMessageSystem->addBOOLFast(_PREHASH_UsePhysics, usePhysics() );
+ gMessageSystem->addBOOL("IsTemporary", flagTemporaryOnRez() );
+ gMessageSystem->addBOOL("IsPhantom", flagPhantom() );
+ gMessageSystem->addBOOL("CastsShadows", flagCastShadows() );
+ if (physics_changed)
+ {
+ gMessageSystem->nextBlock("ExtraPhysics");
+ gMessageSystem->addU8("PhysicsShapeType", getPhysicsShapeType() );
+ gMessageSystem->addF32("Density", getPhysicsDensity() );
+ gMessageSystem->addF32("Friction", getPhysicsFriction() );
+ gMessageSystem->addF32("Restitution", getPhysicsRestitution() );
+ gMessageSystem->addF32("GravityMultiplier", getPhysicsGravity() );
+ }
+ gMessageSystem->sendReliable( regionp->getHost() );
+}
+
+BOOL LLViewerObject::setFlags(U32 flags, BOOL state)
+{
+ BOOL setit = FALSE;
+ if (state)
+ {
+ if ((mFlags & flags) != flags)
+ {
+ mFlags |= flags;
+ setit = TRUE;
+ }
+ }
+ else
+ {
+ if ((mFlags & flags) != 0)
+ {
+ mFlags &= ~flags;
+ setit = TRUE;
+ }
+ }
+
+ // BUG: Sometimes viewer physics and simulator physics get
+ // out of sync. To fix this, always send update to simulator.
+// if (setit)
+ {
+ updateFlags();
+ }
+ return setit;
+}
+
+void LLViewerObject::setPhysicsShapeType(U8 type)
+{
+ mPhysicsShapeUnknown = false;
+ mPhysicsShapeType = type;
+ mCostStale = true;
+}
+
+void LLViewerObject::setPhysicsGravity(F32 gravity)
+{
+ mPhysicsGravity = gravity;
+}
+
+void LLViewerObject::setPhysicsFriction(F32 friction)
+{
+ mPhysicsFriction = friction;
+}
+
+void LLViewerObject::setPhysicsDensity(F32 density)
+{
+ mPhysicsDensity = density;
+}
+
+void LLViewerObject::setPhysicsRestitution(F32 restitution)
+{
+ mPhysicsRestitution = restitution;
+}
+
+U8 LLViewerObject::getPhysicsShapeType() const
+{
+ if (mPhysicsShapeUnknown)
+ {
+ mPhysicsShapeUnknown = false;
+ gObjectList.updatePhysicsFlags(this);
+ }
+
+ return mPhysicsShapeType;
+}
+
+void LLViewerObject::applyAngularVelocity(F32 dt)
+{
+ //do target omega here
+ mRotTime += dt;
+ LLVector3 ang_vel = getAngularVelocity();
+ F32 omega = ang_vel.magVecSquared();
+ F32 angle = 0.0f;
+ LLQuaternion dQ;
+ if (omega > 0.00001f)
+ {
+ omega = sqrt(omega);
+ angle = omega * dt;
+
+ ang_vel *= 1.f/omega;
+
+ dQ.setQuat(angle, ang_vel);
+
+ setRotation(getRotation()*dQ);
+ setChanged(MOVED | SILHOUETTE);
+ }
+}
+
+void LLViewerObject::resetRot()
+{
+ mRotTime = 0.0f;
+}
+
+U32 LLViewerObject::getPartitionType() const
+{
+ return LLViewerRegion::PARTITION_NONE;
+}
+
+void LLViewerObject::dirtySpatialGroup(BOOL priority) const
+{
+ if (mDrawable)
+ {
+ LLSpatialGroup* group = mDrawable->getSpatialGroup();
+ if (group)
+ {
+ group->dirtyGeom();
+ gPipeline.markRebuild(group, priority);
+ }
+ }
+}
+
+void LLViewerObject::dirtyMesh()
+{
+ if (mDrawable)
+ {
+ LLSpatialGroup* group = mDrawable->getSpatialGroup();
+ if (group)
+ {
+ group->dirtyMesh();
+ }
+ }
+}
+
+F32 LLAlphaObject::getPartSize(S32 idx)
+{
+ return 0.f;
+}
+
+// virtual
+void LLStaticViewerObject::updateDrawable(BOOL force_damped)
+{
+ // Force an immediate rebuild on any update
+ if (mDrawable.notNull())
+ {
+ mDrawable->updateXform(TRUE);
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
+ }
+ clearChanged(SHIFTED);
+}
+
+void LLViewerObject::saveUnselectedChildrenPosition(std::vector<LLVector3>& positions)
+{
+ if(mChildList.empty() || !positions.empty())
+ {
+ return ;
+ }
+
+ for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* childp = *iter;
+ if (!childp->isSelected() && childp->mDrawable.notNull())
+ {
+ positions.push_back(childp->getPositionEdit());
+ }
+ }
+
+ return ;
+}
+
+void LLViewerObject::saveUnselectedChildrenRotation(std::vector<LLQuaternion>& rotations)
+{
+ if(mChildList.empty())
+ {
+ return ;
+ }
+
+ for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* childp = *iter;
+ if (!childp->isSelected() && childp->mDrawable.notNull())
+ {
+ rotations.push_back(childp->getRotationEdit());
+ }
+ }
+
+ return ;
+}
+
+//counter-rotation
+void LLViewerObject::resetChildrenRotationAndPosition(const std::vector<LLQuaternion>& rotations,
+ const std::vector<LLVector3>& positions)
+{
+ if(mChildList.empty())
+ {
+ return ;
+ }
+
+ S32 index = 0 ;
+ LLQuaternion inv_rotation = ~getRotationEdit() ;
+ LLVector3 offset = getPositionEdit() ;
+ for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* childp = *iter;
+ if (!childp->isSelected() && childp->mDrawable.notNull())
+ {
+ if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR)
+ {
+ childp->setRotation(rotations[index] * inv_rotation);
+ childp->setPosition((positions[index] - offset) * inv_rotation);
+ LLManip::rebuild(childp);
+ }
+ else //avatar
+ {
+ LLVector3 reset_pos = (positions[index] - offset) * inv_rotation ;
+ LLQuaternion reset_rot = rotations[index] * inv_rotation ;
+
+ ((LLVOAvatar*)childp)->mDrawable->mXform.setPosition(reset_pos);
+ ((LLVOAvatar*)childp)->mDrawable->mXform.setRotation(reset_rot) ;
+
+ ((LLVOAvatar*)childp)->mDrawable->getVObj()->setPosition(reset_pos, TRUE);
+ ((LLVOAvatar*)childp)->mDrawable->getVObj()->setRotation(reset_rot, TRUE) ;
+
+ LLManip::rebuild(childp);
+ }
+ index++;
+ }
+ }
+
+ return ;
+}
+
+//counter-translation
+void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplified)
+{
+ if(mChildList.empty())
+ {
+ return ;
+ }
+
+ LLVector3 child_offset;
+ if(simplified) //translation only, rotation matrix does not change
+ {
+ child_offset = offset * ~getRotation();
+ }
+ else //rotation matrix might change too.
+ {
+ if (isAttachment() && mDrawable.notNull())
+ {
+ LLXform* attachment_point_xform = mDrawable->getXform()->getParent();
+ LLQuaternion parent_rotation = getRotation() * attachment_point_xform->getWorldRotation();
+ child_offset = offset * ~parent_rotation;
+ }
+ else
+ {
+ child_offset = offset * ~getRenderRotation();
+ }
+ }
+
+ for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* childp = *iter;
+ if (!childp->isSelected() && childp->mDrawable.notNull())
+ {
+ if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR)
+ {
+ childp->setPosition(childp->getPosition() + child_offset);
+ LLManip::rebuild(childp);
+ }
+ else //avatar
+ {
+ LLVector3 reset_pos = ((LLVOAvatar*)childp)->mDrawable->mXform.getPosition() + child_offset ;
+
+ ((LLVOAvatar*)childp)->mDrawable->mXform.setPosition(reset_pos);
+ ((LLVOAvatar*)childp)->mDrawable->getVObj()->setPosition(reset_pos);
+
+ LLManip::rebuild(childp);
+ }
+ }
+ }
+
+ return ;
+}
+
+const LLUUID &LLViewerObject::getAttachmentItemID() const
+{
+ return mAttachmentItemID;
+}
+
+void LLViewerObject::setAttachmentItemID(const LLUUID &id)
+{
+ mAttachmentItemID = id;
+}
+
+EObjectUpdateType LLViewerObject::getLastUpdateType() const
+{
+ return mLastUpdateType;
+}
+
+void LLViewerObject::setLastUpdateType(EObjectUpdateType last_update_type)
+{
+ mLastUpdateType = last_update_type;
+}
+
+BOOL LLViewerObject::getLastUpdateCached() const
+{
+ return mLastUpdateCached;
+}
+
+void LLViewerObject::setLastUpdateCached(BOOL last_update_cached)
+{
+ mLastUpdateCached = last_update_cached;
+}
+
+const LLUUID &LLViewerObject::extractAttachmentItemID()
+{
+ LLUUID item_id = LLUUID::null;
+ LLNameValue* item_id_nv = getNVPair("AttachItemID");
+ if( item_id_nv )
+ {
+ const char* s = item_id_nv->getString();
+ if( s )
+ {
+ item_id.set(s);
+ }
+ }
+ setAttachmentItemID(item_id);
+ return getAttachmentItemID();
+}
+
+//virtual
+LLVOAvatar* LLViewerObject::getAvatar() const
+{
+ if (isAttachment())
+ {
+ LLViewerObject* vobj = (LLViewerObject*) getParent();
+
+ while (vobj && !vobj->asAvatar())
+ {
+ vobj = (LLViewerObject*) vobj->getParent();
+ }
+
+ return (LLVOAvatar*) vobj;
+ }
+
+ return NULL;
+}
+
+
+class ObjectPhysicsProperties : public LLHTTPNode
+{
+public:
+ virtual void post(
+ ResponsePtr responder,
+ const LLSD& context,
+ const LLSD& input) const
+ {
+ LLSD object_data = input["body"]["ObjectData"];
+ S32 num_entries = object_data.size();
+
+ for ( S32 i = 0; i < num_entries; i++ )
+ {
+ LLSD& curr_object_data = object_data[i];
+ U32 local_id = curr_object_data["LocalID"].asInteger();
+
+ // Iterate through nodes at end, since it can be on both the regular AND hover list
+ struct f : public LLSelectedNodeFunctor
+ {
+ U32 mID;
+ f(const U32& id) : mID(id) {}
+ virtual bool apply(LLSelectNode* node)
+ {
+ return (node->getObject() && node->getObject()->mLocalID == mID );
+ }
+ } func(local_id);
+
+ LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode(&func);
+
+ if (node)
+ {
+ // The LLSD message builder doesn't know how to handle U8, so we need to send as S8 and cast
+ U8 type = (U8)curr_object_data["PhysicsShapeType"].asInteger();
+ F32 density = (F32)curr_object_data["Density"].asReal();
+ F32 friction = (F32)curr_object_data["Friction"].asReal();
+ F32 restitution = (F32)curr_object_data["Restitution"].asReal();
+ F32 gravity = (F32)curr_object_data["GravityMultiplier"].asReal();
+
+ node->getObject()->setPhysicsShapeType(type);
+ node->getObject()->setPhysicsGravity(gravity);
+ node->getObject()->setPhysicsFriction(friction);
+ node->getObject()->setPhysicsDensity(density);
+ node->getObject()->setPhysicsRestitution(restitution);
+ }
+ }
+
+ dialog_refresh_all();
+ };
+};
+
+LLHTTPRegistration<ObjectPhysicsProperties>
+ gHTTPRegistrationObjectPhysicsProperties("/message/ObjectPhysicsProperties");
+
+
+void LLViewerObject::updateQuota( const SelectionQuota& quota )
+{
+ //update quotas
+ mSelectionQuota = quota;
+}
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 21198f7dd1..1335c5c319 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -1,818 +1,825 @@ -/** - * @file llviewerobject.h - * @brief Description of LLViewerObject class, which is the base class for most objects in the viewer. - * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, 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$ - */ - -#ifndef LL_LLVIEWEROBJECT_H -#define LL_LLVIEWEROBJECT_H - -#include <map> - -#include "llassetstorage.h" -#include "lldarrayptr.h" -#include "llhudicon.h" -#include "llinventory.h" -#include "llrefcount.h" -#include "llmemtype.h" -#include "llprimitive.h" -#include "lluuid.h" -#include "llvoinventorylistener.h" -#include "object_flags.h" -#include "llquaternion.h" -#include "v3dmath.h" -#include "v3math.h" -#include "llvertexbuffer.h" - -class LLAgent; // TODO: Get rid of this. -class LLAudioSource; -class LLAudioSourceVO; -class LLBBox; -class LLDataPacker; -class LLColor4; -class LLFrameTimer; -class LLDrawable; -class LLHost; -class LLHUDText; -class LLWorld; -class LLNameValue; -class LLNetMap; -class LLMessageSystem; -class LLPartSysData; -class LLPrimitive; -class LLPipeline; -class LLTextureEntry; -class LLViewerTexture; -class LLViewerInventoryItem; -class LLViewerObject; -class LLViewerPartSourceScript; -class LLViewerRegion; -class LLViewerObjectMedia; -class LLVOInventoryListener; -class LLVOAvatar; - -typedef enum e_object_update_type -{ - OUT_FULL, - OUT_TERSE_IMPROVED, - OUT_FULL_COMPRESSED, - OUT_FULL_CACHED, - OUT_UNKNOWN, -} EObjectUpdateType; - - -// callback typedef for inventory -typedef void (*inventory_callback)(LLViewerObject*, - LLInventoryObject::object_list_t*, - S32 serial_num, - void*); - -// a small struct for keeping track of joints -struct LLVOJointInfo -{ - EHavokJointType mJointType; - LLVector3 mPivot; // parent-frame - // whether the below an axis or anchor (and thus its frame) - // depends on the joint type: - // HINGE ==> axis=parent-frame - // P2P ==> anchor=child-frame - LLVector3 mAxisOrAnchor; -}; - -// for exporting textured materials from SL -struct LLMaterialExportInfo -{ -public: - LLMaterialExportInfo(S32 mat_index, S32 texture_index, LLColor4 color) : - mMaterialIndex(mat_index), mTextureIndex(texture_index), mColor(color) {}; - - S32 mMaterialIndex; - S32 mTextureIndex; - LLColor4 mColor; -}; - -//============================================================================ - -class LLViewerObject : public LLPrimitive, public LLRefCount, public LLGLUpdate -{ -protected: - ~LLViewerObject(); // use unref() - - // TomY: Provide for a list of extra parameter structures, mapped by structure name - struct ExtraParameter - { - BOOL in_use; - LLNetworkData *data; - }; - std::map<U16, ExtraParameter*> mExtraParameterList; - -public: - typedef std::list<LLPointer<LLViewerObject> > child_list_t; - typedef std::list<LLPointer<LLViewerObject> > vobj_list_t; - - typedef const child_list_t const_child_list_t; - - LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp, BOOL is_global = FALSE); - MEM_TYPE_NEW(LLMemType::MTYPE_OBJECT); - - virtual void markDead(); // Mark this object as dead, and clean up its references - BOOL isDead() const {return mDead;} - BOOL isOrphaned() const { return mOrphaned; } - BOOL isParticleSource() const; - - virtual LLVOAvatar* asAvatar(); - - static void initVOClasses(); - static void cleanupVOClasses(); - - void addNVPair(const std::string& data); - BOOL removeNVPair(const std::string& name); - LLNameValue* getNVPair(const std::string& name) const; // null if no name value pair by that name - - // Object create and update functions - virtual BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); - - // Types of media we can associate - enum { MEDIA_NONE = 0, MEDIA_SET = 1 }; - - // Return codes for processUpdateMessage - enum { - MEDIA_URL_REMOVED = 0x1, - MEDIA_URL_ADDED = 0x2, - MEDIA_URL_UPDATED = 0x4, - MEDIA_FLAGS_CHANGED = 0x8, - INVALID_UPDATE = 0x80000000 - }; - - virtual U32 processUpdateMessage(LLMessageSystem *mesgsys, - void **user_data, - U32 block_num, - const EObjectUpdateType update_type, - LLDataPacker *dp); - - - virtual BOOL isActive() const; // Whether this object needs to do an idleUpdate. - BOOL onActiveList() const {return mOnActiveList;} - void setOnActiveList(BOOL on_active) { mOnActiveList = on_active; } - - virtual BOOL isAttachment() const { return FALSE; } - virtual LLVOAvatar* getAvatar() const; //get the avatar this object is attached to, or NULL if object is not an attachment - virtual BOOL isHUDAttachment() const { return FALSE; } - virtual void updateRadius() {}; - virtual F32 getVObjRadius() const; // default implemenation is mDrawable->getRadius() - - BOOL isJointChild() const { return mJointInfo ? TRUE : FALSE; } - EHavokJointType getJointType() const { return mJointInfo ? mJointInfo->mJointType : HJT_INVALID; } - // for jointed and other parent-relative hacks - LLViewerObject* getSubParent(); - const LLViewerObject* getSubParent() const; - - // Object visiblility and GPW functions - virtual void setPixelAreaAndAngle(LLAgent &agent); // Override to generate accurate apparent angle and area - - virtual U32 getNumVertices() const; - virtual U32 getNumIndices() const; - S32 getNumFaces() const { return mNumFaces; } - - // Graphical stuff for objects - maybe broken out into render class later? - virtual void updateTextures(); - virtual void boostTexturePriority(BOOL boost_children = TRUE); // When you just want to boost priority of this object - - virtual LLDrawable* createDrawable(LLPipeline *pipeline); - virtual BOOL updateGeometry(LLDrawable *drawable); - virtual void updateGL(); - virtual void updateFaceSize(S32 idx); - virtual BOOL updateLOD(); - virtual BOOL setDrawableParent(LLDrawable* parentp); - F32 getRotTime() { return mRotTime; } - void resetRot(); - void applyAngularVelocity(F32 dt); - - void setLineWidthForWindowSize(S32 window_width); - - static void increaseArrowLength(); // makes axis arrows for selections longer - static void decreaseArrowLength(); // makes axis arrows for selections shorter - - // Accessor functions - LLViewerRegion* getRegion() const { return mRegionp; } - - BOOL isSelected() const { return mUserSelected; } - virtual void setSelected(BOOL sel) { mUserSelected = sel; mRotTime = 0.f;} - - const LLUUID &getID() const { return mID; } - U32 getLocalID() const { return mLocalID; } - U32 getCRC() const { return mTotalCRC; } - - virtual BOOL isFlexible() const { return FALSE; } - virtual BOOL isSculpted() const { return FALSE; } - virtual BOOL isMesh() const { return FALSE; } - virtual BOOL hasLightTexture() const { return FALSE; } - - // This method returns true if the object is over land owned by - // the agent, one of its groups, or it encroaches and - // anti-encroachment is enabled - bool isReturnable(); - - /* - // This method will scan through this object, and then query the - // selection manager to see if the local agent probably has the - // ability to modify the object. Since this calls into the - // selection manager, you should avoid calling this method from - // there. - BOOL isProbablyModifiable() const; - */ - - virtual BOOL setParent(LLViewerObject* parent); - virtual void addChild(LLViewerObject *childp); - virtual void removeChild(LLViewerObject *childp); - const_child_list_t& getChildren() const { return mChildList; } - S32 numChildren() const { return mChildList.size(); } - void addThisAndAllChildren(std::vector<LLViewerObject*>& objects); - void addThisAndNonJointChildren(std::vector<LLViewerObject*>& objects); - BOOL isChild(LLViewerObject *childp) const; - BOOL isSeat() const; - - - //detect if given line segment (in agent space) intersects with this viewer object. - //returns TRUE if intersection detected and returns information about intersection - virtual BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, - S32 face = -1, // which face to check, -1 = ALL_SIDES - BOOL pick_transparent = FALSE, - S32* face_hit = NULL, // which face was hit - LLVector3* intersection = NULL, // return the intersection point - LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point - LLVector3* normal = NULL, // return the surface normal at the intersection point - LLVector3* bi_normal = NULL // return the surface bi-normal at the intersection point - ); - - virtual BOOL lineSegmentBoundingBox(const LLVector3& start, const LLVector3& end); - - virtual const LLVector3d getPositionGlobal() const; - virtual const LLVector3 &getPositionRegion() const; - virtual const LLVector3 getPositionEdit() const; - virtual const LLVector3 &getPositionAgent() const; - virtual const LLVector3 getRenderPosition() const; - - virtual const LLVector3 getPivotPositionAgent() const; // Usually = to getPositionAgent, unless like flex objects it's not - - LLViewerObject* getRootEdit() const; - - const LLQuaternion getRotationRegion() const; - const LLQuaternion getRotationEdit() const; - const LLQuaternion getRenderRotation() const; - virtual const LLMatrix4 getRenderMatrix() const; - - void setPosition(const LLVector3 &pos, BOOL damped = FALSE); - void setPositionGlobal(const LLVector3d &position, BOOL damped = FALSE); - void setPositionRegion(const LLVector3 &position, BOOL damped = FALSE); - void setPositionEdit(const LLVector3 &position, BOOL damped = FALSE); - void setPositionAgent(const LLVector3 &pos_agent, BOOL damped = FALSE); - void setPositionParent(const LLVector3 &pos_parent, BOOL damped = FALSE); - void setPositionAbsoluteGlobal( const LLVector3d &pos_global, BOOL damped = FALSE ); - - virtual const LLMatrix4& getWorldMatrix(LLXformMatrix* xform) const { return xform->getWorldMatrix(); } - - inline void setRotation(const F32 x, const F32 y, const F32 z, BOOL damped = FALSE); - inline void setRotation(const LLQuaternion& quat, BOOL damped = FALSE); - void sendRotationUpdate() const; - - /*virtual*/ void setNumTEs(const U8 num_tes); - /*virtual*/ void setTE(const U8 te, const LLTextureEntry &texture_entry); - /*virtual*/ S32 setTETexture(const U8 te, const LLUUID &uuid); - S32 setTETextureCore(const U8 te, const LLUUID& uuid, LLHost host); - /*virtual*/ S32 setTEColor(const U8 te, const LLColor3 &color); - /*virtual*/ S32 setTEColor(const U8 te, const LLColor4 &color); - /*virtual*/ S32 setTEScale(const U8 te, const F32 s, const F32 t); - /*virtual*/ S32 setTEScaleS(const U8 te, const F32 s); - /*virtual*/ S32 setTEScaleT(const U8 te, const F32 t); - /*virtual*/ S32 setTEOffset(const U8 te, const F32 s, const F32 t); - /*virtual*/ S32 setTEOffsetS(const U8 te, const F32 s); - /*virtual*/ S32 setTEOffsetT(const U8 te, const F32 t); - /*virtual*/ S32 setTERotation(const U8 te, const F32 r); - /*virtual*/ S32 setTEBumpmap(const U8 te, const U8 bump ); - /*virtual*/ S32 setTETexGen(const U8 te, const U8 texgen ); - /*virtual*/ S32 setTEMediaTexGen(const U8 te, const U8 media ); // *FIXME: this confusingly acts upon a superset of setTETexGen's flags without absorbing its semantics - /*virtual*/ S32 setTEShiny(const U8 te, const U8 shiny ); - /*virtual*/ S32 setTEFullbright(const U8 te, const U8 fullbright ); - /*virtual*/ S32 setTEMediaFlags(const U8 te, const U8 media_flags ); - /*virtual*/ S32 setTEGlow(const U8 te, const F32 glow); - /*virtual*/ BOOL setMaterial(const U8 material); - virtual void setTEImage(const U8 te, LLViewerTexture *imagep); // Not derived from LLPrimitive - void changeTEImage(S32 index, LLViewerTexture* new_image) ; - LLViewerTexture *getTEImage(const U8 te) const; - - void fitFaceTexture(const U8 face); - void sendTEUpdate() const; // Sends packed representation of all texture entry information - - virtual void setScale(const LLVector3 &scale, BOOL damped = FALSE); - - virtual F32 getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL); - virtual U32 getTriangleCount(); - virtual U32 getHighLODTriangleCount(); - - void setObjectCost(F32 cost); - F32 getObjectCost(); - - void setLinksetCost(F32 cost); - F32 getLinksetCost(); - - void setPhysicsCost(F32 cost); - F32 getPhysicsCost(); - - void setLinksetPhysicsCost(F32 cost); - F32 getLinksetPhysicsCost(); - - void sendShapeUpdate(); - - U8 getState() { return mState; } - - F32 getAppAngle() const { return mAppAngle; } - F32 getPixelArea() const { return mPixelArea; } - void setPixelArea(F32 area) { mPixelArea = area; } - F32 getMaxScale() const; - F32 getMidScale() const; - F32 getMinScale() const; - - // Owner id is this object's owner - void setAttachedSound(const LLUUID &audio_uuid, const LLUUID& owner_id, const F32 gain, const U8 flags); - void adjustAudioGain(const F32 gain); - void clearAttachedSound() { mAudioSourcep = NULL; } - - // Create if necessary - LLAudioSource *getAudioSource(const LLUUID& owner_id); - bool isAudioSource() {return mAudioSourcep != NULL;} - - U8 getMediaType() const; - void setMediaType(U8 media_type); - - std::string getMediaURL() const; - void setMediaURL(const std::string& media_url); - - BOOL getMediaPassedWhitelist() const; - void setMediaPassedWhitelist(BOOL passed); - - void sendMaterialUpdate() const; - - void setCanSelect(BOOL canSelect); - - void setDebugText(const std::string &utf8text); - void setIcon(LLViewerTexture* icon_image); - void clearIcon(); - - void markForUpdate(BOOL priority); - void updateVolume(const LLVolumeParams& volume_params); - virtual void updateSpatialExtents(LLVector4a& min, LLVector4a& max); - virtual F32 getBinRadius(); - - LLBBox getBoundingBoxAgent() const; - - void updatePositionCaches() const; // Update the global and region position caches from the object (and parent's) xform. - void updateText(); // update text label position - virtual void updateDrawable(BOOL force_damped); // force updates on static objects - - void setDrawableState(U32 state, BOOL recursive = TRUE); - void clearDrawableState(U32 state, BOOL recursive = TRUE); - - // Called when the drawable shifts - virtual void onShift(const LLVector4a &shift_vector) { } - - ////////////////////////////////////// - // - // Inventory methods - // - - // This function is called when someone is interested in a viewer - // object's inventory. The callback is called as soon as the - // viewer object has the inventory stored locally. - void registerInventoryListener(LLVOInventoryListener* listener, void* user_data); - void removeInventoryListener(LLVOInventoryListener* listener); - BOOL isInventoryPending() { return mInventoryPending; } - void clearInventoryListeners(); - void requestInventory(); - void fetchInventoryFromServer(); - static void processTaskInv(LLMessageSystem* msg, void** user_data); - void removeInventory(const LLUUID& item_id); - - // The updateInventory() call potentially calls into the selection - // manager, so do no call updateInventory() from the selection - // manager until we have better iterators. - void updateInventory(LLViewerInventoryItem* item, U8 key, bool is_new); - void updateInventoryLocal(LLInventoryItem* item, U8 key); // Update without messaging. - LLInventoryObject* getInventoryObject(const LLUUID& item_id); - void getInventoryContents(LLInventoryObject::object_list_t& objects); - LLInventoryObject* getInventoryRoot(); - LLViewerInventoryItem* getInventoryItemByAsset(const LLUUID& asset_id); - S16 getInventorySerial() const { return mInventorySerialNum; } - - // These functions does viewer-side only object inventory modifications - void updateViewerInventoryAsset( - const LLViewerInventoryItem* item, - const LLUUID& new_asset); - - // This function will make sure that we refresh the inventory. - void dirtyInventory(); - BOOL isInventoryDirty() { return mInventoryDirty; } - - // save a script, which involves removing the old one, and rezzing - // in the new one. This method should be called with the asset id - // of the new and old script AFTER the bytecode has been saved. - void saveScript(const LLViewerInventoryItem* item, BOOL active, bool is_new); - - // move an inventory item out of the task and into agent - // inventory. This operation is based on messaging. No permissions - // checks are made on the viewer - the server will double check. - void moveInventory(const LLUUID& agent_folder, const LLUUID& item_id); - - // Find the number of instances of this object's inventory that are of the given type - S32 countInventoryContents( LLAssetType::EType type ); - - BOOL permAnyOwner() const; - BOOL permYouOwner() const; - BOOL permGroupOwner() const; - BOOL permOwnerModify() const; - BOOL permModify() const; - BOOL permCopy() const; - BOOL permMove() const; - BOOL permTransfer() const; - inline BOOL usePhysics() const { return ((mFlags & FLAGS_USE_PHYSICS) != 0); } - inline BOOL flagScripted() const { return ((mFlags & FLAGS_SCRIPTED) != 0); } - inline BOOL flagHandleTouch() const { return ((mFlags & FLAGS_HANDLE_TOUCH) != 0); } - inline BOOL flagTakesMoney() const { return ((mFlags & FLAGS_TAKES_MONEY) != 0); } - inline BOOL flagPhantom() const { return ((mFlags & FLAGS_PHANTOM) != 0); } - inline BOOL flagInventoryEmpty() const { return ((mFlags & FLAGS_INVENTORY_EMPTY) != 0); } - inline BOOL flagCastShadows() const { return ((mFlags & FLAGS_CAST_SHADOWS) != 0); } - inline BOOL flagAllowInventoryAdd() const { return ((mFlags & FLAGS_ALLOW_INVENTORY_DROP) != 0); } - inline BOOL flagTemporary() const { return ((mFlags & FLAGS_TEMPORARY) != 0); } - inline BOOL flagTemporaryOnRez() const { return ((mFlags & FLAGS_TEMPORARY_ON_REZ) != 0); } - inline BOOL flagAnimSource() const { return ((mFlags & FLAGS_ANIM_SOURCE) != 0); } - inline BOOL flagCameraSource() const { return ((mFlags & FLAGS_CAMERA_SOURCE) != 0); } - inline BOOL flagCameraDecoupled() const { return ((mFlags & FLAGS_CAMERA_DECOUPLED) != 0); } - inline BOOL flagObjectMove() const { return ((mFlags & FLAGS_OBJECT_MOVE) != 0); } - - U8 getPhysicsShapeType() const; - inline F32 getPhysicsGravity() const { return mPhysicsGravity; } - inline F32 getPhysicsFriction() const { return mPhysicsFriction; } - inline F32 getPhysicsDensity() const { return mPhysicsDensity; } - inline F32 getPhysicsRestitution() const { return mPhysicsRestitution; } - - bool getIncludeInSearch() const; - void setIncludeInSearch(bool include_in_search); - - // Does "open" object menu item apply? - BOOL allowOpen() const; - - void setClickAction(U8 action) { mClickAction = action; } - U8 getClickAction() const { return mClickAction; } - bool specialHoverCursor() const; // does it have a special hover cursor? - - void setRegion(LLViewerRegion *regionp); - virtual void updateRegion(LLViewerRegion *regionp); - - void updateFlags(BOOL physics_changed = FALSE); - BOOL setFlags(U32 flag, BOOL state); - void setPhysicsShapeType(U8 type); - void setPhysicsGravity(F32 gravity); - void setPhysicsFriction(F32 friction); - void setPhysicsDensity(F32 density); - void setPhysicsRestitution(F32 restitution); - - virtual void dump() const; - static U32 getNumZombieObjects() { return sNumZombieObjects; } - - void printNameValuePairs() const; - - virtual S32 getLOD() const { return 3; } - virtual U32 getPartitionType() const; - virtual void dirtySpatialGroup(BOOL priority = FALSE) const; - virtual void dirtyMesh(); - - virtual LLNetworkData* getParameterEntry(U16 param_type) const; - virtual bool setParameterEntry(U16 param_type, const LLNetworkData& new_value, bool local_origin); - virtual BOOL getParameterEntryInUse(U16 param_type) const; - virtual bool setParameterEntryInUse(U16 param_type, BOOL in_use, bool local_origin); - // Called when a parameter is changed - virtual void parameterChanged(U16 param_type, bool local_origin); - virtual void parameterChanged(U16 param_type, LLNetworkData* data, BOOL in_use, bool local_origin); - - friend class LLViewerObjectList; - friend class LLViewerMediaList; - -public: - //counter-translation - void resetChildrenPosition(const LLVector3& offset, BOOL simplified = FALSE) ; - //counter-rotation - void resetChildrenRotationAndPosition(const std::vector<LLQuaternion>& rotations, - const std::vector<LLVector3>& positions) ; - void saveUnselectedChildrenRotation(std::vector<LLQuaternion>& rotations) ; - void saveUnselectedChildrenPosition(std::vector<LLVector3>& positions) ; - std::vector<LLVector3> mUnselectedChildrenPositions ; - -private: - ExtraParameter* createNewParameterEntry(U16 param_type); - ExtraParameter* getExtraParameterEntry(U16 param_type) const; - ExtraParameter* getExtraParameterEntryCreate(U16 param_type); - bool unpackParameterEntry(U16 param_type, LLDataPacker *dp); - - // This function checks to see if the given media URL has changed its version - // and the update wasn't due to this agent's last action. - U32 checkMediaURL(const std::string &media_url); - - // Motion prediction between updates - void interpolateLinearMotion(const F64 & time, const F32 & dt); - -public: - // - // Viewer-side only types - use the LL_PCODE_APP mask. - // - typedef enum e_vo_types - { - LL_VO_CLOUDS = LL_PCODE_APP | 0x20, - LL_VO_SURFACE_PATCH = LL_PCODE_APP | 0x30, - LL_VO_WL_SKY = LL_PCODE_APP | 0x40, - LL_VO_SQUARE_TORUS = LL_PCODE_APP | 0x50, - LL_VO_SKY = LL_PCODE_APP | 0x60, - LL_VO_VOID_WATER = LL_PCODE_APP | 0x70, - LL_VO_WATER = LL_PCODE_APP | 0x80, - LL_VO_GROUND = LL_PCODE_APP | 0x90, - LL_VO_PART_GROUP = LL_PCODE_APP | 0xa0, - LL_VO_TRIANGLE_TORUS = LL_PCODE_APP | 0xb0, - LL_VO_HUD_PART_GROUP = LL_PCODE_APP | 0xc0, - } EVOType; - - typedef enum e_physics_shape_types - { - PHYSICS_SHAPE_PRIM = 0, - PHYSICS_SHAPE_NONE, - PHYSICS_SHAPE_CONVEX_HULL, - } EPhysicsShapeType; - - LLUUID mID; - - // unique within region, not unique across regions - // Local ID = 0 is not used - U32 mLocalID; - - // Last total CRC received from sim, used for caching - U32 mTotalCRC; - - LLPointer<LLViewerTexture> *mTEImages; - - // Selection, picking and rendering variables - U32 mGLName; // GL "name" used by selection code - BOOL mbCanSelect; // true if user can select this object by clicking - - // Grabbed from UPDATE_FLAGS - U32 mFlags; - - // Sent to sim in UPDATE_FLAGS, received in ObjectPhysicsProperties - U8 mPhysicsShapeType; - F32 mPhysicsGravity; - F32 mPhysicsFriction; - F32 mPhysicsDensity; - F32 mPhysicsRestitution; - - - // Pipeline classes - LLPointer<LLDrawable> mDrawable; - - // Band-aid to select object after all creation initialization is done - BOOL mCreateSelected; - - // Replace textures with web pages on this object while drawing - BOOL mRenderMedia; - - // In bits - S32 mBestUpdatePrecision; - - // TODO: Make all this stuff private. JC - LLPointer<LLHUDText> mText; - LLPointer<LLHUDIcon> mIcon; - - static BOOL sUseSharedDrawables; - -protected: - // delete an item in the inventory, but don't tell the - // server. This is used internally by remove, update, and - // savescript. - void deleteInventoryItem(const LLUUID& item_id); - - // do the update/caching logic. called by saveScript and - // updateInventory. - void doUpdateInventory(LLPointer<LLViewerInventoryItem>& item, U8 key, bool is_new); - - - static LLViewerObject *createObject(const LLUUID &id, LLPCode pcode, LLViewerRegion *regionp); - - BOOL setData(const U8 *datap, const U32 data_size); - - // Hide or show HUD, icon and particles - void hideExtraDisplayItems( BOOL hidden ); - - ////////////////////////// - // - // inventory functionality - // - - static void processTaskInvFile(void** user_data, S32 error_code, LLExtStat ext_status); - void loadTaskInvFile(const std::string& filename); - void doInventoryCallback(); - - BOOL isOnMap(); - - void unpackParticleSource(const S32 block_num, const LLUUID& owner_id); - void unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_id); - void deleteParticleSource(); - void setParticleSource(const LLPartSysData& particle_parameters, const LLUUID& owner_id); - -private: - void setNameValueList(const std::string& list); // clears nv pairs and then individually adds \n separated NV pairs from \0 terminated string - void deleteTEImages(); // correctly deletes list of images - -protected: - typedef std::map<char *, LLNameValue *> name_value_map_t; - name_value_map_t mNameValuePairs; // Any name-value pairs stored by script - - child_list_t mChildList; - - F64 mLastInterpUpdateSecs; // Last update for purposes of interpolation - F64 mLastMessageUpdateSecs; // Last update from a message from the simulator - TPACKETID mLatestRecvPacketID; // Latest time stamp on message from simulator - - // extra data sent from the sim...currently only used for tree species info - U8* mData; - - LLPointer<LLViewerPartSourceScript> mPartSourcep; // Particle source associated with this object. - LLAudioSourceVO* mAudioSourcep; - F32 mAudioGain; - - F32 mAppAngle; // Apparent visual arc in degrees - F32 mPixelArea; // Apparent area in pixels - - // This is the object's inventory from the viewer's perspective. - LLInventoryObject::object_list_t* mInventory; - class LLInventoryCallbackInfo - { - public: - ~LLInventoryCallbackInfo(); - LLVOInventoryListener* mListener; - void* mInventoryData; - }; - typedef std::list<LLInventoryCallbackInfo*> callback_list_t; - callback_list_t mInventoryCallbacks; - S16 mInventorySerialNum; - - LLViewerRegion *mRegionp; // Region that this object belongs to. - BOOL mInventoryPending; - BOOL mInventoryDirty; - BOOL mDead; - BOOL mOrphaned; // This is an orphaned child - BOOL mUserSelected; // Cached user select information - BOOL mOnActiveList; - BOOL mOnMap; // On the map. - BOOL mStatic; // Object doesn't move. - S32 mNumFaces; - - F32 mTimeDilation; // Time dilation sent with the object. - F32 mRotTime; // Amount (in seconds) that object has rotated according to angular velocity (llSetTargetOmega) - LLQuaternion mLastRot; // last rotation received from the simulator - - LLVOJointInfo* mJointInfo; - U8 mState; // legacy - LLViewerObjectMedia* mMedia; // NULL if no media associated - U8 mClickAction; - F32 mObjectCost; //resource cost of this object or -1 if unknown - F32 mLinksetCost; - F32 mPhysicsCost; - F32 mLinksetPhysicsCost; - - bool mCostStale; - mutable bool mPhysicsShapeUnknown; - - static U32 sNumZombieObjects; // Objects which are dead, but not deleted - - static BOOL sMapDebug; // Map render mode - static LLColor4 sEditSelectColor; - static LLColor4 sNoEditSelectColor; - static F32 sCurrentPulse; - static BOOL sPulseEnabled; - - static S32 sAxisArrowLength; - - // These two caches are only correct for non-parented objects right now! - mutable LLVector3 mPositionRegion; - mutable LLVector3 mPositionAgent; - - static void setPhaseOutUpdateInterpolationTime(F32 value) { sPhaseOutUpdateInterpolationTime = (F64) value; } - static void setMaxUpdateInterpolationTime(F32 value) { sMaxUpdateInterpolationTime = (F64) value; } - - static void setVelocityInterpolate(BOOL value) { sVelocityInterpolate = value; } - static void setPingInterpolate(BOOL value) { sPingInterpolate = value; } - -private: - static S32 sNumObjects; - - static F64 sPhaseOutUpdateInterpolationTime; // For motion interpolation - static F64 sMaxUpdateInterpolationTime; // For motion interpolation - - static BOOL sVelocityInterpolate; - static BOOL sPingInterpolate; - - //-------------------------------------------------------------------- - // For objects that are attachments - //-------------------------------------------------------------------- -public: - const LLUUID &getAttachmentItemID() const; - void setAttachmentItemID(const LLUUID &id); - const LLUUID &extractAttachmentItemID(); // find&set the inventory item ID of the attached object - EObjectUpdateType getLastUpdateType() const; - void setLastUpdateType(EObjectUpdateType last_update_type); - BOOL getLastUpdateCached() const; - void setLastUpdateCached(BOOL last_update_cached); - -private: - LLUUID mAttachmentItemID; // ItemID of the associated object is in user inventory. - EObjectUpdateType mLastUpdateType; - BOOL mLastUpdateCached; -}; - -/////////////////// -// -// Inlines -// -// - -inline void LLViewerObject::setRotation(const LLQuaternion& quat, BOOL damped) -{ - LLPrimitive::setRotation(quat); - setChanged(ROTATED | SILHOUETTE); - updateDrawable(damped); -} - -inline void LLViewerObject::setRotation(const F32 x, const F32 y, const F32 z, BOOL damped) -{ - LLPrimitive::setRotation(x, y, z); - setChanged(ROTATED | SILHOUETTE); - updateDrawable(damped); -} - -class LLViewerObjectMedia -{ -public: - LLViewerObjectMedia() : mMediaURL(), mPassedWhitelist(FALSE), mMediaType(0) { } - - std::string mMediaURL; // for web pages on surfaces, one per prim - BOOL mPassedWhitelist; // user has OK'd display - U8 mMediaType; // see LLTextureEntry::WEB_PAGE, etc. -}; - -// subclass of viewer object that can be added to particle partitions -class LLAlphaObject : public LLViewerObject -{ -public: - LLAlphaObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) - : LLViewerObject(id,pcode,regionp) - { mDepth = 0.f; } - - virtual F32 getPartSize(S32 idx); - virtual void getGeometry(S32 idx, - LLStrider<LLVector3>& verticesp, - LLStrider<LLVector3>& normalsp, - LLStrider<LLVector2>& texcoordsp, - LLStrider<LLColor4U>& colorsp, - LLStrider<U16>& indicesp) = 0; - - F32 mDepth; -}; - -class LLStaticViewerObject : public LLViewerObject -{ -public: - LLStaticViewerObject(const LLUUID& id, const LLPCode pcode, LLViewerRegion* regionp, BOOL is_global = FALSE) - : LLViewerObject(id,pcode,regionp, is_global) - { } - - virtual void updateDrawable(BOOL force_damped); -}; - - -#endif +/**
+ * @file llviewerobject.h
+ * @brief Description of LLViewerObject class, which is the base class for most objects in the viewer.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, 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$
+ */
+
+#ifndef LL_LLVIEWEROBJECT_H
+#define LL_LLVIEWEROBJECT_H
+
+#include <map>
+
+#include "llassetstorage.h"
+#include "lldarrayptr.h"
+#include "llhudicon.h"
+#include "llinventory.h"
+#include "llrefcount.h"
+#include "llmemtype.h"
+#include "llprimitive.h"
+#include "lluuid.h"
+#include "llvoinventorylistener.h"
+#include "object_flags.h"
+#include "llquaternion.h"
+#include "v3dmath.h"
+#include "v3math.h"
+#include "llvertexbuffer.h"
+#include "llaccountingquota.h"
+
+class LLAgent; // TODO: Get rid of this.
+class LLAudioSource;
+class LLAudioSourceVO;
+class LLBBox;
+class LLDataPacker;
+class LLColor4;
+class LLFrameTimer;
+class LLDrawable;
+class LLHost;
+class LLHUDText;
+class LLWorld;
+class LLNameValue;
+class LLNetMap;
+class LLMessageSystem;
+class LLPartSysData;
+class LLPrimitive;
+class LLPipeline;
+class LLTextureEntry;
+class LLViewerTexture;
+class LLViewerInventoryItem;
+class LLViewerObject;
+class LLViewerPartSourceScript;
+class LLViewerRegion;
+class LLViewerObjectMedia;
+class LLVOInventoryListener;
+class LLVOAvatar;
+
+typedef enum e_object_update_type
+{
+ OUT_FULL,
+ OUT_TERSE_IMPROVED,
+ OUT_FULL_COMPRESSED,
+ OUT_FULL_CACHED,
+ OUT_UNKNOWN,
+} EObjectUpdateType;
+
+
+// callback typedef for inventory
+typedef void (*inventory_callback)(LLViewerObject*,
+ LLInventoryObject::object_list_t*,
+ S32 serial_num,
+ void*);
+
+// a small struct for keeping track of joints
+struct LLVOJointInfo
+{
+ EHavokJointType mJointType;
+ LLVector3 mPivot; // parent-frame
+ // whether the below an axis or anchor (and thus its frame)
+ // depends on the joint type:
+ // HINGE ==> axis=parent-frame
+ // P2P ==> anchor=child-frame
+ LLVector3 mAxisOrAnchor;
+};
+
+// for exporting textured materials from SL
+struct LLMaterialExportInfo
+{
+public:
+ LLMaterialExportInfo(S32 mat_index, S32 texture_index, LLColor4 color) :
+ mMaterialIndex(mat_index), mTextureIndex(texture_index), mColor(color) {};
+
+ S32 mMaterialIndex;
+ S32 mTextureIndex;
+ LLColor4 mColor;
+};
+
+//============================================================================
+
+class LLViewerObject : public LLPrimitive, public LLRefCount, public LLGLUpdate
+{
+protected:
+ ~LLViewerObject(); // use unref()
+
+ // TomY: Provide for a list of extra parameter structures, mapped by structure name
+ struct ExtraParameter
+ {
+ BOOL in_use;
+ LLNetworkData *data;
+ };
+ std::map<U16, ExtraParameter*> mExtraParameterList;
+
+public:
+ typedef std::list<LLPointer<LLViewerObject> > child_list_t;
+ typedef std::list<LLPointer<LLViewerObject> > vobj_list_t;
+
+ typedef const child_list_t const_child_list_t;
+
+ LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp, BOOL is_global = FALSE);
+ MEM_TYPE_NEW(LLMemType::MTYPE_OBJECT);
+
+ virtual void markDead(); // Mark this object as dead, and clean up its references
+ BOOL isDead() const {return mDead;}
+ BOOL isOrphaned() const { return mOrphaned; }
+ BOOL isParticleSource() const;
+
+ virtual LLVOAvatar* asAvatar();
+
+ static void initVOClasses();
+ static void cleanupVOClasses();
+
+ void addNVPair(const std::string& data);
+ BOOL removeNVPair(const std::string& name);
+ LLNameValue* getNVPair(const std::string& name) const; // null if no name value pair by that name
+
+ // Object create and update functions
+ virtual BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
+
+ // Types of media we can associate
+ enum { MEDIA_NONE = 0, MEDIA_SET = 1 };
+
+ // Return codes for processUpdateMessage
+ enum {
+ MEDIA_URL_REMOVED = 0x1,
+ MEDIA_URL_ADDED = 0x2,
+ MEDIA_URL_UPDATED = 0x4,
+ MEDIA_FLAGS_CHANGED = 0x8,
+ INVALID_UPDATE = 0x80000000
+ };
+
+ virtual U32 processUpdateMessage(LLMessageSystem *mesgsys,
+ void **user_data,
+ U32 block_num,
+ const EObjectUpdateType update_type,
+ LLDataPacker *dp);
+
+
+ virtual BOOL isActive() const; // Whether this object needs to do an idleUpdate.
+ BOOL onActiveList() const {return mOnActiveList;}
+ void setOnActiveList(BOOL on_active) { mOnActiveList = on_active; }
+
+ virtual BOOL isAttachment() const { return FALSE; }
+ virtual LLVOAvatar* getAvatar() const; //get the avatar this object is attached to, or NULL if object is not an attachment
+ virtual BOOL isHUDAttachment() const { return FALSE; }
+ virtual void updateRadius() {};
+ virtual F32 getVObjRadius() const; // default implemenation is mDrawable->getRadius()
+
+ BOOL isJointChild() const { return mJointInfo ? TRUE : FALSE; }
+ EHavokJointType getJointType() const { return mJointInfo ? mJointInfo->mJointType : HJT_INVALID; }
+ // for jointed and other parent-relative hacks
+ LLViewerObject* getSubParent();
+ const LLViewerObject* getSubParent() const;
+
+ // Object visiblility and GPW functions
+ virtual void setPixelAreaAndAngle(LLAgent &agent); // Override to generate accurate apparent angle and area
+
+ virtual U32 getNumVertices() const;
+ virtual U32 getNumIndices() const;
+ S32 getNumFaces() const { return mNumFaces; }
+
+ // Graphical stuff for objects - maybe broken out into render class later?
+ virtual void updateTextures();
+ virtual void boostTexturePriority(BOOL boost_children = TRUE); // When you just want to boost priority of this object
+
+ virtual LLDrawable* createDrawable(LLPipeline *pipeline);
+ virtual BOOL updateGeometry(LLDrawable *drawable);
+ virtual void updateGL();
+ virtual void updateFaceSize(S32 idx);
+ virtual BOOL updateLOD();
+ virtual BOOL setDrawableParent(LLDrawable* parentp);
+ F32 getRotTime() { return mRotTime; }
+ void resetRot();
+ void applyAngularVelocity(F32 dt);
+
+ void setLineWidthForWindowSize(S32 window_width);
+
+ static void increaseArrowLength(); // makes axis arrows for selections longer
+ static void decreaseArrowLength(); // makes axis arrows for selections shorter
+
+ // Accessor functions
+ LLViewerRegion* getRegion() const { return mRegionp; }
+
+ BOOL isSelected() const { return mUserSelected; }
+ virtual void setSelected(BOOL sel) { mUserSelected = sel; mRotTime = 0.f;}
+
+ const LLUUID &getID() const { return mID; }
+ U32 getLocalID() const { return mLocalID; }
+ U32 getCRC() const { return mTotalCRC; }
+
+ virtual BOOL isFlexible() const { return FALSE; }
+ virtual BOOL isSculpted() const { return FALSE; }
+ virtual BOOL isMesh() const { return FALSE; }
+ virtual BOOL hasLightTexture() const { return FALSE; }
+
+ // This method returns true if the object is over land owned by
+ // the agent, one of its groups, or it encroaches and
+ // anti-encroachment is enabled
+ bool isReturnable();
+
+ /*
+ // This method will scan through this object, and then query the
+ // selection manager to see if the local agent probably has the
+ // ability to modify the object. Since this calls into the
+ // selection manager, you should avoid calling this method from
+ // there.
+ BOOL isProbablyModifiable() const;
+ */
+
+ virtual BOOL setParent(LLViewerObject* parent);
+ virtual void addChild(LLViewerObject *childp);
+ virtual void removeChild(LLViewerObject *childp);
+ const_child_list_t& getChildren() const { return mChildList; }
+ S32 numChildren() const { return mChildList.size(); }
+ void addThisAndAllChildren(std::vector<LLViewerObject*>& objects);
+ void addThisAndNonJointChildren(std::vector<LLViewerObject*>& objects);
+ BOOL isChild(LLViewerObject *childp) const;
+ BOOL isSeat() const;
+
+
+ //detect if given line segment (in agent space) intersects with this viewer object.
+ //returns TRUE if intersection detected and returns information about intersection
+ virtual BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
+ S32 face = -1, // which face to check, -1 = ALL_SIDES
+ BOOL pick_transparent = FALSE,
+ S32* face_hit = NULL, // which face was hit
+ LLVector3* intersection = NULL, // return the intersection point
+ LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
+ LLVector3* normal = NULL, // return the surface normal at the intersection point
+ LLVector3* bi_normal = NULL // return the surface bi-normal at the intersection point
+ );
+
+ virtual BOOL lineSegmentBoundingBox(const LLVector3& start, const LLVector3& end);
+
+ virtual const LLVector3d getPositionGlobal() const;
+ virtual const LLVector3 &getPositionRegion() const;
+ virtual const LLVector3 getPositionEdit() const;
+ virtual const LLVector3 &getPositionAgent() const;
+ virtual const LLVector3 getRenderPosition() const;
+
+ virtual const LLVector3 getPivotPositionAgent() const; // Usually = to getPositionAgent, unless like flex objects it's not
+
+ LLViewerObject* getRootEdit() const;
+
+ const LLQuaternion getRotationRegion() const;
+ const LLQuaternion getRotationEdit() const;
+ const LLQuaternion getRenderRotation() const;
+ virtual const LLMatrix4 getRenderMatrix() const;
+
+ void setPosition(const LLVector3 &pos, BOOL damped = FALSE);
+ void setPositionGlobal(const LLVector3d &position, BOOL damped = FALSE);
+ void setPositionRegion(const LLVector3 &position, BOOL damped = FALSE);
+ void setPositionEdit(const LLVector3 &position, BOOL damped = FALSE);
+ void setPositionAgent(const LLVector3 &pos_agent, BOOL damped = FALSE);
+ void setPositionParent(const LLVector3 &pos_parent, BOOL damped = FALSE);
+ void setPositionAbsoluteGlobal( const LLVector3d &pos_global, BOOL damped = FALSE );
+
+ virtual const LLMatrix4& getWorldMatrix(LLXformMatrix* xform) const { return xform->getWorldMatrix(); }
+
+ inline void setRotation(const F32 x, const F32 y, const F32 z, BOOL damped = FALSE);
+ inline void setRotation(const LLQuaternion& quat, BOOL damped = FALSE);
+ void sendRotationUpdate() const;
+
+ /*virtual*/ void setNumTEs(const U8 num_tes);
+ /*virtual*/ void setTE(const U8 te, const LLTextureEntry &texture_entry);
+ /*virtual*/ S32 setTETexture(const U8 te, const LLUUID &uuid);
+ S32 setTETextureCore(const U8 te, const LLUUID& uuid, LLHost host);
+ /*virtual*/ S32 setTEColor(const U8 te, const LLColor3 &color);
+ /*virtual*/ S32 setTEColor(const U8 te, const LLColor4 &color);
+ /*virtual*/ S32 setTEScale(const U8 te, const F32 s, const F32 t);
+ /*virtual*/ S32 setTEScaleS(const U8 te, const F32 s);
+ /*virtual*/ S32 setTEScaleT(const U8 te, const F32 t);
+ /*virtual*/ S32 setTEOffset(const U8 te, const F32 s, const F32 t);
+ /*virtual*/ S32 setTEOffsetS(const U8 te, const F32 s);
+ /*virtual*/ S32 setTEOffsetT(const U8 te, const F32 t);
+ /*virtual*/ S32 setTERotation(const U8 te, const F32 r);
+ /*virtual*/ S32 setTEBumpmap(const U8 te, const U8 bump );
+ /*virtual*/ S32 setTETexGen(const U8 te, const U8 texgen );
+ /*virtual*/ S32 setTEMediaTexGen(const U8 te, const U8 media ); // *FIXME: this confusingly acts upon a superset of setTETexGen's flags without absorbing its semantics
+ /*virtual*/ S32 setTEShiny(const U8 te, const U8 shiny );
+ /*virtual*/ S32 setTEFullbright(const U8 te, const U8 fullbright );
+ /*virtual*/ S32 setTEMediaFlags(const U8 te, const U8 media_flags );
+ /*virtual*/ S32 setTEGlow(const U8 te, const F32 glow);
+ /*virtual*/ BOOL setMaterial(const U8 material);
+ virtual void setTEImage(const U8 te, LLViewerTexture *imagep); // Not derived from LLPrimitive
+ void changeTEImage(S32 index, LLViewerTexture* new_image) ;
+ LLViewerTexture *getTEImage(const U8 te) const;
+
+ void fitFaceTexture(const U8 face);
+ void sendTEUpdate() const; // Sends packed representation of all texture entry information
+
+ virtual void setScale(const LLVector3 &scale, BOOL damped = FALSE);
+
+ virtual F32 getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL);
+ virtual U32 getTriangleCount();
+ virtual U32 getHighLODTriangleCount();
+
+ void setObjectCost(F32 cost);
+ F32 getObjectCost();
+
+ void setLinksetCost(F32 cost);
+ F32 getLinksetCost();
+
+ void setPhysicsCost(F32 cost);
+ F32 getPhysicsCost();
+
+ void setLinksetPhysicsCost(F32 cost);
+ F32 getLinksetPhysicsCost();
+
+ void sendShapeUpdate();
+
+ U8 getState() { return mState; }
+
+ F32 getAppAngle() const { return mAppAngle; }
+ F32 getPixelArea() const { return mPixelArea; }
+ void setPixelArea(F32 area) { mPixelArea = area; }
+ F32 getMaxScale() const;
+ F32 getMidScale() const;
+ F32 getMinScale() const;
+
+ // Owner id is this object's owner
+ void setAttachedSound(const LLUUID &audio_uuid, const LLUUID& owner_id, const F32 gain, const U8 flags);
+ void adjustAudioGain(const F32 gain);
+ void clearAttachedSound() { mAudioSourcep = NULL; }
+
+ // Create if necessary
+ LLAudioSource *getAudioSource(const LLUUID& owner_id);
+ bool isAudioSource() {return mAudioSourcep != NULL;}
+
+ U8 getMediaType() const;
+ void setMediaType(U8 media_type);
+
+ std::string getMediaURL() const;
+ void setMediaURL(const std::string& media_url);
+
+ BOOL getMediaPassedWhitelist() const;
+ void setMediaPassedWhitelist(BOOL passed);
+
+ void sendMaterialUpdate() const;
+
+ void setCanSelect(BOOL canSelect);
+
+ void setDebugText(const std::string &utf8text);
+ void setIcon(LLViewerTexture* icon_image);
+ void clearIcon();
+
+ void markForUpdate(BOOL priority);
+ void updateVolume(const LLVolumeParams& volume_params);
+ virtual void updateSpatialExtents(LLVector4a& min, LLVector4a& max);
+ virtual F32 getBinRadius();
+
+ LLBBox getBoundingBoxAgent() const;
+
+ void updatePositionCaches() const; // Update the global and region position caches from the object (and parent's) xform.
+ void updateText(); // update text label position
+ virtual void updateDrawable(BOOL force_damped); // force updates on static objects
+
+ void setDrawableState(U32 state, BOOL recursive = TRUE);
+ void clearDrawableState(U32 state, BOOL recursive = TRUE);
+
+ // Called when the drawable shifts
+ virtual void onShift(const LLVector4a &shift_vector) { }
+
+ //////////////////////////////////////
+ //
+ // Inventory methods
+ //
+
+ // This function is called when someone is interested in a viewer
+ // object's inventory. The callback is called as soon as the
+ // viewer object has the inventory stored locally.
+ void registerInventoryListener(LLVOInventoryListener* listener, void* user_data);
+ void removeInventoryListener(LLVOInventoryListener* listener);
+ BOOL isInventoryPending() { return mInventoryPending; }
+ void clearInventoryListeners();
+ void requestInventory();
+ void fetchInventoryFromServer();
+ static void processTaskInv(LLMessageSystem* msg, void** user_data);
+ void removeInventory(const LLUUID& item_id);
+
+ // The updateInventory() call potentially calls into the selection
+ // manager, so do no call updateInventory() from the selection
+ // manager until we have better iterators.
+ void updateInventory(LLViewerInventoryItem* item, U8 key, bool is_new);
+ void updateInventoryLocal(LLInventoryItem* item, U8 key); // Update without messaging.
+ LLInventoryObject* getInventoryObject(const LLUUID& item_id);
+ void getInventoryContents(LLInventoryObject::object_list_t& objects);
+ LLInventoryObject* getInventoryRoot();
+ LLViewerInventoryItem* getInventoryItemByAsset(const LLUUID& asset_id);
+ S16 getInventorySerial() const { return mInventorySerialNum; }
+
+ // These functions does viewer-side only object inventory modifications
+ void updateViewerInventoryAsset(
+ const LLViewerInventoryItem* item,
+ const LLUUID& new_asset);
+
+ // This function will make sure that we refresh the inventory.
+ void dirtyInventory();
+ BOOL isInventoryDirty() { return mInventoryDirty; }
+
+ // save a script, which involves removing the old one, and rezzing
+ // in the new one. This method should be called with the asset id
+ // of the new and old script AFTER the bytecode has been saved.
+ void saveScript(const LLViewerInventoryItem* item, BOOL active, bool is_new);
+
+ // move an inventory item out of the task and into agent
+ // inventory. This operation is based on messaging. No permissions
+ // checks are made on the viewer - the server will double check.
+ void moveInventory(const LLUUID& agent_folder, const LLUUID& item_id);
+
+ // Find the number of instances of this object's inventory that are of the given type
+ S32 countInventoryContents( LLAssetType::EType type );
+
+ BOOL permAnyOwner() const;
+ BOOL permYouOwner() const;
+ BOOL permGroupOwner() const;
+ BOOL permOwnerModify() const;
+ BOOL permModify() const;
+ BOOL permCopy() const;
+ BOOL permMove() const;
+ BOOL permTransfer() const;
+ inline BOOL usePhysics() const { return ((mFlags & FLAGS_USE_PHYSICS) != 0); }
+ inline BOOL flagScripted() const { return ((mFlags & FLAGS_SCRIPTED) != 0); }
+ inline BOOL flagHandleTouch() const { return ((mFlags & FLAGS_HANDLE_TOUCH) != 0); }
+ inline BOOL flagTakesMoney() const { return ((mFlags & FLAGS_TAKES_MONEY) != 0); }
+ inline BOOL flagPhantom() const { return ((mFlags & FLAGS_PHANTOM) != 0); }
+ inline BOOL flagInventoryEmpty() const { return ((mFlags & FLAGS_INVENTORY_EMPTY) != 0); }
+ inline BOOL flagCastShadows() const { return ((mFlags & FLAGS_CAST_SHADOWS) != 0); }
+ inline BOOL flagAllowInventoryAdd() const { return ((mFlags & FLAGS_ALLOW_INVENTORY_DROP) != 0); }
+ inline BOOL flagTemporary() const { return ((mFlags & FLAGS_TEMPORARY) != 0); }
+ inline BOOL flagTemporaryOnRez() const { return ((mFlags & FLAGS_TEMPORARY_ON_REZ) != 0); }
+ inline BOOL flagAnimSource() const { return ((mFlags & FLAGS_ANIM_SOURCE) != 0); }
+ inline BOOL flagCameraSource() const { return ((mFlags & FLAGS_CAMERA_SOURCE) != 0); }
+ inline BOOL flagCameraDecoupled() const { return ((mFlags & FLAGS_CAMERA_DECOUPLED) != 0); }
+ inline BOOL flagObjectMove() const { return ((mFlags & FLAGS_OBJECT_MOVE) != 0); }
+
+ U8 getPhysicsShapeType() const;
+ inline F32 getPhysicsGravity() const { return mPhysicsGravity; }
+ inline F32 getPhysicsFriction() const { return mPhysicsFriction; }
+ inline F32 getPhysicsDensity() const { return mPhysicsDensity; }
+ inline F32 getPhysicsRestitution() const { return mPhysicsRestitution; }
+
+ bool getIncludeInSearch() const;
+ void setIncludeInSearch(bool include_in_search);
+
+ // Does "open" object menu item apply?
+ BOOL allowOpen() const;
+
+ void setClickAction(U8 action) { mClickAction = action; }
+ U8 getClickAction() const { return mClickAction; }
+ bool specialHoverCursor() const; // does it have a special hover cursor?
+
+ void setRegion(LLViewerRegion *regionp);
+ virtual void updateRegion(LLViewerRegion *regionp);
+
+ void updateFlags(BOOL physics_changed = FALSE);
+ BOOL setFlags(U32 flag, BOOL state);
+ void setPhysicsShapeType(U8 type);
+ void setPhysicsGravity(F32 gravity);
+ void setPhysicsFriction(F32 friction);
+ void setPhysicsDensity(F32 density);
+ void setPhysicsRestitution(F32 restitution);
+
+ virtual void dump() const;
+ static U32 getNumZombieObjects() { return sNumZombieObjects; }
+
+ void printNameValuePairs() const;
+
+ virtual S32 getLOD() const { return 3; }
+ virtual U32 getPartitionType() const;
+ virtual void dirtySpatialGroup(BOOL priority = FALSE) const;
+ virtual void dirtyMesh();
+
+ virtual LLNetworkData* getParameterEntry(U16 param_type) const;
+ virtual bool setParameterEntry(U16 param_type, const LLNetworkData& new_value, bool local_origin);
+ virtual BOOL getParameterEntryInUse(U16 param_type) const;
+ virtual bool setParameterEntryInUse(U16 param_type, BOOL in_use, bool local_origin);
+ // Called when a parameter is changed
+ virtual void parameterChanged(U16 param_type, bool local_origin);
+ virtual void parameterChanged(U16 param_type, LLNetworkData* data, BOOL in_use, bool local_origin);
+
+ friend class LLViewerObjectList;
+ friend class LLViewerMediaList;
+
+public:
+ //counter-translation
+ void resetChildrenPosition(const LLVector3& offset, BOOL simplified = FALSE) ;
+ //counter-rotation
+ void resetChildrenRotationAndPosition(const std::vector<LLQuaternion>& rotations,
+ const std::vector<LLVector3>& positions) ;
+ void saveUnselectedChildrenRotation(std::vector<LLQuaternion>& rotations) ;
+ void saveUnselectedChildrenPosition(std::vector<LLVector3>& positions) ;
+ std::vector<LLVector3> mUnselectedChildrenPositions ;
+
+private:
+ ExtraParameter* createNewParameterEntry(U16 param_type);
+ ExtraParameter* getExtraParameterEntry(U16 param_type) const;
+ ExtraParameter* getExtraParameterEntryCreate(U16 param_type);
+ bool unpackParameterEntry(U16 param_type, LLDataPacker *dp);
+
+ // This function checks to see if the given media URL has changed its version
+ // and the update wasn't due to this agent's last action.
+ U32 checkMediaURL(const std::string &media_url);
+
+ // Motion prediction between updates
+ void interpolateLinearMotion(const F64 & time, const F32 & dt);
+
+public:
+ //
+ // Viewer-side only types - use the LL_PCODE_APP mask.
+ //
+ typedef enum e_vo_types
+ {
+ LL_VO_CLOUDS = LL_PCODE_APP | 0x20,
+ LL_VO_SURFACE_PATCH = LL_PCODE_APP | 0x30,
+ LL_VO_WL_SKY = LL_PCODE_APP | 0x40,
+ LL_VO_SQUARE_TORUS = LL_PCODE_APP | 0x50,
+ LL_VO_SKY = LL_PCODE_APP | 0x60,
+ LL_VO_VOID_WATER = LL_PCODE_APP | 0x70,
+ LL_VO_WATER = LL_PCODE_APP | 0x80,
+ LL_VO_GROUND = LL_PCODE_APP | 0x90,
+ LL_VO_PART_GROUP = LL_PCODE_APP | 0xa0,
+ LL_VO_TRIANGLE_TORUS = LL_PCODE_APP | 0xb0,
+ LL_VO_HUD_PART_GROUP = LL_PCODE_APP | 0xc0,
+ } EVOType;
+
+ typedef enum e_physics_shape_types
+ {
+ PHYSICS_SHAPE_PRIM = 0,
+ PHYSICS_SHAPE_NONE,
+ PHYSICS_SHAPE_CONVEX_HULL,
+ } EPhysicsShapeType;
+
+ LLUUID mID;
+
+ // unique within region, not unique across regions
+ // Local ID = 0 is not used
+ U32 mLocalID;
+
+ // Last total CRC received from sim, used for caching
+ U32 mTotalCRC;
+
+ LLPointer<LLViewerTexture> *mTEImages;
+
+ // Selection, picking and rendering variables
+ U32 mGLName; // GL "name" used by selection code
+ BOOL mbCanSelect; // true if user can select this object by clicking
+
+ // Grabbed from UPDATE_FLAGS
+ U32 mFlags;
+
+ // Sent to sim in UPDATE_FLAGS, received in ObjectPhysicsProperties
+ U8 mPhysicsShapeType;
+ F32 mPhysicsGravity;
+ F32 mPhysicsFriction;
+ F32 mPhysicsDensity;
+ F32 mPhysicsRestitution;
+
+
+ // Pipeline classes
+ LLPointer<LLDrawable> mDrawable;
+
+ // Band-aid to select object after all creation initialization is done
+ BOOL mCreateSelected;
+
+ // Replace textures with web pages on this object while drawing
+ BOOL mRenderMedia;
+
+ // In bits
+ S32 mBestUpdatePrecision;
+
+ // TODO: Make all this stuff private. JC
+ LLPointer<LLHUDText> mText;
+ LLPointer<LLHUDIcon> mIcon;
+
+ static BOOL sUseSharedDrawables;
+
+protected:
+ // delete an item in the inventory, but don't tell the
+ // server. This is used internally by remove, update, and
+ // savescript.
+ void deleteInventoryItem(const LLUUID& item_id);
+
+ // do the update/caching logic. called by saveScript and
+ // updateInventory.
+ void doUpdateInventory(LLPointer<LLViewerInventoryItem>& item, U8 key, bool is_new);
+
+
+ static LLViewerObject *createObject(const LLUUID &id, LLPCode pcode, LLViewerRegion *regionp);
+
+ BOOL setData(const U8 *datap, const U32 data_size);
+
+ // Hide or show HUD, icon and particles
+ void hideExtraDisplayItems( BOOL hidden );
+
+ //////////////////////////
+ //
+ // inventory functionality
+ //
+
+ static void processTaskInvFile(void** user_data, S32 error_code, LLExtStat ext_status);
+ void loadTaskInvFile(const std::string& filename);
+ void doInventoryCallback();
+
+ BOOL isOnMap();
+
+ void unpackParticleSource(const S32 block_num, const LLUUID& owner_id);
+ void unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_id);
+ void deleteParticleSource();
+ void setParticleSource(const LLPartSysData& particle_parameters, const LLUUID& owner_id);
+
+public:
+ void updateQuota( const SelectionQuota& quota );
+ const SelectionQuota& getQuota( void ) { return mSelectionQuota; }
+
+private:
+ void setNameValueList(const std::string& list); // clears nv pairs and then individually adds \n separated NV pairs from \0 terminated string
+ void deleteTEImages(); // correctly deletes list of images
+
+protected:
+ typedef std::map<char *, LLNameValue *> name_value_map_t;
+ name_value_map_t mNameValuePairs; // Any name-value pairs stored by script
+
+ child_list_t mChildList;
+
+ F64 mLastInterpUpdateSecs; // Last update for purposes of interpolation
+ F64 mLastMessageUpdateSecs; // Last update from a message from the simulator
+ TPACKETID mLatestRecvPacketID; // Latest time stamp on message from simulator
+
+ // extra data sent from the sim...currently only used for tree species info
+ U8* mData;
+
+ LLPointer<LLViewerPartSourceScript> mPartSourcep; // Particle source associated with this object.
+ LLAudioSourceVO* mAudioSourcep;
+ F32 mAudioGain;
+
+ F32 mAppAngle; // Apparent visual arc in degrees
+ F32 mPixelArea; // Apparent area in pixels
+
+ // This is the object's inventory from the viewer's perspective.
+ LLInventoryObject::object_list_t* mInventory;
+ class LLInventoryCallbackInfo
+ {
+ public:
+ ~LLInventoryCallbackInfo();
+ LLVOInventoryListener* mListener;
+ void* mInventoryData;
+ };
+ typedef std::list<LLInventoryCallbackInfo*> callback_list_t;
+ callback_list_t mInventoryCallbacks;
+ S16 mInventorySerialNum;
+
+ LLViewerRegion *mRegionp; // Region that this object belongs to.
+ BOOL mInventoryPending;
+ BOOL mInventoryDirty;
+ BOOL mDead;
+ BOOL mOrphaned; // This is an orphaned child
+ BOOL mUserSelected; // Cached user select information
+ BOOL mOnActiveList;
+ BOOL mOnMap; // On the map.
+ BOOL mStatic; // Object doesn't move.
+ S32 mNumFaces;
+
+ F32 mTimeDilation; // Time dilation sent with the object.
+ F32 mRotTime; // Amount (in seconds) that object has rotated according to angular velocity (llSetTargetOmega)
+ LLQuaternion mLastRot; // last rotation received from the simulator
+
+ LLVOJointInfo* mJointInfo;
+ U8 mState; // legacy
+ LLViewerObjectMedia* mMedia; // NULL if no media associated
+ U8 mClickAction;
+ F32 mObjectCost; //resource cost of this object or -1 if unknown
+ F32 mLinksetCost;
+ F32 mPhysicsCost;
+ F32 mLinksetPhysicsCost;
+
+ SelectionQuota mSelectionQuota;
+
+ bool mCostStale;
+ mutable bool mPhysicsShapeUnknown;
+
+ static U32 sNumZombieObjects; // Objects which are dead, but not deleted
+
+ static BOOL sMapDebug; // Map render mode
+ static LLColor4 sEditSelectColor;
+ static LLColor4 sNoEditSelectColor;
+ static F32 sCurrentPulse;
+ static BOOL sPulseEnabled;
+
+ static S32 sAxisArrowLength;
+
+ // These two caches are only correct for non-parented objects right now!
+ mutable LLVector3 mPositionRegion;
+ mutable LLVector3 mPositionAgent;
+
+ static void setPhaseOutUpdateInterpolationTime(F32 value) { sPhaseOutUpdateInterpolationTime = (F64) value; }
+ static void setMaxUpdateInterpolationTime(F32 value) { sMaxUpdateInterpolationTime = (F64) value; }
+
+ static void setVelocityInterpolate(BOOL value) { sVelocityInterpolate = value; }
+ static void setPingInterpolate(BOOL value) { sPingInterpolate = value; }
+
+private:
+ static S32 sNumObjects;
+
+ static F64 sPhaseOutUpdateInterpolationTime; // For motion interpolation
+ static F64 sMaxUpdateInterpolationTime; // For motion interpolation
+
+ static BOOL sVelocityInterpolate;
+ static BOOL sPingInterpolate;
+
+ //--------------------------------------------------------------------
+ // For objects that are attachments
+ //--------------------------------------------------------------------
+public:
+ const LLUUID &getAttachmentItemID() const;
+ void setAttachmentItemID(const LLUUID &id);
+ const LLUUID &extractAttachmentItemID(); // find&set the inventory item ID of the attached object
+ EObjectUpdateType getLastUpdateType() const;
+ void setLastUpdateType(EObjectUpdateType last_update_type);
+ BOOL getLastUpdateCached() const;
+ void setLastUpdateCached(BOOL last_update_cached);
+
+private:
+ LLUUID mAttachmentItemID; // ItemID of the associated object is in user inventory.
+ EObjectUpdateType mLastUpdateType;
+ BOOL mLastUpdateCached;
+};
+
+///////////////////
+//
+// Inlines
+//
+//
+
+inline void LLViewerObject::setRotation(const LLQuaternion& quat, BOOL damped)
+{
+ LLPrimitive::setRotation(quat);
+ setChanged(ROTATED | SILHOUETTE);
+ updateDrawable(damped);
+}
+
+inline void LLViewerObject::setRotation(const F32 x, const F32 y, const F32 z, BOOL damped)
+{
+ LLPrimitive::setRotation(x, y, z);
+ setChanged(ROTATED | SILHOUETTE);
+ updateDrawable(damped);
+}
+
+class LLViewerObjectMedia
+{
+public:
+ LLViewerObjectMedia() : mMediaURL(), mPassedWhitelist(FALSE), mMediaType(0) { }
+
+ std::string mMediaURL; // for web pages on surfaces, one per prim
+ BOOL mPassedWhitelist; // user has OK'd display
+ U8 mMediaType; // see LLTextureEntry::WEB_PAGE, etc.
+};
+
+// subclass of viewer object that can be added to particle partitions
+class LLAlphaObject : public LLViewerObject
+{
+public:
+ LLAlphaObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
+ : LLViewerObject(id,pcode,regionp)
+ { mDepth = 0.f; }
+
+ virtual F32 getPartSize(S32 idx);
+ virtual void getGeometry(S32 idx,
+ LLStrider<LLVector3>& verticesp,
+ LLStrider<LLVector3>& normalsp,
+ LLStrider<LLVector2>& texcoordsp,
+ LLStrider<LLColor4U>& colorsp,
+ LLStrider<U16>& indicesp) = 0;
+
+ F32 mDepth;
+};
+
+class LLStaticViewerObject : public LLViewerObject
+{
+public:
+ LLStaticViewerObject(const LLUUID& id, const LLPCode pcode, LLViewerRegion* regionp, BOOL is_global = FALSE)
+ : LLViewerObject(id,pcode,regionp, is_global)
+ { }
+
+ virtual void updateDrawable(BOOL force_damped);
+};
+
+
+#endif
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index ab2e07e4df..007b3416f1 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -1418,6 +1418,15 @@ void LLViewerObjectList::onObjectCostFetchFailure(const LLUUID& object_id) mPendingObjectCost.erase(object_id); } +void LLViewerObjectList::updateQuotaCost( const LLUUID& objectId, const SelectionQuota& quota ) +{ + LLViewerObject* pVO = findObject( objectId ); + if ( pVO ) + { + //pVO->updateQuota( quota ); + } +} + void LLViewerObjectList::updatePhysicsFlags(const LLViewerObject* object) { mStalePhysicsFlags.insert(object->getID()); diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h index 65374bca70..8e211eaf73 100644 --- a/indra/newview/llviewerobjectlist.h +++ b/indra/newview/llviewerobjectlist.h @@ -36,6 +36,7 @@ // project includes #include "llviewerobject.h" +#include "llaccountingquota.h" class LLCamera; class LLNetMap; @@ -101,6 +102,8 @@ public: F32 restitution, F32 gravity_multiplier); + void updateQuotaCost( const LLUUID& objectId, const SelectionQuota& costs ); + void shiftObjects(const LLVector3 &offset); bool hasMapObjectInRegion(LLViewerRegion* regionp) ; diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index e84e4a859a..5ae4e872f3 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -42,6 +42,7 @@ // Viewer includes #include "llagent.h" +#include "llagentaccess.h" #include "llviewerwindow.h" #include "llviewercontrol.h" //#include "llfirstuse.h" @@ -54,6 +55,7 @@ #include "llresmgr.h" #include "llsdutil.h" #include "llsdutil_math.h" +#include "llslurl.h" #include "llstatusbar.h" #include "llui.h" #include "llviewertexture.h" @@ -2200,7 +2202,10 @@ bool LLViewerParcelMgr::canAgentBuyParcel(LLParcel* parcel, bool forGroup) const = parcelOwner == (forGroup ? gAgent.getGroupID() : gAgent.getID()); bool isAuthorized - = (authorizeBuyer.isNull() || (gAgent.getID() == authorizeBuyer)); + = (authorizeBuyer.isNull()
+ || (gAgent.getID() == authorizeBuyer)
+ || (gAgent.hasPowerInGroup(authorizeBuyer,GP_LAND_DEED)
+ && gAgent.hasPowerInGroup(authorizeBuyer,GP_LAND_SET_SALE_INFO))); return isForSale && !isOwner && isAuthorized && isEmpowered; } diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h index ab07adce5d..45c9b3e91f 100644 --- a/indra/newview/llviewerprecompiledheaders.h +++ b/indra/newview/llviewerprecompiledheaders.h @@ -99,8 +99,6 @@ #include "llcoord.h" #include "llcoordframe.h" #include "llcrc.h" -#include "llinterp.h" -#include "llperlin.h" #include "llplane.h" #include "llquantize.h" #include "llrand.h" @@ -109,7 +107,6 @@ #include "m3math.h" #include "m4math.h" #include "llquaternion.h" -#include "raytrace.h" #include "v2math.h" #include "v3color.h" #include "v3dmath.h" @@ -117,16 +114,12 @@ #include "v4color.h" #include "v4coloru.h" #include "v4math.h" -////#include "vmath.h" #include "xform.h" // Library includes from llvfs #include "lldir.h" - -// Library includes from llmessage project +
+// Library includes from llmessage project
#include "llcachename.h" -// llxuixml -#include "llinitparam.h" - #endif diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 84d092c5d5..590c82856d 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -46,6 +46,7 @@ #include "llagentcamera.h" #include "llcallingcard.h" #include "llcaphttpsender.h" +#include "llcapabilitylistener.h" #include "llcommandhandler.h" #include "lldir.h" #include "lleventpoll.h" @@ -76,6 +77,71 @@ const F32 WATER_TEXTURE_SCALE = 8.f; // Number of times to repeat the water texture across a region const S16 MAX_MAP_DIST = 10; +typedef std::map<std::string, std::string> CapabilityMap; + +class LLViewerRegionImpl { +public: + LLViewerRegionImpl(LLViewerRegion * region, LLHost const & host) + : mHost(host), + mCompositionp(NULL), + mEventPoll(NULL), + // I'd prefer to set the LLCapabilityListener name to match the region + // name -- it's disappointing that's not available at construction time. + // We could instead store an LLCapabilityListener*, making + // setRegionNameAndZone() replace the instance. Would that pose + // consistency problems? Can we even request a capability before calling + // setRegionNameAndZone()? + // For testability -- the new Michael Feathers paradigm -- + // LLCapabilityListener binds all the globals it expects to need at + // construction time. + mCapabilityListener(host.getString(), gMessageSystem, *region, + gAgent.getID(), gAgent.getSessionID()) + { + } + + // The surfaces and other layers + LLSurface* mLandp; + + // Region geometry data + LLVector3d mOriginGlobal; // Location of southwest corner of region (meters) + LLVector3d mCenterGlobal; // Location of center in world space (meters) + LLHost mHost; + + // The unique ID for this region. + LLUUID mRegionID; + + // region/estate owner - usually null. + LLUUID mOwnerID; + + // Network statistics for the region's circuit... + LLTimer mLastNetUpdate; + + // Misc + LLVLComposition *mCompositionp; // Composition layer for the surface + + LLVOCacheEntry::vocache_entry_map_t mCacheMap; + // time? + // LRU info? + + // Cache ID is unique per-region, across renames, moving locations, + // etc. + LLUUID mCacheID; + + CapabilityMap mCapabilities; + + LLEventPoll* mEventPoll; + + /// Post an event to this LLCapabilityListener to invoke a capability message on + /// this LLViewerRegion's server + /// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities) + LLCapabilityListener mCapabilityListener; + + //spatial partitions for objects in this region + std::vector<LLSpatialPartition*> mObjectPartition; + + LLHTTPClient::ResponderPtr mHttpResponderPtr ; +}; + // support for secondlife:///app/region/{REGION} SLapps // N.B. this is defined to work exactly like the classic secondlife://{REGION} // However, the later syntax cannot support spaces in the region name because @@ -191,15 +257,12 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, const U32 grids_per_region_edge, const U32 grids_per_patch_edge, const F32 region_width_meters) -: mCenterGlobal(), +: mImpl(new LLViewerRegionImpl(this, host)), mHandle(handle), - mHost( host ), mTimeDilation(1.0f), mName(""), mZoning(""), - mOwnerID(), mIsEstateManager(FALSE), - mCompositionp(NULL), mRegionFlags( REGION_FLAGS_DEFAULT ), mSimAccess( SIM_ACCESS_MIN ), mBillableFactor(1.0), @@ -212,37 +275,27 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, mHttpUrl(""), mCacheLoaded(FALSE), mCacheDirty(FALSE), - mCacheID(), - mEventPoll(NULL), mReleaseNotesRequested(FALSE), - // I'd prefer to set the LLCapabilityListener name to match the region - // name -- it's disappointing that's not available at construction time. - // We could instead store an LLCapabilityListener*, making - // setRegionNameAndZone() replace the instance. Would that pose - // consistency problems? Can we even request a capability before calling - // setRegionNameAndZone()? - // For testability -- the new Michael Feathers paradigm -- - // LLCapabilityListener binds all the globals it expects to need at - // construction time. - mCapabilityListener(host.getString(), gMessageSystem, *this, - gAgent.getID(), gAgent.getSessionID()), mCapabilitiesReceived(false) { mWidth = region_width_meters; - mOriginGlobal = from_region_handle(handle); + mImpl->mOriginGlobal = from_region_handle(handle); updateRenderMatrix(); - mLandp = new LLSurface('l', NULL); + mImpl->mLandp = new LLSurface('l', NULL); // Create the composition layer for the surface - mCompositionp = new LLVLComposition(mLandp, grids_per_region_edge, region_width_meters/grids_per_region_edge); - mCompositionp->setSurface(mLandp); + mImpl->mCompositionp = + new LLVLComposition(mImpl->mLandp, + grids_per_region_edge, + region_width_meters / grids_per_region_edge); + mImpl->mCompositionp->setSurface(mImpl->mLandp); // Create the surfaces - mLandp->setRegion(this); - mLandp->create(grids_per_region_edge, + mImpl->mLandp->setRegion(this); + mImpl->mLandp->create(grids_per_region_edge, grids_per_patch_edge, - mOriginGlobal, + mImpl->mOriginGlobal, mWidth); mParcelOverlay = new LLViewerParcelOverlay(this, region_width_meters); @@ -255,24 +308,24 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, //create object partitions //MUST MATCH declaration of eObjectPartitions - mObjectPartition.push_back(new LLHUDPartition()); //PARTITION_HUD - mObjectPartition.push_back(new LLTerrainPartition()); //PARTITION_TERRAIN - mObjectPartition.push_back(new LLVoidWaterPartition()); //PARTITION_VOIDWATER - mObjectPartition.push_back(new LLWaterPartition()); //PARTITION_WATER - mObjectPartition.push_back(new LLTreePartition()); //PARTITION_TREE - mObjectPartition.push_back(new LLParticlePartition()); //PARTITION_PARTICLE - mObjectPartition.push_back(new LLCloudPartition()); //PARTITION_CLOUD - mObjectPartition.push_back(new LLGrassPartition()); //PARTITION_GRASS - mObjectPartition.push_back(new LLVolumePartition()); //PARTITION_VOLUME - mObjectPartition.push_back(new LLBridgePartition()); //PARTITION_BRIDGE - mObjectPartition.push_back(new LLHUDParticlePartition());//PARTITION_HUD_PARTICLE - mObjectPartition.push_back(NULL); //PARTITION_NONE + mImpl->mObjectPartition.push_back(new LLHUDPartition()); //PARTITION_HUD + mImpl->mObjectPartition.push_back(new LLTerrainPartition()); //PARTITION_TERRAIN + mImpl->mObjectPartition.push_back(new LLVoidWaterPartition()); //PARTITION_VOIDWATER + mImpl->mObjectPartition.push_back(new LLWaterPartition()); //PARTITION_WATER + mImpl->mObjectPartition.push_back(new LLTreePartition()); //PARTITION_TREE + mImpl->mObjectPartition.push_back(new LLParticlePartition()); //PARTITION_PARTICLE + mImpl->mObjectPartition.push_back(new LLCloudPartition()); //PARTITION_CLOUD + mImpl->mObjectPartition.push_back(new LLGrassPartition()); //PARTITION_GRASS + mImpl->mObjectPartition.push_back(new LLVolumePartition()); //PARTITION_VOLUME + mImpl->mObjectPartition.push_back(new LLBridgePartition()); //PARTITION_BRIDGE + mImpl->mObjectPartition.push_back(new LLHUDParticlePartition());//PARTITION_HUD_PARTICLE + mImpl->mObjectPartition.push_back(NULL); //PARTITION_NONE } void LLViewerRegion::initStats() { - mLastNetUpdate.reset(); + mImpl->mLastNetUpdate.reset(); mPacketsIn = 0; mBitsIn = 0; mLastBitsIn = 0; @@ -287,9 +340,9 @@ void LLViewerRegion::initStats() LLViewerRegion::~LLViewerRegion() { - if(mHttpResponderPtr) + if(mImpl->mHttpResponderPtr) { - (static_cast<BaseCapabilitiesComplete*>(mHttpResponderPtr.get()))->setRegion(NULL) ; + (static_cast<BaseCapabilitiesComplete*>(mImpl->mHttpResponderPtr.get()))->setRegion(NULL) ; } gVLManager.cleanupData(this); @@ -301,21 +354,44 @@ LLViewerRegion::~LLViewerRegion() gObjectList.killObjects(this); - delete mCompositionp; + delete mImpl->mCompositionp; delete mParcelOverlay; - delete mLandp; - delete mEventPoll; - LLHTTPSender::clearSender(mHost); + delete mImpl->mLandp; + delete mImpl->mEventPoll; + LLHTTPSender::clearSender(mImpl->mHost); saveObjectCache(); - std::for_each(mObjectPartition.begin(), mObjectPartition.end(), DeletePointer()); + std::for_each(mImpl->mObjectPartition.begin(), mImpl->mObjectPartition.end(), DeletePointer()); + + delete mImpl; + mImpl = NULL; +} + +LLEventPump& LLViewerRegion::getCapAPI() const +{ + return mImpl->mCapabilityListener.getCapAPI(); } /*virtual*/ const LLHost& LLViewerRegion::getHost() const { - return mHost; + return mImpl->mHost; +} + +LLSurface & LLViewerRegion::getLand() const +{ + return *mImpl->mLandp; +} + +const LLUUID& LLViewerRegion::getRegionID() const +{ + return mImpl->mRegionID; +} + +void LLViewerRegion::setRegionID(const LLUUID& region_id) +{ + mImpl->mRegionID = region_id; } void LLViewerRegion::loadObjectCache() @@ -330,7 +406,7 @@ void LLViewerRegion::loadObjectCache() if(LLVOCache::hasInstance()) { - LLVOCache::getInstance()->readFromCache(mHandle, mCacheID, mCacheMap) ; + LLVOCache::getInstance()->readFromCache(mHandle, mImpl->mCacheID, mImpl->mCacheMap) ; } } @@ -342,32 +418,32 @@ void LLViewerRegion::saveObjectCache() return; } - if (mCacheMap.empty()) + if (mImpl->mCacheMap.empty()) { return; } if(LLVOCache::hasInstance()) { - LLVOCache::getInstance()->writeToCache(mHandle, mCacheID, mCacheMap, mCacheDirty) ; + LLVOCache::getInstance()->writeToCache(mHandle, mImpl->mCacheID, mImpl->mCacheMap, mCacheDirty) ; mCacheDirty = FALSE; } - for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mCacheMap.begin(); iter != mCacheMap.end(); ++iter) + for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mImpl->mCacheMap.begin(); iter != mImpl->mCacheMap.end(); ++iter) { delete iter->second; } - mCacheMap.clear(); + mImpl->mCacheMap.clear(); } void LLViewerRegion::sendMessage() { - gMessageSystem->sendMessage(mHost); + gMessageSystem->sendMessage(mImpl->mHost); } void LLViewerRegion::sendReliableMessage() { - gMessageSystem->sendReliable(mHost); + gMessageSystem->sendReliable(mImpl->mHost); } void LLViewerRegion::setFlags(BOOL b, U32 flags) @@ -384,12 +460,12 @@ void LLViewerRegion::setFlags(BOOL b, U32 flags) void LLViewerRegion::setWaterHeight(F32 water_level) { - mLandp->setWaterHeight(water_level); + mImpl->mLandp->setWaterHeight(water_level); } F32 LLViewerRegion::getWaterHeight() const { - return mLandp->getWaterHeight(); + return mImpl->mLandp->getWaterHeight(); } BOOL LLViewerRegion::isVoiceEnabled() const @@ -405,9 +481,9 @@ void LLViewerRegion::setRegionFlags(U32 flags) void LLViewerRegion::setOriginGlobal(const LLVector3d &origin_global) { - mOriginGlobal = origin_global; + mImpl->mOriginGlobal = origin_global; updateRenderMatrix(); - mLandp->setOriginGlobal(origin_global); + mImpl->mLandp->setOriginGlobal(origin_global); mWind.setOriginGlobal(origin_global); mCloudLayer.setOriginGlobal(origin_global); calculateCenterGlobal(); @@ -423,16 +499,34 @@ void LLViewerRegion::setTimeDilation(F32 time_dilation) mTimeDilation = time_dilation; } +const LLVector3d & LLViewerRegion::getOriginGlobal() const +{ + return mImpl->mOriginGlobal; +} LLVector3 LLViewerRegion::getOriginAgent() const { - return gAgent.getPosAgentFromGlobal(mOriginGlobal); + return gAgent.getPosAgentFromGlobal(mImpl->mOriginGlobal); } +const LLVector3d & LLViewerRegion::getCenterGlobal() const +{ + return mImpl->mCenterGlobal; +} LLVector3 LLViewerRegion::getCenterAgent() const { - return gAgent.getPosAgentFromGlobal(mCenterGlobal); + return gAgent.getPosAgentFromGlobal(mImpl->mCenterGlobal); +} + +void LLViewerRegion::setOwner(const LLUUID& owner_id) +{ + mImpl->mOwnerID = owner_id; +} + +const LLUUID& LLViewerRegion::getOwner() const +{ + return mImpl->mOwnerID; } void LLViewerRegion::setRegionNameAndZone (const std::string& name_zone) @@ -557,7 +651,10 @@ void LLViewerRegion::processRegionInfo(LLMessageSystem* msg, void**) LLFloaterReporter::processRegionInfo(msg); } - +void LLViewerRegion::setCacheID(const LLUUID& id) +{ + mImpl->mCacheID = id; +} S32 LLViewerRegion::renderPropertyLines() { @@ -585,7 +682,7 @@ BOOL LLViewerRegion::idleUpdate(F32 max_update_time) { LLMemType mt_ivr(LLMemType::MTYPE_IDLE_UPDATE_VIEWER_REGION); // did_update returns TRUE if we did at least one significant update - BOOL did_update = mLandp->idleUpdate(max_update_time); + BOOL did_update = mImpl->mLandp->idleUpdate(max_update_time); if (mParcelOverlay) { @@ -600,7 +697,7 @@ BOOL LLViewerRegion::idleUpdate(F32 max_update_time) // As above, but forcibly do the update. void LLViewerRegion::forceUpdate() { - mLandp->idleUpdate(0.f); + mImpl->mLandp->idleUpdate(0.f); if (mParcelOverlay) { @@ -610,17 +707,21 @@ void LLViewerRegion::forceUpdate() void LLViewerRegion::connectNeighbor(LLViewerRegion *neighborp, U32 direction) { - mLandp->connectNeighbor(neighborp->mLandp, direction); + mImpl->mLandp->connectNeighbor(neighborp->mImpl->mLandp, direction); mCloudLayer.connectNeighbor(&(neighborp->mCloudLayer), direction); } void LLViewerRegion::disconnectAllNeighbors() { - mLandp->disconnectAllNeighbors(); + mImpl->mLandp->disconnectAllNeighbors(); mCloudLayer.disconnectAllNeighbors(); } +LLVLComposition * LLViewerRegion::getComposition() const +{ + return mImpl->mCompositionp; +} F32 LLViewerRegion::getCompositionXY(const S32 x, const S32 y) const { @@ -714,10 +815,10 @@ F32 LLViewerRegion::getCompositionXY(const S32 x, const S32 y) const void LLViewerRegion::calculateCenterGlobal() { - mCenterGlobal = mOriginGlobal; - mCenterGlobal.mdV[VX] += 0.5 * mWidth; - mCenterGlobal.mdV[VY] += 0.5 * mWidth; - mCenterGlobal.mdV[VZ] = 0.5*mLandp->getMinZ() + mLandp->getMaxZ(); + mImpl->mCenterGlobal = mImpl->mOriginGlobal; + mImpl->mCenterGlobal.mdV[VX] += 0.5 * mWidth; + mImpl->mCenterGlobal.mdV[VY] += 0.5 * mWidth; + mImpl->mCenterGlobal.mdV[VZ] = 0.5 * mImpl->mLandp->getMinZ() + mImpl->mLandp->getMaxZ(); } void LLViewerRegion::calculateCameraDistance() @@ -728,7 +829,7 @@ void LLViewerRegion::calculateCameraDistance() std::ostream& operator<<(std::ostream &s, const LLViewerRegion ®ion) { s << "{ "; - s << region.mHost; + s << region.mImpl->mHost; s << " mOriginGlobal = " << region.getOriginGlobal()<< "\n"; std::string name(region.getName()), zone(region.getZoning()); if (! name.empty()) @@ -748,9 +849,9 @@ std::ostream& operator<<(std::ostream &s, const LLViewerRegion ®ion) void LLViewerRegion::updateNetStats() { - F32 dt = mLastNetUpdate.getElapsedTimeAndResetF32(); + F32 dt = mImpl->mLastNetUpdate.getElapsedTimeAndResetF32(); - LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mHost); + LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mImpl->mHost); if (!cdp) { mAlive = false; @@ -779,10 +880,10 @@ void LLViewerRegion::updateNetStats() U32 LLViewerRegion::getPacketsLost() const { - LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mHost); + LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mImpl->mHost); if (!cdp) { - llinfos << "LLViewerRegion::getPacketsLost couldn't find circuit for " << mHost << llendl; + llinfos << "LLViewerRegion::getPacketsLost couldn't find circuit for " << mImpl->mHost << llendl; return 0; } else @@ -791,6 +892,16 @@ U32 LLViewerRegion::getPacketsLost() const } } +void LLViewerRegion::setHttpResponderPtrNULL() +{ + mImpl->mHttpResponderPtr = NULL; +} + +const LLHTTPClient::ResponderPtr LLViewerRegion::getHttpResponderPtr() const +{ + return mImpl->mHttpResponderPtr; +} + BOOL LLViewerRegion::pointInRegionGlobal(const LLVector3d &point_global) const { LLVector3 pos_region = getPosRegionFromGlobal(point_global); @@ -817,7 +928,7 @@ BOOL LLViewerRegion::pointInRegionGlobal(const LLVector3d &point_global) const LLVector3 LLViewerRegion::getPosRegionFromGlobal(const LLVector3d &point_global) const { LLVector3 pos_region; - pos_region.setVec(point_global - mOriginGlobal); + pos_region.setVec(point_global - mImpl->mOriginGlobal); return pos_region; } @@ -825,7 +936,7 @@ LLVector3d LLViewerRegion::getPosGlobalFromRegion(const LLVector3 &pos_region) c { LLVector3d pos_region_d; pos_region_d.setVec(pos_region); - return pos_region_d + mOriginGlobal; + return pos_region_d + mImpl->mOriginGlobal; } LLVector3 LLViewerRegion::getPosAgentFromRegion(const LLVector3 &pos_region) const @@ -842,7 +953,7 @@ LLVector3 LLViewerRegion::getPosRegionFromAgent(const LLVector3 &pos_agent) cons F32 LLViewerRegion::getLandHeightRegion(const LLVector3& region_pos) { - return mLandp->resolveHeightRegion( region_pos ); + return mImpl->mLandp->resolveHeightRegion( region_pos ); } bool LLViewerRegion::isAlive() @@ -994,7 +1105,7 @@ void LLViewerRegion::updateCoarseLocations(LLMessageSystem* msg) // treat the target specially for the map if(i == target_index) { - LLVector3d global_pos(mOriginGlobal); + LLVector3d global_pos(mImpl->mOriginGlobal); global_pos.mdV[VX] += (F64)(x_pos); global_pos.mdV[VY] += (F64)(y_pos); global_pos.mdV[VZ] += (F64)(z_pos) * 4.0; @@ -1034,7 +1145,7 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec U32 local_id = objectp->getLocalID(); U32 crc = objectp->getCRC(); - LLVOCacheEntry* entry = get_if_there(mCacheMap, local_id, (LLVOCacheEntry*)NULL); + LLVOCacheEntry* entry = get_if_there(mImpl->mCacheMap, local_id, (LLVOCacheEntry*)NULL); if (entry) { @@ -1047,10 +1158,10 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec } // Update the cache entry - mCacheMap.erase(local_id); + mImpl->mCacheMap.erase(local_id); delete entry; entry = new LLVOCacheEntry(local_id, crc, dp); - mCacheMap[local_id] = entry; + mImpl->mCacheMap[local_id] = entry; return CACHE_UPDATE_CHANGED; } @@ -1058,15 +1169,15 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec // Create new entry and add to map eCacheUpdateResult result = CACHE_UPDATE_ADDED; - if (mCacheMap.size() > MAX_OBJECT_CACHE_ENTRIES) + if (mImpl->mCacheMap.size() > MAX_OBJECT_CACHE_ENTRIES) { - mCacheMap.erase(mCacheMap.begin()); + mImpl->mCacheMap.erase(mImpl->mCacheMap.begin()); result = CACHE_UPDATE_REPLACED; } entry = new LLVOCacheEntry(local_id, crc, dp); - mCacheMap[local_id] = entry; + mImpl->mCacheMap[local_id] = entry; return result; } @@ -1076,34 +1187,32 @@ LLDataPacker *LLViewerRegion::getDP(U32 local_id, U32 crc, U8 &cache_miss_type) { //llassert(mCacheLoaded); This assert failes often, changing to early-out -- davep, 2010/10/18 - if (mCacheLoaded) - { - LLVOCacheEntry* entry = get_if_there(mCacheMap, local_id, (LLVOCacheEntry*)NULL); + LLVOCacheEntry* entry = get_if_there(mImpl->mCacheMap, local_id, (LLVOCacheEntry*)NULL); - if (entry) + if (entry) + { + // we've seen this object before + if (entry->getCRC() == crc) { - // we've seen this object before - if (entry->getCRC() == crc) - { - // Record a hit - entry->recordHit(); - cache_miss_type = CACHE_MISS_TYPE_NONE; - return entry->getDP(crc); - } - else - { - // llinfos << "CRC miss for " << local_id << llendl; - cache_miss_type = CACHE_MISS_TYPE_CRC; - mCacheMissCRC.put(local_id); - } + // Record a hit + entry->recordHit(); + cache_miss_type = CACHE_MISS_TYPE_NONE; + return entry->getDP(crc); } else { - // llinfos << "Cache miss for " << local_id << llendl; - cache_miss_type = CACHE_MISS_TYPE_FULL; - mCacheMissFull.put(local_id); + // llinfos << "CRC miss for " << local_id << llendl; + cache_miss_type = CACHE_MISS_TYPE_CRC; + mCacheMissCRC.put(local_id); } } + else + { + // llinfos << "Cache miss for " << local_id << llendl; + cache_miss_type = CACHE_MISS_TYPE_FULL; + mCacheMissFull.put(local_id); + } + return NULL; } @@ -1206,7 +1315,7 @@ void LLViewerRegion::dumpCache() } LLVOCacheEntry *entry; - for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mCacheMap.begin(); iter != mCacheMap.end(); ++iter) + for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mImpl->mCacheMap.begin(); iter != mImpl->mCacheMap.end(); ++iter) { entry = iter->second ; @@ -1220,7 +1329,7 @@ void LLViewerRegion::dumpCache() change_bin[changes]++; } - llinfos << "Count " << mCacheMap.size() << llendl; + llinfos << "Count " << mImpl->mCacheMap.size() << llendl; for (i = 0; i < BINS; i++) { llinfos << "Hits " << i << " " << hit_bin[i] << llendl; @@ -1363,10 +1472,10 @@ void LLViewerRegion::setSeedCapability(const std::string& url) return; } - delete mEventPoll; - mEventPoll = NULL; + delete mImpl->mEventPoll; + mImpl->mEventPoll = NULL; - mCapabilities.clear(); + mImpl->mCapabilities.clear(); setCapability("Seed", url); LLSD capabilityNames = LLSD::emptyArray(); @@ -1436,30 +1545,35 @@ void LLViewerRegion::setSeedCapability(const std::string& url) capabilityNames.append("ViewerMetrics"); capabilityNames.append("ViewerStartAuction"); capabilityNames.append("ViewerStats"); + //prep# Finalize these!!!!!!!!! + //capabilityNames.append("AccountingVO"); + capabilityNames.append("AccountingParcel"); + capabilityNames.append("AccountingRegion"); + // Please add new capabilities alphabetically to reduce // merge conflicts. llinfos << "posting to seed " << url << llendl; - mHttpResponderPtr = BaseCapabilitiesComplete::build(this) ; - LLHTTPClient::post(url, capabilityNames, mHttpResponderPtr); + mImpl->mHttpResponderPtr = BaseCapabilitiesComplete::build(this) ; + LLHTTPClient::post(url, capabilityNames, mImpl->mHttpResponderPtr); } void LLViewerRegion::setCapability(const std::string& name, const std::string& url) { if(name == "EventQueueGet") { - delete mEventPoll; - mEventPoll = NULL; - mEventPoll = new LLEventPoll(url, getHost()); + delete mImpl->mEventPoll; + mImpl->mEventPoll = NULL; + mImpl->mEventPoll = new LLEventPoll(url, getHost()); } else if(name == "UntrustedSimulatorMessage") { - LLHTTPSender::setSender(mHost, new LLCapHTTPSender(url)); + LLHTTPSender::setSender(mImpl->mHost, new LLCapHTTPSender(url)); } else { - mCapabilities[name] = url; + mImpl->mCapabilities[name] = url; if(name == "GetTexture") { mHttpUrl = url ; @@ -1474,8 +1588,8 @@ bool LLViewerRegion::isSpecialCapabilityName(const std::string &name) std::string LLViewerRegion::getCapability(const std::string& name) const { - CapabilityMap::const_iterator iter = mCapabilities.find(name); - if(iter == mCapabilities.end()) + CapabilityMap::const_iterator iter = mImpl->mCapabilities.find(name); + if(iter == mImpl->mCapabilities.end()) { return ""; } @@ -1497,7 +1611,7 @@ void LLViewerRegion::logActiveCapabilities() const { int count = 0; CapabilityMap::const_iterator iter; - for (iter = mCapabilities.begin(); iter != mCapabilities.end(); iter++, count++) + for (iter = mImpl->mCapabilities.begin(); iter != mImpl->mCapabilities.end(); ++iter, ++count) { if (!iter->second.empty()) { @@ -1509,9 +1623,9 @@ void LLViewerRegion::logActiveCapabilities() const LLSpatialPartition* LLViewerRegion::getSpatialPartition(U32 type) { - if (type < mObjectPartition.size()) + if (type < mImpl->mObjectPartition.size()) { - return mObjectPartition[type]; + return mImpl->mObjectPartition[type]; } return NULL; } @@ -1549,3 +1663,4 @@ std::string LLViewerRegion::getDescription() const { return stringize(*this); } + diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index dd40b876cd..a6e5c47b86 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -33,20 +33,16 @@ #include "lldarray.h" #include "llwind.h" -#include "llbbox.h" #include "llcloud.h" #include "llstat.h" #include "v3dmath.h" -#include "llhost.h" #include "llstring.h" #include "llregionflags.h" #include "lluuid.h" -#include "lldatapacker.h" -#include "llvocache.h" #include "llweb.h" #include "llcapabilityprovider.h" -#include "llcapabilitylistener.h" #include "m4math.h" // LLMatrix4 +#include "llhttpclient.h" // Surface id's #define LAND 1 @@ -65,6 +61,13 @@ class LLVOCache; class LLVOCacheEntry; class LLSpatialPartition; class LLEventPump; +class LLCapabilityListener; +class LLDataPacker; +class LLDataPackerBinaryBuffer; +class LLHost; +class LLBBox; + +class LLViewerRegionImpl; class LLViewerRegion: public LLCapabilityProvider // implements this interface { @@ -159,19 +162,19 @@ public: F32 getTimeDilation() const { return mTimeDilation; } // Origin height is at zero. - const LLVector3d &getOriginGlobal() const { return mOriginGlobal; } + const LLVector3d &getOriginGlobal() const; LLVector3 getOriginAgent() const; // Center is at the height of the water table. - const LLVector3d &getCenterGlobal() const { return mCenterGlobal; } + const LLVector3d &getCenterGlobal() const; LLVector3 getCenterAgent() const; void setRegionNameAndZone(const std::string& name_and_zone); const std::string& getName() const { return mName; } const std::string& getZoning() const { return mZoning; } - void setOwner(const LLUUID& owner_id) { mOwnerID = owner_id; } - const LLUUID& getOwner() const { return mOwnerID; } + void setOwner(const LLUUID& owner_id); + const LLUUID& getOwner() const; // Is the current agent on the estate manager list for this region? void setIsEstateManager(BOOL b) { mIsEstateManager = b; } @@ -206,7 +209,7 @@ public: // can process the message. static void processRegionInfo(LLMessageSystem* msg, void**); - void setCacheID(const LLUUID& id) { mCacheID = id; } + void setCacheID(const LLUUID& id); F32 getWidth() const { return mWidth; } @@ -222,8 +225,8 @@ public: U32 getPacketsLost() const; - void setHttpResponderPtrNULL() {mHttpResponderPtr = NULL ;} - const LLHTTPClient::ResponderPtr getHttpResponderPtr() const {return mHttpResponderPtr ;} + void setHttpResponderPtrNULL(); + const LLHTTPClient::ResponderPtr getHttpResponderPtr() const; // Get/set named capability URLs for this region. void setSeedCapability(const std::string& url); @@ -238,21 +241,19 @@ public: static bool isSpecialCapabilityName(const std::string &name); void logActiveCapabilities() const; - /// Capability-request exception - typedef LLCapabilityListener::ArgError ArgError; /// Get LLEventPump on which we listen for capability requests /// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities) - LLEventPump& getCapAPI() { return mCapabilityListener.getCapAPI(); } + LLEventPump& getCapAPI() const; /// implements LLCapabilityProvider /*virtual*/ const LLHost& getHost() const; const U64 &getHandle() const { return mHandle; } - LLSurface &getLand() const { return *mLandp; } + LLSurface &getLand() const; // set and get the region id - const LLUUID& getRegionID() const { return mRegionID; } - void setRegionID(const LLUUID& region_id) { mRegionID = region_id; } + const LLUUID& getRegionID() const; + void setRegionID(const LLUUID& region_id); BOOL pointInRegionGlobal(const LLVector3d &point_global) const; LLVector3 getPosRegionFromGlobal(const LLVector3d &point_global) const; @@ -260,7 +261,7 @@ public: LLVector3 getPosAgentFromRegion(const LLVector3 ®ion_pos) const; LLVector3d getPosGlobalFromRegion(const LLVector3 &offset) const; - LLVLComposition *getComposition() const { return mCompositionp; } + LLVLComposition *getComposition() const; F32 getCompositionXY(const S32 x, const S32 y) const; BOOL isOwnedSelf(const LLVector3& pos); @@ -274,6 +275,7 @@ public: F32 getLandHeightRegion(const LLVector3& region_pos); void getInfo(LLSD& info); + typedef enum { @@ -347,34 +349,19 @@ public: LLDynamicArray<LLUUID> mMapAvatarIDs; private: - // The surfaces and other layers - LLSurface* mLandp; + LLViewerRegionImpl * mImpl; - // Region geometry data - LLVector3d mOriginGlobal; // Location of southwest corner of region (meters) - LLVector3d mCenterGlobal; // Location of center in world space (meters) F32 mWidth; // Width of region on a side (meters) - U64 mHandle; - LLHost mHost; - - // The unique ID for this region. - LLUUID mRegionID; - F32 mTimeDilation; // time dilation of physics simulation on simulator // simulator name std::string mName; std::string mZoning; - // region/estate owner - usually null. - LLUUID mOwnerID; - // Is this agent on the estate managers list for this region? BOOL mIsEstateManager; - // Network statistics for the region's circuit... - LLTimer mLastNetUpdate; U32 mPacketsIn; U32 mBitsIn; U32 mLastBitsIn; @@ -386,9 +373,6 @@ private: U32 mPingDelay; F32 mDeltaTime; // Time since last measurement of lastPackets, Bits, etc - // Misc - LLVLComposition *mCompositionp; // Composition layer for the surface - U32 mRegionFlags; // includes damage flags U8 mSimAccess; F32 mBillableFactor; @@ -398,46 +382,24 @@ private: // Information for Homestead / CR-53 S32 mClassID; S32 mCPURatio; + std::string mColoName; std::string mProductSKU; std::string mProductName; std::string mHttpUrl ; - // Maps local ids to cache entries. // Regions can have order 10,000 objects, so assume // a structure of size 2^14 = 16,000 BOOL mCacheLoaded; BOOL mCacheDirty; - LLVOCacheEntry::vocache_entry_map_t mCacheMap; + LLDynamicArray<U32> mCacheMissFull; LLDynamicArray<U32> mCacheMissCRC; - // time? - // LRU info? - - // Cache ID is unique per-region, across renames, moving locations, - // etc. - LLUUID mCacheID; - typedef std::map<std::string, std::string> CapabilityMap; - CapabilityMap mCapabilities; - - LLEventPoll* mEventPoll; - - /// Post an event to this LLCapabilityListener to invoke a capability message on - /// this LLViewerRegion's server - /// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities) - LLCapabilityListener mCapabilityListener; - -private: bool mAlive; // can become false if circuit disconnects bool mCapabilitiesReceived; - //spatial partitions for objects in this region - std::vector<LLSpatialPartition*> mObjectPartition; - - LLHTTPClient::ResponderPtr mHttpResponderPtr ; - BOOL mReleaseNotesRequested; }; diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 25cf63a367..3e85802ba6 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -137,6 +137,7 @@ LLGLSLShader gDeferredGIProgram; LLGLSLShader gDeferredGIFinalProgram; LLGLSLShader gDeferredPostGIProgram; LLGLSLShader gDeferredPostProgram; +LLGLSLShader gDeferredPostNoDoFProgram; LLGLSLShader gLuminanceGatherProgram; @@ -1050,7 +1051,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() { gDeferredMultiLightProgram.mName = "Deferred MultiLight Shader"; gDeferredMultiLightProgram.mShaderFiles.clear(); - gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB)); + gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightV.glsl", GL_VERTEX_SHADER_ARB)); gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightF.glsl", GL_FRAGMENT_SHADER_ARB)); gDeferredMultiLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredMultiLightProgram.createShader(NULL, NULL); @@ -1246,6 +1247,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() success = gDeferredPostProgram.createShader(NULL, NULL); } + if (success) + { + gDeferredPostNoDoFProgram.mName = "Deferred Post Shader"; + gDeferredPostNoDoFProgram.mShaderFiles.clear(); + gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB)); + gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoDoFF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredPostNoDoFProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; + success = gDeferredPostNoDoFProgram.createShader(NULL, NULL); + } + if (mVertexShaderLevel[SHADER_DEFERRED] > 1) { if (success) diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index f31d2d1836..72ac5e02ee 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -368,6 +368,7 @@ extern LLGLSLShader gDeferredSoftenProgram; extern LLGLSLShader gDeferredShadowProgram; extern LLGLSLShader gDeferredPostGIProgram; extern LLGLSLShader gDeferredPostProgram; +extern LLGLSLShader gDeferredPostNoDoFProgram; extern LLGLSLShader gDeferredAvatarShadowProgram; extern LLGLSLShader gDeferredAttachmentShadowProgram; extern LLGLSLShader gDeferredAlphaProgram; diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 7a10dfc414..d9ff931575 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -76,18 +76,23 @@ LLStat LLViewerTextureList::sFormattedMemStat(32, TRUE); LLViewerTextureList gTextureList; static LLFastTimer::DeclareTimer FTM_PROCESS_IMAGES("Process Images"); +U32 LLViewerTextureList::sRenderThreadID = 0 ; /////////////////////////////////////////////////////////////////////////////// LLViewerTextureList::LLViewerTextureList() : mForceResetTextureStats(FALSE), mUpdateStats(FALSE), mMaxResidentTexMemInMegaBytes(0), - mMaxTotalTextureMemInMegaBytes(0) + mMaxTotalTextureMemInMegaBytes(0), + mInitialized(FALSE) { } void LLViewerTextureList::init() { + sRenderThreadID = LLThread::currentID() ; + + mInitialized = TRUE ; sNumImages = 0; mMaxResidentTexMemInMegaBytes = 0; mMaxTotalTextureMemInMegaBytes = 0 ; @@ -105,6 +110,10 @@ void LLViewerTextureList::doPreloadImages() { LL_DEBUGS("ViewerImages") << "Preloading images..." << LL_ENDL; + llassert_always(mInitialized) ;
+ llassert_always(mImageList.empty()) ;
+ llassert_always(mUUIDMap.empty()) ; + // Set the "missing asset" image LLViewerFetchedTexture::sMissingAssetImagep = LLViewerTextureManager::getFetchedTextureFromFile("missing_asset.tga", MIPMAP_NO, LLViewerFetchedTexture::BOOST_UI); @@ -300,6 +309,7 @@ void LLViewerTextureList::destroyGL(BOOL save_state) void LLViewerTextureList::restoreGL() { + llassert_always(mInitialized) ; LLImageGL::restoreGL(); } @@ -477,8 +487,10 @@ LLViewerFetchedTexture *LLViewerTextureList::findImage(const LLUUID &image_id) return iter->second; } -void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image) +void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image, U32 thread_id) { + llassert_always(mInitialized) ; + llassert_always(sRenderThreadID == thread_id); llassert(image); if (image->isInImageList()) { @@ -492,8 +504,10 @@ void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image) image->setInImageList(TRUE) ; } -void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image) +void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image, U32 thread_id) { + llassert_always(mInitialized) ; + llassert_always(sRenderThreadID == thread_id); llassert(image); if (!image->isInImageList()) { @@ -690,9 +704,9 @@ void LLViewerTextureList::updateImagesDecodePriorities() if ((decode_priority_test < old_priority_test * .8f) || (decode_priority_test > old_priority_test * 1.25f)) { - removeImageFromList(imagep); + removeImageFromList(imagep, sRenderThreadID); imagep->setDecodePriority(decode_priority); - addImageToList(imagep); + addImageToList(imagep, sRenderThreadID); } update_counter--; } @@ -769,9 +783,8 @@ void LLViewerTextureList::forceImmediateUpdate(LLViewerFetchedTexture* imagep) imagep->processTextureStats(); F32 decode_priority = LLViewerFetchedTexture::maxDecodePriority() ; imagep->setDecodePriority(decode_priority); - mImageList.insert(imagep); - imagep->setInImageList(TRUE) ; - + addImageToList(imagep); + return ; } @@ -864,7 +877,9 @@ void LLViewerTextureList::updateImagesUpdateStats() void LLViewerTextureList::decodeAllImages(F32 max_time) { LLTimer timer; - + + llassert_always(sRenderThreadID == LLThread::currentID()); + // Update texture stats and priorities std::vector<LLPointer<LLViewerFetchedTexture> > image_list; for (image_priority_list_t::iterator iter = mImageList.begin(); @@ -882,8 +897,7 @@ void LLViewerTextureList::decodeAllImages(F32 max_time) imagep->processTextureStats(); F32 decode_priority = imagep->calcDecodePriority(); imagep->setDecodePriority(decode_priority); - mImageList.insert(imagep); - imagep->setInImageList(TRUE) ; + addImageToList(imagep); } image_list.clear(); @@ -932,16 +946,19 @@ BOOL LLViewerTextureList::createUploadFile(const std::string& filename, LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec); if (image.isNull()) { + image->setLastError("Couldn't open the image to be uploaded."); return FALSE; } if (!image->load(filename)) { + image->setLastError("Couldn't load the image to be uploaded."); return FALSE; } // Decompress or expand it in a raw image structure LLPointer<LLImageRaw> raw_image = new LLImageRaw; if (!image->decode(raw_image, 0.0f)) { + image->setLastError("Couldn't decode the image to be uploaded."); return FALSE; } // Check the image constraints @@ -952,8 +969,15 @@ BOOL LLViewerTextureList::createUploadFile(const std::string& filename, } // Convert to j2c (JPEG2000) and save the file locally LLPointer<LLImageJ2C> compressedImage = convertToUploadFile(raw_image); + if (compressedImage.isNull()) + { + image->setLastError("Couldn't convert the image to jpeg2000."); + llinfos << "Couldn't convert to j2c, file : " << filename << llendl; + return FALSE; + } if (!compressedImage->save(out_filename)) { + image->setLastError("Couldn't create the jpeg2000 image for upload."); llinfos << "Couldn't create output file : " << out_filename << llendl; return FALSE; } @@ -961,6 +985,7 @@ BOOL LLViewerTextureList::createUploadFile(const std::string& filename, LLPointer<LLImageJ2C> integrity_test = new LLImageJ2C; if (!integrity_test->loadAndValidate( out_filename )) { + image->setLastError("The created jpeg2000 image is corrupt."); llinfos << "Image file : " << out_filename << " is corrupt" << llendl; return FALSE; } @@ -978,7 +1003,25 @@ LLPointer<LLImageJ2C> LLViewerTextureList::convertToUploadFile(LLPointer<LLImage (raw_image->getWidth() * raw_image->getHeight() <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF)) compressedImage->setReversible(TRUE); - compressedImage->encode(raw_image, 0.0f); + + if (gSavedSettings.getBOOL("Jpeg2000AdvancedCompression")) + { + // This test option will create jpeg2000 images with precincts for each level, RPCL ordering + // and PLT markers. The block size is also optionally modifiable. + // Note: the images hence created are compatible with older versions of the viewer. + // Read the blocks and precincts size settings + S32 block_size = gSavedSettings.getS32("Jpeg2000BlocksSize"); + S32 precinct_size = gSavedSettings.getS32("Jpeg2000PrecinctsSize"); + llinfos << "Advanced JPEG2000 Compression: precinct = " << precinct_size << ", block = " << block_size << llendl; + compressedImage->initEncode(*raw_image, block_size, precinct_size, 0); + } + + if (!compressedImage->encode(raw_image, 0.0f)) + { + llinfos << "convertToUploadFile : encode returns with error!!" << llendl; + // Clear up the pointer so we don't leak that one + compressedImage = NULL; + } return compressedImage; } diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h index d508ce1ac6..d02b6be6b5 100644 --- a/indra/newview/llviewertexturelist.h +++ b/indra/newview/llviewertexturelist.h @@ -83,6 +83,7 @@ public: void dump(); void destroyGL(BOOL save_state = TRUE); void restoreGL(); + BOOL isInitialized() const {return mInitialized;} LLViewerFetchedTexture *findImage(const LLUUID &image_id); @@ -120,8 +121,8 @@ private: void addImage(LLViewerFetchedTexture *image); void deleteImage(LLViewerFetchedTexture *image); - void addImageToList(LLViewerFetchedTexture *image); - void removeImageFromList(LLViewerFetchedTexture *image); + void addImageToList(LLViewerFetchedTexture *image, U32 thread_id = LLThread::currentID()); + void removeImageFromList(LLViewerFetchedTexture *image, U32 thread_id = LLThread::currentID()); LLViewerFetchedTexture * getImage(const LLUUID &image_id, BOOL usemipmap = TRUE, @@ -187,6 +188,7 @@ private: // simply holds on to LLViewerFetchedTexture references to stop them from being purged too soon std::set<LLPointer<LLViewerFetchedTexture> > mImagePreloads; + BOOL mInitialized ; BOOL mUpdateStats; S32 mMaxResidentTexMemInMegaBytes; S32 mMaxTotalTextureMemInMegaBytes; @@ -206,30 +208,33 @@ public: private: static S32 sNumImages; static void (*sUUIDCallback)(void**, const LLUUID &); + + //debug use + static U32 sRenderThreadID; }; class LLUIImageList : public LLImageProviderInterface, public LLSingleton<LLUIImageList> { public: // LLImageProviderInterface - /*virtual*/ LLUIImagePtr getUIImageByID(const LLUUID& id, S32 priority); - /*virtual*/ LLUIImagePtr getUIImage(const std::string& name, S32 priority); + /*virtual*/ LLPointer<LLUIImage> getUIImageByID(const LLUUID& id, S32 priority); + /*virtual*/ LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority); void cleanUp(); bool initFromFile(); - LLUIImagePtr preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect); + LLPointer<LLUIImage> preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect); static void onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata ); private: - LLUIImagePtr loadUIImageByName(const std::string& name, const std::string& filename, + LLPointer<LLUIImage> loadUIImageByName(const std::string& name, const std::string& filename, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI); - LLUIImagePtr loadUIImageByID(const LLUUID& id, + LLPointer<LLUIImage> loadUIImageByID(const LLUUID& id, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI); - LLUIImagePtr loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null); + LLPointer<LLUIImage> loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null); struct LLUIImageLoadData diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 8af90622ec..6fe79c2e85 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -79,6 +79,7 @@ #include "lltooltip.h" #include "llmediaentry.h" #include "llurldispatcher.h" +#include "raytrace.h" // newview includes #include "llagent.h" @@ -236,17 +237,12 @@ BOOL gDisplayCameraPos = FALSE; BOOL gDisplayFOV = FALSE; BOOL gDisplayBadge = FALSE; -S32 CHAT_BAR_HEIGHT = 28; -S32 OVERLAY_BAR_HEIGHT = 20; - -const U8 NO_FACE = 255; +static const U8 NO_FACE = 255; BOOL gQuietSnapshot = FALSE; const F32 MIN_AFK_TIME = 2.f; // minimum time after setting away state before coming back -const F32 MAX_FAST_FRAME_TIME = 0.5f; -const F32 FAST_FRAME_INCREMENT = 0.1f; -const F32 MIN_DISPLAY_SCALE = 0.75f; +static const F32 MIN_DISPLAY_SCALE = 0.75f; std::string LLViewerWindow::sSnapshotBaseName; std::string LLViewerWindow::sSnapshotDir; diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 62822c0b34..df6928aa1d 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -38,13 +38,12 @@ #include "v3dmath.h" #include "v2math.h" +#include "llcursortypes.h" #include "llwindowcallbacks.h" #include "lltimer.h" #include "llstat.h" #include "llmousehandler.h" -#include "llcursortypes.h" #include "llhandle.h" -#include "llimage.h" #include <boost/function.hpp> #include <boost/signals2.hpp> @@ -59,6 +58,7 @@ class LLTool; class LLVelocityBar; class LLPanel; class LLImageRaw; +class LLImageFormatted; class LLHUDIcon; class LLWindow; class LLRootView; @@ -467,12 +467,6 @@ private: LLPointer<LLViewerObject> mDragHoveredObject; }; -void toggle_flying(void*); -void toggle_first_person(); -void toggle_build(void*); -void reset_viewer_state_on_sim(void); -void update_saved_window_size(const std::string& control,S32 delta_width, S32 delta_height); - // // Globals // @@ -491,8 +485,6 @@ extern S32 gDebugRaycastFaceHit; extern LLVector3 gDebugRaycastStart; extern LLVector3 gDebugRaycastEnd; -extern S32 CHAT_BAR_HEIGHT; - extern BOOL gDisplayCameraPos; extern BOOL gDisplayWindInfo; extern BOOL gDisplayFOV; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 1f6d686a86..ec2b5a4c98 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -38,9 +38,9 @@ #include <ctype.h> #include "llaudioengine.h" -#include "llcachename.h" #include "noise.h" #include "sound_ids.h" +#include "raytrace.h" #include "llagent.h" // Get state values from here #include "llagentcamera.h" diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index a71539266d..bd12328a6b 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -412,6 +412,7 @@ void LLVoiceChannel::doSetState(const EState& new_state) { EState old_state = mState; mState = new_state; + if (!mStateChangedCallback.empty()) mStateChangedCallback(old_state, mState, mCallDirection, mCallEndedByAgent); } @@ -846,8 +847,13 @@ void LLVoiceChannelP2P::activate() // otherwise answering the call else { - LLVoiceClient::getInstance()->answerInvite(mSessionHandle); - + if (!LLVoiceClient::getInstance()->answerInvite(mSessionHandle)) + { + mCallEndedByAgent = false; + mSessionHandle.clear(); + handleError(ERROR_UNKNOWN); + return; + } // using the session handle invalidates it. Clear it out here so we can't reuse it by accident. mSessionHandle.clear(); } diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp index 288d335e1d..6396bc042d 100644 --- a/indra/newview/llvosky.cpp +++ b/indra/newview/llvosky.cpp @@ -304,7 +304,7 @@ void LLSkyTex::createGLImage(S32 which) void LLSkyTex::bindTexture(BOOL curr) { - gGL.getTexUnit(0)->bind(mTexture[getWhich(curr)]); + gGL.getTexUnit(0)->bind(mTexture[getWhich(curr)], true); } /*************************************** diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index e6f2b19e07..8946d4e0b6 100644 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -50,6 +50,7 @@ #include "pipeline.h" #include "llspatialpartition.h" #include "llnotificationsutil.h" +#include "raytrace.h" extern LLPipeline gPipeline; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 9d2887d2e8..e9a8c9b80a 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -72,7 +72,9 @@ #include "llmeshrepository.h" #include "llagent.h" #include "llviewermediafocus.h" +#include "lldatapacker.h" #include "llvoavatar.h" +#include "llvocache.h" const S32 MIN_QUIET_FRAMES_COALESCE = 30; const F32 FORCE_SIMPLE_RENDER_AREA = 512.f; diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp index 4b3a9a4dc3..67bb965f99 100644 --- a/indra/newview/llwaterparammanager.cpp +++ b/indra/newview/llwaterparammanager.cpp @@ -33,6 +33,7 @@ #include "pipeline.h" #include "llsky.h" +#include "lldiriterator.h" #include "llfloaterreg.h" #include "llsliderctrl.h" #include "llspinctrl.h" @@ -87,11 +88,12 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name) std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", "")); LL_DEBUGS2("AppInit", "Shaders") << "Loading Default water settings from " << path_name << LL_ENDL; - bool found = true; + bool found = true; + LLDirIterator app_settings_iter(path_name, "*.xml"); while(found) { std::string name; - found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name); + found = app_settings_iter.next(name); if(found) { @@ -113,11 +115,12 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name) std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", "")); LL_DEBUGS2("AppInit", "Shaders") << "Loading User water settings from " << path_name2 << LL_ENDL; - found = true; + found = true; + LLDirIterator user_settings_iter(path_name2, "*.xml"); while(found) { std::string name; - found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name); + found = user_settings_iter.next(name); if(found) { name=name.erase(name.length()-4); diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp index e5f52dfc97..848efcbb49 100644 --- a/indra/newview/llwlparammanager.cpp +++ b/indra/newview/llwlparammanager.cpp @@ -31,6 +31,7 @@ #include "pipeline.h" #include "llsky.h" +#include "lldiriterator.h" #include "llfloaterreg.h" #include "llsliderctrl.h" #include "llspinctrl.h" @@ -100,11 +101,12 @@ void LLWLParamManager::loadPresets(const std::string& file_name) std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", "")); LL_DEBUGS2("AppInit", "Shaders") << "Loading Default WindLight settings from " << path_name << LL_ENDL; - bool found = true; + bool found = true; + LLDirIterator app_settings_iter(path_name, "*.xml"); while(found) { std::string name; - found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name); + found = app_settings_iter.next(name); if(found) { @@ -126,11 +128,12 @@ void LLWLParamManager::loadPresets(const std::string& file_name) std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", "")); LL_DEBUGS2("AppInit", "Shaders") << "Loading User WindLight settings from " << path_name2 << LL_ENDL; - found = true; + found = true; + LLDirIterator user_settings_iter(path_name2, "*.xml"); while(found) { std::string name; - found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name); + found = user_settings_iter.next(name); if(found) { name=name.erase(name.length()-4); diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 23594e74b6..ec24b02934 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -50,6 +50,7 @@ #include "llviewerstats.h" #include "llvlcomposition.h" #include "llvoavatar.h" +#include "llvocache.h" #include "llvowater.h" #include "message.h" #include "pipeline.h" diff --git a/indra/newview/llxmlrpclistener.cpp b/indra/newview/llxmlrpclistener.cpp index 2596f239ca..97a9eb7f5f 100644 --- a/indra/newview/llxmlrpclistener.cpp +++ b/indra/newview/llxmlrpclistener.cpp @@ -499,6 +499,13 @@ private: // 'array' as the value of this 'key'. responses.insert(key, array); } + else if (xmlrpc_type_struct == type) + { + LLSD submap = parseValues(status_string, + STRINGIZE(key_pfx << key << ':'), + current); + responses.insert(key, submap); + } else { // whoops - unrecognized type diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 21fbe52ccd..845a87b8cf 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -625,8 +625,14 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); addDeferredAttachments(mDeferredScreen); - mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); + mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); + +#if LL_DARWIN + // As of OS X 10.6.7, Apple doesn't support multiple color formats in a single FBO + mEdgeMap.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); +#else mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); +#endif if (shadow_detail > 0 || ssao) { //only need mDeferredLight[0] for shadows OR ssao @@ -651,7 +657,12 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) mDeferredLight[2].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE); for (U32 i = 0; i < 2; i++) { +#if LL_DARWIN + // As of OS X 10.6.7, Apple doesn't support multiple color formats in a single FBO + mGIMapPost[i].allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE); +#else mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE); +#endif } } else @@ -666,8 +677,12 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) F32 scale = gSavedSettings.getF32("RenderShadowResolutionScale"); +#if LL_DARWIN + U32 shadow_fmt = 0; +#else //HACK: make alpha masking work on ATI depth shadows (work around for ATI driver bug) U32 shadow_fmt = gGLManager.mIsATI ? GL_ALPHA : 0; +#endif if (shadow_detail > 0) { //allocate 4 sun shadow maps @@ -784,6 +799,21 @@ void LLPipeline::updateRenderDeferred() } } +//static +void LLPipeline::refreshRenderDeferred() +{ + if(gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES)) + { + //turn the deferred rendering and glow off when draw physics shapes. + sRenderDeferred = FALSE ; + sRenderGlow = FALSE ; + } + else + { + updateRenderDeferred() ; + } +} + void LLPipeline::releaseGLBuffers() { assertInitialized(); @@ -6275,128 +6305,135 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) if (LLPipeline::sRenderDeferred && !LLViewerCamera::getInstance()->cameraUnderWater()) { + bool dof_enabled = true; + LLGLSLShader* shader = &gDeferredPostProgram; if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 2) { shader = &gDeferredGIFinalProgram; + dof_enabled = false; + } + else if (LLToolMgr::getInstance()->inBuildMode() || !gSavedSettings.getBOOL("RenderDepthOfField")) + { //squish focal length when in build mode (or if DoF is disabled) so DoF doesn't make editing objects difficult + shader = &gDeferredPostNoDoFProgram; + dof_enabled = false; } + LLGLDisable blend(GL_BLEND); bindDeferredShader(*shader); - //depth of field focal plane calculations + if (dof_enabled) + { + //depth of field focal plane calculations - static F32 current_distance = 16.f; - static F32 start_distance = 16.f; - static F32 transition_time = 1.f; + static F32 current_distance = 16.f; + static F32 start_distance = 16.f; + static F32 transition_time = 1.f; - LLVector3 focus_point; + LLVector3 focus_point; - LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject(); - if (obj && obj->mDrawable && obj->isSelected()) - { - S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace(); - if (obj && obj->mDrawable) - { - LLFace* face = obj->mDrawable->getFace(face_idx); - if (face) + LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject(); + if (obj && obj->mDrawable && obj->isSelected()) + { //focus on selected media object + S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace(); + if (obj && obj->mDrawable) { - focus_point = face->getPositionAgent(); + LLFace* face = obj->mDrawable->getFace(face_idx); + if (face) + { + focus_point = face->getPositionAgent(); + } } } - } - if (focus_point.isExactlyZero()) - { - if (LLViewerJoystick::getInstance()->getOverrideCamera()) + if (focus_point.isExactlyZero()) { - focus_point = gDebugRaycastIntersection; - } - else if (gAgentCamera.cameraMouselook()) - { - gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, - NULL, - &focus_point); - } - else - { - LLViewerObject* obj = gAgentCamera.getFocusObject(); - if (obj) - { - focus_point = LLVector3(gAgentCamera.getFocusGlobal()-gAgent.getRegion()->getOriginGlobal()); + if (LLViewerJoystick::getInstance()->getOverrideCamera()) + { //focus on point under cursor + focus_point = gDebugRaycastIntersection; + } + else if (gAgentCamera.cameraMouselook()) + { //focus on point under mouselook crosshairs + gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, + NULL, + &focus_point); } else { - focus_point = gDebugRaycastIntersection; + LLViewerObject* obj = gAgentCamera.getFocusObject(); + if (obj) + { //focus on alt-zoom target + focus_point = LLVector3(gAgentCamera.getFocusGlobal()-gAgent.getRegion()->getOriginGlobal()); + } + else + { //focus on your avatar + focus_point = gAgent.getPositionAgent(); + } } } - } - - LLVector3 eye = LLViewerCamera::getInstance()->getOrigin(); - F32 target_distance = 16.f; - if (!focus_point.isExactlyZero()) - { - target_distance = LLViewerCamera::getInstance()->getAtAxis() * (focus_point-eye); - } - if (transition_time >= 1.f && - fabsf(current_distance-target_distance)/current_distance > 0.01f) - { //large shift happened, interpolate smoothly to new target distance - transition_time = 0.f; - start_distance = current_distance; - } - else if (transition_time < 1.f) - { //currently in a transition, continue interpolating - transition_time += 1.f/gSavedSettings.getF32("CameraFocusTransitionTime")*gFrameIntervalSeconds; - transition_time = llmin(transition_time, 1.f); + LLVector3 eye = LLViewerCamera::getInstance()->getOrigin(); + F32 target_distance = 16.f; + if (!focus_point.isExactlyZero()) + { + target_distance = LLViewerCamera::getInstance()->getAtAxis() * (focus_point-eye); + } - F32 t = cosf(transition_time*F_PI+F_PI)*0.5f+0.5f; - current_distance = start_distance + (target_distance-start_distance)*t; - } - else - { //small or no change, just snap to target distance - current_distance = target_distance; - } + if (transition_time >= 1.f && + fabsf(current_distance-target_distance)/current_distance > 0.01f) + { //large shift happened, interpolate smoothly to new target distance + transition_time = 0.f; + start_distance = current_distance; + } + else if (transition_time < 1.f) + { //currently in a transition, continue interpolating + transition_time += 1.f/gSavedSettings.getF32("CameraFocusTransitionTime")*gFrameIntervalSeconds; + transition_time = llmin(transition_time, 1.f); - //convert to mm - F32 subject_distance = current_distance*1000.f; - F32 fnumber = gSavedSettings.getF32("CameraFNumber"); - F32 default_focal_length = gSavedSettings.getF32("CameraFocalLength"); + F32 t = cosf(transition_time*F_PI+F_PI)*0.5f+0.5f; + current_distance = start_distance + (target_distance-start_distance)*t; + } + else + { //small or no change, just snap to target distance + current_distance = target_distance; + } - if (LLToolMgr::getInstance()->inBuildMode() || !gSavedSettings.getBOOL("RenderDepthOfField")) - { //squish focal length when in build mode (or if DoF is disabled) so DoF doesn't make editing objects difficult - default_focal_length = 5.f; - } + //convert to mm + F32 subject_distance = current_distance*1000.f; + F32 fnumber = gSavedSettings.getF32("CameraFNumber"); + F32 default_focal_length = gSavedSettings.getF32("CameraFocalLength"); - F32 fov = LLViewerCamera::getInstance()->getView(); + F32 fov = LLViewerCamera::getInstance()->getView(); - const F32 default_fov = gSavedSettings.getF32("CameraFieldOfView") * F_PI/180.f; - //const F32 default_aspect_ratio = gSavedSettings.getF32("CameraAspectRatio"); + const F32 default_fov = gSavedSettings.getF32("CameraFieldOfView") * F_PI/180.f; + //const F32 default_aspect_ratio = gSavedSettings.getF32("CameraAspectRatio"); - //F32 aspect_ratio = (F32) mScreen.getWidth()/(F32)mScreen.getHeight(); + //F32 aspect_ratio = (F32) mScreen.getWidth()/(F32)mScreen.getHeight(); - F32 dv = 2.f*default_focal_length * tanf(default_fov/2.f); - //F32 dh = 2.f*default_focal_length * tanf(default_fov*default_aspect_ratio/2.f); + F32 dv = 2.f*default_focal_length * tanf(default_fov/2.f); + //F32 dh = 2.f*default_focal_length * tanf(default_fov*default_aspect_ratio/2.f); - F32 focal_length = dv/(2*tanf(fov/2.f)); + F32 focal_length = dv/(2*tanf(fov/2.f)); - //F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle); + //F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle); - // from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f)) - // where N = fnumber - // s2 = dot distance - // s1 = subject distance - // f = focal length - // - - F32 blur_constant = focal_length*focal_length/(fnumber*(subject_distance-focal_length)); - blur_constant /= 1000.f; //convert to meters for shader - F32 magnification = focal_length/(subject_distance-focal_length); - - shader->uniform1f("focal_distance", -subject_distance/1000.f); - shader->uniform1f("blur_constant", blur_constant); - shader->uniform1f("tan_pixel_angle", tanf(1.f/LLDrawable::sCurPixelAngle)); - shader->uniform1f("magnification", magnification); + // from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f)) + // where N = fnumber + // s2 = dot distance + // s1 = subject distance + // f = focal length + // + + F32 blur_constant = focal_length*focal_length/(fnumber*(subject_distance-focal_length)); + blur_constant /= 1000.f; //convert to meters for shader + F32 magnification = focal_length/(subject_distance-focal_length); + + shader->uniform1f("focal_distance", -subject_distance/1000.f); + shader->uniform1f("blur_constant", blur_constant); + shader->uniform1f("tan_pixel_angle", tanf(1.f/LLDrawable::sCurPixelAngle)); + shader->uniform1f("magnification", magnification); + } S32 channel = shader->enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_RECT_TEXTURE); if (channel > -1) diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 0cf3fde562..e9a250cd6d 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -356,6 +356,7 @@ public: static BOOL getRenderHighlights(void* data); static void updateRenderDeferred(); + static void refreshRenderDeferred(); private: void unloadShaders(); diff --git a/indra/newview/res/resource.h b/indra/newview/res/resource.h index 28813be896..01d90da971 100644 --- a/indra/newview/res/resource.h +++ b/indra/newview/res/resource.h @@ -38,6 +38,7 @@ #define IDC_CURSOR5 154 #define IDI_LCD_LL_ICON 157 #define IDC_CURSOR6 158 +#define IDC_STATIC 1000 #define IDC_RADIO_56 1000 #define IDC_RADIO_128 1001 #define IDC_RADIO_256 1002 diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc index 5e8cee1f5f..38d04b4b5c 100644 --- a/indra/newview/res/viewerRes.rc +++ b/indra/newview/res/viewerRes.rc @@ -7,7 +7,7 @@ // // Generated from the TEXTINCLUDE 2 resource. // -#include "winres.h" +#include "windows.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS @@ -34,7 +34,7 @@ END 2 TEXTINCLUDE BEGIN - "#include ""winres.h""\r\n" + "#include ""windows.h""\r\n" "\0" END diff --git a/indra/newview/skins/default/textures/icons/Edit_Wrench.png b/indra/newview/skins/default/textures/icons/Edit_Wrench.png Binary files differindex 250697b4b1..edb40b9c96 100644 --- a/indra/newview/skins/default/textures/icons/Edit_Wrench.png +++ b/indra/newview/skins/default/textures/icons/Edit_Wrench.png diff --git a/indra/newview/skins/default/xui/da/floater_tos.xml b/indra/newview/skins/default/xui/da/floater_tos.xml index 760f60c996..af9ee0bd06 100644 --- a/indra/newview/skins/default/xui/da/floater_tos.xml +++ b/indra/newview/skins/default/xui/da/floater_tos.xml @@ -4,7 +4,7 @@ http://secondlife.com/app/tos/ </floater.string> <floater.string name="loading_url"> - data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Henter %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <button label="Fortsæt" label_selected="Fortsæt" name="Continue"/> <button label="Annullér" label_selected="Annullér" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml index a3c4897ee1..30b54d3eb2 100644 --- a/indra/newview/skins/default/xui/da/notifications.xml +++ b/indra/newview/skins/default/xui/da/notifications.xml @@ -748,6 +748,7 @@ Prøv venligst igen senere. [OLD_NAME] ([SLID]) er nu kendt som [NEW_NAME]. </notification> <notification name="OfferTeleport"> + Tilbyd en teleport til din position med følgende besked? <form name="form"> <input name="message"> Mød mig i [REGION] diff --git a/indra/newview/skins/default/xui/de/floater_tos.xml b/indra/newview/skins/default/xui/de/floater_tos.xml index 1f3ef2f0b4..ba329371f8 100644 --- a/indra/newview/skins/default/xui/de/floater_tos.xml +++ b/indra/newview/skins/default/xui/de/floater_tos.xml @@ -4,7 +4,7 @@ http://secondlife.com/app/tos/ </floater.string> <floater.string name="loading_url"> - data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Wird geladen %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3EServicebedingungen%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <button label="Weiter" label_selected="Weiter" name="Continue"/> <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml index 967cb28476..a8b3ce9c28 100644 --- a/indra/newview/skins/default/xui/en/floater_about.xml +++ b/indra/newview/skins/default/xui/en/floater_about.xml @@ -139,21 +139,20 @@ Thank you to the following Residents for helping to ensure that this is the best word_wrap="true"> 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion APR Copyright (C) 2000-2004 The Apache Software Foundation - Collada DOM Copyright 2005 Sony Computer Entertainment Inc. +Collada DOM Copyright 2005 Sony Computer Entertainment Inc. cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc. expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). GL Copyright (C) 1999-2004 Brian Paul. - GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia. +GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia. google-perftools Copyright (c) 2005, Google Inc. Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. ogg/vorbis Copyright (C) 2001, Xiphophorus OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. - PCRE Copyright (c) 1997-2008 University of Cambridge -Pth Copyright (C) 1999-2006 Ralf S. Engelschall <rse@gnu.org> +PCRE Copyright (c) 1997-2008 University of Cambridge SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) xmlrpc-epi Copyright (C) 2000 Epinions, Inc. diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index 533e0c96f2..a24306456a 100644 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -1,547 +1,547 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater can_close="true" can_drag_on_left="false" can_minimize="false" - can_resize="true" height="550" min_height="550" min_width="620" - name="Model Preview" title="Upload Model" width="620"> - - <string name="status_idle">Idle</string> - <string name="status_reading_file">Loading...</string> - <string name="status_generating_meshes">Generating Meshes...</string> - <string name="status_vertex_number_overflow">Error: Vertex number is more than 65534, aborted!</string> - <string name="high">High</string> - <string name="medium">Medium</string> - <string name="low">Low</string> - <string name="lowest">Lowest</string> - <string name="mesh_status_good">Ship it!</string> - <string name="mesh_status_na">N/A</string> - <string name="mesh_status_none">None</string> - <string name="mesh_status_submesh_mismatch">Levels of detail have a different number of textureable faces.</string> - <string name="mesh_status_mesh_mismatch">Levels of detail have a different number of mesh instances.</string> - <string name="mesh_status_too_many_vertices">Level of detail has too many vertices.</string> - <string name="mesh_status_missing_lod">Missing required level of detail.</string> - <string name="layer_all">All</string> <!-- Text to display in physics layer combo box for "all layers" --> - <string name="decomposing">Analyzing...</string> - <string name="simplifying">Simplifying...</string> - - - <text left="15" bottom="25" follows="top|left" height="15" name="name_label"> - Name: - </text> - <line_editor bottom_delta="20" follows="top|left|right" height="19" max_length_bytes="64" - name="description_form" prevalidate_callback="ascii" width="290" /> - - <text bottom_delta="20" left="15" follows="left|top" height="15" name="lod_label"> - Preview: - </text> - <combo_box bottom_delta="20" follows="left|top" height="18" - name="preview_lod_combo" width="240" tool_tip="LOD to view in preview render"> - <combo_item name="high"> - Level of Detail: High - </combo_item> - <combo_item name="medium"> - Level of Detail: Medium - </combo_item> - <combo_item name="low"> - Level of Detail: Low - </combo_item> - <combo_item name="lowest"> - Level of Detail: Lowest - </combo_item> - </combo_box> - - <menu_button follows="top|left" - image_hover_unselected="Toolbar_Left_Over" - image_overlay="OptionsMenu_Off" - image_selected="Toolbar_Left_Selected" - image_unselected="Toolbar_Left_Off" - layout="topleft" - left_pad="5" - name="options_gear_btn" - width="31" - height="25"/> - <!-- Placeholder panel for 3D preview render --> - <panel - name="preview_panel" - left="15" - bevel_style="none" - border_style="line" - border="true" - width="290" - height="290" - follows="all"/> - - <text bottom_delta="25" left="25" width="100" follows="bottom|left">Upload Details</text> - <panel top_pad="5" border="true" left="15" width="290" height="70" follows="bottom|left" - bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3"> - <text left="25" follows="bottom|left" width="140" height="15" name="streaming cost"> - Resource Cost: [COST] - </text> - <text left="25" top_pad="5" width="140" follows="bottom|left" height="15" name="physics cost"> - Physics Cost: [COST] - </text> - <text left="25" top_pad="5" follows="bottom|left" height="15" name="upload fee"> - Upload Fee: N/A - </text> - </panel> - - <text left="10" bottom="540" width="290" height="15" follows="bottom|left|right" name="status">[STATUS]</text> - - - <button bottom="540" left="300" follows="bottom|right" height="20" label="Defaults" - width="80" name="reset_btn" tool_tip="Reset to defaults"/> - <button bottom="540" left="430" follows="bottom|right" height="20" label="Upload" - width="80" name="ok_btn" tool_tip="Upload to simulator"/> - <button left_pad="10" follows="right|bottom" height="20" width="80" label="Cancel" name="cancel_btn"/> - - <tab_container - follows="right|top|bottom" - top="15" - left="310" - height="470" - width="300" - name="import_tab" - border="true" - tab_position="top"> - - <!-- LOD PANEL --> - <panel - border="true" - label="Level of Detail" - name="lod_panel"> - - <text left="10" width="240" bottom="20" height="15" follows="left|top" name="lod_table_header"> - Select Level of Detail: - </text> - - <text valign="center" halign="center" bg_visible="true" bottom_delta="16" left="75" width="65" height="18" follows="left|top" value="Triangles"/> - <text valign="center" halign="center" bg_visible="true" left_pad="0" width="65" height="18" follows="left|top" value="Vertices"/> - <text valign="center" halign="center" left_pad="0" width="65" bg_visible="true" height="18" follows="left|top" value="Status"/> - - <text valign="center" halign="center" bg_visible="true" name="high_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="High"/> - <text valign="center" halign="center" bg_visible="true" name="high_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/> - <text valign="center" halign="center" bg_visible="true" name="high_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/> - <text valign="center" halign="center" bg_visible="true" name="high_status" left_pad="0" width="65" height="18" follows="left|top" value=""/> - <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_high" left_delta="20" top_delta="0" /> - - <text valign="center" halign="center" bg_visible="true" name="medium_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="Medium"/> - <text valign="center" halign="center" bg_visible="true" name="medium_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/> - <text valign="center" halign="center" bg_visible="true" name="medium_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/> - <text valign="center" halign="center" bg_visible="true" name="medium_status" left_pad="0" width="65" height="18" follows="left|top" value=""/> - <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_medium" left_delta="20" top_delta="0" /> - - <text valign="center" halign="center" bg_visible="true" name="low_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="Low"/> - <text valign="center" halign="center" bg_visible="true" name="low_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/> - <text valign="center" halign="center" bg_visible="true" name="low_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/> - <text valign="center" halign="center" bg_visible="true" name="low_status" left_pad="0" width="65" height="18" follows="left|top" value=""/> - <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_low" left_delta="20" top_delta="0" /> - - <text valign="center" halign="center" bg_visible="true" name="lowest_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="Lowest"/> - <text valign="center" halign="center" bg_visible="true" name="lowest_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/> - <text valign="center" halign="center" bg_visible="true" name="lowest_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/> - <text valign="center" halign="center" bg_visible="true" name="lowest_status" left_pad="0" width="65" height="18" follows="left|top" value=""/> - <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_lowest" left_delta="20" top_delta="0" /> - - <text left="10" width="240" height="15" top_pad="15" follows="left|top" name="lod_table_footer"> - Level of Detail: [DETAIL] - </text> - - <icon height="16" width="16" left="20" follows="left|top" name="lod_status_message_icon"/> - <text left_pad="5" width="200" height="28" follows="left|top" top_pad="-15" wrap="true" name="lod_status_message_text"/> - - <text top_pad="-3" left="10" height="15" follows="left|top"> - Mesh - </text> - - <radio_group follows="top|left" height="210" left="30" name="lod_file_or_limit" width="240" value="lod_from_file"> - <radio_item bottom="195" label="Load from file" name="lod_from_file"/> - <radio_item bottom="150" label="Auto generate" name="lod_auto_generate"/> - <radio_item bottom="0" label="None" name="lod_none"/> - </radio_group> - - <line_editor follows="left|top" bottom_delta="-170" width="140" left="45" value="" name="lod_file" height="20"/> - <button bottom_delta="3" name="lod_browse" label="Browse..." left_pad="5" follows="left|top" width="70" height="25"/> - - <combo_box follows="top|left" name="lod_mode" top_pad="22" width="100" left="45" height="20"> - <combo_item name="triangle_limit"> - Triangle Limit - </combo_item> - <combo_item name="error_threshold"> - Error Threshold - </combo_item> - </combo_box> - <spinner follows="top|left" name="lod_triangle_limit" increment="10" left_pad="5" height="20" width="100" decimal_digits="0" enabled="true"/> - <spinner left_delta="0" bottom_delta="0" increment="0.01" follows="top|left" name="lod_error_threshold" min_val="0" max_val="100" height="20" width="100" decimal_digits="3" visible="false" enabled="true"/> - - <text follows="top|left" name="build_operator_text" left="45" top_pad="10" width="100" height="15"> - Build Operator: - </text> - <text follows="top|left" name="queue_mode_text" left_pad="5" width="100" height="15"> - Queue Mode: - </text> - <combo_box follows="top|left" name="build_operator" top_pad="5" left="45" width="100" height="20"> - <combo_item name="edge_collapse"> - Edge Collapse - </combo_item> - <combo_item name="half_edge_collapse"> - Half Edge Collapse - </combo_item> - </combo_box> - - <combo_box follows="top|left" name="queue_mode" left_pad="5" width="100" height="20"> - <combo_item name="greedy"> - Greedy - </combo_item> - <combo_item name="lazy"> - Lazy - </combo_item> - <combo_item name="independent"> - Independent - </combo_item> - </combo_box> - - <text top_pad="10" name="border_mode_text" left="45" follows="left|top" width="100" height="15"> - Border Mode: - </text> - - <text left_pad="5" name="share_tolderance_text" follows="left|top" width="100" height="15"> - Share Tolerance: - </text> - - <combo_box follows="left|top" left="45" height="20" name="border_mode" width="100"> - <combo_item name="border_unlock"> - Unlock - </combo_item> - <combo_item name="border_lock"> - Lock - </combo_item> - </combo_box> - <spinner follows="left|top" name="share_tolerance" left_pad="5" width="100" decimal_digits="5" initial_value="0.00001" height="20"/> - - <text left="10" top_pad="35" follows="top|left" width="240" height="15"> - Generate Normals - </text> - <text left="35" top_pad="5" follows="top|left" width="100" height="15"> - Crease Angle: - </text> - <spinner follows="top|left" left_pad="5" min_val="0" max_val="180" value="75" width="60" height="20" name="crease_angle"/> - </panel> - - <!-- PANEL --> - <panel - border="true" - label="Physics" - name="physics_panel"> - - <!-- PHYSICS GEOMETRY--> - <panel - follows="top|left" - name="physics geometry" - left="0" - top="0" - width="300" - height="65" - visible="true" - border="true" - bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3"> - - <radio_group follows="top|left" top="10" width="240" height="40" name="physics_load_radio" value="physics_load_from_file"> - <radio_item bottom="0" name="physics_load_from_file" label="File:"/> - <radio_item bottom="23" name="physics_use_lod" label="Use Level of Detail:"/> - </radio_group> - - <combo_box left="180" top="10" follows="left|top" height="18" - name="physics_lod_combo" width="110" tool_tip="LOD to use for physics shape"> - <combo_item name="physics_lowest"> - Lowest - </combo_item> - <combo_item name="physics_low"> - Low - </combo_item> - <combo_item name="physics_medium"> - Medium - </combo_item> - <combo_item name="physics_high"> - High - </combo_item> - </combo_box> - - <line_editor follows="left|top" top_pad="5" width="140" left="60" value="" name="physics_file" height="20"/> - <button left_pad="10" name="physics_browse" label="Browse..." follows="left|top" width="70" height="20"/> - - <!-- - <check_box name="physics_optimize" follows="left|top" width="130" left="10" top_pad="5" height="20" label="Optimize"/> - <check_box name="physics_use_hull" follows="left|top" width="130" left_pad="5" height="20" label="Use Convex Hull"/> - --> - </panel> - - - <!-- PHYSICS ANALYSIS--> - <panel - follows="top|left" - name="physics analysis" - top_pad="0" - left="0" - width="300" - height="130" - visible="true" - border="true" - bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3"> - - <text follows="left|top" bottom="40" height="30" left="10" font="SansSerifBig"> - Step 1: Analysis - </text> - - <text top_pad="5" width="50" follows="top|left" height="15"> - Method: - </text> - <combo_box name="Method" follows="top|left" left_pad="5" bottom_delta="2" height="20" width="80"/> - <text left="160" bottom_delta="-2" width="50" follows="top|left" height="15"> - Quality: - </text> - <combo_box name="Decompose Quality" bottom_delta="2" follows="top|left" left_pad="5" height="20" width="80"/> - - <slider name="Smooth" left="10" width="280" follows="top|left" top_pad="10" height="20" label="Smooth:"/> - - <check_box name="Close Holes (Slow)" follows="top|left" top_pad="10" height="15" label="Close Holes (slow)"/> - - <button left="200" bottom_delta="0" width="90" follows="top|left" label="Analyze" name="Decompose" height="20"/> - <button left="200" bottom_delta="0" width="90" follows="top|left" label="Cancel" name="decompose_cancel" visble="false" height="20"/> - </panel> - - - <!-- PHYSICS SIMPLIFICATION --> - <panel - follows="top|left" - name="physics simplification" - left="0" - top_pad="0" - width="300" - height="150" - visible="true" - border="true" - bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3"> - - <text follows="left|top" bottom="40" height="30" left="10" font="SansSerifBig"> - Step 2: Simplification - </text> - - <text left="10" top_pad="5" height="15" width="140" follows="top|left"> - Method: - </text> - - <combo_box left_pad="5" height="20" width="120" follows="top|left" name="Simplify Method"/> - - <slider left="10" name="Combine Quality" label="Passes:" label_width="120" width="270" follows="top|left" top_pad="10" height="20"/> - <slider name="Detail Scale" label="Detail Scale:" label_width="120" width="270" follows="top|left" top_pad="10" height="20"/> - <slider name="Retain%" label="Retain:" label_width="120" width="270" follows="top|left" bottom_delta="0" left_delta="0" visible="false" height="20"/> - <button left="190" width="90" follows="top|left" label="Simplify" name="Simplify" height="20"/> - <button left="190" bottom_delta="0" width="90" follows="top|left" label="Cancel" name="simplify_cancel" height="20"/> - - </panel> - - <!-- INFO PANEL --> - <panel - left="0" - top_pad="0" - width="300" - height="100" - follows="left|top" - name="physics info" - visible="true" - border="true" - bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3"> - - <slider name="physics_explode" follows="top|left" top="10" left="10" label="Preview Spread:" min_val="0.0" max_val="3.0" height="20" width="280"/> - - <text follows="top|left" name="physics_triangles" top_pad="10" height="15" left="10"> - Triangles: [TRIANGLES] - </text> - <text follows="top|left" name="physics_points" top_pad="5" height="15"> - Vertices: [POINTS] - </text> - <text follows="top|left" name="physics_hulls" top_pad="5" height="15"> - Hulls: [HULLS] - </text> - - - </panel> - </panel> - - <!-- MODIFIERS PANEL --> - <panel - border="true" - label="Modifiers" - name="modifiers_panel"> - <text left="10" width="90" bottom="30" follows="top|left" height="15"> - Scale: - </text> - <text left_pad="5" width="140" follows="top|left" height="15"> - Dimensions: - </text> - - <spinner left="10" height="20" follows="top|left" width="80" top_pad="5" value="1.0" min_val="0.01" max_val="64.0" name="import_scale"/> - - <text left_pad="20" height="15" name="import_dimensions" follows="top|left"> - [X] x [Y] x [Z] m - </text> - - <text left="10" top_pad="20" follows="top|left" height="15"> - Include: - </text> - - <check_box top_pad="5" name="upload_textures" height="15" follows="top|left" label="Textures"/> - <check_box top_pad="5" name="upload_skin" height="15" follows="top|left" label="Skin weight"/> - <check_box top_pad="5" left="20" name="upload_joints" height="15" follows="top|left" label="Joint positions"/> - - <text left="10" top_pad="4" width="90" bottom="30" follows="top|left" height="15"> - Pelvis Z Offset: - </text> - - <spinner left="10" top_pad="4" height="20" follows="top|left" width="80" value="0.0" min_val="-3.00" max_val="3.0" name="pelvis_offset"/> - - </panel> - </tab_container> - - <!-- - <button bottom_delta="0" left="10" width="120" name="auto fill" label="Generate LOD" tool_tip="Automatically generate levels of detail"/> - <button bottom_delta="0" left="140" width="120" name="smooth normals" label="Generate Normals" tool_tip="Regenerate normals based on mesh shape"/> - <button bottom_delta="0" left="260" width="120" name="consolidate" label="Consolidate" tool_tip="Combine similar submeshes (reduces number of submeshes)"/> - <button bottom_delta="30" left="260" width="120" name="scrub materials" label="Scrub Materials" tool_tip="Remove all material information (clear textures, set all colors to white)."/> - - <spinner bottom_delta="0" left="140" width="120" height="16" initial_value="75" label_width="60" name="edge threshold" decimal_digits="0" min_val="0" max_val="180" increment="5" label="Hard Angle" tool_tip="Maximum angle that will be smoothed between triangles when using Generate Normals"/> - - <text bottom_delta="30" follows="top|left" height="15" left="10" name="high_lod_label"> - High LOD: - </text> - <combo_box bottom_delta="0" left="97" follows="left|top" height="18" - name="high detail combo" width="100" tool_tip="Specify mesh for this level of detail"> - <combo_item name="high none" value="none"> - None - </combo_item> - <combo_item name="high choose file" value="file"> - Choose File... - </combo_item> - <combo_item name="high triangle limit" value="limit"> - Triangle Limit - </combo_item> - </combo_box> - <spinner bottom_delta="-5" left="200" width="120" name="high limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/> - <text bottom_delta="25" follows="top|left" height="15" left="10" name="high info" width="300"> - [TRIANGLES] Triangles, [VERTICES] Vertices, [SUBMESHES] Submeshes. - [MESSAGE] - </text> - - <text bottom_delta="35" follows="top|left" height="15" left="10" name="medium_lod_label"> - Medium LOD: - </text> - <combo_box bottom_delta="0" left="97" follows="left|top" height="18" - name="medium detail combo" width="100" tool_tip="Specify mesh for this level of detail"> - <combo_item name="medium none" value="none"> - None - </combo_item> - <combo_item name="medium choose file" value="file"> - Choose File... - </combo_item> - <combo_item name="medium triangle limit" value="limit"> - Triangle Limit - </combo_item> - </combo_box> - <spinner bottom_delta="-5" left="200" width="120" name="medium limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/> - <text bottom_delta="25" follows="top|left" height="15" left="10" name="medium info" width="300"> - [TRIANGLES] Triangles, [VERTICES] Vertices, [SUBMESHES] Submeshes. - [MESSAGE] - </text> - - <text bottom_delta="35" follows="top|left" height="15" left="10" name="low_lod_label"> - Low LOD: - </text> - <combo_box bottom_delta="0" left="97" follows="left|top" height="18" - name="low detail combo" width="100" tool_tip="Specify mesh for this level of detail"> - <combo_item name="low none" value="none"> - None - </combo_item> - <combo_item name="low choose file" value="file"> - Choose File... - </combo_item> - <combo_item name="low triangle limit" value="limit"> - Triangle Limit - </combo_item> - </combo_box> - <spinner bottom_delta="-5" left="200" width="120" name="low limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/> - <text bottom_delta="25" follows="top|left" height="15" left="10" name="low info" width="300"> - [TRIANGLES] Triangles, [VERTICES] Vertices, [SUBMESHES] Submeshes - [MESSAGE] - </text> - - <text bottom_delta="35" follows="top|left" height="15" left="10" name="lowest_lod_label"> - Lowest LOD: - </text> - <combo_box bottom_delta="0" left="97" follows="left|top" height="18" - name="lowest detail combo" width="100" tool_tip="Specify mesh for this level of detail"> - <combo_item name="lowest none" value="none"> - None - </combo_item> - <combo_item name="lowest choose file" value="file"> - Choose File... - </combo_item> - <combo_item name="lowest triangle limit" value="limit"> - Triangle Limit - </combo_item> - </combo_box> - <spinner bottom_delta="-5" left="200" width="120" name="lowest limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/> - <text bottom_delta="25" follows="top|left" height="15" left="10" name="lowest info" width="300"> - [TRIANGLES] Triangles, [VERTICES] Vertices, [SUBMESHES] Submeshes - [MESSAGE] - </text> - - <text bottom_delta="35" follows="top|left" height="15" left="10" name="physics_lod_label"> - Physical Shape: - </text> - <combo_box bottom_delta="0" left="97" follows="left|top" height="18" - name="physics detail combo" width="100"> - <combo_item name="physics none" value="none"> - None - </combo_item> - <combo_item name="physics choose file" value="file"> - Choose File... - </combo_item> - <combo_item name="physics triangle limit" value="limit"> - Triangle Limit... - </combo_item> - </combo_box> - <spinner bottom_delta="-5" left="200" width="90" name="physics limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/> - <button bottom_delta="0" left="290" width="30" follows="left|top" height="20" label=">>" - name="decompose_btn" tool_tip="Create convex decomposition."/> - <text bottom_delta="25" follows="top|left" height="15" left="10" name="physics info" width="300"> - [TRIANGLES] Triangles, [HULLS] Hulls, [POINTS] Points - </text> - - <text bottom_delta="25" follows="top|left" height="15" left="10" name="include label" width="300"> - Include: - </text> - - <check_box bottom_delta="20" follow="bottom|left" height="20" label="Textures" - left="15" width="125" name="upload_textures" tool_tip="Upload associated textures "/> - - <check_box bottom_delta="20" follow="bottom|left" height="20" label="Skin Weights" - left="15" width="125" name="upload_skin" tool_tip="Upload vertex skin weighting information."/> - - <check_box bottom_delta="20" follow="bottom|left" height="20" label="Joint Positions" - left="15" width="125" name="upload_joints" tool_tip="Upload joint position information (will override avatar joint positions when mesh is worn)."/> - - - <button bottom_delta="25" follows="bottom|left" height="20" label="Upload" - left="15" name="ok_btn" width="125" tool_tip="Upload to simulator"/> - - <text bottom_delta="20" left="15" width="280" follows="top|left" height="15" name="description_label" text_color="1 0.82 0.46 1"> - (No charge for upload during First Look) - </text> - <text bottom_delta="20" left="15" width="280" follows="top|left" height="15" name="upload_message"> - [MESSAGE] - </text> - - <spinner bottom_delta="20" label="Scale" left="15" width="120" name="debug scale" decimal_digits="3" increment="0.1" min_val="0" max_val="64" initial_value="1" tool_tip="Multiplier for incoming object scale. If incoming dimensions are very small or very large, modify this value to get dimensions into an acceptable range."/> - <text bottom_delta="30" left="15" width="280" follows="top|left" height="15" name="dimensions"> - Model Dimensions: [X]m x [Y]m x [Z]m - </text> - --> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater can_close="true" can_drag_on_left="false" can_minimize="false"
+ can_resize="true" height="550" min_height="550" min_width="620"
+ name="Model Preview" title="Upload Model" width="620">
+
+ <string name="status_idle">Idle</string>
+ <string name="status_reading_file">Loading...</string>
+ <string name="status_generating_meshes">Generating Meshes...</string>
+ <string name="status_vertex_number_overflow">Error: Vertex number is more than 65534, aborted!</string>
+ <string name="high">High</string>
+ <string name="medium">Medium</string>
+ <string name="low">Low</string>
+ <string name="lowest">Lowest</string>
+ <string name="mesh_status_good">Ship it!</string>
+ <string name="mesh_status_na">N/A</string>
+ <string name="mesh_status_none">None</string>
+ <string name="mesh_status_submesh_mismatch">Levels of detail have a different number of textureable faces.</string>
+ <string name="mesh_status_mesh_mismatch">Levels of detail have a different number of mesh instances.</string>
+ <string name="mesh_status_too_many_vertices">Level of detail has too many vertices.</string>
+ <string name="mesh_status_missing_lod">Missing required level of detail.</string>
+ <string name="layer_all">All</string> <!-- Text to display in physics layer combo box for "all layers" -->
+ <string name="decomposing">Analyzing...</string>
+ <string name="simplifying">Simplifying...</string>
+
+
+ <text left="15" bottom="25" follows="top|left" height="15" name="name_label">
+ Name:
+ </text>
+ <line_editor bottom_delta="20" follows="top|left|right" height="19" max_length_bytes="64"
+ name="description_form" prevalidate_callback="ascii" width="290" />
+
+ <text bottom_delta="20" left="15" follows="left|top" height="15" name="lod_label">
+ Preview:
+ </text>
+ <combo_box bottom_delta="20" follows="left|top" height="18"
+ name="preview_lod_combo" width="240" tool_tip="LOD to view in preview render">
+ <combo_item name="high">
+ Level of Detail: High
+ </combo_item>
+ <combo_item name="medium">
+ Level of Detail: Medium
+ </combo_item>
+ <combo_item name="low">
+ Level of Detail: Low
+ </combo_item>
+ <combo_item name="lowest">
+ Level of Detail: Lowest
+ </combo_item>
+ </combo_box>
+
+ <menu_button follows="top|left"
+ image_hover_unselected="Toolbar_Left_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Left_Selected"
+ image_unselected="Toolbar_Left_Off"
+ layout="topleft"
+ left_pad="5"
+ name="options_gear_btn"
+ width="31"
+ height="25"/>
+ <!-- Placeholder panel for 3D preview render -->
+ <panel
+ name="preview_panel"
+ left="15"
+ bevel_style="none"
+ border_style="line"
+ border="true"
+ width="290"
+ height="290"
+ follows="all"/>
+
+ <text bottom_delta="25" left="25" width="100" follows="bottom|left">Upload Details</text>
+ <panel top_pad="5" border="true" left="15" width="290" height="70" follows="bottom|left"
+ bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3">
+ <text left="25" follows="bottom|left" width="140" height="15" name="streaming cost">
+ Resource Cost: [COST]
+ </text>
+ <text left="25" top_pad="5" width="140" follows="bottom|left" height="15" name="physics cost">
+ Physics Cost: [COST]
+ </text>
+ <text left="25" top_pad="5" follows="bottom|left" height="15" name="upload fee">
+ Upload Fee: N/A
+ </text>
+ </panel>
+
+ <text left="10" bottom="540" width="290" height="15" follows="bottom|left|right" name="status">[STATUS]</text>
+
+
+ <button bottom="540" left="300" follows="bottom|right" height="20" label="Defaults"
+ width="80" name="reset_btn" tool_tip="Reset to defaults"/>
+ <button bottom="540" left="430" follows="bottom|right" height="20" label="Upload"
+ width="80" name="ok_btn" tool_tip="Upload to simulator"/>
+ <button left_pad="10" follows="right|bottom" height="20" width="80" label="Cancel" name="cancel_btn"/>
+
+ <tab_container
+ follows="right|top|bottom"
+ top="15"
+ left="310"
+ height="470"
+ width="300"
+ name="import_tab"
+ border="true"
+ tab_position="top">
+
+ <!-- LOD PANEL -->
+ <panel
+ border="true"
+ label="Level of Detail"
+ name="lod_panel">
+
+ <text left="10" width="240" bottom="20" height="15" follows="left|top" name="lod_table_header">
+ Select Level of Detail:
+ </text>
+
+ <text valign="center" halign="center" bg_visible="true" bottom_delta="16" left="75" width="65" height="18" follows="left|top" value="Triangles"/>
+ <text valign="center" halign="center" bg_visible="true" left_pad="0" width="65" height="18" follows="left|top" value="Vertices"/>
+ <text valign="center" halign="center" left_pad="0" width="65" bg_visible="true" height="18" follows="left|top" value="Status"/>
+
+ <text valign="center" halign="center" bg_visible="true" name="high_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="High"/>
+ <text valign="center" halign="center" bg_visible="true" name="high_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+ <text valign="center" halign="center" bg_visible="true" name="high_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+ <text valign="center" halign="center" bg_visible="true" name="high_status" left_pad="0" width="65" height="18" follows="left|top" value=""/>
+ <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_high" left_delta="20" top_delta="0" />
+
+ <text valign="center" halign="center" bg_visible="true" name="medium_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="Medium"/>
+ <text valign="center" halign="center" bg_visible="true" name="medium_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+ <text valign="center" halign="center" bg_visible="true" name="medium_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+ <text valign="center" halign="center" bg_visible="true" name="medium_status" left_pad="0" width="65" height="18" follows="left|top" value=""/>
+ <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_medium" left_delta="20" top_delta="0" />
+
+ <text valign="center" halign="center" bg_visible="true" name="low_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="Low"/>
+ <text valign="center" halign="center" bg_visible="true" name="low_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+ <text valign="center" halign="center" bg_visible="true" name="low_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+ <text valign="center" halign="center" bg_visible="true" name="low_status" left_pad="0" width="65" height="18" follows="left|top" value=""/>
+ <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_low" left_delta="20" top_delta="0" />
+
+ <text valign="center" halign="center" bg_visible="true" name="lowest_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="Lowest"/>
+ <text valign="center" halign="center" bg_visible="true" name="lowest_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+ <text valign="center" halign="center" bg_visible="true" name="lowest_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+ <text valign="center" halign="center" bg_visible="true" name="lowest_status" left_pad="0" width="65" height="18" follows="left|top" value=""/>
+ <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_lowest" left_delta="20" top_delta="0" />
+
+ <text left="10" width="240" height="15" top_pad="15" follows="left|top" name="lod_table_footer">
+ Level of Detail: [DETAIL]
+ </text>
+
+ <icon height="16" width="16" left="20" follows="left|top" name="lod_status_message_icon"/>
+ <text left_pad="5" width="200" height="28" follows="left|top" top_pad="-15" wrap="true" name="lod_status_message_text"/>
+
+ <text top_pad="-3" left="10" height="15" follows="left|top">
+ Mesh
+ </text>
+
+ <radio_group follows="top|left" height="210" left="30" name="lod_file_or_limit" width="240" value="lod_from_file">
+ <radio_item bottom="195" label="Load from file" name="lod_from_file"/>
+ <radio_item bottom="150" label="Auto generate" name="lod_auto_generate"/>
+ <radio_item bottom="0" label="None" name="lod_none"/>
+ </radio_group>
+
+ <line_editor follows="left|top" bottom_delta="-170" width="140" left="45" value="" name="lod_file" height="20"/>
+ <button bottom_delta="3" name="lod_browse" label="Browse..." left_pad="5" follows="left|top" width="70" height="25"/>
+
+ <combo_box follows="top|left" name="lod_mode" top_pad="22" width="100" left="45" height="20">
+ <combo_item name="triangle_limit">
+ Triangle Limit
+ </combo_item>
+ <combo_item name="error_threshold">
+ Error Threshold
+ </combo_item>
+ </combo_box>
+ <spinner follows="top|left" name="lod_triangle_limit" increment="10" left_pad="5" height="20" width="100" decimal_digits="0" enabled="true"/>
+ <spinner left_delta="0" bottom_delta="0" increment="0.01" follows="top|left" name="lod_error_threshold" min_val="0" max_val="100" height="20" width="100" decimal_digits="3" visible="false" enabled="true"/>
+
+ <text follows="top|left" name="build_operator_text" left="45" top_pad="10" width="100" height="15">
+ Build Operator:
+ </text>
+ <text follows="top|left" name="queue_mode_text" left_pad="5" width="100" height="15">
+ Queue Mode:
+ </text>
+ <combo_box follows="top|left" name="build_operator" top_pad="5" left="45" width="100" height="20">
+ <combo_item name="edge_collapse">
+ Edge Collapse
+ </combo_item>
+ <combo_item name="half_edge_collapse">
+ Half Edge Collapse
+ </combo_item>
+ </combo_box>
+
+ <combo_box follows="top|left" name="queue_mode" left_pad="5" width="100" height="20">
+ <combo_item name="greedy">
+ Greedy
+ </combo_item>
+ <combo_item name="lazy">
+ Lazy
+ </combo_item>
+ <combo_item name="independent">
+ Independent
+ </combo_item>
+ </combo_box>
+
+ <text top_pad="10" name="border_mode_text" left="45" follows="left|top" width="100" height="15">
+ Border Mode:
+ </text>
+
+ <text left_pad="5" name="share_tolderance_text" follows="left|top" width="100" height="15">
+ Share Tolerance:
+ </text>
+
+ <combo_box follows="left|top" left="45" height="20" name="border_mode" width="100">
+ <combo_item name="border_unlock">
+ Unlock
+ </combo_item>
+ <combo_item name="border_lock">
+ Lock
+ </combo_item>
+ </combo_box>
+ <spinner follows="left|top" name="share_tolerance" left_pad="5" width="100" decimal_digits="5" initial_value="0.00001" height="20"/>
+
+ <text left="10" top_pad="35" follows="top|left" width="240" height="15">
+ Generate Normals
+ </text>
+ <text left="35" top_pad="5" follows="top|left" width="100" height="15" name="crease_label">
+ Crease Angle:
+ </text>
+ <spinner follows="top|left" left_pad="5" min_val="0" max_val="180" value="75" width="60" height="20" name="crease_angle"/>
+ </panel>
+
+ <!-- PANEL -->
+ <panel
+ border="true"
+ label="Physics"
+ name="physics_panel">
+
+ <!-- PHYSICS GEOMETRY-->
+ <panel
+ follows="top|left"
+ name="physics geometry"
+ left="0"
+ top="0"
+ width="300"
+ height="65"
+ visible="true"
+ border="true"
+ bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3">
+
+ <radio_group follows="top|left" top="10" width="240" height="40" name="physics_load_radio" value="physics_load_from_file">
+ <radio_item bottom="0" name="physics_load_from_file" label="File:"/>
+ <radio_item bottom="23" name="physics_use_lod" label="Use Level of Detail:"/>
+ </radio_group>
+
+ <combo_box left="180" top="10" follows="left|top" height="18"
+ name="physics_lod_combo" width="110" tool_tip="LOD to use for physics shape">
+ <combo_item name="physics_lowest">
+ Lowest
+ </combo_item>
+ <combo_item name="physics_low">
+ Low
+ </combo_item>
+ <combo_item name="physics_medium">
+ Medium
+ </combo_item>
+ <combo_item name="physics_high">
+ High
+ </combo_item>
+ </combo_box>
+
+ <line_editor follows="left|top" top_pad="5" width="140" left="60" value="" name="physics_file" height="20"/>
+ <button left_pad="10" name="physics_browse" label="Browse..." follows="left|top" width="70" height="20"/>
+
+ <!--
+ <check_box name="physics_optimize" follows="left|top" width="130" left="10" top_pad="5" height="20" label="Optimize"/>
+ <check_box name="physics_use_hull" follows="left|top" width="130" left_pad="5" height="20" label="Use Convex Hull"/>
+ -->
+ </panel>
+
+
+ <!-- PHYSICS ANALYSIS-->
+ <panel
+ follows="top|left"
+ name="physics analysis"
+ top_pad="0"
+ left="0"
+ width="300"
+ height="130"
+ visible="true"
+ border="true"
+ bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3">
+
+ <text follows="left|top" bottom="40" height="30" left="10" font="SansSerifBig">
+ Step 1: Analysis
+ </text>
+
+ <text top_pad="5" width="50" follows="top|left" height="15">
+ Method:
+ </text>
+ <combo_box name="Method" follows="top|left" left_pad="5" bottom_delta="2" height="20" width="80"/>
+ <text left="160" bottom_delta="-2" width="50" follows="top|left" height="15">
+ Quality:
+ </text>
+ <combo_box name="Decompose Quality" bottom_delta="2" follows="top|left" left_pad="5" height="20" width="80"/>
+
+ <slider name="Smooth" left="10" width="280" follows="top|left" top_pad="10" height="20" label="Smooth:"/>
+
+ <check_box name="Close Holes (Slow)" follows="top|left" top_pad="10" height="15" label="Close Holes (slow)"/>
+
+ <button left="200" bottom_delta="0" width="90" follows="top|left" label="Analyze" name="Decompose" height="20"/>
+ <button left="200" bottom_delta="0" width="90" follows="top|left" label="Cancel" name="decompose_cancel" visble="false" height="20"/>
+ </panel>
+
+
+ <!-- PHYSICS SIMPLIFICATION -->
+ <panel
+ follows="top|left"
+ name="physics simplification"
+ left="0"
+ top_pad="0"
+ width="300"
+ height="150"
+ visible="true"
+ border="true"
+ bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3">
+
+ <text follows="left|top" bottom="40" height="30" left="10" font="SansSerifBig">
+ Step 2: Simplification
+ </text>
+
+ <text left="10" top_pad="5" height="15" width="140" follows="top|left">
+ Method:
+ </text>
+
+ <combo_box left_pad="5" height="20" width="120" follows="top|left" name="Simplify Method"/>
+
+ <slider left="10" name="Combine Quality" label="Passes:" label_width="120" width="270" follows="top|left" top_pad="10" height="20"/>
+ <slider name="Detail Scale" label="Detail Scale:" label_width="120" width="270" follows="top|left" top_pad="10" height="20"/>
+ <slider name="Retain%" label="Retain:" label_width="120" width="270" follows="top|left" bottom_delta="0" left_delta="0" visible="false" height="20"/>
+ <button left="190" width="90" follows="top|left" label="Simplify" name="Simplify" height="20"/>
+ <button left="190" bottom_delta="0" width="90" follows="top|left" label="Cancel" name="simplify_cancel" height="20"/>
+
+ </panel>
+
+ <!-- INFO PANEL -->
+ <panel
+ left="0"
+ top_pad="0"
+ width="300"
+ height="100"
+ follows="left|top"
+ name="physics info"
+ visible="true"
+ border="true"
+ bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3">
+
+ <slider name="physics_explode" follows="top|left" top="10" left="10" label="Preview Spread:" min_val="0.0" max_val="3.0" height="20" width="280"/>
+
+ <text follows="top|left" name="physics_triangles" top_pad="10" height="15" left="10">
+ Triangles: [TRIANGLES]
+ </text>
+ <text follows="top|left" name="physics_points" top_pad="5" height="15">
+ Vertices: [POINTS]
+ </text>
+ <text follows="top|left" name="physics_hulls" top_pad="5" height="15">
+ Hulls: [HULLS]
+ </text>
+
+
+ </panel>
+ </panel>
+
+ <!-- MODIFIERS PANEL -->
+ <panel
+ border="true"
+ label="Modifiers"
+ name="modifiers_panel">
+ <text left="10" width="90" bottom="30" follows="top|left" height="15">
+ Scale:
+ </text>
+ <text left_pad="5" width="140" follows="top|left" height="15">
+ Dimensions:
+ </text>
+
+ <spinner left="10" height="20" follows="top|left" width="80" top_pad="5" value="1.0" min_val="0.01" max_val="64.0" name="import_scale"/>
+
+ <text left_pad="20" height="15" name="import_dimensions" follows="top|left">
+ [X] x [Y] x [Z] m
+ </text>
+
+ <text left="10" top_pad="20" follows="top|left" height="15">
+ Include:
+ </text>
+
+ <check_box top_pad="5" name="upload_textures" height="15" follows="top|left" label="Textures"/>
+ <check_box top_pad="5" name="upload_skin" height="15" follows="top|left" label="Skin weight"/>
+ <check_box top_pad="5" left="20" name="upload_joints" height="15" follows="top|left" label="Joint positions"/>
+
+ <text left="10" top_pad="4" width="90" bottom="30" follows="top|left" height="15">
+ Pelvis Z Offset:
+ </text>
+
+ <spinner left="10" top_pad="4" height="20" follows="top|left" width="80" value="0.0" min_val="-3.00" max_val="3.0" name="pelvis_offset"/>
+
+ </panel>
+ </tab_container>
+
+ <!--
+ <button bottom_delta="0" left="10" width="120" name="auto fill" label="Generate LOD" tool_tip="Automatically generate levels of detail"/>
+ <button bottom_delta="0" left="140" width="120" name="smooth normals" label="Generate Normals" tool_tip="Regenerate normals based on mesh shape"/>
+ <button bottom_delta="0" left="260" width="120" name="consolidate" label="Consolidate" tool_tip="Combine similar submeshes (reduces number of submeshes)"/>
+ <button bottom_delta="30" left="260" width="120" name="scrub materials" label="Scrub Materials" tool_tip="Remove all material information (clear textures, set all colors to white)."/>
+
+ <spinner bottom_delta="0" left="140" width="120" height="16" initial_value="75" label_width="60" name="edge threshold" decimal_digits="0" min_val="0" max_val="180" increment="5" label="Hard Angle" tool_tip="Maximum angle that will be smoothed between triangles when using Generate Normals"/>
+
+ <text bottom_delta="30" follows="top|left" height="15" left="10" name="high_lod_label">
+ High LOD:
+ </text>
+ <combo_box bottom_delta="0" left="97" follows="left|top" height="18"
+ name="high detail combo" width="100" tool_tip="Specify mesh for this level of detail">
+ <combo_item name="high none" value="none">
+ None
+ </combo_item>
+ <combo_item name="high choose file" value="file">
+ Choose File...
+ </combo_item>
+ <combo_item name="high triangle limit" value="limit">
+ Triangle Limit
+ </combo_item>
+ </combo_box>
+ <spinner bottom_delta="-5" left="200" width="120" name="high limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/>
+ <text bottom_delta="25" follows="top|left" height="15" left="10" name="high info" width="300">
+ [TRIANGLES] Triangles, [VERTICES] Vertices, [SUBMESHES] Submeshes.
+ [MESSAGE]
+ </text>
+
+ <text bottom_delta="35" follows="top|left" height="15" left="10" name="medium_lod_label">
+ Medium LOD:
+ </text>
+ <combo_box bottom_delta="0" left="97" follows="left|top" height="18"
+ name="medium detail combo" width="100" tool_tip="Specify mesh for this level of detail">
+ <combo_item name="medium none" value="none">
+ None
+ </combo_item>
+ <combo_item name="medium choose file" value="file">
+ Choose File...
+ </combo_item>
+ <combo_item name="medium triangle limit" value="limit">
+ Triangle Limit
+ </combo_item>
+ </combo_box>
+ <spinner bottom_delta="-5" left="200" width="120" name="medium limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/>
+ <text bottom_delta="25" follows="top|left" height="15" left="10" name="medium info" width="300">
+ [TRIANGLES] Triangles, [VERTICES] Vertices, [SUBMESHES] Submeshes.
+ [MESSAGE]
+ </text>
+
+ <text bottom_delta="35" follows="top|left" height="15" left="10" name="low_lod_label">
+ Low LOD:
+ </text>
+ <combo_box bottom_delta="0" left="97" follows="left|top" height="18"
+ name="low detail combo" width="100" tool_tip="Specify mesh for this level of detail">
+ <combo_item name="low none" value="none">
+ None
+ </combo_item>
+ <combo_item name="low choose file" value="file">
+ Choose File...
+ </combo_item>
+ <combo_item name="low triangle limit" value="limit">
+ Triangle Limit
+ </combo_item>
+ </combo_box>
+ <spinner bottom_delta="-5" left="200" width="120" name="low limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/>
+ <text bottom_delta="25" follows="top|left" height="15" left="10" name="low info" width="300">
+ [TRIANGLES] Triangles, [VERTICES] Vertices, [SUBMESHES] Submeshes
+ [MESSAGE]
+ </text>
+
+ <text bottom_delta="35" follows="top|left" height="15" left="10" name="lowest_lod_label">
+ Lowest LOD:
+ </text>
+ <combo_box bottom_delta="0" left="97" follows="left|top" height="18"
+ name="lowest detail combo" width="100" tool_tip="Specify mesh for this level of detail">
+ <combo_item name="lowest none" value="none">
+ None
+ </combo_item>
+ <combo_item name="lowest choose file" value="file">
+ Choose File...
+ </combo_item>
+ <combo_item name="lowest triangle limit" value="limit">
+ Triangle Limit
+ </combo_item>
+ </combo_box>
+ <spinner bottom_delta="-5" left="200" width="120" name="lowest limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/>
+ <text bottom_delta="25" follows="top|left" height="15" left="10" name="lowest info" width="300">
+ [TRIANGLES] Triangles, [VERTICES] Vertices, [SUBMESHES] Submeshes
+ [MESSAGE]
+ </text>
+
+ <text bottom_delta="35" follows="top|left" height="15" left="10" name="physics_lod_label">
+ Physical Shape:
+ </text>
+ <combo_box bottom_delta="0" left="97" follows="left|top" height="18"
+ name="physics detail combo" width="100">
+ <combo_item name="physics none" value="none">
+ None
+ </combo_item>
+ <combo_item name="physics choose file" value="file">
+ Choose File...
+ </combo_item>
+ <combo_item name="physics triangle limit" value="limit">
+ Triangle Limit...
+ </combo_item>
+ </combo_box>
+ <spinner bottom_delta="-5" left="200" width="90" name="physics limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/>
+ <button bottom_delta="0" left="290" width="30" follows="left|top" height="20" label=">>"
+ name="decompose_btn" tool_tip="Create convex decomposition."/>
+ <text bottom_delta="25" follows="top|left" height="15" left="10" name="physics info" width="300">
+ [TRIANGLES] Triangles, [HULLS] Hulls, [POINTS] Points
+ </text>
+
+ <text bottom_delta="25" follows="top|left" height="15" left="10" name="include label" width="300">
+ Include:
+ </text>
+
+ <check_box bottom_delta="20" follow="bottom|left" height="20" label="Textures"
+ left="15" width="125" name="upload_textures" tool_tip="Upload associated textures "/>
+
+ <check_box bottom_delta="20" follow="bottom|left" height="20" label="Skin Weights"
+ left="15" width="125" name="upload_skin" tool_tip="Upload vertex skin weighting information."/>
+
+ <check_box bottom_delta="20" follow="bottom|left" height="20" label="Joint Positions"
+ left="15" width="125" name="upload_joints" tool_tip="Upload joint position information (will override avatar joint positions when mesh is worn)."/>
+
+
+ <button bottom_delta="25" follows="bottom|left" height="20" label="Upload"
+ left="15" name="ok_btn" width="125" tool_tip="Upload to simulator"/>
+
+ <text bottom_delta="20" left="15" width="280" follows="top|left" height="15" name="description_label" text_color="1 0.82 0.46 1">
+ (No charge for upload during First Look)
+ </text>
+ <text bottom_delta="20" left="15" width="280" follows="top|left" height="15" name="upload_message">
+ [MESSAGE]
+ </text>
+
+ <spinner bottom_delta="20" label="Scale" left="15" width="120" name="debug scale" decimal_digits="3" increment="0.1" min_val="0" max_val="64" initial_value="1" tool_tip="Multiplier for incoming object scale. If incoming dimensions are very small or very large, modify this value to get dimensions into an acceptable range."/>
+ <text bottom_delta="30" left="15" width="280" follows="top|left" height="15" name="dimensions">
+ Model Dimensions: [X]m x [Y]m x [Z]m
+ </text>
+ -->
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_model_wizard.xml b/indra/newview/skins/default/xui/en/floater_model_wizard.xml index fa4c56ffec..6c0fffa60e 100644 --- a/indra/newview/skins/default/xui/en/floater_model_wizard.xml +++ b/indra/newview/skins/default/xui/en/floater_model_wizard.xml @@ -1,1038 +1,1039 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater - legacy_header_height="18" - layout="topleft" - name="Model Wizard" - help_topic="model_wizard" - bg_opaque_image_overlay="0.5 0.5 0.5 1" - height="480" - save_rect="true" - title="UPLOAD MODEL WIZARD" - width="535"> - <button - top="32" - tab_stop="false" - left="410" - height="32" - name="upload_btn" - enabled="false" - label="5. Upload" - border="false" - image_unselected="BreadCrumbBtn_Right_Off" - image_selected="BreadCrumbBtn_Right_Press" - image_hover_unselected="BreadCrumbBtn_Right_Over" - image_disabled="BreadCrumbBtn_Right_Disabled" - image_disabled_selected="BreadCrumbBtn_Right_Disabled" - width="110"> - <button.commit_callback - function="Wizard.Upload"/> - </button> - <button - top="32" - left="310" - height="32" - tab_stop="false" - name="review_btn" - label="4. Review" - enabled="false" - border="false" - image_unselected="BreadCrumbBtn_Middle_Off" - image_selected="BreadCrumbBtn_Middle_Press" - image_hover_unselected="BreadCrumbBtn_Middle_Over" - image_disabled="BreadCrumbBtn_Middle_Disabled" - image_disabled_selected="BreadCrumbBtn_Middle_Disabled" - width="110"> - <button.commit_callback - function="Wizard.Review"/> - </button> - <button - top="32" - left="210" - height="32" - name="physics2_btn" - label="3. Physics" - tab_stop="false" - enabled="false" - border="false" - image_unselected="BreadCrumbBtn_Middle_Off" - image_selected="BreadCrumbBtn_Middle_Press" - image_hover_unselected="BreadCrumbBtn_Middle_Over" - image_disabled="BreadCrumbBtn_Middle_Disabled" - image_disabled_selected="BreadCrumbBtn_Middle_Disabled" - width="110"> - <button.commit_callback - function="Wizard.Physics2"/> - </button> - <button - top="32" - left="210" - height="32" - name="physics_btn" - label="3. Physics" - tab_stop="false" - enabled="false" - border="false" - image_unselected="BreadCrumbBtn_Middle_Off" - image_selected="BreadCrumbBtn_Middle_Press" - image_hover_unselected="BreadCrumbBtn_Middle_Over" - image_disabled="BreadCrumbBtn_Middle_Disabled" - image_disabled_selected="BreadCrumbBtn_Middle_Disabled" - width="110"> - <button.commit_callback - function="Wizard.Physics"/> - </button> - <button - top="32" - left="115" - name="optimize_btn" - label="2. Optimize" - tab_stop="false" - height="32" - border="false" - image_unselected="BreadCrumbBtn_Middle_Off" - image_selected="BreadCrumbBtn_Middle_Press" - image_hover_unselected="BreadCrumbBtn_Middle_Over" - image_disabled="BreadCrumbBtn_Middle_Disabled" - image_disabled_selected="BreadCrumbBtn_Middle_Disabled" - width="110"> - <button.commit_callback - function="Wizard.Optimize"/> - </button> - <button - top="32" - left="15" - name="choose_file_btn" - tab_stop="false" - enabled="false" - label="1. Choose File" - height="32" - image_unselected="BreadCrumbBtn_Left_Off" - image_selected="BreadCrumbBtn_Left_Press" - image_hover_unselected="BreadCrumbBtn_Left_Over" - image_disabled="BreadCrumbBtn_Left_Disabled" - image_disabled_selected="BreadCrumbBtn_Left_Disabled" - width="110"> - <button.commit_callback - function="Wizard.Choose"/> - </button> - <panel - height="388" - top_pad="0" - name="choose_file_panel" - visible="false" - width="535" - left="0"> - <panel - height="22" - top_pad="15" - width="505" - name="header_panel" - bg_opaque_color="DkGray2" - background_visible="true" - background_opaque="true" - left="15"> - <text - width="200" - left="10" - top="3" - name="header_text" - text_color="White" - height="10" - font="SansSerifBig" - layout="topleft"> - Upload Model - </text> - </panel> - <text - top_pad="14" - width="460" - height="20" - name="description" - font="SansSerifSmall" - layout="topleft" - word_wrap="true" - left_delta="5"> - This wizard will help you import mesh models to Second Life. First specify a file containing the model you wish to import. Second Life supports COLLADA (.dae) files. - </text> - <panel - top_delta="40" - left="15" - height="270" - width="505" - name="content" - bg_opaque_color="DkGray2" - background_visible="true" - background_opaque="true"> - <text - type="string" - length="1" - text_color="White" - follows="left|top" - top="10" - height="10" - layout="topleft" - left_delta="10" - name="Cache location" - width="300"> - Filename: - </text> - <line_editor - border_style="line" - border_thickness="1" - follows="left|top" - font="SansSerifSmall" - height="20" - layout="topleft" - left_delta="0" - max_length="4096" - name="lod_file" - top_pad="5" - width="220" /> - <button - follows="left|top" - height="23" - label="Browse..." - label_selected="Browse..." - layout="topleft" - left_pad="5" - name="browse" - top_delta="-1" - width="85"> - </button> - <text - top_delta="-15" - width="200" - height="15" - font="SansSerifSmall" - layout="topleft" - text_color="White" - left_pad="19"> - Model Preview: - </text> - <!-- Placeholder panel for 3D preview render --> - <panel - left_delta="0" - top_pad="0" - name="preview_panel" - bevel_style="none" - highlight_light_color="0.09 0.09 0.09 1" - border="true" - height="150" - follows="all" - width="150"> - </panel> - <text - top_pad="10" - width="130" - height="14" - left="340" - text_color="White" - word_wrap="true"> - Dimensions (meters): - </text> - <text - top_pad="0" - width="160" - height="15" - font="SansSerifSmallBold" - text_color="White" - name="dimensions" - left_delta="0"> - X: Y: Z: - </text> - <text - top_delta="0" - width="160" - height="15" - name="dimension_dividers" - left_delta="41"> - | | - </text> - <text - top_delta="0" - width="160" - height="15" - name="dimension_x" - left="356"/> - <text - top_delta="0" - width="160" - height="15" - name="dimension_y" - left="403"/> - <text - top_delta="0" - width="160" - height="15" - name="dimension_z" - left="450"/> - <text - top="100" - width="320" - height="15" - left="10" - text_color="White" - word_wrap="true"> - Note: - </text> - <text - top_pad="0" - width="320" - height="40" - left="10" - word_wrap="true"> -Advanced users familiar with 3d content creation tools may prefer to use the [secondlife:///app/floater/upload_model Advanced Mesh Import Window] . - </text> - </panel> - </panel> - - - <panel - height="388" - top_delta="0" - name="optimize_panel" - visible="false" - width="535" - left="0"> - <panel - height="22" - top_pad="15" - name="header_panel" - width="505" - bg_opaque_color="DkGray2" - background_visible="true" - background_opaque="true" - left="15"> - <text - width="200" - left="10" - name="header_text" - top="3" - text_color="White" - height="10" - font="SansSerifBig" - layout="topleft"> - Optimize - </text> - </panel> - <text - top_pad="14" - width="460" - height="20" - font="SansSerifSmall" - layout="topleft" - name="description" - word_wrap="true" - left_delta="5"> - This wizard has optimized your model to improve performance. You may adjust the results of the optimization process bellow or click Next to continue. - </text> - <panel - top_delta="40" - visible="false" - left="15" - height="270" - width="505" - name="content" - bg_opaque_color="DkGray2" - background_visible="true" - background_opaque="true"> - <text - top="20" - width="300" - height="12" - font="SansSerifBold" - left="112">Generating Level of Detail</text> - <progress_bar - name="optimize_progress_bar" - image_fill="model_wizard\progress_light.png" - color_bg="1 1 1 1" - color_bar="1 1 1 0.96" - follows="left|right|top" - width="260" - height="16" - image_bar="model_wizard\progress_bar_bg.png" - top_pad="14" - left="110"/> - <icon - top_pad="10" - left_delta="0" - width="13" - height="12" - image_name="model_wizard\check_mark.png"/> - <text - top_delta="0" - left_delta="18" - name="high_detail_text" - width="200" - height="14">Generate Level of Detail: High</text> - <icon - top_pad="10" - left_delta="-18" - width="13" - height="12" - image_name="model_wizard\check_mark.png"/> - <text - top_delta="0" - left_delta="18" - name="medium_detail_text" - width="200" - height="14">Generate Level of Detail: Medium</text> - <icon - top_pad="10" - left_delta="-18" - width="13" - height="12" - image_name="model_wizard\check_mark.png"/> - <text - top_delta="0" - left_delta="18" - name="low_detail_text" - width="200" - height="14">Generate Level of Detail: Low</text> - <icon - top_pad="10" - left_delta="-18" - width="13" - height="12" - image_name="model_wizard\check_mark.png"/> - <text - top_delta="0" - left_delta="18" - name="lowest_detail_text" - width="200" - height="14">Generate Level of Detail: Lowest</text> - </panel> - <panel - top_delta="0" - left_delta="0" - height="270" - width="505" - name="content2" - bg_opaque_color="DkGray2" - background_visible="true" - background_opaque="true"> - <text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label"> - Model Preview: - </text> - <combo_box left_pad="5" top_delta="-5" follows="left|top" list_position="below" height="22" - name="preview_lod_combo2" width="90" tool_tip="LOD to view in preview render"> - <combo_item name="high"> - High - </combo_item> - <combo_item name="medium"> - Medium - </combo_item> - <combo_item name="low"> - Low - </combo_item> - <combo_item name="lowest"> - Lowest - </combo_item> - </combo_box> - <panel - left="10" - top_pad="5" - name="preview_panel" - bevel_style="none" - highlight_light_color="0.09 0.09 0.09 1" - border_style="line" - border="true" - height="185" - follows="all" - width="185"> - </panel> - <text top="45" left="214" text_color="White" font="SansSerifSmallBold" halign="center" width="110" height="30" wrap="true">Higher Performance</text> - <text top="75" left="204" halign="center" width="130" word_wrap="true" font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text> - <text top="45" left="378" text_color="White" font="SansSerifSmallBold" halign="center" width="90" height="30" wrap="true">Higher Accuracy</text> - <text top="75" left="364" halign="center" width="130" word_wrap="true" font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text> - - <slider - follows="left|top" - height="20" - increment="0.5" - layout="topleft" - left="204" - max_val="4" - initial_value="3" - min_val="2" - name="accuracy_slider" - show_text="false" - top="130" - width="290" /> - <text - font="SansSerifSmall" - top_pad="0" - width="300" - left_delta="6" - height="4">' ' '</text> - - - <icon - top_pad="14" - left_delta="0" - width="280" - height="2" - image_name="model_wizard\divider_line.png"/> - - <text top_delta="20" width="200" text_color="White" left_delta="50" name="streaming cost" height="20">Resource Cost: [COST]</text> - <text - top_pad="15" - width="130" - height="14" - left="10" - text_color="White" - word_wrap="true"> - Dimensions (meters): - </text> - <text - top_pad="0" - width="160" - height="15" - font="SansSerifSmallBold" - text_color="White" - name="dimensions" - left_delta="0"> - X: Y: Z: - </text> - <text - top_delta="0" - width="160" - height="15" - name="dimension_dividers" - left_delta="41"> - | | - </text> - <text - top_delta="0" - width="160" - height="15" - name="dimension_x" - left_delta="-25"/> - <text - top_delta="0" - width="160" - height="15" - name="dimension_y" - left_delta="46"/> - <text - top_delta="0" - width="160" - height="15" - name="dimension_z" - left_delta="46"/> - </panel> - </panel> - - <panel - height="388" - top_delta="0" - name="physics_panel" - visible="false" - width="535" - left="0"> - <panel - height="22" - top_pad="15" - name="header_panel" - width="505" - bg_opaque_color="DkGray2" - background_visible="true" - background_opaque="true" - left="15"> - <text - width="200" - left="10" - name="header_text" - top="3" - height="10" - font="SansSerifBig" - text_color="White" - layout="topleft"> - Physics - </text> - </panel> - <text - top_pad="10" - width="474" - height="50" - font="SansSerifSmall" - layout="topleft" - name="description" - word_wrap="true" - left_delta="5"> - The wizard will create a physical shape, which determines how the object interacts with other objects and avatars. Set the slider to the detail level most appropriate for how your object will be used: - </text> - <panel - top_delta="44" - left="15" - height="270" - width="505" - name="content" - bg_opaque_color="DkGray2" - background_visible="true" - background_opaque="true"> - <text top="15" left="20" text_color="White" font="SansSerifSmallBold" width="110" height="30" wrap="true" halign="center">Higher Performance</text> - <text top="45" left="10" halign="center" width="130" word_wrap="true" font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text> - <text top="15" left="372" text_color="White" font="SansSerifSmallBold" width="90" height="30" wrap="true" halign="center">Higher Accuracy</text> - <text top="45" left="360" halign="center" width="130" word_wrap="true" font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text> - - <slider - follows="left|top" - height="22" - increment=".1" - layout="topleft" - left="20" - max_val="1" - initial_value="0.5" - min_val="0" - name="physics_slider" - show_text="false" - top="90" - width="440" /> - <text - font="SansSerifSmall" - top_pad="0" - width="500" - left_delta="6" - height="4">' ' ' ' ' ' ' ' ' ' '</text> - <text top_pad="10" width="110" halign="center" word_wrap="true" left="25" height="40">Recommended for solid objects</text> - <text top_delta="0" width="110" halign="center" word_wrap="true" left="190" height="40">Recommended for buildings</text> - <text top_delta="0" width="110" halign="center" word_wrap="true" left="350" height="40">Recommended for vehicles</text> - - - <icon - top_pad="5" - left="15" - width="470" - height="2" - image_name="model_wizard\divider_line.png"/> - - <text top_delta="30" width="180" text_color="White" left="160" name="streaming cost" height="20">Resource Cost: [COST]</text> - - </panel> - </panel> - - <panel - height="388" - top_delta="0" - name="physics2_panel" - visible="true" - width="535" - left="0"> - <panel - height="22" - top_pad="15" - name="header_panel" - width="505" - bg_opaque_color="DkGray2" - background_visible="true" - background_opaque="true" - left="15"> - <text - width="200" - left="10" - name="header_text" - text_color="White" - top="3" - height="10" - font="SansSerifBig" - layout="topleft"> - Physics - </text> - </panel> - <text - top_pad="14" - width="475" - height="50" - font="SansSerifSmall" - layout="topleft" - name="description" - word_wrap="true" - left_delta="5"> - Preview the physics shape below then click Next to continue. To modify the physics shape, click the Back button. - </text> - <panel - top_delta="40" - left="15" - height="270" - width="505" - name="content" - bg_opaque_color="DkGray2" - background_visible="true" - background_opaque="true"> - <text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label"> - Model Preview: - </text> - <combo_box left_pad="5" top_delta="-5" follows="left|top" list_position="below" height="22" - name="preview_lod_combo3" width="90" tool_tip="LOD to view in preview render"> - <combo_item name="high"> - High - </combo_item> - <combo_item name="medium"> - Medium - </combo_item> - <combo_item name="low"> - Low - </combo_item> - <combo_item name="lowest"> - Lowest - </combo_item> - </combo_box> - <panel - left="10" - top_pad="10" - name="preview_panel" - bevel_style="none" - highlight_light_color="0.09 0.09 0.09 1" - border_style="line" - border="true" - height="190" - follows="all" - width="190"> - </panel> - <text - top_pad="8" - width="130" - height="14" - left="10" - text_color="White" - word_wrap="true"> - Dimensions (meters): - </text> - <text - top_pad="0" - width="160" - height="15" - font="SansSerifSmallBold" - text_color="White" - name="dimensions" - left_delta="0"> - X: Y: Z: - </text> - <text - top_delta="0" - width="160" - height="15" - name="dimension_dividers" - left_delta="41"> - | | - </text> - <text - top_delta="0" - width="160" - height="15" - name="dimension_x" - left_delta="-25"/> - <text - top_delta="0" - width="160" - height="15" - name="dimension_y" - left_delta="46"/> - <text - top_delta="0" - width="160" - height="15" - name="dimension_z" - left_delta="46"/> - <text top="60" width="180" text_color="White" left="225" name="streaming cost" height="20">Resource Cost: [COST]</text> - </panel> - </panel> - - <panel - height="388" - top_delta="0" - name="review_panel" - visible="false" - width="535" - left="0"> - <panel - height="22" - top_pad="15" - name="header_panel" - width="505" - bg_opaque_color="DkGray2" - background_visible="true" - background_opaque="true" - left="15"> - <text - width="200" - left="10" - name="header_text" - text_color="White" - top="3" - height="10" - font="SansSerifBig" - layout="topleft"> - Review - </text> - </panel> - <text - top_pad="14" - width="470" - height="24" - font="SansSerifSmall" - layout="topleft" - name="description" - word_wrap="true" - left_delta="5"> - Review the details below then click. Upload to upload your model. Your L$ balance will be charged when you click Upload. - </text> - <icon - top_pad="10" - left="20" - width="495" - height="2" - image_name="model_wizard\divider_line.png"/> - <panel - top_pad="5" - left="15" - height="270" - width="505" - name="content"> - <text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label"> - Model Preview: - </text> - <combo_box left_pad="5" top_delta="-5" follows="left|top" list_position="below" height="22" - name="preview_lod_combo" width="90" tool_tip="LOD to view in preview render"> - <combo_item name="high"> - High - </combo_item> - <combo_item name="medium"> - Medium - </combo_item> - <combo_item name="low"> - Low - </combo_item> - <combo_item name="lowest"> - Lowest - </combo_item> - </combo_box> - <panel - left="10" - top_pad="10" - name="preview_panel" - bevel_style="none" - highlight_light_color="0.09 0.09 0.09 1" - border_style="line" - border="true" - height="190" - follows="all" - width="190"> - </panel> - <text - top_pad="8" - width="130" - height="14" - left="10" - text_color="White" - word_wrap="true"> - Dimensions (meters): - </text> - <text - top_pad="0" - width="160" - height="15" - font="SansSerifSmallBold" - text_color="White" - name="dimensions" - left_delta="0"> - X: Y: Z: - </text> - <text - top_delta="0" - width="160" - height="15" - name="dimension_dividers" - left_delta="41"> - | | - </text> - <text - top_delta="0" - width="160" - height="15" - name="dimension_x" - left_delta="-25"/> - <text - top_delta="0" - width="160" - height="15" - name="dimension_y" - left_delta="46"/> - <text - top_delta="0" - width="160" - height="15" - name="dimension_z" - left_delta="46"/> - </panel> - <text - width="300" - height="12" - top="125" - name="streaming cost" - left="230" - font="SansSerifSmallBold" - text_color="White">Resource Cost: [COST]</text> - <text - width="285" - height="30" - top_pad="0" - left_delta="0" - word_wrap="true" - font="SansSerifItalic">This is the cost to your Region's prim/object limit, at default scale</text> - <text - width="300" - height="12" - name="physics cost" - top_pad="10" - left_delta="0" - font="SansSerifSmallBold" - text_color="White">Physics Cost: [COST]</text> - <text - width="285" - height="30" - top_pad="0" - left_delta="0" - word_wrap="true" - font="SansSerifItalic">This is the cost to your Region's prim/object limit, at default scale</text> - <text - width="200" - height="12" - top_pad="10" - left_delta="0" - font="SansSerifSmallBold" - text_color="White">Upload Fee:</text> - <text - width="285" - height="26" - top_pad="0" - left_delta="0" - word_wrap="true" - font="SansSerifItalic">This is the amount the upload will cost.</text> - <check_box - height="16" - layout="topleft" - left_delta="0" - name="confirm_checkbox" - top_pad="15" - width="16" /> - <text - height="100" - width="240" - word_wrap="true" - left_delta="25" - top_delta="0">I confirm that I have the appropriate rights to the material contained in this model. [secondlife:///app/floater/learn_more Learn more]</text> - </panel> - - - - - <panel - height="388" - top_delta="0" - name="upload_panel" - visible="false" - width="535" - left="0"> - <panel - height="22" - top_pad="15" - name="header_panel" - width="505" - bg_opaque_color="DkGray2" - background_visible="true" - background_opaque="true" - left="15"> - <text - width="200" - left="10" - name="header_text" - top="3" - text_color="White" - height="10" - font="SansSerifBig" - layout="topleft"> - Upload Complete! - </text> - </panel> - <text - top_pad="14" - width="474" - height="20" - font="SansSerifSmall" - layout="topleft" - name="description" - word_wrap="true" - left_delta="5"> - Congratulations! Your model has been sucessfully uploaded. You will find the model in the Objects folder in your inventory. - </text> - <icon - top_pad="15" - left_delta="0" - width="495" - height="2" - image_name="model_wizard\divider_line.png"/> - </panel> - - - - <button - top="440" - right="-245" - width="90" - height="22" - name="back" - label="<< Back" /> - <button - top_delta="0" - right="-150" - width="90" - height="22" - name="next" - label="Next >> " /> - <button - top_delta="0" - right="-150" - width="90" - height="22" - visible="false" - name="upload" - tool_tip="Upload to simulator" - label="Upload" /> - <button - top_delta="0" - right="-15" - width="90" - height="22" - name="cancel" - label="Cancel" /> - <button - top_delta="0" - right="-15" - width="90" - height="22" - name="close" - visible="false" - label="Close" /> - <spinner visible="false" left="10" height="20" follows="top|left" width="80" top_pad="-50" value="1.0" min_val="0.01" max_val="64.0" name="import_scale"/> - - <string name="status_idle">Idle</string> - <string name="status_reading_file">Loading...</string> - <string name="status_generating_meshes">Generating Meshes...</string> - <string name="status_vertex_number_overflow">Error: Vertex number is more than 65534, aborted!</string> - <string name="high">High</string> - <string name="medium">Medium</string> - <string name="low">Low</string> - <string name="lowest">Lowest</string> - <string name="mesh_status_good">Ship it!</string> - <string name="mesh_status_na">N/A</string> - <string name="mesh_status_none">None</string> - <string name="mesh_status_submesh_mismatch">Levels of detail have a different number of textureable faces.</string> - <string name="mesh_status_mesh_mismatch">Levels of detail have a different number of mesh instances.</string> - <string name="mesh_status_too_many_vertices">Level of detail has too many vertices.</string> - <string name="mesh_status_missing_lod">Missing required level of detail.</string> - <string name="layer_all">All</string> - <!-- Text to display in physics layer combo box for "all layers" --> - -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ layout="topleft"
+ name="Model Wizard"
+ help_topic="model_wizard"
+ bg_opaque_image_overlay="0.5 0.5 0.5 1"
+ height="480"
+ save_rect="true"
+ title="UPLOAD MODEL WIZARD"
+ width="535">
+ <button
+ top="32"
+ tab_stop="false"
+ left="410"
+ height="32"
+ name="upload_btn"
+ enabled="false"
+ label="5. Upload"
+ border="false"
+ image_unselected="BreadCrumbBtn_Right_Off"
+ image_selected="BreadCrumbBtn_Right_Press"
+ image_hover_unselected="BreadCrumbBtn_Right_Over"
+ image_disabled="BreadCrumbBtn_Right_Disabled"
+ image_disabled_selected="BreadCrumbBtn_Right_Disabled"
+ width="110">
+ <button.commit_callback
+ function="Wizard.Upload"/>
+ </button>
+ <button
+ top="32"
+ left="310"
+ height="32"
+ tab_stop="false"
+ name="review_btn"
+ label="4. Review"
+ enabled="false"
+ border="false"
+ image_unselected="BreadCrumbBtn_Middle_Off"
+ image_selected="BreadCrumbBtn_Middle_Press"
+ image_hover_unselected="BreadCrumbBtn_Middle_Over"
+ image_disabled="BreadCrumbBtn_Middle_Disabled"
+ image_disabled_selected="BreadCrumbBtn_Middle_Disabled"
+ width="110">
+ <button.commit_callback
+ function="Wizard.Review"/>
+ </button>
+ <button
+ top="32"
+ left="210"
+ height="32"
+ name="physics2_btn"
+ label="3. Physics"
+ tab_stop="false"
+ enabled="false"
+ border="false"
+ image_unselected="BreadCrumbBtn_Middle_Off"
+ image_selected="BreadCrumbBtn_Middle_Press"
+ image_hover_unselected="BreadCrumbBtn_Middle_Over"
+ image_disabled="BreadCrumbBtn_Middle_Disabled"
+ image_disabled_selected="BreadCrumbBtn_Middle_Disabled"
+ width="110">
+ <button.commit_callback
+ function="Wizard.Physics2"/>
+ </button>
+ <button
+ top="32"
+ left="210"
+ height="32"
+ name="physics_btn"
+ label="3. Physics"
+ tab_stop="false"
+ enabled="false"
+ border="false"
+ image_unselected="BreadCrumbBtn_Middle_Off"
+ image_selected="BreadCrumbBtn_Middle_Press"
+ image_hover_unselected="BreadCrumbBtn_Middle_Over"
+ image_disabled="BreadCrumbBtn_Middle_Disabled"
+ image_disabled_selected="BreadCrumbBtn_Middle_Disabled"
+ width="110">
+ <button.commit_callback
+ function="Wizard.Physics"/>
+ </button>
+ <button
+ top="32"
+ left="115"
+ name="optimize_btn"
+ label="2. Optimize"
+ tab_stop="false"
+ height="32"
+ border="false"
+ image_unselected="BreadCrumbBtn_Middle_Off"
+ image_selected="BreadCrumbBtn_Middle_Press"
+ image_hover_unselected="BreadCrumbBtn_Middle_Over"
+ image_disabled="BreadCrumbBtn_Middle_Disabled"
+ image_disabled_selected="BreadCrumbBtn_Middle_Disabled"
+ width="110">
+ <button.commit_callback
+ function="Wizard.Optimize"/>
+ </button>
+ <button
+ top="32"
+ left="15"
+ name="choose_file_btn"
+ tab_stop="false"
+ enabled="false"
+ label="1. Choose File"
+ height="32"
+ image_unselected="BreadCrumbBtn_Left_Off"
+ image_selected="BreadCrumbBtn_Left_Press"
+ image_hover_unselected="BreadCrumbBtn_Left_Over"
+ image_disabled="BreadCrumbBtn_Left_Disabled"
+ image_disabled_selected="BreadCrumbBtn_Left_Disabled"
+ width="110">
+ <button.commit_callback
+ function="Wizard.Choose"/>
+ </button>
+ <panel
+ height="388"
+ top_pad="0"
+ name="choose_file_panel"
+ visible="false"
+ width="535"
+ left="0">
+ <panel
+ height="22"
+ top_pad="15"
+ width="505"
+ name="header_panel"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ left="15">
+ <text
+ width="200"
+ left="10"
+ top="3"
+ name="header_text"
+ text_color="White"
+ height="10"
+ font="SansSerifBig"
+ layout="topleft">
+ Upload Model
+ </text>
+ </panel>
+ <text
+ top_pad="14"
+ width="460"
+ height="20"
+ name="description"
+ font="SansSerifSmall"
+ layout="topleft"
+ word_wrap="true"
+ left_delta="5">
+ This wizard will help you import mesh models to Second Life. First specify a file containing the model you wish to import. Second Life supports COLLADA (.dae) files.
+ </text>
+ <panel
+ top_delta="40"
+ left="15"
+ height="270"
+ width="505"
+ name="content"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true">
+ <text
+ type="string"
+ length="1"
+ text_color="White"
+ follows="left|top"
+ top="10"
+ height="10"
+ layout="topleft"
+ left_delta="10"
+ name="Cache location"
+ width="300">
+ Filename:
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|top"
+ font="SansSerifSmall"
+ height="20"
+ layout="topleft"
+ left_delta="0"
+ max_length="4096"
+ name="lod_file"
+ top_pad="5"
+ width="220" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Browse..."
+ label_selected="Browse..."
+ layout="topleft"
+ left_pad="5"
+ name="browse"
+ top_delta="-1"
+ width="85">
+ </button>
+ <text
+ top_delta="-15"
+ width="200"
+ height="15"
+ font="SansSerifSmall"
+ layout="topleft"
+ text_color="White"
+ left_pad="19">
+ Model Preview:
+ </text>
+ <!-- Placeholder panel for 3D preview render -->
+ <panel
+ left_delta="0"
+ top_pad="0"
+ name="preview_panel"
+ bevel_style="none"
+ highlight_light_color="0.09 0.09 0.09 1"
+ border="true"
+ height="150"
+ follows="all"
+ width="150">
+ </panel>
+ <text
+ top_pad="10"
+ width="130"
+ height="14"
+ left="340"
+ text_color="White"
+ word_wrap="true">
+ Dimensions (meters):
+ </text>
+ <text
+ top_pad="0"
+ width="160"
+ height="15"
+ font="SansSerifSmallBold"
+ text_color="White"
+ name="dimensions"
+ left_delta="0">
+ X: Y: Z:
+ </text>
+ <text
+ top_delta="0"
+ width="160"
+ height="15"
+ name="dimension_dividers"
+ left_delta="41">
+ | |
+ </text>
+ <text
+ top_delta="0"
+ width="160"
+ height="15"
+ name="dimension_x"
+ left="356"/>
+ <text
+ top_delta="0"
+ width="160"
+ height="15"
+ name="dimension_y"
+ left="403"/>
+ <text
+ top_delta="0"
+ width="160"
+ height="15"
+ name="dimension_z"
+ left="450"/>
+ <text
+ top="100"
+ width="320"
+ height="15"
+ left="10"
+ text_color="White"
+ word_wrap="true">
+ Note:
+ </text>
+ <text
+ top_pad="0"
+ width="320"
+ height="40"
+ left="10"
+ word_wrap="true">
+Advanced users familiar with 3d content creation tools may prefer to use the [secondlife:///app/floater/upload_model Advanced Mesh Import Window] .
+ </text>
+ </panel>
+ </panel>
+
+
+ <panel
+ height="388"
+ top_delta="0"
+ name="optimize_panel"
+ visible="false"
+ width="535"
+ left="0">
+ <panel
+ height="22"
+ top_pad="15"
+ name="header_panel"
+ width="505"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ left="15">
+ <text
+ width="200"
+ left="10"
+ name="header_text"
+ top="3"
+ text_color="White"
+ height="10"
+ font="SansSerifBig"
+ layout="topleft">
+ Optimize
+ </text>
+ </panel>
+ <text
+ top_pad="14"
+ width="460"
+ height="20"
+ font="SansSerifSmall"
+ layout="topleft"
+ name="description"
+ word_wrap="true"
+ left_delta="5">
+ This wizard has optimized your model to improve performance. You may adjust the results of the optimization process bellow or click Next to continue.
+ </text>
+ <panel
+ top_delta="40"
+ visible="false"
+ left="15"
+ height="270"
+ width="505"
+ name="content"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true">
+ <text
+ top="20"
+ width="300"
+ height="12"
+ font="SansSerifBold"
+ left="112">Generating Level of Detail</text>
+ <progress_bar
+ name="optimize_progress_bar"
+ image_fill="model_wizard\progress_light.png"
+ color_bg="1 1 1 1"
+ color_bar="1 1 1 0.96"
+ follows="left|right|top"
+ width="260"
+ height="16"
+ image_bar="model_wizard\progress_bar_bg.png"
+ top_pad="14"
+ left="110"/>
+ <icon
+ top_pad="10"
+ left_delta="0"
+ width="13"
+ height="12"
+ image_name="model_wizard\check_mark.png"/>
+ <text
+ top_delta="0"
+ left_delta="18"
+ name="high_detail_text"
+ width="200"
+ height="14">Generate Level of Detail: High</text>
+ <icon
+ top_pad="10"
+ left_delta="-18"
+ width="13"
+ height="12"
+ image_name="model_wizard\check_mark.png"/>
+ <text
+ top_delta="0"
+ left_delta="18"
+ name="medium_detail_text"
+ width="200"
+ height="14">Generate Level of Detail: Medium</text>
+ <icon
+ top_pad="10"
+ left_delta="-18"
+ width="13"
+ height="12"
+ image_name="model_wizard\check_mark.png"/>
+ <text
+ top_delta="0"
+ left_delta="18"
+ name="low_detail_text"
+ width="200"
+ height="14">Generate Level of Detail: Low</text>
+ <icon
+ top_pad="10"
+ left_delta="-18"
+ width="13"
+ height="12"
+ image_name="model_wizard\check_mark.png"/>
+ <text
+ top_delta="0"
+ left_delta="18"
+ name="lowest_detail_text"
+ width="200"
+ height="14">Generate Level of Detail: Lowest</text>
+ </panel>
+ <panel
+ top_delta="0"
+ left_delta="0"
+ height="270"
+ width="505"
+ name="content2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true">
+ <text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label">
+ Model Preview:
+ </text>
+ <combo_box left_pad="5" top_delta="-5" follows="left|top" list_position="below" height="22"
+ name="preview_lod_combo2" width="90" tool_tip="LOD to view in preview render">
+ <combo_item name="high">
+ High
+ </combo_item>
+ <combo_item name="medium">
+ Medium
+ </combo_item>
+ <combo_item name="low">
+ Low
+ </combo_item>
+ <combo_item name="lowest">
+ Lowest
+ </combo_item>
+ </combo_box>
+ <panel
+ left="10"
+ top_pad="5"
+ name="preview_panel"
+ bevel_style="none"
+ highlight_light_color="0.09 0.09 0.09 1"
+ border_style="line"
+ border="true"
+ height="185"
+ follows="all"
+ width="185">
+ </panel>
+ <text top="45" left="214" text_color="White" font="SansSerifSmallBold" halign="center" width="110" height="30" wrap="true">Higher Performance</text>
+ <text top="75" left="204" halign="center" width="130" word_wrap="true" font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text>
+ <text top="45" left="378" text_color="White" font="SansSerifSmallBold" halign="center" width="90" height="30" wrap="true">Higher Accuracy</text>
+ <text top="75" left="364" halign="center" width="130" word_wrap="true" font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text>
+
+ <slider
+ follows="left|top"
+ height="20"
+ increment="1"
+ layout="topleft"
+ left="204"
+ max_val="3"
+ initial_value="2"
+ min_val="0"
+ name="accuracy_slider"
+ show_text="false"
+ top="130"
+ width="290" />
+ <text
+ font="SansSerifSmall"
+ top_pad="0"
+ width="300"
+ left_delta="6"
+ height="4">'
+ </text>
+
+
+ <icon
+ top_pad="14"
+ left_delta="0"
+ width="280"
+ height="2"
+ image_name="model_wizard\divider_line.png"/>
+
+ <text top_delta="20" width="200" text_color="White" left_delta="50" name="streaming cost" height="20">Resource Cost: [COST]</text>
+ <text
+ top_pad="15"
+ width="130"
+ height="14"
+ left="10"
+ text_color="White"
+ word_wrap="true">
+ Dimensions (meters):
+ </text>
+ <text
+ top_pad="0"
+ width="160"
+ height="15"
+ font="SansSerifSmallBold"
+ text_color="White"
+ name="dimensions"
+ left_delta="0">
+ X: Y: Z:
+ </text>
+ <text
+ top_delta="0"
+ width="160"
+ height="15"
+ name="dimension_dividers"
+ left_delta="41">
+ | |
+ </text>
+ <text
+ top_delta="0"
+ width="160"
+ height="15"
+ name="dimension_x"
+ left_delta="-25"/>
+ <text
+ top_delta="0"
+ width="160"
+ height="15"
+ name="dimension_y"
+ left_delta="46"/>
+ <text
+ top_delta="0"
+ width="160"
+ height="15"
+ name="dimension_z"
+ left_delta="46"/>
+ </panel>
+ </panel>
+
+ <panel
+ height="388"
+ top_delta="0"
+ name="physics_panel"
+ visible="false"
+ width="535"
+ left="0">
+ <panel
+ height="22"
+ top_pad="15"
+ name="header_panel"
+ width="505"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ left="15">
+ <text
+ width="200"
+ left="10"
+ name="header_text"
+ top="3"
+ height="10"
+ font="SansSerifBig"
+ text_color="White"
+ layout="topleft">
+ Physics
+ </text>
+ </panel>
+ <text
+ top_pad="10"
+ width="474"
+ height="50"
+ font="SansSerifSmall"
+ layout="topleft"
+ name="description"
+ word_wrap="true"
+ left_delta="5">
+ The wizard will create a physical shape, which determines how the object interacts with other objects and avatars. Set the slider to the detail level most appropriate for how your object will be used:
+ </text>
+ <panel
+ top_delta="44"
+ left="15"
+ height="270"
+ width="505"
+ name="content"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true">
+ <text top="15" left="20" text_color="White" font="SansSerifSmallBold" width="110" height="30" wrap="true" halign="center">Higher Performance</text>
+ <text top="45" left="10" halign="center" width="130" word_wrap="true" font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text>
+ <text top="15" left="372" text_color="White" font="SansSerifSmallBold" width="90" height="30" wrap="true" halign="center">Higher Accuracy</text>
+ <text top="45" left="360" halign="center" width="130" word_wrap="true" font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text>
+
+ <slider
+ follows="left|top"
+ height="22"
+ increment=".1"
+ layout="topleft"
+ left="20"
+ max_val="1"
+ initial_value="0.5"
+ min_val="0"
+ name="physics_slider"
+ show_text="false"
+ top="90"
+ width="440" />
+ <text
+ font="SansSerifSmall"
+ top_pad="0"
+ width="500"
+ left_delta="6"
+ height="4">' ' ' ' ' ' ' ' ' ' '</text>
+ <text top_pad="10" width="110" halign="center" word_wrap="true" left="25" height="40">Recommended for solid objects</text>
+ <text top_delta="0" width="110" halign="center" word_wrap="true" left="190" height="40">Recommended for buildings</text>
+ <text top_delta="0" width="110" halign="center" word_wrap="true" left="350" height="40">Recommended for vehicles</text>
+
+
+ <icon
+ top_pad="5"
+ left="15"
+ width="470"
+ height="2"
+ image_name="model_wizard\divider_line.png"/>
+
+ <text top_delta="30" width="180" text_color="White" left="160" name="streaming cost" height="20">Resource Cost: [COST]</text>
+
+ </panel>
+ </panel>
+
+ <panel
+ height="388"
+ top_delta="0"
+ name="physics2_panel"
+ visible="true"
+ width="535"
+ left="0">
+ <panel
+ height="22"
+ top_pad="15"
+ name="header_panel"
+ width="505"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ left="15">
+ <text
+ width="200"
+ left="10"
+ name="header_text"
+ text_color="White"
+ top="3"
+ height="10"
+ font="SansSerifBig"
+ layout="topleft">
+ Physics
+ </text>
+ </panel>
+ <text
+ top_pad="14"
+ width="475"
+ height="50"
+ font="SansSerifSmall"
+ layout="topleft"
+ name="description"
+ word_wrap="true"
+ left_delta="5">
+ Preview the physics shape below then click Next to continue. To modify the physics shape, click the Back button.
+ </text>
+ <panel
+ top_delta="40"
+ left="15"
+ height="270"
+ width="505"
+ name="content"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true">
+ <text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label">
+ Model Preview:
+ </text>
+ <combo_box left_pad="5" top_delta="-5" follows="left|top" list_position="below" height="22"
+ name="preview_lod_combo3" width="90" tool_tip="LOD to view in preview render">
+ <combo_item name="high">
+ High
+ </combo_item>
+ <combo_item name="medium">
+ Medium
+ </combo_item>
+ <combo_item name="low">
+ Low
+ </combo_item>
+ <combo_item name="lowest">
+ Lowest
+ </combo_item>
+ </combo_box>
+ <panel
+ left="10"
+ top_pad="10"
+ name="preview_panel"
+ bevel_style="none"
+ highlight_light_color="0.09 0.09 0.09 1"
+ border_style="line"
+ border="true"
+ height="190"
+ follows="all"
+ width="190">
+ </panel>
+ <text
+ top_pad="8"
+ width="130"
+ height="14"
+ left="10"
+ text_color="White"
+ word_wrap="true">
+ Dimensions (meters):
+ </text>
+ <text
+ top_pad="0"
+ width="160"
+ height="15"
+ font="SansSerifSmallBold"
+ text_color="White"
+ name="dimensions"
+ left_delta="0">
+ X: Y: Z:
+ </text>
+ <text
+ top_delta="0"
+ width="160"
+ height="15"
+ name="dimension_dividers"
+ left_delta="41">
+ | |
+ </text>
+ <text
+ top_delta="0"
+ width="160"
+ height="15"
+ name="dimension_x"
+ left_delta="-25"/>
+ <text
+ top_delta="0"
+ width="160"
+ height="15"
+ name="dimension_y"
+ left_delta="46"/>
+ <text
+ top_delta="0"
+ width="160"
+ height="15"
+ name="dimension_z"
+ left_delta="46"/>
+ <text top="60" width="180" text_color="White" left="225" name="streaming cost" height="20">Resource Cost: [COST]</text>
+ </panel>
+ </panel>
+
+ <panel
+ height="388"
+ top_delta="0"
+ name="review_panel"
+ visible="false"
+ width="535"
+ left="0">
+ <panel
+ height="22"
+ top_pad="15"
+ name="header_panel"
+ width="505"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ left="15">
+ <text
+ width="200"
+ left="10"
+ name="header_text"
+ text_color="White"
+ top="3"
+ height="10"
+ font="SansSerifBig"
+ layout="topleft">
+ Review
+ </text>
+ </panel>
+ <text
+ top_pad="14"
+ width="470"
+ height="24"
+ font="SansSerifSmall"
+ layout="topleft"
+ name="description"
+ word_wrap="true"
+ left_delta="5">
+ Review the details below then click. Upload to upload your model. Your L$ balance will be charged when you click Upload.
+ </text>
+ <icon
+ top_pad="10"
+ left="20"
+ width="495"
+ height="2"
+ image_name="model_wizard\divider_line.png"/>
+ <panel
+ top_pad="5"
+ left="15"
+ height="270"
+ width="505"
+ name="content">
+ <text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label">
+ Model Preview:
+ </text>
+ <combo_box left_pad="5" top_delta="-5" follows="left|top" list_position="below" height="22"
+ name="preview_lod_combo" width="90" tool_tip="LOD to view in preview render">
+ <combo_item name="high">
+ High
+ </combo_item>
+ <combo_item name="medium">
+ Medium
+ </combo_item>
+ <combo_item name="low">
+ Low
+ </combo_item>
+ <combo_item name="lowest">
+ Lowest
+ </combo_item>
+ </combo_box>
+ <panel
+ left="10"
+ top_pad="10"
+ name="preview_panel"
+ bevel_style="none"
+ highlight_light_color="0.09 0.09 0.09 1"
+ border_style="line"
+ border="true"
+ height="190"
+ follows="all"
+ width="190">
+ </panel>
+ <text
+ top_pad="8"
+ width="130"
+ height="14"
+ left="10"
+ text_color="White"
+ word_wrap="true">
+ Dimensions (meters):
+ </text>
+ <text
+ top_pad="0"
+ width="160"
+ height="15"
+ font="SansSerifSmallBold"
+ text_color="White"
+ name="dimensions"
+ left_delta="0">
+ X: Y: Z:
+ </text>
+ <text
+ top_delta="0"
+ width="160"
+ height="15"
+ name="dimension_dividers"
+ left_delta="41">
+ | |
+ </text>
+ <text
+ top_delta="0"
+ width="160"
+ height="15"
+ name="dimension_x"
+ left_delta="-25"/>
+ <text
+ top_delta="0"
+ width="160"
+ height="15"
+ name="dimension_y"
+ left_delta="46"/>
+ <text
+ top_delta="0"
+ width="160"
+ height="15"
+ name="dimension_z"
+ left_delta="46"/>
+ </panel>
+ <text
+ width="300"
+ height="12"
+ top="125"
+ name="streaming cost"
+ left="230"
+ font="SansSerifSmallBold"
+ text_color="White">Resource Cost: [COST]</text>
+ <text
+ width="285"
+ height="30"
+ top_pad="0"
+ left_delta="0"
+ word_wrap="true"
+ font="SansSerifItalic">This is the cost to your Region's prim/object limit, at default scale</text>
+ <text
+ width="300"
+ height="12"
+ name="physics cost"
+ top_pad="10"
+ left_delta="0"
+ font="SansSerifSmallBold"
+ text_color="White">Physics Cost: [COST]</text>
+ <text
+ width="285"
+ height="30"
+ top_pad="0"
+ left_delta="0"
+ word_wrap="true"
+ font="SansSerifItalic">This is the cost to your Region's prim/object limit, at default scale</text>
+ <text
+ width="200"
+ height="12"
+ top_pad="10"
+ left_delta="0"
+ font="SansSerifSmallBold"
+ text_color="White">Upload Fee:</text>
+ <text
+ width="285"
+ height="26"
+ top_pad="0"
+ left_delta="0"
+ word_wrap="true"
+ font="SansSerifItalic">This is the amount the upload will cost.</text>
+ <check_box
+ height="16"
+ layout="topleft"
+ left_delta="0"
+ name="confirm_checkbox"
+ top_pad="15"
+ width="16" />
+ <text
+ height="100"
+ width="240"
+ word_wrap="true"
+ left_delta="25"
+ top_delta="0">I confirm that I have the appropriate rights to the material contained in this model. [secondlife:///app/floater/learn_more Learn more]</text>
+ </panel>
+
+
+
+
+ <panel
+ height="388"
+ top_delta="0"
+ name="upload_panel"
+ visible="false"
+ width="535"
+ left="0">
+ <panel
+ height="22"
+ top_pad="15"
+ name="header_panel"
+ width="505"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ left="15">
+ <text
+ width="200"
+ left="10"
+ name="header_text"
+ top="3"
+ text_color="White"
+ height="10"
+ font="SansSerifBig"
+ layout="topleft">
+ Upload Complete!
+ </text>
+ </panel>
+ <text
+ top_pad="14"
+ width="474"
+ height="20"
+ font="SansSerifSmall"
+ layout="topleft"
+ name="description"
+ word_wrap="true"
+ left_delta="5">
+ Congratulations! Your model has been sucessfully uploaded. You will find the model in the Objects folder in your inventory.
+ </text>
+ <icon
+ top_pad="15"
+ left_delta="0"
+ width="495"
+ height="2"
+ image_name="model_wizard\divider_line.png"/>
+ </panel>
+
+
+
+ <button
+ top="440"
+ right="-245"
+ width="90"
+ height="22"
+ name="back"
+ label="<< Back" />
+ <button
+ top_delta="0"
+ right="-150"
+ width="90"
+ height="22"
+ name="next"
+ label="Next >> " />
+ <button
+ top_delta="0"
+ right="-150"
+ width="90"
+ height="22"
+ visible="false"
+ name="upload"
+ tool_tip="Upload to simulator"
+ label="Upload" />
+ <button
+ top_delta="0"
+ right="-15"
+ width="90"
+ height="22"
+ name="cancel"
+ label="Cancel" />
+ <button
+ top_delta="0"
+ right="-15"
+ width="90"
+ height="22"
+ name="close"
+ visible="false"
+ label="Close" />
+ <spinner visible="false" left="10" height="20" follows="top|left" width="80" top_pad="-50" value="1.0" min_val="0.01" max_val="64.0" name="import_scale"/>
+
+ <string name="status_idle">Idle</string>
+ <string name="status_reading_file">Loading...</string>
+ <string name="status_generating_meshes">Generating Meshes...</string>
+ <string name="status_vertex_number_overflow">Error: Vertex number is more than 65534, aborted!</string>
+ <string name="high">High</string>
+ <string name="medium">Medium</string>
+ <string name="low">Low</string>
+ <string name="lowest">Lowest</string>
+ <string name="mesh_status_good">Ship it!</string>
+ <string name="mesh_status_na">N/A</string>
+ <string name="mesh_status_none">None</string>
+ <string name="mesh_status_submesh_mismatch">Levels of detail have a different number of textureable faces.</string>
+ <string name="mesh_status_mesh_mismatch">Levels of detail have a different number of mesh instances.</string>
+ <string name="mesh_status_too_many_vertices">Level of detail has too many vertices.</string>
+ <string name="mesh_status_missing_lod">Missing required level of detail.</string>
+ <string name="layer_all">All</string>
+ <!-- Text to display in physics layer combo box for "all layers" -->
+
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_postcard.xml b/indra/newview/skins/default/xui/en/floater_postcard.xml index b4ecedd981..8da35e9d7f 100644 --- a/indra/newview/skins/default/xui/en/floater_postcard.xml +++ b/indra/newview/skins/default/xui/en/floater_postcard.xml @@ -36,6 +36,7 @@ Recipient's Email: </text> <line_editor + control_name="LastPostcardRecipient" follows="left|top" height="20" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml index a17cf8eea8..9f6199fada 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml @@ -120,14 +120,14 @@ font.style="BOLD" name="key_label" top_pad="10" - width="150"> + width="130"> Shortcut Key: </text> <combo_box height="20" label="None" layout="topleft" - left_delta="154" + left_delta="135" name="modifier_combo" top_delta="-4" width="55" /> diff --git a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml index d1db5c17ba..ce96ea232e 100644 --- a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml +++ b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml @@ -20,5 +20,6 @@ parse_highlights="true" read_only="true" width="420" + track_bottom="true" word_wrap="true" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index 857932e51a..e413228ddc 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -11,7 +11,7 @@ save_rect="true" save_visibility="true" title="SNAPSHOT PREVIEW" - width="215"> + width="245"> <floater.string name="unknown"> unknown diff --git a/indra/newview/skins/default/xui/en/floater_sound_devices.xml b/indra/newview/skins/default/xui/en/floater_sound_devices.xml new file mode 100644 index 0000000000..304987c3d5 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_sound_devices.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater + border_visible="false" + border="false" + legacy_header_height="18" + can_minimize="true" + can_resize="false" + can_close="false" + save_dock_state="true" + save_visibility="true" + save_rect="true" + single_instance="true" + bevel_style="in" + height="164" + layout="topleft" + name="floater_sound_devices" + title="Sound Devices" + width="315"> + <panel + layout="topleft" + follows="all" + filename="panel_sound_devices.xml" + name="device_settings_panel" + width="400" + left="2" + top="26" + class="panel_voice_device_settings"/> + <text + name="voice_label" + top="136" + left="12" + height="14" + width="80" + layout="topleft" + >Voice Chat</text> + <check_box + layout="topleft" + control_name="EnableVoiceChat" + follows="bottom|left" + top="138" + left="80" + name="enable_voice" + width="100" + height="14" + label="Enabled" + /> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 501e93ead3..e342b441ac 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -1,3194 +1,3194 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater - legacy_header_height="18" - follows="left|top|right" - height="580" - layout="topleft" - bg_opaque_image="Window_NoTitle_Foreground" - bg_alpha_image="Window_NoTitle_Background" - name="toolbox floater" - help_topic="toolbox_floater" - save_rect="true" - short_title="BUILD TOOLS" - single_instance="true" - save_visibility="true" - sound_flags="0" - width="295"> - <floater.string - name="status_rotate"> - Drag colored bands to rotate object - </floater.string> - <floater.string - name="status_scale"> - Click and drag to stretch selected side - </floater.string> - <floater.string - name="status_move"> - Drag to move, shift-drag to copy - </floater.string> - <floater.string - name="status_modifyland"> - Click and hold to modify land - </floater.string> - <floater.string - name="status_camera"> - Click and drag to move camera - </floater.string> - <floater.string - name="status_grab"> - Drag to move, Ctrl to lift, Ctrl+Shift to rotate - </floater.string> - <floater.string - name="status_place"> - Click inworld to build - </floater.string> - <floater.string - name="status_selectland"> - Click and drag to select land - </floater.string> - <floater.string - name="grid_screen_text"> - Screen - </floater.string> - <floater.string - name="grid_local_text"> - Local - </floater.string> - <floater.string - name="grid_world_text"> - World - </floater.string> - <floater.string - name="grid_reference_text"> - Reference - </floater.string> - <floater.string - name="grid_attachment_text"> - Attachment - </floater.string> - <button - follows="left|top" - height="25" - image_bottom_pad="1" - image_overlay="Tool_Zoom" - image_selected="PushButton_Selected_Press" - layout="topleft" - left="10" - name="button focus" - tool_tip="Focus" - width="35"> - <button.commit_callback - function="BuildTool.setTool" - parameter="Focus" /> - </button> - <button - follows="left|top" - height="25" - image_bottom_pad="1" - image_overlay="Tool_Grab" - image_selected="PushButton_Selected_Press" - layout="topleft" - left_pad="10" - name="button move" - tool_tip="Move" - width="35"> - <button.commit_callback - function="BuildTool.setTool" - parameter="Move" /> - </button> - <button - follows="left|top" - height="25" - image_bottom_pad="1" - image_overlay="Tool_Face" - image_selected="PushButton_Selected_Press" - layout="topleft" - left_pad="10" - name="button edit" - tool_tip="Edit" - width="35"> - <button.commit_callback - function="BuildTool.setTool" - parameter="Edit" /> - </button> - <button - follows="left|top" - height="25" - image_bottom_pad="1" - image_overlay="Tool_Create" - image_selected="PushButton_Selected_Press" - layout="topleft" - left_pad="10" - name="button create" - tool_tip="Create" - width="35"> - <button.commit_callback - function="BuildTool.setTool" - parameter="Create" /> - </button> - <button - follows="left|top" - height="25" - image_bottom_pad="1" - image_overlay="Tool_Dozer" - image_selected="PushButton_Selected_Press" - layout="topleft" - left_pad="10" - name="button land" - tool_tip="Land" - width="35"> - <button.commit_callback - function="BuildTool.setTool" - parameter="Land" /> - </button> - <text - height="30" - word_wrap="true" - use_ellipses="true" - type="string" - text_color="LabelSelectedDisabledColor" - length="1" - follows="left|top" - layout="topleft" - left="8" - name="text status" - top_pad="3" - width="285"> - Drag to move, shift-drag to copy - </text> - <radio_group - layout="topleft" - left="10" - height="70" - top="59" - name="focus_radio_group"> - <radio_item - top_pad="6" - label="Zoom" - layout="topleft" - name="radio zoom" /> - <radio_item - top_pad="6" - label="Orbit (Ctrl)" - layout="topleft" - name="radio orbit" /> - <radio_item - top_pad="6" - label="Pan (Ctrl+Shift)" - layout="topleft" - name="radio pan" /> - <radio_group.commit_callback - function="BuildTool.commitRadioFocus"/> - </radio_group> - <slider_bar - follows="left|top" - height="14" - increment="0.01" - initial_value="0.125" - layout="topleft" - max_val="0.5" - top_delta="-2" - left_delta="100" - name="slider zoom" - width="134"> - <slider_bar.commit_callback - function="BuildTool.commitZoom"/> - </slider_bar> - <radio_group - left="10" - height="70" - top="59" - layout="topleft" - name="move_radio_group"> - <radio_item - top_pad="6" - label="Move" - layout="topleft" - name="radio move" /> - <radio_item - top_pad="6" - label="Lift (Ctrl)" - layout="topleft" - name="radio lift" /> - <radio_item - top_pad="6" - label="Spin (Ctrl+Shift)" - layout="topleft" - name="radio spin" /> - <radio_group.commit_callback - function="BuildTool.commitRadioMove"/> - </radio_group> - <radio_group - follows="left|top" - left="5" - top="59" - height="70" - layout="topleft" - name="edit_radio_group"> - <radio_item - label="Move" - layout="topleft" - name="radio position" /> - <radio_item - top_pad="6" - label="Rotate (Ctrl)" - layout="topleft" - name="radio rotate" /> - <radio_item - top_pad="6" - label="Stretch (Ctrl+Shift)" - layout="topleft" - name="radio stretch" /> - <radio_item - top_pad="6" - label="Select Face" - layout="topleft" - name="radio select face" /> - <radio_group.commit_callback - function="BuildTool.commitRadioEdit"/> - </radio_group> - <check_box - left="5" - follows="left|top" - height="28" - control_name="EditLinkedParts" - label="Edit linked" - layout="topleft" - name="checkbox edit linked parts" - top_pad="-10"> - <check_box.commit_callback - function="BuildTool.selectComponent"/> - </check_box> - - <button - follows="left|top" - height="23" - label="Link" - top_pad="2" - layout="topleft" - left="5" - name="link_btn" - width="50"> - <button.commit_callback - function="BuildTool.LinkObjects"/> - </button> - <button - follows="left|top" - height="23" - label="Unlink" - layout="topleft" - left_pad="2" - name="unlink_btn" - width="50"> - <button.commit_callback - function="BuildTool.UnlinkObjects"/> - </button> - <text - text_color="LtGray_50" - follows="top|left" - halign="left" - left_pad="3" - name="RenderingCost" - tool_tip="Shows the rendering cost calculated for this object" - top_delta="11" - type="string" - width="100"> - þ: [COUNT] - </text> - <check_box - control_name="ScaleUniform" - height="19" - label="" - layout="topleft" - left="143" - name="checkbox uniform" - top="50" - width="20" /> - <text - height="19" - label="Stretch Both Sides" - left_delta="20" - name="checkbox uniform label" - top_delta="2" - width="120" - layout="topleft" - follows="top|left" - wrap="true"> - Stretch Both Sides - </text> - <check_box - control_name="ScaleStretchTextures" - height="19" - initial_value="true" - label="Stretch Textures" - layout="topleft" - left="143" - name="checkbox stretch textures" - top_pad="-6" - follows="left|top" - width="134" /> - <check_box - control_name="SnapEnabled" - height="18" - initial_value="true" - label="Snap to grid" - layout="topleft" - top_pad="0" - name="checkbox snap to grid" - width="134" /> - <combo_box - height="23" - layout="topleft" - follows="left|top" - name="combobox grid mode" - tool_tip="Choose the type of grid ruler for positioning the object" - top_pad="0" - width="108"> - <combo_box.item - label="World grid" - name="World" - value="World" /> - <combo_box.item - label="Local grid" - name="Local" - value="Local" /> - <combo_box.item - label="Reference grid" - name="Reference" - value="Reference" /> - <combo_box.commit_callback - function="BuildTool.gridMode"/> - </combo_box> - <button - left_pad="0" - image_selected="ForwardArrow_Press" - image_unselected="ForwardArrow_Off" - layout="topleft" - follows="top|left" - name="Options..." - tool_tip="See more grid options" - top_pad="-22" - right="-10" - width="18" - height="23" > - <button.commit_callback - function="BuildTool.gridOptions"/> - </button> - <button - follows="left|top" - height="20" - image_disabled="Object_Cube" - image_disabled_selected="Object_Cube" - image_selected="Object_Cube_Selected" - image_unselected="Object_Cube" - layout="topleft" - left="10" - name="ToolCube" - tool_tip="Cube" - top="51" - width="20" /> - <button - follows="left|top" - height="20" - image_disabled="Object_Prism" - image_disabled_selected="Object_Prism" - image_selected="Object_Prism_Selected" - image_unselected="Object_Prism" - layout="topleft" - left_delta="29" - name="ToolPrism" - tool_tip="Prism" - top_delta="0" - width="20" /> - <button - follows="left|top" - height="20" - image_disabled="Object_Pyramid" - image_disabled_selected="Object_Pyramid" - image_selected="Object_Pyramid_Selected" - image_unselected="Object_Pyramid" - layout="topleft" - left_delta="29" - name="ToolPyramid" - tool_tip="Pyramid" - top_delta="0" - width="20" /> - <button - follows="left|top" - height="20" - image_disabled="Object_Tetrahedron" - image_disabled_selected="Object_Tetrahedron" - image_selected="Object_Tetrahedron_Selected" - image_unselected="Object_Tetrahedron" - layout="topleft" - left_delta="29" - name="ToolTetrahedron" - tool_tip="Tetrahedron" - top_delta="0" - width="20" /> - <button - follows="left|top" - height="20" - image_disabled="Object_Cylinder" - image_disabled_selected="Object_Cylinder" - image_selected="Object_Cylinder_Selected" - image_unselected="Object_Cylinder" - layout="topleft" - left_delta="29" - name="ToolCylinder" - tool_tip="Cylinder" - top_delta="0" - width="20" /> - <button - follows="left|top" - height="20" - image_disabled="Object_Hemi_Cylinder" - image_disabled_selected="Object_Hemi_Cylinder" - image_selected="Object_Hemi_Cylinder_Selected" - image_unselected="Object_Hemi_Cylinder" - layout="topleft" - left_delta="29" - name="ToolHemiCylinder" - tool_tip="Hemicylinder" - top_delta="0" - width="20" /> - <button - follows="left|top" - height="20" - image_disabled="Object_Cone" - image_disabled_selected="Object_Cone" - image_selected="Object_Cone_Selected" - image_unselected="Object_Cone" - layout="topleft" - left_delta="29" - name="ToolCone" - tool_tip="Cone" - top_delta="0" - width="20" /> - <button - follows="left|top" - height="20" - image_disabled="Object_Hemi_Cone" - image_disabled_selected="Object_Hemi_Cone" - image_selected="Object_Hemi_Cone_Selected" - image_unselected="Object_Hemi_Cone" - layout="topleft" - left_delta="29" - name="ToolHemiCone" - tool_tip="Hemicone" - top_delta="0" - width="20" /> - <button - follows="left|top" - height="20" - image_disabled="Object_Sphere" - image_disabled_selected="Object_Sphere" - image_selected="Object_Sphere_Selected" - image_unselected="Object_Sphere" - layout="topleft" - left_delta="29" - name="ToolSphere" - tool_tip="Sphere" - top_delta="0" - width="20" /> - <button - follows="left|top" - height="20" - image_disabled="Object_Hemi_Sphere" - image_disabled_selected="Object_Hemi_Sphere" - image_selected="Object_Hemi_Sphere_Selected" - image_unselected="Object_Hemi_Sphere" - layout="topleft" - left_delta="29" - name="ToolHemiSphere" - tool_tip="Hemisphere" - top_delta="0" - width="20" /> - <button - follows="left|top" - height="20" - image_disabled="Object_Torus" - image_disabled_selected="Object_Torus" - image_selected="Object_Torus_Selected" - image_unselected="Object_Torus" - layout="topleft" - left="10" - name="ToolTorus" - tool_tip="Torus" - top="77" - width="20" /> - <button - follows="left|top" - height="20" - image_disabled="Object_Tube" - image_disabled_selected="Object_Tube" - image_selected="Object_Tube_Selected" - image_unselected="Object_Tube" - layout="topleft" - left_delta="29" - name="ToolTube" - tool_tip="Tube" - top_delta="0" - width="20" /> - <button - follows="left|top" - height="20" - image_disabled="Object_Ring" - image_disabled_selected="Object_Ring" - image_selected="Object_Ring_Selected" - image_unselected="Object_Ring" - layout="topleft" - left_delta="29" - name="ToolRing" - tool_tip="Ring" - top_delta="0" - width="20" /> - <button - follows="left|top" - height="20" - image_disabled="Object_Tree" - image_disabled_selected="Object_Tree" - image_selected="Object_Tree_Selected" - image_unselected="Object_Tree" - layout="topleft" - left_delta="29" - name="ToolTree" - tool_tip="Tree" - top_delta="0" - width="20" /> - <button - follows="left|top" - height="20" - image_disabled="Object_Grass" - image_disabled_selected="Object_Grass" - image_selected="Object_Grass_Selected" - image_unselected="Object_Grass" - image_overlay_color="Red" - layout="topleft" - left_delta="29" - name="ToolGrass" - tool_tip="Grass" - top_delta="0" - width="20" /> - <check_box - control_name="CreateToolKeepSelected" - height="19" - label="Keep Tool selected" - layout="topleft" - left="4" - name="checkbox sticky" - top="101" - width="128" /> - <check_box - control_name="CreateToolCopySelection" - height="19" - label="Copy selection" - layout="topleft" - left_delta="0" - name="checkbox copy selection" - top_delta="15" - width="134" /> - <check_box - control_name="CreateToolCopyCenters" - height="19" - initial_value="true" - label="Center Copy" - layout="topleft" - left_delta="18" - name="checkbox copy centers" - top="132" - width="134" /> - <check_box - control_name="CreateToolCopyRotates" - height="19" - label="Rotate Copy" - layout="topleft" - left_delta="0" - name="checkbox copy rotates" - top_delta="16" - width="134" /> - <radio_group - height="105" - layout="topleft" - left="4" - name="land_radio_group" - top="54" - width="114"> - <radio_item - height="19" - label="Select Land" - layout="topleft" - left="0" - name="radio select land" - top="-106" - width="134" /> - <radio_item - height="19" - label="Flatten" - layout="topleft" - left_delta="0" - name="radio flatten" - top_delta="15" - width="114" /> - <radio_item - height="19" - label="Raise" - layout="topleft" - left_delta="0" - name="radio raise" - top_delta="15" - width="114" /> - <radio_item - height="19" - label="Lower" - layout="topleft" - left_delta="0" - name="radio lower" - top_delta="15" - width="114" /> - <radio_item - height="19" - label="Smooth" - layout="topleft" - left_delta="0" - name="radio smooth" - top_delta="15" - width="114" /> - <radio_item - height="19" - label="Roughen" - layout="topleft" - left_delta="0" - name="radio noise" - top_delta="15" - width="114" /> - <radio_item - height="19" - label="Revert" - layout="topleft" - left_delta="0" - name="radio revert" - top_delta="15" - width="114" /> - <radio_group.commit_callback - function="BuildTool.commitRadioLand"/> - </radio_group> - <text - type="string" - length="1" - follows="left|top" - height="12" - layout="topleft" - left="135" - name="Bulldozer:" - top="57" - width="100"> - Bulldozer: - </text> - <text - type="string" - length="1" - follows="left|top" - height="12" - layout="topleft" - name="Dozer Size:" - left="135" - top_pad="5" - width="50"> - Size - </text> - <slider_bar - control_name ="LandBrushSize" - follows="left|top" - height="19" - initial_value="2.0" - layout="topleft" - max_val="11" - min_val="1" - left_pad="0" - name="slider brush size" - top_delta="-3" - width="80" /> - <text - type="string" - length="1" - follows="left|top" - height="12" - layout="topleft" - name="Strength:" - left="135" - top_pad="5" - width="50"> - Strength - </text> - <slider_bar - follows="left|top" - height="19" - left_pad="0" - initial_value="0.00" - layout="topleft" - max_val="2" - min_val="-1" - name="slider force" - top_delta="-3" - width="80" > - <slider_bar.commit_callback - function="BuildTool.LandBrushForce"/> - </slider_bar> - <button - follows="left|top" - height="23" - label="Apply" - label_selected="Apply" - top_pad="5" - layout="topleft" - left="135" - name="button apply to selection" - tool_tip="Modify selected land" - width="82"> - <button.commit_callback - function="BuildTool.applyToSelection"/> - </button> - <text - text_color="LtGray_50" - type="string" - length="1" - height="10" - follows="left|top" - halign="right" - layout="topleft" - right="-10" - name="obj_count" - top_pad="5" - width="143"> - Objects: [COUNT] - </text> - <text - text_color="LtGray_50" - type="string" - length="1" - height="10" - follows="left|top" - halign="right" - layout="topleft" - right="-10" - name="prim_count" - width="143"> - Prims: [COUNT] - </text> - <text - text_color="LtGray_50" - type="string" - length="1" - height="10" - follows="left|top" - halign="right" - layout="topleft" - right="-120" - name="linked_set_count" - top="144" - width="80"> - Linked Sets: [COUNT] - </text> - <text - text_color="LtGray_50" - type="string" - length="1" - height="10" - follows="left|top" - halign="right" - layout="topleft" - top_delta="0" - right="-8" - name="linked_set_cost" - tool_tip="Cost of currently selected linked sets as [prims],[physics complexity]" - width="80"> - Cost: [COST] / [PHYSICS] - </text> - <text - text_color="LtGray_50" - type="string" - length="1" - follows="left|top" - halign="right" - layout="topleft" - top_pad="5" - right="-120" - name="object_count" - width="80"> - Objects: [COUNT] - </text> - <text - text_color="LtGray_50" - type="string" - length="1" - follows="left|top" - halign="right" - layout="topleft" - top_delta="0" - right="-8" - name="object_cost" - tool_tip="Cost of currently selected objects as [prims] / [physics complexity]" - width="80"> - Cost: [COST] / [PHYSICS] - </text> - <!-- <text --> - <!-- text_color="LtGray_50" --> - <!-- type="string" --> - <!-- length="1" --> - <!-- height="10" --> - <!-- follows="left|top" --> - <!-- halign="right" --> - <!-- layout="topleft" --> - <!-- right="-10" --> - <!-- name="obj_count" --> - <!-- top_pad="5" --> - <!-- width="143"> --> - <!-- Objects: [COUNT] --> - <!-- </text> --> - <!-- <text --> - <!-- text_color="LtGray_50" --> - <!-- type="string" --> - <!-- length="1" --> - <!-- follows="left|top" --> - <!-- halign="right" --> - <!-- layout="topleft" --> - <!-- right="-10" --> - <!-- name="prim_count" --> - <!-- width="143"> --> - <!-- Prims: [COUNT] --> - <!-- </text> --> - <tab_container - follows="left|top" - height="410" - halign="center" - left="0" - name="Object Info Tabs" - tab_max_width="100" - tab_min_width="40" - tab_position="top" - tab_height="25" - top="173" - width="295"> - -<panel - border="false" - follows="all" - label="General" - layout="topleft" - mouse_opaque="false" - help_topic="toolbox_general_tab" - name="General" - top="16" - width="295"> - <panel.string - name="text deed continued"> - Deed - </panel.string> - <panel.string - name="text deed"> - Deed - </panel.string> - <panel.string - name="text modify info 1"> - You can modify this object - </panel.string> - <panel.string - name="text modify info 2"> - You can modify these objects - </panel.string> - <panel.string - name="text modify info 3"> - You can't modify this object - </panel.string> - <panel.string - name="text modify info 4"> - You can't modify these objects - </panel.string> - <panel.string - name="text modify warning"> - You must select entire object to set permissions - </panel.string> - <panel.string - name="Cost Default"> - Price: L$ - </panel.string> - <panel.string - name="Cost Total"> - Total Price: L$ - </panel.string> - <panel.string - name="Cost Per Unit"> - Price Per: L$ - </panel.string> - <panel.string - name="Cost Mixed"> - Mixed Price - </panel.string> - <panel.string - name="Sale Mixed"> - Mixed Sale - </panel.string> - <text - follows="left|top" - height="10" - left="10" - name="Name:" - top="5" - width="90"> - Name: - </text> - <line_editor - follows="left|top|right" - height="19" - left_pad="0" - max_length_bytes="63" - name="Object Name" - select_on_focus="true" - top_delta="0" - width="170" /> - <text - follows="left|top" - height="10" - left="10" - name="Description:" - top_pad="3" - width="90"> - Description: - </text> - <line_editor - follows="left|top|right" - height="19" - left_pad="0" - max_length_bytes="127" - name="Object Description" - select_on_focus="true" - top_delta="0" - width="170" /> - <text - type="string" - left="10" - length="1" - follows="left|top" - height="19" - layout="topleft" - name="Creator:" - top_pad="7" - width="90"> - Creator: - </text> - <!-- *NOTE: Intentionally wide for long names --> - <text - type="string" - length="1" - follows="left|top" - left_pad="0" - height="20" - layout="topleft" - name="Creator Name" - top_delta="0" - translate="false" - width="190" - word_wrap="true" - use_ellipses="true"> - TestString PleaseIgnore (please.ignore) - </text> - <text - type="string" - length="1" - left="10" - follows="left|top" - height="19" - layout="topleft" - name="Owner:" - top_pad="13" - width="90"> - Owner: - </text> - <!-- *NOTE: Intentionally wide for long names --> - <text - type="string" - length="1" - follows="left|top" - height="20" - layout="topleft" - name="Owner Name" - left_pad="0" - top_delta="0" - translate="false" - width="190" - word_wrap="true" - use_ellipses="true"> - TestString PleaseIgnore (please.ignore) - </text> - <text - type="string" - length="1" - follows="left|top" - layout="topleft" - left="10" - height="18" - name="Group:" - top_pad="17" - width="75"> - Group: - </text> - <name_box - follows="left|top" - height="18" - initial_value="Loading..." - layout="topleft" - left_pad="23" - name="Group Name Proxy" - width="142" /> - <button - follows="top|left" - height="23" - image_overlay="Edit_Wrench" - layout="topleft" - left_pad="13" - name="button set group" - tab_stop="false" - tool_tip="Choose a group to share this object's permissions" - width="23" /> - <check_box - height="19" - follows="left|top" - label="Share" - layout="topleft" - name="checkbox share with group" - tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions." - top_pad="10" - left="100" - width="87" /> - <button - follows="top|left" - height="23" - label="Deed" - label_selected="Deed" - layout="topleft" - name="button deed" - left_pad="19" - tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer." - width="80" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - top_pad="10" - left="10" - name="label click action" - width="118"> - Click to: - </text> - <combo_box - follows="left|top" - height="23" - layout="topleft" - name="clickaction" - width="148" - left_pad="10"> - <combo_box.item - label="Touch (default)" - name="Touch/grab(default)" - value="Touch" /> - <combo_box.item - label="Sit on object" - name="Sitonobject" - value="Sit" /> - <combo_box.item - label="Buy object" - name="Buyobject" - value="Buy" /> - <combo_box.item - label="Pay object" - name="Payobject" - value="Pay" /> - <combo_box.item - label="Open" - name="Open" - value="Open" /> - <combo_box.item - label="Zoom" - name="Zoom" - value="Zoom" /> - </combo_box> - <check_box - height="23" - label="For Sale:" - layout="topleft" - name="checkbox for sale" - left="7" - width="100" /> -<!-- NEW SALE TYPE COMBO BOX --> - <combo_box - left_pad="10" - layout="topleft" - follows="left|top" - allow_text_entry="false" - height="23" - initial_value="2" - max_chars="20" - mouse_opaque="true" - name="sale type" - width="168"> - <combo_box.item - name="Copy" - label="Copy" - value="2" /> - <combo_box.item - name="Contents" - label="Contents" - value="3" /> - <combo_box.item - name="Original" - label="Original" - value="1" /> - </combo_box> -<!-- NEW PRICE SPINNER -Objects are allowed to be for sale for L$0 to invoke buy UI behavior -even though the user gets a free copy. ---> - <spinner - follows="left|top" - decimal_digits="0" - increment="1" - top_pad="8" - left="118" - control_name="Edit Cost" - name="Edit Cost" - label="Price: L$" - label_width="65" - width="165" - min_val="0" - height="20" - max_val="999999999" /> - <check_box - height="15" - width="110" - top_pad="5" - label="Show in search" - layout="topleft" - left="100" - name="search_check" - tool_tip="Let people see this object in search results" /> - <panel - border="false" - follows="left|top" - layout="topleft" - mouse_opaque="false" - background_visible="true" - bg_alpha_color="DkGray" - name="perms_build" - left="0" - top_pad="4" - height="105" - width="290"> - <text - type="string" - length="1" - left="10" - top_pad="9" - text_color="EmphasisColor" - height="16" - follows="left|top|right" - layout="topleft" - name="perm_modify" - width="264"> - You can modify this object - </text> - <text - type="string" - follows="left|top" - name="Anyone can:" - width="250" - left="10"> - Anyone: - </text> - <check_box - height="19" - label="Move" - layout="topleft" - name="checkbox allow everyone move" - left="10" - width="85" /> - <check_box - height="19" - label="Copy" - layout="topleft" - left_pad="0" - name="checkbox allow everyone copy" - width="90" /> - <text - type="string" - follows="left|top" - height="19" - name="Next owner can:" - width="250" - left="10"> - Next owner: - </text> - <check_box - follows="left|top|right" - label="Modify" - layout="topleft" - left="10" - name="checkbox next owner can modify" - width="85" /> - <check_box - follows="left|top|right" - height="19" - label="Copy" - layout="topleft" - left_pad="0" - name="checkbox next owner can copy" - width="80" /> - <check_box - follows="left|top|right" - height="19" - label="Transfer" - layout="topleft" - name="checkbox next owner can transfer" - left_pad="0" - top_delta="0" - tool_tip="Next owner can give away or resell this object" - width="100" /> -<!-- *NOTE: These "B/O/G/E/N/F fields may overlap "perm_modify" above, - but that's OK, this is used only for debugging. --> - <text - type="string" - text_color="EmphasisColor" - length="1" - top="9" - follows="left|top" - layout="topleft" - left="230" - name="B:" - height="10" - width="80"> - B: - </text> - <text - type="string" - text_color="White" - length="1" - follows="left|top" - layout="topleft" - left_delta="0" - top_pad="2" - name="O:" - height="10" - width="80"> - O: - </text> - <text - type="string" - text_color="EmphasisColor" - length="1" - follows="left|top" - layout="topleft" - left_delta="0" - top_pad="2" - name="G:" - height="10" - width="80"> - G: - </text> - <text - type="string" - text_color="White" - length="1" - follows="left|top" - left_delta="0" - top_pad="2" - layout="topleft" - name="E:" - height="10" - width="80"> - E: - </text> - <text - type="string" - text_color="EmphasisColor" - length="1" - follows="left|top" - layout="topleft" - left_delta="0" - top_pad="2" - name="N:" - height="10" - width="80"> - N: - </text> - <text - type="string" - text_color="White" - length="1" - follows="left|top" - layout="topleft" - left_delta="0" - top_pad="2" - name="F:" - height="10" - width="80"> - F: - </text> - </panel> - </panel> - <!-- Object tab --> - <panel - border="false" - follows="all" - height="567" - label="Object" - layout="topleft" - left_delta="0" - mouse_opaque="false" - help_topic="toolbox_object_tab" - name="Object" - top="16" - width="295"> - <check_box - height="19" - label="Locked" - layout="topleft" - name="checkbox locked" - tool_tip="Prevents object from being moved or deleted. Frequently useful during building to avoid unintended edits." - top_pad="5" - left="10" - width="123" /> - <check_box - height="19" - label="Physical" - layout="topleft" - name="Physical Checkbox Ctrl" - tool_tip="Allows object to be pushed and affected by gravity" - top_pad="0" - width="123" /> - <check_box - height="19" - label="Temporary" - layout="topleft" - name="Temporary Checkbox Ctrl" - tool_tip="Causes object to be deleted 1 minute after creation" - top_pad="0" - width="123" /> - <check_box - height="19" - label="Phantom" - layout="topleft" - name="Phantom Checkbox Ctrl" - tool_tip="Causes object to not collide with other objects or avatars" - top_pad="0" - width="123" /> - - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - name="label position" - top_pad="10" - width="121"> - Position (meters) - </text> - <spinner - follows="left|top" - height="19" - increment="0.01" - initial_value="0" - label="X" - label_width="10" - layout="topleft" - left_delta="0" - max_val="512" - min_val="-256" - name="Pos X" - text_enabled_color="1 0 0.3 .7" - top_pad="5" - width="87" /> - <spinner - follows="left|top" - height="19" - increment="0.01" - initial_value="0" - label="Y" - label_width="10" - layout="topleft" - left_delta="0" - max_val="512" - min_val="-256" - name="Pos Y" - text_enabled_color="EmphasisColor" - top_pad="3" - width="87" /> - <spinner - follows="left|top" - height="19" - increment="0.01" - initial_value="0" - label="Z" - label_width="10" - layout="topleft" - left_delta="0" - max_val="4096" - name="Pos Z" - text_enabled_color="0 0.8 1 .65" - top_pad="3" - width="87" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="0" - name="label size" - top_pad="6" - width="121"> - Size (meters) - </text> - <spinner - follows="left|top" - height="19" - increment="0.01" - initial_value="0" - label="X" - label_width="10" - layout="topleft" - left_delta="0" - max_val="64" - min_val="0.01" - name="Scale X" - text_enabled_color="1 1 1 1" - top_pad="5" - width="87" /> - <spinner - follows="left|top" - height="19" - increment="0.01" - initial_value="0" - label="Y" - label_width="10" - layout="topleft" - left_delta="0" - max_val="64" - min_val="0.01" - name="Scale Y" - text_enabled_color="1 1 1 1" - top_pad="3" - width="87" /> - <spinner - follows="left|top" - height="19" - increment="0.01" - initial_value="0" - label="Z" - label_width="10" - layout="topleft" - left_delta="0" - max_val="64" - min_val="0.01" - name="Scale Z" - text_enabled_color="1 1 1 1" - top_pad="3" - width="87" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="0" - name="label rotation" - top_pad="10" - width="121"> - Rotation (degrees) - </text> - <spinner - decimal_digits="2" - follows="left|top" - height="19" - increment="1" - initial_value="0" - label="X" - label_width="10" - layout="topleft" - left_delta="0" - max_val="9999" - min_val="-9999" - name="Rot X" - text_enabled_color="1 1 1 1" - top_pad="5" - width="87" /> - <spinner - decimal_digits="2" - follows="left|top" - height="19" - increment="1" - initial_value="0" - label="Y" - label_width="10" - layout="topleft" - left_delta="0" - max_val="9999" - min_val="-9999" - name="Rot Y" - text_enabled_color="1 1 1 1" - top_pad="3" - width="87" /> - <spinner - decimal_digits="2" - follows="left|top" - height="19" - increment="1" - initial_value="0" - label="Z" - label_width="10" - layout="topleft" - left_delta="0" - max_val="9999" - min_val="-9999" - name="Rot Z" - text_enabled_color="1 1 1 1" - top_pad="3" - width="87" /> - <!-- <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="125" - name="label basetype" - top="5" - width="150"> - Prim Type - </text>--> - <combo_box - height="19" - layout="topleft" - name="comboBaseType" - top="6" - left="125" - width="150"> - <combo_box.item - label="Box" - name="Box" - value="Box" /> - <combo_box.item - label="Cylinder" - name="Cylinder" - value="Cylinder" /> - <combo_box.item - label="Prism" - name="Prism" - value="Prism" /> - <combo_box.item - label="Sphere" - name="Sphere" - value="Sphere" /> - <combo_box.item - label="Torus" - name="Torus" - value="Torus" /> - <combo_box.item - label="Tube" - name="Tube" - value="Tube" /> - <combo_box.item - label="Ring" - name="Ring" - value="Ring" /> - <combo_box.item - label="Sculpted" - name="Sculpted" - value="Sculpted" /> - </combo_box> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="0" - name="text cut" - top_pad="5" - width="150"> - Path Cut (begin/end) - </text> - <spinner - follows="left|top" - height="16" - increment="0.025" - initial_value="0" - label="B" - label_width="10" - layout="topleft" - left_delta="0" - max_val="0.98" - name="cut begin" - top_pad="4" - width="68" /> - <spinner - follows="left|top" - height="16" - increment="0.025" - initial_value="1" - label="E" - label_width="10" - layout="topleft" - left_pad="10" - min_val="0.02" - name="cut end" - top_delta="0" - width="68" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="125" - name="text hollow" - top_pad="6" - width="68"> - Hollow - </text> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_pad="10" - name="text skew" - width="63"> - Skew - </text> - <spinner - decimal_digits="1" - follows="left|top" - height="19" - increment="5" - initial_value="0" - layout="topleft" - left="125" - max_val="95" - name="Scale 1" - top_pad="4" - width="68" /> - <spinner - decimal_digits="2" - follows="left|top" - height="19" - increment="0.05" - initial_value="0" - layout="topleft" - left_pad="10" - max_val="0.95" - min_val="-0.95" - name="Skew" - top_delta="0" - width="68" /> - <text - type="string" - length="1" - follows="left|top" - height="15" - layout="topleft" - left="125" - name="Hollow Shape" - top_pad="4" - width="150"> - Hollow Shape - </text> - <combo_box - height="23" - layout="topleft" - left_delta="0" - name="hole" - top_pad="-2" - width="150"> - <combo_box.item - label="Default" - name="Default" - value="Default" /> - <combo_box.item - label="Circle" - name="Circle" - value="Circle" /> - <combo_box.item - label="Square" - name="Square" - value="Square" /> - <combo_box.item - label="Triangle" - name="Triangle" - value="Triangle" /> - </combo_box> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="0" - name="text twist" - top_pad="5" - width="150"> - Twist (begin/end) - </text> - <spinner - decimal_digits="0" - follows="left|top" - height="19" - increment="9" - initial_value="0" - label="B" - label_width="10" - layout="topleft" - left_delta="0" - max_val="180" - min_val="-180" - name="Twist Begin" - top_pad="4" - width="68" /> - <spinner - decimal_digits="0" - follows="left|top" - height="19" - increment="9" - initial_value="0" - label="E" - label_width="10" - layout="topleft" - left_pad="10" - max_val="180" - min_val="-180" - name="Twist End" - top_delta="0" - width="68" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="125" - name="scale_taper" - top_pad="3" - width="150"> - Taper - </text> - <text - visible="false" - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="0" - name="scale_hole" - top_delta="0" - width="150"> - Hole Size - </text> - <spinner - decimal_digits="2" - follows="left|top" - height="19" - increment="0.05" - initial_value="0" - label="X" - label_width="10" - layout="topleft" - left_delta="0" - min_val="-1" - name="Taper Scale X" - top_pad="4" - width="68" /> - <spinner - decimal_digits="2" - follows="left|top" - height="19" - increment="0.05" - initial_value="0" - label="Y" - label_width="10" - layout="topleft" - left_pad="10" - min_val="-1" - name="Taper Scale Y" - top_delta="0" - width="68" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="125" - name="text topshear" - top_pad="3" - width="141"> - Top Shear - </text> - <spinner - decimal_digits="2" - follows="left|top" - height="19" - increment="0.05" - initial_value="0" - label="X" - label_width="10" - layout="topleft" - left_delta="0" - max_val="0.5" - min_val="-0.5" - name="Shear X" - top_pad="4" - width="68" /> - <spinner - decimal_digits="2" - follows="left|top" - height="19" - increment="0.05" - initial_value="0" - label="Y" - label_width="10" - layout="topleft" - left_pad="10" - max_val="0.5" - min_val="-0.5" - name="Shear Y" - top_delta="0" - width="68" /> - <text - visible="false" - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="125" - name="advanced_cut" - top_pad="3" - width="150"> - Profile Cut (begin/end) - </text> - <text - visible="false" - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="0" - name="advanced_dimple" - top_delta="0" - width="150"> - Dimple (begin/end) - </text> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="0" - name="advanced_slice" - top_delta="0" - width="150"> - Slice (begin/end) - </text> - <spinner - follows="left|top" - height="19" - increment="0.025" - initial_value="0" - label="B" - label_width="10" - layout="topleft" - left_delta="0" - max_val="0.95" - name="Path Limit Begin" - top_pad="3" - width="68" /> - <spinner - follows="left|top" - height="19" - increment="0.025" - initial_value="1" - label="E" - label_width="10" - layout="topleft" - left_pad="10" - min_val="0.05" - name="Path Limit End" - top_delta="0" - width="68" /> - <text - visible="false" - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="125" - name="text taper2" - top_pad="3" - width="150"> - Taper - </text> - <spinner - visible="false" - decimal_digits="2" - follows="left|top" - height="19" - increment="0.05" - initial_value="0" - label="X" - label_width="10" - layout="topleft" - left_delta="0" - min_val="-1" - name="Taper X" - top_pad="3" - width="68" /> - <spinner - visible="false" - decimal_digits="2" - follows="left|top" - height="19" - increment="0.05" - initial_value="0" - label="Y" - label_width="10" - layout="topleft" - left_pad="10" - min_val="-1" - name="Taper Y" - top_delta="0" - width="68" /> - <text - visible="false" - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="125" - name="text radius delta" - top_pad="2" - width="78"> - Radius - </text> - <text - visible="false" - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="78" - name="text revolutions" - width="68"> - Revolutions - </text> - <spinner - visible="false" - follows="left|top" - height="19" - increment="0.05" - initial_value="0" - layout="topleft" - left="125" - min_val="-1" - name="Radius Offset" - top_pad="4" - width="68" /> - <spinner - visible="false" - decimal_digits="2" - follows="left|top" - height="19" - initial_value="1" - layout="topleft" - left_pad="10" - max_val="4" - min_val="1" - name="Revolutions" - top_delta="0" - width="68" /> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="141" - label="Sculpt Texture" - layout="topleft" - left="125" - name="sculpt texture control" - tool_tip="Click to choose a picture" - top="70" - visible="false" - width="145" /> - <check_box - height="19" - label="Mirror" - layout="topleft" - left_delta="0" - name="sculpt mirror control" - tool_tip="Flips sculpted prim along the X axis" - top_pad="8" - visible="false" - width="130" /> - <check_box - height="19" - label="Inside-out" - layout="topleft" - left_delta="0" - name="sculpt invert control" - tool_tip="Inverts the sculpted prims normals, making it appear inside-out" - top_pad="4" - visible="false" - width="121" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="0" - name="label sculpt type" - top_pad="10" - visible="false" - width="130"> - Stitching type - </text> - <combo_box - height="19" - layout="topleft" - left_delta="0" - name="sculpt type control" - top_pad="4" - visible="false" - width="150"> - <combo_box.item - label="(none)" - name="None" - value="None" /> - <combo_box.item - label="Sphere" - name="Sphere" - value="Sphere" /> - <combo_box.item - label="Torus" - name="Torus" - value="Torus" /> - <combo_box.item - label="Plane" - name="Plane" - value="Plane" /> - <combo_box.item - label="Cylinder" - name="Cylinder" - value="Cylinder" /> - <combo_box.item - label="Mesh" - name="Mesh" - value="Mesh" /> - </combo_box> - </panel> - <panel - border="false" - follows="all" - height="367" - label="Features" - layout="topleft" - left_delta="0" - mouse_opaque="false" - help_topic="toolbox_features_tab" - name="Features" - top_delta="0" - width="295"> - <panel.string name="None">None</panel.string> - <panel.string name="Prim">Prim</panel.string> - <panel.string name="Convex Hull">Convex Hull</panel.string> - <text - type="string" - length="1" - follows="left|top" - height="20" - layout="topleft" - left="10" - name="select_single" - top="5" - width="252" - word_wrap="true"> - Select only one primitive to edit features. - </text> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="edit_object" - top="5" - width="252"> - Edit object features: - </text> - <check_box - height="19" - label="Flexible Path" - layout="topleft" - left="10" - name="Flexible1D Checkbox Ctrl" - tool_tip="Allows object to flex about the Z axis (Client-side only)" - top_pad="20" - width="121" /> - <spinner - follows="left|top" - height="19" - increment="1" - initial_value="2" - label="Softness" - label_width="70" - layout="topleft" - left_delta="0" - max_val="3" - name="FlexNumSections" - top_pad="10" - width="128" /> - <spinner - follows="left|top" - height="19" - increment="0.5" - initial_value="0.3" - label="Gravity" - label_width="70" - layout="topleft" - left_delta="0" - max_val="10" - min_val="-10" - name="FlexGravity" - top_pad="4" - width="128" /> - <spinner - follows="left|top" - height="19" - increment="0.5" - initial_value="2" - label="Drag" - label_width="70" - layout="topleft" - left_delta="0" - max_val="10" - name="FlexFriction" - top_pad="4" - width="128" /> - <spinner - follows="left|top" - height="19" - increment="0.5" - initial_value="0" - label="Wind" - label_width="70" - layout="topleft" - left_delta="0" - max_val="10" - name="FlexWind" - top_pad="4" - width="128" /> - <spinner - follows="left|top" - height="19" - increment="0.5" - initial_value="1" - label="Tension" - label_width="70" - layout="topleft" - left_delta="0" - max_val="10" - name="FlexTension" - top_pad="4" - width="128" /> - <spinner - follows="left|top" - height="19" - increment="0.01" - initial_value="0" - label="Force X" - label_width="70" - layout="topleft" - left_delta="0" - max_val="10" - min_val="-10" - name="FlexForceX" - top_pad="4" - width="128" /> - <spinner - follows="left|top" - height="19" - increment="0.01" - initial_value="0" - label="Force Y" - label_width="70" - layout="topleft" - left_delta="0" - max_val="10" - min_val="-10" - name="FlexForceY" - top_pad="4" - width="128" /> - <spinner - follows="left|top" - height="19" - increment="0.01" - initial_value="0" - label="Force Z" - label_width="70" - layout="topleft" - left_delta="0" - max_val="10" - min_val="-10" - name="FlexForceZ" - top_pad="4" - width="128" /> - - <check_box - height="16" - label="Light" - layout="topleft" - left="10" - name="Light Checkbox Ctrl" - tool_tip="Causes object to emit light" - top_pad="15" - width="60" /> - <color_swatch - can_apply_immediately="true" - color="0.5 0.5 0.5 1" - border.border_thickness="0" - follows="left|top" - height="50" - layout="topleft" - left_pad="10" - top_pad="-17" - name="colorswatch" - tool_tip="Click to open color picker" - width="40" /> - <texture_picker - allow_no_texture="true" - top_delta="0" - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="48" - label="" - left_delta="57" - mouse_opaque="true" - name="light texture control" - tool_tip="Click to choose a projection image (only has effect with deferred rendering enabled)" - width="32" /> - <spinner - follows="left|top" - height="19" - initial_value="0.5" - label="Intensity" - label_width="70" - layout="topleft" - left="10" - name="Light Intensity" - top_pad="3" - width="128" /> - <spinner bottom_delta="0" - decimal_digits="3" - follows="left|top" - height="16" - increment="0.1" - initial_value="0.5" - label="FOV" - label_width="55" - left="144" - max_val="3" - min_val="0" - mouse_opaque="true" - name="Light FOV" - width="120" /> - <spinner follows="left|top" - height="19" - initial_value="5" - label="Radius" - label_width="70" - layout="topleft" - left="10" - max_val="20" - name="Light Radius" - top_pad="3" - width="128" /> - <spinner bottom_delta="0" - decimal_digits="3" - follows="left|top" - height="16" - increment="0.5" - initial_value="0.5" - label="Focus" - label_width="55" - left="144" - max_val="20" - min_val="-20" - mouse_opaque="true" - name="Light Focus" - width="120" /> - <spinner follows="left|top" - height="19" - increment="0.25" - initial_value="1" - label="Falloff" - label_width="70" - layout="topleft" - left="10" - max_val="2" - name="Light Falloff" - top_pad="3" - width="128" /> - <spinner bottom_delta="0" - decimal_digits="3" - follows="left|top" - height="16" - increment="0.05" - initial_value="1" - label="Ambiance" - label_width="55" - left="144" - max_val="1" - min_val="0" - mouse_opaque="true" - name="Light Ambiance" - width="120" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - name="label physicsshapetype" - top="38" - width="121"> - Physics Shape Type: - </text> - <combo_box - height="19" - top_delta="15" - layout="topleft" - follows="left|top" - name="Physics Shape Type Combo Ctrl" - tool_tip="Choose the physics shape type" - width="108"/> - <combo_box - height="19" - layout="topleft" - name="material" - top_pad="5" - width="150"> - <combo_box.item - label="Stone" - name="Stone" - value="Stone" /> - <combo_box.item - label="Metal" - name="Metal" - value="Metal" /> - <combo_box.item - label="Glass" - name="Glass" - value="Glass" /> - <combo_box.item - label="Wood" - name="Wood" - value="Wood" /> - <combo_box.item - label="Flesh" - name="Flesh" - value="Flesh" /> - <combo_box.item - label="Plastic" - name="Plastic" - value="Plastic" /> - <combo_box.item - label="Rubber" - name="Rubber" - value="Rubber" /> - </combo_box> - - <spinner - follows="left|top" - height="19" - increment="1" - initial_value="1" - label="Gravity" - label_width="70" - layout="topleft" - min_val="-1" - max_val="28" - name="Physics Gravity" - top_pad="10" - width="132" /> - - <spinner - follows="left|top" - height="19" - increment="0.1" - initial_value="0" - label="Friction" - label_width="70" - layout="topleft" - left_delta="0" - max_val="255" - min_val="0" - name="Physics Friction" - top_pad="4" - width="132" /> - - <spinner - follows="left|top" - height="19" - increment="0.1" - initial_value="0" - label="Density" - label_width="70" - layout="topleft" - left_delta="0" - max_val="22587" - min_val="1" - name="Physics Density" - top_pad="4" - width="132" /> - - <spinner - follows="left|top" - height="19" - increment="0.01" - initial_value="0" - label="Restitution" - label_width="70" - layout="topleft" - left_delta="0" - max_val="1" - min_val="0" - name="Physics Restitution" - top_pad="4" - width="132" /> - </panel> - <panel - border="false" - follows="all" - height="367" - label="Texture" - layout="topleft" - left_delta="0" - mouse_opaque="false" - help_topic="toolbox_texture_tab" - name="Texture" - top_delta="0" - width="295"> - <panel.string - name="string repeats per meter"> - Repeats Per Meter - </panel.string> - <panel.string - name="string repeats per face"> - Repeats Per Face - </panel.string> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - fallback_image="locked_image.j2c" - follows="left|top" - height="80" - label="Texture" - layout="topleft" - left="10" - name="texture control" - tool_tip="Click to choose a picture" - top="8" - width="64" /> - <color_swatch - can_apply_immediately="true" - follows="left|top" - height="80" - label="Color" - layout="topleft" - left_pad="15" - name="colorswatch" - tool_tip="Click to open color picker" - top_delta="0" - width="64" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_pad="15" - name="color trans" - text_readonly_color="LabelDisabledColor" - top="6" - width="110"> - Transparency % - </text> - <spinner - decimal_digits="0" - follows="left|top" - height="19" - increment="2" - initial_value="0" - layout="topleft" - left_delta="0" - max_val="100" - name="ColorTrans" - top_pad="4" - width="80" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="0" - name="glow label" - text_readonly_color="LabelDisabledColor" - top_pad="8" - width="80"> - Glow - </text> - <spinner - decimal_digits="2" - follows="left|top" - height="19" - initial_value="0" - layout="topleft" - left_delta="0" - name="glow" - top_pad="4" - width="80" /> - <check_box - height="19" - label="Full Bright" - layout="topleft" - left_delta="-5" - name="checkbox fullbright" - top_pad="4" - width="81" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="tex gen" - text_readonly_color="LabelDisabledColor" - top_pad="5" - width="90"> - Mapping - </text> - <combo_box - height="23" - layout="topleft" - left_delta="0" - name="combobox texgen" - top_pad="4" - width="90"> - <combo_box.item - label="Default" - name="Default" - value="Default" /> - <combo_box.item - label="Planar" - name="Planar" - value="Planar" /> - </combo_box> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - name="label shininess" - left_pad="4" - text_readonly_color="LabelDisabledColor" - top_pad="-37" - width="90"> - Shininess - </text> - <combo_box - height="23" - layout="topleft" - left_delta="0" - name="combobox shininess" - top_pad="4" - width="90"> - <combo_box.item - label="None" - name="None" - value="None" /> - <combo_box.item - label="Low" - name="Low" - value="Low" /> - <combo_box.item - label="Medium" - name="Medium" - value="Medium" /> - <combo_box.item - label="High" - name="High" - value="High" /> - </combo_box> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_pad="4" - name="label bumpiness" - text_readonly_color="LabelDisabledColor" - top_pad="-37" - width="90"> - Bumpiness - </text> - <combo_box - height="23" - layout="topleft" - left_delta="0" - name="combobox bumpiness" - top_pad="4" - width="90"> - <combo_box.item - label="None" - name="None" - value="None" /> - <combo_box.item - label="Brightness" - name="Brightness" - value="Brightness" /> - <combo_box.item - label="Darkness" - name="Darkness" - value="Darkness" /> - <combo_box.item - label="woodgrain" - name="woodgrain" - value="woodgrain" /> - <combo_box.item - label="bark" - name="bark" - value="bark" /> - <combo_box.item - label="bricks" - name="bricks" - value="bricks" /> - <combo_box.item - label="checker" - name="checker" - value="checker" /> - <combo_box.item - label="concrete" - name="concrete" - value="concrete" /> - <combo_box.item - label="crustytile" - name="crustytile" - value="crustytile" /> - <combo_box.item - label="cutstone" - name="cutstone" - value="cutstone" /> - <combo_box.item - label="discs" - name="discs" - value="discs" /> - <combo_box.item - label="gravel" - name="gravel" - value="gravel" /> - <combo_box.item - label="petridish" - name="petridish" - value="petridish" /> - <combo_box.item - label="siding" - name="siding" - value="siding" /> - <combo_box.item - label="stonetile" - name="stonetile" - value="stonetile" /> - <combo_box.item - label="stucco" - name="stucco" - value="stucco" /> - <combo_box.item - label="suction" - name="suction" - value="suction" /> - <combo_box.item - label="weave" - name="weave" - value="weave" /> - </combo_box> - <!-- - <line_editor - bevel_style="in" - border_style="line" - border_thickness="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - max_length_bytes="63" - name="Home Url" - select_on_focus="true" - top="134" - width="250" /> - <check_box - height="16" - label="Media Face" - layout="topleft" - left_delta="0" - name="has media" - top_pad="6" - width="70" /> - <button - follows="left|top" - font="SansSerifSmall" - height="20" - label="Set Media Info" - label_selected="Set Media Info" - layout="topleft" - left_pad="60" - name="media info set" - top_delta="-4" - width="120" /> ---> - <check_box - follows="top|left" - height="16" - initial_value="false" - label="Align planar faces" - layout="topleft" - left="17" - name="checkbox planar align" - tool_tip="Align textures on all selected faces with the last selected face. Requires Planar texture mapping." - top_delta="26" - width="140" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="rpt" - text_readonly_color="LabelDisabledColor" - top_pad="2" - width="140"> - Repeats / Face - </text> - <spinner - follows="left|top" - height="19" - initial_value="0" - label="Horizontal (U)" - label_width="125" - layout="topleft" - left="20" - max_val="100" - name="TexScaleU" - top_pad="5" - width="185" /> - <check_box - height="19" - label="Flip" - layout="topleft" - left_pad="5" - name="checkbox flip s" - top_delta="0" - width="70" /> - <spinner - follows="left|top" - height="19" - initial_value="0" - label="Vertical (V)" - label_width="125" - layout="topleft" - left="20" - max_val="100" - name="TexScaleV" - width="185" /> - <check_box - height="19" - label="Flip" - layout="topleft" - left_pad="5" - name="checkbox flip t" - top_delta="0" - width="70" /> - <spinner - decimal_digits="2" - follows="left|top" - height="19" - increment="1" - initial_value="0" - label="Rotation˚" - layout="topleft" - label_width="135" - left="10" - max_val="9999" - min_val="-9999" - name="TexRot" - width="195" /> - - <spinner - decimal_digits="1" - follows="left|top" - height="23" - initial_value="1" - label="Repeats / Meter" - layout="topleft" - label_width="135" - left="10" - max_val="10" - min_val="0.1" - name="rptctrl" - width="195" /> - <button - follows="left|top" - height="23" - label="Apply" - label_selected="Apply" - layout="topleft" - left_pad="5" - name="button apply" - width="75" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="tex offset" - text_readonly_color="LabelDisabledColor" - width="200"> - Texture Offset - </text> - <spinner - follows="left|top" - height="19" - initial_value="0" - label="Horizontal (U)" - label_width="125" - layout="topleft" - left="20" - min_val="-1" - name="TexOffsetU" - width="185" /> - <spinner - follows="left|top" - height="19" - initial_value="0" - label="Vertical (V)" - label_width="125" - layout="topleft" - left_delta="0" - min_val="-1" - name="TexOffsetV" - top_pad="1" - width="185" /> - <panel - border="false" - follows="left|top" - layout="topleft" - mouse_opaque="false" - background_visible="true" - bg_alpha_color="DkGray" - name="Add_Media" - left="0" - height="47" - width="290"> - <text - type="string" - length="1" - follows="left|top" - height="18" - layout="topleft" - left="10" - top_pad="3" - name="media_tex" - width="190"> - Media - </text> - <button - follows="top|left" - height="18" - image_selected="AddItem_Press" - image_unselected="AddItem_Off" - image_disabled="AddItem_Disabled" - layout="topleft" - left_pad="0" - name="add_media" - tab_stop="false" - top_delta="0" - tool_tip="Add Media" - width="18"> - <button.commit_callback - function="BuildTool.AddMedia"/> - </button> - <button - follows="top|left" - height="18" - image_selected="TrashItem_Press" - image_unselected="TrashItem_Off" - layout="topleft" - left_pad="5" - name="delete_media" - tool_tip="Delete this media texture" - top_delta="0" - width="18"> - <button.commit_callback - function="BuildTool.DeleteMedia"/> - </button> - <button - follows="top|left" - tool_tip="Edit this Media" - height="12" - image_disabled="Icon_Gear_Background" - image_selected="Icon_Gear_Press" - image_unselected="Icon_Gear_Foreground" - layout="topleft" - left_pad="10" - name="edit_media" - top_delta="3" - width="12"> - <button.commit_callback - function="BuildTool.EditMedia"/> - </button> - <text - follows="left|top|right" - height="9" - layout="topleft" - left="10" - use_ellipses="true" - read_only="true" - name="media_info" - width="280" /> - <web_browser - visible="false" - enabled="false" - border_visible="true" - bottom_delta="0" - follows="top|left" - left="0" - name="title_media" - width="4" - height="4" - start_url="about:blank" - decouple_texture_size="true" /> - <button - follows="right|top" - height="22" - label="Align" - label_selected="Align Media" - layout="topleft" - right="-16" - name="button align" - top_delta="-4" - tool_tip="Align media texture (must load first)" - width="80" /> - </panel> - </panel> - <panel - border="false" - follows="all" - label="Content" - layout="topleft" - left_delta="0" - mouse_opaque="false" - help_topic="toolbox_contents_tab" - name="Contents" - top_delta="0" - width="295"> - <button - follows="left|top" - height="23" - label="New Script" - label_selected="New Script" - layout="topleft" - left="10" - name="button new script" - top="10" - width="134" /> - <button - follows="left|top" - height="23" - label="Permissions" - layout="topleft" - left_pad="8" - name="button permissions" - width="134" /> - <panel_inventory_object - border="true" - border_visible="true" - bevel_style="in" - follows="left|top|right" - height="325" - layout="topleft" - left="10" - name="contents_inventory" - top="50" - width="275" /> - </panel> - </tab_container> - <panel - follows="left|top" - height="384" - layout="topleft" - left_delta="0" - name="land info panel" - top_delta="0" - width="295"> - <text - type="string" - length="1" - font="SansSerifBig" - follows="left|top" - height="19" - layout="topleft" - left="20" - name="label_parcel_info" - top="24" - width="240"> - Parcel Information - </text> - <text - type="string" - length="1" - follows="left|top" - height="19" - layout="topleft" - left="30" - name="label_area_price" - top="48" - width="150"> - Price: L$[PRICE] for [AREA] m² - </text> - <text - type="string" - length="1" - follows="left|top" - height="19" - layout="topleft" - left_delta="0" - name="label_area" - top_delta="0" - width="150"> - Area: [AREA] m² - </text> - <button - follows="left|top" - height="23" - label="About Land" - label_selected="About Land" - layout="topleft" - left_delta="0" - name="button about land" - top_pad="4" - width="125" /> - <check_box - control_name="ShowParcelOwners" - height="19" - label="Show owners" - layout="topleft" - left_delta="0" - name="checkbox show owners" - tool_tip="Colorize the parcels according to the type of owner: Green = Your land Aqua = Your group's land Red = Owned by others Yellow = For sale Purple = For auction Grey = Public" - top_pad="8" - width="205" /> - <text - type="string" - length="1" - font="SansSerifBig" - follows="left|top" - height="19" - layout="topleft" - left="20" - name="label_parcel_modify" - top="152" - width="240"> - Modify Parcel - </text> - <button - follows="left|top" - height="23" - label="Subdivide" - label_selected="Subdivide" - layout="topleft" - left="30" - name="button subdivide land" - top="172" - width="125" /> - <button - follows="left|top" - height="23" - label="Join" - label_selected="Join" - layout="topleft" - left_delta="0" - name="button join land" - top_pad="4" - width="125" /> - <text - type="string" - length="1" - font="SansSerifBig" - follows="left|top" - height="19" - layout="topleft" - left="20" - name="label_parcel_trans" - top="256" - width="240"> - Land Transactions - </text> - <button - follows="left|top" - height="23" - label="Buy Land" - label_selected="Buy Land" - layout="topleft" - left="30" - name="button buy land" - top="276" - width="125" /> - <button - follows="left|top" - height="23" - label="Abandon Land" - label_selected="Abandon Land" - layout="topleft" - left_delta="0" - name="button abandon land" - top_pad="4" - width="125" /> - </panel> -<!-- end of tabs --> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ follows="left|top|right"
+ height="580"
+ layout="topleft"
+ bg_opaque_image="Window_NoTitle_Foreground"
+ bg_alpha_image="Window_NoTitle_Background"
+ name="toolbox floater"
+ help_topic="toolbox_floater"
+ save_rect="true"
+ short_title="BUILD TOOLS"
+ single_instance="true"
+ save_visibility="true"
+ sound_flags="0"
+ width="295">
+ <floater.string
+ name="status_rotate">
+ Drag colored bands to rotate object
+ </floater.string>
+ <floater.string
+ name="status_scale">
+ Click and drag to stretch selected side
+ </floater.string>
+ <floater.string
+ name="status_move">
+ Drag to move, shift-drag to copy
+ </floater.string>
+ <floater.string
+ name="status_modifyland">
+ Click and hold to modify land
+ </floater.string>
+ <floater.string
+ name="status_camera">
+ Click and drag to move camera
+ </floater.string>
+ <floater.string
+ name="status_grab">
+ Drag to move, Ctrl to lift, Ctrl+Shift to rotate
+ </floater.string>
+ <floater.string
+ name="status_place">
+ Click inworld to build
+ </floater.string>
+ <floater.string
+ name="status_selectland">
+ Click and drag to select land
+ </floater.string>
+ <floater.string
+ name="grid_screen_text">
+ Screen
+ </floater.string>
+ <floater.string
+ name="grid_local_text">
+ Local
+ </floater.string>
+ <floater.string
+ name="grid_world_text">
+ World
+ </floater.string>
+ <floater.string
+ name="grid_reference_text">
+ Reference
+ </floater.string>
+ <floater.string
+ name="grid_attachment_text">
+ Attachment
+ </floater.string>
+ <button
+ follows="left|top"
+ height="25"
+ image_bottom_pad="1"
+ image_overlay="Tool_Zoom"
+ image_selected="PushButton_Selected_Press"
+ layout="topleft"
+ left="10"
+ name="button focus"
+ tool_tip="Focus"
+ width="35">
+ <button.commit_callback
+ function="BuildTool.setTool"
+ parameter="Focus" />
+ </button>
+ <button
+ follows="left|top"
+ height="25"
+ image_bottom_pad="1"
+ image_overlay="Tool_Grab"
+ image_selected="PushButton_Selected_Press"
+ layout="topleft"
+ left_pad="10"
+ name="button move"
+ tool_tip="Move"
+ width="35">
+ <button.commit_callback
+ function="BuildTool.setTool"
+ parameter="Move" />
+ </button>
+ <button
+ follows="left|top"
+ height="25"
+ image_bottom_pad="1"
+ image_overlay="Tool_Face"
+ image_selected="PushButton_Selected_Press"
+ layout="topleft"
+ left_pad="10"
+ name="button edit"
+ tool_tip="Edit"
+ width="35">
+ <button.commit_callback
+ function="BuildTool.setTool"
+ parameter="Edit" />
+ </button>
+ <button
+ follows="left|top"
+ height="25"
+ image_bottom_pad="1"
+ image_overlay="Tool_Create"
+ image_selected="PushButton_Selected_Press"
+ layout="topleft"
+ left_pad="10"
+ name="button create"
+ tool_tip="Create"
+ width="35">
+ <button.commit_callback
+ function="BuildTool.setTool"
+ parameter="Create" />
+ </button>
+ <button
+ follows="left|top"
+ height="25"
+ image_bottom_pad="1"
+ image_overlay="Tool_Dozer"
+ image_selected="PushButton_Selected_Press"
+ layout="topleft"
+ left_pad="10"
+ name="button land"
+ tool_tip="Land"
+ width="35">
+ <button.commit_callback
+ function="BuildTool.setTool"
+ parameter="Land" />
+ </button>
+ <text
+ height="30"
+ word_wrap="true"
+ use_ellipses="true"
+ type="string"
+ text_color="LabelSelectedDisabledColor"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left="8"
+ name="text status"
+ top_pad="3"
+ width="285">
+ Drag to move, shift-drag to copy
+ </text>
+ <radio_group
+ layout="topleft"
+ left="10"
+ height="70"
+ top="59"
+ name="focus_radio_group">
+ <radio_item
+ top_pad="6"
+ label="Zoom"
+ layout="topleft"
+ name="radio zoom" />
+ <radio_item
+ top_pad="6"
+ label="Orbit (Ctrl)"
+ layout="topleft"
+ name="radio orbit" />
+ <radio_item
+ top_pad="6"
+ label="Pan (Ctrl+Shift)"
+ layout="topleft"
+ name="radio pan" />
+ <radio_group.commit_callback
+ function="BuildTool.commitRadioFocus"/>
+ </radio_group>
+ <slider_bar
+ follows="left|top"
+ height="14"
+ increment="0.01"
+ initial_value="0.125"
+ layout="topleft"
+ max_val="0.5"
+ top_delta="-2"
+ left_delta="100"
+ name="slider zoom"
+ width="134">
+ <slider_bar.commit_callback
+ function="BuildTool.commitZoom"/>
+ </slider_bar>
+ <radio_group
+ left="10"
+ height="70"
+ top="59"
+ layout="topleft"
+ name="move_radio_group">
+ <radio_item
+ top_pad="6"
+ label="Move"
+ layout="topleft"
+ name="radio move" />
+ <radio_item
+ top_pad="6"
+ label="Lift (Ctrl)"
+ layout="topleft"
+ name="radio lift" />
+ <radio_item
+ top_pad="6"
+ label="Spin (Ctrl+Shift)"
+ layout="topleft"
+ name="radio spin" />
+ <radio_group.commit_callback
+ function="BuildTool.commitRadioMove"/>
+ </radio_group>
+ <radio_group
+ follows="left|top"
+ left="5"
+ top="59"
+ height="70"
+ layout="topleft"
+ name="edit_radio_group">
+ <radio_item
+ label="Move"
+ layout="topleft"
+ name="radio position" />
+ <radio_item
+ top_pad="6"
+ label="Rotate (Ctrl)"
+ layout="topleft"
+ name="radio rotate" />
+ <radio_item
+ top_pad="6"
+ label="Stretch (Ctrl+Shift)"
+ layout="topleft"
+ name="radio stretch" />
+ <radio_item
+ top_pad="6"
+ label="Select Face"
+ layout="topleft"
+ name="radio select face" />
+ <radio_group.commit_callback
+ function="BuildTool.commitRadioEdit"/>
+ </radio_group>
+ <check_box
+ left="5"
+ follows="left|top"
+ height="28"
+ control_name="EditLinkedParts"
+ label="Edit linked"
+ layout="topleft"
+ name="checkbox edit linked parts"
+ top_pad="-10">
+ <check_box.commit_callback
+ function="BuildTool.selectComponent"/>
+ </check_box>
+
+ <button
+ follows="left|top"
+ height="23"
+ label="Link"
+ top_pad="2"
+ layout="topleft"
+ left="5"
+ name="link_btn"
+ width="50">
+ <button.commit_callback
+ function="BuildTool.LinkObjects"/>
+ </button>
+ <button
+ follows="left|top"
+ height="23"
+ label="Unlink"
+ layout="topleft"
+ left_pad="2"
+ name="unlink_btn"
+ width="50">
+ <button.commit_callback
+ function="BuildTool.UnlinkObjects"/>
+ </button>
+ <text
+ text_color="LtGray_50"
+ follows="top|left"
+ halign="left"
+ left_pad="3"
+ name="RenderingCost"
+ tool_tip="Shows the rendering cost calculated for this object"
+ top_delta="11"
+ type="string"
+ width="100">
+ þ: [COUNT]
+ </text>
+ <check_box
+ control_name="ScaleUniform"
+ height="19"
+ label=""
+ layout="topleft"
+ left="143"
+ name="checkbox uniform"
+ top="50"
+ width="20" />
+ <text
+ height="19"
+ label="Stretch Both Sides"
+ left_delta="20"
+ name="checkbox uniform label"
+ top_delta="2"
+ width="120"
+ layout="topleft"
+ follows="top|left"
+ wrap="true">
+ Stretch Both Sides
+ </text>
+ <check_box
+ control_name="ScaleStretchTextures"
+ height="19"
+ initial_value="true"
+ label="Stretch Textures"
+ layout="topleft"
+ left="143"
+ name="checkbox stretch textures"
+ top_pad="-6"
+ follows="left|top"
+ width="134" />
+ <check_box
+ control_name="SnapEnabled"
+ height="18"
+ initial_value="true"
+ label="Snap to grid"
+ layout="topleft"
+ top_pad="0"
+ name="checkbox snap to grid"
+ width="134" />
+ <combo_box
+ height="23"
+ layout="topleft"
+ follows="left|top"
+ name="combobox grid mode"
+ tool_tip="Choose the type of grid ruler for positioning the object"
+ top_pad="0"
+ width="108">
+ <combo_box.item
+ label="World grid"
+ name="World"
+ value="World" />
+ <combo_box.item
+ label="Local grid"
+ name="Local"
+ value="Local" />
+ <combo_box.item
+ label="Reference grid"
+ name="Reference"
+ value="Reference" />
+ <combo_box.commit_callback
+ function="BuildTool.gridMode"/>
+ </combo_box>
+ <button
+ left_pad="0"
+ image_selected="ForwardArrow_Press"
+ image_unselected="ForwardArrow_Off"
+ layout="topleft"
+ follows="top|left"
+ name="Options..."
+ tool_tip="See more grid options"
+ top_pad="-22"
+ right="-10"
+ width="18"
+ height="23" >
+ <button.commit_callback
+ function="BuildTool.gridOptions"/>
+ </button>
+ <button
+ follows="left|top"
+ height="20"
+ image_disabled="Object_Cube"
+ image_disabled_selected="Object_Cube"
+ image_selected="Object_Cube_Selected"
+ image_unselected="Object_Cube"
+ layout="topleft"
+ left="10"
+ name="ToolCube"
+ tool_tip="Cube"
+ top="51"
+ width="20" />
+ <button
+ follows="left|top"
+ height="20"
+ image_disabled="Object_Prism"
+ image_disabled_selected="Object_Prism"
+ image_selected="Object_Prism_Selected"
+ image_unselected="Object_Prism"
+ layout="topleft"
+ left_delta="29"
+ name="ToolPrism"
+ tool_tip="Prism"
+ top_delta="0"
+ width="20" />
+ <button
+ follows="left|top"
+ height="20"
+ image_disabled="Object_Pyramid"
+ image_disabled_selected="Object_Pyramid"
+ image_selected="Object_Pyramid_Selected"
+ image_unselected="Object_Pyramid"
+ layout="topleft"
+ left_delta="29"
+ name="ToolPyramid"
+ tool_tip="Pyramid"
+ top_delta="0"
+ width="20" />
+ <button
+ follows="left|top"
+ height="20"
+ image_disabled="Object_Tetrahedron"
+ image_disabled_selected="Object_Tetrahedron"
+ image_selected="Object_Tetrahedron_Selected"
+ image_unselected="Object_Tetrahedron"
+ layout="topleft"
+ left_delta="29"
+ name="ToolTetrahedron"
+ tool_tip="Tetrahedron"
+ top_delta="0"
+ width="20" />
+ <button
+ follows="left|top"
+ height="20"
+ image_disabled="Object_Cylinder"
+ image_disabled_selected="Object_Cylinder"
+ image_selected="Object_Cylinder_Selected"
+ image_unselected="Object_Cylinder"
+ layout="topleft"
+ left_delta="29"
+ name="ToolCylinder"
+ tool_tip="Cylinder"
+ top_delta="0"
+ width="20" />
+ <button
+ follows="left|top"
+ height="20"
+ image_disabled="Object_Hemi_Cylinder"
+ image_disabled_selected="Object_Hemi_Cylinder"
+ image_selected="Object_Hemi_Cylinder_Selected"
+ image_unselected="Object_Hemi_Cylinder"
+ layout="topleft"
+ left_delta="29"
+ name="ToolHemiCylinder"
+ tool_tip="Hemicylinder"
+ top_delta="0"
+ width="20" />
+ <button
+ follows="left|top"
+ height="20"
+ image_disabled="Object_Cone"
+ image_disabled_selected="Object_Cone"
+ image_selected="Object_Cone_Selected"
+ image_unselected="Object_Cone"
+ layout="topleft"
+ left_delta="29"
+ name="ToolCone"
+ tool_tip="Cone"
+ top_delta="0"
+ width="20" />
+ <button
+ follows="left|top"
+ height="20"
+ image_disabled="Object_Hemi_Cone"
+ image_disabled_selected="Object_Hemi_Cone"
+ image_selected="Object_Hemi_Cone_Selected"
+ image_unselected="Object_Hemi_Cone"
+ layout="topleft"
+ left_delta="29"
+ name="ToolHemiCone"
+ tool_tip="Hemicone"
+ top_delta="0"
+ width="20" />
+ <button
+ follows="left|top"
+ height="20"
+ image_disabled="Object_Sphere"
+ image_disabled_selected="Object_Sphere"
+ image_selected="Object_Sphere_Selected"
+ image_unselected="Object_Sphere"
+ layout="topleft"
+ left_delta="29"
+ name="ToolSphere"
+ tool_tip="Sphere"
+ top_delta="0"
+ width="20" />
+ <button
+ follows="left|top"
+ height="20"
+ image_disabled="Object_Hemi_Sphere"
+ image_disabled_selected="Object_Hemi_Sphere"
+ image_selected="Object_Hemi_Sphere_Selected"
+ image_unselected="Object_Hemi_Sphere"
+ layout="topleft"
+ left_delta="29"
+ name="ToolHemiSphere"
+ tool_tip="Hemisphere"
+ top_delta="0"
+ width="20" />
+ <button
+ follows="left|top"
+ height="20"
+ image_disabled="Object_Torus"
+ image_disabled_selected="Object_Torus"
+ image_selected="Object_Torus_Selected"
+ image_unselected="Object_Torus"
+ layout="topleft"
+ left="10"
+ name="ToolTorus"
+ tool_tip="Torus"
+ top="77"
+ width="20" />
+ <button
+ follows="left|top"
+ height="20"
+ image_disabled="Object_Tube"
+ image_disabled_selected="Object_Tube"
+ image_selected="Object_Tube_Selected"
+ image_unselected="Object_Tube"
+ layout="topleft"
+ left_delta="29"
+ name="ToolTube"
+ tool_tip="Tube"
+ top_delta="0"
+ width="20" />
+ <button
+ follows="left|top"
+ height="20"
+ image_disabled="Object_Ring"
+ image_disabled_selected="Object_Ring"
+ image_selected="Object_Ring_Selected"
+ image_unselected="Object_Ring"
+ layout="topleft"
+ left_delta="29"
+ name="ToolRing"
+ tool_tip="Ring"
+ top_delta="0"
+ width="20" />
+ <button
+ follows="left|top"
+ height="20"
+ image_disabled="Object_Tree"
+ image_disabled_selected="Object_Tree"
+ image_selected="Object_Tree_Selected"
+ image_unselected="Object_Tree"
+ layout="topleft"
+ left_delta="29"
+ name="ToolTree"
+ tool_tip="Tree"
+ top_delta="0"
+ width="20" />
+ <button
+ follows="left|top"
+ height="20"
+ image_disabled="Object_Grass"
+ image_disabled_selected="Object_Grass"
+ image_selected="Object_Grass_Selected"
+ image_unselected="Object_Grass"
+ image_overlay_color="Red"
+ layout="topleft"
+ left_delta="29"
+ name="ToolGrass"
+ tool_tip="Grass"
+ top_delta="0"
+ width="20" />
+ <check_box
+ control_name="CreateToolKeepSelected"
+ height="19"
+ label="Keep Tool selected"
+ layout="topleft"
+ left="4"
+ name="checkbox sticky"
+ top="101"
+ width="128" />
+ <check_box
+ control_name="CreateToolCopySelection"
+ height="19"
+ label="Copy selection"
+ layout="topleft"
+ left_delta="0"
+ name="checkbox copy selection"
+ top_delta="15"
+ width="134" />
+ <check_box
+ control_name="CreateToolCopyCenters"
+ height="19"
+ initial_value="true"
+ label="Center Copy"
+ layout="topleft"
+ left_delta="18"
+ name="checkbox copy centers"
+ top="132"
+ width="134" />
+ <check_box
+ control_name="CreateToolCopyRotates"
+ height="19"
+ label="Rotate Copy"
+ layout="topleft"
+ left_delta="0"
+ name="checkbox copy rotates"
+ top_delta="16"
+ width="134" />
+ <radio_group
+ height="105"
+ layout="topleft"
+ left="4"
+ name="land_radio_group"
+ top="54"
+ width="114">
+ <radio_item
+ height="19"
+ label="Select Land"
+ layout="topleft"
+ left="0"
+ name="radio select land"
+ top="-106"
+ width="134" />
+ <radio_item
+ height="19"
+ label="Flatten"
+ layout="topleft"
+ left_delta="0"
+ name="radio flatten"
+ top_delta="15"
+ width="114" />
+ <radio_item
+ height="19"
+ label="Raise"
+ layout="topleft"
+ left_delta="0"
+ name="radio raise"
+ top_delta="15"
+ width="114" />
+ <radio_item
+ height="19"
+ label="Lower"
+ layout="topleft"
+ left_delta="0"
+ name="radio lower"
+ top_delta="15"
+ width="114" />
+ <radio_item
+ height="19"
+ label="Smooth"
+ layout="topleft"
+ left_delta="0"
+ name="radio smooth"
+ top_delta="15"
+ width="114" />
+ <radio_item
+ height="19"
+ label="Roughen"
+ layout="topleft"
+ left_delta="0"
+ name="radio noise"
+ top_delta="15"
+ width="114" />
+ <radio_item
+ height="19"
+ label="Revert"
+ layout="topleft"
+ left_delta="0"
+ name="radio revert"
+ top_delta="15"
+ width="114" />
+ <radio_group.commit_callback
+ function="BuildTool.commitRadioLand"/>
+ </radio_group>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="12"
+ layout="topleft"
+ left="135"
+ name="Bulldozer:"
+ top="57"
+ width="100">
+ Bulldozer:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="12"
+ layout="topleft"
+ name="Dozer Size:"
+ left="135"
+ top_pad="5"
+ width="50">
+ Size
+ </text>
+ <slider_bar
+ control_name ="LandBrushSize"
+ follows="left|top"
+ height="19"
+ initial_value="2.0"
+ layout="topleft"
+ max_val="11"
+ min_val="1"
+ left_pad="0"
+ name="slider brush size"
+ top_delta="-3"
+ width="80" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="12"
+ layout="topleft"
+ name="Strength:"
+ left="135"
+ top_pad="5"
+ width="50">
+ Strength
+ </text>
+ <slider_bar
+ follows="left|top"
+ height="19"
+ left_pad="0"
+ initial_value="0.00"
+ layout="topleft"
+ max_val="2"
+ min_val="-1"
+ name="slider force"
+ top_delta="-3"
+ width="80" >
+ <slider_bar.commit_callback
+ function="BuildTool.LandBrushForce"/>
+ </slider_bar>
+ <button
+ follows="left|top"
+ height="23"
+ label="Apply"
+ label_selected="Apply"
+ top_pad="5"
+ layout="topleft"
+ left="135"
+ name="button apply to selection"
+ tool_tip="Modify selected land"
+ width="82">
+ <button.commit_callback
+ function="BuildTool.applyToSelection"/>
+ </button>
+ <text
+ text_color="LtGray_50"
+ type="string"
+ length="1"
+ height="10"
+ follows="left|top"
+ halign="right"
+ layout="topleft"
+ right="-10"
+ name="obj_count"
+ top_pad="5"
+ width="143">
+ Objects: [COUNT]
+ </text>
+ <text
+ text_color="LtGray_50"
+ type="string"
+ length="1"
+ height="10"
+ follows="left|top"
+ halign="right"
+ layout="topleft"
+ right="-10"
+ name="prim_count"
+ width="143">
+ Prims: [COUNT]
+ </text>
+ <text
+ text_color="LtGray_50"
+ type="string"
+ length="1"
+ height="10"
+ follows="left|top"
+ halign="right"
+ layout="topleft"
+ right="-120"
+ name="linked_set_count"
+ top="144"
+ width="80">
+ Linked Sets: [COUNT]
+ </text>
+ <text
+ text_color="LtGray_50"
+ type="string"
+ length="1"
+ height="10"
+ follows="left|top"
+ halign="right"
+ layout="topleft"
+ top_delta="0"
+ right="-8"
+ name="linked_set_cost"
+ tool_tip="Cost of currently selected linked sets as [prims],[physics complexity]"
+ width="80">
+ Cost: [COST] / [PHYSICS]
+ </text>
+ <text
+ text_color="LtGray_50"
+ type="string"
+ length="1"
+ follows="left|top"
+ halign="right"
+ layout="topleft"
+ top_pad="5"
+ right="-120"
+ name="object_count"
+ width="80">
+ Objects: [COUNT]
+ </text>
+ <text
+ text_color="LtGray_50"
+ type="string"
+ length="1"
+ follows="left|top"
+ halign="right"
+ layout="topleft"
+ top_delta="0"
+ right="-8"
+ name="object_cost"
+ tool_tip="Cost of currently selected objects as [prims] / [physics complexity]"
+ width="80">
+ Cost: [COST] / [PHYSICS]
+ </text>
+ <!-- <text -->
+ <!-- text_color="LtGray_50" -->
+ <!-- type="string" -->
+ <!-- length="1" -->
+ <!-- height="10" -->
+ <!-- follows="left|top" -->
+ <!-- halign="right" -->
+ <!-- layout="topleft" -->
+ <!-- right="-10" -->
+ <!-- name="obj_count" -->
+ <!-- top_pad="5" -->
+ <!-- width="143"> -->
+ <!-- Objects: [COUNT] -->
+ <!-- </text> -->
+ <!-- <text -->
+ <!-- text_color="LtGray_50" -->
+ <!-- type="string" -->
+ <!-- length="1" -->
+ <!-- follows="left|top" -->
+ <!-- halign="right" -->
+ <!-- layout="topleft" -->
+ <!-- right="-10" -->
+ <!-- name="prim_count" -->
+ <!-- width="143"> -->
+ <!-- Prims: [COUNT] -->
+ <!-- </text> -->
+ <tab_container
+ follows="left|top"
+ height="410"
+ halign="center"
+ left="0"
+ name="Object Info Tabs"
+ tab_max_width="100"
+ tab_min_width="40"
+ tab_position="top"
+ tab_height="25"
+ top="173"
+ width="295">
+
+<panel
+ border="false"
+ follows="all"
+ label="General"
+ layout="topleft"
+ mouse_opaque="false"
+ help_topic="toolbox_general_tab"
+ name="General"
+ top="16"
+ width="295">
+ <panel.string
+ name="text deed continued">
+ Deed
+ </panel.string>
+ <panel.string
+ name="text deed">
+ Deed
+ </panel.string>
+ <panel.string
+ name="text modify info 1">
+ You can modify this object
+ </panel.string>
+ <panel.string
+ name="text modify info 2">
+ You can modify these objects
+ </panel.string>
+ <panel.string
+ name="text modify info 3">
+ You can't modify this object
+ </panel.string>
+ <panel.string
+ name="text modify info 4">
+ You can't modify these objects
+ </panel.string>
+ <panel.string
+ name="text modify warning">
+ You must select entire object to set permissions
+ </panel.string>
+ <panel.string
+ name="Cost Default">
+ Price: L$
+ </panel.string>
+ <panel.string
+ name="Cost Total">
+ Total Price: L$
+ </panel.string>
+ <panel.string
+ name="Cost Per Unit">
+ Price Per: L$
+ </panel.string>
+ <panel.string
+ name="Cost Mixed">
+ Mixed Price
+ </panel.string>
+ <panel.string
+ name="Sale Mixed">
+ Mixed Sale
+ </panel.string>
+ <text
+ follows="left|top"
+ height="10"
+ left="10"
+ name="Name:"
+ top="5"
+ width="90">
+ Name:
+ </text>
+ <line_editor
+ follows="left|top|right"
+ height="19"
+ left_pad="0"
+ max_length_bytes="63"
+ name="Object Name"
+ select_on_focus="true"
+ top_delta="0"
+ width="170" />
+ <text
+ follows="left|top"
+ height="10"
+ left="10"
+ name="Description:"
+ top_pad="3"
+ width="90">
+ Description:
+ </text>
+ <line_editor
+ follows="left|top|right"
+ height="19"
+ left_pad="0"
+ max_length_bytes="127"
+ name="Object Description"
+ select_on_focus="true"
+ top_delta="0"
+ width="170" />
+ <text
+ type="string"
+ left="10"
+ length="1"
+ follows="left|top"
+ height="19"
+ layout="topleft"
+ name="Creator:"
+ top_pad="7"
+ width="90">
+ Creator:
+ </text>
+ <!-- *NOTE: Intentionally wide for long names -->
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ left_pad="0"
+ height="20"
+ layout="topleft"
+ name="Creator Name"
+ top_delta="0"
+ translate="false"
+ width="190"
+ word_wrap="true"
+ use_ellipses="true">
+ TestString PleaseIgnore (please.ignore)
+ </text>
+ <text
+ type="string"
+ length="1"
+ left="10"
+ follows="left|top"
+ height="19"
+ layout="topleft"
+ name="Owner:"
+ top_pad="13"
+ width="90">
+ Owner:
+ </text>
+ <!-- *NOTE: Intentionally wide for long names -->
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ name="Owner Name"
+ left_pad="0"
+ top_delta="0"
+ translate="false"
+ width="190"
+ word_wrap="true"
+ use_ellipses="true">
+ TestString PleaseIgnore (please.ignore)
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left="10"
+ height="18"
+ name="Group:"
+ top_pad="17"
+ width="75">
+ Group:
+ </text>
+ <name_box
+ follows="left|top"
+ height="18"
+ initial_value="Loading..."
+ layout="topleft"
+ left_pad="23"
+ name="Group Name Proxy"
+ width="142" />
+ <button
+ follows="top|left"
+ height="23"
+ image_overlay="Edit_Wrench"
+ layout="topleft"
+ left_pad="13"
+ name="button set group"
+ tab_stop="false"
+ tool_tip="Choose a group to share this object's permissions"
+ width="23" />
+ <check_box
+ height="19"
+ follows="left|top"
+ label="Share"
+ layout="topleft"
+ name="checkbox share with group"
+ tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."
+ top_pad="10"
+ left="100"
+ width="87" />
+ <button
+ follows="top|left"
+ height="23"
+ label="Deed"
+ label_selected="Deed"
+ layout="topleft"
+ name="button deed"
+ left_pad="19"
+ tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."
+ width="80" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ top_pad="10"
+ left="10"
+ name="label click action"
+ width="118">
+ Click to:
+ </text>
+ <combo_box
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ name="clickaction"
+ width="148"
+ left_pad="10">
+ <combo_box.item
+ label="Touch (default)"
+ name="Touch/grab(default)"
+ value="Touch" />
+ <combo_box.item
+ label="Sit on object"
+ name="Sitonobject"
+ value="Sit" />
+ <combo_box.item
+ label="Buy object"
+ name="Buyobject"
+ value="Buy" />
+ <combo_box.item
+ label="Pay object"
+ name="Payobject"
+ value="Pay" />
+ <combo_box.item
+ label="Open"
+ name="Open"
+ value="Open" />
+ <combo_box.item
+ label="Zoom"
+ name="Zoom"
+ value="Zoom" />
+ </combo_box>
+ <check_box
+ height="23"
+ label="For Sale:"
+ layout="topleft"
+ name="checkbox for sale"
+ left="7"
+ width="100" />
+<!-- NEW SALE TYPE COMBO BOX -->
+ <combo_box
+ left_pad="10"
+ layout="topleft"
+ follows="left|top"
+ allow_text_entry="false"
+ height="23"
+ initial_value="2"
+ max_chars="20"
+ mouse_opaque="true"
+ name="sale type"
+ width="168">
+ <combo_box.item
+ name="Copy"
+ label="Copy"
+ value="2" />
+ <combo_box.item
+ name="Contents"
+ label="Contents"
+ value="3" />
+ <combo_box.item
+ name="Original"
+ label="Original"
+ value="1" />
+ </combo_box>
+<!-- NEW PRICE SPINNER
+Objects are allowed to be for sale for L$0 to invoke buy UI behavior
+even though the user gets a free copy.
+-->
+ <spinner
+ follows="left|top"
+ decimal_digits="0"
+ increment="1"
+ top_pad="8"
+ left="118"
+ control_name="Edit Cost"
+ name="Edit Cost"
+ label="Price: L$"
+ label_width="65"
+ width="165"
+ min_val="0"
+ height="20"
+ max_val="999999999" />
+ <check_box
+ height="15"
+ width="110"
+ top_pad="5"
+ label="Show in search"
+ layout="topleft"
+ left="100"
+ name="search_check"
+ tool_tip="Let people see this object in search results" />
+ <panel
+ border="false"
+ follows="left|top"
+ layout="topleft"
+ mouse_opaque="false"
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ name="perms_build"
+ left="0"
+ top_pad="4"
+ height="105"
+ width="290">
+ <text
+ type="string"
+ length="1"
+ left="10"
+ top_pad="9"
+ text_color="EmphasisColor"
+ height="16"
+ follows="left|top|right"
+ layout="topleft"
+ name="perm_modify"
+ width="264">
+ You can modify this object
+ </text>
+ <text
+ type="string"
+ follows="left|top"
+ name="Anyone can:"
+ width="250"
+ left="10">
+ Anyone:
+ </text>
+ <check_box
+ height="19"
+ label="Move"
+ layout="topleft"
+ name="checkbox allow everyone move"
+ left="10"
+ width="85" />
+ <check_box
+ height="19"
+ label="Copy"
+ layout="topleft"
+ left_pad="0"
+ name="checkbox allow everyone copy"
+ width="90" />
+ <text
+ type="string"
+ follows="left|top"
+ height="19"
+ name="Next owner can:"
+ width="250"
+ left="10">
+ Next owner:
+ </text>
+ <check_box
+ follows="left|top|right"
+ label="Modify"
+ layout="topleft"
+ left="10"
+ name="checkbox next owner can modify"
+ width="85" />
+ <check_box
+ follows="left|top|right"
+ height="19"
+ label="Copy"
+ layout="topleft"
+ left_pad="0"
+ name="checkbox next owner can copy"
+ width="80" />
+ <check_box
+ follows="left|top|right"
+ height="19"
+ label="Transfer"
+ layout="topleft"
+ name="checkbox next owner can transfer"
+ left_pad="0"
+ top_delta="0"
+ tool_tip="Next owner can give away or resell this object"
+ width="100" />
+<!-- *NOTE: These "B/O/G/E/N/F fields may overlap "perm_modify" above,
+ but that's OK, this is used only for debugging. -->
+ <text
+ type="string"
+ text_color="EmphasisColor"
+ length="1"
+ top="9"
+ follows="left|top"
+ layout="topleft"
+ left="230"
+ name="B:"
+ height="10"
+ width="80">
+ B:
+ </text>
+ <text
+ type="string"
+ text_color="White"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left_delta="0"
+ top_pad="2"
+ name="O:"
+ height="10"
+ width="80">
+ O:
+ </text>
+ <text
+ type="string"
+ text_color="EmphasisColor"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left_delta="0"
+ top_pad="2"
+ name="G:"
+ height="10"
+ width="80">
+ G:
+ </text>
+ <text
+ type="string"
+ text_color="White"
+ length="1"
+ follows="left|top"
+ left_delta="0"
+ top_pad="2"
+ layout="topleft"
+ name="E:"
+ height="10"
+ width="80">
+ E:
+ </text>
+ <text
+ type="string"
+ text_color="EmphasisColor"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left_delta="0"
+ top_pad="2"
+ name="N:"
+ height="10"
+ width="80">
+ N:
+ </text>
+ <text
+ type="string"
+ text_color="White"
+ length="1"
+ follows="left|top"
+ layout="topleft"
+ left_delta="0"
+ top_pad="2"
+ name="F:"
+ height="10"
+ width="80">
+ F:
+ </text>
+ </panel>
+ </panel>
+ <!-- Object tab -->
+ <panel
+ border="false"
+ follows="all"
+ height="567"
+ label="Object"
+ layout="topleft"
+ left_delta="0"
+ mouse_opaque="false"
+ help_topic="toolbox_object_tab"
+ name="Object"
+ top="16"
+ width="295">
+ <check_box
+ height="19"
+ label="Locked"
+ layout="topleft"
+ name="checkbox locked"
+ tool_tip="Prevents object from being moved or deleted. Frequently useful during building to avoid unintended edits."
+ top_pad="5"
+ left="10"
+ width="123" />
+ <check_box
+ height="19"
+ label="Physical"
+ layout="topleft"
+ name="Physical Checkbox Ctrl"
+ tool_tip="Allows object to be pushed and affected by gravity"
+ top_pad="0"
+ width="123" />
+ <check_box
+ height="19"
+ label="Temporary"
+ layout="topleft"
+ name="Temporary Checkbox Ctrl"
+ tool_tip="Causes object to be deleted 1 minute after creation"
+ top_pad="0"
+ width="123" />
+ <check_box
+ height="19"
+ label="Phantom"
+ layout="topleft"
+ name="Phantom Checkbox Ctrl"
+ tool_tip="Causes object to not collide with other objects or avatars"
+ top_pad="0"
+ width="123" />
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ name="label position"
+ top_pad="10"
+ width="121">
+ Position (meters)
+ </text>
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.01"
+ initial_value="0"
+ label="X"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ max_val="512"
+ min_val="-256"
+ name="Pos X"
+ text_enabled_color="1 0 0.3 .7"
+ top_pad="5"
+ width="87" />
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.01"
+ initial_value="0"
+ label="Y"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ max_val="512"
+ min_val="-256"
+ name="Pos Y"
+ text_enabled_color="EmphasisColor"
+ top_pad="3"
+ width="87" />
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.01"
+ initial_value="0"
+ label="Z"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ max_val="4096"
+ name="Pos Z"
+ text_enabled_color="0 0.8 1 .65"
+ top_pad="3"
+ width="87" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_delta="0"
+ name="label size"
+ top_pad="6"
+ width="121">
+ Size (meters)
+ </text>
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.01"
+ initial_value="0"
+ label="X"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ max_val="64"
+ min_val="0.01"
+ name="Scale X"
+ text_enabled_color="1 1 1 1"
+ top_pad="5"
+ width="87" />
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.01"
+ initial_value="0"
+ label="Y"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ max_val="64"
+ min_val="0.01"
+ name="Scale Y"
+ text_enabled_color="1 1 1 1"
+ top_pad="3"
+ width="87" />
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.01"
+ initial_value="0"
+ label="Z"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ max_val="64"
+ min_val="0.01"
+ name="Scale Z"
+ text_enabled_color="1 1 1 1"
+ top_pad="3"
+ width="87" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_delta="0"
+ name="label rotation"
+ top_pad="10"
+ width="121">
+ Rotation (degrees)
+ </text>
+ <spinner
+ decimal_digits="2"
+ follows="left|top"
+ height="19"
+ increment="1"
+ initial_value="0"
+ label="X"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ max_val="9999"
+ min_val="-9999"
+ name="Rot X"
+ text_enabled_color="1 1 1 1"
+ top_pad="5"
+ width="87" />
+ <spinner
+ decimal_digits="2"
+ follows="left|top"
+ height="19"
+ increment="1"
+ initial_value="0"
+ label="Y"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ max_val="9999"
+ min_val="-9999"
+ name="Rot Y"
+ text_enabled_color="1 1 1 1"
+ top_pad="3"
+ width="87" />
+ <spinner
+ decimal_digits="2"
+ follows="left|top"
+ height="19"
+ increment="1"
+ initial_value="0"
+ label="Z"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ max_val="9999"
+ min_val="-9999"
+ name="Rot Z"
+ text_enabled_color="1 1 1 1"
+ top_pad="3"
+ width="87" />
+ <!-- <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="125"
+ name="label basetype"
+ top="5"
+ width="150">
+ Prim Type
+ </text>-->
+ <combo_box
+ height="19"
+ layout="topleft"
+ name="comboBaseType"
+ top="6"
+ left="125"
+ width="150">
+ <combo_box.item
+ label="Box"
+ name="Box"
+ value="Box" />
+ <combo_box.item
+ label="Cylinder"
+ name="Cylinder"
+ value="Cylinder" />
+ <combo_box.item
+ label="Prism"
+ name="Prism"
+ value="Prism" />
+ <combo_box.item
+ label="Sphere"
+ name="Sphere"
+ value="Sphere" />
+ <combo_box.item
+ label="Torus"
+ name="Torus"
+ value="Torus" />
+ <combo_box.item
+ label="Tube"
+ name="Tube"
+ value="Tube" />
+ <combo_box.item
+ label="Ring"
+ name="Ring"
+ value="Ring" />
+ <combo_box.item
+ label="Sculpted"
+ name="Sculpted"
+ value="Sculpted" />
+ </combo_box>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_delta="0"
+ name="text cut"
+ top_pad="5"
+ width="150">
+ Path Cut (begin/end)
+ </text>
+ <spinner
+ follows="left|top"
+ height="16"
+ increment="0.025"
+ initial_value="0"
+ label="B"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ max_val="0.98"
+ name="cut begin"
+ top_pad="4"
+ width="68" />
+ <spinner
+ follows="left|top"
+ height="16"
+ increment="0.025"
+ initial_value="1"
+ label="E"
+ label_width="10"
+ layout="topleft"
+ left_pad="10"
+ min_val="0.02"
+ name="cut end"
+ top_delta="0"
+ width="68" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="125"
+ name="text hollow"
+ top_pad="6"
+ width="68">
+ Hollow
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="10"
+ name="text skew"
+ width="63">
+ Skew
+ </text>
+ <spinner
+ decimal_digits="1"
+ follows="left|top"
+ height="19"
+ increment="5"
+ initial_value="0"
+ layout="topleft"
+ left="125"
+ max_val="95"
+ name="Scale 1"
+ top_pad="4"
+ width="68" />
+ <spinner
+ decimal_digits="2"
+ follows="left|top"
+ height="19"
+ increment="0.05"
+ initial_value="0"
+ layout="topleft"
+ left_pad="10"
+ max_val="0.95"
+ min_val="-0.95"
+ name="Skew"
+ top_delta="0"
+ width="68" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="125"
+ name="Hollow Shape"
+ top_pad="4"
+ width="150">
+ Hollow Shape
+ </text>
+ <combo_box
+ height="23"
+ layout="topleft"
+ left_delta="0"
+ name="hole"
+ top_pad="-2"
+ width="150">
+ <combo_box.item
+ label="Default"
+ name="Default"
+ value="Default" />
+ <combo_box.item
+ label="Circle"
+ name="Circle"
+ value="Circle" />
+ <combo_box.item
+ label="Square"
+ name="Square"
+ value="Square" />
+ <combo_box.item
+ label="Triangle"
+ name="Triangle"
+ value="Triangle" />
+ </combo_box>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_delta="0"
+ name="text twist"
+ top_pad="5"
+ width="150">
+ Twist (begin/end)
+ </text>
+ <spinner
+ decimal_digits="0"
+ follows="left|top"
+ height="19"
+ increment="9"
+ initial_value="0"
+ label="B"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ max_val="180"
+ min_val="-180"
+ name="Twist Begin"
+ top_pad="4"
+ width="68" />
+ <spinner
+ decimal_digits="0"
+ follows="left|top"
+ height="19"
+ increment="9"
+ initial_value="0"
+ label="E"
+ label_width="10"
+ layout="topleft"
+ left_pad="10"
+ max_val="180"
+ min_val="-180"
+ name="Twist End"
+ top_delta="0"
+ width="68" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="125"
+ name="scale_taper"
+ top_pad="3"
+ width="150">
+ Taper
+ </text>
+ <text
+ visible="false"
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_delta="0"
+ name="scale_hole"
+ top_delta="0"
+ width="150">
+ Hole Size
+ </text>
+ <spinner
+ decimal_digits="2"
+ follows="left|top"
+ height="19"
+ increment="0.05"
+ initial_value="0"
+ label="X"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ min_val="-1"
+ name="Taper Scale X"
+ top_pad="4"
+ width="68" />
+ <spinner
+ decimal_digits="2"
+ follows="left|top"
+ height="19"
+ increment="0.05"
+ initial_value="0"
+ label="Y"
+ label_width="10"
+ layout="topleft"
+ left_pad="10"
+ min_val="-1"
+ name="Taper Scale Y"
+ top_delta="0"
+ width="68" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="125"
+ name="text topshear"
+ top_pad="3"
+ width="141">
+ Top Shear
+ </text>
+ <spinner
+ decimal_digits="2"
+ follows="left|top"
+ height="19"
+ increment="0.05"
+ initial_value="0"
+ label="X"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ max_val="0.5"
+ min_val="-0.5"
+ name="Shear X"
+ top_pad="4"
+ width="68" />
+ <spinner
+ decimal_digits="2"
+ follows="left|top"
+ height="19"
+ increment="0.05"
+ initial_value="0"
+ label="Y"
+ label_width="10"
+ layout="topleft"
+ left_pad="10"
+ max_val="0.5"
+ min_val="-0.5"
+ name="Shear Y"
+ top_delta="0"
+ width="68" />
+ <text
+ visible="false"
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="125"
+ name="advanced_cut"
+ top_pad="3"
+ width="150">
+ Profile Cut (begin/end)
+ </text>
+ <text
+ visible="false"
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_delta="0"
+ name="advanced_dimple"
+ top_delta="0"
+ width="150">
+ Dimple (begin/end)
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_delta="0"
+ name="advanced_slice"
+ top_delta="0"
+ width="150">
+ Slice (begin/end)
+ </text>
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.02"
+ initial_value="0"
+ label="B"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ max_val="0.98"
+ name="Path Limit Begin"
+ top_pad="3"
+ width="68" />
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.02"
+ initial_value="1"
+ label="E"
+ label_width="10"
+ layout="topleft"
+ left_pad="10"
+ min_val="0.02"
+ name="Path Limit End"
+ top_delta="0"
+ width="68" />
+ <text
+ visible="false"
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="125"
+ name="text taper2"
+ top_pad="3"
+ width="150">
+ Taper
+ </text>
+ <spinner
+ visible="false"
+ decimal_digits="2"
+ follows="left|top"
+ height="19"
+ increment="0.05"
+ initial_value="0"
+ label="X"
+ label_width="10"
+ layout="topleft"
+ left_delta="0"
+ min_val="-1"
+ name="Taper X"
+ top_pad="3"
+ width="68" />
+ <spinner
+ visible="false"
+ decimal_digits="2"
+ follows="left|top"
+ height="19"
+ increment="0.05"
+ initial_value="0"
+ label="Y"
+ label_width="10"
+ layout="topleft"
+ left_pad="10"
+ min_val="-1"
+ name="Taper Y"
+ top_delta="0"
+ width="68" />
+ <text
+ visible="false"
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="125"
+ name="text radius delta"
+ top_pad="2"
+ width="78">
+ Radius
+ </text>
+ <text
+ visible="false"
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_delta="78"
+ name="text revolutions"
+ width="68">
+ Revolutions
+ </text>
+ <spinner
+ visible="false"
+ follows="left|top"
+ height="19"
+ increment="0.05"
+ initial_value="0"
+ layout="topleft"
+ left="125"
+ min_val="-1"
+ name="Radius Offset"
+ top_pad="4"
+ width="68" />
+ <spinner
+ visible="false"
+ decimal_digits="2"
+ follows="left|top"
+ height="19"
+ initial_value="1"
+ layout="topleft"
+ left_pad="10"
+ max_val="4"
+ min_val="1"
+ name="Revolutions"
+ top_delta="0"
+ width="68" />
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="141"
+ label="Sculpt Texture"
+ layout="topleft"
+ left="125"
+ name="sculpt texture control"
+ tool_tip="Click to choose a picture"
+ top="70"
+ visible="false"
+ width="145" />
+ <check_box
+ height="19"
+ label="Mirror"
+ layout="topleft"
+ left_delta="0"
+ name="sculpt mirror control"
+ tool_tip="Flips sculpted prim along the X axis"
+ top_pad="8"
+ visible="false"
+ width="130" />
+ <check_box
+ height="19"
+ label="Inside-out"
+ layout="topleft"
+ left_delta="0"
+ name="sculpt invert control"
+ tool_tip="Inverts the sculpted prims normals, making it appear inside-out"
+ top_pad="4"
+ visible="false"
+ width="121" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_delta="0"
+ name="label sculpt type"
+ top_pad="10"
+ visible="false"
+ width="130">
+ Stitching type
+ </text>
+ <combo_box
+ height="19"
+ layout="topleft"
+ left_delta="0"
+ name="sculpt type control"
+ top_pad="4"
+ visible="false"
+ width="150">
+ <combo_box.item
+ label="(none)"
+ name="None"
+ value="None" />
+ <combo_box.item
+ label="Sphere"
+ name="Sphere"
+ value="Sphere" />
+ <combo_box.item
+ label="Torus"
+ name="Torus"
+ value="Torus" />
+ <combo_box.item
+ label="Plane"
+ name="Plane"
+ value="Plane" />
+ <combo_box.item
+ label="Cylinder"
+ name="Cylinder"
+ value="Cylinder" />
+ <combo_box.item
+ label="Mesh"
+ name="Mesh"
+ value="Mesh" />
+ </combo_box>
+ </panel>
+ <panel
+ border="false"
+ follows="all"
+ height="367"
+ label="Features"
+ layout="topleft"
+ left_delta="0"
+ mouse_opaque="false"
+ help_topic="toolbox_features_tab"
+ name="Features"
+ top_delta="0"
+ width="295">
+ <panel.string name="None">None</panel.string>
+ <panel.string name="Prim">Prim</panel.string>
+ <panel.string name="Convex Hull">Convex Hull</panel.string>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="select_single"
+ top="5"
+ width="252"
+ word_wrap="true">
+ Select only one primitive to edit features.
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="edit_object"
+ top="5"
+ width="252">
+ Edit object features:
+ </text>
+ <check_box
+ height="19"
+ label="Flexible Path"
+ layout="topleft"
+ left="10"
+ name="Flexible1D Checkbox Ctrl"
+ tool_tip="Allows object to flex about the Z axis (Client-side only)"
+ top_pad="20"
+ width="121" />
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="1"
+ initial_value="2"
+ label="Softness"
+ label_width="70"
+ layout="topleft"
+ left_delta="0"
+ max_val="3"
+ name="FlexNumSections"
+ top_pad="10"
+ width="128" />
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.5"
+ initial_value="0.3"
+ label="Gravity"
+ label_width="70"
+ layout="topleft"
+ left_delta="0"
+ max_val="10"
+ min_val="-10"
+ name="FlexGravity"
+ top_pad="4"
+ width="128" />
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.5"
+ initial_value="2"
+ label="Drag"
+ label_width="70"
+ layout="topleft"
+ left_delta="0"
+ max_val="10"
+ name="FlexFriction"
+ top_pad="4"
+ width="128" />
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.5"
+ initial_value="0"
+ label="Wind"
+ label_width="70"
+ layout="topleft"
+ left_delta="0"
+ max_val="10"
+ name="FlexWind"
+ top_pad="4"
+ width="128" />
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.5"
+ initial_value="1"
+ label="Tension"
+ label_width="70"
+ layout="topleft"
+ left_delta="0"
+ max_val="10"
+ name="FlexTension"
+ top_pad="4"
+ width="128" />
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.01"
+ initial_value="0"
+ label="Force X"
+ label_width="70"
+ layout="topleft"
+ left_delta="0"
+ max_val="10"
+ min_val="-10"
+ name="FlexForceX"
+ top_pad="4"
+ width="128" />
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.01"
+ initial_value="0"
+ label="Force Y"
+ label_width="70"
+ layout="topleft"
+ left_delta="0"
+ max_val="10"
+ min_val="-10"
+ name="FlexForceY"
+ top_pad="4"
+ width="128" />
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.01"
+ initial_value="0"
+ label="Force Z"
+ label_width="70"
+ layout="topleft"
+ left_delta="0"
+ max_val="10"
+ min_val="-10"
+ name="FlexForceZ"
+ top_pad="4"
+ width="128" />
+
+ <check_box
+ height="16"
+ label="Light"
+ layout="topleft"
+ left="10"
+ name="Light Checkbox Ctrl"
+ tool_tip="Causes object to emit light"
+ top_pad="15"
+ width="60" />
+ <color_swatch
+ can_apply_immediately="true"
+ color="0.5 0.5 0.5 1"
+ border.border_thickness="0"
+ follows="left|top"
+ height="50"
+ layout="topleft"
+ left_pad="10"
+ top_pad="-17"
+ name="colorswatch"
+ tool_tip="Click to open color picker"
+ width="40" />
+ <texture_picker
+ allow_no_texture="true"
+ top_delta="0"
+ can_apply_immediately="true"
+ default_image_name="Default"
+ follows="left|top"
+ height="48"
+ label=""
+ left_delta="57"
+ mouse_opaque="true"
+ name="light texture control"
+ tool_tip="Click to choose a projection image (only has effect with deferred rendering enabled)"
+ width="32" />
+ <spinner
+ follows="left|top"
+ height="19"
+ initial_value="0.5"
+ label="Intensity"
+ label_width="70"
+ layout="topleft"
+ left="10"
+ name="Light Intensity"
+ top_pad="3"
+ width="128" />
+ <spinner bottom_delta="0"
+ decimal_digits="3"
+ follows="left|top"
+ height="16"
+ increment="0.1"
+ initial_value="0.5"
+ label="FOV"
+ label_width="55"
+ left="144"
+ max_val="3"
+ min_val="0"
+ mouse_opaque="true"
+ name="Light FOV"
+ width="120" />
+ <spinner follows="left|top"
+ height="19"
+ initial_value="5"
+ label="Radius"
+ label_width="70"
+ layout="topleft"
+ left="10"
+ max_val="20"
+ name="Light Radius"
+ top_pad="3"
+ width="128" />
+ <spinner bottom_delta="0"
+ decimal_digits="3"
+ follows="left|top"
+ height="16"
+ increment="0.5"
+ initial_value="0.5"
+ label="Focus"
+ label_width="55"
+ left="144"
+ max_val="20"
+ min_val="-20"
+ mouse_opaque="true"
+ name="Light Focus"
+ width="120" />
+ <spinner follows="left|top"
+ height="19"
+ increment="0.25"
+ initial_value="1"
+ label="Falloff"
+ label_width="70"
+ layout="topleft"
+ left="10"
+ max_val="2"
+ name="Light Falloff"
+ top_pad="3"
+ width="128" />
+ <spinner bottom_delta="0"
+ decimal_digits="3"
+ follows="left|top"
+ height="16"
+ increment="0.05"
+ initial_value="1"
+ label="Ambiance"
+ label_width="55"
+ left="144"
+ max_val="1"
+ min_val="0"
+ mouse_opaque="true"
+ name="Light Ambiance"
+ width="120" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ name="label physicsshapetype"
+ top="38"
+ width="121">
+ Physics Shape Type:
+ </text>
+ <combo_box
+ height="19"
+ top_delta="15"
+ layout="topleft"
+ follows="left|top"
+ name="Physics Shape Type Combo Ctrl"
+ tool_tip="Choose the physics shape type"
+ width="108"/>
+ <combo_box
+ height="19"
+ layout="topleft"
+ name="material"
+ top_pad="5"
+ width="150">
+ <combo_box.item
+ label="Stone"
+ name="Stone"
+ value="Stone" />
+ <combo_box.item
+ label="Metal"
+ name="Metal"
+ value="Metal" />
+ <combo_box.item
+ label="Glass"
+ name="Glass"
+ value="Glass" />
+ <combo_box.item
+ label="Wood"
+ name="Wood"
+ value="Wood" />
+ <combo_box.item
+ label="Flesh"
+ name="Flesh"
+ value="Flesh" />
+ <combo_box.item
+ label="Plastic"
+ name="Plastic"
+ value="Plastic" />
+ <combo_box.item
+ label="Rubber"
+ name="Rubber"
+ value="Rubber" />
+ </combo_box>
+
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="1"
+ initial_value="1"
+ label="Gravity"
+ label_width="70"
+ layout="topleft"
+ min_val="-1"
+ max_val="28"
+ name="Physics Gravity"
+ top_pad="10"
+ width="132" />
+
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.1"
+ initial_value="0"
+ label="Friction"
+ label_width="70"
+ layout="topleft"
+ left_delta="0"
+ max_val="255"
+ min_val="0"
+ name="Physics Friction"
+ top_pad="4"
+ width="132" />
+
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.1"
+ initial_value="0"
+ label="Density"
+ label_width="70"
+ layout="topleft"
+ left_delta="0"
+ max_val="22587"
+ min_val="1"
+ name="Physics Density"
+ top_pad="4"
+ width="132" />
+
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.01"
+ initial_value="0"
+ label="Restitution"
+ label_width="70"
+ layout="topleft"
+ left_delta="0"
+ max_val="1"
+ min_val="0"
+ name="Physics Restitution"
+ top_pad="4"
+ width="132" />
+ </panel>
+ <panel
+ border="false"
+ follows="all"
+ height="367"
+ label="Texture"
+ layout="topleft"
+ left_delta="0"
+ mouse_opaque="false"
+ help_topic="toolbox_texture_tab"
+ name="Texture"
+ top_delta="0"
+ width="295">
+ <panel.string
+ name="string repeats per meter">
+ Repeats Per Meter
+ </panel.string>
+ <panel.string
+ name="string repeats per face">
+ Repeats Per Face
+ </panel.string>
+ <texture_picker
+ can_apply_immediately="true"
+ default_image_name="Default"
+ fallback_image="locked_image.j2c"
+ follows="left|top"
+ height="80"
+ label="Texture"
+ layout="topleft"
+ left="10"
+ name="texture control"
+ tool_tip="Click to choose a picture"
+ top="8"
+ width="64" />
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="80"
+ label="Color"
+ layout="topleft"
+ left_pad="15"
+ name="colorswatch"
+ tool_tip="Click to open color picker"
+ top_delta="0"
+ width="64" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="15"
+ name="color trans"
+ text_readonly_color="LabelDisabledColor"
+ top="6"
+ width="110">
+ Transparency %
+ </text>
+ <spinner
+ decimal_digits="0"
+ follows="left|top"
+ height="19"
+ increment="2"
+ initial_value="0"
+ layout="topleft"
+ left_delta="0"
+ max_val="100"
+ name="ColorTrans"
+ top_pad="4"
+ width="80" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_delta="0"
+ name="glow label"
+ text_readonly_color="LabelDisabledColor"
+ top_pad="8"
+ width="80">
+ Glow
+ </text>
+ <spinner
+ decimal_digits="2"
+ follows="left|top"
+ height="19"
+ initial_value="0"
+ layout="topleft"
+ left_delta="0"
+ name="glow"
+ top_pad="4"
+ width="80" />
+ <check_box
+ height="19"
+ label="Full Bright"
+ layout="topleft"
+ left_delta="-5"
+ name="checkbox fullbright"
+ top_pad="4"
+ width="81" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="tex gen"
+ text_readonly_color="LabelDisabledColor"
+ top_pad="5"
+ width="90">
+ Mapping
+ </text>
+ <combo_box
+ height="23"
+ layout="topleft"
+ left_delta="0"
+ name="combobox texgen"
+ top_pad="4"
+ width="90">
+ <combo_box.item
+ label="Default"
+ name="Default"
+ value="Default" />
+ <combo_box.item
+ label="Planar"
+ name="Planar"
+ value="Planar" />
+ </combo_box>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ name="label shininess"
+ left_pad="4"
+ text_readonly_color="LabelDisabledColor"
+ top_pad="-37"
+ width="90">
+ Shininess
+ </text>
+ <combo_box
+ height="23"
+ layout="topleft"
+ left_delta="0"
+ name="combobox shininess"
+ top_pad="4"
+ width="90">
+ <combo_box.item
+ label="None"
+ name="None"
+ value="None" />
+ <combo_box.item
+ label="Low"
+ name="Low"
+ value="Low" />
+ <combo_box.item
+ label="Medium"
+ name="Medium"
+ value="Medium" />
+ <combo_box.item
+ label="High"
+ name="High"
+ value="High" />
+ </combo_box>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="4"
+ name="label bumpiness"
+ text_readonly_color="LabelDisabledColor"
+ top_pad="-37"
+ width="90">
+ Bumpiness
+ </text>
+ <combo_box
+ height="23"
+ layout="topleft"
+ left_delta="0"
+ name="combobox bumpiness"
+ top_pad="4"
+ width="90">
+ <combo_box.item
+ label="None"
+ name="None"
+ value="None" />
+ <combo_box.item
+ label="Brightness"
+ name="Brightness"
+ value="Brightness" />
+ <combo_box.item
+ label="Darkness"
+ name="Darkness"
+ value="Darkness" />
+ <combo_box.item
+ label="woodgrain"
+ name="woodgrain"
+ value="woodgrain" />
+ <combo_box.item
+ label="bark"
+ name="bark"
+ value="bark" />
+ <combo_box.item
+ label="bricks"
+ name="bricks"
+ value="bricks" />
+ <combo_box.item
+ label="checker"
+ name="checker"
+ value="checker" />
+ <combo_box.item
+ label="concrete"
+ name="concrete"
+ value="concrete" />
+ <combo_box.item
+ label="crustytile"
+ name="crustytile"
+ value="crustytile" />
+ <combo_box.item
+ label="cutstone"
+ name="cutstone"
+ value="cutstone" />
+ <combo_box.item
+ label="discs"
+ name="discs"
+ value="discs" />
+ <combo_box.item
+ label="gravel"
+ name="gravel"
+ value="gravel" />
+ <combo_box.item
+ label="petridish"
+ name="petridish"
+ value="petridish" />
+ <combo_box.item
+ label="siding"
+ name="siding"
+ value="siding" />
+ <combo_box.item
+ label="stonetile"
+ name="stonetile"
+ value="stonetile" />
+ <combo_box.item
+ label="stucco"
+ name="stucco"
+ value="stucco" />
+ <combo_box.item
+ label="suction"
+ name="suction"
+ value="suction" />
+ <combo_box.item
+ label="weave"
+ name="weave"
+ value="weave" />
+ </combo_box>
+ <!--
+ <line_editor
+ bevel_style="in"
+ border_style="line"
+ border_thickness="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ max_length_bytes="63"
+ name="Home Url"
+ select_on_focus="true"
+ top="134"
+ width="250" />
+ <check_box
+ height="16"
+ label="Media Face"
+ layout="topleft"
+ left_delta="0"
+ name="has media"
+ top_pad="6"
+ width="70" />
+ <button
+ follows="left|top"
+ font="SansSerifSmall"
+ height="20"
+ label="Set Media Info"
+ label_selected="Set Media Info"
+ layout="topleft"
+ left_pad="60"
+ name="media info set"
+ top_delta="-4"
+ width="120" />
+-->
+ <check_box
+ follows="top|left"
+ height="16"
+ initial_value="false"
+ label="Align planar faces"
+ layout="topleft"
+ left="17"
+ name="checkbox planar align"
+ tool_tip="Align textures on all selected faces with the last selected face. Requires Planar texture mapping."
+ top_delta="26"
+ width="140" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="rpt"
+ text_readonly_color="LabelDisabledColor"
+ top_pad="2"
+ width="140">
+ Repeats / Face
+ </text>
+ <spinner
+ follows="left|top"
+ height="19"
+ initial_value="0"
+ label="Horizontal (U)"
+ label_width="125"
+ layout="topleft"
+ left="20"
+ max_val="100"
+ name="TexScaleU"
+ top_pad="5"
+ width="185" />
+ <check_box
+ height="19"
+ label="Flip"
+ layout="topleft"
+ left_pad="5"
+ name="checkbox flip s"
+ top_delta="0"
+ width="70" />
+ <spinner
+ follows="left|top"
+ height="19"
+ initial_value="0"
+ label="Vertical (V)"
+ label_width="125"
+ layout="topleft"
+ left="20"
+ max_val="100"
+ name="TexScaleV"
+ width="185" />
+ <check_box
+ height="19"
+ label="Flip"
+ layout="topleft"
+ left_pad="5"
+ name="checkbox flip t"
+ top_delta="0"
+ width="70" />
+ <spinner
+ decimal_digits="2"
+ follows="left|top"
+ height="19"
+ increment="1"
+ initial_value="0"
+ label="RotationËš"
+ layout="topleft"
+ label_width="135"
+ left="10"
+ max_val="9999"
+ min_val="-9999"
+ name="TexRot"
+ width="195" />
+
+ <spinner
+ decimal_digits="1"
+ follows="left|top"
+ height="23"
+ initial_value="1"
+ label="Repeats / Meter"
+ layout="topleft"
+ label_width="135"
+ left="10"
+ max_val="10"
+ min_val="0.1"
+ name="rptctrl"
+ width="195" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Apply"
+ label_selected="Apply"
+ layout="topleft"
+ left_pad="5"
+ name="button apply"
+ width="75" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="tex offset"
+ text_readonly_color="LabelDisabledColor"
+ width="200">
+ Texture Offset
+ </text>
+ <spinner
+ follows="left|top"
+ height="19"
+ initial_value="0"
+ label="Horizontal (U)"
+ label_width="125"
+ layout="topleft"
+ left="20"
+ min_val="-1"
+ name="TexOffsetU"
+ width="185" />
+ <spinner
+ follows="left|top"
+ height="19"
+ initial_value="0"
+ label="Vertical (V)"
+ label_width="125"
+ layout="topleft"
+ left_delta="0"
+ min_val="-1"
+ name="TexOffsetV"
+ top_pad="1"
+ width="185" />
+ <panel
+ border="false"
+ follows="left|top"
+ layout="topleft"
+ mouse_opaque="false"
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ name="Add_Media"
+ left="0"
+ height="47"
+ width="290">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="18"
+ layout="topleft"
+ left="10"
+ top_pad="3"
+ name="media_tex"
+ width="190">
+ Media
+ </text>
+ <button
+ follows="top|left"
+ height="18"
+ image_selected="AddItem_Press"
+ image_unselected="AddItem_Off"
+ image_disabled="AddItem_Disabled"
+ layout="topleft"
+ left_pad="0"
+ name="add_media"
+ tab_stop="false"
+ top_delta="0"
+ tool_tip="Add Media"
+ width="18">
+ <button.commit_callback
+ function="BuildTool.AddMedia"/>
+ </button>
+ <button
+ follows="top|left"
+ height="18"
+ image_selected="TrashItem_Press"
+ image_unselected="TrashItem_Off"
+ layout="topleft"
+ left_pad="5"
+ name="delete_media"
+ tool_tip="Delete this media texture"
+ top_delta="0"
+ width="18">
+ <button.commit_callback
+ function="BuildTool.DeleteMedia"/>
+ </button>
+ <button
+ follows="top|left"
+ tool_tip="Edit this Media"
+ height="12"
+ image_disabled="Icon_Gear_Background"
+ image_selected="Icon_Gear_Press"
+ image_unselected="Icon_Gear_Foreground"
+ layout="topleft"
+ left_pad="10"
+ name="edit_media"
+ top_delta="3"
+ width="12">
+ <button.commit_callback
+ function="BuildTool.EditMedia"/>
+ </button>
+ <text
+ follows="left|top|right"
+ height="9"
+ layout="topleft"
+ left="10"
+ use_ellipses="true"
+ read_only="true"
+ name="media_info"
+ width="280" />
+ <web_browser
+ visible="false"
+ enabled="false"
+ border_visible="true"
+ bottom_delta="0"
+ follows="top|left"
+ left="0"
+ name="title_media"
+ width="4"
+ height="4"
+ start_url="about:blank"
+ decouple_texture_size="true" />
+ <button
+ follows="right|top"
+ height="22"
+ label="Align"
+ label_selected="Align Media"
+ layout="topleft"
+ right="-16"
+ name="button align"
+ top_delta="-4"
+ tool_tip="Align media texture (must load first)"
+ width="80" />
+ </panel>
+ </panel>
+ <panel
+ border="false"
+ follows="all"
+ label="Content"
+ layout="topleft"
+ left_delta="0"
+ mouse_opaque="false"
+ help_topic="toolbox_contents_tab"
+ name="Contents"
+ top_delta="0"
+ width="295">
+ <button
+ follows="left|top"
+ height="23"
+ label="New Script"
+ label_selected="New Script"
+ layout="topleft"
+ left="10"
+ name="button new script"
+ top="10"
+ width="134" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Permissions"
+ layout="topleft"
+ left_pad="8"
+ name="button permissions"
+ width="134" />
+ <panel_inventory_object
+ border="true"
+ border_visible="true"
+ bevel_style="in"
+ follows="left|top|right"
+ height="325"
+ layout="topleft"
+ left="10"
+ name="contents_inventory"
+ top="50"
+ width="275" />
+ </panel>
+ </tab_container>
+ <panel
+ follows="left|top"
+ height="384"
+ layout="topleft"
+ left_delta="0"
+ name="land info panel"
+ top_delta="0"
+ width="295">
+ <text
+ type="string"
+ length="1"
+ font="SansSerifBig"
+ follows="left|top"
+ height="19"
+ layout="topleft"
+ left="20"
+ name="label_parcel_info"
+ top="24"
+ width="240">
+ Parcel Information
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="19"
+ layout="topleft"
+ left="30"
+ name="label_area_price"
+ top="48"
+ width="150">
+ Price: L$[PRICE] for [AREA] m²
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="19"
+ layout="topleft"
+ left_delta="0"
+ name="label_area"
+ top_delta="0"
+ width="150">
+ Area: [AREA] m²
+ </text>
+ <button
+ follows="left|top"
+ height="23"
+ label="About Land"
+ label_selected="About Land"
+ layout="topleft"
+ left_delta="0"
+ name="button about land"
+ top_pad="4"
+ width="125" />
+ <check_box
+ control_name="ShowParcelOwners"
+ height="19"
+ label="Show owners"
+ layout="topleft"
+ left_delta="0"
+ name="checkbox show owners"
+ tool_tip="Colorize the parcels according to the type of owner: Green = Your land Aqua = Your group's land Red = Owned by others Yellow = For sale Purple = For auction Grey = Public"
+ top_pad="8"
+ width="205" />
+ <text
+ type="string"
+ length="1"
+ font="SansSerifBig"
+ follows="left|top"
+ height="19"
+ layout="topleft"
+ left="20"
+ name="label_parcel_modify"
+ top="152"
+ width="240">
+ Modify Parcel
+ </text>
+ <button
+ follows="left|top"
+ height="23"
+ label="Subdivide"
+ label_selected="Subdivide"
+ layout="topleft"
+ left="30"
+ name="button subdivide land"
+ top="172"
+ width="125" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Join"
+ label_selected="Join"
+ layout="topleft"
+ left_delta="0"
+ name="button join land"
+ top_pad="4"
+ width="125" />
+ <text
+ type="string"
+ length="1"
+ font="SansSerifBig"
+ follows="left|top"
+ height="19"
+ layout="topleft"
+ left="20"
+ name="label_parcel_trans"
+ top="256"
+ width="240">
+ Land Transactions
+ </text>
+ <button
+ follows="left|top"
+ height="23"
+ label="Buy Land"
+ label_selected="Buy Land"
+ layout="topleft"
+ left="30"
+ name="button buy land"
+ top="276"
+ width="125" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Abandon Land"
+ label_selected="Abandon Land"
+ layout="topleft"
+ left_delta="0"
+ name="button abandon land"
+ top_pad="4"
+ width="125" />
+ </panel>
+<!-- end of tabs -->
+</floater>
diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index e5ae0b950a..3ead67ca57 100644 --- a/indra/newview/skins/default/xui/en/main_view.xml +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -8,12 +8,6 @@ tab_stop="false" name="main_view" width="1024"> - <panel top="0" - follows="all" - height="768" - mouse_opaque="false" - name="login_panel_holder" - width="1024"/> <layout_stack border_size="0" follows="all" mouse_opaque="false" @@ -133,7 +127,14 @@ user_resize="false" visible="false" width="333"/> - </layout_stack> + </layout_stack> + <panel top="0" + follows="all" + height="500" + mouse_opaque="false" + name="login_panel_holder" + width="1024"/> + <panel follows="all" height="500" left="0" @@ -171,6 +172,7 @@ top="0" width="1024" visible="false"/> + <view mouse_opaque="false" follows="all" name="menu_bar_holder" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 4bfb140d12..81046e99a0 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -2348,6 +2348,16 @@ function="Advanced.ToggleInfoDisplay" parameter="raycast" /> </menu_item_check> + <menu_item_check + label="Sculpt" + name="Sculpt"> + <menu_item_check.on_check + function="Advanced.CheckInfoDisplay" + parameter="sculpt" /> + <menu_item_check.on_click + function="Advanced.ToggleInfoDisplay" + parameter="sculpt" /> + </menu_item_check> </menu> <menu create_jump_keys="true" @@ -2768,7 +2778,7 @@ <menu_item_call label="Web Content Browser" name="Web Content Browser" - shortcut="control|alt|W"> + shortcut="control|shift|Z"> <menu_item_call.on_click function="Advanced.WebContentTest" parameter="http://google.com"/> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 2335ab3c11..ebfed990ec 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6836,6 +6836,34 @@ Deed to group failed. <notification icon="notifytip.tga" + name="ReleaseLandThrottled" + type="notifytip"> +The parcel [PARCEL_NAME] can not be abandoned at this time. + <tag>fail</tag> + </notification> + + <notification + icon="notifytip.tga" + name="ReleasedLandWithReclaim" + type="notifytip"> +The [AREA] m² parcel '[PARCEL_NAME]' has been released. + +You will have [RECLAIM_PERIOD] hours to reclaim for L$0 before it is set for sale to anyone. + <tag>fail</tag> + </notification> + + <notification + icon="notifytip.tga" + name="ReleasedLandNoReclaim" + type="notifytip"> +The [AREA] m² parcel '[PARCEL_NAME]' has been released. + +It is now available for purchase by anyone. + <tag>fail</tag> + </notification> + + <notification + icon="notifytip.tga" name="AvatarRezNotification" type="notifytip"> ( [EXISTENCE] seconds alive ) @@ -7164,6 +7192,20 @@ The site at '<nolink>[HOST_NAME]</nolink>' in realm ' </notification> <notification + name="NoPlaceInfo" + label="" + type="alertmodal" + unique="true"> + <tag>fail</tag> + <tag>confirm</tag> + Viewing place profile is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen. + <usetemplate + name="okcancelbuttons" + yestext="Quit" + notext="Don't Quit"/> + </notification> + + <notification name="NoPicks" label="" type="alertmodal" @@ -7275,8 +7317,6 @@ The site at '<nolink>[HOST_NAME]</nolink>' in realm ' notext="Don't Quit"/> </notification> - </global> - <global name="UnsupportedGLRequirements"> You do not appear to have the proper hardware requirements for [APP_NAME]. [APP_NAME] requires an OpenGL graphics card that has multitexture support. If this is the case, you may want to make sure that you have the latest drivers for your graphics card, and service packs and patches for your operating system. diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index a6e5e7a219..c8f8d07701 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -47,13 +47,13 @@ mouse_opaque="false" name="chat_bar_layout_panel" user_resize="true" - width="250" > + width="310" > <panel name="chat_bar" filename="panel_nearby_chat_bar.xml" left="0" height="28" - width="248" + width="308" top="0" mouse_opaque="false" follows="left|right" @@ -341,7 +341,7 @@ Disabled for now. height="28" layout="topleft" min_height="28" - min_width="62" + min_width="52" mouse_opaque="false" name="mini_map_btn_panel" user_resize="false" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index 404537e1f2..cdc462109c 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -150,7 +150,7 @@ top_pad="20" left="30" height="10" - width="180"> + width="400"> Enable incoming chat popups: </text> <check_box diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index 9ecab1a356..f20ce52125 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -204,8 +204,7 @@ name="LocalLights" top_pad="1" width="256" /> - width="256" /> - <check_box + <check_box control_name="VertexShaderEnable" height="16" initial_value="true" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index f89494da72..e374c89f21 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -479,163 +479,12 @@ width="190"> </button> <panel - background_visible="false" - bg_alpha_color="DkGray" + layout="topleft" + filename="panel_sound_devices.xml" visiblity_control="ShowDeviceSettings" - border="false" - follows="top|left" - height="100" - label="Device Settings" - layout="topleft" - left_delta="-2" name="device_settings_panel" - class="panel_voice_device_settings" - width="470" - top_pad="0"> - <panel.string - name="default_text"> - Default - </panel.string> - <panel.string - name="default system device"> - Default system device - </panel.string> - <panel.string - name="no device"> - No device - </panel.string> - <icon - height="18" - image_name="Microphone_On" - left_delta="4" - name="microphone_icon" - mouse_opaque="false" - top="7" - visible="true" - width="18" /> - <text - type="string" - length="1" - font.style="BOLD" - follows="left|top" - height="16" - layout="topleft" - left_pad="3" - name="Input" - width="70"> - Input - </text> - <combo_box - height="23" - control_name="VoiceInputAudioDevice" - layout="topleft" - left_pad="0" - max_chars="128" - name="voice_input_device" - top_delta="-5" - width="200" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left_delta="-70" - name="My volume label" - top_pad="4" - width="200"> - My volume: - </text> - <slider_bar - control_name="AudioLevelMic" - follows="left|top" - height="17" - increment="0.025" - initial_value="1.0" - layout="topleft" - left_delta="-6" - max_val="2" - name="mic_volume_slider" - tool_tip="Change the volume using this slider" - top_pad="-1" - width="220" /> - <text - type="string" - text_color="EmphasisColor" - length="1" - follows="left|top" - height="18" - layout="topleft" - left_pad="5" - name="wait_text" - top_delta="-1" - width="110"> - Please wait - </text> - <locate - height="20" - layout="topleft" - left_delta="0" - name="bar0" - top_delta="-2" - width="20" /> - <locate - height="20" - layout="topleft" - left_pad="5" - name="bar1" - top_delta="0" - width="20" /> - <locate - height="20" - layout="topleft" - left_pad="5" - name="bar2" - top_delta="0" - width="20" /> - <locate - height="20" - layout="topleft" - left_pad="5" - name="bar3" - top_delta="0" - width="20" /> - <locate - height="20" - layout="topleft" - left_pad="5" - name="bar4" - top_delta="0" - width="20" /> - <icon - height="18" - image_name="Parcel_Voice_Light" - left="5" - name="speaker_icon" - mouse_opaque="false" - top_pad="3" - visible="true" - width="22" /> - <text - font.style="BOLD" - type="string" - length="1" - follows="left|top" - height="15" - layout="topleft" - left_pad="0" - name="Output" - width="70"> - Output - </text> - <combo_box - control_name="VoiceOutputAudioDevice" - height="23" - layout="topleft" - left_pad="0" - max_chars="128" - name="voice_output_device" - top_delta="-3" - width="200" /> - </panel> + top="314" + width="345" + left="18" + class="panel_voice_device_settings"/> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_sound_devices.xml b/indra/newview/skins/default/xui/en/panel_sound_devices.xml new file mode 100644 index 0000000000..ccae7c5350 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_sound_devices.xml @@ -0,0 +1,155 @@ +<panel + background_visible="false" + bg_alpha_color="DkGray" + follows="all" + height="200" + label="Device Settings" + layout="topleft" + name="device_settings_panel" + width="360"> + <panel.string + name="default_text"> + Default + </panel.string> + <icon + height="18" + image_name="Microphone_On" + left_delta="4" + name="microphone_icon" + mouse_opaque="false" + top="7" + layout="topleft" + visible="true" + width="18" /> + <text + type="string" + length="1" + font.style="BOLD" + follows="left|top" + height="16" + layout="topleft" + left_pad="3" + name="Input" + width="70"> + Input + </text> + <combo_box + height="23" + control_name="VoiceInputAudioDevice" + follows="left|top" + layout="topleft" + left_pad="0" + max_chars="128" + name="voice_input_device" + top_delta="-5" + width="200" /> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left_delta="-70" + name="My volume label" + top_pad="4" + width="200"> + My volume: + </text> + <slider_bar + control_name="AudioLevelMic" + follows="top|right|left" + height="17" + increment="0.025" + initial_value="1.0" + layout="topleft" + left_delta="-6" + max_val="2" + name="mic_volume_slider" + tool_tip="Change the volume using this slider" + top_pad="-1" + width="220" /> + <text + type="string" + text_color="EmphasisColor" + length="1" + follows="right|top" + height="18" + layout="topleft" + left_pad="5" + name="wait_text" + top_delta="-1" + width="110"> + Please wait + </text> + <locate + follows="right|top" + height="20" + layout="topleft" + left_delta="0" + name="bar0" + top_delta="-2" + width="20" /> + <locate + follows="right|top" + height="20" + layout="topleft" + left_pad="5" + name="bar1" + top_delta="0" + width="20" /> + <locate + follows="right|top" + height="20" + layout="topleft" + left_pad="5" + name="bar2" + top_delta="0" + width="20" /> + <locate + follows="right|top" + height="20" + layout="topleft" + left_pad="5" + name="bar3" + top_delta="0" + width="20" /> + <locate + follows="right|top" + height="20" + layout="topleft" + left_pad="5" + name="bar4" + top_delta="0" + width="20" /> + <icon + height="18" + image_name="Parcel_Voice_Light" + left="5" + name="speaker_icon" + mouse_opaque="false" + top_pad="3" + visible="true" + width="22" /> + <text + font.style="BOLD" + type="string" + length="1" + follows="left|top" + height="15" + layout="topleft" + left_pad="0" + name="Output" + width="70"> + Output + </text> + <combo_box + control_name="VoiceOutputAudioDevice" + height="23" + follows="left|top" + layout="topleft" + left_pad="0" + max_chars="128" + name="voice_output_device" + top_delta="-3" + width="200" /> +</panel> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 2eb3cd7397..2a6af23d3a 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -58,6 +58,83 @@ <string name="Quit">Quit</string> <string name="create_account_url">http://join.secondlife.com/</string> + <string name="LoginFailedViewerNotPermitted">
+The viewer you are using can no longer access Second Life. Please visit the following page to download a new viewer:
+http://secondlife.com/download
+
+For more information, see our FAQ below:
+http://secondlife.com/viewer-access-faq</string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">Optional viewer update available: [VERSION]</string>
+ <string name="LoginFailedRequiredUpdate">Required viewer update: [VERSION]</string>
+ <string name="LoginFailedAlreadyLoggedIn">This agent is already logged in.
+</string>
+ <string name="LoginFailedAuthenticationFailed">Sorry! We couldn't log you in.
+Please check to make sure you entered the right
+ * Username (like bobsmith12 or steller.sunshine)
+ * Password
+Also, please make sure your Caps Lock key is off.</string>
+ <string name="LoginFailedPasswordChanged">As a security precaution your password has been changed.
+Please go to your account page at http://secondlife.com/password
+and answer the security question to reset your password.
+We are very sorry for the inconvenience.</string>
+ <string name="LoginFailedPasswordReset">We made some changes to our system and you will need to reset your password.
+Please go to your account page at http://secondlife.com/password
+and answer the security question to reset your password.
+We are very sorry for the inconvenience.</string>
+ <string name="LoginFailedEmployeesOnly">Second Life is temporarily closed for maintenance.
+Logins are currently restricted to employees only.
+Check www.secondlife.com/status for updates.</string>
+ <string name="LoginFailedPremiumOnly">Second Life logins are temporarily restricted in order to make sure that those in-world have the best possible experience.
+
+People with free accounts will not be able to access Second Life during this time, to make room for those who have paid for Second Life.</string>
+ <string name="LoginFailedComputerProhibited">Second Life cannot be accessed from this computer.
+If you feel this is an error, please contact
+support@secondlife.com.</string>
+ <string name="LoginFailedAcountSuspended">Your account is not accessible until
+[TIME] Pacific Time.</string>
+ <string name="LoginFailedAccountDisabled">We are unable to complete your request at this time.
+Please contact Second Life support for assistance at http://secondlife.com/support.
+If you are unable to change your password, please call (866) 476-9763.</string>
+ <string name="LoginFailedTransformError">Data inconsistency found during login.
+Please contact support@secondlife.com.</string>
+ <string name="LoginFailedAccountMaintenance">Your account is undergoing minor maintenance.
+Your account is not accessible until
+[TIME] Pacific Time.
+If you feel this is an error, please contact support@secondlife.com.</string>
+ <string name="LoginFailedPendingLogoutFault">Request for logout responded with a fault from simulator.</string>
+ <string name="LoginFailedPendingLogout">The system is logging you out right now.
+Your Account will not be available until
+[TIME] Pacific Time.</string>
+ <string name="LoginFailedUnableToCreateSession">Unable to create valid session.</string>
+ <string name="LoginFailedUnableToConnectToSimulator">Unable to connect to a simulator.</string>
+ <string name="LoginFailedRestrictedHours">Your account can only access Second Life
+between [START] and [END] Pacific Time.
+Please come back during those hours.
+If you feel this is an error, please contact support@secondlife.com.</string>
+ <string name="LoginFailedIncorrectParameters">Incorrect parameters.
+If you feel this is an error, please contact support@secondlife.com.</string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">First name parameter must be alphanumeric.
+If you feel this is an error, please contact support@secondlife.com.</string>
+ <string name="LoginFailedLastNameNotAlphanumeric">Last name parameter must be alphanumeric.
+If you feel this is an error, please contact support@secondlife.com.</string>
+ <string name="LogoutFailedRegionGoingOffline">Region is going offline.
+Please try logging in again in a minute.</string>
+ <string name="LogoutFailedAgentNotInRegion">Agent not in region.
+Please try logging in again in a minute.</string>
+ <string name="LogoutFailedPendingLogin">The region was logging in another session.
+Please try logging in again in a minute.</string>
+ <string name="LogoutFailedLoggingOut">The region was logging out the previous session.
+Please try logging in again in a minute.</string>
+ <string name="LogoutFailedStillLoggingOut">The region is still logging out the previous session.
+Please try logging in again in a minute.</string>
+ <string name="LogoutSucceeded">Region has logged out last session.
+Please try logging in again in a minute.</string>
+ <string name="LogoutFailedLogoutBegun">Region has begun the logout process.
+Please try logging in again in a minute.</string>
+ <string name="LoginFailedLoggingOutSession">The system has begun logging out your last session.
+Please try logging in again in a minute.</string>
+ + <!-- Disconnection --> <string name="AgentLostConnection">This region may be experiencing trouble. Please check your connection to the Internet.</string> <string name="SavingSettings">Saving your settings...</string> diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml index 99807d4717..d27c14f4e7 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml @@ -21,6 +21,7 @@ width="20" /> <chiclet_im_p2p.avatar_icon bottom="3" + color="white" follows="left|top|bottom" height="20" left="2" diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml index 3df0f92842..9ec9fcc581 100644 --- a/indra/newview/skins/default/xui/es/floater_about_land.xml +++ b/indra/newview/skins/default/xui/es/floater_about_land.xml @@ -1,484 +1,484 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterland" title="ACERCA DEL TERRENO"> - <floater.string name="maturity_icon_general"> - "Parcel_PG_Dark" - </floater.string> - <floater.string name="maturity_icon_moderate"> - "Parcel_M_Dark" - </floater.string> - <floater.string name="maturity_icon_adult"> - "Parcel_R_Dark" - </floater.string> - <floater.string name="Minutes"> - [MINUTES] minutos - </floater.string> - <floater.string name="Minute"> - minuto - </floater.string> - <floater.string name="Seconds"> - [SECONDS] segundos - </floater.string> - <floater.string name="Remaining"> - restantes - </floater.string> - <tab_container name="landtab"> - <panel label="GENERAL" name="land_general_panel"> - <panel.string name="new users only"> - Sólo nuevos Residentes - </panel.string> - <panel.string name="anyone"> - Cualquiera - </panel.string> - <panel.string name="area_text"> - Superficie - </panel.string> - <panel.string name="area_size_text"> - [AREA] m² - </panel.string> - <panel.string name="auction_id_text"> - ID de la subasta: [ID] - </panel.string> - <panel.string name="need_tier_to_modify"> - Debe aprobar su compra para modificar este terreno. - </panel.string> - <panel.string name="group_owned_text"> - (Propiedad del grupo) - </panel.string> - <panel.string name="profile_text"> - Perfil... - </panel.string> - <panel.string name="info_text"> - Información... - </panel.string> - <panel.string name="public_text"> - (público) - </panel.string> - <panel.string name="none_text"> - (ninguno) - </panel.string> - <panel.string name="sale_pending_text"> - (Venta pendiente) - </panel.string> - <panel.string name="no_selection_text"> - No se ha seleccionado una parcela. -Vaya al menú Mundo > Acerca del terreno o seleccione otra parcela para ver sus caracterÃsticas. - </panel.string> - <panel.string name="time_stamp_template"> - [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] - </panel.string> - <text name="Name:"> - Nombre: - </text> - <text name="Description:"> - Descripción: - </text> - <text name="LandType"> - Tipo: - </text> - <text name="LandTypeText"> - Mainland / Homestead - </text> - <text name="ContentRating"> - Calificación: - </text> - <text name="ContentRatingText"> - 'Adult' - </text> - <text name="Owner:"> - Propietario: - </text> - <text name="Group:"> - Grupo: - </text> - <button label="Configurar" name="Set..."/> - <check_box label="Permitir transferir al grupo" name="check deed" tool_tip="Un oficial del grupo puede transferir este terreno al grupo. El terreno será apoyado por el grupo en sus asignaciones de terreno."/> - <button label="Transferir" name="Deed..." tool_tip="Sólo si es usted un oficial del grupo seleccionado puede transferir terreno."/> - <check_box label="El propietario hace una contribución transfiriendo" name="check contrib" tool_tip="Cuando el terreno se transfiere al grupo, el antiguo propietario contribuye con una asignación suficiente de terreno."/> - <text name="For Sale:"> - En venta: - </text> - <text name="Not for sale."> - No está en venta. - </text> - <text name="For Sale: Price L$[PRICE]."> - Precio: [PRICE] L$ ([PRICE_PER_SQM] L$/m²). - </text> - <button label="Vender el terreno" name="Sell Land..."/> - <text name="For sale to"> - En venta a: [BUYER] - </text> - <text name="Sell with landowners objects in parcel." width="216"> - Los objetos se incluyen en la venta. - </text> - <text name="Selling with no objects in parcel." width="216"> - Los objetos no se incluyen en la venta. - </text> - <button bottom="-245" font="SansSerifSmall" label="Cancelar la venta del terreno" label_selected="Cancelar la venta del terreno" left="275" name="Cancel Land Sale"/> - <text name="Claimed:"> - Reclamada: - </text> - <text name="DateClaimText"> - Mar 15 Ago 15 13:47:25 2006 - </text> - <text name="PriceLabel"> - Superficie: - </text> - <text name="PriceText"> - 4048 m² - </text> - <text name="Traffic:"> - Tráfico: - </text> - <text name="DwellText"> - 0 - </text> - <button label="Comprar terreno" left="130" name="Buy Land..." width="125"/> - <button label="Información del script" name="Scripts..."/> - <button label="Comprar para el grupo" name="Buy For Group..."/> - <button label="Comprar un pase" left="130" name="Buy Pass..." tool_tip="Un pase le da acceso temporal a este terreno." width="125"/> - <button label="Abandonar el terreno" name="Abandon Land..."/> - <button label="Reclamar el terreno" name="Reclaim Land..."/> - <button label="Venta Linden" name="Linden Sale..." tool_tip="El terreno debe estar en propiedad, con contenido, y no estar en subasta."/> - </panel> - <panel label="CONTRATO" name="land_covenant_panel"> - <panel.string name="can_resell"> - El terreno comprado en esta región se podrá revender. - </panel.string> - <panel.string name="can_not_resell"> - El terreno comprado en esta región no se podrá revender. - </panel.string> - <panel.string name="can_change"> - El terreno comprado en esta región se podrá unir o dividir. - </panel.string> - <panel.string name="can_not_change"> - El terreno comprado en esta región no se podrá unir o dividir. - </panel.string> - <text name="estate_section_lbl"> - Estado: - </text> - <text name="estate_name_text"> - mainland - </text> - <text name="estate_owner_lbl"> - Propietario: - </text> - <text name="estate_owner_text"> - (nadie) - </text> - <text_editor name="covenant_editor"> - No se ha aportado un contrato para este estado. - </text_editor> - <text name="covenant_timestamp_text"> - Última modificación, Dic Miér 31 16:00:00 1969 - </text> - <text name="region_section_lbl"> - Región: - </text> - <text name="region_name_text"> - leyla - </text> - <text name="region_landtype_lbl"> - Tipo: - </text> - <text name="region_landtype_text"> - Mainland / Homestead - </text> - <text name="region_maturity_lbl"> - Calificación: - </text> - <text name="region_maturity_text"> - 'Adult' - </text> - <text name="resellable_lbl"> - Revender: - </text> - <text name="resellable_clause"> - El terreno de esta región no se podrá revender. - </text> - <text name="changeable_lbl"> - Dividir: - </text> - <text name="changeable_clause"> - El terreno de esta región no se podrá unir/dividir. - </text> - </panel> - <panel label="OBJETOS" name="land_objects_panel"> - <panel.string name="objects_available_text"> - [COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles) - </panel.string> - <panel.string name="objects_deleted_text"> - [COUNT] de un máx. de [MAX] ([DELETED] se borrarán) - </panel.string> - <text name="parcel_object_bonus"> - Plus de objetos en la región: [BONUS] - </text> - <text name="Simulator primitive usage:"> - Uso de primitivas: - </text> - <text name="objects_available"> - [COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles) - </text> - <text name="Primitives parcel supports:"> - Prims que admite la parcela: - </text> - <text name="object_contrib_text"> - [COUNT] - </text> - <text name="Primitives on parcel:"> - Prims en la parcela: - </text> - <text name="total_objects_text"> - [COUNT] - </text> - <text name="Owned by parcel owner:"> - Del propietario de la parcela: - </text> - <text name="owner_objects_text"> - [COUNT] - </text> - <button label="Mostrar" label_selected="Mostrar" name="ShowOwner"/> - <button label="Devolver" name="ReturnOwner..." tool_tip="Devolver los objetos a sus propietarios."/> - <text name="Set to group:"> - Del grupo: - </text> - <text name="group_objects_text"> - [COUNT] - </text> - <button label="Mostrar" label_selected="Mostrar" name="ShowGroup"/> - <button label="Devolver" name="ReturnGroup..." tool_tip="Devolver los objetos a sus propietarios."/> - <text name="Owned by others:"> - Propiedad de otros: - </text> - <text name="other_objects_text"> - [COUNT] - </text> - <button label="Mostrar" label_selected="Mostrar" name="ShowOther"/> - <button label="Devolver" name="ReturnOther..." tool_tip="Devolver los objetos a sus propietarios."/> - <text name="Selected / sat upon:"> - Seleccionados / con gente sentada: - </text> - <text name="selected_objects_text"> - [COUNT] - </text> - <text name="Autoreturn"> - Devolución automát. de objetos de otros (en min., 0 la desactiva): - </text> - <line_editor name="clean other time"/> - <text name="Object Owners:"> - Propietarios de los objetos: - </text> - <button label="Actualizar la lista" label_selected="Actualizar la lista" name="Refresh List" tool_tip="Refresh Object List"/> - <button label="Devolver los objetos" name="Return objects..."/> - <name_list name="owner list"> - <name_list.columns label="Tipo" name="type"/> - <name_list.columns label="Nombre" name="name"/> - <name_list.columns label="Núm." name="count"/> - <name_list.columns label="Más recientes" name="mostrecent"/> - </name_list> - </panel> - <panel label="OPCIONES" name="land_options_panel"> - <panel.string name="search_enabled_tooltip"> - Permitir que aparezca esta parcela en los resultados de la búsqueda - </panel.string> - <panel.string name="search_disabled_small_tooltip"> - Esta opción está desactivada porque la parcela tiene 128 m² o menos. -Sólo las parcelas más grandes pueden listarse en la búsqueda. - </panel.string> - <panel.string name="search_disabled_permissions_tooltip"> - Esta opción no esta activada porque usted no puede modificar las opciones de la parcela. - </panel.string> - <panel.string name="mature_check_mature"> - Contenido 'Mature' - </panel.string> - <panel.string name="mature_check_adult"> - Contenido 'Adult' - </panel.string> - <panel.string name="mature_check_mature_tooltip"> - La información o el contenido de su parcela se considera 'Mature'. - </panel.string> - <panel.string name="mature_check_adult_tooltip"> - La información o el contenido de su parcela se considera 'Adult'. - </panel.string> - <panel.string name="landing_point_none"> - (ninguno) - </panel.string> - <panel.string name="push_restrict_text"> - Sin 'empujones' - </panel.string> - <panel.string name="push_restrict_region_text"> - Sin 'empujones' (prevalece lo marcado en la región) - </panel.string> - <text name="allow_label"> - Permitir a otros Residentes: - </text> - <check_box label="Editar el terreno" name="edit land check" tool_tip="Si se marca, cualquiera podrá modificar su terreno. Mejor dejarlo desmarcado, pues usted siempre puede modificar su terreno."/> - <check_box label="Volar" name="check fly" tool_tip="Si se marca, los residentes podrán volar en su terreno. Si no, sólo podrán volar al cruzarlo o hasta que aterricen en él."/> - <text name="allow_label2"> - Crear objetos: - </text> - <check_box label="Todos los residentes" name="edit objects check"/> - <check_box label="El grupo" name="edit group objects check"/> - <text name="allow_label3"> - Dejar objetos: - </text> - <check_box label="Todos los residentes" name="all object entry check"/> - <check_box label="El grupo" name="group object entry check"/> - <text name="allow_label4"> - Ejecutar scripts: - </text> - <check_box label="Todos los residentes" name="check other scripts"/> - <check_box label="El grupo" name="check group scripts"/> - <text name="land_options_label"> - Opciones del terreno: - </text> - <check_box label="Seguro (sin daño)" name="check safe" tool_tip="Si se marca, convierte el terreno en 'seguro', desactivando el daño en combate. Si no, se activa el daño en combate."/> - <check_box label="Sin 'empujones'" name="PushRestrictCheck" tool_tip="Previene scripts que empujen. Marcando esta opción prevendrá que en su terreno haya comportamientos destructivos."/> - <check_box label="Mostrar el sitio en la búsqueda (30 L$/semana)" name="ShowDirectoryCheck" tool_tip="Let people see this parcel in search results"/> - <combo_box name="land category with adult"> - <combo_box.item label="Cualquier categorÃa" name="item0"/> - <combo_box.item label="Localización Linden" name="item1"/> - <combo_box.item label="'Adult'" name="item2"/> - <combo_box.item label="Arte y Cultura" name="item3"/> - <combo_box.item label="Negocios" name="item4"/> - <combo_box.item label="Educativo" name="item5"/> - <combo_box.item label="Juegos de azar" name="item6"/> - <combo_box.item label="Entretenimiento" name="item7"/> - <combo_box.item label="Para recién llegados" name="item8"/> - <combo_box.item label="Parques y Naturaleza" name="item9"/> - <combo_box.item label="Residencial" name="item10"/> - <combo_box.item label="Compras" name="item11"/> - <combo_box.item label="Terreno en alquiler" name="item13"/> - <combo_box.item label="Otra" name="item12"/> - </combo_box> - <combo_box name="land category"> - <combo_box.item label="Cualquier categorÃa" name="item0"/> - <combo_box.item label="Localización Linden" name="item1"/> - <combo_box.item label="Arte y Cultura" name="item3"/> - <combo_box.item label="Negocios" name="item4"/> - <combo_box.item label="Educativo" name="item5"/> - <combo_box.item label="Juegos de azar" name="item6"/> - <combo_box.item label="Entretenimiento" name="item7"/> - <combo_box.item label="Para recién llegados" name="item8"/> - <combo_box.item label="Parques y Naturaleza" name="item9"/> - <combo_box.item label="Residencial" name="item10"/> - <combo_box.item label="Compras" name="item11"/> - <combo_box.item label="Terreno en alquiler" name="item13"/> - <combo_box.item label="Otra" name="item12"/> - </combo_box> - <check_box label="Contenido 'Mature'" name="MatureCheck" tool_tip=""/> - <text name="Snapshot:"> - Foto: - </text> - <texture_picker label="" name="snapshot_ctrl" tool_tip="Pulse para elegir una imagen"/> - <text name="landing_point"> - Punto de llegada: [LANDING] - </text> - <button label="Definir" label_selected="Definir" name="Set" tool_tip="Configura el punto de llegada donde aparecerán los visitantes. Configúrelo a la posición de su avatar dentro de esta parcela."/> - <button label="Borrar" label_selected="Borrar" name="Clear" tool_tip="Borrar el punto de llegada."/> - <text name="Teleport Routing: "> - Punto de teleporte: - </text> - <combo_box name="landing type" tool_tip="Punto de teleporte: defina cómo manejar en su terreno los teleportes."> - <combo_box.item label="Bloqueado" name="Blocked"/> - <combo_box.item label="Punto de llegada" name="LandingPoint"/> - <combo_box.item label="Cualquiera" name="Anywhere"/> - </combo_box> - </panel> - <panel label="MEDIA" name="land_media_panel"> - <text name="with media:" width="85"> - Tipo de media: - </text> - <combo_box left="97" name="media type" tool_tip="Especifique si la URL es una pelÃcula, una web, u otro media"/> - <text name="at URL:" width="85"> - Página inicial: - </text> - <line_editor left="97" name="media_url"/> - <button label="Definir" name="set_media_url"/> - <text name="Description:"> - Descripción: - </text> - <line_editor left="97" name="url_description" tool_tip="Texto a mostrar cerca del botón play/cargar"/> - <text name="Media texture:"> - Cambiar -la textura: - </text> - <texture_picker label="" left="97" name="media texture" tool_tip="Pulse para elegir una imagen"/> - <text name="replace_texture_help" width="285"> - Cuando pulses la flecha 'play', los objetos que usen esta textura mostrarán la pelÃcula o la página web. Selecciona la miniatura para elegir una textura distinta. - </text> - <check_box label="Escala automática" left="97" name="media_auto_scale" tool_tip="Marcando esta opción, se ajustará el tamaño del contenido automáticamente. Puede ser ligeramente más lento y con menor calidad visual, pero no tendrá que ajustar ni alinear ninguna textura."/> - <text left="102" name="media_size" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)." width="120"> - Tamaño del media: - </text> - <spinner left_delta="104" name="media_size_width" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)."/> - <spinner name="media_size_height" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)."/> - <text name="pixels"> - pÃxeles - </text> - <text name="Options:"> - Opciones de -los media: - </text> - <check_box label="Media en bucle" name="media_loop" tool_tip="Ejecuta el media en bucle: cuando acaba su ejecución, vuelve a empezar."/> - </panel> - <panel label="SONIDO" name="land_audio_panel"> - <text name="MusicURL:"> - URL de música: - </text> - <text name="Sound:"> - Sonido: - </text> - <check_box label="Restringir sonidos de objetos y gestos a esta parcela" name="check sound local"/> - <text name="Voice settings:"> - Voz: - </text> - <check_box label="Activar la voz" name="parcel_enable_voice_channel"/> - <check_box label="Autorizar la voz (establecido por el Estado)" name="parcel_enable_voice_channel_is_estate_disabled"/> - <check_box label="Limitar la voz a esta parcela" name="parcel_enable_voice_channel_local"/> - </panel> - <panel label="ACCESO" name="land_access_panel"> - <panel.string name="access_estate_defined"> - (Definido por el Estado) - </panel.string> - <panel.string name="allow_public_access"> - Permitir el acceso público ([MATURITY]) (Nota: Si no seleccionas esta opción, se crearán lÃneas de prohibición) - </panel.string> - <panel.string name="estate_override"> - Una o más de esta opciones está configurada a nivel del estado - </panel.string> - <text name="Limit access to this parcel to:"> - Acceso a esta parcela - </text> - <check_box label="Permitir el acceso público [MATURITY]" name="public_access"/> - <text name="Only Allow"> - Restringir el acceso a residentes verificados con: - </text> - <check_box label="Información de pago aportada [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Expulsa a los Residentes no identificados."/> - <check_box label="Verificación de edad [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Expulsa a los Residentes que no hayan verificado su edad. Más información en [SUPPORT_SITE]."/> - <check_box label="Acceso permitido al grupo: [GROUP]" name="GroupCheck" tool_tip="Elija el grupo en la pestaña General."/> - <check_box label="Vender pases a:" name="PassCheck" tool_tip="Permitir acceso temporal a esta parcela"/> - <combo_box name="pass_combo"> - <combo_box.item label="Cualquiera" name="Anyone"/> - <combo_box.item label="Grupo" name="Group"/> - </combo_box> - <spinner label="Precio en L$:" name="PriceSpin"/> - <spinner label="Horas de acceso:" name="HoursSpin"/> - <panel name="Allowed_layout_panel"> - <text label="Always Allow" name="AllowedText"> - Residentes autorizados - </text> - <name_list name="AccessList" tool_tip="([LISTED] listados de un máx. de [MAX])"/> - <button label="Añadir" name="add_allowed"/> - <button label="Quitar" label_selected="Quitar" name="remove_allowed"/> - </panel> - <panel name="Banned_layout_panel"> - <text label="Ban" name="BanCheck"> - Residentes con el acceso prohibido - </text> - <name_list name="BannedList" tool_tip="([LISTED] listados de un máx. de [MAX])"/> - <button label="Añadir" name="add_banned"/> - <button label="Quitar" label_selected="Quitar" name="remove_banned"/> - </panel> - </panel> - </tab_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterland" title="ACERCA DEL TERRENO">
+ <floater.string name="maturity_icon_general">
+ "Parcel_PG_Dark"
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ "Parcel_M_Dark"
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ "Parcel_R_Dark"
+ </floater.string>
+ <floater.string name="Minutes">
+ [MINUTES] minutos
+ </floater.string>
+ <floater.string name="Minute">
+ minuto
+ </floater.string>
+ <floater.string name="Seconds">
+ [SECONDS] segundos
+ </floater.string>
+ <floater.string name="Remaining">
+ restantes
+ </floater.string>
+ <tab_container name="landtab">
+ <panel label="GENERAL" name="land_general_panel">
+ <panel.string name="new users only">
+ Sólo nuevos Residentes
+ </panel.string>
+ <panel.string name="anyone">
+ Cualquiera
+ </panel.string>
+ <panel.string name="area_text">
+ Superficie
+ </panel.string>
+ <panel.string name="area_size_text">
+ [AREA] m²
+ </panel.string>
+ <panel.string name="auction_id_text">
+ ID de la subasta: [ID]
+ </panel.string>
+ <panel.string name="need_tier_to_modify">
+ Debe aprobar su compra para modificar este terreno.
+ </panel.string>
+ <panel.string name="group_owned_text">
+ (Propiedad del grupo)
+ </panel.string>
+ <panel.string name="profile_text">
+ Perfil...
+ </panel.string>
+ <panel.string name="info_text">
+ Información...
+ </panel.string>
+ <panel.string name="public_text">
+ (público)
+ </panel.string>
+ <panel.string name="none_text">
+ (ninguno)
+ </panel.string>
+ <panel.string name="sale_pending_text">
+ (Venta pendiente)
+ </panel.string>
+ <panel.string name="no_selection_text">
+ No se ha seleccionado una parcela.
+Vaya al menú Mundo > Acerca del terreno o seleccione otra parcela para ver sus caracterÃsticas.
+ </panel.string>
+ <panel.string name="time_stamp_template">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
+ <text name="Name:">
+ Nombre:
+ </text>
+ <text name="Description:">
+ Descripción:
+ </text>
+ <text name="LandType">
+ Tipo:
+ </text>
+ <text name="LandTypeText">
+ Mainland / Homestead
+ </text>
+ <text name="ContentRating">
+ Calificación:
+ </text>
+ <text name="ContentRatingText">
+ Adulto
+ </text>
+ <text name="Owner:">
+ Propietario:
+ </text>
+ <text name="Group:">
+ Grupo:
+ </text>
+ <button label="Configurar" name="Set..."/>
+ <check_box label="Permitir transferir al grupo" name="check deed" tool_tip="Un oficial del grupo puede transferir este terreno al grupo. El terreno será apoyado por el grupo en sus asignaciones de terreno."/>
+ <button label="Transferir" name="Deed..." tool_tip="Sólo si es usted un oficial del grupo seleccionado puede transferir terreno."/>
+ <check_box label="El propietario hace una contribución transfiriendo" name="check contrib" tool_tip="Cuando el terreno se transfiere al grupo, el antiguo propietario contribuye con una asignación suficiente de terreno."/>
+ <text name="For Sale:">
+ En venta:
+ </text>
+ <text name="Not for sale.">
+ No está en venta.
+ </text>
+ <text name="For Sale: Price L$[PRICE].">
+ Precio: [PRICE] L$ ([PRICE_PER_SQM] L$/m²).
+ </text>
+ <button label="Vender el terreno" name="Sell Land..."/>
+ <text name="For sale to">
+ En venta a: [BUYER]
+ </text>
+ <text name="Sell with landowners objects in parcel." width="216">
+ Los objetos se incluyen en la venta.
+ </text>
+ <text name="Selling with no objects in parcel." width="216">
+ Los objetos no se incluyen en la venta.
+ </text>
+ <button bottom="-245" font="SansSerifSmall" label="Cancelar la venta del terreno" label_selected="Cancelar la venta del terreno" left="275" name="Cancel Land Sale"/>
+ <text name="Claimed:">
+ Reclamada:
+ </text>
+ <text name="DateClaimText">
+ Mar 15 Ago 15 13:47:25 2006
+ </text>
+ <text name="PriceLabel">
+ Superficie:
+ </text>
+ <text name="PriceText">
+ 4048 m²
+ </text>
+ <text name="Traffic:">
+ Tráfico:
+ </text>
+ <text name="DwellText">
+ 0
+ </text>
+ <button label="Comprar terreno" left="130" name="Buy Land..." width="125"/>
+ <button label="Información del script" name="Scripts..."/>
+ <button label="Comprar para el grupo" name="Buy For Group..."/>
+ <button label="Comprar un pase" left="130" name="Buy Pass..." tool_tip="Un pase le da acceso temporal a este terreno." width="125"/>
+ <button label="Abandonar el terreno" name="Abandon Land..."/>
+ <button label="Reclamar el terreno" name="Reclaim Land..."/>
+ <button label="Venta Linden" name="Linden Sale..." tool_tip="El terreno debe estar en propiedad, con contenido, y no estar en subasta."/>
+ </panel>
+ <panel label="CONTRATO" name="land_covenant_panel">
+ <panel.string name="can_resell">
+ El terreno comprado en esta región se podrá revender.
+ </panel.string>
+ <panel.string name="can_not_resell">
+ El terreno comprado en esta región no se podrá revender.
+ </panel.string>
+ <panel.string name="can_change">
+ El terreno comprado en esta región se podrá unir o dividir.
+ </panel.string>
+ <panel.string name="can_not_change">
+ El terreno comprado en esta región no se podrá unir o dividir.
+ </panel.string>
+ <text name="estate_section_lbl">
+ Estado:
+ </text>
+ <text name="estate_name_text">
+ mainland
+ </text>
+ <text name="estate_owner_lbl">
+ Propietario:
+ </text>
+ <text name="estate_owner_text">
+ (nadie)
+ </text>
+ <text_editor name="covenant_editor">
+ No se ha aportado un contrato para este estado.
+ </text_editor>
+ <text name="covenant_timestamp_text">
+ Última modificación, Dic Miér 31 16:00:00 1969
+ </text>
+ <text name="region_section_lbl">
+ Región:
+ </text>
+ <text name="region_name_text">
+ leyla
+ </text>
+ <text name="region_landtype_lbl">
+ Tipo:
+ </text>
+ <text name="region_landtype_text">
+ Mainland / Homestead
+ </text>
+ <text name="region_maturity_lbl">
+ Calificación:
+ </text>
+ <text name="region_maturity_text">
+ Adulto
+ </text>
+ <text name="resellable_lbl">
+ Revender:
+ </text>
+ <text name="resellable_clause">
+ El terreno de esta región no se podrá revender.
+ </text>
+ <text name="changeable_lbl">
+ Dividir:
+ </text>
+ <text name="changeable_clause">
+ El terreno de esta región no se podrá unir/dividir.
+ </text>
+ </panel>
+ <panel label="OBJETOS" name="land_objects_panel">
+ <panel.string name="objects_available_text">
+ [COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles)
+ </panel.string>
+ <panel.string name="objects_deleted_text">
+ [COUNT] de un máx. de [MAX] ([DELETED] se borrarán)
+ </panel.string>
+ <text name="parcel_object_bonus">
+ Plus de objetos en la región: [BONUS]
+ </text>
+ <text name="Simulator primitive usage:">
+ Uso de primitivas:
+ </text>
+ <text name="objects_available">
+ [COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles)
+ </text>
+ <text name="Primitives parcel supports:">
+ Prims que admite la parcela:
+ </text>
+ <text name="object_contrib_text">
+ [COUNT]
+ </text>
+ <text name="Primitives on parcel:">
+ Prims en la parcela:
+ </text>
+ <text name="total_objects_text">
+ [COUNT]
+ </text>
+ <text name="Owned by parcel owner:">
+ Del propietario de la parcela:
+ </text>
+ <text name="owner_objects_text">
+ [COUNT]
+ </text>
+ <button label="Mostrar" label_selected="Mostrar" name="ShowOwner"/>
+ <button label="Devolver" name="ReturnOwner..." tool_tip="Devolver los objetos a sus propietarios."/>
+ <text name="Set to group:">
+ Del grupo:
+ </text>
+ <text name="group_objects_text">
+ [COUNT]
+ </text>
+ <button label="Mostrar" label_selected="Mostrar" name="ShowGroup"/>
+ <button label="Devolver" name="ReturnGroup..." tool_tip="Devolver los objetos a sus propietarios."/>
+ <text name="Owned by others:">
+ Propiedad de otros:
+ </text>
+ <text name="other_objects_text">
+ [COUNT]
+ </text>
+ <button label="Mostrar" label_selected="Mostrar" name="ShowOther"/>
+ <button label="Devolver" name="ReturnOther..." tool_tip="Devolver los objetos a sus propietarios."/>
+ <text name="Selected / sat upon:">
+ Seleccionados / con gente sentada:
+ </text>
+ <text name="selected_objects_text">
+ [COUNT]
+ </text>
+ <text name="Autoreturn">
+ Devolución automát. de objetos de otros (en min., 0 la desactiva):
+ </text>
+ <line_editor name="clean other time"/>
+ <text name="Object Owners:">
+ Propietarios de los objetos:
+ </text>
+ <button label="Actualizar la lista" label_selected="Actualizar la lista" name="Refresh List" tool_tip="Refresh Object List"/>
+ <button label="Devolver los objetos" name="Return objects..."/>
+ <name_list name="owner list">
+ <name_list.columns label="Tipo" name="type"/>
+ <name_list.columns label="Nombre" name="name"/>
+ <name_list.columns label="Núm." name="count"/>
+ <name_list.columns label="Más recientes" name="mostrecent"/>
+ </name_list>
+ </panel>
+ <panel label="OPCIONES" name="land_options_panel">
+ <panel.string name="search_enabled_tooltip">
+ Permitir que aparezca esta parcela en los resultados de la búsqueda
+ </panel.string>
+ <panel.string name="search_disabled_small_tooltip">
+ Esta opción está desactivada porque la parcela tiene 128 m² o menos.
+Sólo las parcelas más grandes pueden listarse en la búsqueda.
+ </panel.string>
+ <panel.string name="search_disabled_permissions_tooltip">
+ Esta opción no esta activada porque usted no puede modificar las opciones de la parcela.
+ </panel.string>
+ <panel.string name="mature_check_mature">
+ Contenido Moderado
+ </panel.string>
+ <panel.string name="mature_check_adult">
+ Contenido Adulto
+ </panel.string>
+ <panel.string name="mature_check_mature_tooltip">
+ La información o el contenido de su parcela se considera Moderado.
+ </panel.string>
+ <panel.string name="mature_check_adult_tooltip">
+ La información o el contenido de su parcela se considera Adulto.
+ </panel.string>
+ <panel.string name="landing_point_none">
+ (ninguno)
+ </panel.string>
+ <panel.string name="push_restrict_text">
+ Sin 'empujones'
+ </panel.string>
+ <panel.string name="push_restrict_region_text">
+ Sin 'empujones' (prevalece lo marcado en la región)
+ </panel.string>
+ <text name="allow_label">
+ Permitir a otros Residentes:
+ </text>
+ <check_box label="Editar el terreno" name="edit land check" tool_tip="Si se marca, cualquiera podrá modificar su terreno. Mejor dejarlo desmarcado, pues usted siempre puede modificar su terreno."/>
+ <check_box label="Volar" name="check fly" tool_tip="Si se marca, los residentes podrán volar en su terreno. Si no, sólo podrán volar al cruzarlo o hasta que aterricen en él."/>
+ <text name="allow_label2">
+ Crear objetos:
+ </text>
+ <check_box label="Todos los residentes" name="edit objects check"/>
+ <check_box label="El grupo" name="edit group objects check"/>
+ <text name="allow_label3">
+ Dejar objetos:
+ </text>
+ <check_box label="Todos los residentes" name="all object entry check"/>
+ <check_box label="El grupo" name="group object entry check"/>
+ <text name="allow_label4">
+ Ejecutar scripts:
+ </text>
+ <check_box label="Todos los residentes" name="check other scripts"/>
+ <check_box label="El grupo" name="check group scripts"/>
+ <text name="land_options_label">
+ Opciones del terreno:
+ </text>
+ <check_box label="Seguro (sin daño)" name="check safe" tool_tip="Si se marca, convierte el terreno en 'seguro', desactivando el daño en combate. Si no, se activa el daño en combate."/>
+ <check_box label="Sin 'empujones'" name="PushRestrictCheck" tool_tip="Previene scripts que empujen. Marcando esta opción prevendrá que en su terreno haya comportamientos destructivos."/>
+ <check_box label="Mostrar el sitio en la búsqueda (30 L$/semana)" name="ShowDirectoryCheck" tool_tip="Let people see this parcel in search results"/>
+ <combo_box name="land category with adult">
+ <combo_box.item label="Cualquier categorÃa" name="item0"/>
+ <combo_box.item label="Localización Linden" name="item1"/>
+ <combo_box.item label="Adulto" name="item2"/>
+ <combo_box.item label="Arte y Cultura" name="item3"/>
+ <combo_box.item label="Negocios" name="item4"/>
+ <combo_box.item label="Educativo" name="item5"/>
+ <combo_box.item label="Juegos de azar" name="item6"/>
+ <combo_box.item label="Entretenimiento" name="item7"/>
+ <combo_box.item label="Para recién llegados" name="item8"/>
+ <combo_box.item label="Parques y Naturaleza" name="item9"/>
+ <combo_box.item label="Residencial" name="item10"/>
+ <combo_box.item label="Compras" name="item11"/>
+ <combo_box.item label="Terreno en alquiler" name="item13"/>
+ <combo_box.item label="Otra" name="item12"/>
+ </combo_box>
+ <combo_box name="land category">
+ <combo_box.item label="Cualquier categorÃa" name="item0"/>
+ <combo_box.item label="Localización Linden" name="item1"/>
+ <combo_box.item label="Arte y Cultura" name="item3"/>
+ <combo_box.item label="Negocios" name="item4"/>
+ <combo_box.item label="Educativo" name="item5"/>
+ <combo_box.item label="Juegos de azar" name="item6"/>
+ <combo_box.item label="Entretenimiento" name="item7"/>
+ <combo_box.item label="Para recién llegados" name="item8"/>
+ <combo_box.item label="Parques y Naturaleza" name="item9"/>
+ <combo_box.item label="Residencial" name="item10"/>
+ <combo_box.item label="Compras" name="item11"/>
+ <combo_box.item label="Terreno en alquiler" name="item13"/>
+ <combo_box.item label="Otra" name="item12"/>
+ </combo_box>
+ <check_box label="Contenido Moderado" name="MatureCheck" tool_tip=""/>
+ <text name="Snapshot:">
+ Foto:
+ </text>
+ <texture_picker label="" name="snapshot_ctrl" tool_tip="Pulse para elegir una imagen"/>
+ <text name="landing_point">
+ Punto de llegada: [LANDING]
+ </text>
+ <button label="Definir" label_selected="Definir" name="Set" tool_tip="Configura el punto de llegada donde aparecerán los visitantes. Configúrelo a la posición de su avatar dentro de esta parcela."/>
+ <button label="Borrar" label_selected="Borrar" name="Clear" tool_tip="Borrar el punto de llegada."/>
+ <text name="Teleport Routing: ">
+ Punto de teleporte:
+ </text>
+ <combo_box name="landing type" tool_tip="Punto de teleporte: defina cómo manejar en su terreno los teleportes.">
+ <combo_box.item label="Bloqueado" name="Blocked"/>
+ <combo_box.item label="Punto de llegada" name="LandingPoint"/>
+ <combo_box.item label="Cualquiera" name="Anywhere"/>
+ </combo_box>
+ </panel>
+ <panel label="MEDIA" name="land_media_panel">
+ <text name="with media:" width="85">
+ Tipo de media:
+ </text>
+ <combo_box left="97" name="media type" tool_tip="Especifique si la URL es una pelÃcula, una web, u otro media"/>
+ <text name="at URL:" width="85">
+ Página inicial:
+ </text>
+ <line_editor left="97" name="media_url"/>
+ <button label="Definir" name="set_media_url"/>
+ <text name="Description:">
+ Descripción:
+ </text>
+ <line_editor left="97" name="url_description" tool_tip="Texto a mostrar cerca del botón play/cargar"/>
+ <text name="Media texture:">
+ Cambiar
+la textura:
+ </text>
+ <texture_picker label="" left="97" name="media texture" tool_tip="Pulse para elegir una imagen"/>
+ <text name="replace_texture_help" width="285">
+ Cuando pulses la flecha 'play', los objetos que usen esta textura mostrarán la pelÃcula o la página web. Selecciona la miniatura para elegir una textura distinta.
+ </text>
+ <check_box label="Escala automática" left="97" name="media_auto_scale" tool_tip="Marcando esta opción, se ajustará el tamaño del contenido automáticamente. Puede ser ligeramente más lento y con menor calidad visual, pero no tendrá que ajustar ni alinear ninguna textura."/>
+ <text left="102" name="media_size" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)." width="120">
+ Tamaño del media:
+ </text>
+ <spinner left_delta="104" name="media_size_width" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)."/>
+ <spinner name="media_size_height" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)."/>
+ <text name="pixels">
+ pÃxeles
+ </text>
+ <text name="Options:">
+ Opciones de
+los media:
+ </text>
+ <check_box label="Media en bucle" name="media_loop" tool_tip="Ejecuta el media en bucle: cuando acaba su ejecución, vuelve a empezar."/>
+ </panel>
+ <panel label="SONIDO" name="land_audio_panel">
+ <text name="MusicURL:">
+ URL de música:
+ </text>
+ <text name="Sound:">
+ Sonido:
+ </text>
+ <check_box label="Restringir sonidos de objetos y gestos a esta parcela" name="check sound local"/>
+ <text name="Voice settings:">
+ Voz:
+ </text>
+ <check_box label="Activar la voz" name="parcel_enable_voice_channel"/>
+ <check_box label="Autorizar la voz (establecido por el Estado)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+ <check_box label="Limitar la voz a esta parcela" name="parcel_enable_voice_channel_local"/>
+ </panel>
+ <panel label="ACCESO" name="land_access_panel">
+ <panel.string name="access_estate_defined">
+ (Definido por el Estado)
+ </panel.string>
+ <panel.string name="allow_public_access">
+ Permitir el acceso público ([MATURITY]) (Nota: Si no seleccionas esta opción, se crearán lÃneas de prohibición)
+ </panel.string>
+ <panel.string name="estate_override">
+ Una o más de esta opciones está configurada a nivel del estado
+ </panel.string>
+ <text name="Limit access to this parcel to:">
+ Acceso a esta parcela
+ </text>
+ <check_box label="Permitir el acceso público [MATURITY]" name="public_access"/>
+ <text name="Only Allow">
+ Restringir el acceso a residentes verificados con:
+ </text>
+ <check_box label="Información de pago aportada [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Expulsa a los Residentes no identificados."/>
+ <check_box label="Verificación de edad [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Expulsa a los Residentes que no hayan verificado su edad. Más información en [SUPPORT_SITE]."/>
+ <check_box label="Acceso permitido al grupo: [GROUP]" name="GroupCheck" tool_tip="Elija el grupo en la pestaña General."/>
+ <check_box label="Vender pases a:" name="PassCheck" tool_tip="Permitir acceso temporal a esta parcela"/>
+ <combo_box name="pass_combo">
+ <combo_box.item label="Cualquiera" name="Anyone"/>
+ <combo_box.item label="Grupo" name="Group"/>
+ </combo_box>
+ <spinner label="Precio en L$:" name="PriceSpin"/>
+ <spinner label="Horas de acceso:" name="HoursSpin"/>
+ <panel name="Allowed_layout_panel">
+ <text label="Always Allow" name="AllowedText">
+ Residentes autorizados
+ </text>
+ <name_list name="AccessList" tool_tip="([LISTED] listados de un máx. de [MAX])"/>
+ <button label="Añadir" name="add_allowed"/>
+ <button label="Quitar" label_selected="Quitar" name="remove_allowed"/>
+ </panel>
+ <panel name="Banned_layout_panel">
+ <text label="Ban" name="BanCheck">
+ Residentes con el acceso prohibido
+ </text>
+ <name_list name="BannedList" tool_tip="([LISTED] listados de un máx. de [MAX])"/>
+ <button label="Añadir" name="add_banned"/>
+ <button label="Quitar" label_selected="Quitar" name="remove_banned"/>
+ </panel>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml index c58eb227aa..bd13262dcd 100644 --- a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml @@ -30,15 +30,15 @@ <text name="trigger_label"> Palabra clave: </text> - <text left="208" name="replace_text" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave 'hola' por 'qué tal', se cambiará en el chat 'Quise decir hola' por 'Quise decir qué tal' en cuanto realice el gesto."> + <text name="replace_text" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave 'hola' por 'qué tal', se cambiará en el chat 'Quise decir hola' por 'Quise decir qué tal' en cuanto realice el gesto."> Reemplazar por: </text> <line_editor name="replace_editor" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave 'hola' por 'qué tal', se cambiará en el chat 'Quise decir hola' por 'Quise decir qué tal' en cuanto realice el gesto."/> <text name="key_label"> Atajo de teclado: </text> - <combo_box label="Ninguno" left="116" name="modifier_combo" width="76"/> - <combo_box label="Ninguno" left_delta="80" name="key_combo" width="76"/> + <combo_box label="Ninguno" name="modifier_combo" width="76"/> + <combo_box label="Ninguno" name="key_combo" width="50"/> <text name="library_label"> Biblioteca: </text> @@ -55,20 +55,20 @@ <button label="Arriba" name="up_btn"/> <button label="Abajo" name="down_btn"/> <button label="Quitar" name="delete_btn"/> - <text left="230" name="options_text" width="200"> + <text name="options_text" width="200"> (opciones) </text> <radio_group name="animation_trigger_type"> <radio_item label="Empezar" name="start"/> <radio_item label="Parar" name="stop"/> </radio_group> - <check_box bottom_delta="34" label="hasta que las animaciones estén hechas" name="wait_anim_check"/> - <check_box bottom_delta="-30" label="tiempo en segundos:" name="wait_time_check"/> - <line_editor left_delta="130" name="wait_time_editor"/> + <check_box label="hasta que las animaciones estén hechas" name="wait_anim_check"/> + <check_box label="tiempo en segundos:" name="wait_time_check"/> + <line_editor name="wait_time_editor"/> <text name="help_label"> Todos los pasos suceden a la vez, a menos que añadas pasos de espera. </text> - <check_box label="Disponible" left="130" name="active_check" tool_tip="Los gestos disponibles pueden realizarse escribiendo en el chat su frase clave o pulsando su tecla de acceso rápido. Generalmente, los gestos pasan a no disponibles cuando hay un conflicto de teclas."/> - <button label="Vista previa" name="preview_btn" width="85"/> + <check_box label="Disponible" name="active_check" tool_tip="Los gestos disponibles pueden realizarse escribiendo en el chat su frase clave o pulsando su tecla de acceso rápido. Generalmente, los gestos pasan a no disponibles cuando hay un conflicto de teclas."/> + <button label="Vista previa" name="preview_btn" width="82"/> <button label="Guardar" name="save_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_report_abuse.xml b/indra/newview/skins/default/xui/es/floater_report_abuse.xml index 760429e73d..c541b0f98b 100644 --- a/indra/newview/skins/default/xui/es/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/es/floater_report_abuse.xml @@ -1,103 +1,103 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_report_abuse" title="DENUNCIA DE INFRACCIÓN"> - <floater.string name="Screenshot"> - Captura de pantalla - </floater.string> - <check_box label="Usar esta captura de pantalla" name="screen_check"/> - <text name="reporter_title"> - Denunciante: - </text> - <text name="reporter_field"> - Loremipsum Dolorsitamut Longnamez - </text> - <text name="sim_title"> - Región: - </text> - <text name="sim_field"> - Nombre de la región - </text> - <text name="pos_title"> - Posición: - </text> - <text name="pos_field"> - {128.1, 128.1, 15.4} - </text> - <text name="select_object_label"> - Pulsa el botón y luego el objeto a denunciar: - </text> - <button label="" label_selected="" name="pick_btn" tool_tip="Señalar objeto - Identificar un objeto como sujeto de esta denuncia"/> - <text name="object_name_label"> - Objeto: - </text> - <text name="object_name"> - Consetetur Sadipscing - </text> - <text name="owner_name_label"> - Propietario: - </text> - <text name="owner_name"> - Hendrerit Vulputate Kamawashi Longname - </text> - <combo_box name="category_combo" tool_tip="CategorÃa -- Elija la categorÃa que describa mejor esta denuncia"> - <combo_box.item label="Elegir la categorÃa" name="Select_category"/> - <combo_box.item label="Edad > Jugar a ser niño" name="Age__Age_play"/> - <combo_box.item label="Edad > Residente adulto en Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/> - <combo_box.item label="Edad > Residente menor de edad fuera de Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/> - <combo_box.item label="Ataque > Sandbox de combate / Zona no segura" name="Assault__Combat_sandbox___unsafe_area"/> - <combo_box.item label="Ataque > Zona segura" name="Assault__Safe_area"/> - <combo_box.item label="Ataque > Sandbox de prueba de armas" name="Assault__Weapons_testing_sandbox"/> - <combo_box.item label="Comercio > Error en la entrega de productos o servicios" name="Commerce__Failure_to_deliver_product_or_service"/> - <combo_box.item label="Indiscreción > Información del mundo real" name="Disclosure__Real_world_information"/> - <combo_box.item label="Indiscreción > Monitorizar a distancia el chat" name="Disclosure__Remotely_monitoring chat"/> - <combo_box.item label="Indiscreción > Información Se Second Life, el chat o los MI" name="Disclosure__Second_Life_information_chat_IMs"/> - <combo_box.item label="Perturbando la paz > Abuso de los recursos de la región" name="Disturbing_the_peace__Unfair_use_of_region_resources"/> - <combo_box.item label="Perturbando la paz > Excesivos objetos con script" name="Disturbing_the_peace__Excessive_scripted_objects"/> - <combo_box.item label="Perturbando la paz > Objeto basura" name="Disturbing_the_peace__Object_littering"/> - <combo_box.item label="Perturbando la paz > Spam (mensajes no pedidos) repetitivo" name="Disturbing_the_peace__Repetitive_spam"/> - <combo_box.item label="Perturbando la paz > Publicidad no deseada" name="Disturbing_the_peace__Unwanted_advert_spam"/> - <combo_box.item label="Fraude > L$" name="Fraud__L$"/> - <combo_box.item label="Fraude > Terreno" name="Fraud__Land"/> - <combo_box.item label="Fraude > Esquemas piramidales o cadenas de cartas" name="Fraud__Pyramid_scheme_or_chain_letter"/> - <combo_box.item label="Fraude > US$" name="Fraud__US$"/> - <combo_box.item label="Acoso > Anuncios múltiples / Spam visual" name="Harassment__Advert_farms___visual_spam"/> - <combo_box.item label="Acoso > Difamación de individuos o grupos" name="Harassment__Defaming_individuals_or_groups"/> - <combo_box.item label="Acoso > Impedir el movimiento" name="Harassment__Impeding_movement"/> - <combo_box.item label="Acoso > Acoso sexual" name="Harassment__Sexual_harassment"/> - <combo_box.item label="Acoso > Incitar a, o pedir, que otros violen las Condiciones del Servicio" name="Harassment__Solicting_inciting_others_to_violate_ToS"/> - <combo_box.item label="Acoso > Abuso verbal" name="Harassment__Verbal_abuse"/> - <combo_box.item label="Indecencia > En general, contenido o conducta ofensivos" name="Indecency__Broadly_offensive_content_or_conduct"/> - <combo_box.item label="Indecencia > Nombre inapropiado del avatar" name="Indecency__Inappropriate_avatar_name"/> - <combo_box.item label="Indecencia > Contenido o conducta inapropiada en una región 'PG'" name="Indecency__Mature_content_in_PG_region"/> - <combo_box.item label="Indecencia > Contenido o conducta inapropiada en una región 'Mature'" name="Indecency__Inappropriate_content_in_Mature_region"/> - <combo_box.item label="Infracción de la propiedad intelectual > Eliminación de contenidos" name="Intellectual_property_infringement_Content_Removal"/> - <combo_box.item label="Infracción de la propiedad intelectual > CopyBot o Exploit (programa malicioso) de permisos" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/> - <combo_box.item label="Intolerancia" name="Intolerance"/> - <combo_box.item label="Terreno > Abuso de los recursos de un sandbox" name="Land__Abuse_of_sandbox_resources"/> - <combo_box.item label="Terreno > Invasión > Objetos/Texturas" name="Land__Encroachment__Objects_textures"/> - <combo_box.item label="Terreno > Invasión > PartÃculas" name="Land__Encroachment__Particles"/> - <combo_box.item label="Terreno > Invasión > Ãrboles/Plantas" name="Land__Encroachment__Trees_plants"/> - <combo_box.item label="Apuestas/Juego" name="Wagering_gambling"/> - <combo_box.item label="Otra" name="Other"/> - </combo_box> - <text name="abuser_name_title"> - Nombre del infractor: - </text> - <button label="Elegir" label_selected="" name="select_abuser" tool_tip="Elegir de una lista el nombre del infractor"/> - <text name="abuser_name_title2"> - Localización de la infracción: - </text> - <text name="sum_title"> - Resumen: - </text> - <text name="dscr_title"> - Detalles: - </text> - <text name="bug_aviso"> - Por favor, sé todo lo concreto que puedas - </text> - <text name="incomplete_title"> - * Las denuncias incompletas no se investigarán - </text> - <button label="Denunciar la infracción" label_selected="Denunciar la infracción" name="send_btn"/> - <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_report_abuse" title="DENUNCIA DE INFRACCIÓN">
+ <floater.string name="Screenshot">
+ Captura de pantalla
+ </floater.string>
+ <check_box label="Usar esta captura de pantalla" name="screen_check"/>
+ <text name="reporter_title">
+ Denunciante:
+ </text>
+ <text name="reporter_field">
+ Loremipsum Dolorsitamut Longnamez
+ </text>
+ <text name="sim_title">
+ Región:
+ </text>
+ <text name="sim_field">
+ Nombre de la región
+ </text>
+ <text name="pos_title">
+ Posición:
+ </text>
+ <text name="pos_field">
+ {128.1, 128.1, 15.4}
+ </text>
+ <text name="select_object_label">
+ Pulsa el botón y luego el objeto a denunciar:
+ </text>
+ <button label="" label_selected="" name="pick_btn" tool_tip="Señalar objeto - Identificar un objeto como sujeto de esta denuncia"/>
+ <text name="object_name_label">
+ Objeto:
+ </text>
+ <text name="object_name">
+ Consetetur Sadipscing
+ </text>
+ <text name="owner_name_label">
+ Propietario:
+ </text>
+ <text name="owner_name">
+ Hendrerit Vulputate Kamawashi Longname
+ </text>
+ <combo_box name="category_combo" tool_tip="CategorÃa -- Elija la categorÃa que describa mejor esta denuncia">
+ <combo_box.item label="Elegir la categorÃa" name="Select_category"/>
+ <combo_box.item label="Edad > Jugar a ser niño" name="Age__Age_play"/>
+ <combo_box.item label="Edad > Residente adulto en Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="Edad > Residente menor de edad fuera de Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Ataque > Sandbox de combate / Zona no segura" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Ataque > Zona segura" name="Assault__Safe_area"/>
+ <combo_box.item label="Ataque > Sandbox de prueba de armas" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="Comercio > Error en la entrega de productos o servicios" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="Indiscreción > Información del mundo real" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="Indiscreción > Monitorizar a distancia el chat" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="Indiscreción > Información Se Second Life, el chat o los MI" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="Perturbando la paz > Abuso de los recursos de la región" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="Perturbando la paz > Excesivos objetos con script" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="Perturbando la paz > Objeto basura" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="Perturbando la paz > Spam (mensajes no pedidos) repetitivo" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="Perturbando la paz > Publicidad no deseada" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="Fraude > L$" name="Fraud__L$"/>
+ <combo_box.item label="Fraude > Terreno" name="Fraud__Land"/>
+ <combo_box.item label="Fraude > Esquemas piramidales o cadenas de cartas" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="Fraude > US$" name="Fraud__US$"/>
+ <combo_box.item label="Acoso > Anuncios múltiples / Spam visual" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="Acoso > Difamación de individuos o grupos" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="Acoso > Impedir el movimiento" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="Acoso > Acoso sexual" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="Acoso > Incitar a, o pedir, que otros violen las Condiciones del Servicio" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="Acoso > Abuso verbal" name="Harassment__Verbal_abuse"/>
+ <combo_box.item label="Indecencia > En general, contenido o conducta ofensivos" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="Indecencia > Nombre inapropiado del avatar" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="Indecencia > Contenido o conducta inapropiada en una región General" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Indecencia > Contenido o conducta inapropiada en una región Moderado" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Infracción de la propiedad intelectual > Eliminación de contenidos" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="Infracción de la propiedad intelectual > CopyBot o Exploit (programa malicioso) de permisos" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="Intolerancia" name="Intolerance"/>
+ <combo_box.item label="Terreno > Abuso de los recursos de un sandbox" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="Terreno > Invasión > Objetos/Texturas" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="Terreno > Invasión > PartÃculas" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="Terreno > Invasión > Ãrboles/Plantas" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="Apuestas/Juego" name="Wagering_gambling"/>
+ <combo_box.item label="Otra" name="Other"/>
+ </combo_box>
+ <text name="abuser_name_title">
+ Nombre del infractor:
+ </text>
+ <button label="Elegir" label_selected="" name="select_abuser" tool_tip="Elegir de una lista el nombre del infractor"/>
+ <text name="abuser_name_title2">
+ Localización de la infracción:
+ </text>
+ <text name="sum_title">
+ Resumen:
+ </text>
+ <text name="dscr_title">
+ Detalles:
+ </text>
+ <text name="bug_aviso">
+ Por favor, sé todo lo concreto que puedas
+ </text>
+ <text name="incomplete_title">
+ * Las denuncias incompletas no se investigarán
+ </text>
+ <button label="Denunciar la infracción" label_selected="Denunciar la infracción" name="send_btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_tos.xml b/indra/newview/skins/default/xui/es/floater_tos.xml index f4a0897d73..89092201d9 100644 --- a/indra/newview/skins/default/xui/es/floater_tos.xml +++ b/indra/newview/skins/default/xui/es/floater_tos.xml @@ -4,7 +4,7 @@ http://secondlife.com/app/tos/ </floater.string> <floater.string name="loading_url"> - data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Cargando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3Elas%20Condiciones%20del%20servicio%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <button label="Continuar" label_selected="Continuar" name="Continue"/> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/es/menu_favorites.xml b/indra/newview/skins/default/xui/es/menu_favorites.xml index c8a7858ddb..85210d5c49 100644 --- a/indra/newview/skins/default/xui/es/menu_favorites.xml +++ b/indra/newview/skins/default/xui/es/menu_favorites.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="Popup"> - <menu_item_call label="Teleportarse" name="Teleport To Landmark"/> + <menu_item_call label="Teleportar" name="Teleport To Landmark"/> <menu_item_call label="Ver/Editar el hito" name="Landmark Open"/> <menu_item_call label="Copiar la SLurl" name="Copy slurl"/> <menu_item_call label="Mostrar en el mapa" name="Show On Map"/> diff --git a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml index bee4c61da2..82fc8ddd39 100644 --- a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml @@ -4,7 +4,7 @@ <menu_item_call label="Añadir como amigo" name="add_friend"/> <menu_item_call label="MI" name="im"/> <menu_item_call label="Llamada" name="call"/> - <menu_item_call label="Teleportarse" name="teleport"/> + <menu_item_call label="Teleportar" name="teleport"/> <menu_item_call label="Invitar al grupo" name="invite_to_group"/> <menu_item_call label="Ignorar" name="block"/> <menu_item_call label="Designorar" name="unblock"/> diff --git a/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml index ed33c55aca..c482907812 100644 --- a/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml +++ b/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Teleport History Item Context Menu"> - <menu_item_call label="Teleportarse" name="Teleport"/> + <menu_item_call label="Teleportar" name="Teleport"/> <menu_item_call label="Más información" name="More Information"/> <menu_item_call label="Copiar al portapapeles" name="CopyToClipboard"/> </context_menu> diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 91a03023a1..99ae2b2335 100644 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -1,2952 +1,2952 @@ -<?xml version="1.0" encoding="utf-8"?> -<notifications> - <global name="skipnexttime"> - No mostrarme esto otra vez - </global> - <global name="alwayschoose"> - Elegir siempre esta opción - </global> - <global name="implicitclosebutton"> - Cerrar - </global> - <template name="okbutton"> - <form> - <button name="OK_okbutton" text="$yestext"/> - </form> - </template> - <template name="okignore"> - <form> - <button name="OK_okignore" text="$yestext"/> - </form> - </template> - <template name="okcancelbuttons"> - <form> - <button name="OK_okcancelbuttons" text="$yestext"/> - <button name="Cancel_okcancelbuttons" text="$notext"/> - </form> - </template> - <template name="okcancelignore"> - <form> - <button name="OK_okcancelignore" text="$yestext"/> - <button name="Cancel_okcancelignore" text="$notext"/> - </form> - </template> - <template name="okhelpbuttons"> - <form> - <button name="OK_okhelpbuttons" text="$yestext"/> - <button name="Help" text="$helptext"/> - </form> - </template> - <template name="yesnocancelbuttons"> - <form> - <button name="Yes" text="$yestext"/> - <button name="No" text="$notext"/> - <button name="Cancel_yesnocancelbuttons" text="$canceltext"/> - </form> - </template> - <notification functor="GenericAcknowledge" label="Mensaje de notificación desconocida" name="MissingAlert"> - Tu versión de [APP_NAME] no sabe cómo mostrar la notificación que acaba de recibir. Por favor, comprueba que tienes instalado el último Visor. - -Detalles del error: la notificación de nombre '[_NAME]' no se ha encontrado en notifications.xml. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="FloaterNotFound"> - Error: no se pudieron encontrar estos controles: - -[CONTROLS] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="TutorialNotFound"> - Actualmente, no hay un tutorial disponible. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="GenericAlert"> - [MESSAGE] - </notification> - <notification name="GenericAlertYesCancel"> - [MESSAGE] - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="SÃ"/> - </notification> - <notification name="BadInstallation"> - Ha habido un error actualizando [APP_NAME]. Por favor, [http://get.secondlife.com descarga la última versión] del Visor. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LoginFailedNoNetwork"> - No se puede conectar con [SECOND_LIFE_GRID]. - '[DIAGNOSTIC]' -Asegúrate de que tu conexión a Internet está funcionando adecuadamente. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MessageTemplateNotFound"> - No se ha encontrado la plantilla de mensaje [PATH]. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="WearableSave"> - ¿Guardar los cambios en las ropas o partes del cuerpo actuales? - <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardarlos" yestext="Guardarlos"/> - </notification> - <notification name="CompileQueueSaveText"> - Hubo un problema al subir el texto de un script por la siguiente razón: [REASON]. Por favor, inténtalo más tarde. - </notification> - <notification name="CompileQueueSaveBytecode"> - Hubo un problema al subir el script compilado por la siguiente razón: [REASON]. Por favor, inténtalo más tarde. - </notification> - <notification name="WriteAnimationFail"> - Hubo un problema al escribir los datos de la animación. Por favor, inténtalo más tarde. - </notification> - <notification name="UploadAuctionSnapshotFail"> - Hubo un problema al subir la foto de la subasta por la siguiente razón: [REASON] - </notification> - <notification name="UnableToViewContentsMoreThanOne"> - No se puede ver a la vez los contenidos de más de un Ãtem. Por favor, elige un solo objeto y vuelve a intentarlo. - </notification> - <notification name="SaveClothingBodyChanges"> - ¿Guardar todos los cambios en la ropa y partes del cuerpo? - <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardarlos" yestext="Guardarlos todos"/> - </notification> - <notification name="FriendsAndGroupsOnly"> - Quienes no sean tus amigos no sabrán que has elegido ignorar sus llamadas y mensajes instantáneos. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="FavoritesOnLogin"> - Nota: Al activar esta opción, cualquiera que utilice este ordenador podrá ver tu lista de lugares favoritos. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="GrantModifyRights"> - Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar, borrar o tomar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso. -¿Quieres conceder permisos de modificación a [NAME]? - <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> - </notification> - <notification name="GrantModifyRightsMultiple"> - Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso. -¿Quieres conceder permisos de modificación a los Residentes elegidos? - <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> - </notification> - <notification name="RevokeModifyRights"> - ¿Quieres retirar los permisos de modificación a [NAME]? - <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> - </notification> - <notification name="RevokeModifyRightsMultiple"> - ¿Quieres revocar los derechos de modificación a los residentes seleccionados? - <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> - </notification> - <notification name="UnableToCreateGroup"> - No se ha podido crear el grupo. -[MESSAGE] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="PanelGroupApply"> - [NEEDS_APPLY_MESSAGE] -[WANT_APPLY_MESSAGE] - <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Ignorar los cambios" yestext="Aplicar los cambios"/> - </notification> - <notification name="MustSpecifyGroupNoticeSubject"> - Para enviar un aviso de grupo debes especificar un asunto. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="AddGroupOwnerWarning"> - Vas a añadir miembros al rol de [ROLE_NAME]. -No podrás removérseles de ese rol, sino que deberán renunciar a él por sà mismos. -¿Estás seguro de que quieres seguir? - <usetemplate ignoretext="Confirmar que vas a añadir un nuevo propietario al grupo" name="okcancelignore" notext="No" yestext="SÃ"/> - </notification> - <notification name="AssignDangerousActionWarning"> - Vas a añadir la capacidad '[ACTION_NAME]' al rol '[ROLE_NAME]'. - - *ATENCIÓN* - Todos los miembros con esta capacidad podrán asignarse a sà mismos -y a otros miembros- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrÃan elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad. -¿Añadir esta capacidad a '[ROLE_NAME]'? - <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> - </notification> - <notification name="AssignDangerousAbilityWarning"> - Vas a añadir la capacidad '[ACTION_NAME]' al rol '[ROLE_NAME]'. - - *ATENCIÓN* - Todos los miembros con esta capacidad podrán asignarse a sà mismos -y a otros miembros- todas las capacidades, elevándose hasta poderes cercanos a los del propietario. -¿Añadir esta capacidad a '[ROLE_NAME]'? - <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> - </notification> - <notification name="AttachmentDrop"> - Vas a soltar tu anexado. - ¿Estás seguro de que quieres continuar? - <usetemplate ignoretext="Confirmar antes de soltar anexados" name="okcancelignore" notext="No" yestext="SÃ"/> - </notification> - <notification name="JoinGroupCanAfford"> - Entrar a este grupo cuesta [COST] L$. -¿Quieres hacerlo?? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Entrar"/> - </notification> - <notification name="JoinGroupNoCost"> - Vas a entrar al grupo [NAME]. -¿Quieres seguir? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Entrar"/> - </notification> - <notification name="JoinGroupCannotAfford"> - Entrar a este grupo cuesta [COST] L$. -No tienes dinero suficiente para entrar. - </notification> - <notification name="CreateGroupCost"> - Crear este grupo te costará 100 L$. -Los grupos necesitan más de un miembro. Si no, son borrados permanentemente. -Por favor, invita a miembros en las próximas 48 horas. - <usetemplate canceltext="Cancelar" name="okcancelbuttons" notext="Cancelar" yestext="Crear un grupo por 100 L$"/> - </notification> - <notification name="LandBuyPass"> - Por [COST] L$ puedes entrar a este terreno ('[PARCEL_NAME]') durante [TIME] horas. ¿Comprar un pase? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="SalePriceRestriction"> - El precio de venta tiene que ser mayor de 0 L$ si la venta es a cualquiera. -Por favor, elige a alguien concreto como comprador si la venta es por 0 L$. - </notification> - <notification name="ConfirmLandSaleChange"> - Los [LAND_SIZE] m² de terreno seleccionados se van a poner a la venta. -El precio de venta será de [SALE_PRICE] L$, y se autorizará la compra sólo a [NAME]. - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ConfirmLandSaleToAnyoneChange"> - ATENCIÓN: Marcando 'vender a cualquiera' hace que tu terreno esté disponible para toda la comunidad de [SECOND_LIFE], incluso para quienes no están en esta región. - -Los [LAND_SIZE] m² seleccionados de terreno se van a poner a la venta. -El precio de venta será de [SALE_PRICE] L$ y se autoriza la compra a [NAME]. - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ReturnObjectsDeededToGroup"> - ¿Estás seguro de que quieres devolver todos los objetos de esta parcela que estén compartidos con el grupo '[NAME]' al inventario de su propietario anterior? - -*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo! - -Objetos: [N] - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ReturnObjectsOwnedByUser"> - ¿Estás seguro de que quieres devolver al inventario de '[NAME]' todos los objetos que sean de su propiedad en esta parcela? - -Objetos: [N] - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ReturnObjectsOwnedBySelf"> - ¿Estás seguro de que quieres devolver a su inventario todos los objetos de los que eres propietario en esta parcela? - -Objetos: [N] - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ReturnObjectsNotOwnedBySelf"> - ¿Estás seguro de que quieres devolver todos los objetos de los que NO eres propietario en esta parcela al inventario de sus propietarios? -Los objetos transferibles que se hayan transferido al grupo se devolverán a sus propietarios previos. - -*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo! - -Objetos: [N] - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ReturnObjectsNotOwnedByUser"> - ¿Estás seguro de que quieres devolver todos los objetos de esta parcela que NO sean propiedad de [NAME] al inventario de su propietario? -Los objetos transferibles que se hayan transferido al grupo se devolverán a sus propietarios previos. - -*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo! - -Objetos: [N] - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ReturnAllTopObjects"> - ¿Estás seguro de que quieres devolver al inventario de su propietario todos los objetos de la lista? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="DisableAllTopObjects"> - ¿Estás seguro de que quieres desactivar todos los objetos de esta región? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ReturnObjectsNotOwnedByGroup"> - ¿Devolver a sus propietarios los objetos de esta parcela que NO estén compartidos con el grupo [NAME]? - -Objetos: [N] - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="UnableToDisableOutsideScripts"> - No se pueden desactivar los scripts. -Toda esta región tiene activado el 'daño'. -Para que funcionen las armas los scripts deben estar activados. - </notification> - <notification name="MultipleFacesSelected"> - Están seleccionadas varias caras. -Si sigues con esta acción, en las diferentes caras del objeto aparecerán distintas peticiones de los media. -Para colocar los media en una sola cara, marca la opción Elegir la cara y pulsa en la cara adecuada del objeto, y luego pulsa Añadir. - <usetemplate ignoretext="Los media se configurarán en las varias caras seleccionadas" name="okcancelignore" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="MustBeInParcel"> - Para configurar el Punto de llegada de la parcela, -debes estar dentro de ella. - </notification> - <notification name="PromptRecipientEmail"> - Por favor, escribe una dirección de correo electrónica válida para el/los receptor/es. - </notification> - <notification name="PromptSelfEmail"> - Por favor, escribe tu dirección de correo electrónico. - </notification> - <notification name="PromptMissingSubjMsg"> - ¿Foto por correo electrónico con el asunto o el mensaje por defecto? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ErrorProcessingSnapshot"> - Error al procesar los datos de la foto. - </notification> - <notification name="ErrorEncodingSnapshot"> - Error al codificar la foto. - </notification> - <notification name="ErrorUploadingPostcard"> - Hubo un problema al enviar la foto por la siguiente razón: [REASON] - </notification> - <notification name="ErrorUploadingReportScreenshot"> - Hubo un problema al subir la captura de pantalla del informe por la siguiente razón: [REASON] - </notification> - <notification name="MustAgreeToLogIn"> - Debes estar de acuerdo con las Condiciones del Servicio para continuar el inicio de sesión en [SECOND_LIFE]. - </notification> - <notification name="CouldNotPutOnOutfit"> - No se ha podido poner el vestuario. -La carpeta del vestuario contiene partes del cuerpo, u objetos a anexar o que no son ropa. - </notification> - <notification name="CannotWearTrash"> - No puedes vestirte ropas o partes del cuerpo que estén en la Papelera - </notification> - <notification name="MaxAttachmentsOnOutfit"> - No se puede anexar el objeto. -Se ha superado el lÃmite máximo de [MAX_ATTACHMENTS] objetos. Por favor, quÃtate alguno. - </notification> - <notification name="CannotWearInfoNotComplete"> - No puedes vestirte este Ãtem porque aún no se ha cargado. Por favor, inténtalo de nuevo en un minuto. - </notification> - <notification name="MustHaveAccountToLogIn"> - Lo sentimos. Se ha quedado algún espacio en blanco. -Tienes que volver a introducir el nombre de usuario de tu avatar. - -Necesitas una cuenta para acceder a [SECOND_LIFE]. ¿Te gustarÃa crear una ahora? - <url name="url"> - https://join.secondlife.com/index.php?lang=es-ES - </url> - <usetemplate name="okcancelbuttons" notext="Volver a intentarlo" yestext="Crear una cuenta nueva"/> - </notification> - <notification name="InvalidCredentialFormat"> - Escribe el nombre de usuario o el nombre y el apellido de tu avatar en el campo Nombre de usuario e inicia sesión otra vez. - </notification> - <notification name="DeleteClassified"> - ¿Borrar el clasificado '[NAME]'? -No se reembolsan las cuotas pagadas. - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="DeleteMedia"> - Has elegido borrar los media asociados a esta cara. -¿Estás seguro de que quieres continuar? - <usetemplate ignoretext="Confirmar antes de borrar los media de un objeto" name="okcancelignore" notext="No" yestext="SÃ"/> - </notification> - <notification name="ClassifiedSave"> - ¿Guardar los cambios en el clasificado [NAME]? - <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardar" yestext="Guardar"/> - </notification> - <notification name="ClassifiedInsufficientFunds"> - Dinero insuficiente para crear un clasificado. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="DeleteAvatarPick"> - ¿Borrar el destacado <nolink>[PICK]</nolink>? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="DeleteOutfits"> - ¿Eliminar el vestuario seleccionado? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="PromptGoToEventsPage"> - ¿Ir a la web de eventos de [SECOND_LIFE]? - <url name="url"> - http://secondlife.com/events/?lang=es-ES - </url> - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="SelectProposalToView"> - Por favor, selecciona qué propuesta quieres ver. - </notification> - <notification name="SelectHistoryItemToView"> - Por favor, selecciona un Ãtem del historial para verlo. - </notification> - <notification name="CacheWillClear"> - La caché se limpiará cuando reinices [APP_NAME]. - </notification> - <notification name="CacheWillBeMoved"> - La caché se moverá cuando reinicies [APP_NAME]. -Nota: esto vaciará la caché. - </notification> - <notification name="ChangeConnectionPort"> - La configuración del puerto tendrá efecto cuando reinicies [APP_NAME]. - </notification> - <notification name="ChangeSkin"> - Verás la nueva apariencia cuando reinicies [APP_NAME]. - </notification> - <notification name="ChangeLanguage"> - El cambio de idioma tendrá efecto cuando reinicies [APP_NAME]. - </notification> - <notification name="GoToAuctionPage"> - ¿Ir a la página web de [SECOND_LIFE] para ver los detalles de la subasta -o hacer una puja? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="SaveChanges"> - ¿Guardar los cambios? - <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardar" yestext="Guardar"/> - </notification> - <notification name="GestureSaveFailedTooManySteps"> - Fallo al guardar el gesto. -Este gesto tiene demasiados pasos. -Intenta quitarle algunos, y vuelve a guardarlo. - </notification> - <notification name="GestureSaveFailedTryAgain"> - Fallo al guardar el gesto. Por favor, vuelve a intentarlo en un minuto. - </notification> - <notification name="GestureSaveFailedObjectNotFound"> - No se ha podido guardar el gesto porque no se pudo encontrar el objeto o el objeto asociado. -El objeto debe de haber sido borrado o estar fuera de rango ('out of range'). - </notification> - <notification name="GestureSaveFailedReason"> - Al guardar un gesto, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde. - </notification> - <notification name="SaveNotecardFailObjectNotFound"> - No se ha podido guardar la nota porque no se pudo encontrar el objeto o el objeto asociado del inventario. -El objeto debe de haber sido borrado o estar fuera de rango ('out of range'). - </notification> - <notification name="SaveNotecardFailReason"> - Al guardar una nota, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarla más tarde. - </notification> - <notification name="ScriptCannotUndo"> - No se han podido deshacer todos los cambios en tu versión del script. -¿Quieres cargar la última versión guardada en el servidor? -(**Cuidado** No podrás deshacer esta operación). - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="SaveScriptFailReason"> - Al guardar un script, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde. - </notification> - <notification name="SaveScriptFailObjectNotFound"> - No se ha podido guardar el script porque no se pudo encontrar el objeto que incluye. -El objeto debe de haber sido borrado o estar fuera de rango ('out of range').. - </notification> - <notification name="SaveBytecodeFailReason"> - Al guardar un script compilado, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde.. - </notification> - <notification name="StartRegionEmpty"> - Perdón, no está definida tu Posición inicial. -Por favor, escribe el nombre de la región en el cajetÃn de Posición inicial, o elige para esa posición Mi Base o Mi última posición. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CouldNotStartStopScript"> - No se ha podido correr o parar el script porque no se pudo encontrar el objeto que incluye. -El objeto debe de haber sido borrado o estar fuera de rango ('out of range').. - </notification> - <notification name="CannotDownloadFile"> - No se ha podido descargar el archivo. - </notification> - <notification name="CannotWriteFile"> - No se ha podido escribir el archivo [[FILE]] - </notification> - <notification name="UnsupportedHardware"> - Debes saber que tu ordenador no cumple los requisitos mÃnimos para la utilización de [APP_NAME]. Puede que experimentes un rendimiento muy bajo. Desafortunadamente, [SUPPORT_SITE] no puede dar asistencia técnica a sistemas con una configuración no admitida. - -¿Ir a [_URL] para más información? - <url name="url" option="0"> - http://secondlife.com/support/sysreqs.php?lang=es - </url> - <usetemplate ignoretext="El hardware de mi ordenador no está admitido" name="okcancelignore" notext="No" yestext="SÃ"/> - </notification> - <notification name="UnknownGPU"> - Tu sistema usa una tarjeta gráfica que [APP_NAME] no reconoce. -Suele suceder con hardware nuevo que todavÃa no ha sido probado con [APP_NAME]. Probablemente todo irá bien, pero deberás ajustar tus configuraciones gráficas. -(Yo > Preferencias > Gráficos). - <form name="form"> - <ignore name="ignore" text="No se ha podido identificar mi tarjeta gráfica"/> - </form> - </notification> - <notification name="DisplaySettingsNoShaders"> - [APP_NAME] se cae al iniciar los 'driver' gráficos. -La calidad de los gráficos se configurará en Baja para prevenir algunos errores comunes de los gráficos. Esto desactivará algunas posibilidades gráficas. -Te recomendamos actualizar los 'drivers' de tu tarjeta gráfica. -La calidad gráfica puede ajustarse en Preferencias > Gráficos. - </notification> - <notification name="RegionNoTerraforming"> - En la región [REGION] no se permite modificar el terreno. - </notification> - <notification name="CannotCopyWarning"> - No tienes permiso para copiar los elementos siguientes: -[ITEMS] y, si los das, los perderás del inventario. ¿Seguro que quieres ofrecerlos? - <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> - </notification> - <notification name="CannotGiveItem"> - No se ha podido dar el Ãtem del inventario. - </notification> - <notification name="TransactionCancelled"> - Transacción cancelada. - </notification> - <notification name="TooManyItems"> - No puedes dar más de 42 Ãtems en una única transferencia del inventario. - </notification> - <notification name="NoItems"> - No tienes permiso para transferir el Ãtem seleccionado. - </notification> - <notification name="CannotCopyCountItems"> - No tienes permiso para copiar [COUNT] de los -Ãtems seleccionados. Si los das, los perderás de tu inventario. -¿Realmente quieres darlos? - <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> - </notification> - <notification name="CannotGiveCategory"> - No tienes permiso para transferir -la carpeta seleccionada. - </notification> - <notification name="FreezeAvatar"> - ¿Congelar a este avatar? -Temporalmente, será incapaz de moverse, usar el chat, o interactuar con el mundo. - <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Descongelarle" yestext="Congelarle"/> - </notification> - <notification name="FreezeAvatarFullname"> - ¿Congelar a [AVATAR_NAME]? -Temporalmente, será incapaz de moverse, usar el chat, o interactuar con el mundo. - <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Descongelarle" yestext="Congelarle"/> - </notification> - <notification name="EjectAvatarFullname"> - ¿Expulsar a [AVATAR_NAME] de tu terreno? - <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Expulsar y Prohibir el acceso" yestext="Expulsar"/> - </notification> - <notification name="EjectAvatarNoBan"> - ¿Expulsar a este avatar de tu terreno? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar"/> - </notification> - <notification name="EjectAvatarFullnameNoBan"> - ¿Expulsar a [AVATAR_NAME] de tu terreno? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar"/> - </notification> - <notification name="EjectAvatarFromGroup"> - Has expulsado a [AVATAR_NAME] del grupo [GROUP_NAME] - </notification> - <notification name="AcquireErrorTooManyObjects"> - ERROR 'ACQUIRE': Hay demasiados objetos seleccionados. - </notification> - <notification name="AcquireErrorObjectSpan"> - ERROR 'ACQUIRE': Los objetos están en más de una región. -Por favor, mueve todos los objetos a adquirir a la -misma región. - </notification> - <notification name="PromptGoToCurrencyPage"> - [EXTRA] - -¿Ir a [_URL] para informarte sobre la compra de L$? - <url name="url"> - http://secondlife.com/app/currency/?lang=es-ES - </url> - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="UnableToLinkObjects"> - No se pudo enlazar estos [COUNT] objetos. -Puedes enlazar [MAX] objetos como máximo. - </notification> - <notification name="CannotLinkIncompleteSet"> - Sólo puedes enlazar objetos completos (no sus partes), y debes -seleccionar más de uno. - </notification> - <notification name="CannotLinkModify"> - Imposible enlazarlos, porque no tienes permiso para modificar -todos los objetos. - -Por favor, asegúrate de que no hay ninguno bloqueado, y de que eres el propietario de todos. - </notification> - <notification name="CannotLinkDifferentOwners"> - Imposible enlazarlos, porque hay objetos de distintos propietarios. - -Por favor, asegúrate de que eres el propietario de todos los objetos seleccionados. - </notification> - <notification name="NoFileExtension"> - No hay extensión de archivo en: '[FILE]' - -Por favor, asegúrate de que la extensión del archivo es correcta. - </notification> - <notification name="InvalidFileExtension"> - Extensión inválida de archivo: [EXTENSION] -PodrÃa ser [VALIDS] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CannotUploadSoundFile"> - No se pudo abrir el archivo de sonido que has subido para leer: -[FILE] - </notification> - <notification name="SoundFileNotRIFF"> - No parece que el archivo sea un archivo RIFF WAVE: -[FILE] - </notification> - <notification name="SoundFileNotPCM"> - No parece que el archivo sea un archivo de audio PCM WAVE: -[FILE] - </notification> - <notification name="SoundFileInvalidChannelCount"> - El archivo no tiene un número de canales válido (debe ser mono o estéreo): -[FILE] - </notification> - <notification name="SoundFileInvalidSampleRate"> - No parece que el archivo tenga una frecuencia de muestreo (sample rate) adecuada (debe de ser 44.1k): -[FILE] - </notification> - <notification name="SoundFileInvalidWordSize"> - No parece que el archivo tenga un tamaño de palabra (word size) adecuado (debe de ser de 8 o 16 bites): -[FILE] - </notification> - <notification name="SoundFileInvalidHeader"> - No se encontró el fragmento 'data' en la cabecera del WAV: -[FILE] - </notification> - <notification name="SoundFileInvalidChunkSize"> - Tamaño de lote erróneo en el archivo WAV: -[FILE] - </notification> - <notification name="SoundFileInvalidTooLong"> - El archivo de audio es demasiado largo (10 segundos como máximo): -[FILE] - </notification> - <notification name="ProblemWithFile"> - Problemas con el archivo [FILE]: - -[ERROR] - </notification> - <notification name="CannotOpenTemporarySoundFile"> - No se ha podido abrir para su escritura el archivo comprimido de sonido: [FILE] - </notification> - <notification name="UnknownVorbisEncodeFailure"> - Códec Vorbis desconocido, fallo en : [FILE] - </notification> - <notification name="CannotEncodeFile"> - No se puede codificar el archivo: [FILE] - </notification> - <notification name="CorruptedProtectedDataStore"> - No se pueden rellenar el nombre de usuario y la contraseña. Esto puede deberse a un cambio de configuración de la red. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CorruptResourceFile"> - Archivo con los recursos corruptos: [FILE] - </notification> - <notification name="UnknownResourceFileVersion"> - Versión de archivo desconocida para el recurso Linden en el archivo: [FILE] - </notification> - <notification name="UnableToCreateOutputFile"> - No se ha podido crear el archivo de salida: [FILE] - </notification> - <notification name="DoNotSupportBulkAnimationUpload"> - Actualmente, [APP_NAME] no admite la subida masiva de animaciones. - </notification> - <notification name="CannotUploadReason"> - No se ha podido subir [FILE] por la siguiente razón: [REASON] -Por favor, inténtalo más tarde. - </notification> - <notification name="LandmarkCreated"> - Se ha añadido "[LANDMARK_NAME]" a tu carpeta [FOLDER_NAME]. - </notification> - <notification name="LandmarkAlreadyExists"> - Ya tienes un hito de esta localización. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CannotCreateLandmarkNotOwner"> - No puedes crear un hito aquà porque el propietario del terreno no lo permite. - </notification> - <notification name="CannotRecompileSelectObjectsNoScripts"> - No se pudo 'recompilar'. -Selecciona un objeto con script. - </notification> - <notification name="CannotRecompileSelectObjectsNoPermission"> - No se pudo 'recompilar'. - -Selecciona objetos con scripts en los que tengas permiso para modificarlos. - </notification> - <notification name="CannotResetSelectObjectsNoScripts"> - No se pudo 'reiniciar'. - -Selecciona objetos con scripts. - </notification> - <notification name="CannotResetSelectObjectsNoPermission"> - No se pudo 'reiniciar'. - -Selecciona objetos con scripts en los que tengas permiso para modificarlos. - </notification> - <notification name="CannotOpenScriptObjectNoMod"> - Imposible abrir el script del objeto sin modificar los permisos. - </notification> - <notification name="CannotSetRunningSelectObjectsNoScripts"> - No se puede configurar ningún script como 'ejecutándose'. - -Selecciona objetos con scripts. - </notification> - <notification name="CannotSetRunningNotSelectObjectsNoScripts"> - No se puede configurar ningún script como 'no ejecutándose'. - -Selecciona objetos con scripts. - </notification> - <notification name="NoFrontmostFloater"> - No hay nada que guardar. - </notification> - <notification name="SeachFilteredOnShortWords"> - Se ha modificado tu búsqueda, -eliminando las palabras demasiado cortas. - -Buscando: [FINALQUERY] - </notification> - <notification name="SeachFilteredOnShortWordsEmpty"> - Los términos de tu búsqueda son muy cortos, -por lo que no se ha hecho la búsqueda. - </notification> - <notification name="CouldNotTeleportReason"> - Fallo en el teleporte. -[REASON] - </notification> - <notification name="invalid_tport"> - Ha habido un problema al procesar tu petición de teleporte. Debes volver a iniciar sesión antes de poder teleportarte de nuevo. -Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE]. - </notification> - <notification name="invalid_region_handoff"> - Ha habido un problema al procesar tu paso a otra región. Debes volver a iniciar sesión para poder pasar de región a región. -Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE]. - </notification> - <notification name="blocked_tport"> - Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelve a intentarlo en un momento. Si sigues sin poder teleportarte, desconéctate y vuelve a iniciar sesión para solucionar el problema. - </notification> - <notification name="nolandmark_tport"> - Lo sentimos, pero el sistema no ha podido localizar el destino de este hito. - </notification> - <notification name="timeout_tport"> - Lo sentimos, pero el sistema no ha podido completar el teleporte. -Vuelve a intentarlo en un momento. - </notification> - <notification name="noaccess_tport"> - Lo sentimos, pero no tienes acceso al destino de este teleporte. - </notification> - <notification name="missing_attach_tport"> - Aún no han llegado tus objetos anexados. Espera unos segundos más o desconéctate y vuelve a iniciar sesión antes de teleportarte. - </notification> - <notification name="too_many_uploads_tport"> - La cola de espera en esta región está actualmente obstruida, por lo que tu petición de teleporte no se atenderá en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos o ve a una zona menos ocupada. - </notification> - <notification name="expired_tport"> - Lo sentimos, pero el sistema no ha podido atender a tu petición de teleporte en un tiempo prudencial. Por favor, vuelve a intentarlo en unos pocos minutos. - </notification> - <notification name="expired_region_handoff"> - Lo sentimos, pero el sistema no ha podido completar tu paso a otra región en un tiempo prudencial. Por favor, vuelve a intentarlo en unos pocos minutos. - </notification> - <notification name="no_host"> - Ha sido imposible encontrar el destino del teleporte: o está desactivado temporalmente o ya no existe. Por favor, vuelve a intentarlo en unos pocos minutos. - </notification> - <notification name="no_inventory_host"> - En estos momentos no está disponible el sistema del inventario. - </notification> - <notification name="CannotSetLandOwnerNothingSelected"> - No se ha podido configurar el propietario del terreno: -no se ha seleccionado una parcela. - </notification> - <notification name="CannotSetLandOwnerMultipleRegions"> - No se ha podido obtener la propiedad del terreno porque la selección se extiende por varias regiones. Por favor, selecciona un área más pequeña y vuelve a intentarlo. - </notification> - <notification name="ForceOwnerAuctionWarning"> - Esta parcela está subastándose. Forzar su propiedad cancelará la subasta y, potencialmente, puede disgustar a algunos residentes si la puja ya ha empezado. -¿Forzar la propiedad? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="CannotContentifyNothingSelected"> - No se ha podido 'contentify': -no se ha seleccionado una parcela. - </notification> - <notification name="CannotContentifyNoRegion"> - No se ha podido 'contentify': -no se ha seleccionado una región. - </notification> - <notification name="CannotReleaseLandNothingSelected"> - No se ha podido abandonar el terreno: -no se ha seleccionado una parcela. - </notification> - <notification name="CannotReleaseLandNoRegion"> - No se ha podido abandonar el terreno: -no se ha podido encontrar la región. - </notification> - <notification name="CannotBuyLandNothingSelected"> - Imposible comprar terreno: -no se ha seleccionado una parcela. - </notification> - <notification name="CannotBuyLandNoRegion"> - Imposible comprar terreno: -no se ha podido encontrar en qué región está. - </notification> - <notification name="CannotCloseFloaterBuyLand"> - No puedes cerrar la ventana de Comprar terreno hasta que [APP_NAME] calcule el precio de esta transacción. - </notification> - <notification name="CannotDeedLandNothingSelected"> - No se ha podido transferir el terreno: -no se ha seleccionado una parcela. - </notification> - <notification name="CannotDeedLandNoGroup"> - No se ha podido transferir el terreno: -no has seleccionado un grupo. - </notification> - <notification name="CannotDeedLandNoRegion"> - No se ha podido transferir el terreno: -Ha sido imposible encontrar en qué región está. - </notification> - <notification name="CannotDeedLandMultipleSelected"> - No se ha podido transferir el terreno: -has seleccionado varias parcelas. - -Inténtalo seleccionando sólo una. - </notification> - <notification name="CannotDeedLandWaitingForServer"> - No se ha podido transferir el terreno: -esperando que el servidor informe acerca de la propiedad. - -Por favor, vuelve a intentarlo. - </notification> - <notification name="CannotDeedLandNoTransfer"> - No se ha podido transferir el terreno: -En la región [REGION] no se permite transferir terrenos. - </notification> - <notification name="CannotReleaseLandWatingForServer"> - No se ha podido abandonar el terreno: -esperando que el servidor actualice la información de la parcela. - -Vuelve a intentarlo en unos segundos. - </notification> - <notification name="CannotReleaseLandSelected"> - No se ha podido abandonar el terreno: -no eres propietario de todas las parcelas seleccionadas. - -Por favor, selecciona una sola parcela. - </notification> - <notification name="CannotReleaseLandDontOwn"> - No se ha podido abandonar el terreno: -no tienes permisos sobre esta parcela. -Las parcelas de tu propiedad se muestran en verde. - </notification> - <notification name="CannotReleaseLandRegionNotFound"> - No se ha podido abandonar el terreno: -Ha sido imposible encontrar en qué región está. - </notification> - <notification name="CannotReleaseLandNoTransfer"> - No se ha podido abandonar el terreno: -En la región [REGION] no se permite transferir terrenos. - </notification> - <notification name="CannotReleaseLandPartialSelection"> - No se ha podido abandonar el terreno: -debes seleccionar toda la parcela. - -Selecciona una parcela completa, o divÃdela primero. - </notification> - <notification name="ReleaseLandWarning"> - Vas a abandonar [AREA] m² de terreno. -Al hacerlo, la quitarás de entre tus posesiones de terreno, pero no recibirás ningún L$. - -¿Abandonar este terreno? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="CannotDivideLandNothingSelected"> - No se ha podido dividir el terreno: - -No has seleccionado ninguna parcela. - </notification> - <notification name="CannotDivideLandPartialSelection"> - No se ha podido dividir el terreno: - -Has seleccionado una parcela entera. -Inténtalo seleccionando una parte. - </notification> - <notification name="LandDivideWarning"> - Dividir este terreno lo separará en dos parcelas, cada una de las cuales tendrá su propia configuración. Tras esta operación, algunas configuraciones volverán a las existentes por defecto. - -¿Dividir el terreno? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="CannotDivideLandNoRegion"> - No se ha podido dividir el terreno: -Ha sido imposible encontrar en qué región está. - </notification> - <notification name="CannotJoinLandNoRegion"> - No se ha podido unir el terreno: -Ha sido imposible encontrar en qué región está. - </notification> - <notification name="CannotJoinLandNothingSelected"> - No se ha podido unir el terreno: -No hay parcelas seleccionadas. - </notification> - <notification name="CannotJoinLandEntireParcelSelected"> - No se ha podido unir el terreno: -Sólo has seleccionado una parcela. - -Selecciona terreno que incluya algo de ambas parcelas. - </notification> - <notification name="CannotJoinLandSelection"> - No se ha podido unir el terreno: -Debes seleccionar más de una parcela. - -Selecciona terreno que incluya algo de ambas parcelas. - </notification> - <notification name="JoinLandWarning"> - Al unir este terreno crearás una parcela más grande formada por todas aquellas que tengan parte en el rectángulo seleccionado. -Deberás reconfigurar el nombre y las opciones de la nueva parcela. - -¿Unir el terreno? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ConfirmNotecardSave"> - Esta nota debe guardarse antes de que puedas copiarla o verla. ¿Guardar la nota? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ConfirmItemCopy"> - ¿Copiar este Ãtem a tu inventario? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Copiar"/> - </notification> - <notification name="ResolutionSwitchFail"> - Fallo al cambiar la resolución a [RESX] por [RESY] - </notification> - <notification name="ErrorUndefinedGrasses"> - Error, hierbas no definidas: [SPECIES] - </notification> - <notification name="ErrorUndefinedTrees"> - Error, árboles no definidos: [SPECIES] - </notification> - <notification name="CannotSaveWearableOutOfSpace"> - No se ha podido guardar el archivo '[NAME]'. Tendrás que liberar algo de espacio en tu ordenador y guardarlo de nuevo. - </notification> - <notification name="CannotSaveToAssetStore"> - No se ha podido guardar [NAME] en la base central de almacenamiento. -Generalmente, esto es un fallo pasajero. Por favor, personaliza y guarda el Ãtem de aquà a unos minutos. - </notification> - <notification name="YouHaveBeenLoggedOut"> - Vaya, se ha cerrado tu sesión en [SECOND_LIFE]. - [MESSAGE] - <usetemplate name="okcancelbuttons" notext="Salir" yestext="Ver MI y Chat"/> - </notification> - <notification name="OnlyOfficerCanBuyLand"> - No se ha podido comprar terreno para el grupo: -no tienes el permiso de comprar terreno para el grupo que tienes activado actualmente. - </notification> - <notification label="Añadir como amigo" name="AddFriendWithMessage"> - Los amigos pueden darse permiso para localizarse en el mapa y para saber si el otro está conectado. - -¿Ofrecer a [NAME] que sea tu amigo? - <form name="form"> - <input name="message"> - ¿Quieres formar parte de mis amigos? - </input> - <button name="Offer" text="OK"/> - <button name="Cancel" text="Cancelar"/> - </form> - </notification> - <notification label="Guardar el vestuario" name="SaveOutfitAs"> - Guardar como un nuevo vestuario lo que estoy llevando: - <form name="form"> - <input name="message"> - [DESC] (nuevo) - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Cancelar"/> - </form> - </notification> - <notification label="Guardar artÃculo" name="SaveWearableAs"> - Guardar el Ãtem en mi inventario como: - <form name="form"> - <input name="message"> - [DESC] (nuevo) - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Cancelar"/> - </form> - </notification> - <notification label="Renombrar el vestuario" name="RenameOutfit"> - Nombre del nuevo vestuario: - <form name="form"> - <input name="new_name"> - [NAME] - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Cancelar"/> - </form> - </notification> - <notification name="RemoveFromFriends"> - ¿Quieres eliminar a [NAME] de tu lista de amigos? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="RemoveMultipleFromFriends"> - ¿Quieres quitar a varios amigos de tu lista de amigos? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="GodDeleteAllScriptedPublicObjectsByUser"> - ¿Estás seguro de que quieres borrar todos los objetos con script que sean propiedad de -** [AVATAR_NAME] ** -en todos los otros terrenos de este sim? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="GodDeleteAllScriptedObjectsByUser"> - ¿Estás seguro de que quieres BORRAR TODOS los objetos con script que sean propiedad de -** [AVATAR_NAME] ** -en TODO EL TERRENO de este sim? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="GodDeleteAllObjectsByUser"> - ¿Estás seguro de que quieres BORRAR TODOS los objetos (con script o no) que sean propiedad de -** [AVATAR_NAME] ** -en TODO EL TERRENO de este sim? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="BlankClassifiedName"> - Debes especificar un nombre para tu clasificado. - </notification> - <notification name="MinClassifiedPrice"> - El pago para aparecer en la lista debe ser de, al menos, [MIN_PRICE] L$. - -Por favor, elige un pago mayor. - </notification> - <notification name="ConfirmItemDeleteHasLinks"> - Por lo menos uno de los elementos seleccionados contiene vÃnculos que le señalan. Si eliminas este elemento, los vÃnculos dejarán de funcionar permanentemente. Lo más recomendable es eliminar primero los vÃnculos. - -¿Estás seguro de que quieres eliminar los elementos? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLock"> - Al menos uno de los Ãtems que has seleccionado está bloqueado. - -¿Estás seguro de que quieres borrar estos Ãtems? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoCopy"> - Al menos uno de los Ãtems que has seleccionado no es copiable. - -¿Estás seguro de que quieres borrar estos Ãtems? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoOwn"> - No eres el propietario de, al menos, uno de los Ãtems que has seleccionado. - -¿Estás seguro de que quieres borrar estos Ãtems? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoCopy"> - Al menos un objeto está bloqueado. -Al menos un objeto no es copiable. - -¿Estás seguro de que quieres borrar estos Ãtems? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoOwn"> - Al menos un objeto está bloqueado. -No eres propietario de, al menos, un objeto. - -¿Estás seguro de que quieres borrar estos Ãtems? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoCopyNoOwn"> - Al menos un objeto no es copiable. -No eres propietario de, al menos, un objeto. - -¿Estás seguro de que quieres borrar estos Ãtems? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> - Al menos un objeto está bloqueado. -Al menos un objeto no es copiable. -No eres propietario de, al menos, un objeto. - -¿Estás seguro de que quieres borrar estos Ãtems? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeLock"> - Al menos un objeto está bloqueado. - -¿Estás seguro de que quieres tomar estos Ãtems? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeNoOwn"> - No eres el propietario de todos los objetos que estás tomando. -Si sigues, se aplicarán los permisos marcados para el próximo propietario, y es posible que se restrinja tu posibilidad de hacer modificaciones o copias. - -¿Estás seguro de que quieres tomar estos Ãtems? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeLockNoOwn"> - Al menos un objeto está bloqueado. -No eres el propietario de todos los objetos que estás tomando. -Si sigues, se aplicarán los permisos marcados para el próximo propietario, y es posible que se restrinja tu posibilidad de hacer modificaciones o copias. -Con todo, puedes tomar lo actualmente seleccionado. - -¿Estás seguro de que quieres tomar estos Ãtems? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="CantBuyLandAcrossMultipleRegions"> - No se ha podido hacer la compra porque el terreno seleccionado se extiende por varias regiones. - -Por favor, selecciona un área más pequeña y vuelve a intentarlo. - </notification> - <notification name="DeedLandToGroup"> - Al transferir esta parcela, se requerirá al grupo que tenga y mantenga el crédito suficiente para uso de terreno. -El precio de compra de la parcela no se reembolsa al propietario. -Si se vende una parcela transferida, el precio de venta se dividirá a partes iguales entre los miembros del grupo. - -¿Transferir estos [AREA] m² de terreno al grupo -'[GROUP_NAME]'? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="DeedLandToGroupWithContribution"> - Al transferir esta parcela, el grupo deberá poseer y mantener el número suficiente de créditos de uso de terreno. -El traspaso incluirá una contribución simultánea de terreno al grupo de "[NAME]". -El precio de compra del terreno no se le devolverá al propietario. Si se vende una parcela transferida, el precio de venta se dividirá en partes iguales entre los miembros del grupo. - -¿Transferir este terreno de [AREA] m² al grupo '[GROUP_NAME]'? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="DisplaySetToSafe"> - Las configuraciones que se muestran se han fijado en los niveles guardados, pues especificaste la opción de guardarlos. - </notification> - <notification name="DisplaySetToRecommended"> - Las configuraciones que se muestran se han fijado en los niveles recomendados para la configuración de tu sistema. - </notification> - <notification name="ErrorMessage"> - [ERROR_MESSAGE] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="AvatarMovedDesired"> - La localización que querÃas no está disponible en estos momentos. -Se te ha llevado a una región cercana. - </notification> - <notification name="AvatarMovedLast"> - En estos momentos no está disponible tu última posición. -Se te ha llevado a una región cercana. - </notification> - <notification name="AvatarMovedHome"> - En estos momentos no está disponible tu Base. -Se te ha llevado a una región cercana. -Quizá quieras configurar una nueva posición para tu Base. - </notification> - <notification name="ClothingLoading"> - Aún está descargándose tu ropa. -Puedes usar [SECOND_LIFE] de forma normal; los demás residentes te verán correctamente. - <form name="form"> - <ignore name="ignore" text="La ropa está tardando mucho en descargarse"/> - </form> - </notification> - <notification name="FirstRun"> - Se ha completado la instalación de [SECOND_LIFE]. - -Si es la primera vez que usas [SECOND_LIFE], debes crear una cuenta antes de poder iniciar una sesión. -¿Volver a [http://join.secondlife.com secondlife.com] para crear una cuenta nueva? - <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Cuenta nueva..."/> - </notification> - <notification name="LoginPacketNeverReceived"> - Tenemos problemas de conexión. Puede deberse a un problema de tu conexión a Internet o de [SECOND_LIFE_GRID]. - -Puedes revisar tu conexión a Internet y volver a intentarlo en unos minutos, pulsar Ayuda para conectarte a [SUPPORT_SITE], o pulsar Teleporte para intentar teleportarte a tu Base. - <url name="url"> - http://es.secondlife.com/support/ - </url> - <form name="form"> - <button name="OK" text="OK"/> - <button name="Help" text="Ayuda"/> - <button name="Teleport" text="Teleportar"/> - </form> - </notification> - <notification name="WelcomeChooseSex"> - Tu personaje aparecerá en un momento. - -Para caminar, usa las teclas del cursor. -En cualquier momento, puedes pulsar la tecla F1 para conseguir ayuda o para aprender más acerca de [SECOND_LIFE]. -Por favor, elige el avatar masculino o femenino. -Puedes cambiar más adelante tu elección. - <usetemplate name="okcancelbuttons" notext="Mujer" yestext="Varón"/> - </notification> - <notification name="CantTeleportToGrid"> - No se puede hacer el teleporte a [SLURL] porque se encuentra en una cuadrÃcula ([GRID]) diferente de la actual ([CURRENT_GRID]). Cierra el visor y vuelve a intentarlo. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="GeneralCertificateError"> - No se puede establecer la conexión con el servidor. -[REASON] - -Nombre del asunto: [SUBJECT_NAME_STRING] -Nombre del emisor: [ISSUER_NAME_STRING] -Válido desde: [VALID_FROM] -Válido hasta: [VALID_TO] -Huella digital MD5: [SHA1_DIGEST] -Huella digital SHA1: [MD5_DIGEST] -Uso de la clave: [KEYUSAGE] -Uso de clave extendida: [EXTENDEDKEYUSAGE] -Identificador de clave de asunto: [SUBJECTKEYIDENTIFIER] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="TrustCertificateError"> - La autoridad de certificación de este servidor se desconoce. - -Información del certificado: -Nombre del asunto: [SUBJECT_NAME_STRING] -Nombre del emisor: [ISSUER_NAME_STRING] -Válido desde: [VALID_FROM] -Válido hasta: [VALID_TO] -Huella digital MD5: [SHA1_DIGEST] -Huella digital SHA1: [MD5_DIGEST] -Uso de la clave: [KEYUSAGE] -Uso de clave extendida: [EXTENDEDKEYUSAGE] -Identificador de clave de asunto: [SUBJECTKEYIDENTIFIER] - -¿Deseas confiar en esta autoridad? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Confiar"/> - </notification> - <notification name="NotEnoughCurrency"> - [NAME] cuesta [PRICE] L$. No tienes suficientes L$ para hacer eso. - </notification> - <notification name="GrantedModifyRights"> - [NAME] te ha dado permiso para modificar sus objetos. - </notification> - <notification name="RevokedModifyRights"> - Ha sido revocado tu privilegio de modificar los objetos de [NAME] - </notification> - <notification name="FlushMapVisibilityCaches"> - Esto limpiará las cachés del mapa en esta región. -Esto sólo es realmente útil para cuestiones de depuración ('debugging'). -(A efectos prácticos, espera 5 minutos, y el mapa de cualquiera se actualizará después de que reinicies sesión). - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="BuyOneObjectOnly"> - No se puede comprar más de un objeto a la vez. Por favor, selecciona sólo un objeto y vuelve a intentarlo. - </notification> - <notification name="OnlyCopyContentsOfSingleItem"> - No se puede copiar a la vez los contenidos de más de un objeto. -Por favor, selecciona sólo uno y vuelve a intentarlo. - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="KickUsersFromRegion"> - ¿Teleportar a tu base a todos los residentes en esta región? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="EstateObjectReturn"> - ¿Estás seguro de que quieres devolver los objetos propiedad de -[USER_NAME] ? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="InvalidTerrainBitDepth"> - No se han podido configurar las texturas de la región: -La textura del terreno [TEXTURE_NUM] tiene una profundidad de bites inválida: [TEXTURE_BIT_DEPTH]. - -Cambia la textura [TEXTURE_NUM] por una imagen de 24-bit y 512x512 o menor, y pulsa de nuevo 'Aplicar' . - </notification> - <notification name="InvalidTerrainSize"> - No se han podido configurar las texturas de la región: -La textura del terreno [TEXTURE_NUM] es demasiado grande: [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]. - -Cambia la textura [TEXTURE_NUM] por una imagen de 24-bit y 512x512 o menor, y pulsa de nuevo 'Aplicar' . - </notification> - <notification name="RawUploadStarted"> - Ha empezado la subida. Dependiendo de la velocidad de tu conexión, llevará unos dos minutos. - </notification> - <notification name="ConfirmBakeTerrain"> - ¿Realmente quieres predeterminar el terreno actual, haciéndolo el centro de los limites para elevarlo y rebajarlo, y el terreno por defecto para la herramienta 'Revertir'? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="MaxAllowedAgentOnRegion"> - Sólo puedes tener [MAX_AGENTS] residentes autorizados. - </notification> - <notification name="MaxBannedAgentsOnRegion"> - Sólo puedes tener [MAX_BANNED] residentes no admitidos. - </notification> - <notification name="MaxAgentOnRegionBatch"> - Fallo al intentar añadir [NUM_ADDED] agentes: -Se superan en [NUM_EXCESS] los [MAX_AGENTS] permitidos en [LIST_TYPE]. - </notification> - <notification name="MaxAllowedGroupsOnRegion"> - Sólo puedes tener [MAX_GROUPS] grupos permitidos. - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Predeterminar"/> - </notification> - <notification name="MaxManagersOnRegion"> - Sólo puedes tener [MAX_MANAGER] administradores del estado. - </notification> - <notification name="OwnerCanNotBeDenied"> - No se puede añadir a la lista de residentes no admitidos al propietario del estado. - </notification> - <notification name="CanNotChangeAppearanceUntilLoaded"> - No puedes cambiar la apariencia hasta que no se carguen la ropa y la forma. - </notification> - <notification name="ClassifiedMustBeAlphanumeric"> - El nombre de tu anuncio clasificado debe empezar o con un número o con una letra de la A a la Z. No se permiten signos de puntuación. - </notification> - <notification name="CantSetBuyObject"> - No puede configurar el Comprar el objeto, porque éste no está en venta. -Por favor, pon en venta el objeto y vuelve a intentarlo. - </notification> - <notification name="FinishedRawDownload"> - Acabada la descarga del archivo raw de terreno en: -[DOWNLOAD_PATH]. - </notification> - <notification name="DownloadWindowsMandatory"> - Hay una versión nueva de [SECOND_LIFE] disponible. -[MESSAGE] -Debes descargar esta actualización para usar [SECOND_LIFE]. - <usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargarla"/> - </notification> - <notification name="DownloadWindows"> - Hay una versión actualizada de [SECOND_LIFE] disponible. -[MESSAGE] -Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad. - <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/> - </notification> - <notification name="DownloadWindowsReleaseForDownload"> - Hay una versión actualizada de [SECOND_LIFE] disponible. -[MESSAGE] -Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad. - <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/> - </notification> - <notification name="DownloadLinuxMandatory"> - Hay una versión nueva de [SECOND_LIFE] disponible. -[MESSAGE] -Debes descargar esta actualización para usar [SECOND_LIFE]. - <usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargar"/> - </notification> - <notification name="DownloadLinux"> - Hay una versión actualizada de [SECOND_LIFE] disponible. -[MESSAGE] -Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad. - <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargar"/> - </notification> - <notification name="DownloadLinuxReleaseForDownload"> - Hay una versión actualizada de [SECOND_LIFE] disponible. -[MESSAGE] -Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad. - <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargar"/> - </notification> - <notification name="DownloadMacMandatory"> - Hay una versión nueva de [SECOND_LIFE] disponible. -[MESSAGE] -Debes descargar esta actualización para usar [SECOND_LIFE]. - -¿Descargarla a tu carpeta de Programas? - <usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargarla"/> - </notification> - <notification name="DownloadMac"> - Hay una versión actualizada de [SECOND_LIFE] disponible. -[MESSAGE] -Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad. - -¿Descargarla a tu carpeta de Programas? - <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/> - </notification> - <notification name="DownloadMacReleaseForDownload"> - Hay una versión actualizada de [SECOND_LIFE] disponible. -[MESSAGE] -Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad. - -¿Descargarla a tu carpeta de Programas? - <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/> - </notification> - <notification name="FailedUpdateInstall"> - Se ha producido un error al instalar la actualización del visor. -Descarga e instala el último visor a través de -http://secondlife.com/download. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="FailedRequiredUpdateInstall"> - No hemos podido instalar una actualización necesaria. -No podrás iniciar sesión hasta que [APP_NAME] se haya actualizado. - -Descarga e instala el último visor a través de -http://secondlife.com/download. - <usetemplate name="okbutton" yestext="Salir"/> - </notification> - <notification name="UpdaterServiceNotRunning"> - Hay una actualización necesaria para la instalación de Second Life. - -Puedes descargar esta actualización de http://www.secondlife.com/downloads -o instalarla ahora. - <usetemplate name="okcancelbuttons" notext="Salir de Second Life" yestext="Descargar e instalar ahora"/> - </notification> - <notification name="DownloadBackgroundTip"> - Hemos descargado una actualización para la instalación de [APP_NAME]. -Versión [VERSION] [[RELEASE_NOTES_FULL_URL]; información acerca de esta actualización] - <usetemplate name="okcancelbuttons" notext="Más tarde..." yestext="Instalar ahora y reiniciar [NOMBRE_APL]"/> - </notification> - <notification name="DownloadBackgroundDialog"> - Hemos descargado una actualización para la instalación de [APP_NAME]. -Versión [VERSION] [[RELEASE_NOTES_FULL_URL]; información acerca de esta actualización] - <usetemplate name="okcancelbuttons" notext="Más tarde..." yestext="Instalar ahora y reiniciar [APP_NAME]"/> - </notification> - <notification name="RequiredUpdateDownloadedVerboseDialog"> - Hemos descargado una actualización de software necesaria. -Versión [VERSION] - -Debemos reiniciar [APP_NAME] para instalar la actualización. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="RequiredUpdateDownloadedDialog"> - Debemos reiniciar [APP_NAME] para instalar la actualización. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="DeedObjectToGroup"> - Transferir este objeto al grupo hará que: -* Reciba los L$ pagados en el objeto - <usetemplate ignoretext="Confirmar antes de transferir un objeto al grupo" name="okcancelignore" notext="Cancelar" yestext="Transferir"/> - </notification> - <notification name="WebLaunchExternalTarget"> - ¿Quieres abrir tu navegador para ver este contenido? - <usetemplate ignoretext="Abrir mi navegador para ver una página web" name="okcancelignore" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="WebLaunchJoinNow"> - ¿Ir al [http://secondlife.com/account/ Panel de Control] para administrar tu cuenta? - <usetemplate ignoretext="Abrir mi navegador para administrar mi cuenta" name="okcancelignore" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="WebLaunchSecurityIssues"> - Visita el wiki de [SECOND_LIFE] para más detalles sobre cómo informar de una cuestión de seguridad. - <usetemplate ignoretext="Abrir mi navegador para informar de un fallo de seguridad" name="okcancelignore" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="WebLaunchQAWiki"> - Visita el wiki QA de [SECOND_LIFE]. - <usetemplate ignoretext="Abrir mi navegador para el ver el wiki de 'QA' (Control de Calidad)" name="okcancelignore" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="WebLaunchPublicIssue"> - Visita el Public Issue Tracker (sistema público de seguimiento de incidencias) de [SECOND_LIFE], donde podrás informar de errores y otros asuntos. - <usetemplate ignoretext="Abrir mi navegador para usar el 'Public Issue Tracker'" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/> - </notification> - <notification name="WebLaunchSupportWiki"> - Para ver las últimas noticias e informaciones, ¿ir la Blog oficial? - <usetemplate ignoretext="Abrir mi navegador para ver el blog" name="okcancelignore" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="WebLaunchLSLGuide"> - ¿Quieres abrir la GuÃa de Script para tener ayuda sobre el tema? - <usetemplate ignoretext="Abrir mi navegador para ver la GuÃa de Script" name="okcancelignore" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="WebLaunchLSLWiki"> - ¿Quieres visitar el portal de LSL para tener ayuda sobre manejo de scripts? - <usetemplate ignoretext="Abrir mi navegador para ver el portal de LSL" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/> - </notification> - <notification name="ReturnToOwner"> - ¿Estás seguro de que quieres devolver los objetos seleccionados a sus propietarios? Los objetos transferibles que se hayan cedido volverán a sus propietarios anteriores. - -*ATENCIÓN* ¡Serán borrados los objetos no transferibles que estén cedidos! - <usetemplate ignoretext="Confirmar antes de devolver objetos a sus propietarios." name="okcancelignore" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="GroupLeaveConfirmMember"> - Actualmente, eres miembro del grupo [GROUP]. -¿Dejar el grupo? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ConfirmKick"> - ¿Quieres realmente expulsar a todos los residentes de la cuadrÃcula? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar a todos los Residentes"/> - </notification> - <notification name="MuteLinden"> - Lo sentimos, pero no puedes ignorar a un Linden. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CannotStartAuctionAlreadyForSale"> - No puedes empezar una subasta en una parcela que ya está en venta. Desactiva la venta de terreno si estás seguro de querer iniciar una subasta. - </notification> - <notification label="Falló ignorar el objeto según su nombre." name="MuteByNameFailed"> - Ya has ignorado este nombre. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="RemoveItemWarn"> - Aunque esté permitido, borrar contenidos puede dañar el objeto. -¿Quieres borrar ese Ãtem? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="CantOfferCallingCard"> - En este momento, no se puede ofrecer una tarjeta de visita. Por favor, vuelve a intentarlo en un momento. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CantOfferFriendship"> - En este momento, no se puede ofrecer el ser amigo. Por favor, vuelve a intentarlo en un momento. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="BusyModeSet"> - Pasar al modo ocupado. -Se ocultará el chat y los mensajes instantáneos (éstos recibirán tu Respuesta en el modo ocupado). Se rehusarán todos los ofrecimientos de teleporte. Todas las ofertas de inventario irán a tu Papelera. - <usetemplate ignoretext="Cambio mi estado al modo ocupado" name="okignore" yestext="OK"/> - </notification> - <notification name="JoinedTooManyGroupsMember"> - Has superado tu número máximo de grupos. Por favor, sal de al menos uno antes de entrar en éste, o rehúsa la oferta. -[NAME] te ha invitado a ser miembro de un grupo. - <usetemplate name="okcancelbuttons" notext="Rehusar" yestext="Entrar"/> - </notification> - <notification name="JoinedTooManyGroups"> - Has superado tu número máximo de grupos. Por favor, sal de al menos uno de ellos antes de crear uno nuevo o entrar en alguno. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="KickUser"> - ¿Con qué mensaje quieres expulsar a este Residente? - <form name="form"> - <input name="message"> - Un administrador te ha desconectado. - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Cancelar"/> - </form> - </notification> - <notification name="KickAllUsers"> - ¿Con qué mensaje se expulsará a cualquiera que esté actualmente en el grid? - <form name="form"> - <input name="message"> - Un administrador te ha desconectado. - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Cancelar"/> - </form> - </notification> - <notification name="FreezeUser"> - ¿Con qué mensaje quieres congelar a este residente? - <form name="form"> - <input name="message"> - Has sido congelado. No puedes moverte o escribir en el chat. Un administrador se pondrá en contacto contigo a través de un mensaje instantáneo (MI). - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Cancelar"/> - </form> - </notification> - <notification name="UnFreezeUser"> - ¿Con qué mensaje quieres congelar a este residente? - <form name="form"> - <input name="message"> - Ya no estás congelado. - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Cancelar"/> - </form> - </notification> - <notification name="SetDisplayNameSuccess"> - ¡Hola, [DISPLAY_NAME]! - -Al igual que en la vida real, normalmente se tarda algún tiempo en aprender nombres nuevos. Te recomendamos que esperes varios dÃas antes de [http://wiki.secondlife.com/wiki/Setting_your_display_name your name to update] en objetos, scripts, búsquedas, etc. - </notification> - <notification name="SetDisplayNameBlocked"> - Lo sentimos. No puedes cambiar tu nombre mostrado. Si crees que se trata de un error, ponte en contacto con soporte. - </notification> - <notification name="SetDisplayNameFailedLength"> - Lo sentimos. El nombre es demasiado largo. Los nombres mostrados pueden tener un máximo de [LENGTH] caracteres. - -Prueba con un nombre más corto. - </notification> - <notification name="SetDisplayNameFailedGeneric"> - Lo sentimos. No hemos podido configurar tu nombre mostrado. Vuelve a intentarlo más tarde. - </notification> - <notification name="SetDisplayNameMismatch"> - Los nombres mostrados introducidos no coinciden. Vuelve a introducirlos. - </notification> - <notification name="AgentDisplayNameUpdateThresholdExceeded"> - Lo sentimos. Tendrás que esperar para poder cambiar tu nombre mostrado. - -Consulta http://wiki.secondlife.com/wiki/Setting_your_display_name - -Vuelve a intentarlo más tarde. - </notification> - <notification name="AgentDisplayNameSetBlocked"> - Lo sentimos. No he mos podido configurar el nombre que has solicitado porque contiene una palabra prohibida. - - Prueba con un nombre distinto. - </notification> - <notification name="AgentDisplayNameSetInvalidUnicode"> - El nombre mostrado que deseas configurar contiene caracteres no válidos. - </notification> - <notification name="AgentDisplayNameSetOnlyPunctuation"> - Tu nombre mostrado debe contener letras y no debe incluir signos de puntuación. - </notification> - <notification name="DisplayNameUpdate"> - A [OLD_NAME] ([SLID]) se le conoce ahora como [NEW_NAME]. - </notification> - <notification name="OfferTeleport"> - ¿Ofrecer teleporte a tu posición con este mensaje? - <form name="form"> - <input name="message"> - Ven conmigo a [REGION] - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Cancelar"/> - </form> - </notification> - <notification name="OfferTeleportFromGod"> - ¿Obligar a este Residente a ir a tu localización? - <form name="form"> - <input name="message"> - Ven conmigo a [REGION] - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Cancelar"/> - </form> - </notification> - <notification name="TeleportFromLandmark"> - ¿Seguro que quieres teleportarte a <nolink>[LOCATION]</nolink>? - <usetemplate ignoretext="Confirmar que quiero teleportarme a un hito" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/> - </notification> - <notification name="TeleportToPick"> - ¿Teleportarte a [PICK]? - <usetemplate ignoretext="Confirmar el teleporte a una localización de los Destacados" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/> - </notification> - <notification name="TeleportToClassified"> - ¿Teleportarte a [CLASSIFIED]? - <usetemplate ignoretext="Confirmar el teleporte a una localización de los Clasificados" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/> - </notification> - <notification name="TeleportToHistoryEntry"> - ¿Teleportarse a [HISTORY_ENTRY]? - <usetemplate ignoretext="Confirmar que quiero teleportarme a una localización del historial" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/> - </notification> - <notification label="Mensaje a todo el estado" name="MessageEstate"> - Escribe un anuncio breve que se enviará a todo el que esté en tu estado. - <form name="form"> - <input name="message"/> - <button name="OK" text="OK"/> - <button name="Cancel" text="Cancelar"/> - </form> - </notification> - <notification label="Cambiar un estado Linden" name="ChangeLindenEstate"> - Estás a punto de cambiar un estado propiedad de Linden (continente, teen grid, orientación, etc.). - -Esto es EXTREMADAMENTE PELIGROSO porque puede afectar en gran manera la experiencia de los Residentes. En el Continente, cambiará miles de regiones y y se provocará un colapso en el espacio del servidor. - -¿Continuar? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification label="Cambiar el acceso a un estado Linden" name="ChangeLindenAccess"> - Vas a cambiar la lista de acceso de un estado propiedad de Linden (mainland, grid teen, orientación, etc.). - -Esto es PELIGROSO, y sólo debe hacerse para deshacerse de ataques que permitan sacar o meter en el grid objetos o L$. -Se cambiarán miles de regiones, y se provocará un colapso en el espacio del servidor. - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification label="Seleccionar el estado" name="EstateAllowedAgentAdd"> - ¿Añadir a la lista de permitidos sólo para este estado o para [ALL_ESTATES]? - <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/> - </notification> - <notification label="Seleccionar el estado" name="EstateAllowedAgentRemove"> - ¿Quitar de la lista de permitidos sólo para este estado o para [ALL_ESTATES]? - <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/> - </notification> - <notification label="Seleccionar el estado" name="EstateAllowedGroupAdd"> - ¿Añadir a la lista de grupos permitidos sólo para este estado o para [ALL_ESTATES]? - <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/> - </notification> - <notification label="Seleccionar el estado" name="EstateAllowedGroupRemove"> - ¿Quitar de la lista de grupos permitidos sólo para este estado o para [ALL_ESTATES]? - <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/> - </notification> - <notification label="Seleccionar el estado" name="EstateBannedAgentAdd"> - ¿Denegar el acceso sólo a este estado o a [ALL_ESTATES]? - <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/> - </notification> - <notification label="Seleccionar el estado" name="EstateBannedAgentRemove"> - ¿Quitar de la lista de prohibición de acceso a este residente para que acceda sólo a este estado o a [ALL_ESTATES]? - <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/> - </notification> - <notification label="Seleccionar el estado" name="EstateManagerAdd"> - ¿Añadir al administrador del estado sólo para este estado o para [ALL_ESTATES]? - <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/> - </notification> - <notification label="Seleccionar el estado" name="EstateManagerRemove"> - ¿Remover al administrador del estado sólo para este estado o para [ALL_ESTATES]? - <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/> - </notification> - <notification label="Confirmar la expulsión" name="EstateKickUser"> - ¿Echar a [EVIL_USER] de este estado? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="EstateChangeCovenant"> - ¿Estás seguro de que quieres cambiar el contrato del estado? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="RegionEntryAccessBlocked"> - No estás autorizado en esa región por su nivel de calificación. Puede deberse a que no hay información validada de tu edad. - -Por favor, comprueba que tienes instalado el último visor, y dirÃgete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="RegionEntryAccessBlocked_KB"> - No estás autorizado en esa región por su nivel de calificación. - -¿Quieres ir a la Base de Conocimientos para aprender más sobre el nivel de calificación? - <url name="url"> - http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es - </url> - <usetemplate ignoretext="No puedo entrar a esta región dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/> - </notification> - <notification name="RegionEntryAccessBlocked_Notify"> - No estás autorizado en esa región por su nivel de calificación. - </notification> - <notification name="RegionEntryAccessBlocked_Change"> - No estás autorizado en esta región por tus preferencias sobre el nivel de calificación. - -Para entrar en la región que deseas, cambia tu preferencia de nivel de calificación. Esto te permitirá buscar contenidos [REGIONMATURITY] y tener acceso a ellos. Para deshacer los cambios, elige Yo > Preferencias > General. - <form name="form"> - <button name="OK" text="Cambiar las preferencias"/> - <button default="true" name="Cancel" text="Cerrar"/> - <ignore name="ignore" text="Mis preferencias sobre nivel de calificación me impiden entrar a esta región"/> - </form> - </notification> - <notification name="PreferredMaturityChanged"> - Tu preferencia de nivel de calificación actual es [RATING]. - </notification> - <notification name="LandClaimAccessBlocked"> - No puedes reclamar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de tu edad. - -Por favor, comprueba que tienes instalado el último visor, y dirÃgete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LandClaimAccessBlocked_KB"> - No puedes reclamar este terreno por su nivel de calificación. - -¿Quieres ir a la Base de Conocimientos para más información sobre el nivel de calificación? - <url name="url"> - http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es - </url> - <usetemplate ignoretext="No puedo reclamar este terreno dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/> - </notification> - <notification name="LandClaimAccessBlocked_Notify"> - No puedes reclamar este terreno debido a su nivel de calificación. - </notification> - <notification name="LandClaimAccessBlocked_Change"> - No puedes reclamar este terreno por tus preferencias sobre el nivel de calificación. - -Puedes pulsar 'Cambiar las Preferencias' para incrementar las preferencias del nivel de calificación y, asÃ, poder entrar. En adelante, podrás buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quieres deshacer este cambio, ve a Yo > Preferencias > General. - <usetemplate ignoretext="Mis preferencias sobre el nivel de calificación me impiden reclamar este terreno" name="okcancelignore" notext="Cerrar" yestext="Cambiar preferencia"/> - </notification> - <notification name="LandBuyAccessBlocked"> - No puedes comprar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de tu edad. - -Por favor, comprueba que tienes instalado el último visor, y dirÃgete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LandBuyAccessBlocked_KB"> - No puedes comprar este terreno por tus preferencias de nivel de calificación. - -¿Quieres ir a la Base de Conocimientos para más información sobre el nivel de calificación? - <url name="url"> - http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es - </url> - <usetemplate ignoretext="No puedo comprar este terreno dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/> - </notification> - <notification name="LandBuyAccessBlocked_Notify"> - No puedes comprar este terreno por su nivel de calificación. - </notification> - <notification name="LandBuyAccessBlocked_Change"> - No puedes comprar este terreno por tus preferencias sobre el nivel de calificación. - -Puedes pulsar 'Cambiar las Preferencias' para incrementar las preferencias del nivel de calificación y, asÃ, poder entrar. En adelante, podrás buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quieres deshacer este cambio, ve a Yo > Preferencias > General. - <usetemplate ignoretext="Mis preferencias sobre el nivel de calificación me impiden comprar el terreno" name="okcancelignore" notext="Cerrar" yestext="Cambiar preferencia"/> - </notification> - <notification name="TooManyPrimsSelected"> - Hay demasiados prims seleccionados. Por favor, selecciona [MAX_PRIM_COUNT] o menos y vuelve a intentarlo - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ProblemImportingEstateCovenant"> - Hay problemas al importar el contrato del estado. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ProblemAddingEstateManager"> - Hay problemas al añadir un administrador nuevo del estado. Uno o más estados deben de tener llena la lista de administradores. - </notification> - <notification name="ProblemAddingEstateGeneric"> - Hay problemas al añadir a la lista del estado. Uno o más estados deben de tener llena la lista. - </notification> - <notification name="UnableToLoadNotecardAsset"> - En este momento, no se pueden cargar los datos de la's nota's. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="NotAllowedToViewNotecard"> - Permisos insuficientes para ver la nota asociada a la ID solicitada. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MissingNotecardAssetID"> - Se ha perdido en la base de datos la ID de la nota. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="PublishClassified"> - Recuerda: las cuotas que se pagan por los clasificados no son reembolsables. - -¿Publicar ahora este anuncio por [AMOUNT] L$? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="SetClassifiedMature"> - ¿Este anuncio tiene contenido 'Moderado'? - <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="SÃ"/> - </notification> - <notification name="SetGroupMature"> - ¿Este grupo tiene contenido 'Moderado'? - <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="SÃ"/> - </notification> - <notification label="Confirmar el reinicio" name="ConfirmRestart"> - ¿Verdaderamente quieres reiniciar la región de aquà a 2 minutos? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification label="Mensaje a toda la región" name="MessageRegion"> - Escribe un anuncio breve que se enviará a todo el que esté en esta región. - <form name="form"> - <input name="message"/> - <button name="OK" text="OK"/> - <button name="Cancel" text="Cancelar"/> - </form> - </notification> - <notification label="Cambiada la calificación de la región" name="RegionMaturityChange"> - Se ha actualizado el nivel de calificación de esta región. -Puede que lleve algún tiempo hasta que el cambio se vea reflejado en el mapa. - -Para entrar a regiones Adultas, los Residentes deben haber verificado su cuenta, bien verificando la edad o bien verificando una forma de pago. - </notification> - <notification label="Desajuste en la versión de voz" name="VoiceVersionMismatch"> - Esta versión de [APP_NAME] no es compatible con la prestación de voz de esta región. Para que el chat de voz funcione correctamente debes actualizar [APP_NAME]. - </notification> - <notification label="No se pudo comprar los objetos" name="BuyObjectOneOwner"> - No se pueden comprar a la vez objetos de propietarios diferentes. -Por favor, selecciona sólo un objeto y vuelve a intentarlo. - </notification> - <notification label="No se pudo comprar el contenido" name="BuyContentsOneOnly"> - No se puede comprar a la vez los contenidos de más de un objeto. -Por favor, selecciona sólo un objeto y vuelve a intentarlo. - </notification> - <notification label="No se pudo comprar el contenido" name="BuyContentsOneOwner"> - No se pueden comprar a la vez objetos de propietarios diferentes. -Por favor, selecciona sólo un objeto y vuelve a intentarlo. - </notification> - <notification name="BuyOriginal"> - ¿Comprar el objeto original de [OWNER] por [PRICE] L$? -Pasarás a ser el propietario de este objeto. -Podrás: - Modificarlo: [MODIFYPERM] - Copiarlo: [COPYPERM] - Revenderlo o darlo: [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="BuyOriginalNoOwner"> - ¿Comprar el objeto original por [PRICE] L$? -Pasarás a ser el propietario de este objeto. -Podrás: - Modificarlo: [MODIFYPERM] - Copiarlo: [COPYPERM] - Revenderlo o darlo: [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="BuyCopy"> - ¿Comprar una copia de [OWNER] por [PRICE] L$? -El objeto se copiará a tu inventario. -Podrás: - Modificarlo: [MODIFYPERM] - Copiarlo: [COPYPERM] - Revenderlo o darlo: [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="BuyCopyNoOwner"> - ¿Comprar una copia por [PRICE] L$? -El objeto se copiará a tu inventario. -Podrás: - Modificarlo: [MODIFYPERM] - Copiarlo: [COPYPERM] - Revenderlo o darlo: [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="BuyContents"> - ¿Comprar los contenidos de [OWNER] por [PRICE] L$? -Serán copiados a tu inventario. - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="BuyContentsNoOwner"> - ¿Comprar los contenidos por [PRICE] L$? -Serán copiados a tu inventario. - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ConfirmPurchase"> - Esta transacción consiste en: -[ACTION] - -¿Estás seguro de querer hacer esta compra? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ConfirmPurchasePassword"> - Esta transacción consiste en: -[ACTION] - -¿Estás seguro de querer hacer esta compra? -Por favor, vuelva a escribir tu contraseña y pulsa OK. - <form name="form"> - <input name="message"/> - <button name="ConfirmPurchase" text="OK"/> - <button name="Cancel" text="Cancelar"/> - </form> - </notification> - <notification name="SetPickLocation"> - Nota: -Has actualizado la posición de este Destacado, pero los otros detalles permanecen con sus valores originales. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MoveInventoryFromObject"> - Has elegido Ãtems 'no copiables' de tu inventario. Esos Ãtems se quitarán de tu inventario, no se copiarán. - -¿Mover el/los Ãtem/s del inventario? - <usetemplate ignoretext="Avisarme antes de que mueva Ãtems 'no copiables' desde un objeto" name="okcancelignore" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="MoveInventoryFromScriptedObject"> - Has elegido Ãtems 'no copiables' de tu inventario. Esos Ãtems se moverán a tu inventario, no se copiarán. -Dado que estos objetos tienen scripts, moverlos a tu inventario puede provocar un mal funcionamiento del script. - -¿Mover el/los Ãtem/s del inventario? - <usetemplate ignoretext="Avisarme antes de que mueva Ãtems 'no copiables' que puedan estropear un objeto con script" name="okcancelignore" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ClickActionNotPayable"> - Advertencia: la acción 'Pagar al objeto' ha sido marcada, pero sólo funcionará si se añade un script con un evento money(). - <form name="form"> - <ignore name="ignore" text="He establecido la acción 'Pagar al objeto' cuando construyo uno sin un script money()"/> - </form> - </notification> - <notification name="OpenObjectCannotCopy"> - En este objeto, no hay Ãtems que estés autorizado a copiar. - </notification> - <notification name="WebLaunchAccountHistory"> - ¿Ir a tu [http://secondlife.com/account/ Panel de Control] para ver el historial de tu cuenta? - <usetemplate ignoretext="Abrir mi navegador para ver el historial de mi cuenta" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/> - </notification> - <notification name="ConfirmQuit"> - ¿Estás seguro de que quieres salir? - <usetemplate ignoretext="Confirmar antes de salir" name="okcancelignore" notext="No salir" yestext="Salir"/> - </notification> - <notification name="DeleteItems"> - [QUESTION] - <usetemplate ignoretext="Confirmar antes de eliminar elementos" name="okcancelignore" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="HelpReportAbuseEmailLL"> - Usa esta herramienta para denunciar violaciones de las [http://secondlife.com/corporate/tos.php Condiciones del Servicio] o las [http://secondlife.com/corporate/cs.php Normas de la Comunidad]. - -Se investigan y resuelven todas las infracciones denunciadas. - </notification> - <notification name="HelpReportAbuseSelectCategory"> - Por favor, elige una categorÃa para esta denuncia de infracción. -Seleccionar una categorÃa nos ayuda a clasificar y procesar las denuncias de infracciones. - </notification> - <notification name="HelpReportAbuseAbuserNameEmpty"> - Por favor, escribe el nombre del infractor. -Aportar el dato preciso nos ayuda a clasificar y procesar las denuncias de infracciones. - </notification> - <notification name="HelpReportAbuseAbuserLocationEmpty"> - Por favor, escribe la localización donde tuvo lugar la infracción. -Aportar el dato preciso nos ayuda a clasificar y procesar las denuncias de infracciones. - </notification> - <notification name="HelpReportAbuseSummaryEmpty"> - Por favor, escribe un resumen de la infracción que ha habido. -Aportar un resumen preciso nos ayuda a clasificar y procesar las denuncias de infracciones. - </notification> - <notification name="HelpReportAbuseDetailsEmpty"> - Por favor, escribe una descripción minuciosa de la infracción que ha habido. -Sé tan especÃfico como puedas, incluyendo los nombres y los detalles implicados en el incidente que denuncias. -Aportar una descripción precisa nos ayuda a clasificar y procesar las denuncias de infracciones. - </notification> - <notification name="HelpReportAbuseContainsCopyright"> - Estimado Residente: - -Parece que estás denunciando una violación de la propiedad intelectual. Por favor, asegúrate de que tu denuncia es correcta. - -(1) El proceso de la denuncia. Debes enviar una denuncia de infracción si crees que un Residente está reventando el sistema de permisos de [SECOND_LIFE], usando, por ejemplo, un CopyBot u otras herramientas parecidas para copiar, infringiendo los derechos de propiedad intelectual. El Equipo de Infracciones ('Abuse Team') investiga y lleva a cabo las acciones disciplinarias apropiadas ante toda acción que viole las [http://secondlife.com/corporate/tos.php Condiciones de Servicio] o las [http://secondlife.com/corporate/cs.php Normas de la Comunidad] de [SECOND_LIFE]. Sin embargo, el Equipo de Infracciones ni gestiona ni responde a las solicitudes de eliminar contenidos del mundo de [SECOND_LIFE]. - -(2) El DMCA o Proceso de Eliminación de Contenido. Para solicitar que se elimine algún contenido de [SECOND_LIFE], DEBES enviar una notificación válida de infracción tal y como se explica en nuestra [http://secondlife.com/corporate/dmca.php 'DMCA Policy']. - -Si todavÃa quieres seguir con el proceso de infracción, por favor, cierra esta ventana y acaba de enviar tu denuncia. En concreto, debes seleccionar la categorÃa 'CopyBot o Programa para saltarse los permisos'. - -Gracias, - -Linden Lab - </notification> - <notification name="FailedRequirementsCheck"> - Han desaparecido de [FLOATER] estos componentes: -[COMPONENTS] - </notification> - <notification label="Reemplazar el anexado actual" name="ReplaceAttachment"> - En ese punto de tu cuerpo ya hay un objeto anexado. ¿Quieres reemplazarlo por el objeto que has elegido? - <form name="form"> - <ignore name="ignore" save_option="true" text="Reemplazar un añadido actual con el Ãtem seleccionado"/> - <button ignore="Reemplazar automaticamente" name="Yes" text="OK"/> - <button ignore="Nunca reemplazar" name="No" text="Cancelar"/> - </form> - </notification> - <notification label="¡Aviso! Modo Ocupado" name="BusyModePay"> - Estás en el modo Ocupado. Por tanto, no recibirás ningún Ãtem a cambio de este pago. - -¿Quieres salir del modo Ocupado antes de completar esta transacción? - <form name="form"> - <ignore name="ignore" save_option="true" text="Voy a pagar a una persona u objeto mientras estoy en el modo ocupado"/> - <button ignore="Siempre salir del modo Ocupado" name="Yes" text="OK"/> - <button ignore="Nunca salir del modo Ocupado" name="No" text="Cancelar"/> - </form> - </notification> - <notification name="ConfirmDeleteProtectedCategory"> - La carpeta '[FOLDERNAME]' pertenece al sistema, y borrar carpetas del sistema puede provocar inestabilidad. ¿Estás seguro de que quieres borrarla? - <usetemplate ignoretext="Confirmar antes de borrar una carpeta del sistema" name="okcancelignore" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ConfirmEmptyTrash"> - ¿Estás seguro de que quieres borrar de forma permanente el contenido de la Papelera? - <usetemplate ignoretext="Confirmar antes de vaciar la Papelera del inventario" name="okcancelignore" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ConfirmClearBrowserCache"> - ¿Estás seguro de que quieres borrar tu historial web, de viajes y de búsquedas? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ConfirmClearCookies"> - ¿Estás seguro de que quieres limpiar tus cookies? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="SÃ"/> - </notification> - <notification name="ConfirmClearMediaUrlList"> - ¿Estás seguro de que quieres vaciar tu lista de URL guardadas? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="SÃ"/> - </notification> - <notification name="ConfirmEmptyLostAndFound"> - ¿Estás seguro de que quieres borrar de forma permanente el contenido de Objetos Perdidos? - <usetemplate ignoretext="Confirmar antes de vaciar la carpeta Objetos Perdidos" name="okcancelignore" notext="No" yestext="SÃ"/> - </notification> - <notification name="CopySLURL"> - Se ha copiado a tu portapapeles esta SLurl: - [SLURL] - -PublÃcala en una página web para que otros puedan acceder fácilmente a esta posición, o pruébala tú mismo pegándola en la barra de direcciones de tu navegador. - <form name="form"> - <ignore name="ignore" text="La SLurl se ha copiado a mi portapapeles"/> - </form> - </notification> - <notification name="WLSavePresetAlert"> - ¿Quieres sobrescribir la preselección guardada? - <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> - </notification> - <notification name="WLDeletePresetAlert"> - ¿Quieres borrar [SKY]? - <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> - </notification> - <notification name="WLNoEditDefault"> - No puedes editar ni borrar una preselección por defecto. - </notification> - <notification name="WLMissingSky"> - Este archivo del ciclo de un dÃa se refiere a un archivo perdido de cielo: [SKY]. - </notification> - <notification name="PPSaveEffectAlert"> - Ya existe un efecto de procesamiento. ¿Quieres sobreescribirlo? - <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> - </notification> - <notification name="NewSkyPreset"> - Dame un nombre para el cielo nuevo. - <form name="form"> - <input name="message"> - Preselección nueva - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Cancelar"/> - </form> - </notification> - <notification name="ExistsSkyPresetAlert"> - ¡Esa preselección ya existe! - </notification> - <notification name="NewWaterPreset"> - Dame un nombre para la nueva preselección de agua. - <form name="form"> - <input name="message"> - Preselección nueva - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Cancelar"/> - </form> - </notification> - <notification name="ExistsWaterPresetAlert"> - ¡Esa preselección ya existe! - </notification> - <notification name="WaterNoEditDefault"> - No puedes editar o borrar una preselección por defecto. - </notification> - <notification name="ChatterBoxSessionStartError"> - No se puede empezar una nueva sesión de chat con [RECIPIENT]. -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ChatterBoxSessionEventError"> - [EVENT] -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ForceCloseChatterBoxSession"> - Debe cerrarse tu sesión de chat con [NAME]. -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="Cannot_Purchase_an_Attachment"> - No puedes comprar un objeto mientras esté anexado. - </notification> - <notification label="Acerca de las solicitudes de autorización de débito" name="DebitPermissionDetails"> - Al admitir esta petición, le das permiso a un script para que coja dólares Linden (L$) de tu cuenta. Para revocar este permiso, el propietario del objeto debe eliminarlo o reiniciar ese script del objeto. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="AutoWearNewClothing"> - ¿Quieres ponerte automáticamente la ropa que vas a crear? - <usetemplate ignoretext="Ponerme la ropa que estoy creando mientras modifico mi apariencia" name="okcancelignore" notext="No" yestext="SÃ"/> - </notification> - <notification name="NotAgeVerified"> - Debes haber verificado tu edad para visitar este sitio. ¿Quieres ir al sitio web de [SECOND_LIFE] y verificarla? - -[_URL] - <url name="url" option="0"> - https://secondlife.com/account/verification.php?lang=es - </url> - <usetemplate ignoretext="No he verificado mi edad" name="okcancelignore" notext="No" yestext="SÃ"/> - </notification> - <notification name="Cannot enter parcel: no payment info on file"> - Para visitar este sitio debes haber aportado información de pago en tu cuenta. ¿Quieres ir al sitio web de [SECOND_LIFE] y configurar esto? - -[_URL] - <url name="url" option="0"> - https://secondlife.com/account/index.php?lang=es - </url> - <usetemplate ignoretext="No he registrado información de pago" name="okcancelignore" notext="No" yestext="SÃ"/> - </notification> - <notification name="MissingString"> - La cadena [STRING_NAME] Ha desaparecido de strings.xml - </notification> - <notification name="SystemMessageTip"> - [MESSAGE] - </notification> - <notification name="IMSystemMessageTip"> - [MESSAGE] - </notification> - <notification name="Cancelled"> - Cancelado - </notification> - <notification name="CancelledSit"> - Cancelado el sentarte - </notification> - <notification name="CancelledAttach"> - Cancelado el anexar - </notification> - <notification name="ReplacedMissingWearable"> - Reemplazadas las ropas o partes del cuerpo perdidas con sus equivalentes por defecto. - </notification> - <notification name="GroupNotice"> - Asunto: [SUBJECT], Mensaje: [MESSAGE] - </notification> - <notification name="FriendOnline"> - [NAME] está conectado - </notification> - <notification name="FriendOffline"> - [NAME] está desconectado - </notification> - <notification name="AddSelfFriend"> - Aunque eres muy agradable, no puedes añadirte como amigo a ti mismo. - </notification> - <notification name="UploadingAuctionSnapshot"> - Subiendo fotos del mundo y del sitio web... -(tardará unos 5 minutos). - </notification> - <notification name="UploadPayment"> - Has pagado [AMOUNT] LS por la subida. - </notification> - <notification name="UploadWebSnapshotDone"> - Completada la subida de la foto del sitio web. - </notification> - <notification name="UploadSnapshotDone"> - Completada la subida de la foto del mundo. - </notification> - <notification name="TerrainDownloaded"> - Se ha descargado Terrain.raw - </notification> - <notification name="GestureMissing"> - No se encuentra en la base de datos el gesto [NAME]. - </notification> - <notification name="UnableToLoadGesture"> - No se puede cargar el gesto [NAME]. - </notification> - <notification name="LandmarkMissing"> - El hito ha desaparecido de la base de datos. - </notification> - <notification name="UnableToLoadLandmark"> - No se ha podido cargar el hito. Por favor, vuelve a intentarlo. - </notification> - <notification name="CapsKeyOn"> - Tienes pulsada la tecla de mayúsculas. -Esto puede influir en tu contraseña. - </notification> - <notification name="NotecardMissing"> - La nota ha desaparecido de la base de datos. - </notification> - <notification name="NotecardNoPermissions"> - No tienes permiso para ver esta nota. - </notification> - <notification name="RezItemNoPermissions"> - No tienes permisos suficientes para renderizar el objeto. - </notification> - <notification name="UnableToLoadNotecard"> - En este momento no se puede cargar la nota. - </notification> - <notification name="ScriptMissing"> - El script ha desaparecido de la base de datos. - </notification> - <notification name="ScriptNoPermissions"> - No tienes permisos suficientes para ver el script. - </notification> - <notification name="UnableToLoadScript"> - No se ha podido cargar el script. Por favor, vuelve a intentarlo. - </notification> - <notification name="IncompleteInventory"> - Los contenidos que estás ofreciendo aún no están disponibles. Por favor, vuelve a ofrecerlos en un minuto. - </notification> - <notification name="CannotModifyProtectedCategories"> - No puedes modificar categorÃas que están protegidas. - </notification> - <notification name="CannotRemoveProtectedCategories"> - No puedes quitar categorÃas que están protegidas. - </notification> - <notification name="UnableToBuyWhileDownloading"> - No se puede comprar un objeto mientras se descargan los datos. -Por favor, vuelve a intentarlo. - </notification> - <notification name="UnableToLinkWhileDownloading"> - No se puede enlazar un objeto mientras se descargan los datos. -Por favor, vuelve a intentarlo. - </notification> - <notification name="CannotBuyObjectsFromDifferentOwners"> - No puedes comprar más de un objeto a la vez. -Por favor, selecciona un sólo objeto. - </notification> - <notification name="ObjectNotForSale"> - Este objeto no está en venta. - </notification> - <notification name="EnteringGodMode"> - Entrando en el modo administrativo, nivel [LEVEL] - </notification> - <notification name="LeavingGodMode"> - Saliendo del modo administrativo, nivel [LEVEL] - </notification> - <notification name="CopyFailed"> - No tienes pemiso para copiar esto. - </notification> - <notification name="InventoryAccepted"> - [NAME] ha recibido tu oferta de inventario. - </notification> - <notification name="InventoryDeclined"> - [NAME] ha rehusado tu oferta del inventario. - </notification> - <notification name="ObjectMessage"> - [NAME]: [MESSAGE] - </notification> - <notification name="CallingCardAccepted"> - Se ha aceptado tu tarjeta de visita. - </notification> - <notification name="CallingCardDeclined"> - Se ha rehusado tu tarjeta de visita. - </notification> - <notification name="TeleportToLandmark"> - Puedes teleportarte a lugares como '[NAME]' abriendo el panel Lugares -a la derecha de tu pantalla- y seleccionando la sección Hitos. -Pulsa en un hito para seleccionarlo, y, luego, pulsa 'Teleportar' en la parte inferior del panel. -(También puedes pulsar dos veces en el hito o pulsarlo con el botón derecho del ratón y elegir 'Teleportar'.) - </notification> - <notification name="TeleportToPerson"> - Puedes contactar con un Residente como '[NAME]' abriendo el panel Gente en el lado derecho de tu pantalla. -Elige al Residente de la lista y pulsa 'MI' en la parte inferior del panel. -(También puedes pulsar dos veces en su nombre o pulsarlo con el botón derecho y elegir 'MI'). - </notification> - <notification name="CantSelectLandFromMultipleRegions"> - No puedes seleccionar un terreno que cruce las fronteras entre servidores. -Inténtalo seleccionando un trozo más pequeño de terreno. - </notification> - <notification name="SearchWordBanned"> - Se han excluido algunos términos de tu búsqueda debido a restricciones en el contenido, según se especifica en las Normas de la Comunidad. - </notification> - <notification name="NoContentToSearch"> - Por favor, elige al menos un tipo de contenido a buscar ('PG', 'Mature', o 'Adult'). - </notification> - <notification name="SystemMessage"> - [MESSAGE] - </notification> - <notification name="PaymentReceived"> - [MESSAGE] - </notification> - <notification name="PaymentSent"> - [MESSAGE] - </notification> - <notification name="EventNotification"> - Notificación de un evento: - -[NAME] -[DATE] - <form name="form"> - <button name="Details" text="Detalles"/> - <button name="Cancel" text="Cancelar"/> - </form> - </notification> - <notification name="TransferObjectsHighlighted"> - En estos momentos, están realzados todos los objetos de esta parcela que serán transferidos al comprador de la misma. - -* No están realzados los árboles y hierbas que se transferirán. - <form name="form"> - <button name="Done" text="Hecho"/> - </form> - </notification> - <notification name="DeactivatedGesturesTrigger"> - Desactivados los gestos que tienen el mismo botón: -[NAMES] - </notification> - <notification name="NoQuickTime"> - No parece que tu sistema tenga instalado el software QuickTime de Apple. -Si quieres ver media en streaming en las parcelas que los tienen, deberÃas ir al [http://www.apple.com/quicktime sitio de QuickTime] e intalar el QuickTime Player. - </notification> - <notification name="NoPlugin"> - No se ha encontrado el 'Media Plugin' para manejar el 'mime type' "[MIME_TYPE]". Los media de este tipo no estarán disponibles. - </notification> - <notification name="MediaPluginFailed"> - Fallo de este 'Media Plugin': - [PLUGIN] - -Por favor, reinstala el plugin o contacta con el vendedor si sigues teniendo problemas. - <form name="form"> - <ignore name="ignore" text="Fallo al ejecutar un 'Media Plugin'"/> - </form> - </notification> - <notification name="OwnedObjectsReturned"> - Se han devuelto a tu inventario los objetos de los que eras propietario en la parcela seleccionada. - </notification> - <notification name="OtherObjectsReturned"> - Se han devuelto a su inventario los objetos en la parcela de terreno seleccionada propiedad de [NAME]. - </notification> - <notification name="OtherObjectsReturned2"> - Se han devuelto a su propietario los objetos seleccionados en la parcela de terreno propiedad de '[NAME]'. - </notification> - <notification name="GroupObjectsReturned"> - Se han devuelto a los inventarios de sus propietarios los objetos que estaban compartidos con el grupo [GROUPNAME] en la parcela seleccionada. -Los objetos transferibles que se transfirieron al grupo se han devuelto a sus propietarios anteriores. -Los objetos no transferibles que se transfirieron al grupo han sido borrados. - </notification> - <notification name="UnOwnedObjectsReturned"> - Se han devuelto a sus propietarios los objetos de los que NO eras propietario en la parcela seleccionada. - </notification> - <notification name="ServerObjectMessage"> - Mensaje de [NAME]: -<nolink>[MSG]</nolink> - </notification> - <notification name="NotSafe"> - Este terreno tiene el daño activado. -Aquà puedes ser herido. Si mueres, se te teleportará a tu Base. - </notification> - <notification name="NoFly"> - Este terreno tiene desactivado el poder volar. -Aquà no puedes volar. - </notification> - <notification name="PushRestricted"> - Este terreno no autoriza el poder empujar. No puedes hacerlo a menos que seas el propetario del terreno. - </notification> - <notification name="NoVoice"> - Este tereno tiene desactivado el chat de voz. No podrás oÃr hablar a nadie. - </notification> - <notification name="NoBuild"> - Este terreno tiene desactivado el poder construir. Aquà no puedes ni construir ni crear objetos. - </notification> - <notification name="ScriptsStopped"> - Un administrador ha detenido temporalmente los scripts en esta región. - </notification> - <notification name="ScriptsNotRunning"> - En esta región no se está ejecutando ningún script. - </notification> - <notification name="NoOutsideScripts"> - Este terreno tiene desactivados los scripts externos. - -Los scripts no funcionan aquÃ, excepto los pertenecientes al propietario del terreno. - </notification> - <notification name="ClaimPublicLand"> - Sólo puedes reclamar terreno público de la región en que estás. - </notification> - <notification name="RegionTPAccessBlocked"> - No estás autorizado en esa región por su nivel de calificación. Debes validar tu edad y/o instalar el último visor. - -Por favor, dirÃgete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación. - </notification> - <notification name="URBannedFromRegion"> - Se te ha prohibido el acceso a la región. - </notification> - <notification name="NoTeenGridAccess"> - Tu cuenta no puede conectarse a esta región del grid teen. - </notification> - <notification name="ImproperPaymentStatus"> - No tienes el estado de pago adecuado para entrar a esta región. - </notification> - <notification name="MustGetAgeParcel"> - Debes haber verificado tu edad para entrar a esta parcela. - </notification> - <notification name="NoDestRegion"> - No se ha encontrada la región de destino. - </notification> - <notification name="NotAllowedInDest"> - No estás autorizado en el destino. - </notification> - <notification name="RegionParcelBan"> - No puedes cruzar la región por una parcela con el acceso prohibido. Intenta otro camino. - </notification> - <notification name="TelehubRedirect"> - Has sido redirigido a un punto de teleporte. - </notification> - <notification name="CouldntTPCloser"> - No se puede teleportar a un destino tan cercano. - </notification> - <notification name="TPCancelled"> - Teleporte cancelado. - </notification> - <notification name="FullRegionTryAgain"> - En estos momentos, está llena la región a la que estás intentando entrar. -Por favor, vuelve a intentarlo en unos momentos. - </notification> - <notification name="GeneralFailure"> - Fallo general. - </notification> - <notification name="RoutedWrongRegion"> - Mal dirigido a la región. Por favor, vuelve a intentarlo. - </notification> - <notification name="NoValidAgentID"> - ID de agente inválido. - </notification> - <notification name="NoValidSession"> - ID de sesión inválido. - </notification> - <notification name="NoValidCircuit"> - Circuito de código inválido. - </notification> - <notification name="NoValidTimestamp"> - Fecha inválida. - </notification> - <notification name="NoPendingConnection"> - No se puede crear la conexión. - </notification> - <notification name="InternalUsherError"> - Se ha producido un error interno al intentar acceder al destino de tu teleporte. Puede que, en este momento, el servicio de [SECOND_LIFE] tenga problemas. - </notification> - <notification name="NoGoodTPDestination"> - No se puede encontrar en esta región un buen destino para el teleporte. - </notification> - <notification name="InternalErrorRegionResolver"> - Se ha producido un error interno al manejar las coordenadas globales de tu petición de teleporte. Puede que, en este momento, el servicio de [SECOND_LIFE] tenga problemas. - </notification> - <notification name="NoValidLanding"> - No se ha podido encontrar un punto de aterrizaje válido. - </notification> - <notification name="NoValidParcel"> - No se ha podido encontrar una parcela válida. - </notification> - <notification name="ObjectGiveItem"> - Un objeto de nombre <nolink>[OBJECTFROMNAME]</nolink>, propiedad de [NAME_SLURL], te ha dado este [OBJECTTYPE]: -[ITEM_SLURL] - <form name="form"> - <button name="Keep" text="Guardar"/> - <button name="Discard" text="Descartar"/> - <button name="Mute" text="Ignorar"/> - </form> - </notification> - <notification name="UserGiveItem"> - [NAME_SLURL] te ha dado este [OBJECTTYPE]: -[ITEM_SLURL] - <form name="form"> - <button name="Show" text="Mostrar"/> - <button name="Discard" text="Descartar"/> - <button name="Mute" text="Ignorar"/> - </form> - </notification> - <notification name="GodMessage"> - [NAME] - -[MESSAGE] - </notification> - <notification name="JoinGroup"> - [MESSAGE] - <form name="form"> - <button name="Join" text="Entrar"/> - <button name="Decline" text="Rehusar"/> - <button name="Info" text="Información"/> - </form> - </notification> - <notification name="TeleportOffered"> - [NAME_SLURL] te ha ofrecido teleportarte a su posición: - -[MESSAGE] - [MATURITY_STR] <icon>[MATURITY_ICON]</icon> - <form name="form"> - <button name="Teleport" text="Teleportar"/> - <button name="Cancel" text="Cancelar"/> - </form> - </notification> - <notification name="TeleportOfferSent"> - Teleporte ofrecido a [TO_NAME] - </notification> - <notification name="GotoURL"> - [MESSAGE] -[URL] - <form name="form"> - <button name="Later" text="Más tarde"/> - <button name="GoNow..." text="Ir ahora..."/> - </form> - </notification> - <notification name="OfferFriendship"> - [NAME_SLURL] te está ofreciendo su amistad. - -[MESSAGE] - -(Por defecto, podrás ver si el otro está conectado) - <form name="form"> - <button name="Accept" text="Aceptar"/> - <button name="Decline" text="Rehusar"/> - </form> - </notification> - <notification name="FriendshipOffered"> - Has ofrecido amistad a [TO_NAME] - </notification> - <notification name="OfferFriendshipNoMessage"> - [NAME_SLURL] está ofreciendo amistad. - -(De manera predeterminada, podrás ver si están conectados los demás.) - <form name="form"> - <button name="Accept" text="Aceptar"/> - <button name="Decline" text="Rehusar"/> - </form> - </notification> - <notification name="FriendshipAccepted"> - [NAME] ha aceptado tu oferta de amistad. - </notification> - <notification name="FriendshipDeclined"> - [NAME] ha rehusado tu oferta de amistad. - </notification> - <notification name="FriendshipAcceptedByMe"> - Aceptado el ofrecimiento de amistad. - </notification> - <notification name="FriendshipDeclinedByMe"> - Rehusado el ofrecimiento de amistad. - </notification> - <notification name="OfferCallingCard"> - [NAME] te está ofreciendo su tarjeta de visita. -Esto añadirá un marcador en tu inventario para que puedas enviarle rápidamente un MI. - <form name="form"> - <button name="Accept" text="Aceptar"/> - <button name="Decline" text="Rehusar"/> - </form> - </notification> - <notification name="RegionRestartMinutes"> - Esta región se reiniciará en [MINUTES] minutos. -Si permaneces en esta región serás desconectado. - </notification> - <notification name="RegionRestartSeconds"> - Esta región se reiniciará en [SECONDS] segundos. -Si permaneces en esta región serás desconectado. - </notification> - <notification name="LoadWebPage"> - ¿Cargar página web [URL]? - -[MESSAGE] - -Del objeto: <nolink>[OBJECTNAME]</nolink>, propietario: [NAME]? - <form name="form"> - <button name="Gotopage" text="Cargar"/> - <button name="Cancel" text="Cancelar"/> - </form> - </notification> - <notification name="FailedToFindWearableUnnamed"> - Búsqueda fallida de [TYPE] en la base de datos. - </notification> - <notification name="FailedToFindWearable"> - Búsqueda fallida de [TYPE] de nombre [DESC] en la base de datos. - </notification> - <notification name="InvalidWearable"> - El Ãtem que quieres vestirte tiene una caracterÃstica que tu visor no puede leer. Por favor, actualiza tu versión de [APP_NAME] para ponerte este Ãtem. - </notification> - <notification name="ScriptQuestion"> - <nolink>[OBJECTNAME]</nolink>, un objeto propiedad de '[NAME]', quiere: - -[QUESTIONS] -¿Es correcto? - <form name="form"> - <button name="Yes" text="SÃ"/> - <button name="No" text="No"/> - <button name="Mute" text="Ignorar"/> - </form> - </notification> - <notification name="ScriptQuestionCaution"> - Un objeto de nombre '<nolink>[OBJECTNAME]</nolink>', propiedad de '[NAME]', quiere: - -[QUESTIONS] -Si no confias en este objeto y en su creador, deberÃas rehusar esta petición. - -¿Autorizar esta petición? - <form name="form"> - <button name="Grant" text="Autorizar"/> - <button name="Deny" text="Denegar"/> - <button name="Details" text="Detalles..."/> - </form> - </notification> - <notification name="ScriptDialog"> - '<nolink>[TITLE]</nolink>' de [NAME] -[MESSAGE] - <form name="form"> - <button name="Ignore" text="Ignorar"/> - </form> - </notification> - <notification name="ScriptDialogGroup"> - '<nolink>[TITLE]</nolink>' de [GROUPNAME] -[MESSAGE] - <form name="form"> - <button name="Ignore" text="Ignorar"/> - </form> - </notification> - <notification name="BuyLindenDollarSuccess"> - ¡Gracias por tu pago! - -Tu saldo de L$ se actualizará cuando se complete el proceso. Si el proceso tarda más de 20 minutos, se cancelará tu transacción, y la cantidad se cargará en tu saldo de US$. - -Puedes revisar el estado de tu pago en el Historial de transacciones de tu [http://secondlife.com/account/ Panel de Control] - </notification> - <notification name="FirstOverrideKeys"> - A partir de ahora, tus teclas de movimiento las gestiona un objeto. -Prueba las teclas del cursor o AWSD para ver qué hacen. -Algunos objetos (las pistolas, por ejemplo) te pedirán que, para usarlos, entres en vista subjetiva. Pulsa 'M' para hacerlo. - </notification> - <notification name="FirstSandbox"> - Esta es una región 'sandbox' (zona de pruebas) donde los Residentes pueden aprender a construir. - -Los objetos que construyas aquà serán eliminados cuando la abandones; por tanto, no olvides pulsarlos con el botón derecho y elegir 'Tomar' para que tu creación vaya a tu inventario. - </notification> - <notification name="MaxListSelectMessage"> - Puedes seleccionar un máximo de [MAX_SELECT] Ãtems de esta lista. - </notification> - <notification name="VoiceInviteP2P"> - [NAME] te está invitando a un chat de voz. -Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama. - <form name="form"> - <button name="Accept" text="Aceptar"/> - <button name="Decline" text="Rehusar"/> - <button name="Mute" text="Ignorar"/> - </form> - </notification> - <notification name="AutoUnmuteByIM"> - [NAME] ha dejado automáticamente de estar ignorado al enviarle un mensaje instantáneo. - </notification> - <notification name="AutoUnmuteByMoney"> - [NAME] ha dejado automáticamente de estar ignorado al darle dinero. - </notification> - <notification name="AutoUnmuteByInventory"> - [NAME] ha dejado automáticamente de estar ignorado al ofrecerle inventario. - </notification> - <notification name="VoiceInviteGroup"> - [NAME] ha empezado un chat de voz con el grupo [GROUP]. -Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama. - <form name="form"> - <button name="Accept" text="Aceptar"/> - <button name="Decline" text="Rehusar"/> - <button name="Mute" text="Ignorar"/> - </form> - </notification> - <notification name="VoiceInviteAdHoc"> - [NAME] ha empezado un chat de voz en multiconferencia. -Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama. - <form name="form"> - <button name="Accept" text="Aceptar"/> - <button name="Decline" text="Rehusar"/> - <button name="Mute" text="Ignorar"/> - </form> - </notification> - <notification name="InviteAdHoc"> - NAME] te está invitando a un chat en multiconferencia. -Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama. - <form name="form"> - <button name="Accept" text="Aceptar"/> - <button name="Decline" text="Rehusar"/> - <button name="Mute" text="Ignorar"/> - </form> - </notification> - <notification name="VoiceChannelFull"> - El chat de voz al que estás intentando entrar, [VOICE_CHANNEL_NAME], ha llegado a su capacidad máxima. Por favor, vuelve a intentarlo más tarde. - </notification> - <notification name="ProximalVoiceChannelFull"> - Lo sentimos. Este área ha llegado a su capacidad máxima de conversaciones por voz. Por favor, intenta usar la voz en otra zona. - </notification> - <notification name="VoiceChannelDisconnected"> - Has sido desconectado de [VOICE_CHANNEL_NAME]. Vas a ser reconectado al chat de voz. - </notification> - <notification name="VoiceChannelDisconnectedP2P"> - [VOICE_CHANNEL_NAME] ha colgado la llamada. Vas a ser reconectado al chat de voz. - </notification> - <notification name="P2PCallDeclined"> - [VOICE_CHANNEL_NAME] ha rehusado tu llamada. Vas a ser reconectado al chat de voz. - </notification> - <notification name="P2PCallNoAnswer"> - [VOICE_CHANNEL_NAME] no está disponible para coger tu llamada. Vas a ser reconectado al chat de voz. - </notification> - <notification name="VoiceChannelJoinFailed"> - Fallo al conectar a [VOICE_CHANNEL_NAME]; por favor, inténtalo más tarde. Vas a ser reconectado al chat de voz. - </notification> - <notification name="VoiceLoginRetry"> - Estamos creando un canal de voz para ti. Se puede tardar hasta un minuto. - </notification> - <notification name="VoiceEffectsExpired"> - Una o más de las transformaciones de voz a las que estás suscrito han caducado. -[Pulsa aquà [URL]] para renovar la suscripción. - </notification> - <notification name="VoiceEffectsExpiredInUse"> - La transformación de voz activa ha caducado y se ha aplicado tu configuración de voz normal. -[Pulsa aquà [URL]] para renovar la suscripción. - </notification> - <notification name="VoiceEffectsWillExpire"> - Una o más de tus transformaciones de voz caducarán en menos de [INTERVAL] dÃas. -[Pulsa aquà [URL]] para renovar la suscripción. - </notification> - <notification name="VoiceEffectsNew"> - Están disponibles nuevas transformaciones de voz. - </notification> - <notification name="Cannot enter parcel: not a group member"> - Sólo los miembros de un grupo determinado pueden visitar esta zona. - </notification> - <notification name="Cannot enter parcel: banned"> - No puedes entrar en esta parcela, se te ha prohibido el acceso. - </notification> - <notification name="Cannot enter parcel: not on access list"> - No puedes entrar en esta parcela, no estás en la lista de acceso. - </notification> - <notification name="VoiceNotAllowed"> - No tienes permiso para conectarte al chat de voz de [VOICE_CHANNEL_NAME]. - </notification> - <notification name="VoiceCallGenericError"> - Se ha producido un error al intentar conectarte al [VOICE_CHANNEL_NAME]. Por favor, inténtalo más tarde. - </notification> - <notification name="UnsupportedCommandSLURL"> - No se admite el formato de la SLurl que has pulsado. - </notification> - <notification name="BlockedSLURL"> - Por tu seguridad, se ha bloqueado una SLurl recibida de un navegador no de confianza. - </notification> - <notification name="ThrottledSLURL"> - En muy poco tiempo, se han recibido muchas SLurls desde un navegador que no es de confianza. -Por tu seguridad, serán bloqueadas durante unos segundos. - </notification> - <notification name="IMToast"> - [MESSAGE] - <form name="form"> - <button name="respondbutton" text="Responder"/> - </form> - </notification> - <notification name="ConfirmCloseAll"> - ¿Seguro que quieres cerrar todos los MI? - <usetemplate ignoretext="Confirmar antes de cerrar todos los MIs" name="okcancelignore" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="AttachmentSaved"> - Se ha guardado el adjunto. - </notification> - <notification name="UnableToFindHelpTopic"> - No se ha podido encontrar un tema de ayuda para este elemento. - </notification> - <notification name="ObjectMediaFailure"> - Error del servidor: fallo en la actualización u obtención de los media. -'[ERROR]' - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="TextChatIsMutedByModerator"> - Un moderador ha silenciado tu chat de texto. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="VoiceIsMutedByModerator"> - Un moderador ha silenciado tu voz. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ConfirmClearTeleportHistory"> - ¿Estás seguro de que quieres borrar tu historial de teleportes? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="BottomTrayButtonCanNotBeShown"> - El botón elegido no se puede mostrar correctamente. -Se mostrará cuando haya suficiente espacio. - </notification> - <notification name="ShareNotification"> - Selecciona los residentes con quienes deseas compartir. - </notification> - <notification name="ShareItemsConfirmation"> - ¿Estás seguro de que quieres compartir los elementos siguientes? - -<nolink>[ITEMS]</nolink> - -Con los siguientes residentes: - -[RESIDENTS] - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> - <notification name="ItemsShared"> - Los elementos se han compartido correctamente. - </notification> - <notification name="DeedToGroupFail"> - Error de transferencia a grupo. - </notification> - <notification name="AvatarRezNotification"> - ( [EXISTENCE] segundos vivo) -El avatar '[NAME]' tardó [TIME] segundos en dejar de aparecer como nube. - </notification> - <notification name="AvatarRezSelfBakedDoneNotification"> - ( [EXISTENCE] segundos vivo) -Has terminado de texturizar tu vestuario en [TIME] segundos. - </notification> - <notification name="AvatarRezSelfBakedUpdateNotification"> - ( [EXISTENCE] segundos vivo) -Has enviado una actualización de tu apariencia después de [TIME] segundos. -[STATUS] - </notification> - <notification name="AvatarRezCloudNotification"> - ( [EXISTENCE] segundos vivo) -El avatar '[NAME]' se convirtió en nube. - </notification> - <notification name="AvatarRezArrivedNotification"> - ( [EXISTENCE] segundos vivo) -Apareció el avatar '[NAME]'. - </notification> - <notification name="AvatarRezLeftCloudNotification"> - ( [EXISTENCE] segundos vivo) -El avatar '[NAME]' salió al cabo de [TIME] segundos como nube. - </notification> - <notification name="AvatarRezEnteredAppearanceNotification"> - ( [EXISTENCE] segundos vivo) -El avatar '[NAME]' ya está en modo de edición de apariencia. - </notification> - <notification name="AvatarRezLeftAppearanceNotification"> - ( [EXISTENCE] segundos vivo) -El avatar '[NAME]' desactivó el modo de apariencia. - </notification> - <notification name="NoConnect"> - Tenemos problemas de conexión con [PROTOCOL] [HOSTID]. -Comprueba la configuración de la red y del servidor de seguridad. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="NoVoiceConnect"> - Tenemos problemas de conexión con tu servidor de voz: - -[HOSTID] - -No podrás establecer comunicaciones de voz. -Comprueba la configuración de la red y del servidor de seguridad. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="AvatarRezLeftNotification"> - ( [EXISTENCE] segundos vivo) -El avatar '[NAME]' ya estaba totalmente cargado al salir. - </notification> - <notification name="AvatarRezSelfBakedTextureUploadNotification"> - ( [EXISTENCE] segundos con vida ) -Has actualizado una textura obtenida mediante bake de [RESOLUTION] para '[BODYREGION]' después de [TIME] segundos. - </notification> - <notification name="AvatarRezSelfBakedTextureUpdateNotification"> - ( [EXISTENCE] segundos con vida ) -Has actualizado de manera local una textura obtenida mediante bake de [RESOLUTION] para '[BODYREGION]' después de [TIME] segundos. - </notification> - <notification name="ConfirmLeaveCall"> - ¿Estás seguro de que deseas salir de esta multiconferencia? - <usetemplate ignoretext="Confirma antes de salir de la llamada" name="okcancelignore" notext="No" yestext="SÃ"/> - </notification> - <notification name="ConfirmMuteAll"> - Has seleccionado silenciar a todos los participantes en una multiconferencia. -Si lo haces, todos los residentes que se unan posteriormente a la llamada también serán silenciados, incluso cuando abandones la conferencia. - -¿Deseas silenciar a todos? - <usetemplate ignoretext="Confirma que deseas silenciar a todos los participantes en una multiconferencia." name="okcancelignore" notext="Cancelar" yestext="OK"/> - </notification> - <notification label="Chat" name="HintChat"> - Para unirte a la conversación, escribe en el campo de chat que aparece a continuación. - </notification> - <notification label="Levantarme" name="HintSit"> - Para levantarte y salir de la posición de sentado, haz clic en el botón Levantarme. - </notification> - <notification label="Hablar" name="HintSpeak"> - Pulsa en el botón: Hablar para conectar y desconectar el micrófono. - -Pulsa en el cursor arriba para ver el panel de control de voz. - -Al ocultar el botón Hablar se desactiva la función de voz. - </notification> - <notification label="Explora el mundo" name="HintDestinationGuide"> - La GuÃa de destinos contiene miles de nuevos lugares por descubrir. Selecciona una ubicación y elige Teleportarme para iniciar la exploración. - </notification> - <notification label="Panel lateral" name="HintSidePanel"> - Accede de manera rápida a tu inventario, asà como a tu ropa, los perfiles y el resto de la información disponible en el panel lateral. - </notification> - <notification label="Mover" name="HintMove"> - Si deseas caminar o correr, abre el panel Mover y utiliza las flechas de dirección para navegar. También puedes utilizar las flechas de dirección del teclado. - </notification> - <notification label="" name="HintMoveClick"> - 1. Pulsa para caminar: Pulsa en cualquier punto del terreno para ir a él. - -2. Pulsa y arrastra para girar la vista: Pulsa y arrastra el cursor a cualquier parte del mundo para girar la vista. - </notification> - <notification label="Nombre mostrado" name="HintDisplayName"> - Configura y personaliza aquà tu nombre mostrado. Esto se añadirá a tu nombre de usuario personal, que no puedes modificar. Puedes cambiar la manera en que ves los nombres de otras personas en tus preferencias. - </notification> - <notification label="Visión" name="HintView"> - Para cambiar la vista de la cámara, utiliza los controles Orbital y Panorámica. Para restablecer tu vista, pulsa Esc o camina. - </notification> - <notification label="Inventario" name="HintInventory"> - Accede a tu inventario para buscar Ãtems. Los Ãtems más recientes se pueden encontrar fácilmente en la pestaña Recientes. - </notification> - <notification label="¡Tienes dólares Linden!" name="HintLindenDollar"> - Éste es tu saldo actual de L$. Haz clic en Comprar L$ para comprar más dólares Linden. - </notification> - <notification name="PopupAttempt"> - Se ha impedido que se abriera una ventana emergente. - <form name="form"> - <ignore name="ignore" text="Permitir todas las ventanas emergentes"/> - <button name="open" text="Abrir ventana emergente"/> - </form> - </notification> - <notification name="AuthRequest"> - El sitio en '<nolink>[HOST_NAME]</nolink>' de la plataforma '[REALM]' requiere un nombre de usuario y una contraseña. - <form name="form"> - <input name="username" text="Nombre de usuario"/> - <input name="password" text="Contraseña"/> - <button name="ok" text="Enviar"/> - <button name="cancel" text="Cancelar"/> - </form> - </notification> - <notification label="" name="ModeChange"> - Para cambiar de modo tienes que salir y reiniciar. - <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/> - </notification> - <notification label="" name="NoClassifieds"> - La creación y edición de clasificados sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión. - <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/> - </notification> - <notification label="" name="NoGroupInfo"> - La creación y edición de grupos sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión. - <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/> - </notification> - <notification label="" name="NoPicks"> - La creación y edición de Destacados sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión. - <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/> - </notification> - <notification label="" name="NoWorldMap"> - La visualización del mapa del mundo sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión. - <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/> - </notification> - <notification label="" name="NoVoiceCall"> - Las llamadas de voz sólo están disponibles en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo? - <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/> - </notification> - <notification label="" name="NoAvatarShare"> - Compartir sólo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo? - <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/> - </notification> - <notification label="" name="NoAvatarPay"> - El pago a otros residentes sólo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo? - <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/> - </notification> - <global name="UnsupportedCPU"> - - La velocidad de tu CPU no cumple los requerimientos mÃnimos. - </global> - <global name="UnsupportedGLRequirements"> - Parece que no tienes el hardware apropiado para [APP_NAME]. [APP_NAME] requiere una tarjeta gráfica OpenGL que admita texturas múltiples ('multitexture support'). Si la tienes, comprueba que tienes los últimos 'drivers' para tu tarjeta gráfica, asà como los últimos parches y 'service packs' para tu sistema operativo. - -Si los problemas persisten, por favor, acude a [SUPPORT_SITE]. - </global> - <global name="UnsupportedCPUAmount"> - 796 - </global> - <global name="UnsupportedRAMAmount"> - 510 - </global> - <global name="UnsupportedGPU"> - - Tu tarjeta gráfica no cumple los requerimientos mÃnimos. - </global> - <global name="UnsupportedRAM"> - - La memoria de tu sistema no cumple los requerimientos mÃnimos. - </global> - <global name="You can only set your 'Home Location' on your land or at a mainland Infohub."> - Si posees un terreno, puedes hacerlo tu Base. -También puedes buscar en el Mapa lugares marcados como "Puntos de Información". - </global> - <global name="You died and have been teleported to your home location"> - Has muerto y te has teleportado a tu Base. - </global> -</notifications> +<?xml version="1.0" encoding="utf-8"?>
+<notifications>
+ <global name="skipnexttime">
+ No mostrarme esto otra vez
+ </global>
+ <global name="alwayschoose">
+ Elegir siempre esta opción
+ </global>
+ <global name="implicitclosebutton">
+ Cerrar
+ </global>
+ <template name="okbutton">
+ <form>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$notext"/>
+ </form>
+ </template>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
+ </form>
+ </template>
+ <notification functor="GenericAcknowledge" label="Mensaje de notificación desconocida" name="MissingAlert">
+ Tu versión de [APP_NAME] no sabe cómo mostrar la notificación que acaba de recibir. Por favor, comprueba que tienes instalado el último Visor.
+
+Detalles del error: la notificación de nombre '[_NAME]' no se ha encontrado en notifications.xml.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FloaterNotFound">
+ Error: no se pudieron encontrar estos controles:
+
+[CONTROLS]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TutorialNotFound">
+ Actualmente, no hay un tutorial disponible.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GenericAlert">
+ [MESSAGE]
+ </notification>
+ <notification name="GenericAlertYesCancel">
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="SÃ"/>
+ </notification>
+ <notification name="BadInstallation">
+ Ha habido un error actualizando [APP_NAME]. Por favor, [http://get.secondlife.com descarga la última versión] del Visor.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LoginFailedNoNetwork">
+ No se puede conectar con [SECOND_LIFE_GRID].
+ '[DIAGNOSTIC]'
+Asegúrate de que tu conexión a Internet está funcionando adecuadamente.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MessageTemplateNotFound">
+ No se ha encontrado la plantilla de mensaje [PATH].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="WearableSave">
+ ¿Guardar los cambios en las ropas o partes del cuerpo actuales?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardarlos" yestext="Guardarlos"/>
+ </notification>
+ <notification name="CompileQueueSaveText">
+ Hubo un problema al subir el texto de un script por la siguiente razón: [REASON]. Por favor, inténtalo más tarde.
+ </notification>
+ <notification name="CompileQueueSaveBytecode">
+ Hubo un problema al subir el script compilado por la siguiente razón: [REASON]. Por favor, inténtalo más tarde.
+ </notification>
+ <notification name="WriteAnimationFail">
+ Hubo un problema al escribir los datos de la animación. Por favor, inténtalo más tarde.
+ </notification>
+ <notification name="UploadAuctionSnapshotFail">
+ Hubo un problema al subir la foto de la subasta por la siguiente razón: [REASON]
+ </notification>
+ <notification name="UnableToViewContentsMoreThanOne">
+ No se puede ver a la vez los contenidos de más de un Ãtem. Por favor, elige un solo objeto y vuelve a intentarlo.
+ </notification>
+ <notification name="SaveClothingBodyChanges">
+ ¿Guardar todos los cambios en la ropa y partes del cuerpo?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardarlos" yestext="Guardarlos todos"/>
+ </notification>
+ <notification name="FriendsAndGroupsOnly">
+ Quienes no sean tus amigos no sabrán que has elegido ignorar sus llamadas y mensajes instantáneos.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FavoritesOnLogin">
+ Nota: Al activar esta opción, cualquiera que utilice este ordenador podrá ver tu lista de lugares favoritos.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GrantModifyRights">
+ Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar, borrar o tomar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso.
+¿Quieres conceder permisos de modificación a [NAME]?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="GrantModifyRightsMultiple">
+ Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso.
+¿Quieres conceder permisos de modificación a los Residentes elegidos?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="RevokeModifyRights">
+ ¿Quieres retirar los permisos de modificación a [NAME]?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="RevokeModifyRightsMultiple">
+ ¿Quieres revocar los derechos de modificación a los residentes seleccionados?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="UnableToCreateGroup">
+ No se ha podido crear el grupo.
+[MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PanelGroupApply">
+ [NEEDS_APPLY_MESSAGE]
+[WANT_APPLY_MESSAGE]
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Ignorar los cambios" yestext="Aplicar los cambios"/>
+ </notification>
+ <notification name="MustSpecifyGroupNoticeSubject">
+ Para enviar un aviso de grupo debes especificar un asunto.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AddGroupOwnerWarning">
+ Vas a añadir miembros al rol de [ROLE_NAME].
+No podrás removérseles de ese rol, sino que deberán renunciar a él por sà mismos.
+¿Estás seguro de que quieres seguir?
+ <usetemplate ignoretext="Confirmar que vas a añadir un nuevo propietario al grupo" name="okcancelignore" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="AssignDangerousActionWarning">
+ Vas a añadir la capacidad '[ACTION_NAME]' al rol '[ROLE_NAME]'.
+
+ *ATENCIÓN*
+ Todos los miembros con esta capacidad podrán asignarse a sà mismos -y a otros miembros- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrÃan elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad.
+¿Añadir esta capacidad a '[ROLE_NAME]'?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="AssignDangerousAbilityWarning">
+ Vas a añadir la capacidad '[ACTION_NAME]' al rol '[ROLE_NAME]'.
+
+ *ATENCIÓN*
+ Todos los miembros con esta capacidad podrán asignarse a sà mismos -y a otros miembros- todas las capacidades, elevándose hasta poderes cercanos a los del propietario.
+¿Añadir esta capacidad a '[ROLE_NAME]'?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="AttachmentDrop">
+ Vas a soltar tu anexado.
+ ¿Estás seguro de que quieres continuar?
+ <usetemplate ignoretext="Confirmar antes de soltar anexados" name="okcancelignore" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="JoinGroupCanAfford">
+ Entrar a este grupo cuesta [COST] L$.
+¿Quieres hacerlo??
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Entrar"/>
+ </notification>
+ <notification name="JoinGroupNoCost">
+ Vas a entrar al grupo [NAME].
+¿Quieres seguir?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Entrar"/>
+ </notification>
+ <notification name="JoinGroupCannotAfford">
+ Entrar a este grupo cuesta [COST] L$.
+No tienes dinero suficiente para entrar.
+ </notification>
+ <notification name="CreateGroupCost">
+ Crear este grupo te costará 100 L$.
+Los grupos necesitan más de un miembro. Si no, son borrados permanentemente.
+Por favor, invita a miembros en las próximas 48 horas.
+ <usetemplate canceltext="Cancelar" name="okcancelbuttons" notext="Cancelar" yestext="Crear un grupo por 100 L$"/>
+ </notification>
+ <notification name="LandBuyPass">
+ Por [COST] L$ puedes entrar a este terreno ('[PARCEL_NAME]') durante [TIME] horas. ¿Comprar un pase?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="SalePriceRestriction">
+ El precio de venta tiene que ser mayor de 0 L$ si la venta es a cualquiera.
+Por favor, elige a alguien concreto como comprador si la venta es por 0 L$.
+ </notification>
+ <notification name="ConfirmLandSaleChange">
+ Los [LAND_SIZE] m² de terreno seleccionados se van a poner a la venta.
+El precio de venta será de [SALE_PRICE] L$, y se autorizará la compra sólo a [NAME].
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmLandSaleToAnyoneChange">
+ ATENCIÓN: Marcando 'vender a cualquiera' hace que tu terreno esté disponible para toda la comunidad de [SECOND_LIFE], incluso para quienes no están en esta región.
+
+Los [LAND_SIZE] m² seleccionados de terreno se van a poner a la venta.
+El precio de venta será de [SALE_PRICE] L$ y se autoriza la compra a [NAME].
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsDeededToGroup">
+ ¿Estás seguro de que quieres devolver todos los objetos de esta parcela que estén compartidos con el grupo '[NAME]' al inventario de su propietario anterior?
+
+*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo!
+
+Objetos: [N]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedByUser">
+ ¿Estás seguro de que quieres devolver al inventario de '[NAME]' todos los objetos que sean de su propiedad en esta parcela?
+
+Objetos: [N]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedBySelf">
+ ¿Estás seguro de que quieres devolver a su inventario todos los objetos de los que eres propietario en esta parcela?
+
+Objetos: [N]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedBySelf">
+ ¿Estás seguro de que quieres devolver todos los objetos de los que NO eres propietario en esta parcela al inventario de sus propietarios?
+Los objetos transferibles que se hayan transferido al grupo se devolverán a sus propietarios previos.
+
+*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo!
+
+Objetos: [N]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByUser">
+ ¿Estás seguro de que quieres devolver todos los objetos de esta parcela que NO sean propiedad de [NAME] al inventario de su propietario?
+Los objetos transferibles que se hayan transferido al grupo se devolverán a sus propietarios previos.
+
+*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo!
+
+Objetos: [N]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ReturnAllTopObjects">
+ ¿Estás seguro de que quieres devolver al inventario de su propietario todos los objetos de la lista?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="DisableAllTopObjects">
+ ¿Estás seguro de que quieres desactivar todos los objetos de esta región?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByGroup">
+ ¿Devolver a sus propietarios los objetos de esta parcela que NO estén compartidos con el grupo [NAME]?
+
+Objetos: [N]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="UnableToDisableOutsideScripts">
+ No se pueden desactivar los scripts.
+Toda esta región tiene activado el 'daño'.
+Para que funcionen las armas los scripts deben estar activados.
+ </notification>
+ <notification name="MultipleFacesSelected">
+ Están seleccionadas varias caras.
+Si sigues con esta acción, en las diferentes caras del objeto aparecerán distintas peticiones de los media.
+Para colocar los media en una sola cara, marca la opción Elegir la cara y pulsa en la cara adecuada del objeto, y luego pulsa Añadir.
+ <usetemplate ignoretext="Los media se configurarán en las varias caras seleccionadas" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="MustBeInParcel">
+ Para configurar el Punto de llegada de la parcela,
+debes estar dentro de ella.
+ </notification>
+ <notification name="PromptRecipientEmail">
+ Por favor, escribe una dirección de correo electrónica válida para el/los receptor/es.
+ </notification>
+ <notification name="PromptSelfEmail">
+ Por favor, escribe tu dirección de correo electrónico.
+ </notification>
+ <notification name="PromptMissingSubjMsg">
+ ¿Foto por correo electrónico con el asunto o el mensaje por defecto?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ErrorProcessingSnapshot">
+ Error al procesar los datos de la foto.
+ </notification>
+ <notification name="ErrorEncodingSnapshot">
+ Error al codificar la foto.
+ </notification>
+ <notification name="ErrorUploadingPostcard">
+ Hubo un problema al enviar la foto por la siguiente razón: [REASON]
+ </notification>
+ <notification name="ErrorUploadingReportScreenshot">
+ Hubo un problema al subir la captura de pantalla del informe por la siguiente razón: [REASON]
+ </notification>
+ <notification name="MustAgreeToLogIn">
+ Debes estar de acuerdo con las Condiciones del Servicio para continuar el inicio de sesión en [SECOND_LIFE].
+ </notification>
+ <notification name="CouldNotPutOnOutfit">
+ No se ha podido poner el vestuario.
+La carpeta del vestuario contiene partes del cuerpo, u objetos a anexar o que no son ropa.
+ </notification>
+ <notification name="CannotWearTrash">
+ No puedes vestirte ropas o partes del cuerpo que estén en la Papelera
+ </notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ No se puede anexar el objeto.
+Se ha superado el lÃmite máximo de [MAX_ATTACHMENTS] objetos. Por favor, quÃtate alguno.
+ </notification>
+ <notification name="CannotWearInfoNotComplete">
+ No puedes vestirte este Ãtem porque aún no se ha cargado. Por favor, inténtalo de nuevo en un minuto.
+ </notification>
+ <notification name="MustHaveAccountToLogIn">
+ Lo sentimos. Se ha quedado algún espacio en blanco.
+Tienes que volver a introducir el nombre de usuario de tu avatar.
+
+Necesitas una cuenta para acceder a [SECOND_LIFE]. ¿Te gustarÃa crear una ahora?
+ <url name="url">
+ https://join.secondlife.com/index.php?lang=es-ES
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Volver a intentarlo" yestext="Crear una cuenta nueva"/>
+ </notification>
+ <notification name="InvalidCredentialFormat">
+ Escribe el nombre de usuario o el nombre y el apellido de tu avatar en el campo Nombre de usuario e inicia sesión otra vez.
+ </notification>
+ <notification name="DeleteClassified">
+ ¿Borrar el clasificado '[NAME]'?
+No se reembolsan las cuotas pagadas.
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="DeleteMedia">
+ Has elegido borrar los media asociados a esta cara.
+¿Estás seguro de que quieres continuar?
+ <usetemplate ignoretext="Confirmar antes de borrar los media de un objeto" name="okcancelignore" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="ClassifiedSave">
+ ¿Guardar los cambios en el clasificado [NAME]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardar" yestext="Guardar"/>
+ </notification>
+ <notification name="ClassifiedInsufficientFunds">
+ Dinero insuficiente para crear un clasificado.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="DeleteAvatarPick">
+ ¿Borrar el destacado <nolink>[PICK]</nolink>?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="DeleteOutfits">
+ ¿Eliminar el vestuario seleccionado?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="PromptGoToEventsPage">
+ ¿Ir a la web de eventos de [SECOND_LIFE]?
+ <url name="url">
+ http://secondlife.com/events/?lang=es-ES
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="SelectProposalToView">
+ Por favor, selecciona qué propuesta quieres ver.
+ </notification>
+ <notification name="SelectHistoryItemToView">
+ Por favor, selecciona un Ãtem del historial para verlo.
+ </notification>
+ <notification name="CacheWillClear">
+ La caché se limpiará cuando reinices [APP_NAME].
+ </notification>
+ <notification name="CacheWillBeMoved">
+ La caché se moverá cuando reinicies [APP_NAME].
+Nota: esto vaciará la caché.
+ </notification>
+ <notification name="ChangeConnectionPort">
+ La configuración del puerto tendrá efecto cuando reinicies [APP_NAME].
+ </notification>
+ <notification name="ChangeSkin">
+ Verás la nueva apariencia cuando reinicies [APP_NAME].
+ </notification>
+ <notification name="ChangeLanguage">
+ El cambio de idioma tendrá efecto cuando reinicies [APP_NAME].
+ </notification>
+ <notification name="GoToAuctionPage">
+ ¿Ir a la página web de [SECOND_LIFE] para ver los detalles de la subasta
+o hacer una puja?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="SaveChanges">
+ ¿Guardar los cambios?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardar" yestext="Guardar"/>
+ </notification>
+ <notification name="GestureSaveFailedTooManySteps">
+ Fallo al guardar el gesto.
+Este gesto tiene demasiados pasos.
+Intenta quitarle algunos, y vuelve a guardarlo.
+ </notification>
+ <notification name="GestureSaveFailedTryAgain">
+ Fallo al guardar el gesto. Por favor, vuelve a intentarlo en un minuto.
+ </notification>
+ <notification name="GestureSaveFailedObjectNotFound">
+ No se ha podido guardar el gesto porque no se pudo encontrar el objeto o el objeto asociado.
+El objeto debe de haber sido borrado o estar fuera de rango ('out of range').
+ </notification>
+ <notification name="GestureSaveFailedReason">
+ Al guardar un gesto, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde.
+ </notification>
+ <notification name="SaveNotecardFailObjectNotFound">
+ No se ha podido guardar la nota porque no se pudo encontrar el objeto o el objeto asociado del inventario.
+El objeto debe de haber sido borrado o estar fuera de rango ('out of range').
+ </notification>
+ <notification name="SaveNotecardFailReason">
+ Al guardar una nota, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarla más tarde.
+ </notification>
+ <notification name="ScriptCannotUndo">
+ No se han podido deshacer todos los cambios en tu versión del script.
+¿Quieres cargar la última versión guardada en el servidor?
+(**Cuidado** No podrás deshacer esta operación).
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="SaveScriptFailReason">
+ Al guardar un script, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde.
+ </notification>
+ <notification name="SaveScriptFailObjectNotFound">
+ No se ha podido guardar el script porque no se pudo encontrar el objeto que incluye.
+El objeto debe de haber sido borrado o estar fuera de rango ('out of range')..
+ </notification>
+ <notification name="SaveBytecodeFailReason">
+ Al guardar un script compilado, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde..
+ </notification>
+ <notification name="StartRegionEmpty">
+ Perdón, no está definida tu Posición inicial.
+Por favor, escribe el nombre de la región en el cajetÃn de Posición inicial, o elige para esa posición Mi Base o Mi última posición.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CouldNotStartStopScript">
+ No se ha podido correr o parar el script porque no se pudo encontrar el objeto que incluye.
+El objeto debe de haber sido borrado o estar fuera de rango ('out of range')..
+ </notification>
+ <notification name="CannotDownloadFile">
+ No se ha podido descargar el archivo.
+ </notification>
+ <notification name="CannotWriteFile">
+ No se ha podido escribir el archivo [[FILE]]
+ </notification>
+ <notification name="UnsupportedHardware">
+ Debes saber que tu ordenador no cumple los requisitos mÃnimos para la utilización de [APP_NAME]. Puede que experimentes un rendimiento muy bajo. Desafortunadamente, [SUPPORT_SITE] no puede dar asistencia técnica a sistemas con una configuración no admitida.
+
+¿Ir a [_URL] para más información?
+ <url name="url" option="0">
+ http://secondlife.com/support/sysreqs.php?lang=es
+ </url>
+ <usetemplate ignoretext="El hardware de mi ordenador no está admitido" name="okcancelignore" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="UnknownGPU">
+ Tu sistema usa una tarjeta gráfica que [APP_NAME] no reconoce.
+Suele suceder con hardware nuevo que todavÃa no ha sido probado con [APP_NAME]. Probablemente todo irá bien, pero deberás ajustar tus configuraciones gráficas.
+(Yo > Preferencias > Gráficos).
+ <form name="form">
+ <ignore name="ignore" text="No se ha podido identificar mi tarjeta gráfica"/>
+ </form>
+ </notification>
+ <notification name="DisplaySettingsNoShaders">
+ [APP_NAME] se cae al iniciar los 'driver' gráficos.
+La calidad de los gráficos se configurará en Baja para prevenir algunos errores comunes de los gráficos. Esto desactivará algunas posibilidades gráficas.
+Te recomendamos actualizar los 'drivers' de tu tarjeta gráfica.
+La calidad gráfica puede ajustarse en Preferencias > Gráficos.
+ </notification>
+ <notification name="RegionNoTerraforming">
+ En la región [REGION] no se permite modificar el terreno.
+ </notification>
+ <notification name="CannotCopyWarning">
+ No tienes permiso para copiar los elementos siguientes:
+[ITEMS] y, si los das, los perderás del inventario. ¿Seguro que quieres ofrecerlos?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="CannotGiveItem">
+ No se ha podido dar el Ãtem del inventario.
+ </notification>
+ <notification name="TransactionCancelled">
+ Transacción cancelada.
+ </notification>
+ <notification name="TooManyItems">
+ No puedes dar más de 42 Ãtems en una única transferencia del inventario.
+ </notification>
+ <notification name="NoItems">
+ No tienes permiso para transferir el Ãtem seleccionado.
+ </notification>
+ <notification name="CannotCopyCountItems">
+ No tienes permiso para copiar [COUNT] de los
+Ãtems seleccionados. Si los das, los perderás de tu inventario.
+¿Realmente quieres darlos?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="CannotGiveCategory">
+ No tienes permiso para transferir
+la carpeta seleccionada.
+ </notification>
+ <notification name="FreezeAvatar">
+ ¿Congelar a este avatar?
+Temporalmente, será incapaz de moverse, usar el chat, o interactuar con el mundo.
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Descongelarle" yestext="Congelarle"/>
+ </notification>
+ <notification name="FreezeAvatarFullname">
+ ¿Congelar a [AVATAR_NAME]?
+Temporalmente, será incapaz de moverse, usar el chat, o interactuar con el mundo.
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Descongelarle" yestext="Congelarle"/>
+ </notification>
+ <notification name="EjectAvatarFullname">
+ ¿Expulsar a [AVATAR_NAME] de tu terreno?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Expulsar y Prohibir el acceso" yestext="Expulsar"/>
+ </notification>
+ <notification name="EjectAvatarNoBan">
+ ¿Expulsar a este avatar de tu terreno?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar"/>
+ </notification>
+ <notification name="EjectAvatarFullnameNoBan">
+ ¿Expulsar a [AVATAR_NAME] de tu terreno?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar"/>
+ </notification>
+ <notification name="EjectAvatarFromGroup">
+ Has expulsado a [AVATAR_NAME] del grupo [GROUP_NAME]
+ </notification>
+ <notification name="AcquireErrorTooManyObjects">
+ ERROR 'ACQUIRE': Hay demasiados objetos seleccionados.
+ </notification>
+ <notification name="AcquireErrorObjectSpan">
+ ERROR 'ACQUIRE': Los objetos están en más de una región.
+Por favor, mueve todos los objetos a adquirir a la
+misma región.
+ </notification>
+ <notification name="PromptGoToCurrencyPage">
+ [EXTRA]
+
+¿Ir a [_URL] para informarte sobre la compra de L$?
+ <url name="url">
+ http://secondlife.com/app/currency/?lang=es-ES
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="UnableToLinkObjects">
+ No se pudo enlazar estos [COUNT] objetos.
+Puedes enlazar [MAX] objetos como máximo.
+ </notification>
+ <notification name="CannotLinkIncompleteSet">
+ Sólo puedes enlazar objetos completos (no sus partes), y debes
+seleccionar más de uno.
+ </notification>
+ <notification name="CannotLinkModify">
+ Imposible enlazarlos, porque no tienes permiso para modificar
+todos los objetos.
+
+Por favor, asegúrate de que no hay ninguno bloqueado, y de que eres el propietario de todos.
+ </notification>
+ <notification name="CannotLinkDifferentOwners">
+ Imposible enlazarlos, porque hay objetos de distintos propietarios.
+
+Por favor, asegúrate de que eres el propietario de todos los objetos seleccionados.
+ </notification>
+ <notification name="NoFileExtension">
+ No hay extensión de archivo en: '[FILE]'
+
+Por favor, asegúrate de que la extensión del archivo es correcta.
+ </notification>
+ <notification name="InvalidFileExtension">
+ Extensión inválida de archivo: [EXTENSION]
+PodrÃa ser [VALIDS]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CannotUploadSoundFile">
+ No se pudo abrir el archivo de sonido que has subido para leer:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotRIFF">
+ No parece que el archivo sea un archivo RIFF WAVE:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotPCM">
+ No parece que el archivo sea un archivo de audio PCM WAVE:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChannelCount">
+ El archivo no tiene un número de canales válido (debe ser mono o estéreo):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidSampleRate">
+ No parece que el archivo tenga una frecuencia de muestreo (sample rate) adecuada (debe de ser 44.1k):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidWordSize">
+ No parece que el archivo tenga un tamaño de palabra (word size) adecuado (debe de ser de 8 o 16 bites):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidHeader">
+ No se encontró el fragmento 'data' en la cabecera del WAV:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChunkSize">
+ Tamaño de lote erróneo en el archivo WAV:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidTooLong">
+ El archivo de audio es demasiado largo (10 segundos como máximo):
+[FILE]
+ </notification>
+ <notification name="ProblemWithFile">
+ Problemas con el archivo [FILE]:
+
+[ERROR]
+ </notification>
+ <notification name="CannotOpenTemporarySoundFile">
+ No se ha podido abrir para su escritura el archivo comprimido de sonido: [FILE]
+ </notification>
+ <notification name="UnknownVorbisEncodeFailure">
+ Códec Vorbis desconocido, fallo en : [FILE]
+ </notification>
+ <notification name="CannotEncodeFile">
+ No se puede codificar el archivo: [FILE]
+ </notification>
+ <notification name="CorruptedProtectedDataStore">
+ No se pueden rellenar el nombre de usuario y la contraseña. Esto puede deberse a un cambio de configuración de la red.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CorruptResourceFile">
+ Archivo con los recursos corruptos: [FILE]
+ </notification>
+ <notification name="UnknownResourceFileVersion">
+ Versión de archivo desconocida para el recurso Linden en el archivo: [FILE]
+ </notification>
+ <notification name="UnableToCreateOutputFile">
+ No se ha podido crear el archivo de salida: [FILE]
+ </notification>
+ <notification name="DoNotSupportBulkAnimationUpload">
+ Actualmente, [APP_NAME] no admite la subida masiva de animaciones.
+ </notification>
+ <notification name="CannotUploadReason">
+ No se ha podido subir [FILE] por la siguiente razón: [REASON]
+Por favor, inténtalo más tarde.
+ </notification>
+ <notification name="LandmarkCreated">
+ Se ha añadido "[LANDMARK_NAME]" a tu carpeta [FOLDER_NAME].
+ </notification>
+ <notification name="LandmarkAlreadyExists">
+ Ya tienes un hito de esta localización.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CannotCreateLandmarkNotOwner">
+ No puedes crear un hito aquà porque el propietario del terreno no lo permite.
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoScripts">
+ No se pudo 'recompilar'.
+Selecciona un objeto con script.
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoPermission">
+ No se pudo 'recompilar'.
+
+Selecciona objetos con scripts en los que tengas permiso para modificarlos.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoScripts">
+ No se pudo 'reiniciar'.
+
+Selecciona objetos con scripts.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoPermission">
+ No se pudo 'reiniciar'.
+
+Selecciona objetos con scripts en los que tengas permiso para modificarlos.
+ </notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ Imposible abrir el script del objeto sin modificar los permisos.
+ </notification>
+ <notification name="CannotSetRunningSelectObjectsNoScripts">
+ No se puede configurar ningún script como 'ejecutándose'.
+
+Selecciona objetos con scripts.
+ </notification>
+ <notification name="CannotSetRunningNotSelectObjectsNoScripts">
+ No se puede configurar ningún script como 'no ejecutándose'.
+
+Selecciona objetos con scripts.
+ </notification>
+ <notification name="NoFrontmostFloater">
+ No hay nada que guardar.
+ </notification>
+ <notification name="SeachFilteredOnShortWords">
+ Se ha modificado tu búsqueda,
+eliminando las palabras demasiado cortas.
+
+Buscando: [FINALQUERY]
+ </notification>
+ <notification name="SeachFilteredOnShortWordsEmpty">
+ Los términos de tu búsqueda son muy cortos,
+por lo que no se ha hecho la búsqueda.
+ </notification>
+ <notification name="CouldNotTeleportReason">
+ Fallo en el teleporte.
+[REASON]
+ </notification>
+ <notification name="invalid_tport">
+ Ha habido un problema al procesar tu petición de teleporte. Debes volver a iniciar sesión antes de poder teleportarte de nuevo.
+Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
+ </notification>
+ <notification name="invalid_region_handoff">
+ Ha habido un problema al procesar tu paso a otra región. Debes volver a iniciar sesión para poder pasar de región a región.
+Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
+ </notification>
+ <notification name="blocked_tport">
+ Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelve a intentarlo en un momento. Si sigues sin poder teleportarte, desconéctate y vuelve a iniciar sesión para solucionar el problema.
+ </notification>
+ <notification name="nolandmark_tport">
+ Lo sentimos, pero el sistema no ha podido localizar el destino de este hito.
+ </notification>
+ <notification name="timeout_tport">
+ Lo sentimos, pero el sistema no ha podido completar el teleporte.
+Vuelve a intentarlo en un momento.
+ </notification>
+ <notification name="noaccess_tport">
+ Lo sentimos, pero no tienes acceso al destino de este teleporte.
+ </notification>
+ <notification name="missing_attach_tport">
+ Aún no han llegado tus objetos anexados. Espera unos segundos más o desconéctate y vuelve a iniciar sesión antes de teleportarte.
+ </notification>
+ <notification name="too_many_uploads_tport">
+ La cola de espera en esta región está actualmente obstruida, por lo que tu petición de teleporte no se atenderá en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos o ve a una zona menos ocupada.
+ </notification>
+ <notification name="expired_tport">
+ Lo sentimos, pero el sistema no ha podido atender a tu petición de teleporte en un tiempo prudencial. Por favor, vuelve a intentarlo en unos pocos minutos.
+ </notification>
+ <notification name="expired_region_handoff">
+ Lo sentimos, pero el sistema no ha podido completar tu paso a otra región en un tiempo prudencial. Por favor, vuelve a intentarlo en unos pocos minutos.
+ </notification>
+ <notification name="no_host">
+ Ha sido imposible encontrar el destino del teleporte: o está desactivado temporalmente o ya no existe. Por favor, vuelve a intentarlo en unos pocos minutos.
+ </notification>
+ <notification name="no_inventory_host">
+ En estos momentos no está disponible el sistema del inventario.
+ </notification>
+ <notification name="CannotSetLandOwnerNothingSelected">
+ No se ha podido configurar el propietario del terreno:
+no se ha seleccionado una parcela.
+ </notification>
+ <notification name="CannotSetLandOwnerMultipleRegions">
+ No se ha podido obtener la propiedad del terreno porque la selección se extiende por varias regiones. Por favor, selecciona un área más pequeña y vuelve a intentarlo.
+ </notification>
+ <notification name="ForceOwnerAuctionWarning">
+ Esta parcela está subastándose. Forzar su propiedad cancelará la subasta y, potencialmente, puede disgustar a algunos residentes si la puja ya ha empezado.
+¿Forzar la propiedad?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="CannotContentifyNothingSelected">
+ No se ha podido 'contentify':
+no se ha seleccionado una parcela.
+ </notification>
+ <notification name="CannotContentifyNoRegion">
+ No se ha podido 'contentify':
+no se ha seleccionado una región.
+ </notification>
+ <notification name="CannotReleaseLandNothingSelected">
+ No se ha podido abandonar el terreno:
+no se ha seleccionado una parcela.
+ </notification>
+ <notification name="CannotReleaseLandNoRegion">
+ No se ha podido abandonar el terreno:
+no se ha podido encontrar la región.
+ </notification>
+ <notification name="CannotBuyLandNothingSelected">
+ Imposible comprar terreno:
+no se ha seleccionado una parcela.
+ </notification>
+ <notification name="CannotBuyLandNoRegion">
+ Imposible comprar terreno:
+no se ha podido encontrar en qué región está.
+ </notification>
+ <notification name="CannotCloseFloaterBuyLand">
+ No puedes cerrar la ventana de Comprar terreno hasta que [APP_NAME] calcule el precio de esta transacción.
+ </notification>
+ <notification name="CannotDeedLandNothingSelected">
+ No se ha podido transferir el terreno:
+no se ha seleccionado una parcela.
+ </notification>
+ <notification name="CannotDeedLandNoGroup">
+ No se ha podido transferir el terreno:
+no has seleccionado un grupo.
+ </notification>
+ <notification name="CannotDeedLandNoRegion">
+ No se ha podido transferir el terreno:
+Ha sido imposible encontrar en qué región está.
+ </notification>
+ <notification name="CannotDeedLandMultipleSelected">
+ No se ha podido transferir el terreno:
+has seleccionado varias parcelas.
+
+Inténtalo seleccionando sólo una.
+ </notification>
+ <notification name="CannotDeedLandWaitingForServer">
+ No se ha podido transferir el terreno:
+esperando que el servidor informe acerca de la propiedad.
+
+Por favor, vuelve a intentarlo.
+ </notification>
+ <notification name="CannotDeedLandNoTransfer">
+ No se ha podido transferir el terreno:
+En la región [REGION] no se permite transferir terrenos.
+ </notification>
+ <notification name="CannotReleaseLandWatingForServer">
+ No se ha podido abandonar el terreno:
+esperando que el servidor actualice la información de la parcela.
+
+Vuelve a intentarlo en unos segundos.
+ </notification>
+ <notification name="CannotReleaseLandSelected">
+ No se ha podido abandonar el terreno:
+no eres propietario de todas las parcelas seleccionadas.
+
+Por favor, selecciona una sola parcela.
+ </notification>
+ <notification name="CannotReleaseLandDontOwn">
+ No se ha podido abandonar el terreno:
+no tienes permisos sobre esta parcela.
+Las parcelas de tu propiedad se muestran en verde.
+ </notification>
+ <notification name="CannotReleaseLandRegionNotFound">
+ No se ha podido abandonar el terreno:
+Ha sido imposible encontrar en qué región está.
+ </notification>
+ <notification name="CannotReleaseLandNoTransfer">
+ No se ha podido abandonar el terreno:
+En la región [REGION] no se permite transferir terrenos.
+ </notification>
+ <notification name="CannotReleaseLandPartialSelection">
+ No se ha podido abandonar el terreno:
+debes seleccionar toda la parcela.
+
+Selecciona una parcela completa, o divÃdela primero.
+ </notification>
+ <notification name="ReleaseLandWarning">
+ Vas a abandonar [AREA] m² de terreno.
+Al hacerlo, la quitarás de entre tus posesiones de terreno, pero no recibirás ningún L$.
+
+¿Abandonar este terreno?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="CannotDivideLandNothingSelected">
+ No se ha podido dividir el terreno:
+
+No has seleccionado ninguna parcela.
+ </notification>
+ <notification name="CannotDivideLandPartialSelection">
+ No se ha podido dividir el terreno:
+
+Has seleccionado una parcela entera.
+Inténtalo seleccionando una parte.
+ </notification>
+ <notification name="LandDivideWarning">
+ Dividir este terreno lo separará en dos parcelas, cada una de las cuales tendrá su propia configuración. Tras esta operación, algunas configuraciones volverán a las existentes por defecto.
+
+¿Dividir el terreno?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="CannotDivideLandNoRegion">
+ No se ha podido dividir el terreno:
+Ha sido imposible encontrar en qué región está.
+ </notification>
+ <notification name="CannotJoinLandNoRegion">
+ No se ha podido unir el terreno:
+Ha sido imposible encontrar en qué región está.
+ </notification>
+ <notification name="CannotJoinLandNothingSelected">
+ No se ha podido unir el terreno:
+No hay parcelas seleccionadas.
+ </notification>
+ <notification name="CannotJoinLandEntireParcelSelected">
+ No se ha podido unir el terreno:
+Sólo has seleccionado una parcela.
+
+Selecciona terreno que incluya algo de ambas parcelas.
+ </notification>
+ <notification name="CannotJoinLandSelection">
+ No se ha podido unir el terreno:
+Debes seleccionar más de una parcela.
+
+Selecciona terreno que incluya algo de ambas parcelas.
+ </notification>
+ <notification name="JoinLandWarning">
+ Al unir este terreno crearás una parcela más grande formada por todas aquellas que tengan parte en el rectángulo seleccionado.
+Deberás reconfigurar el nombre y las opciones de la nueva parcela.
+
+¿Unir el terreno?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmNotecardSave">
+ Esta nota debe guardarse antes de que puedas copiarla o verla. ¿Guardar la nota?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmItemCopy">
+ ¿Copiar este Ãtem a tu inventario?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Copiar"/>
+ </notification>
+ <notification name="ResolutionSwitchFail">
+ Fallo al cambiar la resolución a [RESX] por [RESY]
+ </notification>
+ <notification name="ErrorUndefinedGrasses">
+ Error, hierbas no definidas: [SPECIES]
+ </notification>
+ <notification name="ErrorUndefinedTrees">
+ Error, árboles no definidos: [SPECIES]
+ </notification>
+ <notification name="CannotSaveWearableOutOfSpace">
+ No se ha podido guardar el archivo '[NAME]'. Tendrás que liberar algo de espacio en tu ordenador y guardarlo de nuevo.
+ </notification>
+ <notification name="CannotSaveToAssetStore">
+ No se ha podido guardar [NAME] en la base central de almacenamiento.
+Generalmente, esto es un fallo pasajero. Por favor, personaliza y guarda el Ãtem de aquà a unos minutos.
+ </notification>
+ <notification name="YouHaveBeenLoggedOut">
+ Vaya, se ha cerrado tu sesión en [SECOND_LIFE].
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="Salir" yestext="Ver MI y Chat"/>
+ </notification>
+ <notification name="OnlyOfficerCanBuyLand">
+ No se ha podido comprar terreno para el grupo:
+no tienes el permiso de comprar terreno para el grupo que tienes activado actualmente.
+ </notification>
+ <notification label="Añadir como amigo" name="AddFriendWithMessage">
+ Los amigos pueden darse permiso para localizarse en el mapa y para saber si el otro está conectado.
+
+¿Ofrecer a [NAME] que sea tu amigo?
+ <form name="form">
+ <input name="message">
+ ¿Quieres formar parte de mis amigos?
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification label="Guardar el vestuario" name="SaveOutfitAs">
+ Guardar como un nuevo vestuario lo que estoy llevando:
+ <form name="form">
+ <input name="message">
+ [DESC] (nuevo)
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification label="Guardar artÃculo" name="SaveWearableAs">
+ Guardar el Ãtem en mi inventario como:
+ <form name="form">
+ <input name="message">
+ [DESC] (nuevo)
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification label="Renombrar el vestuario" name="RenameOutfit">
+ Nombre del nuevo vestuario:
+ <form name="form">
+ <input name="new_name">
+ [NAME]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="RemoveFromFriends">
+ ¿Quieres eliminar a [NAME] de tu lista de amigos?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="RemoveMultipleFromFriends">
+ ¿Quieres quitar a varios amigos de tu lista de amigos?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedPublicObjectsByUser">
+ ¿Estás seguro de que quieres borrar todos los objetos con script que sean propiedad de
+** [AVATAR_NAME] **
+en todos los otros terrenos de este sim?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedObjectsByUser">
+ ¿Estás seguro de que quieres BORRAR TODOS los objetos con script que sean propiedad de
+** [AVATAR_NAME] **
+en TODO EL TERRENO de este sim?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllObjectsByUser">
+ ¿Estás seguro de que quieres BORRAR TODOS los objetos (con script o no) que sean propiedad de
+** [AVATAR_NAME] **
+en TODO EL TERRENO de este sim?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="BlankClassifiedName">
+ Debes especificar un nombre para tu clasificado.
+ </notification>
+ <notification name="MinClassifiedPrice">
+ El pago para aparecer en la lista debe ser de, al menos, [MIN_PRICE] L$.
+
+Por favor, elige un pago mayor.
+ </notification>
+ <notification name="ConfirmItemDeleteHasLinks">
+ Por lo menos uno de los elementos seleccionados contiene vÃnculos que le señalan. Si eliminas este elemento, los vÃnculos dejarán de funcionar permanentemente. Lo más recomendable es eliminar primero los vÃnculos.
+
+¿Estás seguro de que quieres eliminar los elementos?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLock">
+ Al menos uno de los Ãtems que has seleccionado está bloqueado.
+
+¿Estás seguro de que quieres borrar estos Ãtems?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopy">
+ Al menos uno de los Ãtems que has seleccionado no es copiable.
+
+¿Estás seguro de que quieres borrar estos Ãtems?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoOwn">
+ No eres el propietario de, al menos, uno de los Ãtems que has seleccionado.
+
+¿Estás seguro de que quieres borrar estos Ãtems?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopy">
+ Al menos un objeto está bloqueado.
+Al menos un objeto no es copiable.
+
+¿Estás seguro de que quieres borrar estos Ãtems?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoOwn">
+ Al menos un objeto está bloqueado.
+No eres propietario de, al menos, un objeto.
+
+¿Estás seguro de que quieres borrar estos Ãtems?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopyNoOwn">
+ Al menos un objeto no es copiable.
+No eres propietario de, al menos, un objeto.
+
+¿Estás seguro de que quieres borrar estos Ãtems?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
+ Al menos un objeto está bloqueado.
+Al menos un objeto no es copiable.
+No eres propietario de, al menos, un objeto.
+
+¿Estás seguro de que quieres borrar estos Ãtems?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLock">
+ Al menos un objeto está bloqueado.
+
+¿Estás seguro de que quieres tomar estos Ãtems?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeNoOwn">
+ No eres el propietario de todos los objetos que estás tomando.
+Si sigues, se aplicarán los permisos marcados para el próximo propietario, y es posible que se restrinja tu posibilidad de hacer modificaciones o copias.
+
+¿Estás seguro de que quieres tomar estos Ãtems?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLockNoOwn">
+ Al menos un objeto está bloqueado.
+No eres el propietario de todos los objetos que estás tomando.
+Si sigues, se aplicarán los permisos marcados para el próximo propietario, y es posible que se restrinja tu posibilidad de hacer modificaciones o copias.
+Con todo, puedes tomar lo actualmente seleccionado.
+
+¿Estás seguro de que quieres tomar estos Ãtems?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="CantBuyLandAcrossMultipleRegions">
+ No se ha podido hacer la compra porque el terreno seleccionado se extiende por varias regiones.
+
+Por favor, selecciona un área más pequeña y vuelve a intentarlo.
+ </notification>
+ <notification name="DeedLandToGroup">
+ Al transferir esta parcela, se requerirá al grupo que tenga y mantenga el crédito suficiente para uso de terreno.
+El precio de compra de la parcela no se reembolsa al propietario.
+Si se vende una parcela transferida, el precio de venta se dividirá a partes iguales entre los miembros del grupo.
+
+¿Transferir estos [AREA] m² de terreno al grupo
+'[GROUP_NAME]'?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="DeedLandToGroupWithContribution">
+ Al transferir esta parcela, el grupo deberá poseer y mantener el número suficiente de créditos de uso de terreno.
+El traspaso incluirá una contribución simultánea de terreno al grupo de "[NAME]".
+El precio de compra del terreno no se le devolverá al propietario. Si se vende una parcela transferida, el precio de venta se dividirá en partes iguales entre los miembros del grupo.
+
+¿Transferir este terreno de [AREA] m² al grupo '[GROUP_NAME]'?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="DisplaySetToSafe">
+ Las configuraciones que se muestran se han fijado en los niveles guardados, pues especificaste la opción de guardarlos.
+ </notification>
+ <notification name="DisplaySetToRecommended">
+ Las configuraciones que se muestran se han fijado en los niveles recomendados para la configuración de tu sistema.
+ </notification>
+ <notification name="ErrorMessage">
+ [ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AvatarMovedDesired">
+ La localización que querÃas no está disponible en estos momentos.
+Se te ha llevado a una región cercana.
+ </notification>
+ <notification name="AvatarMovedLast">
+ En estos momentos no está disponible tu última posición.
+Se te ha llevado a una región cercana.
+ </notification>
+ <notification name="AvatarMovedHome">
+ En estos momentos no está disponible tu Base.
+Se te ha llevado a una región cercana.
+Quizá quieras configurar una nueva posición para tu Base.
+ </notification>
+ <notification name="ClothingLoading">
+ Aún está descargándose tu ropa.
+Puedes usar [SECOND_LIFE] de forma normal; los demás residentes te verán correctamente.
+ <form name="form">
+ <ignore name="ignore" text="La ropa está tardando mucho en descargarse"/>
+ </form>
+ </notification>
+ <notification name="FirstRun">
+ Se ha completado la instalación de [SECOND_LIFE].
+
+Si es la primera vez que usas [SECOND_LIFE], debes crear una cuenta antes de poder iniciar una sesión.
+¿Volver a [http://join.secondlife.com secondlife.com] para crear una cuenta nueva?
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Cuenta nueva..."/>
+ </notification>
+ <notification name="LoginPacketNeverReceived">
+ Tenemos problemas de conexión. Puede deberse a un problema de tu conexión a Internet o de [SECOND_LIFE_GRID].
+
+Puedes revisar tu conexión a Internet y volver a intentarlo en unos minutos, pulsar Ayuda para conectarte a [SUPPORT_SITE], o pulsar Teleporte para intentar teleportarte a tu Base.
+ <url name="url">
+ http://es.secondlife.com/support/
+ </url>
+ <form name="form">
+ <button name="OK" text="OK"/>
+ <button name="Help" text="Ayuda"/>
+ <button name="Teleport" text="Teleportar"/>
+ </form>
+ </notification>
+ <notification name="WelcomeChooseSex">
+ Tu personaje aparecerá en un momento.
+
+Para caminar, usa las teclas del cursor.
+En cualquier momento, puedes pulsar la tecla F1 para conseguir ayuda o para aprender más acerca de [SECOND_LIFE].
+Por favor, elige el avatar masculino o femenino.
+Puedes cambiar más adelante tu elección.
+ <usetemplate name="okcancelbuttons" notext="Mujer" yestext="Varón"/>
+ </notification>
+ <notification name="CantTeleportToGrid">
+ No se puede hacer el teleporte a [SLURL] porque se encuentra en una cuadrÃcula ([GRID]) diferente de la actual ([CURRENT_GRID]). Cierra el visor y vuelve a intentarlo.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GeneralCertificateError">
+ No se puede establecer la conexión con el servidor.
+[REASON]
+
+Nombre del asunto: [SUBJECT_NAME_STRING]
+Nombre del emisor: [ISSUER_NAME_STRING]
+Válido desde: [VALID_FROM]
+Válido hasta: [VALID_TO]
+Huella digital MD5: [SHA1_DIGEST]
+Huella digital SHA1: [MD5_DIGEST]
+Uso de la clave: [KEYUSAGE]
+Uso de clave extendida: [EXTENDEDKEYUSAGE]
+Identificador de clave de asunto: [SUBJECTKEYIDENTIFIER]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TrustCertificateError">
+ La autoridad de certificación de este servidor se desconoce.
+
+Información del certificado:
+Nombre del asunto: [SUBJECT_NAME_STRING]
+Nombre del emisor: [ISSUER_NAME_STRING]
+Válido desde: [VALID_FROM]
+Válido hasta: [VALID_TO]
+Huella digital MD5: [SHA1_DIGEST]
+Huella digital SHA1: [MD5_DIGEST]
+Uso de la clave: [KEYUSAGE]
+Uso de clave extendida: [EXTENDEDKEYUSAGE]
+Identificador de clave de asunto: [SUBJECTKEYIDENTIFIER]
+
+¿Deseas confiar en esta autoridad?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Confiar"/>
+ </notification>
+ <notification name="NotEnoughCurrency">
+ [NAME] cuesta [PRICE] L$. No tienes suficientes L$ para hacer eso.
+ </notification>
+ <notification name="GrantedModifyRights">
+ [NAME] te ha dado permiso para modificar sus objetos.
+ </notification>
+ <notification name="RevokedModifyRights">
+ Ha sido revocado tu privilegio de modificar los objetos de [NAME]
+ </notification>
+ <notification name="FlushMapVisibilityCaches">
+ Esto limpiará las cachés del mapa en esta región.
+Esto sólo es realmente útil para cuestiones de depuración ('debugging').
+(A efectos prácticos, espera 5 minutos, y el mapa de cualquiera se actualizará después de que reinicies sesión).
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="BuyOneObjectOnly">
+ No se puede comprar más de un objeto a la vez. Por favor, selecciona sólo un objeto y vuelve a intentarlo.
+ </notification>
+ <notification name="OnlyCopyContentsOfSingleItem">
+ No se puede copiar a la vez los contenidos de más de un objeto.
+Por favor, selecciona sólo uno y vuelve a intentarlo.
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="KickUsersFromRegion">
+ ¿Teleportar a tu base a todos los residentes en esta región?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="EstateObjectReturn">
+ ¿Estás seguro de que quieres devolver los objetos propiedad de
+[USER_NAME] ?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="InvalidTerrainBitDepth">
+ No se han podido configurar las texturas de la región:
+La textura del terreno [TEXTURE_NUM] tiene una profundidad de bites inválida: [TEXTURE_BIT_DEPTH].
+
+Cambia la textura [TEXTURE_NUM] por una imagen de 24-bit y 512x512 o menor, y pulsa de nuevo 'Aplicar' .
+ </notification>
+ <notification name="InvalidTerrainSize">
+ No se han podido configurar las texturas de la región:
+La textura del terreno [TEXTURE_NUM] es demasiado grande: [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
+
+Cambia la textura [TEXTURE_NUM] por una imagen de 24-bit y 512x512 o menor, y pulsa de nuevo 'Aplicar' .
+ </notification>
+ <notification name="RawUploadStarted">
+ Ha empezado la subida. Dependiendo de la velocidad de tu conexión, llevará unos dos minutos.
+ </notification>
+ <notification name="ConfirmBakeTerrain">
+ ¿Realmente quieres predeterminar el terreno actual, haciéndolo el centro de los limites para elevarlo y rebajarlo, y el terreno por defecto para la herramienta 'Revertir'?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="MaxAllowedAgentOnRegion">
+ Sólo puedes tener [MAX_AGENTS] residentes autorizados.
+ </notification>
+ <notification name="MaxBannedAgentsOnRegion">
+ Sólo puedes tener [MAX_BANNED] residentes no admitidos.
+ </notification>
+ <notification name="MaxAgentOnRegionBatch">
+ Fallo al intentar añadir [NUM_ADDED] agentes:
+Se superan en [NUM_EXCESS] los [MAX_AGENTS] permitidos en [LIST_TYPE].
+ </notification>
+ <notification name="MaxAllowedGroupsOnRegion">
+ Sólo puedes tener [MAX_GROUPS] grupos permitidos.
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Predeterminar"/>
+ </notification>
+ <notification name="MaxManagersOnRegion">
+ Sólo puedes tener [MAX_MANAGER] administradores del estado.
+ </notification>
+ <notification name="OwnerCanNotBeDenied">
+ No se puede añadir a la lista de residentes no admitidos al propietario del estado.
+ </notification>
+ <notification name="CanNotChangeAppearanceUntilLoaded">
+ No puedes cambiar la apariencia hasta que no se carguen la ropa y la forma.
+ </notification>
+ <notification name="ClassifiedMustBeAlphanumeric">
+ El nombre de tu anuncio clasificado debe empezar o con un número o con una letra de la A a la Z. No se permiten signos de puntuación.
+ </notification>
+ <notification name="CantSetBuyObject">
+ No puede configurar el Comprar el objeto, porque éste no está en venta.
+Por favor, pon en venta el objeto y vuelve a intentarlo.
+ </notification>
+ <notification name="FinishedRawDownload">
+ Acabada la descarga del archivo raw de terreno en:
+[DOWNLOAD_PATH].
+ </notification>
+ <notification name="DownloadWindowsMandatory">
+ Hay una versión nueva de [SECOND_LIFE] disponible.
+[MESSAGE]
+Debes descargar esta actualización para usar [SECOND_LIFE].
+ <usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargarla"/>
+ </notification>
+ <notification name="DownloadWindows">
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
+ </notification>
+ <notification name="DownloadWindowsReleaseForDownload">
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
+ </notification>
+ <notification name="DownloadLinuxMandatory">
+ Hay una versión nueva de [SECOND_LIFE] disponible.
+[MESSAGE]
+Debes descargar esta actualización para usar [SECOND_LIFE].
+ <usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargar"/>
+ </notification>
+ <notification name="DownloadLinux">
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargar"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargar"/>
+ </notification>
+ <notification name="DownloadMacMandatory">
+ Hay una versión nueva de [SECOND_LIFE] disponible.
+[MESSAGE]
+Debes descargar esta actualización para usar [SECOND_LIFE].
+
+¿Descargarla a tu carpeta de Programas?
+ <usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargarla"/>
+ </notification>
+ <notification name="DownloadMac">
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+
+¿Descargarla a tu carpeta de Programas?
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
+ </notification>
+ <notification name="DownloadMacReleaseForDownload">
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+
+¿Descargarla a tu carpeta de Programas?
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
+ </notification>
+ <notification name="FailedUpdateInstall">
+ Se ha producido un error al instalar la actualización del visor.
+Descarga e instala el último visor a través de
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ No hemos podido instalar una actualización necesaria.
+No podrás iniciar sesión hasta que [APP_NAME] se haya actualizado.
+
+Descarga e instala el último visor a través de
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="Salir"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ Hay una actualización necesaria para la instalación de Second Life.
+
+Puedes descargar esta actualización de http://www.secondlife.com/downloads
+o instalarla ahora.
+ <usetemplate name="okcancelbuttons" notext="Salir de Second Life" yestext="Descargar e instalar ahora"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ Hemos descargado una actualización para la instalación de [APP_NAME].
+Versión [VERSION] [[RELEASE_NOTES_FULL_URL]; información acerca de esta actualización]
+ <usetemplate name="okcancelbuttons" notext="Más tarde..." yestext="Instalar ahora y reiniciar [NOMBRE_APL]"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ Hemos descargado una actualización para la instalación de [APP_NAME].
+Versión [VERSION] [[RELEASE_NOTES_FULL_URL]; información acerca de esta actualización]
+ <usetemplate name="okcancelbuttons" notext="Más tarde..." yestext="Instalar ahora y reiniciar [APP_NAME]"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ Hemos descargado una actualización de software necesaria.
+Versión [VERSION]
+
+Debemos reiniciar [APP_NAME] para instalar la actualización.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ Debemos reiniciar [APP_NAME] para instalar la actualización.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="DeedObjectToGroup">
+ Transferir este objeto al grupo hará que:
+* Reciba los L$ pagados en el objeto
+ <usetemplate ignoretext="Confirmar antes de transferir un objeto al grupo" name="okcancelignore" notext="Cancelar" yestext="Transferir"/>
+ </notification>
+ <notification name="WebLaunchExternalTarget">
+ ¿Quieres abrir tu navegador para ver este contenido?
+ <usetemplate ignoretext="Abrir mi navegador para ver una página web" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchJoinNow">
+ ¿Ir al [http://secondlife.com/account/ Panel de Control] para administrar tu cuenta?
+ <usetemplate ignoretext="Abrir mi navegador para administrar mi cuenta" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchSecurityIssues">
+ Visita el wiki de [SECOND_LIFE] para más detalles sobre cómo informar de una cuestión de seguridad.
+ <usetemplate ignoretext="Abrir mi navegador para informar de un fallo de seguridad" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchQAWiki">
+ Visita el wiki QA de [SECOND_LIFE].
+ <usetemplate ignoretext="Abrir mi navegador para el ver el wiki de 'QA' (Control de Calidad)" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchPublicIssue">
+ Visita el Public Issue Tracker (sistema público de seguimiento de incidencias) de [SECOND_LIFE], donde podrás informar de errores y otros asuntos.
+ <usetemplate ignoretext="Abrir mi navegador para usar el 'Public Issue Tracker'" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
+ </notification>
+ <notification name="WebLaunchSupportWiki">
+ Para ver las últimas noticias e informaciones, ¿ir la Blog oficial?
+ <usetemplate ignoretext="Abrir mi navegador para ver el blog" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchLSLGuide">
+ ¿Quieres abrir la GuÃa de Script para tener ayuda sobre el tema?
+ <usetemplate ignoretext="Abrir mi navegador para ver la GuÃa de Script" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchLSLWiki">
+ ¿Quieres visitar el portal de LSL para tener ayuda sobre manejo de scripts?
+ <usetemplate ignoretext="Abrir mi navegador para ver el portal de LSL" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
+ </notification>
+ <notification name="ReturnToOwner">
+ ¿Estás seguro de que quieres devolver los objetos seleccionados a sus propietarios? Los objetos transferibles que se hayan cedido volverán a sus propietarios anteriores.
+
+*ATENCIÓN* ¡Serán borrados los objetos no transferibles que estén cedidos!
+ <usetemplate ignoretext="Confirmar antes de devolver objetos a sus propietarios." name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="GroupLeaveConfirmMember">
+ Actualmente, eres miembro del grupo [GROUP].
+¿Dejar el grupo?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmKick">
+ ¿Quieres realmente expulsar a todos los residentes de la cuadrÃcula?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar a todos los Residentes"/>
+ </notification>
+ <notification name="MuteLinden">
+ Lo sentimos, pero no puedes ignorar a un Linden.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CannotStartAuctionAlreadyForSale">
+ No puedes empezar una subasta en una parcela que ya está en venta. Desactiva la venta de terreno si estás seguro de querer iniciar una subasta.
+ </notification>
+ <notification label="Falló ignorar el objeto según su nombre." name="MuteByNameFailed">
+ Ya has ignorado este nombre.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RemoveItemWarn">
+ Aunque esté permitido, borrar contenidos puede dañar el objeto.
+¿Quieres borrar ese Ãtem?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="CantOfferCallingCard">
+ En este momento, no se puede ofrecer una tarjeta de visita. Por favor, vuelve a intentarlo en un momento.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CantOfferFriendship">
+ En este momento, no se puede ofrecer el ser amigo. Por favor, vuelve a intentarlo en un momento.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="BusyModeSet">
+ Pasar al modo ocupado.
+Se ocultará el chat y los mensajes instantáneos (éstos recibirán tu Respuesta en el modo ocupado). Se rehusarán todos los ofrecimientos de teleporte. Todas las ofertas de inventario irán a tu Papelera.
+ <usetemplate ignoretext="Cambio mi estado al modo ocupado" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="JoinedTooManyGroupsMember">
+ Has superado tu número máximo de grupos. Por favor, sal de al menos uno antes de entrar en éste, o rehúsa la oferta.
+[NAME] te ha invitado a ser miembro de un grupo.
+ <usetemplate name="okcancelbuttons" notext="Rehusar" yestext="Entrar"/>
+ </notification>
+ <notification name="JoinedTooManyGroups">
+ Has superado tu número máximo de grupos. Por favor, sal de al menos uno de ellos antes de crear uno nuevo o entrar en alguno.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="KickUser">
+ ¿Con qué mensaje quieres expulsar a este Residente?
+ <form name="form">
+ <input name="message">
+ Un administrador te ha desconectado.
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="KickAllUsers">
+ ¿Con qué mensaje se expulsará a cualquiera que esté actualmente en el grid?
+ <form name="form">
+ <input name="message">
+ Un administrador te ha desconectado.
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="FreezeUser">
+ ¿Con qué mensaje quieres congelar a este residente?
+ <form name="form">
+ <input name="message">
+ Has sido congelado. No puedes moverte o escribir en el chat. Un administrador se pondrá en contacto contigo a través de un mensaje instantáneo (MI).
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="UnFreezeUser">
+ ¿Con qué mensaje quieres congelar a este residente?
+ <form name="form">
+ <input name="message">
+ Ya no estás congelado.
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="SetDisplayNameSuccess">
+ ¡Hola, [DISPLAY_NAME]!
+
+Al igual que en la vida real, normalmente se tarda algún tiempo en aprender nombres nuevos. Te recomendamos que esperes varios dÃas antes de [http://wiki.secondlife.com/wiki/Setting_your_display_name your name to update] en objetos, scripts, búsquedas, etc.
+ </notification>
+ <notification name="SetDisplayNameBlocked">
+ Lo sentimos. No puedes cambiar tu nombre mostrado. Si crees que se trata de un error, ponte en contacto con soporte.
+ </notification>
+ <notification name="SetDisplayNameFailedLength">
+ Lo sentimos. El nombre es demasiado largo. Los nombres mostrados pueden tener un máximo de [LENGTH] caracteres.
+
+Prueba con un nombre más corto.
+ </notification>
+ <notification name="SetDisplayNameFailedGeneric">
+ Lo sentimos. No hemos podido configurar tu nombre mostrado. Vuelve a intentarlo más tarde.
+ </notification>
+ <notification name="SetDisplayNameMismatch">
+ Los nombres mostrados introducidos no coinciden. Vuelve a introducirlos.
+ </notification>
+ <notification name="AgentDisplayNameUpdateThresholdExceeded">
+ Lo sentimos. Tendrás que esperar para poder cambiar tu nombre mostrado.
+
+Consulta http://wiki.secondlife.com/wiki/Setting_your_display_name
+
+Vuelve a intentarlo más tarde.
+ </notification>
+ <notification name="AgentDisplayNameSetBlocked">
+ Lo sentimos. No he mos podido configurar el nombre que has solicitado porque contiene una palabra prohibida.
+
+ Prueba con un nombre distinto.
+ </notification>
+ <notification name="AgentDisplayNameSetInvalidUnicode">
+ El nombre mostrado que deseas configurar contiene caracteres no válidos.
+ </notification>
+ <notification name="AgentDisplayNameSetOnlyPunctuation">
+ Tu nombre mostrado debe contener letras y no debe incluir signos de puntuación.
+ </notification>
+ <notification name="DisplayNameUpdate">
+ A [OLD_NAME] ([SLID]) se le conoce ahora como [NEW_NAME].
+ </notification>
+ <notification name="OfferTeleport">
+ ¿Ofrecer teleporte a tu posición con este mensaje?
+ <form name="form">
+ <input name="message">
+ Ven conmigo a [REGION]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="OfferTeleportFromGod">
+ ¿Obligar a este Residente a ir a tu localización?
+ <form name="form">
+ <input name="message">
+ Ven conmigo a [REGION]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="TeleportFromLandmark">
+ ¿Seguro que quieres teleportarte a <nolink>[LOCATION]</nolink>?
+ <usetemplate ignoretext="Confirmar que quiero teleportarme a un hito" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
+ </notification>
+ <notification name="TeleportToPick">
+ ¿Teleportarte a [PICK]?
+ <usetemplate ignoretext="Confirmar el teleporte a una localización de los Destacados" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ ¿Teleportarte a [CLASSIFIED]?
+ <usetemplate ignoretext="Confirmar el teleporte a una localización de los Clasificados" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
+ </notification>
+ <notification name="TeleportToHistoryEntry">
+ ¿Teleportarse a [HISTORY_ENTRY]?
+ <usetemplate ignoretext="Confirmar que quiero teleportarme a una localización del historial" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
+ </notification>
+ <notification label="Mensaje a todo el estado" name="MessageEstate">
+ Escribe un anuncio breve que se enviará a todo el que esté en tu estado.
+ <form name="form">
+ <input name="message"/>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification label="Cambiar un estado Linden" name="ChangeLindenEstate">
+ Estás a punto de cambiar un estado propiedad de Linden (continente, teen grid, orientación, etc.).
+
+Esto es EXTREMADAMENTE PELIGROSO porque puede afectar en gran manera la experiencia de los Residentes. En el Continente, cambiará miles de regiones y y se provocará un colapso en el espacio del servidor.
+
+¿Continuar?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification label="Cambiar el acceso a un estado Linden" name="ChangeLindenAccess">
+ Vas a cambiar la lista de acceso de un estado propiedad de Linden (mainland, grid teen, orientación, etc.).
+
+Esto es PELIGROSO, y sólo debe hacerse para deshacerse de ataques que permitan sacar o meter en el grid objetos o L$.
+Se cambiarán miles de regiones, y se provocará un colapso en el espacio del servidor.
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification label="Seleccionar el estado" name="EstateAllowedAgentAdd">
+ ¿Añadir a la lista de permitidos sólo para este estado o para [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Seleccionar el estado" name="EstateAllowedAgentRemove">
+ ¿Quitar de la lista de permitidos sólo para este estado o para [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Seleccionar el estado" name="EstateAllowedGroupAdd">
+ ¿Añadir a la lista de grupos permitidos sólo para este estado o para [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Seleccionar el estado" name="EstateAllowedGroupRemove">
+ ¿Quitar de la lista de grupos permitidos sólo para este estado o para [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Seleccionar el estado" name="EstateBannedAgentAdd">
+ ¿Denegar el acceso sólo a este estado o a [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Seleccionar el estado" name="EstateBannedAgentRemove">
+ ¿Quitar de la lista de prohibición de acceso a este residente para que acceda sólo a este estado o a [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Seleccionar el estado" name="EstateManagerAdd">
+ ¿Añadir al administrador del estado sólo para este estado o para [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Seleccionar el estado" name="EstateManagerRemove">
+ ¿Remover al administrador del estado sólo para este estado o para [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Confirmar la expulsión" name="EstateKickUser">
+ ¿Echar a [EVIL_USER] de este estado?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="EstateChangeCovenant">
+ ¿Estás seguro de que quieres cambiar el contrato del estado?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked">
+ No estás autorizado en esa región por su nivel de calificación. Puede deberse a que no hay información validada de tu edad.
+
+Por favor, comprueba que tienes instalado el último visor, y dirÃgete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_KB">
+ No estás autorizado en esa región por su nivel de calificación.
+
+¿Quieres ir a la Base de Conocimientos para aprender más sobre el nivel de calificación?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
+ </url>
+ <usetemplate ignoretext="No puedo entrar a esta región dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Notify">
+ No estás autorizado en esa región por su nivel de calificación.
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Change">
+ No estás autorizado en esta región por tus preferencias sobre el nivel de calificación.
+
+Para entrar en la región que deseas, cambia tu preferencia de nivel de calificación. Esto te permitirá buscar contenidos [REGIONMATURITY] y tener acceso a ellos. Para deshacer los cambios, elige Yo > Preferencias > General.
+ <form name="form">
+ <button name="OK" text="Cambiar las preferencias"/>
+ <button default="true" name="Cancel" text="Cerrar"/>
+ <ignore name="ignore" text="Mis preferencias sobre nivel de calificación me impiden entrar a esta región"/>
+ </form>
+ </notification>
+ <notification name="PreferredMaturityChanged">
+ Tu preferencia de nivel de calificación actual es [RATING].
+ </notification>
+ <notification name="LandClaimAccessBlocked">
+ No puedes reclamar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de tu edad.
+
+Por favor, comprueba que tienes instalado el último visor, y dirÃgete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_KB">
+ No puedes reclamar este terreno por su nivel de calificación.
+
+¿Quieres ir a la Base de Conocimientos para más información sobre el nivel de calificación?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
+ </url>
+ <usetemplate ignoretext="No puedo reclamar este terreno dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_Notify">
+ No puedes reclamar este terreno debido a su nivel de calificación.
+ </notification>
+ <notification name="LandClaimAccessBlocked_Change">
+ No puedes reclamar este terreno por tus preferencias sobre el nivel de calificación.
+
+Puedes pulsar 'Cambiar las Preferencias' para incrementar las preferencias del nivel de calificación y, asÃ, poder entrar. En adelante, podrás buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quieres deshacer este cambio, ve a Yo > Preferencias > General.
+ <usetemplate ignoretext="Mis preferencias sobre el nivel de calificación me impiden reclamar este terreno" name="okcancelignore" notext="Cerrar" yestext="Cambiar preferencia"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked">
+ No puedes comprar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de tu edad.
+
+Por favor, comprueba que tienes instalado el último visor, y dirÃgete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_KB">
+ No puedes comprar este terreno por tus preferencias de nivel de calificación.
+
+¿Quieres ir a la Base de Conocimientos para más información sobre el nivel de calificación?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
+ </url>
+ <usetemplate ignoretext="No puedo comprar este terreno dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_Notify">
+ No puedes comprar este terreno por su nivel de calificación.
+ </notification>
+ <notification name="LandBuyAccessBlocked_Change">
+ No puedes comprar este terreno por tus preferencias sobre el nivel de calificación.
+
+Puedes pulsar 'Cambiar las Preferencias' para incrementar las preferencias del nivel de calificación y, asÃ, poder entrar. En adelante, podrás buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quieres deshacer este cambio, ve a Yo > Preferencias > General.
+ <usetemplate ignoretext="Mis preferencias sobre el nivel de calificación me impiden comprar el terreno" name="okcancelignore" notext="Cerrar" yestext="Cambiar preferencia"/>
+ </notification>
+ <notification name="TooManyPrimsSelected">
+ Hay demasiados prims seleccionados. Por favor, selecciona [MAX_PRIM_COUNT] o menos y vuelve a intentarlo
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ProblemImportingEstateCovenant">
+ Hay problemas al importar el contrato del estado.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ProblemAddingEstateManager">
+ Hay problemas al añadir un administrador nuevo del estado. Uno o más estados deben de tener llena la lista de administradores.
+ </notification>
+ <notification name="ProblemAddingEstateGeneric">
+ Hay problemas al añadir a la lista del estado. Uno o más estados deben de tener llena la lista.
+ </notification>
+ <notification name="UnableToLoadNotecardAsset">
+ En este momento, no se pueden cargar los datos de la's nota's.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NotAllowedToViewNotecard">
+ Permisos insuficientes para ver la nota asociada a la ID solicitada.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MissingNotecardAssetID">
+ Se ha perdido en la base de datos la ID de la nota.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PublishClassified">
+ Recuerda: las cuotas que se pagan por los clasificados no son reembolsables.
+
+¿Publicar ahora este anuncio por [AMOUNT] L$?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="SetClassifiedMature">
+ ¿Este anuncio tiene contenido moderado?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="SetGroupMature">
+ ¿Este grupo tiene contenido moderado?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification label="Confirmar el reinicio" name="ConfirmRestart">
+ ¿Verdaderamente quieres reiniciar la región de aquà a 2 minutos?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification label="Mensaje a toda la región" name="MessageRegion">
+ Escribe un anuncio breve que se enviará a todo el que esté en esta región.
+ <form name="form">
+ <input name="message"/>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification label="Cambiada la calificación de la región" name="RegionMaturityChange">
+ Se ha actualizado el nivel de calificación de esta región.
+Puede que lleve algún tiempo hasta que el cambio se vea reflejado en el mapa.
+
+Para entrar a regiones Adultas, los Residentes deben haber verificado su cuenta, bien verificando la edad o bien verificando una forma de pago.
+ </notification>
+ <notification label="Desajuste en la versión de voz" name="VoiceVersionMismatch">
+ Esta versión de [APP_NAME] no es compatible con la prestación de voz de esta región. Para que el chat de voz funcione correctamente debes actualizar [APP_NAME].
+ </notification>
+ <notification label="No se pudo comprar los objetos" name="BuyObjectOneOwner">
+ No se pueden comprar a la vez objetos de propietarios diferentes.
+Por favor, selecciona sólo un objeto y vuelve a intentarlo.
+ </notification>
+ <notification label="No se pudo comprar el contenido" name="BuyContentsOneOnly">
+ No se puede comprar a la vez los contenidos de más de un objeto.
+Por favor, selecciona sólo un objeto y vuelve a intentarlo.
+ </notification>
+ <notification label="No se pudo comprar el contenido" name="BuyContentsOneOwner">
+ No se pueden comprar a la vez objetos de propietarios diferentes.
+Por favor, selecciona sólo un objeto y vuelve a intentarlo.
+ </notification>
+ <notification name="BuyOriginal">
+ ¿Comprar el objeto original de [OWNER] por [PRICE] L$?
+Pasarás a ser el propietario de este objeto.
+Podrás:
+ Modificarlo: [MODIFYPERM]
+ Copiarlo: [COPYPERM]
+ Revenderlo o darlo: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="BuyOriginalNoOwner">
+ ¿Comprar el objeto original por [PRICE] L$?
+Pasarás a ser el propietario de este objeto.
+Podrás:
+ Modificarlo: [MODIFYPERM]
+ Copiarlo: [COPYPERM]
+ Revenderlo o darlo: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="BuyCopy">
+ ¿Comprar una copia de [OWNER] por [PRICE] L$?
+El objeto se copiará a tu inventario.
+Podrás:
+ Modificarlo: [MODIFYPERM]
+ Copiarlo: [COPYPERM]
+ Revenderlo o darlo: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="BuyCopyNoOwner">
+ ¿Comprar una copia por [PRICE] L$?
+El objeto se copiará a tu inventario.
+Podrás:
+ Modificarlo: [MODIFYPERM]
+ Copiarlo: [COPYPERM]
+ Revenderlo o darlo: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="BuyContents">
+ ¿Comprar los contenidos de [OWNER] por [PRICE] L$?
+Serán copiados a tu inventario.
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="BuyContentsNoOwner">
+ ¿Comprar los contenidos por [PRICE] L$?
+Serán copiados a tu inventario.
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmPurchase">
+ Esta transacción consiste en:
+[ACTION]
+
+¿Estás seguro de querer hacer esta compra?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmPurchasePassword">
+ Esta transacción consiste en:
+[ACTION]
+
+¿Estás seguro de querer hacer esta compra?
+Por favor, vuelva a escribir tu contraseña y pulsa OK.
+ <form name="form">
+ <input name="message"/>
+ <button name="ConfirmPurchase" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="SetPickLocation">
+ Nota:
+Has actualizado la posición de este Destacado, pero los otros detalles permanecen con sus valores originales.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MoveInventoryFromObject">
+ Has elegido Ãtems 'no copiables' de tu inventario. Esos Ãtems se quitarán de tu inventario, no se copiarán.
+
+¿Mover el/los Ãtem/s del inventario?
+ <usetemplate ignoretext="Avisarme antes de que mueva Ãtems 'no copiables' desde un objeto" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="MoveInventoryFromScriptedObject">
+ Has elegido Ãtems 'no copiables' de tu inventario. Esos Ãtems se moverán a tu inventario, no se copiarán.
+Dado que estos objetos tienen scripts, moverlos a tu inventario puede provocar un mal funcionamiento del script.
+
+¿Mover el/los Ãtem/s del inventario?
+ <usetemplate ignoretext="Avisarme antes de que mueva Ãtems 'no copiables' que puedan estropear un objeto con script" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ClickActionNotPayable">
+ Advertencia: la acción 'Pagar al objeto' ha sido marcada, pero sólo funcionará si se añade un script con un evento money().
+ <form name="form">
+ <ignore name="ignore" text="He establecido la acción 'Pagar al objeto' cuando construyo uno sin un script money()"/>
+ </form>
+ </notification>
+ <notification name="OpenObjectCannotCopy">
+ En este objeto, no hay Ãtems que estés autorizado a copiar.
+ </notification>
+ <notification name="WebLaunchAccountHistory">
+ ¿Ir a tu [http://secondlife.com/account/ Panel de Control] para ver el historial de tu cuenta?
+ <usetemplate ignoretext="Abrir mi navegador para ver el historial de mi cuenta" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
+ </notification>
+ <notification name="ConfirmQuit">
+ ¿Estás seguro de que quieres salir?
+ <usetemplate ignoretext="Confirmar antes de salir" name="okcancelignore" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification name="DeleteItems">
+ [QUESTION]
+ <usetemplate ignoretext="Confirmar antes de eliminar elementos" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="HelpReportAbuseEmailLL">
+ Usa esta herramienta para denunciar violaciones de las [http://secondlife.com/corporate/tos.php Condiciones del Servicio] o las [http://secondlife.com/corporate/cs.php Normas de la Comunidad].
+
+Se investigan y resuelven todas las infracciones denunciadas.
+ </notification>
+ <notification name="HelpReportAbuseSelectCategory">
+ Por favor, elige una categorÃa para esta denuncia de infracción.
+Seleccionar una categorÃa nos ayuda a clasificar y procesar las denuncias de infracciones.
+ </notification>
+ <notification name="HelpReportAbuseAbuserNameEmpty">
+ Por favor, escribe el nombre del infractor.
+Aportar el dato preciso nos ayuda a clasificar y procesar las denuncias de infracciones.
+ </notification>
+ <notification name="HelpReportAbuseAbuserLocationEmpty">
+ Por favor, escribe la localización donde tuvo lugar la infracción.
+Aportar el dato preciso nos ayuda a clasificar y procesar las denuncias de infracciones.
+ </notification>
+ <notification name="HelpReportAbuseSummaryEmpty">
+ Por favor, escribe un resumen de la infracción que ha habido.
+Aportar un resumen preciso nos ayuda a clasificar y procesar las denuncias de infracciones.
+ </notification>
+ <notification name="HelpReportAbuseDetailsEmpty">
+ Por favor, escribe una descripción minuciosa de la infracción que ha habido.
+Sé tan especÃfico como puedas, incluyendo los nombres y los detalles implicados en el incidente que denuncias.
+Aportar una descripción precisa nos ayuda a clasificar y procesar las denuncias de infracciones.
+ </notification>
+ <notification name="HelpReportAbuseContainsCopyright">
+ Estimado Residente:
+
+Parece que estás denunciando una violación de la propiedad intelectual. Por favor, asegúrate de que tu denuncia es correcta.
+
+(1) El proceso de la denuncia. Debes enviar una denuncia de infracción si crees que un Residente está reventando el sistema de permisos de [SECOND_LIFE], usando, por ejemplo, un CopyBot u otras herramientas parecidas para copiar, infringiendo los derechos de propiedad intelectual. El Equipo de Infracciones ('Abuse Team') investiga y lleva a cabo las acciones disciplinarias apropiadas ante toda acción que viole las [http://secondlife.com/corporate/tos.php Condiciones de Servicio] o las [http://secondlife.com/corporate/cs.php Normas de la Comunidad] de [SECOND_LIFE]. Sin embargo, el Equipo de Infracciones ni gestiona ni responde a las solicitudes de eliminar contenidos del mundo de [SECOND_LIFE].
+
+(2) El DMCA o Proceso de Eliminación de Contenido. Para solicitar que se elimine algún contenido de [SECOND_LIFE], DEBES enviar una notificación válida de infracción tal y como se explica en nuestra [http://secondlife.com/corporate/dmca.php 'DMCA Policy'].
+
+Si todavÃa quieres seguir con el proceso de infracción, por favor, cierra esta ventana y acaba de enviar tu denuncia. En concreto, debes seleccionar la categorÃa 'CopyBot o Programa para saltarse los permisos'.
+
+Gracias,
+
+Linden Lab
+ </notification>
+ <notification name="FailedRequirementsCheck">
+ Han desaparecido de [FLOATER] estos componentes:
+[COMPONENTS]
+ </notification>
+ <notification label="Reemplazar el anexado actual" name="ReplaceAttachment">
+ En ese punto de tu cuerpo ya hay un objeto anexado. ¿Quieres reemplazarlo por el objeto que has elegido?
+ <form name="form">
+ <ignore name="ignore" save_option="true" text="Reemplazar un añadido actual con el Ãtem seleccionado"/>
+ <button ignore="Reemplazar automaticamente" name="Yes" text="OK"/>
+ <button ignore="Nunca reemplazar" name="No" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification label="¡Aviso! Modo Ocupado" name="BusyModePay">
+ Estás en el modo Ocupado. Por tanto, no recibirás ningún Ãtem a cambio de este pago.
+
+¿Quieres salir del modo Ocupado antes de completar esta transacción?
+ <form name="form">
+ <ignore name="ignore" save_option="true" text="Voy a pagar a una persona u objeto mientras estoy en el modo ocupado"/>
+ <button ignore="Siempre salir del modo Ocupado" name="Yes" text="OK"/>
+ <button ignore="Nunca salir del modo Ocupado" name="No" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ La carpeta '[FOLDERNAME]' pertenece al sistema, y borrar carpetas del sistema puede provocar inestabilidad. ¿Estás seguro de que quieres borrarla?
+ <usetemplate ignoretext="Confirmar antes de borrar una carpeta del sistema" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmEmptyTrash">
+ ¿Estás seguro de que quieres borrar de forma permanente el contenido de la Papelera?
+ <usetemplate ignoretext="Confirmar antes de vaciar la Papelera del inventario" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearBrowserCache">
+ ¿Estás seguro de que quieres borrar tu historial web, de viajes y de búsquedas?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearCookies">
+ ¿Estás seguro de que quieres limpiar tus cookies?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="SÃ"/>
+ </notification>
+ <notification name="ConfirmClearMediaUrlList">
+ ¿Estás seguro de que quieres vaciar tu lista de URL guardadas?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="SÃ"/>
+ </notification>
+ <notification name="ConfirmEmptyLostAndFound">
+ ¿Estás seguro de que quieres borrar de forma permanente el contenido de Objetos Perdidos?
+ <usetemplate ignoretext="Confirmar antes de vaciar la carpeta Objetos Perdidos" name="okcancelignore" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="CopySLURL">
+ Se ha copiado a tu portapapeles esta SLurl:
+ [SLURL]
+
+PublÃcala en una página web para que otros puedan acceder fácilmente a esta posición, o pruébala tú mismo pegándola en la barra de direcciones de tu navegador.
+ <form name="form">
+ <ignore name="ignore" text="La SLurl se ha copiado a mi portapapeles"/>
+ </form>
+ </notification>
+ <notification name="WLSavePresetAlert">
+ ¿Quieres sobrescribir la preselección guardada?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="WLDeletePresetAlert">
+ ¿Quieres borrar [SKY]?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="WLNoEditDefault">
+ No puedes editar ni borrar una preselección por defecto.
+ </notification>
+ <notification name="WLMissingSky">
+ Este archivo del ciclo de un dÃa se refiere a un archivo perdido de cielo: [SKY].
+ </notification>
+ <notification name="PPSaveEffectAlert">
+ Ya existe un efecto de procesamiento. ¿Quieres sobreescribirlo?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="NewSkyPreset">
+ Dame un nombre para el cielo nuevo.
+ <form name="form">
+ <input name="message">
+ Preselección nueva
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="ExistsSkyPresetAlert">
+ ¡Esa preselección ya existe!
+ </notification>
+ <notification name="NewWaterPreset">
+ Dame un nombre para la nueva preselección de agua.
+ <form name="form">
+ <input name="message">
+ Preselección nueva
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="ExistsWaterPresetAlert">
+ ¡Esa preselección ya existe!
+ </notification>
+ <notification name="WaterNoEditDefault">
+ No puedes editar o borrar una preselección por defecto.
+ </notification>
+ <notification name="ChatterBoxSessionStartError">
+ No se puede empezar una nueva sesión de chat con [RECIPIENT].
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ChatterBoxSessionEventError">
+ [EVENT]
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ForceCloseChatterBoxSession">
+ Debe cerrarse tu sesión de chat con [NAME].
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="Cannot_Purchase_an_Attachment">
+ No puedes comprar un objeto mientras esté anexado.
+ </notification>
+ <notification label="Acerca de las solicitudes de autorización de débito" name="DebitPermissionDetails">
+ Al admitir esta petición, le das permiso a un script para que coja dólares Linden (L$) de tu cuenta. Para revocar este permiso, el propietario del objeto debe eliminarlo o reiniciar ese script del objeto.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AutoWearNewClothing">
+ ¿Quieres ponerte automáticamente la ropa que vas a crear?
+ <usetemplate ignoretext="Ponerme la ropa que estoy creando mientras modifico mi apariencia" name="okcancelignore" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="NotAgeVerified">
+ Debes haber verificado tu edad para visitar este sitio. ¿Quieres ir al sitio web de [SECOND_LIFE] y verificarla?
+
+[_URL]
+ <url name="url" option="0">
+ https://secondlife.com/account/verification.php?lang=es
+ </url>
+ <usetemplate ignoretext="No he verificado mi edad" name="okcancelignore" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="Cannot enter parcel: no payment info on file">
+ Para visitar este sitio debes haber aportado información de pago en tu cuenta. ¿Quieres ir al sitio web de [SECOND_LIFE] y configurar esto?
+
+[_URL]
+ <url name="url" option="0">
+ https://secondlife.com/account/index.php?lang=es
+ </url>
+ <usetemplate ignoretext="No he registrado información de pago" name="okcancelignore" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="MissingString">
+ La cadena [STRING_NAME] Ha desaparecido de strings.xml
+ </notification>
+ <notification name="SystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="Cancelled">
+ Cancelado
+ </notification>
+ <notification name="CancelledSit">
+ Cancelado el sentarte
+ </notification>
+ <notification name="CancelledAttach">
+ Cancelado el anexar
+ </notification>
+ <notification name="ReplacedMissingWearable">
+ Reemplazadas las ropas o partes del cuerpo perdidas con sus equivalentes por defecto.
+ </notification>
+ <notification name="GroupNotice">
+ Asunto: [SUBJECT], Mensaje: [MESSAGE]
+ </notification>
+ <notification name="FriendOnline">
+ [NAME] está conectado
+ </notification>
+ <notification name="FriendOffline">
+ [NAME] está desconectado
+ </notification>
+ <notification name="AddSelfFriend">
+ Aunque eres muy agradable, no puedes añadirte como amigo a ti mismo.
+ </notification>
+ <notification name="UploadingAuctionSnapshot">
+ Subiendo fotos del mundo y del sitio web...
+(tardará unos 5 minutos).
+ </notification>
+ <notification name="UploadPayment">
+ Has pagado [AMOUNT] LS por la subida.
+ </notification>
+ <notification name="UploadWebSnapshotDone">
+ Completada la subida de la foto del sitio web.
+ </notification>
+ <notification name="UploadSnapshotDone">
+ Completada la subida de la foto del mundo.
+ </notification>
+ <notification name="TerrainDownloaded">
+ Se ha descargado Terrain.raw
+ </notification>
+ <notification name="GestureMissing">
+ No se encuentra en la base de datos el gesto [NAME].
+ </notification>
+ <notification name="UnableToLoadGesture">
+ No se puede cargar el gesto [NAME].
+ </notification>
+ <notification name="LandmarkMissing">
+ El hito ha desaparecido de la base de datos.
+ </notification>
+ <notification name="UnableToLoadLandmark">
+ No se ha podido cargar el hito. Por favor, vuelve a intentarlo.
+ </notification>
+ <notification name="CapsKeyOn">
+ Tienes pulsada la tecla de mayúsculas.
+Esto puede influir en tu contraseña.
+ </notification>
+ <notification name="NotecardMissing">
+ La nota ha desaparecido de la base de datos.
+ </notification>
+ <notification name="NotecardNoPermissions">
+ No tienes permiso para ver esta nota.
+ </notification>
+ <notification name="RezItemNoPermissions">
+ No tienes permisos suficientes para renderizar el objeto.
+ </notification>
+ <notification name="UnableToLoadNotecard">
+ En este momento no se puede cargar la nota.
+ </notification>
+ <notification name="ScriptMissing">
+ El script ha desaparecido de la base de datos.
+ </notification>
+ <notification name="ScriptNoPermissions">
+ No tienes permisos suficientes para ver el script.
+ </notification>
+ <notification name="UnableToLoadScript">
+ No se ha podido cargar el script. Por favor, vuelve a intentarlo.
+ </notification>
+ <notification name="IncompleteInventory">
+ Los contenidos que estás ofreciendo aún no están disponibles. Por favor, vuelve a ofrecerlos en un minuto.
+ </notification>
+ <notification name="CannotModifyProtectedCategories">
+ No puedes modificar categorÃas que están protegidas.
+ </notification>
+ <notification name="CannotRemoveProtectedCategories">
+ No puedes quitar categorÃas que están protegidas.
+ </notification>
+ <notification name="UnableToBuyWhileDownloading">
+ No se puede comprar un objeto mientras se descargan los datos.
+Por favor, vuelve a intentarlo.
+ </notification>
+ <notification name="UnableToLinkWhileDownloading">
+ No se puede enlazar un objeto mientras se descargan los datos.
+Por favor, vuelve a intentarlo.
+ </notification>
+ <notification name="CannotBuyObjectsFromDifferentOwners">
+ No puedes comprar más de un objeto a la vez.
+Por favor, selecciona un sólo objeto.
+ </notification>
+ <notification name="ObjectNotForSale">
+ Este objeto no está en venta.
+ </notification>
+ <notification name="EnteringGodMode">
+ Entrando en el modo administrativo, nivel [LEVEL]
+ </notification>
+ <notification name="LeavingGodMode">
+ Saliendo del modo administrativo, nivel [LEVEL]
+ </notification>
+ <notification name="CopyFailed">
+ No tienes pemiso para copiar esto.
+ </notification>
+ <notification name="InventoryAccepted">
+ [NAME] ha recibido tu oferta de inventario.
+ </notification>
+ <notification name="InventoryDeclined">
+ [NAME] ha rehusado tu oferta del inventario.
+ </notification>
+ <notification name="ObjectMessage">
+ [NAME]: [MESSAGE]
+ </notification>
+ <notification name="CallingCardAccepted">
+ Se ha aceptado tu tarjeta de visita.
+ </notification>
+ <notification name="CallingCardDeclined">
+ Se ha rehusado tu tarjeta de visita.
+ </notification>
+ <notification name="TeleportToLandmark">
+ Puedes teleportarte a lugares como '[NAME]' abriendo el panel Lugares -a la derecha de tu pantalla- y seleccionando la sección Hitos.
+Pulsa en un hito para seleccionarlo, y, luego, pulsa 'Teleportar' en la parte inferior del panel.
+(También puedes pulsar dos veces en el hito o pulsarlo con el botón derecho del ratón y elegir 'Teleportar'.)
+ </notification>
+ <notification name="TeleportToPerson">
+ Puedes contactar con un Residente como '[NAME]' abriendo el panel Gente en el lado derecho de tu pantalla.
+Elige al Residente de la lista y pulsa 'MI' en la parte inferior del panel.
+(También puedes pulsar dos veces en su nombre o pulsarlo con el botón derecho y elegir 'MI').
+ </notification>
+ <notification name="CantSelectLandFromMultipleRegions">
+ No puedes seleccionar un terreno que cruce las fronteras entre servidores.
+Inténtalo seleccionando un trozo más pequeño de terreno.
+ </notification>
+ <notification name="SearchWordBanned">
+ Se han excluido algunos términos de tu búsqueda debido a restricciones en el contenido, según se especifica en las Normas de la Comunidad.
+ </notification>
+ <notification name="NoContentToSearch">
+ Por favor, elige al menos un tipo de contenido a buscar (General, Moderado o Adulto;).
+ </notification>
+ <notification name="SystemMessage">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentReceived">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentSent">
+ [MESSAGE]
+ </notification>
+ <notification name="EventNotification">
+ Notificación de un evento:
+
+[NAME]
+[DATE]
+ <form name="form">
+ <button name="Details" text="Detalles"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="TransferObjectsHighlighted">
+ En estos momentos, están realzados todos los objetos de esta parcela que serán transferidos al comprador de la misma.
+
+* No están realzados los árboles y hierbas que se transferirán.
+ <form name="form">
+ <button name="Done" text="Hecho"/>
+ </form>
+ </notification>
+ <notification name="DeactivatedGesturesTrigger">
+ Desactivados los gestos que tienen el mismo botón:
+[NAMES]
+ </notification>
+ <notification name="NoQuickTime">
+ No parece que tu sistema tenga instalado el software QuickTime de Apple.
+Si quieres ver media en streaming en las parcelas que los tienen, deberÃas ir al [http://www.apple.com/quicktime sitio de QuickTime] e intalar el QuickTime Player.
+ </notification>
+ <notification name="NoPlugin">
+ No se ha encontrado el 'Media Plugin' para manejar el 'mime type' "[MIME_TYPE]". Los media de este tipo no estarán disponibles.
+ </notification>
+ <notification name="MediaPluginFailed">
+ Fallo de este 'Media Plugin':
+ [PLUGIN]
+
+Por favor, reinstala el plugin o contacta con el vendedor si sigues teniendo problemas.
+ <form name="form">
+ <ignore name="ignore" text="Fallo al ejecutar un 'Media Plugin'"/>
+ </form>
+ </notification>
+ <notification name="OwnedObjectsReturned">
+ Se han devuelto a tu inventario los objetos de los que eras propietario en la parcela seleccionada.
+ </notification>
+ <notification name="OtherObjectsReturned">
+ Se han devuelto a su inventario los objetos en la parcela de terreno seleccionada propiedad de [NAME].
+ </notification>
+ <notification name="OtherObjectsReturned2">
+ Se han devuelto a su propietario los objetos seleccionados en la parcela de terreno propiedad de '[NAME]'.
+ </notification>
+ <notification name="GroupObjectsReturned">
+ Se han devuelto a los inventarios de sus propietarios los objetos que estaban compartidos con el grupo [GROUPNAME] en la parcela seleccionada.
+Los objetos transferibles que se transfirieron al grupo se han devuelto a sus propietarios anteriores.
+Los objetos no transferibles que se transfirieron al grupo han sido borrados.
+ </notification>
+ <notification name="UnOwnedObjectsReturned">
+ Se han devuelto a sus propietarios los objetos de los que NO eras propietario en la parcela seleccionada.
+ </notification>
+ <notification name="ServerObjectMessage">
+ Mensaje de [NAME]:
+<nolink>[MSG]</nolink>
+ </notification>
+ <notification name="NotSafe">
+ Este terreno tiene el daño activado.
+Aquà puedes ser herido. Si mueres, se te teleportará a tu Base.
+ </notification>
+ <notification name="NoFly">
+ Este terreno tiene desactivado el poder volar.
+Aquà no puedes volar.
+ </notification>
+ <notification name="PushRestricted">
+ Este terreno no autoriza el poder empujar. No puedes hacerlo a menos que seas el propetario del terreno.
+ </notification>
+ <notification name="NoVoice">
+ Este tereno tiene desactivado el chat de voz. No podrás oÃr hablar a nadie.
+ </notification>
+ <notification name="NoBuild">
+ Este terreno tiene desactivado el poder construir. Aquà no puedes ni construir ni crear objetos.
+ </notification>
+ <notification name="ScriptsStopped">
+ Un administrador ha detenido temporalmente los scripts en esta región.
+ </notification>
+ <notification name="ScriptsNotRunning">
+ En esta región no se está ejecutando ningún script.
+ </notification>
+ <notification name="NoOutsideScripts">
+ Este terreno tiene desactivados los scripts externos.
+
+Los scripts no funcionan aquÃ, excepto los pertenecientes al propietario del terreno.
+ </notification>
+ <notification name="ClaimPublicLand">
+ Sólo puedes reclamar terreno público de la región en que estás.
+ </notification>
+ <notification name="RegionTPAccessBlocked">
+ No estás autorizado en esa región por su nivel de calificación. Debes validar tu edad y/o instalar el último visor.
+
+Por favor, dirÃgete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
+ </notification>
+ <notification name="URBannedFromRegion">
+ Se te ha prohibido el acceso a la región.
+ </notification>
+ <notification name="NoTeenGridAccess">
+ Tu cuenta no puede conectarse a esta región del grid teen.
+ </notification>
+ <notification name="ImproperPaymentStatus">
+ No tienes el estado de pago adecuado para entrar a esta región.
+ </notification>
+ <notification name="MustGetAgeParcel">
+ Debes haber verificado tu edad para entrar a esta parcela.
+ </notification>
+ <notification name="NoDestRegion">
+ No se ha encontrada la región de destino.
+ </notification>
+ <notification name="NotAllowedInDest">
+ No estás autorizado en el destino.
+ </notification>
+ <notification name="RegionParcelBan">
+ No puedes cruzar la región por una parcela con el acceso prohibido. Intenta otro camino.
+ </notification>
+ <notification name="TelehubRedirect">
+ Has sido redirigido a un punto de teleporte.
+ </notification>
+ <notification name="CouldntTPCloser">
+ No se puede teleportar a un destino tan cercano.
+ </notification>
+ <notification name="TPCancelled">
+ Teleporte cancelado.
+ </notification>
+ <notification name="FullRegionTryAgain">
+ En estos momentos, está llena la región a la que estás intentando entrar.
+Por favor, vuelve a intentarlo en unos momentos.
+ </notification>
+ <notification name="GeneralFailure">
+ Fallo general.
+ </notification>
+ <notification name="RoutedWrongRegion">
+ Mal dirigido a la región. Por favor, vuelve a intentarlo.
+ </notification>
+ <notification name="NoValidAgentID">
+ ID de agente inválido.
+ </notification>
+ <notification name="NoValidSession">
+ ID de sesión inválido.
+ </notification>
+ <notification name="NoValidCircuit">
+ Circuito de código inválido.
+ </notification>
+ <notification name="NoValidTimestamp">
+ Fecha inválida.
+ </notification>
+ <notification name="NoPendingConnection">
+ No se puede crear la conexión.
+ </notification>
+ <notification name="InternalUsherError">
+ Se ha producido un error interno al intentar acceder al destino de tu teleporte. Puede que, en este momento, el servicio de [SECOND_LIFE] tenga problemas.
+ </notification>
+ <notification name="NoGoodTPDestination">
+ No se puede encontrar en esta región un buen destino para el teleporte.
+ </notification>
+ <notification name="InternalErrorRegionResolver">
+ Se ha producido un error interno al manejar las coordenadas globales de tu petición de teleporte. Puede que, en este momento, el servicio de [SECOND_LIFE] tenga problemas.
+ </notification>
+ <notification name="NoValidLanding">
+ No se ha podido encontrar un punto de aterrizaje válido.
+ </notification>
+ <notification name="NoValidParcel">
+ No se ha podido encontrar una parcela válida.
+ </notification>
+ <notification name="ObjectGiveItem">
+ Un objeto de nombre <nolink>[OBJECTFROMNAME]</nolink>, propiedad de [NAME_SLURL], te ha dado este [OBJECTTYPE]:
+[ITEM_SLURL]
+ <form name="form">
+ <button name="Keep" text="Guardar"/>
+ <button name="Discard" text="Descartar"/>
+ <button name="Mute" text="Ignorar"/>
+ </form>
+ </notification>
+ <notification name="UserGiveItem">
+ [NAME_SLURL] te ha dado este [OBJECTTYPE]:
+[ITEM_SLURL]
+ <form name="form">
+ <button name="Show" text="Mostrar"/>
+ <button name="Discard" text="Descartar"/>
+ <button name="Mute" text="Ignorar"/>
+ </form>
+ </notification>
+ <notification name="GodMessage">
+ [NAME]
+
+[MESSAGE]
+ </notification>
+ <notification name="JoinGroup">
+ [MESSAGE]
+ <form name="form">
+ <button name="Join" text="Entrar"/>
+ <button name="Decline" text="Rehusar"/>
+ <button name="Info" text="Información"/>
+ </form>
+ </notification>
+ <notification name="TeleportOffered">
+ [NAME_SLURL] te ha ofrecido teleportarte a su posición:
+
+[MESSAGE] - [MATURITY_STR] <icon>[MATURITY_ICON]</icon>
+ <form name="form">
+ <button name="Teleport" text="Teleportar"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="TeleportOfferSent">
+ Teleporte ofrecido a [TO_NAME]
+ </notification>
+ <notification name="GotoURL">
+ [MESSAGE]
+[URL]
+ <form name="form">
+ <button name="Later" text="Más tarde"/>
+ <button name="GoNow..." text="Ir ahora..."/>
+ </form>
+ </notification>
+ <notification name="OfferFriendship">
+ [NAME_SLURL] te está ofreciendo su amistad.
+
+[MESSAGE]
+
+(Por defecto, podrás ver si el otro está conectado)
+ <form name="form">
+ <button name="Accept" text="Aceptar"/>
+ <button name="Decline" text="Rehusar"/>
+ </form>
+ </notification>
+ <notification name="FriendshipOffered">
+ Has ofrecido amistad a [TO_NAME]
+ </notification>
+ <notification name="OfferFriendshipNoMessage">
+ [NAME_SLURL] está ofreciendo amistad.
+
+(De manera predeterminada, podrás ver si están conectados los demás.)
+ <form name="form">
+ <button name="Accept" text="Aceptar"/>
+ <button name="Decline" text="Rehusar"/>
+ </form>
+ </notification>
+ <notification name="FriendshipAccepted">
+ [NAME] ha aceptado tu oferta de amistad.
+ </notification>
+ <notification name="FriendshipDeclined">
+ [NAME] ha rehusado tu oferta de amistad.
+ </notification>
+ <notification name="FriendshipAcceptedByMe">
+ Aceptado el ofrecimiento de amistad.
+ </notification>
+ <notification name="FriendshipDeclinedByMe">
+ Rehusado el ofrecimiento de amistad.
+ </notification>
+ <notification name="OfferCallingCard">
+ [NAME] te está ofreciendo su tarjeta de visita.
+Esto añadirá un marcador en tu inventario para que puedas enviarle rápidamente un MI.
+ <form name="form">
+ <button name="Accept" text="Aceptar"/>
+ <button name="Decline" text="Rehusar"/>
+ </form>
+ </notification>
+ <notification name="RegionRestartMinutes">
+ Esta región se reiniciará en [MINUTES] minutos.
+Si permaneces en esta región serás desconectado.
+ </notification>
+ <notification name="RegionRestartSeconds">
+ Esta región se reiniciará en [SECONDS] segundos.
+Si permaneces en esta región serás desconectado.
+ </notification>
+ <notification name="LoadWebPage">
+ ¿Cargar página web [URL]?
+
+[MESSAGE]
+
+Del objeto: <nolink>[OBJECTNAME]</nolink>, propietario: [NAME]?
+ <form name="form">
+ <button name="Gotopage" text="Cargar"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="FailedToFindWearableUnnamed">
+ Búsqueda fallida de [TYPE] en la base de datos.
+ </notification>
+ <notification name="FailedToFindWearable">
+ Búsqueda fallida de [TYPE] de nombre [DESC] en la base de datos.
+ </notification>
+ <notification name="InvalidWearable">
+ El Ãtem que quieres vestirte tiene una caracterÃstica que tu visor no puede leer. Por favor, actualiza tu versión de [APP_NAME] para ponerte este Ãtem.
+ </notification>
+ <notification name="ScriptQuestion">
+ <nolink>[OBJECTNAME]</nolink>, un objeto propiedad de '[NAME]', quiere:
+
+[QUESTIONS]
+¿Es correcto?
+ <form name="form">
+ <button name="Yes" text="SÃ"/>
+ <button name="No" text="No"/>
+ <button name="Mute" text="Ignorar"/>
+ </form>
+ </notification>
+ <notification name="ScriptQuestionCaution">
+ Un objeto de nombre '<nolink>[OBJECTNAME]</nolink>', propiedad de '[NAME]', quiere:
+
+[QUESTIONS]
+Si no confias en este objeto y en su creador, deberÃas rehusar esta petición.
+
+¿Autorizar esta petición?
+ <form name="form">
+ <button name="Grant" text="Autorizar"/>
+ <button name="Deny" text="Denegar"/>
+ <button name="Details" text="Detalles..."/>
+ </form>
+ </notification>
+ <notification name="ScriptDialog">
+ '<nolink>[TITLE]</nolink>' de [NAME]
+[MESSAGE]
+ <form name="form">
+ <button name="Ignore" text="Ignorar"/>
+ </form>
+ </notification>
+ <notification name="ScriptDialogGroup">
+ '<nolink>[TITLE]</nolink>' de [GROUPNAME]
+[MESSAGE]
+ <form name="form">
+ <button name="Ignore" text="Ignorar"/>
+ </form>
+ </notification>
+ <notification name="BuyLindenDollarSuccess">
+ ¡Gracias por tu pago!
+
+Tu saldo de L$ se actualizará cuando se complete el proceso. Si el proceso tarda más de 20 minutos, se cancelará tu transacción, y la cantidad se cargará en tu saldo de US$.
+
+Puedes revisar el estado de tu pago en el Historial de transacciones de tu [http://secondlife.com/account/ Panel de Control]
+ </notification>
+ <notification name="FirstOverrideKeys">
+ A partir de ahora, tus teclas de movimiento las gestiona un objeto.
+Prueba las teclas del cursor o AWSD para ver qué hacen.
+Algunos objetos (las pistolas, por ejemplo) te pedirán que, para usarlos, entres en vista subjetiva. Pulsa 'M' para hacerlo.
+ </notification>
+ <notification name="FirstSandbox">
+ Esta es una región 'sandbox' (zona de pruebas) donde los Residentes pueden aprender a construir.
+
+Los objetos que construyas aquà serán eliminados cuando la abandones; por tanto, no olvides pulsarlos con el botón derecho y elegir 'Tomar' para que tu creación vaya a tu inventario.
+ </notification>
+ <notification name="MaxListSelectMessage">
+ Puedes seleccionar un máximo de [MAX_SELECT] Ãtems de esta lista.
+ </notification>
+ <notification name="VoiceInviteP2P">
+ [NAME] te está invitando a un chat de voz.
+Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
+ <form name="form">
+ <button name="Accept" text="Aceptar"/>
+ <button name="Decline" text="Rehusar"/>
+ <button name="Mute" text="Ignorar"/>
+ </form>
+ </notification>
+ <notification name="AutoUnmuteByIM">
+ [NAME] ha dejado automáticamente de estar ignorado al enviarle un mensaje instantáneo.
+ </notification>
+ <notification name="AutoUnmuteByMoney">
+ [NAME] ha dejado automáticamente de estar ignorado al darle dinero.
+ </notification>
+ <notification name="AutoUnmuteByInventory">
+ [NAME] ha dejado automáticamente de estar ignorado al ofrecerle inventario.
+ </notification>
+ <notification name="VoiceInviteGroup">
+ [NAME] ha empezado un chat de voz con el grupo [GROUP].
+Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
+ <form name="form">
+ <button name="Accept" text="Aceptar"/>
+ <button name="Decline" text="Rehusar"/>
+ <button name="Mute" text="Ignorar"/>
+ </form>
+ </notification>
+ <notification name="VoiceInviteAdHoc">
+ [NAME] ha empezado un chat de voz en multiconferencia.
+Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
+ <form name="form">
+ <button name="Accept" text="Aceptar"/>
+ <button name="Decline" text="Rehusar"/>
+ <button name="Mute" text="Ignorar"/>
+ </form>
+ </notification>
+ <notification name="InviteAdHoc">
+ NAME] te está invitando a un chat en multiconferencia.
+Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
+ <form name="form">
+ <button name="Accept" text="Aceptar"/>
+ <button name="Decline" text="Rehusar"/>
+ <button name="Mute" text="Ignorar"/>
+ </form>
+ </notification>
+ <notification name="VoiceChannelFull">
+ El chat de voz al que estás intentando entrar, [VOICE_CHANNEL_NAME], ha llegado a su capacidad máxima. Por favor, vuelve a intentarlo más tarde.
+ </notification>
+ <notification name="ProximalVoiceChannelFull">
+ Lo sentimos. Este área ha llegado a su capacidad máxima de conversaciones por voz. Por favor, intenta usar la voz en otra zona.
+ </notification>
+ <notification name="VoiceChannelDisconnected">
+ Has sido desconectado de [VOICE_CHANNEL_NAME]. Vas a ser reconectado al chat de voz.
+ </notification>
+ <notification name="VoiceChannelDisconnectedP2P">
+ [VOICE_CHANNEL_NAME] ha colgado la llamada. Vas a ser reconectado al chat de voz.
+ </notification>
+ <notification name="P2PCallDeclined">
+ [VOICE_CHANNEL_NAME] ha rehusado tu llamada. Vas a ser reconectado al chat de voz.
+ </notification>
+ <notification name="P2PCallNoAnswer">
+ [VOICE_CHANNEL_NAME] no está disponible para coger tu llamada. Vas a ser reconectado al chat de voz.
+ </notification>
+ <notification name="VoiceChannelJoinFailed">
+ Fallo al conectar a [VOICE_CHANNEL_NAME]; por favor, inténtalo más tarde. Vas a ser reconectado al chat de voz.
+ </notification>
+ <notification name="VoiceLoginRetry">
+ Estamos creando un canal de voz para ti. Se puede tardar hasta un minuto.
+ </notification>
+ <notification name="VoiceEffectsExpired">
+ Una o más de las transformaciones de voz a las que estás suscrito han caducado.
+[Pulsa aquà [URL]] para renovar la suscripción.
+ </notification>
+ <notification name="VoiceEffectsExpiredInUse">
+ La transformación de voz activa ha caducado y se ha aplicado tu configuración de voz normal.
+[Pulsa aquà [URL]] para renovar la suscripción.
+ </notification>
+ <notification name="VoiceEffectsWillExpire">
+ Una o más de tus transformaciones de voz caducarán en menos de [INTERVAL] dÃas.
+[Pulsa aquà [URL]] para renovar la suscripción.
+ </notification>
+ <notification name="VoiceEffectsNew">
+ Están disponibles nuevas transformaciones de voz.
+ </notification>
+ <notification name="Cannot enter parcel: not a group member">
+ Sólo los miembros de un grupo determinado pueden visitar esta zona.
+ </notification>
+ <notification name="Cannot enter parcel: banned">
+ No puedes entrar en esta parcela, se te ha prohibido el acceso.
+ </notification>
+ <notification name="Cannot enter parcel: not on access list">
+ No puedes entrar en esta parcela, no estás en la lista de acceso.
+ </notification>
+ <notification name="VoiceNotAllowed">
+ No tienes permiso para conectarte al chat de voz de [VOICE_CHANNEL_NAME].
+ </notification>
+ <notification name="VoiceCallGenericError">
+ Se ha producido un error al intentar conectarte al [VOICE_CHANNEL_NAME]. Por favor, inténtalo más tarde.
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ No se admite el formato de la SLurl que has pulsado.
+ </notification>
+ <notification name="BlockedSLURL">
+ Por tu seguridad, se ha bloqueado una SLurl recibida de un navegador no de confianza.
+ </notification>
+ <notification name="ThrottledSLURL">
+ En muy poco tiempo, se han recibido muchas SLurls desde un navegador que no es de confianza.
+Por tu seguridad, serán bloqueadas durante unos segundos.
+ </notification>
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="Responder"/>
+ </form>
+ </notification>
+ <notification name="ConfirmCloseAll">
+ ¿Seguro que quieres cerrar todos los MI?
+ <usetemplate ignoretext="Confirmar antes de cerrar todos los MIs" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="AttachmentSaved">
+ Se ha guardado el adjunto.
+ </notification>
+ <notification name="UnableToFindHelpTopic">
+ No se ha podido encontrar un tema de ayuda para este elemento.
+ </notification>
+ <notification name="ObjectMediaFailure">
+ Error del servidor: fallo en la actualización u obtención de los media.
+'[ERROR]'
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ Un moderador ha silenciado tu chat de texto.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ Un moderador ha silenciado tu voz.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ ¿Estás seguro de que quieres borrar tu historial de teleportes?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ El botón elegido no se puede mostrar correctamente.
+Se mostrará cuando haya suficiente espacio.
+ </notification>
+ <notification name="ShareNotification">
+ Selecciona los residentes con quienes deseas compartir.
+ </notification>
+ <notification name="ShareItemsConfirmation">
+ ¿Estás seguro de que quieres compartir los elementos siguientes?
+
+<nolink>[ITEMS]</nolink>
+
+Con los siguientes residentes:
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ItemsShared">
+ Los elementos se han compartido correctamente.
+ </notification>
+ <notification name="DeedToGroupFail">
+ Error de transferencia a grupo.
+ </notification>
+ <notification name="AvatarRezNotification">
+ ( [EXISTENCE] segundos vivo)
+El avatar '[NAME]' tardó [TIME] segundos en dejar de aparecer como nube.
+ </notification>
+ <notification name="AvatarRezSelfBakedDoneNotification">
+ ( [EXISTENCE] segundos vivo)
+Has terminado de texturizar tu vestuario en [TIME] segundos.
+ </notification>
+ <notification name="AvatarRezSelfBakedUpdateNotification">
+ ( [EXISTENCE] segundos vivo)
+Has enviado una actualización de tu apariencia después de [TIME] segundos.
+[STATUS]
+ </notification>
+ <notification name="AvatarRezCloudNotification">
+ ( [EXISTENCE] segundos vivo)
+El avatar '[NAME]' se convirtió en nube.
+ </notification>
+ <notification name="AvatarRezArrivedNotification">
+ ( [EXISTENCE] segundos vivo)
+Apareció el avatar '[NAME]'.
+ </notification>
+ <notification name="AvatarRezLeftCloudNotification">
+ ( [EXISTENCE] segundos vivo)
+El avatar '[NAME]' salió al cabo de [TIME] segundos como nube.
+ </notification>
+ <notification name="AvatarRezEnteredAppearanceNotification">
+ ( [EXISTENCE] segundos vivo)
+El avatar '[NAME]' ya está en modo de edición de apariencia.
+ </notification>
+ <notification name="AvatarRezLeftAppearanceNotification">
+ ( [EXISTENCE] segundos vivo)
+El avatar '[NAME]' desactivó el modo de apariencia.
+ </notification>
+ <notification name="NoConnect">
+ Tenemos problemas de conexión con [PROTOCOL] [HOSTID].
+Comprueba la configuración de la red y del servidor de seguridad.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NoVoiceConnect">
+ Tenemos problemas de conexión con tu servidor de voz:
+
+[HOSTID]
+
+No podrás establecer comunicaciones de voz.
+Comprueba la configuración de la red y del servidor de seguridad.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AvatarRezLeftNotification">
+ ( [EXISTENCE] segundos vivo)
+El avatar '[NAME]' ya estaba totalmente cargado al salir.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUploadNotification">
+ ( [EXISTENCE] segundos con vida )
+Has actualizado una textura obtenida mediante bake de [RESOLUTION] para '[BODYREGION]' después de [TIME] segundos.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUpdateNotification">
+ ( [EXISTENCE] segundos con vida )
+Has actualizado de manera local una textura obtenida mediante bake de [RESOLUTION] para '[BODYREGION]' después de [TIME] segundos.
+ </notification>
+ <notification name="ConfirmLeaveCall">
+ ¿Estás seguro de que deseas salir de esta multiconferencia?
+ <usetemplate ignoretext="Confirma antes de salir de la llamada" name="okcancelignore" notext="No" yestext="SÃ"/>
+ </notification>
+ <notification name="ConfirmMuteAll">
+ Has seleccionado silenciar a todos los participantes en una multiconferencia.
+Si lo haces, todos los residentes que se unan posteriormente a la llamada también serán silenciados, incluso cuando abandones la conferencia.
+
+¿Deseas silenciar a todos?
+ <usetemplate ignoretext="Confirma que deseas silenciar a todos los participantes en una multiconferencia." name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification label="Chat" name="HintChat">
+ Para unirte a la conversación, escribe en el campo de chat que aparece a continuación.
+ </notification>
+ <notification label="Levantarme" name="HintSit">
+ Para levantarte y salir de la posición de sentado, haz clic en el botón Levantarme.
+ </notification>
+ <notification label="Hablar" name="HintSpeak">
+ Pulsa en el botón: Hablar para conectar y desconectar el micrófono.
+
+Pulsa en el cursor arriba para ver el panel de control de voz.
+
+Al ocultar el botón Hablar se desactiva la función de voz.
+ </notification>
+ <notification label="Explora el mundo" name="HintDestinationGuide">
+ La GuÃa de destinos contiene miles de nuevos lugares por descubrir. Selecciona una ubicación y elige Teleportarme para iniciar la exploración.
+ </notification>
+ <notification label="Panel lateral" name="HintSidePanel">
+ Accede de manera rápida a tu inventario, asà como a tu ropa, los perfiles y el resto de la información disponible en el panel lateral.
+ </notification>
+ <notification label="Mover" name="HintMove">
+ Si deseas caminar o correr, abre el panel Mover y utiliza las flechas de dirección para navegar. También puedes utilizar las flechas de dirección del teclado.
+ </notification>
+ <notification label="" name="HintMoveClick">
+ 1. Pulsa para caminar: Pulsa en cualquier punto del terreno para ir a él.
+
+2. Pulsa y arrastra para girar la vista: Pulsa y arrastra el cursor a cualquier parte del mundo para girar la vista.
+ </notification>
+ <notification label="Nombre mostrado" name="HintDisplayName">
+ Configura y personaliza aquà tu nombre mostrado. Esto se añadirá a tu nombre de usuario personal, que no puedes modificar. Puedes cambiar la manera en que ves los nombres de otras personas en tus preferencias.
+ </notification>
+ <notification label="Visión" name="HintView">
+ Para cambiar la vista de la cámara, utiliza los controles Orbital y Panorámica. Para restablecer tu vista, pulsa Esc o camina.
+ </notification>
+ <notification label="Inventario" name="HintInventory">
+ Accede a tu inventario para buscar Ãtems. Los Ãtems más recientes se pueden encontrar fácilmente en la pestaña Recientes.
+ </notification>
+ <notification label="¡Tienes dólares Linden!" name="HintLindenDollar">
+ Éste es tu saldo actual de L$. Haz clic en Comprar L$ para comprar más dólares Linden.
+ </notification>
+ <notification name="PopupAttempt">
+ Se ha impedido que se abriera una ventana emergente.
+ <form name="form">
+ <ignore name="ignore" text="Permitir todas las ventanas emergentes"/>
+ <button name="open" text="Abrir ventana emergente"/>
+ </form>
+ </notification>
+ <notification name="AuthRequest">
+ El sitio en '<nolink>[HOST_NAME]</nolink>' de la plataforma '[REALM]' requiere un nombre de usuario y una contraseña.
+ <form name="form">
+ <input name="username" text="Nombre de usuario"/>
+ <input name="password" text="Contraseña"/>
+ <button name="ok" text="Enviar"/>
+ <button name="cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification label="" name="ModeChange">
+ Para cambiar de modo tienes que salir y reiniciar.
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ La creación y edición de clasificados sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ La creación y edición de grupos sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ La creación y edición de Destacados sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ La visualización del mapa del mundo sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ Las llamadas de voz sólo están disponibles en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ Compartir sólo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ El pago a otros residentes sólo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <global name="UnsupportedCPU">
+ - La velocidad de tu CPU no cumple los requerimientos mÃnimos.
+ </global>
+ <global name="UnsupportedGLRequirements">
+ Parece que no tienes el hardware apropiado para [APP_NAME]. [APP_NAME] requiere una tarjeta gráfica OpenGL que admita texturas múltiples ('multitexture support'). Si la tienes, comprueba que tienes los últimos 'drivers' para tu tarjeta gráfica, asà como los últimos parches y 'service packs' para tu sistema operativo.
+
+Si los problemas persisten, por favor, acude a [SUPPORT_SITE].
+ </global>
+ <global name="UnsupportedCPUAmount">
+ 796
+ </global>
+ <global name="UnsupportedRAMAmount">
+ 510
+ </global>
+ <global name="UnsupportedGPU">
+ - Tu tarjeta gráfica no cumple los requerimientos mÃnimos.
+ </global>
+ <global name="UnsupportedRAM">
+ - La memoria de tu sistema no cumple los requerimientos mÃnimos.
+ </global>
+ <global name="You can only set your 'Home Location' on your land or at a mainland Infohub.">
+ Si posees un terreno, puedes hacerlo tu Base.
+También puedes buscar en el Mapa lugares marcados como "Puntos de Información".
+ </global>
+ <global name="You died and have been teleported to your home location">
+ Has muerto y te has teleportado a tu Base.
+ </global>
+</notifications>
diff --git a/indra/newview/skins/default/xui/es/panel_group_general.xml b/indra/newview/skins/default/xui/es/panel_group_general.xml index a0f7433d7d..ef2309dd55 100644 --- a/indra/newview/skins/default/xui/es/panel_group_general.xml +++ b/indra/newview/skins/default/xui/es/panel_group_general.xml @@ -1,58 +1,58 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="General" name="general_tab"> - <panel.string name="help_text"> - La pestaña General tiene información general de este grupo, una lista de sus miembros, las preferencias generales del grupo y las opciones de sus miembros. - -Deja el cursor sobre las opciones para ver más ayuda. - </panel.string> - <panel.string name="group_info_unchanged"> - Ha cambiado la información general del grupo - </panel.string> - <panel.string name="incomplete_member_data_str"> - Recuperando los datos de los miembros - </panel.string> - <panel name="group_info_top"> - <texture_picker label="" name="insignia" tool_tip="Pulsa para elegir una imagen"/> - <text name="prepend_founded_by"> - Fundador: - </text> - <name_box initial_value="(obteniendo)" name="founder_name"/> - <text name="join_cost_text"> - Gratis - </text> - <button label="¡ENTRA AHORA!" name="btn_join"/> - </panel> - <text_editor name="charter"> - Carta del grupo - </text_editor> - <name_list name="visible_members"> - <name_list.columns label="Miembro" name="name" relwidth="0.40"/> - <name_list.columns label="Etiqueta" name="title" relwidth="0.25"/> - <name_list.columns label="Estado" name="status"/> - </name_list> - <text name="my_group_settngs_label"> - Yo - </text> - <text name="active_title_label"> - Mi etiqueta: - </text> - <combo_box name="active_title" tool_tip="Configura la etiqueta que se verá sobre el nombre de tu avatar cuando tengas activo este grupo."/> - <check_box label="Recibir los avisos del grupo" name="receive_notices" tool_tip="Configura si quieres recibir avisos del grupo. Desmárcalo si este grupo te envÃa 'spam'."/> - <check_box label="Mostrarlo en mi perfil" name="list_groups_in_profile" tool_tip="Configura si quieres que este grupo se vea en tu perfil"/> - <panel name="preferences_container"> - <text name="group_settngs_label"> - Grupo - </text> - <check_box label="Cualquiera puede entrar" name="open_enrollement" tool_tip="Configura si se permite la entrada de nuevos miembros sin ser invitados."/> - <check_box label="Cuota de entrada" name="check_enrollment_fee" tool_tip="Configura si hay que pagar una cuota para entrar al grupo"/> - <spinner label="L$" left_delta="130" name="spin_enrollment_fee" tool_tip="Si la opción Cuota de entrada está marcada, los nuevos miembros han de pagar esta cuota para entrar al grupo." width="60"/> - <combo_box bottom_delta="-38" name="group_mature_check" tool_tip="Establece si la información de su grupo es 'mature'." width="150"> - <combo_item name="select_mature"> - - Selecciona el nivel de calificación - - </combo_item> - <combo_box.item label="Contenido 'Mature'" name="mature"/> - <combo_box.item label="Contenido 'PG'" name="pg"/> - </combo_box> - <check_box initial_value="true" label="Mostrar en la búsqueda" name="show_in_group_list" tool_tip="Permite que la gente vea este grupo en los resultados de la búsqueda"/> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="General" name="general_tab">
+ <panel.string name="help_text">
+ La pestaña General tiene información general de este grupo, una lista de sus miembros, las preferencias generales del grupo y las opciones de sus miembros.
+
+Deja el cursor sobre las opciones para ver más ayuda.
+ </panel.string>
+ <panel.string name="group_info_unchanged">
+ Ha cambiado la información general del grupo
+ </panel.string>
+ <panel.string name="incomplete_member_data_str">
+ Recuperando los datos de los miembros
+ </panel.string>
+ <panel name="group_info_top">
+ <texture_picker label="" name="insignia" tool_tip="Pulsa para elegir una imagen"/>
+ <text name="prepend_founded_by">
+ Fundador:
+ </text>
+ <name_box initial_value="(obteniendo)" name="founder_name"/>
+ <text name="join_cost_text">
+ Gratis
+ </text>
+ <button label="¡ENTRA AHORA!" name="btn_join"/>
+ </panel>
+ <text_editor name="charter">
+ Carta del grupo
+ </text_editor>
+ <name_list name="visible_members">
+ <name_list.columns label="Miembro" name="name" relwidth="0.40"/>
+ <name_list.columns label="Etiqueta" name="title" relwidth="0.25"/>
+ <name_list.columns label="Estado" name="status"/>
+ </name_list>
+ <text name="my_group_settngs_label">
+ Yo
+ </text>
+ <text name="active_title_label">
+ Mi etiqueta:
+ </text>
+ <combo_box name="active_title" tool_tip="Configura la etiqueta que se verá sobre el nombre de tu avatar cuando tengas activo este grupo."/>
+ <check_box label="Recibir los avisos del grupo" name="receive_notices" tool_tip="Configura si quieres recibir avisos del grupo. Desmárcalo si este grupo te envÃa 'spam'."/>
+ <check_box label="Mostrarlo en mi perfil" name="list_groups_in_profile" tool_tip="Configura si quieres que este grupo se vea en tu perfil"/>
+ <panel name="preferences_container">
+ <text name="group_settngs_label">
+ Grupo
+ </text>
+ <check_box label="Cualquiera puede entrar" name="open_enrollement" tool_tip="Configura si se permite la entrada de nuevos miembros sin ser invitados."/>
+ <check_box label="Cuota de entrada" name="check_enrollment_fee" tool_tip="Configura si hay que pagar una cuota para entrar al grupo"/>
+ <spinner label="L$" left_delta="130" name="spin_enrollment_fee" tool_tip="Si la opción Cuota de entrada está marcada, los nuevos miembros han de pagar esta cuota para entrar al grupo." width="60"/>
+ <combo_box bottom_delta="-38" name="group_mature_check" tool_tip="Establece si la información de su grupo es moderado." width="150">
+ <combo_item name="select_mature">
+ - Selecciona el nivel de calificación -
+ </combo_item>
+ <combo_box.item label="Contenido moderado" name="mature"/>
+ <combo_box.item label="Contenido general" name="pg"/>
+ </combo_box>
+ <check_box initial_value="true" label="Mostrar en la búsqueda" name="show_in_group_list" tool_tip="Permite que la gente vea este grupo en los resultados de la búsqueda"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_general.xml b/indra/newview/skins/default/xui/es/panel_preferences_general.xml index 790c7be581..d9a65aabc2 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml @@ -1,73 +1,73 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="General" name="general_panel"> - <text name="language_textbox"> - Idioma: - </text> - <combo_box name="language_combobox"> - <combo_box.item label="Predeterminado del sistema" name="System Default Language"/> - <combo_box.item label="English (Inglés)" name="English"/> - <combo_box.item label="Dansk (Danés) - Beta" name="Danish"/> - <combo_box.item label="Deutsch (Alemán) - Beta" name="Deutsch(German)"/> - <combo_box.item label="Español - Beta" name="Spanish"/> - <combo_box.item label="Français (Francés) - Beta" name="French"/> - <combo_box.item label="Italiano - Beta" name="Italian"/> - <combo_box.item label="Nederlands (Neerlandés) - Beta" name="Dutch"/> - <combo_box.item label="Polski (Polaco) - Beta" name="Polish"/> - <combo_box.item label="Português (portugués) - Beta" name="Portugese"/> - <combo_box.item label="日本語 (Japonés) - Beta" name="(Japanese)"/> - </combo_box> - <text name="language_textbox2"> - (requiere reiniciar) - </text> - <text name="maturity_desired_prompt"> - Quiero acceder a contenido: - </text> - <text name="maturity_desired_textbox"/> - <combo_box name="maturity_desired_combobox"> - <combo_box.item label="'PG', 'Mature' y 'Adult'" name="Desired_Adult"/> - <combo_box.item label="'PG' y 'Mature'" name="Desired_Mature"/> - <combo_box.item label="'PG'" name="Desired_PG"/> - </combo_box> - <text name="start_location_textbox"> - Localización inicial: - </text> - <combo_box name="start_location_combo"> - <combo_box.item label="Mi última posición" name="MyLastLocation" tool_tip="Por defecto, iniciar sesión en mi última posición."/> - <combo_box.item label="Mi Base" name="MyHome" tool_tip="Por defecto, iniciar sesión en mi Base."/> - </combo_box> - <check_box initial_value="true" label="Mostrar en la pantalla de conexión" name="show_location_checkbox"/> - <text name="name_tags_textbox"> - Etiquetas de los nombres: - </text> - <radio_group name="Name_Tag_Preference"> - <radio_item label="Off" name="radio" value="0"/> - <radio_item label="On" name="radio2" value="1"/> - <radio_item label="Mostrar brevemente" name="radio3" value="2"/> - </radio_group> - <check_box label="Mi nombre" name="show_my_name_checkbox1"/> - <check_box label="Nombre de usuario" name="show_slids" tool_tip="Mostrar el nombre de usuario, como bobsmith123"/> - <check_box label="TÃtulos de grupos" name="show_all_title_checkbox1" tool_tip="Mostrar tÃtulos de grupos, como Jefe o Miembro"/> - <check_box label="Realzar amigos" name="show_friends" tool_tip="Realzar las etiquetas de los nombres de tus amigos"/> - <check_box label="Ver nombres mostrados" name="display_names_check" tool_tip="Comprobar para utilizar nombres mostrados en chat, MI, etiquetas de nombres, etc."/> - <check_box label="Permitir los consejos de la IU del visor" name="viewer_hints_check"/> - <text name="inworld_typing_rg_label"> - Si pulsas las teclas de letras: - </text> - <radio_group name="inworld_typing_preference"> - <radio_item label="Inicia el chat local" name="radio_start_chat" value="1"/> - <radio_item label="Afecta al movimiento (por ejemplo, en las teclas WASD)" name="radio_move" value="0"/> - </radio_group> - <text name="title_afk_text"> - Ausente tras: - </text> - <combo_box label="Ausente tras:" name="afk"> - <combo_box.item label="2 minutos" name="item0"/> - <combo_box.item label="5 minutos" name="item1"/> - <combo_box.item label="10 minutos" name="item2"/> - <combo_box.item label="30 minutos" name="item3"/> - <combo_box.item label="nunca" name="item4"/> - </combo_box> - <text name="text_box3"> - Respuesta cuando estoy en modo ocupado: - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="General" name="general_panel">
+ <text name="language_textbox">
+ Idioma:
+ </text>
+ <combo_box name="language_combobox">
+ <combo_box.item label="Predeterminado del sistema" name="System Default Language"/>
+ <combo_box.item label="English (Inglés)" name="English"/>
+ <combo_box.item label="Dansk (Danés) - Beta" name="Danish"/>
+ <combo_box.item label="Deutsch (Alemán) - Beta" name="Deutsch(German)"/>
+ <combo_box.item label="Español - Beta" name="Spanish"/>
+ <combo_box.item label="Français (Francés) - Beta" name="French"/>
+ <combo_box.item label="Italiano - Beta" name="Italian"/>
+ <combo_box.item label="Nederlands (Neerlandés) - Beta" name="Dutch"/>
+ <combo_box.item label="Polski (Polaco) - Beta" name="Polish"/>
+ <combo_box.item label="Português (portugués) - Beta" name="Portugese"/>
+ <combo_box.item label="日本語 (Japonés) - Beta" name="(Japanese)"/>
+ </combo_box>
+ <text name="language_textbox2">
+ (requiere reiniciar)
+ </text>
+ <text name="maturity_desired_prompt">
+ Quiero acceder a contenido:
+ </text>
+ <text name="maturity_desired_textbox"/>
+ <combo_box name="maturity_desired_combobox">
+ <combo_box.item label="General, Moderado y Adulto" name="Desired_Adult"/>
+ <combo_box.item label="General y Moderado" name="Desired_Mature"/>
+ <combo_box.item label="General" name="Desired_PG"/>
+ </combo_box>
+ <text name="start_location_textbox">
+ Localización inicial:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Mi última posición" name="MyLastLocation" tool_tip="Por defecto, iniciar sesión en mi última posición."/>
+ <combo_box.item label="Mi Base" name="MyHome" tool_tip="Por defecto, iniciar sesión en mi Base."/>
+ </combo_box>
+ <check_box initial_value="true" label="Mostrar en la pantalla de conexión" name="show_location_checkbox"/>
+ <text name="name_tags_textbox">
+ Etiquetas de los nombres:
+ </text>
+ <radio_group name="Name_Tag_Preference">
+ <radio_item label="Off" name="radio" value="0"/>
+ <radio_item label="On" name="radio2" value="1"/>
+ <radio_item label="Mostrar brevemente" name="radio3" value="2"/>
+ </radio_group>
+ <check_box label="Mi nombre" name="show_my_name_checkbox1"/>
+ <check_box label="Nombre de usuario" name="show_slids" tool_tip="Mostrar el nombre de usuario, como bobsmith123"/>
+ <check_box label="TÃtulos de grupos" name="show_all_title_checkbox1" tool_tip="Mostrar tÃtulos de grupos, como Jefe o Miembro"/>
+ <check_box label="Realzar amigos" name="show_friends" tool_tip="Realzar las etiquetas de los nombres de tus amigos"/>
+ <check_box label="Ver nombres mostrados" name="display_names_check" tool_tip="Comprobar para utilizar nombres mostrados en chat, MI, etiquetas de nombres, etc."/>
+ <check_box label="Permitir los consejos de la IU del visor" name="viewer_hints_check"/>
+ <text name="inworld_typing_rg_label">
+ Si pulsas las teclas de letras:
+ </text>
+ <radio_group name="inworld_typing_preference">
+ <radio_item label="Inicia el chat local" name="radio_start_chat" value="1"/>
+ <radio_item label="Afecta al movimiento (por ejemplo, en las teclas WASD)" name="radio_move" value="0"/>
+ </radio_group>
+ <text name="title_afk_text">
+ Ausente tras:
+ </text>
+ <combo_box label="Ausente tras:" name="afk">
+ <combo_box.item label="2 minutos" name="item0"/>
+ <combo_box.item label="5 minutos" name="item1"/>
+ <combo_box.item label="10 minutos" name="item2"/>
+ <combo_box.item label="30 minutos" name="item3"/>
+ <combo_box.item label="nunca" name="item4"/>
+ </combo_box>
+ <text name="text_box3">
+ Respuesta cuando estoy en modo ocupado:
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_region_covenant.xml b/indra/newview/skins/default/xui/es/panel_region_covenant.xml index 06f4fffacf..84fe9937b9 100644 --- a/indra/newview/skins/default/xui/es/panel_region_covenant.xml +++ b/indra/newview/skins/default/xui/es/panel_region_covenant.xml @@ -1,83 +1,83 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Contrato" name="Covenant"> - <text name="estate_section_lbl"> - Estado - </text> - <text name="estate_name_lbl"> - Nombre: - </text> - <text name="estate_name_text"> - mainland - </text> - <text name="estate_owner_lbl"> - Propietario: - </text> - <text name="estate_owner_text"> - (nadie) - </text> - <text name="estate_cov_lbl"> - Contrato: - </text> - <text name="covenant_timestamp_text"> - Última modificación el miér. 31 de dic. de 1969, 16:00:00 - </text> - <button label="?" name="covenant_help"/> - <text_editor bottom="-263" height="178" name="covenant_editor"> - No se ha aportado un contrato para este estado. - </text_editor> - <button label="Cambiar" name="reset_covenant"/> - <text name="covenant_help_text"> - Los cambios en el contrato se mostrarán en todas las parcelas -del estado. - </text> - <text bottom_delta="-31" name="covenant_instructions"> - Arrastra y suelta una nota para cambiar el contrato de este estado. - </text> - <text name="region_section_lbl"> - Región - </text> - <text name="region_name_lbl"> - Nombre: - </text> - <text name="region_name_text"> - leyla - </text> - <text name="region_landtype_lbl"> - Tipo: - </text> - <text name="region_landtype_text"> - Mainland / Homestead - </text> - <text name="region_maturity_lbl"> - Calificación: - </text> - <text name="region_maturity_text"> - 'Adult' - </text> - <text name="resellable_lbl"> - Revender: - </text> - <text name="resellable_clause"> - El terreno de esta región no se podrá revender. - </text> - <text name="changeable_lbl"> - Dividir: - </text> - <text name="changeable_clause"> - El terreno de esta región no se podrá unir/dividir. - </text> - <string name="can_resell"> - El terreno comprado en esta región se podrá revender. - </string> - <string name="can_not_resell"> - El terreno comprado en esta región no se podrá revender. - </string> - <string name="can_change"> - El terreno comprado en esta región se podrá unir o -subdividir. - </string> - <string name="can_not_change"> - El terreno comprado en esta región no se podrá unir ni -subdividir. - </string> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Contrato" name="Covenant">
+ <text name="estate_section_lbl">
+ Estado
+ </text>
+ <text name="estate_name_lbl">
+ Nombre:
+ </text>
+ <text name="estate_name_text">
+ mainland
+ </text>
+ <text name="estate_owner_lbl">
+ Propietario:
+ </text>
+ <text name="estate_owner_text">
+ (nadie)
+ </text>
+ <text name="estate_cov_lbl">
+ Contrato:
+ </text>
+ <text name="covenant_timestamp_text">
+ Última modificación el miér. 31 de dic. de 1969, 16:00:00
+ </text>
+ <button label="?" name="covenant_help"/>
+ <text_editor bottom="-263" height="178" name="covenant_editor">
+ No se ha aportado un contrato para este estado.
+ </text_editor>
+ <button label="Cambiar" name="reset_covenant"/>
+ <text name="covenant_help_text">
+ Los cambios en el contrato se mostrarán en todas las parcelas
+del estado.
+ </text>
+ <text bottom_delta="-31" name="covenant_instructions">
+ Arrastra y suelta una nota para cambiar el contrato de este estado.
+ </text>
+ <text name="region_section_lbl">
+ Región
+ </text>
+ <text name="region_name_lbl">
+ Nombre:
+ </text>
+ <text name="region_name_text">
+ leyla
+ </text>
+ <text name="region_landtype_lbl">
+ Tipo:
+ </text>
+ <text name="region_landtype_text">
+ Mainland / Homestead
+ </text>
+ <text name="region_maturity_lbl">
+ Calificación:
+ </text>
+ <text name="region_maturity_text">
+ Adulto
+ </text>
+ <text name="resellable_lbl">
+ Revender:
+ </text>
+ <text name="resellable_clause">
+ El terreno de esta región no se podrá revender.
+ </text>
+ <text name="changeable_lbl">
+ Dividir:
+ </text>
+ <text name="changeable_clause">
+ El terreno de esta región no se podrá unir/dividir.
+ </text>
+ <string name="can_resell">
+ El terreno comprado en esta región se podrá revender.
+ </string>
+ <string name="can_not_resell">
+ El terreno comprado en esta región no se podrá revender.
+ </string>
+ <string name="can_change">
+ El terreno comprado en esta región se podrá unir o
+subdividir.
+ </string>
+ <string name="can_not_change">
+ El terreno comprado en esta región no se podrá unir ni
+subdividir.
+ </string>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_region_terrain.xml b/indra/newview/skins/default/xui/es/panel_region_terrain.xml index 903b826a0b..98b10e4895 100644 --- a/indra/newview/skins/default/xui/es/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/es/panel_region_terrain.xml @@ -8,7 +8,7 @@ </text> <spinner label="Nivel del agua" name="water_height_spin"/> <button label="?" name="water_height_help"/> - <spinner label="LÃmite de elevación del terreno" name="terrain_raise_spin"/> + <spinner label="LÃmite de elevación del terreno" name="terrain_raise_spin"/> <button label="?" name="terrain_raise_help"/> <spinner label="LÃmite de bajada del terreno" name="terrain_lower_spin" bottom_delta="-34"/> <button label="?" name="terrain_lower_help"/> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 75126e74c5..e5fc33b487 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -1,4343 +1,4346 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<!-- This file contains strings that used to be hardcoded in the source. - It is only for those strings which do not belong in a floater. - For example, the strings used in avatar chat bubbles, and strings - that are returned from one component and may appear in many places--> -<strings> - <string name="CAPITALIZED_APP_NAME"> - SECOND LIFE - </string> - <string name="SUPPORT_SITE"> - Portal de Soporte de Second Life - </string> - <string name="StartupDetectingHardware"> - Identificando el hardware... - </string> - <string name="StartupLoading"> - Instalando [APP_NAME]... - </string> - <string name="StartupClearingCache"> - Limpiando la caché... - </string> - <string name="StartupInitializingTextureCache"> - Iniciando la caché de las texturas... - </string> - <string name="StartupInitializingVFS"> - Iniciando VFS... - </string> - <string name="ProgressRestoring"> - Restaurando... - </string> - <string name="ProgressChangingResolution"> - Cambiando la resolución... - </string> - <string name="LoginInProgress"> - Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere. - </string> - <string name="LoginInProgressNoFrozen"> - Iniciando la sesión... - </string> - <string name="LoginAuthenticating"> - Autenticando - </string> - <string name="LoginMaintenance"> - Realizando el mantenimiento de la cuenta... - </string> - <string name="LoginAttempt"> - Ha fallado el intento previo de iniciar sesión. Iniciando sesión, intento [NUMBER] - </string> - <string name="LoginPrecaching"> - Cargando el mundo... - </string> - <string name="LoginInitializingBrowser"> - Iniciando el navegador web incorporado... - </string> - <string name="LoginInitializingMultimedia"> - Iniciando multimedia... - </string> - <string name="LoginInitializingFonts"> - Cargando las fuentes... - </string> - <string name="LoginVerifyingCache"> - Comprobando los archivos de la caché (puede tardar entre 60 y 90 segundos)... - </string> - <string name="LoginProcessingResponse"> - Procesando la respuesta... - </string> - <string name="LoginInitializingWorld"> - Iniciando el mundo... - </string> - <string name="LoginDecodingImages"> - Decodificando las imágenes... - </string> - <string name="LoginInitializingQuicktime"> - Iniciando QuickTime... - </string> - <string name="LoginQuicktimeNotFound"> - No se ha encontrado QuickTime. Imposible iniciarlo. - </string> - <string name="LoginQuicktimeOK"> - QuickTime se ha iniciado adecuadamente. - </string> - <string name="LoginWaitingForRegionHandshake"> - Esperando la conexión con la región... - </string> - <string name="LoginConnectingToRegion"> - Conectando con la región... - </string> - <string name="LoginDownloadingClothing"> - Descargando la ropa... - </string> - <string name="InvalidCertificate"> - El servidor devolvió un certificado no válido o dañado. Ponte en contacto con el administrador de la cuadrÃcula. - </string> - <string name="CertInvalidHostname"> - El nombre de host utilizado para acceder al servidor no es válido. Comprueba tu SLURL o el nombre de host de la cuadrÃcula. - </string> - <string name="CertExpired"> - Parece que el certificado que devolvió la cuadrÃcula está caducado. Comprueba el reloj del sistema o consulta al administrador de la cuadrÃcula. - </string> - <string name="CertKeyUsage"> - El certificado que devolvió el servidor no puede utilizarse para SSL. Ponte en contacto con el administrador de la cuadrÃcula. - </string> - <string name="CertBasicConstraints"> - La cadena de certificado del servidor contenÃa demasiados certificados. Ponte en contacto con el administrador de la cuadrÃcula. - </string> - <string name="CertInvalidSignature"> - No se pudo verificar la firma del certificado devuelta por el servidor de la cuadrÃcula. Ponte en contacto con el administrador de la cuadrÃcula. - </string> - <string name="LoginFailedNoNetwork"> - Error de red: no se ha podido conectar; por favor, revisa tu conexión a Internet. - </string> - <string name="LoginFailed"> - Error en el inicio de sesión. - </string> - <string name="Quit"> - Salir - </string> - <string name="create_account_url"> - http://join.secondlife.com/index.php?lang=es-ES - </string> - <string name="AgentLostConnection"> - Esta región puede estar teniendo problemas. Por favor, comprueba tu conexión a Internet. - </string> - <string name="SavingSettings"> - Guardando tus configuraciones... - </string> - <string name="LoggingOut"> - Cerrando sesión... - </string> - <string name="ShuttingDown"> - Cerrando... - </string> - <string name="YouHaveBeenDisconnected"> - Has sido desconectado de la región en la que estabas. - </string> - <string name="SentToInvalidRegion"> - Has sido enviado a una región no válida. - </string> - <string name="TestingDisconnect"> - Probando la desconexión del visor - </string> - <string name="TooltipPerson"> - Persona - </string> - <string name="TooltipNoName"> - (sin nombre) - </string> - <string name="TooltipOwner"> - Propietario: - </string> - <string name="TooltipPublic"> - Público - </string> - <string name="TooltipIsGroup"> - (Grupo) - </string> - <string name="TooltipForSaleL$"> - En venta: [AMOUNT] L$ - </string> - <string name="TooltipFlagGroupBuild"> - Construir el grupo - </string> - <string name="TooltipFlagNoBuild"> - No construir - </string> - <string name="TooltipFlagNoEdit"> - Construir el grupo - </string> - <string name="TooltipFlagNotSafe"> - No seguro - </string> - <string name="TooltipFlagNoFly"> - No volar - </string> - <string name="TooltipFlagGroupScripts"> - Scripts el grupo - </string> - <string name="TooltipFlagNoScripts"> - No scripts - </string> - <string name="TooltipLand"> - Terreno: - </string> - <string name="TooltipMustSingleDrop"> - Aquà se puede arrastrar sólo un Ãtem - </string> - <string name="TooltipPrice" value="[AMOUNT] L$:"/> - <string name="TooltipHttpUrl"> - Pulsa para ver esta página web - </string> - <string name="TooltipSLURL"> - Pulsa para ver la información de este lugar - </string> - <string name="TooltipAgentUrl"> - Pulsa para ver el perfil del Residente - </string> - <string name="TooltipAgentInspect"> - Obtén más información acerca de este residente. - </string> - <string name="TooltipAgentMute"> - Pulsa para silenciar a este Residente - </string> - <string name="TooltipAgentUnmute"> - Pulsa para quitar el silencio a este Residente - </string> - <string name="TooltipAgentIM"> - Pulsa para enviar un MI a este Residente - </string> - <string name="TooltipAgentPay"> - Pulsa para pagar a este Residente - </string> - <string name="TooltipAgentOfferTeleport"> - Pulsa para enviar una petición de teleporte a este Residente - </string> - <string name="TooltipAgentRequestFriend"> - Pulsa para enviar una petición de amistad a este Residente - </string> - <string name="TooltipGroupUrl"> - Pulsa para ver la descripción de este grupo - </string> - <string name="TooltipEventUrl"> - Pulsa para ver la descripción de este evento - </string> - <string name="TooltipClassifiedUrl"> - Pulsa para ver este clasificado - </string> - <string name="TooltipParcelUrl"> - Pulsa para ver la descripción de esta parcela - </string> - <string name="TooltipTeleportUrl"> - Pulsa para teleportarte a esta posición - </string> - <string name="TooltipObjectIMUrl"> - Pulsa para ver la descripción de este objeto - </string> - <string name="TooltipMapUrl"> - Pulsa para ver en el mapa esta localización - </string> - <string name="TooltipSLAPP"> - Pulsa para ejecutar el comando secondlife:// - </string> - <string name="CurrentURL" value="URL actual: [CurrentURL]"/> - <string name="SLurlLabelTeleport"> - Teleportarse a - </string> - <string name="SLurlLabelShowOnMap"> - Mostrarla en el mapa - </string> - <string name="SLappAgentMute"> - Silenciar - </string> - <string name="SLappAgentUnmute"> - Quitar el silencio - </string> - <string name="SLappAgentIM"> - MI - </string> - <string name="SLappAgentPay"> - Pagar - </string> - <string name="SLappAgentOfferTeleport"> - Ofrecer teleporte a - </string> - <string name="SLappAgentRequestFriend"> - Petición de amistad - </string> - <string name="BUTTON_CLOSE_DARWIN"> - Cerrar (⌘W) - </string> - <string name="BUTTON_CLOSE_WIN"> - Cerrar (Ctrl+W) - </string> - <string name="BUTTON_CLOSE_CHROME"> - Cerrar - </string> - <string name="BUTTON_RESTORE"> - Maximizar - </string> - <string name="BUTTON_MINIMIZE"> - Minimizar - </string> - <string name="BUTTON_TEAR_OFF"> - Separar la ventana - </string> - <string name="BUTTON_DOCK"> - Fijar - </string> - <string name="BUTTON_HELP"> - Ver la Ayuda - </string> - <string name="Searching"> - Buscando... - </string> - <string name="NoneFound"> - No se ha encontrado. - </string> - <string name="RetrievingData"> - Reintentando... - </string> - <string name="ReleaseNotes"> - Notas de la versión - </string> - <string name="RELEASE_NOTES_BASE_URL"> - http://wiki.secondlife.com/wiki/Release_Notes/ - </string> - <string name="LoadingData"> - Cargando... - </string> - <string name="AvatarNameNobody"> - (nadie) - </string> - <string name="AvatarNameWaiting"> - (esperando) - </string> - <string name="GroupNameNone"> - (ninguno) - </string> - <string name="AvalineCaller"> - Avaline: [ORDER] - </string> - <string name="AssetErrorNone"> - No hay ningún error - </string> - <string name="AssetErrorRequestFailed"> - Petición de asset: fallida - </string> - <string name="AssetErrorNonexistentFile"> - Petición de asset: el archivo no existe - </string> - <string name="AssetErrorNotInDatabase"> - Petición de asset: no se encontró el asset en la base de datos - </string> - <string name="AssetErrorEOF"> - Fin del archivo - </string> - <string name="AssetErrorCannotOpenFile"> - No puede abrirse el archivo - </string> - <string name="AssetErrorFileNotFound"> - No se ha encontrado el archivo - </string> - <string name="AssetErrorTCPTimeout"> - Tiempo de transferencia del archivo - </string> - <string name="AssetErrorCircuitGone"> - Circuito desconectado - </string> - <string name="AssetErrorPriceMismatch"> - No concuerda el precio en el visor y en el servidor - </string> - <string name="AssetErrorUnknownStatus"> - Estado desconocido - </string> - <string name="texture"> - la textura - </string> - <string name="sound"> - el sonido - </string> - <string name="calling card"> - la tarjeta de visita - </string> - <string name="landmark"> - el hito - </string> - <string name="legacy script"> - el script antiguo - </string> - <string name="clothing"> - esa ropa - </string> - <string name="object"> - el objeto - </string> - <string name="note card"> - la nota - </string> - <string name="folder"> - la carpeta - </string> - <string name="root"> - la ruta - </string> - <string name="lsl2 script"> - ese script de LSL2 - </string> - <string name="lsl bytecode"> - el código intermedio de LSL - </string> - <string name="tga texture"> - esa textura tga - </string> - <string name="body part"> - esa parte del cuerpo - </string> - <string name="snapshot"> - la foto - </string> - <string name="lost and found"> - Objetos Perdidos - </string> - <string name="targa image"> - esa imagen targa - </string> - <string name="trash"> - la Papelera - </string> - <string name="jpeg image"> - esa imagen jpeg - </string> - <string name="animation"> - la animación - </string> - <string name="gesture"> - el gesto - </string> - <string name="simstate"> - simstate - </string> - <string name="favorite"> - ese favorito - </string> - <string name="symbolic link"> - el enlace - </string> - <string name="symbolic folder link"> - enlace de la carpeta - </string> - <string name="AvatarAway"> - Ausente - </string> - <string name="AvatarBusy"> - Ocupado - </string> - <string name="AvatarMuted"> - Ignorado - </string> - <string name="anim_express_afraid"> - Susto - </string> - <string name="anim_express_anger"> - Enfado - </string> - <string name="anim_away"> - Ausente - </string> - <string name="anim_backflip"> - Salto mortal atrás - </string> - <string name="anim_express_laugh"> - Carcajada - </string> - <string name="anim_express_toothsmile"> - Gran sonrisa - </string> - <string name="anim_blowkiss"> - Mandar un beso - </string> - <string name="anim_express_bored"> - Aburrimiento - </string> - <string name="anim_bow"> - Reverencia - </string> - <string name="anim_clap"> - Aplauso - </string> - <string name="anim_courtbow"> - Reverencia floreada - </string> - <string name="anim_express_cry"> - Llanto - </string> - <string name="anim_dance1"> - Baile 1 - </string> - <string name="anim_dance2"> - Baile 2 - </string> - <string name="anim_dance3"> - Baile 3 - </string> - <string name="anim_dance4"> - Baile 4 - </string> - <string name="anim_dance5"> - Baile 5 - </string> - <string name="anim_dance6"> - Baile 6 - </string> - <string name="anim_dance7"> - Baile 7 - </string> - <string name="anim_dance8"> - Baile 8 - </string> - <string name="anim_express_disdain"> - Desdén - </string> - <string name="anim_drink"> - Beber - </string> - <string name="anim_express_embarrased"> - Azorarse - </string> - <string name="anim_angry_fingerwag"> - Negar con el dedo - </string> - <string name="anim_fist_pump"> - Éxito con el puño - </string> - <string name="anim_yoga_float"> - Yoga flotando - </string> - <string name="anim_express_frown"> - Fruncir el ceño - </string> - <string name="anim_impatient"> - Impaciente - </string> - <string name="anim_jumpforjoy"> - Salto de alegrÃa - </string> - <string name="anim_kissmybutt"> - Bésame el culo - </string> - <string name="anim_express_kiss"> - Besar - </string> - <string name="anim_laugh_short"> - ReÃr - </string> - <string name="anim_musclebeach"> - Sacar músculo - </string> - <string name="anim_no_unhappy"> - No (con enfado) - </string> - <string name="anim_no_head"> - No - </string> - <string name="anim_nyanya"> - Ña-Ña-Ña - </string> - <string name="anim_punch_onetwo"> - Puñetazo uno-dos - </string> - <string name="anim_express_open_mouth"> - Abrir la boca - </string> - <string name="anim_peace"> - 'V' con los dedos - </string> - <string name="anim_point_you"> - Señalar a otro/a - </string> - <string name="anim_point_me"> - Señalarse - </string> - <string name="anim_punch_l"> - Puñetazo izquierdo - </string> - <string name="anim_punch_r"> - Puñetazo derecho - </string> - <string name="anim_rps_countdown"> - PPT cuenta - </string> - <string name="anim_rps_paper"> - PPT papel - </string> - <string name="anim_rps_rock"> - PPT piedra - </string> - <string name="anim_rps_scissors"> - PPT tijera - </string> - <string name="anim_express_repulsed"> - Repulsa - </string> - <string name="anim_kick_roundhouse_r"> - Patada circular - </string> - <string name="anim_express_sad"> - Triste - </string> - <string name="anim_salute"> - Saludo militar - </string> - <string name="anim_shout"> - Gritar - </string> - <string name="anim_express_shrug"> - Encogerse de hombros - </string> - <string name="anim_express_smile"> - SonreÃr - </string> - <string name="anim_smoke_idle"> - Fumar: en la mano - </string> - <string name="anim_smoke_inhale"> - Fumar - </string> - <string name="anim_smoke_throw_down"> - Fumar: tirar el cigarro - </string> - <string name="anim_express_surprise"> - Sorpresa - </string> - <string name="anim_sword_strike_r"> - Estocadas - </string> - <string name="anim_angry_tantrum"> - Berrinche - </string> - <string name="anim_express_tongue_out"> - Sacar la lengua - </string> - <string name="anim_hello"> - Agitar la mano - </string> - <string name="anim_whisper"> - Cuchichear - </string> - <string name="anim_whistle"> - Pitar - </string> - <string name="anim_express_wink"> - Guiño - </string> - <string name="anim_wink_hollywood"> - Guiño (Hollywood) - </string> - <string name="anim_express_worry"> - Preocuparse - </string> - <string name="anim_yes_happy"> - Sà (contento) - </string> - <string name="anim_yes_head"> - Sà - </string> - <string name="texture_loading"> - Cargando... - </string> - <string name="worldmap_offline"> - Sin conexión - </string> - <string name="worldmap_item_tooltip_format"> - [PRICE] L$ por [AREA] m² - </string> - <string name="worldmap_results_none_found"> - No se ha encontrado. - </string> - <string name="Ok"> - OK - </string> - <string name="Premature end of file"> - Fin prematuro del archivo - </string> - <string name="ST_NO_JOINT"> - No se puede encontrar ROOT o JOINT. - </string> - <string name="whisper"> - susurra: - </string> - <string name="shout"> - grita: - </string> - <string name="ringing"> - Conectando al chat de voz... - </string> - <string name="connected"> - Conectado - </string> - <string name="unavailable"> - La voz no está disponible en su localización actual - </string> - <string name="hang_up"> - Desconectado del chat de voz - </string> - <string name="reconnect_nearby"> - Vas a ser reconectado al chat de voz con los cercanos - </string> - <string name="ScriptQuestionCautionChatGranted"> - '[OBJECTNAME]', un objeto propiedad de '[OWNERNAME]', localizado en [REGIONNAME] con la posición [REGIONPOS], ha recibido permiso para: [PERMISSIONS]. - </string> - <string name="ScriptQuestionCautionChatDenied"> - A '[OBJECTNAME]', un objeto propiedad de '[OWNERNAME]', localizado en [REGIONNAME] con la posición [REGIONPOS], se le ha denegado el permiso para: [PERMISSIONS]. - </string> - <string name="ScriptTakeMoney"> - Cogerle a usted dólares Linden (L$) - </string> - <string name="ActOnControlInputs"> - Actuar en sus controles de entrada - </string> - <string name="RemapControlInputs"> - Reconfigurar sus controles de entrada - </string> - <string name="AnimateYourAvatar"> - Ejecutar animaciones en su avatar - </string> - <string name="AttachToYourAvatar"> - Anexarse a su avatar - </string> - <string name="ReleaseOwnership"> - Anular la propiedad y que pase a ser público - </string> - <string name="LinkAndDelink"> - Enlazar y desenlazar de otros objetos - </string> - <string name="AddAndRemoveJoints"> - Añadir y quitar uniones con otros objetos - </string> - <string name="ChangePermissions"> - Cambiar sus permisos - </string> - <string name="TrackYourCamera"> - Seguir su cámara - </string> - <string name="ControlYourCamera"> - Controlar su cámara - </string> - <string name="SIM_ACCESS_PG"> - 'PG' - </string> - <string name="SIM_ACCESS_MATURE"> - 'Mature' - </string> - <string name="SIM_ACCESS_ADULT"> - 'Adult' - </string> - <string name="SIM_ACCESS_DOWN"> - Desconectado - </string> - <string name="SIM_ACCESS_MIN"> - Desconocido - </string> - <string name="land_type_unknown"> - (desconocido) - </string> - <string name="Estate / Full Region"> - Estado /Región completa - </string> - <string name="Estate / Homestead"> - Estado / Homestead - </string> - <string name="Mainland / Homestead"> - Continente / Homestead - </string> - <string name="Mainland / Full Region"> - Continente / Región completa - </string> - <string name="all_files"> - Todos los archivos - </string> - <string name="sound_files"> - Sonidos - </string> - <string name="animation_files"> - Animaciones - </string> - <string name="image_files"> - Imágenes - </string> - <string name="save_file_verb"> - Guardar - </string> - <string name="load_file_verb"> - Cargar - </string> - <string name="targa_image_files"> - Imágenes Targa - </string> - <string name="bitmap_image_files"> - Imágenes de mapa de bits - </string> - <string name="avi_movie_file"> - Archivo de pelÃcula AVI - </string> - <string name="xaf_animation_file"> - Archivo de anim. XAF - </string> - <string name="xml_file"> - Archivo XML - </string> - <string name="raw_file"> - Archivo RAW - </string> - <string name="compressed_image_files"> - Imágenes comprimidas - </string> - <string name="load_files"> - Cargar archivos - </string> - <string name="choose_the_directory"> - Elegir directorio - </string> - <string name="AvatarSetNotAway"> - Salir del estado ausente - </string> - <string name="AvatarSetAway"> - Pasar al estado ausente - </string> - <string name="AvatarSetNotBusy"> - Salir del estado ocupado - </string> - <string name="AvatarSetBusy"> - Pasar al estado ocupado - </string> - <string name="shape"> - Forma - </string> - <string name="skin"> - Piel - </string> - <string name="hair"> - Pelo - </string> - <string name="eyes"> - Ojos - </string> - <string name="shirt"> - Camisa - </string> - <string name="pants"> - Pantalón - </string> - <string name="shoes"> - Zapatos - </string> - <string name="socks"> - Calcetines - </string> - <string name="jacket"> - Chaqueta - </string> - <string name="gloves"> - Guantes - </string> - <string name="undershirt"> - Camiseta - </string> - <string name="underpants"> - Ropa interior - </string> - <string name="skirt"> - Falda - </string> - <string name="alpha"> - Alfa - </string> - <string name="tattoo"> - Tatuaje - </string> - <string name="physics"> - FÃsica - </string> - <string name="invalid"> - inválido/a - </string> - <string name="none"> - ninguno - </string> - <string name="shirt_not_worn"> - Camisa no puesta - </string> - <string name="pants_not_worn"> - Pantalones no puestos - </string> - <string name="shoes_not_worn"> - Zapatos no puestos - </string> - <string name="socks_not_worn"> - Calcetines no puestos - </string> - <string name="jacket_not_worn"> - Chaqueta no puesta - </string> - <string name="gloves_not_worn"> - Guantes no puestos - </string> - <string name="undershirt_not_worn"> - Camiseta no puesta - </string> - <string name="underpants_not_worn"> - Ropa interior no puesta - </string> - <string name="skirt_not_worn"> - Falda no puesta - </string> - <string name="alpha_not_worn"> - Alfa no puesta - </string> - <string name="tattoo_not_worn"> - Tatuaje no puesto - </string> - <string name="physics_not_worn"> - FÃsica no puesta - </string> - <string name="invalid_not_worn"> - no válido/a - </string> - <string name="create_new_shape"> - Crear una anatomÃa nueva - </string> - <string name="create_new_skin"> - Crear una piel nueva - </string> - <string name="create_new_hair"> - Crear pelo nuevo - </string> - <string name="create_new_eyes"> - Crear ojos nuevos - </string> - <string name="create_new_shirt"> - Crear una camisa nueva - </string> - <string name="create_new_pants"> - Crear unos pantalones nuevos - </string> - <string name="create_new_shoes"> - Crear unos zapatos nuevos - </string> - <string name="create_new_socks"> - Crear unos calcetines nuevos - </string> - <string name="create_new_jacket"> - Crear una chaqueta nueva - </string> - <string name="create_new_gloves"> - Crear unos guantes nuevos - </string> - <string name="create_new_undershirt"> - Crear una camiseta nueva - </string> - <string name="create_new_underpants"> - Crear ropa interior nueva - </string> - <string name="create_new_skirt"> - Crear una falda nueva - </string> - <string name="create_new_alpha"> - Crear una capa alfa nueva - </string> - <string name="create_new_tattoo"> - Crear un tatuaje nuevo - </string> - <string name="create_new_physics"> - Crear nueva fÃsica - </string> - <string name="create_new_invalid"> - no válido/a - </string> - <string name="NewWearable"> - Nuevo [WEARABLE_ITEM] - </string> - <string name="next"> - Siguiente - </string> - <string name="ok"> - OK - </string> - <string name="GroupNotifyGroupNotice"> - Aviso de grupo - </string> - <string name="GroupNotifyGroupNotices"> - Avisos del grupo - </string> - <string name="GroupNotifySentBy"> - Enviado por - </string> - <string name="GroupNotifyAttached"> - Adjunto: - </string> - <string name="GroupNotifyViewPastNotices"> - Ver los avisos pasados u optar por dejar de recibir aquà estos mensajes. - </string> - <string name="GroupNotifyOpenAttachment"> - Abrir el adjunto - </string> - <string name="GroupNotifySaveAttachment"> - Guardar el adjunto - </string> - <string name="TeleportOffer"> - Ofrecimiento de teleporte - </string> - <string name="StartUpNotifications"> - Llegaron avisos nuevos mientras estabas ausente... - </string> - <string name="OverflowInfoChannelString"> - Tienes [%d] aviso/s más - </string> - <string name="BodyPartsRightArm"> - Brazo der. - </string> - <string name="BodyPartsHead"> - Cabeza - </string> - <string name="BodyPartsLeftArm"> - Brazo izq. - </string> - <string name="BodyPartsLeftLeg"> - Pierna izq. - </string> - <string name="BodyPartsTorso"> - Torso - </string> - <string name="BodyPartsRightLeg"> - Pierna der. - </string> - <string name="GraphicsQualityLow"> - Bajo - </string> - <string name="GraphicsQualityMid"> - Medio - </string> - <string name="GraphicsQualityHigh"> - Alto - </string> - <string name="LeaveMouselook"> - Pulsa ESC para salir de la vista subjetiva - </string> - <string name="InventoryNoMatchingItems"> - ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/all/[SEARCH_TERM] Buscar]. - </string> - <string name="PlacesNoMatchingItems"> - ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/places/[SEARCH_TERM] Buscar]. - </string> - <string name="FavoritesNoMatchingItems"> - Arrastra aquà un hito para tenerlo en tus favoritos. - </string> - <string name="InventoryNoTexture"> - No tienes en tu inventario una copia de esta textura - </string> - <string name="no_transfer" value="(no transferible)"/> - <string name="no_modify" value="(no modificable)"/> - <string name="no_copy" value="(no copiable)"/> - <string name="worn" value="(puesto)"/> - <string name="link" value="(enlace)"/> - <string name="broken_link" value="(enlace roto)""/> - <string name="LoadingContents"> - Cargando el contenido... - </string> - <string name="NoContents"> - No hay contenido - </string> - <string name="WornOnAttachmentPoint" value="(lo llevas en: [ATTACHMENT_POINT])"/> - <string name="ActiveGesture" value="[GESLABEL] (activo)"/> - <string name="Chat Message" value="Chat:"/> - <string name="Sound" value="Sonido :"/> - <string name="Wait" value="--- Espera :"/> - <string name="AnimFlagStop" value="Parar la animación:"/> - <string name="AnimFlagStart" value="Empezar la animación:"/> - <string name="Wave" value="Onda"/> - <string name="GestureActionNone" value="Ninguno"/> - <string name="HelloAvatar" value="¡Hola, avatar!"/> - <string name="ViewAllGestures" value="Ver todos >>"/> - <string name="GetMoreGestures" value="Obtener más >>"/> - <string name="Animations" value="Animaciones,"/> - <string name="Calling Cards" value="Tarjetas de visita,"/> - <string name="Clothing" value="Ropa,"/> - <string name="Gestures" value="Gestos,"/> - <string name="Landmarks" value="Hitos,"/> - <string name="Notecards" value="Notas,"/> - <string name="Objects" value="Objetos,"/> - <string name="Scripts" value="Scripts,"/> - <string name="Sounds" value="Sonidos,"/> - <string name="Textures" value="Texturas,"/> - <string name="Snapshots" value="Fotos,"/> - <string name="No Filters" value="No"/> - <string name="Since Logoff" value="- Desde la desconexión"/> - <string name="InvFolder My Inventory"> - Mi Inventario - </string> - <string name="InvFolder My Favorites"> - Mis Favoritos - </string> - <string name="InvFolder Library"> - Biblioteca - </string> - <string name="InvFolder Textures"> - Texturas - </string> - <string name="InvFolder Sounds"> - Sonidos - </string> - <string name="InvFolder Calling Cards"> - Tarjetas de visita - </string> - <string name="InvFolder Landmarks"> - Hitos - </string> - <string name="InvFolder Scripts"> - Scripts - </string> - <string name="InvFolder Clothing"> - Ropa - </string> - <string name="InvFolder Objects"> - Objetos - </string> - <string name="InvFolder Notecards"> - Notas - </string> - <string name="InvFolder New Folder"> - Carpeta nueva - </string> - <string name="InvFolder Inventory"> - Inventario - </string> - <string name="InvFolder Uncompressed Images"> - Imágenes sin comprimir - </string> - <string name="InvFolder Body Parts"> - Partes del cuerpo - </string> - <string name="InvFolder Trash"> - Papelera - </string> - <string name="InvFolder Photo Album"> - Ãlbum de fotos - </string> - <string name="InvFolder Lost And Found"> - Objetos Perdidos - </string> - <string name="InvFolder Uncompressed Sounds"> - Sonidos sin comprimir - </string> - <string name="InvFolder Animations"> - Animaciones - </string> - <string name="InvFolder Gestures"> - Gestos - </string> - <string name="InvFolder Favorite"> - Favoritos - </string> - <string name="InvFolder favorite"> - Favoritos - </string> - <string name="InvFolder Current Outfit"> - Vestuario actual - </string> - <string name="InvFolder Initial Outfits"> - Vestuario inicial - </string> - <string name="InvFolder My Outfits"> - Mis vestuarios - </string> - <string name="InvFolder Accessories"> - Accesorios - </string> - <string name="InvFolder Friends"> - Amigos - </string> - <string name="InvFolder All"> - Todas - </string> - <string name="Buy"> - Comprar - </string> - <string name="BuyforL$"> - Comprar por L$ - </string> - <string name="Stone"> - Piedra - </string> - <string name="Metal"> - Metal - </string> - <string name="Glass"> - Cristal - </string> - <string name="Wood"> - Madera - </string> - <string name="Flesh"> - Carne - </string> - <string name="Plastic"> - Plástico - </string> - <string name="Rubber"> - Goma - </string> - <string name="Light"> - Claridad - </string> - <string name="KBShift"> - Mayúsculas - </string> - <string name="KBCtrl"> - Ctrl - </string> - <string name="Chest"> - Tórax - </string> - <string name="Skull"> - Cráneo - </string> - <string name="Left Shoulder"> - Hombro izquierdo - </string> - <string name="Right Shoulder"> - Hombro derecho - </string> - <string name="Left Hand"> - Mano izq. - </string> - <string name="Right Hand"> - Mano der. - </string> - <string name="Left Foot"> - Pie izq. - </string> - <string name="Right Foot"> - Pie der. - </string> - <string name="Spine"> - Columna - </string> - <string name="Pelvis"> - Pelvis - </string> - <string name="Mouth"> - Boca - </string> - <string name="Chin"> - Barbilla - </string> - <string name="Left Ear"> - Oreja izq. - </string> - <string name="Right Ear"> - Oreja der. - </string> - <string name="Left Eyeball"> - Ojo izq. - </string> - <string name="Right Eyeball"> - Ojo der. - </string> - <string name="Nose"> - Nariz - </string> - <string name="R Upper Arm"> - Brazo der. - </string> - <string name="R Forearm"> - Antebrazo der. - </string> - <string name="L Upper Arm"> - Brazo izq. - </string> - <string name="L Forearm"> - Antebrazo izq. - </string> - <string name="Right Hip"> - Cadera der. - </string> - <string name="R Upper Leg"> - Muslo der. - </string> - <string name="R Lower Leg"> - Pantorrilla der. - </string> - <string name="Left Hip"> - Cadera izq. - </string> - <string name="L Upper Leg"> - Muslo izq. - </string> - <string name="L Lower Leg"> - Pantorrilla izq. - </string> - <string name="Stomach"> - Abdomen - </string> - <string name="Left Pec"> - Pecho izquierdo - </string> - <string name="Right Pec"> - Pecho derecho - </string> - <string name="Invalid Attachment"> - Punto de colocación no válido - </string> - <string name="YearsMonthsOld"> - [AGEYEARS] [AGEMONTHS] de edad - </string> - <string name="YearsOld"> - [AGEYEARS] de edad - </string> - <string name="MonthsOld"> - [AGEMONTHS] de edad - </string> - <string name="WeeksOld"> - [AGEWEEKS] de edad - </string> - <string name="DaysOld"> - [AGEDAYS] de edad - </string> - <string name="TodayOld"> - Registrado hoy - </string> - <string name="AgeYearsA"> - [COUNT] año - </string> - <string name="AgeYearsB"> - [COUNT] años - </string> - <string name="AgeYearsC"> - [COUNT] años - </string> - <string name="AgeMonthsA"> - [COUNT] mes - </string> - <string name="AgeMonthsB"> - [COUNT] meses - </string> - <string name="AgeMonthsC"> - [COUNT] meses - </string> - <string name="AgeWeeksA"> - [COUNT] semana - </string> - <string name="AgeWeeksB"> - [COUNT] semanas - </string> - <string name="AgeWeeksC"> - [COUNT] semanas - </string> - <string name="AgeDaysA"> - [COUNT] dÃa - </string> - <string name="AgeDaysB"> - [COUNT] dÃas - </string> - <string name="AgeDaysC"> - [COUNT] dÃas - </string> - <string name="GroupMembersA"> - [COUNT] miembro - </string> - <string name="GroupMembersB"> - [COUNT] miembros - </string> - <string name="GroupMembersC"> - [COUNT] miembros - </string> - <string name="AcctTypeResident"> - Residente - </string> - <string name="AcctTypeTrial"> - Prueba - </string> - <string name="AcctTypeCharterMember"> - Miembro fundador - </string> - <string name="AcctTypeEmployee"> - Empleado de Linden Lab - </string> - <string name="PaymentInfoUsed"> - Ha usado información sobre la forma de pago - </string> - <string name="PaymentInfoOnFile"> - Hay información archivada sobre la forma de pago - </string> - <string name="NoPaymentInfoOnFile"> - No hay información archivada sobre la forma de pago - </string> - <string name="AgeVerified"> - Edad verificada - </string> - <string name="NotAgeVerified"> - Edad no verificada - </string> - <string name="Center 2"> - Centro 2 - </string> - <string name="Top Right"> - Arriba der. - </string> - <string name="Top"> - Arriba - </string> - <string name="Top Left"> - Arriba izq. - </string> - <string name="Center"> - Centro - </string> - <string name="Bottom Left"> - Abajo izq. - </string> - <string name="Bottom"> - Abajo - </string> - <string name="Bottom Right"> - Abajo der. - </string> - <string name="CompileQueueDownloadedCompiling"> - Descargado, compilándolo - </string> - <string name="CompileQueueScriptNotFound"> - No se encuentra el script en el servidor. - </string> - <string name="CompileQueueProblemDownloading"> - Problema al descargar - </string> - <string name="CompileQueueInsufficientPermDownload"> - Permisos insuficientes para descargar un script. - </string> - <string name="CompileQueueInsufficientPermFor"> - Permisos insuficientes para - </string> - <string name="CompileQueueUnknownFailure"> - Fallo desconocido en la descarga - </string> - <string name="CompileQueueTitle"> - Recompilando - </string> - <string name="CompileQueueStart"> - recompilar - </string> - <string name="ResetQueueTitle"> - Progreso del reinicio - </string> - <string name="ResetQueueStart"> - restaurar - </string> - <string name="RunQueueTitle"> - Configurar según se ejecuta - </string> - <string name="RunQueueStart"> - Configurando según se ejecuta - </string> - <string name="NotRunQueueTitle"> - Configurar sin ejecutar - </string> - <string name="NotRunQueueStart"> - Configurando sin ejecutarlo - </string> - <string name="CompileSuccessful"> - ¡Compilación correcta! - </string> - <string name="CompileSuccessfulSaving"> - Compilación correcta, guardando... - </string> - <string name="SaveComplete"> - Guardado. - </string> - <string name="ObjectOutOfRange"> - Script (objeto fuera de rango) - </string> - <string name="GodToolsObjectOwnedBy"> - El objeto [OBJECT] es propiedad de [OWNER] - </string> - <string name="GroupsNone"> - ninguno - </string> - <string name="Group" value="(grupo)"/> - <string name="Unknown"> - (Desconocido) - </string> - <string name="SummaryForTheWeek" value="Resumen de esta semana, empezando el"/> - <string name="NextStipendDay" value="El próximo dÃa de pago es el"/> - <string name="GroupIndividualShare" value="Grupo Aportaciones individuales"/> - <string name="GroupColumn" value="Grupo"/> - <string name="Balance"> - Saldo - </string> - <string name="Credits"> - Créditos - </string> - <string name="Debits"> - Débitos - </string> - <string name="Total"> - Total - </string> - <string name="NoGroupDataFound"> - No se encontraron datos del grupo - </string> - <string name="IMParentEstate"> - parent estate - </string> - <string name="IMMainland"> - continente - </string> - <string name="IMTeen"> - teen - </string> - <string name="RegionInfoError"> - error - </string> - <string name="RegionInfoAllEstatesOwnedBy"> - todos los estados propiedad de [OWNER] - </string> - <string name="RegionInfoAllEstatesYouOwn"> - todos los estados que posees - </string> - <string name="RegionInfoAllEstatesYouManage"> - todos los estados que administras para [OWNER] - </string> - <string name="RegionInfoAllowedResidents"> - Resientes autorizados: ([ALLOWEDAGENTS], de un máx. de [MAXACCESS]) - </string> - <string name="RegionInfoAllowedGroups"> - Grupos autorizados: ([ALLOWEDGROUPS], de un máx. de [MAXACCESS]) - </string> - <string name="ScriptLimitsParcelScriptMemory"> - Memoria de los scripts de la parcela - </string> - <string name="ScriptLimitsParcelsOwned"> - Parcelas listadas: [PARCELS] - </string> - <string name="ScriptLimitsMemoryUsed"> - Memoria usada: [COUNT] kb de un máx de [MAX] kb; [AVAILABLE] kb disponibles - </string> - <string name="ScriptLimitsMemoryUsedSimple"> - Memoria usada: [COUNT] kb - </string> - <string name="ScriptLimitsParcelScriptURLs"> - URLs de los scripts de la parcela - </string> - <string name="ScriptLimitsURLsUsed"> - URLs usadas: [COUNT] de un máx. de [MAX]; [AVAILABLE] disponibles - </string> - <string name="ScriptLimitsURLsUsedSimple"> - URLs usadas: [COUNT] - </string> - <string name="ScriptLimitsRequestError"> - Error al obtener la información - </string> - <string name="ScriptLimitsRequestNoParcelSelected"> - No hay una parcela seleccionada - </string> - <string name="ScriptLimitsRequestWrongRegion"> - Error: la información del script sólo está disponible en tu región actual - </string> - <string name="ScriptLimitsRequestWaiting"> - Obteniendo la información... - </string> - <string name="ScriptLimitsRequestDontOwnParcel"> - No tienes permiso para examinar esta parcela - </string> - <string name="SITTING_ON"> - Sentado en - </string> - <string name="ATTACH_CHEST"> - Tórax - </string> - <string name="ATTACH_HEAD"> - Cabeza - </string> - <string name="ATTACH_LSHOULDER"> - Hombro izquierdo - </string> - <string name="ATTACH_RSHOULDER"> - Hombro derecho - </string> - <string name="ATTACH_LHAND"> - Mano izq. - </string> - <string name="ATTACH_RHAND"> - Mano der. - </string> - <string name="ATTACH_LFOOT"> - Pie izq. - </string> - <string name="ATTACH_RFOOT"> - Pie der. - </string> - <string name="ATTACH_BACK"> - Anterior - </string> - <string name="ATTACH_PELVIS"> - Pelvis - </string> - <string name="ATTACH_MOUTH"> - Boca - </string> - <string name="ATTACH_CHIN"> - Barbilla - </string> - <string name="ATTACH_LEAR"> - Oreja izq. - </string> - <string name="ATTACH_REAR"> - Oreja der. - </string> - <string name="ATTACH_LEYE"> - Ojo izq. - </string> - <string name="ATTACH_REYE"> - Ojo der. - </string> - <string name="ATTACH_NOSE"> - Nariz - </string> - <string name="ATTACH_RUARM"> - Brazo der. - </string> - <string name="ATTACH_RLARM"> - Antebrazo der. - </string> - <string name="ATTACH_LUARM"> - Brazo izq. - </string> - <string name="ATTACH_LLARM"> - Antebrazo izq. - </string> - <string name="ATTACH_RHIP"> - Cadera der. - </string> - <string name="ATTACH_RULEG"> - Muslo der. - </string> - <string name="ATTACH_RLLEG"> - Pantorrilla der. - </string> - <string name="ATTACH_LHIP"> - Cadera izq. - </string> - <string name="ATTACH_LULEG"> - Muslo izq. - </string> - <string name="ATTACH_LLLEG"> - Pantorrilla izq. - </string> - <string name="ATTACH_BELLY"> - Vientre - </string> - <string name="ATTACH_RPEC"> - Pecho derecho - </string> - <string name="ATTACH_LPEC"> - Pecho izquierdo - </string> - <string name="ATTACH_HUD_CENTER_2"> - HUD: Centro 2 - </string> - <string name="ATTACH_HUD_TOP_RIGHT"> - HUD: arriba der. - </string> - <string name="ATTACH_HUD_TOP_CENTER"> - HUD: arriba centro - </string> - <string name="ATTACH_HUD_TOP_LEFT"> - HUD: arriba izq. - </string> - <string name="ATTACH_HUD_CENTER_1"> - HUD: Centro 1 - </string> - <string name="ATTACH_HUD_BOTTOM_LEFT"> - HUD: abajo izq. - </string> - <string name="ATTACH_HUD_BOTTOM"> - HUD: abajo - </string> - <string name="ATTACH_HUD_BOTTOM_RIGHT"> - HUD: abajo der. - </string> - <string name="CursorPos"> - LÃnea [LINE], Columna [COLUMN] - </string> - <string name="PanelDirCountFound"> - [COUNT] resultados - </string> - <string name="PanelContentsTooltip"> - Contenido del objeto - </string> - <string name="PanelContentsNewScript"> - Script nuevo - </string> - <string name="BusyModeResponseDefault"> - El Residente al que has enviado un mensaje ha solicitado que no se le moleste porque está en modo ocupado. Podrá ver tu mensaje más adelante, ya que éste aparecerá en su panel de MI. - </string> - <string name="MuteByName"> - (Por el nombre) - </string> - <string name="MuteAgent"> - (Residente) - </string> - <string name="MuteObject"> - (Objeto) - </string> - <string name="MuteGroup"> - (Grupo) - </string> - <string name="MuteExternal"> - (Externo) - </string> - <string name="RegionNoCovenant"> - No se ha aportado un contrato para este estado. - </string> - <string name="RegionNoCovenantOtherOwner"> - No se ha aportado un contrato para este estado. El terreno de este estado lo vende el propietario del estado, no Linden Lab. Por favor, contacta con ese propietario para informarte sobre la venta. - </string> - <string name="covenant_last_modified" value="Última modificación: "/> - <string name="none_text" value="(no hay)"/> - <string name="never_text" value=" (nunca)"/> - <string name="GroupOwned"> - Propiedad del grupo - </string> - <string name="Public"> - Público - </string> - <string name="ClassifiedClicksTxt"> - Clics: [TELEPORT] teleportes, [MAP] mapa, [PROFILE] perfil - </string> - <string name="ClassifiedUpdateAfterPublish"> - (se actualizará tras la publicación) - </string> - <string name="NoPicksClassifiedsText"> - No has creado destacados ni clasificados. Pulsa el botón Más para crear uno. - </string> - <string name="NoAvatarPicksClassifiedsText"> - El usuario no tiene clasificados ni destacados - </string> - <string name="PicksClassifiedsLoadingText"> - Cargando... - </string> - <string name="MultiPreviewTitle"> - Vista previa - </string> - <string name="MultiPropertiesTitle"> - Propiedades - </string> - <string name="InvOfferAnObjectNamed"> - Un objeto de nombre - </string> - <string name="InvOfferOwnedByGroup"> - propiedad del grupo - </string> - <string name="InvOfferOwnedByUnknownGroup"> - propiedad de un grupo desconocido - </string> - <string name="InvOfferOwnedBy"> - propiedad de - </string> - <string name="InvOfferOwnedByUnknownUser"> - propiedad de un usuario desconocido - </string> - <string name="InvOfferGaveYou"> - te ha dado - </string> - <string name="InvOfferDecline"> - Rechazas [DESC] de <nolink>[NAME]</nolink>. - </string> - <string name="GroupMoneyTotal"> - Total - </string> - <string name="GroupMoneyBought"> - comprado - </string> - <string name="GroupMoneyPaidYou"> - pagado a ti - </string> - <string name="GroupMoneyPaidInto"> - pagado en - </string> - <string name="GroupMoneyBoughtPassTo"> - pase comprado a - </string> - <string name="GroupMoneyPaidFeeForEvent"> - cuotas pagadas para el evento - </string> - <string name="GroupMoneyPaidPrizeForEvent"> - precio pagado por el evento - </string> - <string name="GroupMoneyBalance"> - Saldo - </string> - <string name="GroupMoneyCredits"> - Créditos - </string> - <string name="GroupMoneyDebits"> - Débitos - </string> - <string name="ViewerObjectContents"> - Contenidos - </string> - <string name="AcquiredItems"> - ArtÃculos adquiridos - </string> - <string name="Cancel"> - Cancelar - </string> - <string name="UploadingCosts"> - Subir [NAME] cuesta [AMOUNT] L$ - </string> - <string name="BuyingCosts"> - Comprar esto cuesta [AMOUNT] L$ - </string> - <string name="UnknownFileExtension"> - Extensión de archivo desconocida [.%s] -Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh - </string> - <string name="MuteObject2"> - Ignorar - </string> - <string name="AddLandmarkNavBarMenu"> - Guardarme este hito... - </string> - <string name="EditLandmarkNavBarMenu"> - Editar este hito... - </string> - <string name="accel-mac-control"> - ⌃ - </string> - <string name="accel-mac-command"> - ⌘ - </string> - <string name="accel-mac-option"> - ⌥ - </string> - <string name="accel-mac-shift"> - ⇧ - </string> - <string name="accel-win-control"> - Ctrl+ - </string> - <string name="accel-win-alt"> - Alt+ - </string> - <string name="accel-win-shift"> - Mayús+ - </string> - <string name="FileSaved"> - Archivo guardado - </string> - <string name="Receiving"> - Recibiendo - </string> - <string name="AM"> - AM - </string> - <string name="PM"> - PM - </string> - <string name="PST"> - PST - </string> - <string name="PDT"> - PDT - </string> - <string name="Direction_Forward"> - Adelante - </string> - <string name="Direction_Left"> - Izquierda - </string> - <string name="Direction_Right"> - Derecha - </string> - <string name="Direction_Back"> - Atrás - </string> - <string name="Direction_North"> - Norte - </string> - <string name="Direction_South"> - Sur - </string> - <string name="Direction_West"> - Oeste - </string> - <string name="Direction_East"> - Este - </string> - <string name="Direction_Up"> - Arriba - </string> - <string name="Direction_Down"> - Abajo - </string> - <string name="Any Category"> - Cualquier categorÃa - </string> - <string name="Shopping"> - Compras - </string> - <string name="Land Rental"> - Terreno en alquiler - </string> - <string name="Property Rental"> - Propiedad en alquiler - </string> - <string name="Special Attraction"> - Atracción especial - </string> - <string name="New Products"> - Nuevos productos - </string> - <string name="Employment"> - Empleo - </string> - <string name="Wanted"> - Se busca - </string> - <string name="Service"> - Servicios - </string> - <string name="Personal"> - Personal - </string> - <string name="None"> - Ninguno - </string> - <string name="Linden Location"> - Localización Linden - </string> - <string name="Adult"> - 'Adult' - </string> - <string name="Arts&Culture"> - Arte y Cultura - </string> - <string name="Business"> - Negocios - </string> - <string name="Educational"> - Educativo - </string> - <string name="Gaming"> - Juegos de azar - </string> - <string name="Hangout"> - Entretenimiento - </string> - <string name="Newcomer Friendly"> - Para recién llegados - </string> - <string name="Parks&Nature"> - Parques y Naturaleza - </string> - <string name="Residential"> - Residencial - </string> - <string name="Stage"> - Artes escénicas - </string> - <string name="Other"> - Otra - </string> - <string name="Rental"> - Terreno en alquiler - </string> - <string name="Any"> - Cualquiera - </string> - <string name="You"> - Tú - </string> - <string name="Multiple Media"> - Múltiples medias - </string> - <string name="Play Media"> - Play/Pausa los media - </string> - <string name="MBCmdLineError"> - Ha habido un error analizando la lÃnea de comando. -Por favor, consulta: http://wiki.secondlife.com/wiki/Client_parameters -Error: - </string> - <string name="MBCmdLineUsg"> - [APP_NAME] Uso de lÃnea de comando: - </string> - <string name="MBUnableToAccessFile"> - [APP_NAME] no puede acceder a un archivo que necesita. - -Puede ser porque estés ejecutando varias copias, o porque tu sistema crea -equivocadamente- que el archivo está abierto. -Si este mensaje persiste, reinicia tu ordenador y vuelve a intentarlo. -Si aun asà sigue apareciendo el mensaje, debes desinstalar completamente [APP_NAME] y reinstalarlo. - </string> - <string name="MBFatalError"> - Error fatal - </string> - <string name="MBRequiresAltiVec"> - [APP_NAME] requiere un procesador con AltiVec (G4 o posterior). - </string> - <string name="MBAlreadyRunning"> - [APP_NAME] ya se está ejecutando. -Revisa tu barra de tareas para encontrar una copia minimizada del programa. -Si este mensaje persiste, reinicia tu ordenador. - </string> - <string name="MBFrozenCrashed"> - En su anterior ejecución, [APP_NAME] se congeló o se cayó. -¿Quieres enviar un informe de caÃda? - </string> - <string name="MBAlert"> - Alerta - </string> - <string name="MBNoDirectX"> - [APP_NAME] no encuentra DirectX 9.0b o superior. -[APP_NAME] usa DirectX para detectar el hardware o los drivers no actualizados que pueden provocar problemas de estabilidad, ejecución pobre y caÃdas. Aunque puedes ejecutar [APP_NAME] sin él, recomendamos encarecidamente hacerlo con DirectX 9.0b. - -¿Quieres continuar? - </string> - <string name="MBWarning"> - ¡Atención! - </string> - <string name="MBNoAutoUpdate"> - Las actualizaciones automáticas no están todavÃa implementadas para Linux. -Por favor, descarga la última versión desde www.secondlife.com. - </string> - <string name="MBRegClassFailed"> - Fallo en RegisterClass - </string> - <string name="MBError"> - Error - </string> - <string name="MBFullScreenErr"> - No puede ejecutarse a pantalla completa de [WIDTH] x [HEIGHT]. -Ejecutándose en una ventana. - </string> - <string name="MBDestroyWinFailed"> - Error Shutdown destruyendo la ventana (DestroyWindow() failed) - </string> - <string name="MBShutdownErr"> - Error Shutdown - </string> - <string name="MBDevContextErr"> - No se puede construir el 'GL device context' - </string> - <string name="MBPixelFmtErr"> - No se puede encontrar un formato adecuado de pÃxel - </string> - <string name="MBPixelFmtDescErr"> - No se puede conseguir la descripción del formato de pÃxel - </string> - <string name="MBTrueColorWindow"> - Para ejecutarse, [APP_NAME] necesita True Color (32-bit). -Por favor, en las configuraciones de tu ordenador ajusta el modo de color a 32-bit. - </string> - <string name="MBAlpha"> - [APP_NAME] no puede ejecutarse porque no puede obtener un canal alpha de 8 bit. Generalmente, se debe a alguna cuestión de los drivers de la tarjeta de vÃdeo. -Por favor, comprueba que tienes instalados los últimos drivers para tu tarjeta de vÃdeo. -Comprueba también que tu monitor esta configurado para True Color (32-bit) en Panel de Control > Apariencia y temas > Pantalla. -Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. - </string> - <string name="MBPixelFmtSetErr"> - No se puede configurar el formato de pÃxel - </string> - <string name="MBGLContextErr"> - No se puede crear el 'GL rendering context' - </string> - <string name="MBGLContextActErr"> - No se puede activar el 'GL rendering context' - </string> - <string name="MBVideoDrvErr"> - [APP_NAME] no puede ejecutarse porque los drivers de tu tarjeta de vÃdeo o no están bien instalados, o no están actualizados, o son para hardware no admitido. Por favor, comprueba que tienes los drivers más actuales para tu tarjeta de vÃdeo, y, aunque los tengas, intenta reinstalarlos. - -Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. - </string> - <string name="5 O'Clock Shadow"> - Barba del dÃa - </string> - <string name="All White"> - Blanco del todo - </string> - <string name="Anime Eyes"> - Ojos de cómic - </string> - <string name="Arced"> - Arqueadas - </string> - <string name="Arm Length"> - Brazos: longitud - </string> - <string name="Attached"> - Cortos - </string> - <string name="Attached Earlobes"> - Lóbulos - </string> - <string name="Back Fringe"> - Nuca: largo - </string> - <string name="Baggy"> - Marcadas - </string> - <string name="Bangs"> - Bangs - </string> - <string name="Beady Eyes"> - Ojos pequeños - </string> - <string name="Belly Size"> - Barriga: tamaño - </string> - <string name="Big"> - Grande - </string> - <string name="Big Butt"> - Culo grande - </string> - <string name="Big Hair Back"> - Pelo: moño - </string> - <string name="Big Hair Front"> - Pelo: tupé - </string> - <string name="Big Hair Top"> - Pelo: melena alta - </string> - <string name="Big Head"> - Cabeza grande - </string> - <string name="Big Pectorals"> - Grandes pectorales - </string> - <string name="Big Spikes"> - Crestas grandes - </string> - <string name="Black"> - Negro - </string> - <string name="Blonde"> - Rubio - </string> - <string name="Blonde Hair"> - Pelo rubio - </string> - <string name="Blush"> - Colorete - </string> - <string name="Blush Color"> - Color del colorete - </string> - <string name="Blush Opacity"> - Opacidad del colorete - </string> - <string name="Body Definition"> - Definición del cuerpo - </string> - <string name="Body Fat"> - Cuerpo: gordura - </string> - <string name="Body Freckles"> - Pecas del cuerpo - </string> - <string name="Body Thick"> - Cuerpo grueso - </string> - <string name="Body Thickness"> - Cuerpo: grosor - </string> - <string name="Body Thin"> - Cuerpo delgado - </string> - <string name="Bow Legged"> - Abiertas - </string> - <string name="Breast Buoyancy"> - Busto: firmeza - </string> - <string name="Breast Cleavage"> - Busto: canalillo - </string> - <string name="Breast Size"> - Busto: tamaño - </string> - <string name="Bridge Width"> - Puente: ancho - </string> - <string name="Broad"> - Aumentar - </string> - <string name="Brow Size"> - Arco ciliar - </string> - <string name="Bug Eyes"> - Bug Eyes - </string> - <string name="Bugged Eyes"> - Ojos saltones - </string> - <string name="Bulbous"> - Bulbosa - </string> - <string name="Bulbous Nose"> - Nariz de porra - </string> - <string name="Breast Physics Mass"> - Masa del busto - </string> - <string name="Breast Physics Smoothing"> - Suavizado del busto - </string> - <string name="Breast Physics Gravity"> - Gravedad del busto - </string> - <string name="Breast Physics Drag"> - Aerodinámica del busto - </string> - <string name="Breast Physics InOut Max Effect"> - Efecto máx. - </string> - <string name="Breast Physics InOut Spring"> - Elasticidad - </string> - <string name="Breast Physics InOut Gain"> - Ganancia - </string> - <string name="Breast Physics InOut Damping"> - Amortiguación - </string> - <string name="Breast Physics UpDown Max Effect"> - Efecto máx. - </string> - <string name="Breast Physics UpDown Spring"> - Elasticidad - </string> - <string name="Breast Physics UpDown Gain"> - Ganancia - </string> - <string name="Breast Physics UpDown Damping"> - Amortiguación - </string> - <string name="Breast Physics LeftRight Max Effect"> - Efecto máx. - </string> - <string name="Breast Physics LeftRight Spring"> - Elasticidad - </string> - <string name="Breast Physics LeftRight Gain"> - Ganancia - </string> - <string name="Breast Physics LeftRight Damping"> - Amortiguación - </string> - <string name="Belly Physics Mass"> - Masa de la barriga - </string> - <string name="Belly Physics Smoothing"> - Suavizado de la barriga - </string> - <string name="Belly Physics Gravity"> - Gravedad de la barriga - </string> - <string name="Belly Physics Drag"> - Aerodinámica de la barriga - </string> - <string name="Belly Physics UpDown Max Effect"> - Efecto máx. - </string> - <string name="Belly Physics UpDown Spring"> - Elasticidad - </string> - <string name="Belly Physics UpDown Gain"> - Ganancia - </string> - <string name="Belly Physics UpDown Damping"> - Amortiguación - </string> - <string name="Butt Physics Mass"> - Masa del culo - </string> - <string name="Butt Physics Smoothing"> - Suavizado del culo - </string> - <string name="Butt Physics Gravity"> - Gravedad del culo - </string> - <string name="Butt Physics Drag"> - Aerodinámica del culo - </string> - <string name="Butt Physics UpDown Max Effect"> - Efecto máx. - </string> - <string name="Butt Physics UpDown Spring"> - Elasticidad - </string> - <string name="Butt Physics UpDown Gain"> - Ganancia - </string> - <string name="Butt Physics UpDown Damping"> - Amortiguación - </string> - <string name="Butt Physics LeftRight Max Effect"> - Efecto máx. - </string> - <string name="Butt Physics LeftRight Spring"> - Elasticidad - </string> - <string name="Butt Physics LeftRight Gain"> - Ganancia - </string> - <string name="Butt Physics LeftRight Damping"> - Amortiguación - </string> - <string name="Bushy Eyebrows"> - Cejijuntas - </string> - <string name="Bushy Hair"> - Pelo tupido - </string> - <string name="Butt Size"> - Culo: tamaño - </string> - <string name="Butt Gravity"> - Gravedad del culo - </string> - <string name="bustle skirt"> - Polisón - </string> - <string name="no bustle"> - Sin polisón - </string> - <string name="more bustle"> - Con polisón - </string> - <string name="Chaplin"> - Cortito - </string> - <string name="Cheek Bones"> - Pómulos - </string> - <string name="Chest Size"> - Tórax: tamaño - </string> - <string name="Chin Angle"> - Barbilla: ángulo - </string> - <string name="Chin Cleft"> - Barbilla: contorno - </string> - <string name="Chin Curtains"> - Barba en collar - </string> - <string name="Chin Depth"> - Barbilla: largo - </string> - <string name="Chin Heavy"> - Hacia la barbilla - </string> - <string name="Chin In"> - Barbilla retraÃda - </string> - <string name="Chin Out"> - Barbilla prominente - </string> - <string name="Chin-Neck"> - Papada - </string> - <string name="Clear"> - Transparente - </string> - <string name="Cleft"> - Remarcar - </string> - <string name="Close Set Eyes"> - Ojos juntos - </string> - <string name="Closed"> - Cerrar - </string> - <string name="Closed Back"> - Trasera cerrada - </string> - <string name="Closed Front"> - Frontal cerrado - </string> - <string name="Closed Left"> - Cerrada - </string> - <string name="Closed Right"> - Cerrada - </string> - <string name="Coin Purse"> - Poco abultada - </string> - <string name="Collar Back"> - Espalda - </string> - <string name="Collar Front"> - Escote - </string> - <string name="Corner Down"> - Hacia abajo - </string> - <string name="Corner Up"> - Hacia arriba - </string> - <string name="Creased"> - CaÃdos - </string> - <string name="Crooked Nose"> - Nariz torcida - </string> - <string name="Cuff Flare"> - Acampanado - </string> - <string name="Dark"> - Oscuridad - </string> - <string name="Dark Green"> - Verde oscuro - </string> - <string name="Darker"> - Más oscuros - </string> - <string name="Deep"> - Remarcar - </string> - <string name="Default Heels"> - Tacones por defecto - </string> - <string name="Dense"> - Densas - </string> - <string name="Double Chin"> - Mucha papada - </string> - <string name="Downturned"> - Poco - </string> - <string name="Duffle Bag"> - Muy abultada - </string> - <string name="Ear Angle"> - Orejas: ángulo - </string> - <string name="Ear Size"> - Orejas: tamaño - </string> - <string name="Ear Tips"> - Orejas: forma - </string> - <string name="Egg Head"> - Cabeza: ahuevada - </string> - <string name="Eye Bags"> - Ojos: bolsas - </string> - <string name="Eye Color"> - Ojos: color - </string> - <string name="Eye Depth"> - Ojos: profundidad - </string> - <string name="Eye Lightness"> - Ojos: brillo - </string> - <string name="Eye Opening"> - Ojos: apertura - </string> - <string name="Eye Pop"> - Ojos: simetrÃa - </string> - <string name="Eye Size"> - Ojos: tamaño - </string> - <string name="Eye Spacing"> - Ojos: separación - </string> - <string name="Eyebrow Arc"> - Cejas: arco - </string> - <string name="Eyebrow Density"> - Cejas: densidad - </string> - <string name="Eyebrow Height"> - Cejas: altura - </string> - <string name="Eyebrow Points"> - Cejas: en V - </string> - <string name="Eyebrow Size"> - Cejas: tamaño - </string> - <string name="Eyelash Length"> - Pestañas: longitud - </string> - <string name="Eyeliner"> - Contorno de ojos - </string> - <string name="Eyeliner Color"> - Contorno de ojos: color - </string> - <string name="Eyes Bugged"> - Eyes Bugged - </string> - <string name="Face Shear"> - Cara: simetrÃa - </string> - <string name="Facial Definition"> - Rasgos marcados - </string> - <string name="Far Set Eyes"> - Ojos separados - </string> - <string name="Fat Lips"> - Prominentes - </string> - <string name="Female"> - Mujer - </string> - <string name="Fingerless"> - Sin dedos - </string> - <string name="Fingers"> - Con dedos - </string> - <string name="Flared Cuffs"> - Campana - </string> - <string name="Flat"> - Redondeadas - </string> - <string name="Flat Butt"> - Culo plano - </string> - <string name="Flat Head"> - Cabeza plana - </string> - <string name="Flat Toe"> - Empeine bajo - </string> - <string name="Foot Size"> - Pie: tamaño - </string> - <string name="Forehead Angle"> - Frente: ángulo - </string> - <string name="Forehead Heavy"> - Hacia la frente - </string> - <string name="Freckles"> - Pecas - </string> - <string name="Front Fringe"> - Flequillo - </string> - <string name="Full Back"> - Sin cortar - </string> - <string name="Full Eyeliner"> - Contorno completo - </string> - <string name="Full Front"> - Sin cortar - </string> - <string name="Full Hair Sides"> - Pelo: volumen a los lados - </string> - <string name="Full Sides"> - Volumen total - </string> - <string name="Glossy"> - Con brillo - </string> - <string name="Glove Fingers"> - Guantes: dedos - </string> - <string name="Glove Length"> - Guantes: largo - </string> - <string name="Hair"> - Pelo - </string> - <string name="Hair Back"> - Pelo: nuca - </string> - <string name="Hair Front"> - Pelo: delante - </string> - <string name="Hair Sides"> - Pelo: lados - </string> - <string name="Hair Sweep"> - Peinado: dirección - </string> - <string name="Hair Thickess"> - Pelo: espesor - </string> - <string name="Hair Thickness"> - Pelo: espesor - </string> - <string name="Hair Tilt"> - Pelo: inclinación - </string> - <string name="Hair Tilted Left"> - A la izq. - </string> - <string name="Hair Tilted Right"> - A la der. - </string> - <string name="Hair Volume"> - Pelo: volumen - </string> - <string name="Hand Size"> - Manos: tamaño - </string> - <string name="Handlebars"> - Muy largo - </string> - <string name="Head Length"> - Cabeza: longitud - </string> - <string name="Head Shape"> - Cabeza: forma - </string> - <string name="Head Size"> - Cabeza: tamaño - </string> - <string name="Head Stretch"> - Cabeza: estiramiento - </string> - <string name="Heel Height"> - Tacón: altura - </string> - <string name="Heel Shape"> - Tacón: forma - </string> - <string name="Height"> - Altura - </string> - <string name="High"> - Subir - </string> - <string name="High Heels"> - Tacones altos - </string> - <string name="High Jaw"> - MandÃbula alta - </string> - <string name="High Platforms"> - Suela gorda - </string> - <string name="High and Tight"> - Pegada - </string> - <string name="Higher"> - Arrriba - </string> - <string name="Hip Length"> - Cadera: altura - </string> - <string name="Hip Width"> - Cadera: ancho - </string> - <string name="In"> - Pegadas - </string> - <string name="In Shdw Color"> - LÃnea de ojos: color - </string> - <string name="In Shdw Opacity"> - LÃnea de ojos: opacidad - </string> - <string name="Inner Eye Corner"> - Ojos: lagrimal - </string> - <string name="Inner Eye Shadow"> - Inner Eye Shadow - </string> - <string name="Inner Shadow"> - LÃnea de ojos - </string> - <string name="Jacket Length"> - Chaqueta: largo - </string> - <string name="Jacket Wrinkles"> - Chaqueta: arrugas - </string> - <string name="Jaw Angle"> - MandÃbula: ángulo - </string> - <string name="Jaw Jut"> - Maxilar inferior - </string> - <string name="Jaw Shape"> - MandÃbula: forma - </string> - <string name="Join"> - Más junto - </string> - <string name="Jowls"> - Mofletes - </string> - <string name="Knee Angle"> - Rodillas: ángulo - </string> - <string name="Knock Kneed"> - Zambas - </string> - <string name="Large"> - Aumentar - </string> - <string name="Large Hands"> - Manos grandes - </string> - <string name="Left Part"> - Raya: izq. - </string> - <string name="Leg Length"> - Piernas: longitud - </string> - <string name="Leg Muscles"> - Piernas: musculatura - </string> - <string name="Less"> - Menos - </string> - <string name="Less Body Fat"> - Menos gordura - </string> - <string name="Less Curtains"> - Menos tupida - </string> - <string name="Less Freckles"> - Menos pecas - </string> - <string name="Less Full"> - Menos grosor - </string> - <string name="Less Gravity"> - Más levantado - </string> - <string name="Less Love"> - Menos michelines - </string> - <string name="Less Muscles"> - Pocos músculos - </string> - <string name="Less Muscular"> - Poca musculatura - </string> - <string name="Less Rosy"> - Menos sonrosada - </string> - <string name="Less Round"> - Menos redondeada - </string> - <string name="Less Saddle"> - Menos cartucheras - </string> - <string name="Less Square"> - Menos cuadrada - </string> - <string name="Less Volume"> - Menos volumen - </string> - <string name="Less soul"> - Pequeña - </string> - <string name="Lighter"> - Más luminosos - </string> - <string name="Lip Cleft"> - Labio: hoyuelo - </string> - <string name="Lip Cleft Depth"> - Hoyuelo marcado - </string> - <string name="Lip Fullness"> - Labios: grosor - </string> - <string name="Lip Pinkness"> - Labios sonrosados - </string> - <string name="Lip Ratio"> - Labios: ratio - </string> - <string name="Lip Thickness"> - Labios: prominencia - </string> - <string name="Lip Width"> - Labios: ancho - </string> - <string name="Lipgloss"> - Brillo de labios - </string> - <string name="Lipstick"> - Barra de labios - </string> - <string name="Lipstick Color"> - Barra de labios: color - </string> - <string name="Long"> - Más - </string> - <string name="Long Head"> - Cabeza alargada - </string> - <string name="Long Hips"> - Cadera larga - </string> - <string name="Long Legs"> - Piernas largas - </string> - <string name="Long Neck"> - Cuello largo - </string> - <string name="Long Pigtails"> - Coletas largas - </string> - <string name="Long Ponytail"> - Cola de caballo larga - </string> - <string name="Long Torso"> - Torso largo - </string> - <string name="Long arms"> - Brazos largos - </string> - <string name="Loose Pants"> - Pantalón suelto - </string> - <string name="Loose Shirt"> - Camiseta suelta - </string> - <string name="Loose Sleeves"> - Puños anchos - </string> - <string name="Love Handles"> - Michelines - </string> - <string name="Low"> - Bajar - </string> - <string name="Low Heels"> - Tacones bajos - </string> - <string name="Low Jaw"> - MandÃbula baja - </string> - <string name="Low Platforms"> - Suela fina - </string> - <string name="Low and Loose"> - Suelta - </string> - <string name="Lower"> - Abajo - </string> - <string name="Lower Bridge"> - Puente: abajo - </string> - <string name="Lower Cheeks"> - Mejillas: abajo - </string> - <string name="Male"> - Varón - </string> - <string name="Middle Part"> - Raya: en medio - </string> - <string name="More"> - Más - </string> - <string name="More Blush"> - Más colorete - </string> - <string name="More Body Fat"> - Más gordura - </string> - <string name="More Curtains"> - Más tupida - </string> - <string name="More Eyeshadow"> - Más - </string> - <string name="More Freckles"> - Más pecas - </string> - <string name="More Full"> - Más grosor - </string> - <string name="More Gravity"> - Menos levantado - </string> - <string name="More Lipstick"> - Más barra de labios - </string> - <string name="More Love"> - Más michelines - </string> - <string name="More Lower Lip"> - Más el inferior - </string> - <string name="More Muscles"> - Más músculos - </string> - <string name="More Muscular"> - Más musculatura - </string> - <string name="More Rosy"> - Más sonrosada - </string> - <string name="More Round"> - Más redondeada - </string> - <string name="More Saddle"> - Más cartucheras - </string> - <string name="More Sloped"> - Más inclinada - </string> - <string name="More Square"> - Más cuadrada - </string> - <string name="More Upper Lip"> - Más el superior - </string> - <string name="More Vertical"> - Más recta - </string> - <string name="More Volume"> - Más volumen - </string> - <string name="More soul"> - Grande - </string> - <string name="Moustache"> - Bigote - </string> - <string name="Mouth Corner"> - Comisuras - </string> - <string name="Mouth Position"> - Boca: posición - </string> - <string name="Mowhawk"> - Rapado - </string> - <string name="Muscular"> - Muscular - </string> - <string name="Mutton Chops"> - Patillas largas - </string> - <string name="Nail Polish"> - Uñas pintadas - </string> - <string name="Nail Polish Color"> - Uñas pintadas: color - </string> - <string name="Narrow"> - Disminuir - </string> - <string name="Narrow Back"> - Rapada - </string> - <string name="Narrow Front"> - Entradas - </string> - <string name="Narrow Lips"> - Labios estrechos - </string> - <string name="Natural"> - Natural - </string> - <string name="Neck Length"> - Cuello: longitud - </string> - <string name="Neck Thickness"> - Cuello: grosor - </string> - <string name="No Blush"> - Sin colorete - </string> - <string name="No Eyeliner"> - Sin contorno - </string> - <string name="No Eyeshadow"> - Menos - </string> - <string name="No Lipgloss"> - Sin brillo - </string> - <string name="No Lipstick"> - Sin barra de labios - </string> - <string name="No Part"> - Sin raya - </string> - <string name="No Polish"> - Sin pintar - </string> - <string name="No Red"> - Nada - </string> - <string name="No Spikes"> - Sin crestas - </string> - <string name="No White"> - Sin blanco - </string> - <string name="No Wrinkles"> - Sin arrugas - </string> - <string name="Normal Lower"> - Normal Lower - </string> - <string name="Normal Upper"> - Normal Upper - </string> - <string name="Nose Left"> - Nariz a la izq. - </string> - <string name="Nose Right"> - Nariz a la der. - </string> - <string name="Nose Size"> - Nariz: tamaño - </string> - <string name="Nose Thickness"> - Nariz: grosor - </string> - <string name="Nose Tip Angle"> - Nariz: respingona - </string> - <string name="Nose Tip Shape"> - Nariz: punta - </string> - <string name="Nose Width"> - Nariz: ancho - </string> - <string name="Nostril Division"> - Ventana: altura - </string> - <string name="Nostril Width"> - Ventana: ancho - </string> - <string name="Opaque"> - Opaco - </string> - <string name="Open"> - Abrir - </string> - <string name="Open Back"> - Apertura trasera - </string> - <string name="Open Front"> - Apertura frontal - </string> - <string name="Open Left"> - Abierta - </string> - <string name="Open Right"> - Abierta - </string> - <string name="Orange"> - Anaranjado - </string> - <string name="Out"> - De soplillo - </string> - <string name="Out Shdw Color"> - Sombra de ojos: color - </string> - <string name="Out Shdw Opacity"> - Sombra de ojos: opacidad - </string> - <string name="Outer Eye Corner"> - Ojos: comisura - </string> - <string name="Outer Eye Shadow"> - Outer Eye Shadow - </string> - <string name="Outer Shadow"> - Sombra de ojos - </string> - <string name="Overbite"> - RetraÃdo - </string> - <string name="Package"> - Pubis - </string> - <string name="Painted Nails"> - Pintadas - </string> - <string name="Pale"> - Pálida - </string> - <string name="Pants Crotch"> - Pantalón: cruz - </string> - <string name="Pants Fit"> - Ceñido - </string> - <string name="Pants Length"> - Pernera: largo - </string> - <string name="Pants Waist"> - Caja - </string> - <string name="Pants Wrinkles"> - Pantalón: arrugas - </string> - <string name="Part"> - Raya - </string> - <string name="Part Bangs"> - Flequillo partido - </string> - <string name="Pectorals"> - Pectorales - </string> - <string name="Pigment"> - Tono - </string> - <string name="Pigtails"> - Coletas - </string> - <string name="Pink"> - Rosa - </string> - <string name="Pinker"> - Más sonrosados - </string> - <string name="Platform Height"> - Suela: altura - </string> - <string name="Platform Width"> - Suela: ancho - </string> - <string name="Pointy"> - En punta - </string> - <string name="Pointy Heels"> - De aguja - </string> - <string name="Ponytail"> - Cola de caballo - </string> - <string name="Poofy Skirt"> - Con vuelo - </string> - <string name="Pop Left Eye"> - Izquierdo más grande - </string> - <string name="Pop Right Eye"> - Derecho más grande - </string> - <string name="Puffy"> - Hinchadas - </string> - <string name="Puffy Eyelids"> - Ojeras - </string> - <string name="Rainbow Color"> - Irisación - </string> - <string name="Red Hair"> - Pelirrojo - </string> - <string name="Regular"> - Regular - </string> - <string name="Right Part"> - Raya: der. - </string> - <string name="Rosy Complexion"> - Tez sonrosada - </string> - <string name="Round"> - Redondear - </string> - <string name="Ruddiness"> - Rubicundez - </string> - <string name="Ruddy"> - Rojiza - </string> - <string name="Rumpled Hair"> - Pelo encrespado - </string> - <string name="Saddle Bags"> - Cartucheras - </string> - <string name="Scrawny Leg"> - Piernas flacas - </string> - <string name="Separate"> - Más ancho - </string> - <string name="Shallow"> - Sin marcar - </string> - <string name="Shear Back"> - Nuca: corte - </string> - <string name="Shear Face"> - Shear Face - </string> - <string name="Shear Front"> - Shear Front - </string> - <string name="Shear Left Up"> - Arriba - izq. - </string> - <string name="Shear Right Up"> - Arriba - der. - </string> - <string name="Sheared Back"> - Rapada - </string> - <string name="Sheared Front"> - Rapada - </string> - <string name="Shift Left"> - A la izq. - </string> - <string name="Shift Mouth"> - Boca: ladeada - </string> - <string name="Shift Right"> - A la der. - </string> - <string name="Shirt Bottom"> - Alto de cintura - </string> - <string name="Shirt Fit"> - Ceñido - </string> - <string name="Shirt Wrinkles"> - Camisa: arrugas - </string> - <string name="Shoe Height"> - Caña: altura - </string> - <string name="Short"> - Menos - </string> - <string name="Short Arms"> - Brazos cortos - </string> - <string name="Short Legs"> - Piernas cortas - </string> - <string name="Short Neck"> - Cuello corto - </string> - <string name="Short Pigtails"> - Coletas cortas - </string> - <string name="Short Ponytail"> - Cola de caballo corta - </string> - <string name="Short Sideburns"> - Patillas cortas - </string> - <string name="Short Torso"> - Torso corto - </string> - <string name="Short hips"> - Cadera corta - </string> - <string name="Shoulders"> - Hombros - </string> - <string name="Side Fringe"> - Lados: franja - </string> - <string name="Sideburns"> - Patillas - </string> - <string name="Sides Hair"> - Pelo: lados - </string> - <string name="Sides Hair Down"> - Bajar lados del pelo - </string> - <string name="Sides Hair Up"> - Subir lados del pelo - </string> - <string name="Skinny Neck"> - Cuello estrecho - </string> - <string name="Skirt Fit"> - Falda: vuelo - </string> - <string name="Skirt Length"> - Falda: largo - </string> - <string name="Slanted Forehead"> - Slanted Forehead - </string> - <string name="Sleeve Length"> - Largo de manga - </string> - <string name="Sleeve Looseness"> - Ancho de puños - </string> - <string name="Slit Back"> - Raja trasera - </string> - <string name="Slit Front"> - Raja frontal - </string> - <string name="Slit Left"> - Raja a la izq. - </string> - <string name="Slit Right"> - Raja a la der. - </string> - <string name="Small"> - Disminuir - </string> - <string name="Small Hands"> - Manos pequeñas - </string> - <string name="Small Head"> - Cabeza pequeña - </string> - <string name="Smooth"> - Leves - </string> - <string name="Smooth Hair"> - Pelo liso - </string> - <string name="Socks Length"> - Calcetines: largo - </string> - <string name="Soulpatch"> - Perilla - </string> - <string name="Sparse"> - Depiladas - </string> - <string name="Spiked Hair"> - Crestas - </string> - <string name="Square"> - Cuadrada - </string> - <string name="Square Toe"> - Punta cuadrada - </string> - <string name="Squash Head"> - Cabeza aplastada - </string> - <string name="Stretch Head"> - Cabeza estirada - </string> - <string name="Sunken"> - Chupadas - </string> - <string name="Sunken Chest"> - Estrecho de pecho - </string> - <string name="Sunken Eyes"> - Ojos hundidos - </string> - <string name="Sweep Back"> - Sweep Back - </string> - <string name="Sweep Forward"> - Sweep Forward - </string> - <string name="Tall"> - Más - </string> - <string name="Taper Back"> - Cubierta trasera - </string> - <string name="Taper Front"> - Cubierta frontal - </string> - <string name="Thick Heels"> - Tacones grandes - </string> - <string name="Thick Neck"> - Cuello ancho - </string> - <string name="Thick Toe"> - Empeine alto - </string> - <string name="Thin"> - Delgadas - </string> - <string name="Thin Eyebrows"> - Cejas finas - </string> - <string name="Thin Lips"> - Hacia dentro - </string> - <string name="Thin Nose"> - Nariz fina - </string> - <string name="Tight Chin"> - Poca papada - </string> - <string name="Tight Cuffs"> - Sin campana - </string> - <string name="Tight Pants"> - Pantalón ceñido - </string> - <string name="Tight Shirt"> - Camisa ceñida - </string> - <string name="Tight Skirt"> - Falda ceñida - </string> - <string name="Tight Sleeves"> - Puños ceñidos - </string> - <string name="Toe Shape"> - Punta: forma - </string> - <string name="Toe Thickness"> - Empeine - </string> - <string name="Torso Length"> - Torso: longitud - </string> - <string name="Torso Muscles"> - Torso: musculatura - </string> - <string name="Torso Scrawny"> - Torso flacucho - </string> - <string name="Unattached"> - Largos - </string> - <string name="Uncreased"> - Abiertos - </string> - <string name="Underbite"> - Prognatismo - </string> - <string name="Unnatural"> - No natural - </string> - <string name="Upper Bridge"> - Puente: arriba - </string> - <string name="Upper Cheeks"> - Mejillas: arriba - </string> - <string name="Upper Chin Cleft"> - Barbilla: prominencia - </string> - <string name="Upper Eyelid Fold"> - Párpados - </string> - <string name="Upturned"> - Mucho - </string> - <string name="Very Red"> - Del todo - </string> - <string name="Waist Height"> - Cintura - </string> - <string name="Well-Fed"> - Mofletes - </string> - <string name="White Hair"> - Pelo blanco - </string> - <string name="Wide"> - Aumentar - </string> - <string name="Wide Back"> - Completa - </string> - <string name="Wide Front"> - Completa - </string> - <string name="Wide Lips"> - Labios anchos - </string> - <string name="Wild"> - Total - </string> - <string name="Wrinkles"> - Arrugas - </string> - <string name="LocationCtrlAddLandmarkTooltip"> - Añadir a mis hitos - </string> - <string name="LocationCtrlEditLandmarkTooltip"> - Editar mis hitos - </string> - <string name="LocationCtrlInfoBtnTooltip"> - Ver más información de esta localización - </string> - <string name="LocationCtrlComboBtnTooltip"> - Historial de mis localizaciones - </string> - <string name="LocationCtrlAdultIconTooltip"> - Región Adulta - </string> - <string name="LocationCtrlModerateIconTooltip"> - Región Moderada - </string> - <string name="LocationCtrlGeneralIconTooltip"> - Región General - </string> - <string name="UpdaterWindowTitle"> - Actualizar [APP_NAME] - </string> - <string name="UpdaterNowUpdating"> - Actualizando [APP_NAME]... - </string> - <string name="UpdaterNowInstalling"> - Instalando [APP_NAME]... - </string> - <string name="UpdaterUpdatingDescriptive"> - Tu visor [APP_NAME] se está actualizando a la última versión. Llevará algún tiempo, paciencia. - </string> - <string name="UpdaterProgressBarTextWithEllipses"> - Descargando la actualización... - </string> - <string name="UpdaterProgressBarText"> - Descargando la actualización - </string> - <string name="UpdaterFailDownloadTitle"> - Fallo en la descarga de la actualización - </string> - <string name="UpdaterFailUpdateDescriptive"> - Ha habido un error actualizando [APP_NAME]. Por favor, descarga la última versión desde www.secondlife.com. - </string> - <string name="UpdaterFailInstallTitle"> - Fallo al instalar la actualización - </string> - <string name="UpdaterFailStartTitle"> - Fallo al iniciar el visor - </string> - <string name="ItemsComingInTooFastFrom"> - [APP_NAME]: Los Ãtems se reciben muy rápido de [FROM_NAME]; desactivada la vista previa automática durante [TIME] sgs. - </string> - <string name="ItemsComingInTooFast"> - [APP_NAME]: Los Ãtems se reciben muy rápido; desactivada la vista previa automática durante [TIME] sgs. - </string> - <string name="IM_logging_string"> - -- Activado el registro de los mensajes instantáneos -- - </string> - <string name="IM_typing_start_string"> - [NAME] está escribiendo... - </string> - <string name="Unnamed"> - (sin nombre) - </string> - <string name="IM_moderated_chat_label"> - (Moderado: por defecto, desactivada la voz) - </string> - <string name="IM_unavailable_text_label"> - Para esta llamada no está disponible el chat de texto. - </string> - <string name="IM_muted_text_label"> - Un moderador del grupo ha desactivado tu chat de texto. - </string> - <string name="IM_default_text_label"> - Pulsa aquà para enviar un mensaje instantáneo. - </string> - <string name="IM_to_label"> - A - </string> - <string name="IM_moderator_label"> - (Moderador) - </string> - <string name="Saved_message"> - (Guardado [LONG_TIMESTAMP]) - </string> - <string name="answered_call"> - Han respondido a tu llamada - </string> - <string name="you_started_call"> - Has iniciado una llamada de voz - </string> - <string name="you_joined_call"> - Has entrado en la llamada de voz - </string> - <string name="name_started_call"> - [NAME] inició una llamada de voz - </string> - <string name="ringing-im"> - Haciendo la llamada de voz... - </string> - <string name="connected-im"> - Conectado, pulsa Colgar para salir - </string> - <string name="hang_up-im"> - Se colgó la llamada de voz - </string> - <string name="conference-title-incoming"> - Conferencia con [AGENT_NAME] - </string> - <string name="no_session_message"> - (La sesión de MI no existe) - </string> - <string name="only_user_message"> - Usted es el único usuario en esta sesión. - </string> - <string name="offline_message"> - [NAME] está desconectado. - </string> - <string name="invite_message"> - Pulse el botón [BUTTON NAME] para aceptar/conectar este chat de voz. - </string> - <string name="muted_message"> - Has ignorado a este residente. Enviándole un mensaje, automáticamente dejarás de ignorarle. - </string> - <string name="generic"> - Error en lo solicitado, por favor, inténtalo más tarde. - </string> - <string name="generic_request_error"> - Error al hacer lo solicitado; por favor, inténtelo más tarde. - </string> - <string name="insufficient_perms_error"> - Usted no tiene permisos suficientes. - </string> - <string name="session_does_not_exist_error"> - La sesión ya acabó - </string> - <string name="no_ability_error"> - Usted no tiene esa capacidad. - </string> - <string name="no_ability"> - Usted no tiene esa capacidad. - </string> - <string name="not_a_mod_error"> - Usted no es un moderador de la sesión. - </string> - <string name="muted"> - Un moderador del grupo ha desactivado tu chat de texto. - </string> - <string name="muted_error"> - Un moderador del grupo le ha desactivado el chat de texto. - </string> - <string name="add_session_event"> - No se ha podido añadir usuarios a la sesión de chat con [RECIPIENT]. - </string> - <string name="message"> - No se ha podido enviar tu mensaje a la sesión de chat con [RECIPIENT]. - </string> - <string name="message_session_event"> - No se ha podido enviar su mensaje a la sesión de chat con [RECIPIENT]. - </string> - <string name="mute"> - Error moderando. - </string> - <string name="removed"> - Se te ha sacado del grupo. - </string> - <string name="removed_from_group"> - Ha sido eliminado del grupo. - </string> - <string name="close_on_no_ability"> - Usted ya no tendrá más la capacidad de estar en la sesión de chat. - </string> - <string name="unread_chat_single"> - [SOURCES] ha dicho algo nuevo - </string> - <string name="unread_chat_multiple"> - [SOURCES] ha dicho algo nuevo - </string> - <string name="session_initialization_timed_out_error"> - Se ha agotado el tiempo del inicio de sesión - </string> - <string name="voice_morphing_url"> - http://secondlife.com/landing/voicemorphing - </string> - <string name="paid_you_ldollars"> - [NAME] te ha pagado [AMOUNT] L$ [REASON]. - </string> - <string name="paid_you_ldollars_no_reason"> - [NAME] te ha pagado [AMOUNT] L$. - </string> - <string name="you_paid_ldollars"> - Has pagado [AMOUNT] L$ a [NAME] por [REASON]. - </string> - <string name="you_paid_ldollars_no_info"> - Has pagado[AMOUNT] L$ - </string> - <string name="you_paid_ldollars_no_reason"> - Has pagado [AMOUNT] L$ a [NAME]. - </string> - <string name="you_paid_ldollars_no_name"> - Has pagado [AMOUNT] L$ por [REASON]. - </string> - <string name="for item"> - para [ITEM] - </string> - <string name="for a parcel of land"> - para una parcela de terreno - </string> - <string name="for a land access pass"> - para un pase de acceso a terrenos - </string> - <string name="for deeding land"> - for deeding land - </string> - <string name="to create a group"> - para crear un grupo - </string> - <string name="to join a group"> - para entrar a un grupo - </string> - <string name="to upload"> - to upload - </string> - <string name="to publish a classified ad"> - para publicar un anuncio clasificado - </string> - <string name="giving"> - Dando [AMOUNT] L$ - </string> - <string name="uploading_costs"> - Subir esto cuesta [AMOUNT] L$ - </string> - <string name="this_costs"> - Esto cuesta [AMOUNT] L$ - </string> - <string name="buying_selected_land"> - Compra del terreno seleccionado por [AMOUNT] L$ - </string> - <string name="this_object_costs"> - Este objeto cuesta [AMOUNT] L$ - </string> - <string name="group_role_everyone"> - Todos - </string> - <string name="group_role_officers"> - Oficiales - </string> - <string name="group_role_owners"> - Propietarios - </string> - <string name="group_member_status_online"> - Conectado/a - </string> - <string name="uploading_abuse_report"> - Subiendo... - -Denuncia de infracción - </string> - <string name="New Shape"> - AnatomÃa nueva - </string> - <string name="New Skin"> - Piel nueva - </string> - <string name="New Hair"> - Pelo nuevo - </string> - <string name="New Eyes"> - Ojos nuevos - </string> - <string name="New Shirt"> - Camisa nueva - </string> - <string name="New Pants"> - Pantalón nuevo - </string> - <string name="New Shoes"> - Zapatos nuevos - </string> - <string name="New Socks"> - Calcetines nuevos - </string> - <string name="New Jacket"> - Chaqueta nueva - </string> - <string name="New Gloves"> - Guantes nuevos - </string> - <string name="New Undershirt"> - Camiseta nueva - </string> - <string name="New Underpants"> - Ropa interior nueva - </string> - <string name="New Skirt"> - Falda nueva - </string> - <string name="New Alpha"> - Nueva Alfa - </string> - <string name="New Tattoo"> - Tatuaje nuevo - </string> - <string name="New Physics"> - Nueva fÃsica - </string> - <string name="Invalid Wearable"> - No se puede poner - </string> - <string name="New Gesture"> - Gesto nuevo - </string> - <string name="New Script"> - Script nuevo - </string> - <string name="New Note"> - Nota nueva - </string> - <string name="New Folder"> - Carpeta nueva - </string> - <string name="Contents"> - Contenidos - </string> - <string name="Gesture"> - Gestos - </string> - <string name="Male Gestures"> - Gestos de hombre - </string> - <string name="Female Gestures"> - Gestos de mujer - </string> - <string name="Other Gestures"> - Otros gestos - </string> - <string name="Speech Gestures"> - Gestos al hablar - </string> - <string name="Common Gestures"> - Gestos corrientes - </string> - <string name="Male - Excuse me"> - Varón - Disculpa - </string> - <string name="Male - Get lost"> - Varón – Déjame en paz - </string> - <string name="Male - Blow kiss"> - Varón - Lanzar un beso - </string> - <string name="Male - Boo"> - Varón - Abucheo - </string> - <string name="Male - Bored"> - Varón - Aburrido - </string> - <string name="Male - Hey"> - Varón – ¡Eh! - </string> - <string name="Male - Laugh"> - Varón - Risa - </string> - <string name="Male - Repulsed"> - Varón - Rechazo - </string> - <string name="Male - Shrug"> - Varón - Encogimiento de hombros - </string> - <string name="Male - Stick tougue out"> - Varón - Sacando la lengua - </string> - <string name="Male - Wow"> - Varón - Admiración - </string> - <string name="Female - Chuckle"> - Mujer - Risa suave - </string> - <string name="Female - Cry"> - Mujer - Llorar - </string> - <string name="Female - Embarrassed"> - Mujer - Ruborizada - </string> - <string name="Female - Excuse me"> - Mujer - Disculpa - </string> - <string name="Female - Get lost"> - Mujer – Déjame en paz - </string> - <string name="Female - Blow kiss"> - Mujer - Lanzar un beso - </string> - <string name="Female - Boo"> - Mujer - Abucheo - </string> - <string name="Female - Bored"> - Mujer - Aburrida - </string> - <string name="Female - Hey"> - Mujer - ¡Eh! - </string> - <string name="Female - Hey baby"> - Mujer - ¡Eh, encanto! - </string> - <string name="Female - Laugh"> - Mujer - Risa - </string> - <string name="Female - Looking good"> - Mujer - Buen aspecto - </string> - <string name="Female - Over here"> - Mujer - Por aquà - </string> - <string name="Female - Please"> - Mujer - Por favor - </string> - <string name="Female - Repulsed"> - Mujer - Rechazo - </string> - <string name="Female - Shrug"> - Mujer - Encogimiento de hombros - </string> - <string name="Female - Stick tougue out"> - Mujer - Sacando la lengua - </string> - <string name="Female - Wow"> - Mujer - Admiración - </string> - <string name="AvatarBirthDateFormat"> - [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt] - </string> - <string name="DefaultMimeType"> - ninguno/ninguno - </string> - <string name="texture_load_dimensions_error"> - No se puede subir imágenes mayores de [WIDTH]*[HEIGHT] - </string> - <string name="words_separator" value=","/> - <string name="server_is_down"> - Parece que hay algún problema que ha escapado a nuestros controles. - - Visita status.secondlifegrid.net para ver si hay alguna incidencia conocida que esté afectando al servicio. - Si sigues teniendo problemas, comprueba la configuración de la red y del servidor de seguridad. - </string> - <string name="dateTimeWeekdaysNames"> - Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado - </string> - <string name="dateTimeWeekdaysShortNames"> - Dom:Lun:Mar:Mié:Jue:Vie:Sáb - </string> - <string name="dateTimeMonthNames"> - Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Septiembre:Octubre:Noviembre:Diciembre - </string> - <string name="dateTimeMonthShortNames"> - Ene:Feb:Mar:Abr:May:Jun:Jul:Ago:Sep:Oct:Nov:Dic - </string> - <string name="dateTimeDayFormat"> - [MDAY] - </string> - <string name="dateTimeAM"> - AM - </string> - <string name="dateTimePM"> - PM - </string> - <string name="LocalEstimateUSD"> - [AMOUNT] US$ - </string> - <string name="Membership"> - MembresÃa - </string> - <string name="Roles"> - Roles - </string> - <string name="Group Identity"> - Indentidad de grupo - </string> - <string name="Parcel Management"> - Gestión de la parcela - </string> - <string name="Parcel Identity"> - Identidad de la parcela - </string> - <string name="Parcel Settings"> - Configuración de la parcela - </string> - <string name="Parcel Powers"> - Poder de la parcela - </string> - <string name="Parcel Access"> - Acceso a la parcela - </string> - <string name="Parcel Content"> - Contenido de la parcela - </string> - <string name="Object Management"> - Manejo de objetos - </string> - <string name="Accounting"> - Contabilidad - </string> - <string name="Notices"> - Avisos - </string> - <string name="Chat" value="Chat :"> - Chat - </string> - <string name="DeleteItems"> - ¿Deseas eliminar los elementos seleccionados? - </string> - <string name="DeleteItem"> - ¿Deseas eliminar el elemento seleccionado? - </string> - <string name="EmptyOutfitText"> - No hay elementos en este vestuario - </string> - <string name="ExternalEditorNotSet"> - Selecciona un editor mediante la configuración de ExternalEditor. - </string> - <string name="ExternalEditorNotFound"> - No se encuentra el editor externo especificado. -Inténtalo incluyendo la ruta de acceso al editor entre comillas -(por ejemplo, "/ruta a mi/editor" "%s"). - </string> - <string name="ExternalEditorCommandParseError"> - Error al analizar el comando de editor externo. - </string> - <string name="ExternalEditorFailedToRun"> - Error al ejecutar el editor externo. - </string> - <string name="Esc"> - Esc - </string> - <string name="Space"> - Space - </string> - <string name="Enter"> - Enter - </string> - <string name="Tab"> - Tab - </string> - <string name="Ins"> - Ins - </string> - <string name="Del"> - Del - </string> - <string name="Backsp"> - Backsp - </string> - <string name="Shift"> - Shift - </string> - <string name="Ctrl"> - Ctrl - </string> - <string name="Alt"> - Alt - </string> - <string name="CapsLock"> - CapsLock - </string> - <string name="Home"> - Base - </string> - <string name="End"> - End - </string> - <string name="PgUp"> - PgUp - </string> - <string name="PgDn"> - PgDn - </string> - <string name="F1"> - F1 - </string> - <string name="F2"> - F2 - </string> - <string name="F3"> - F3 - </string> - <string name="F4"> - F4 - </string> - <string name="F5"> - F5 - </string> - <string name="F6"> - F6 - </string> - <string name="F7"> - F7 - </string> - <string name="F8"> - F8 - </string> - <string name="F9"> - F9 - </string> - <string name="F10"> - F10 - </string> - <string name="F11"> - F11 - </string> - <string name="F12"> - F12 - </string> - <string name="Add"> - Añadir - </string> - <string name="Subtract"> - Restar - </string> - <string name="Multiply"> - Multiplicar - </string> - <string name="Divide"> - Dividir - </string> - <string name="PAD_DIVIDE"> - PAD_DIVIDE - </string> - <string name="PAD_LEFT"> - PAD_LEFT - </string> - <string name="PAD_RIGHT"> - PAD_RIGHT - </string> - <string name="PAD_DOWN"> - PAD_DOWN - </string> - <string name="PAD_UP"> - PAD_UP - </string> - <string name="PAD_HOME"> - PAD_HOME - </string> - <string name="PAD_END"> - PAD_END - </string> - <string name="PAD_PGUP"> - PAD_PGUP - </string> - <string name="PAD_PGDN"> - PAD_PGDN - </string> - <string name="PAD_CENTER"> - PAD_CENTER - </string> - <string name="PAD_INS"> - PAD_INS - </string> - <string name="PAD_DEL"> - PAD_DEL - </string> - <string name="PAD_Enter"> - PAD_Enter - </string> - <string name="PAD_BUTTON0"> - PAD_BUTTON0 - </string> - <string name="PAD_BUTTON1"> - PAD_BUTTON1 - </string> - <string name="PAD_BUTTON2"> - PAD_BUTTON2 - </string> - <string name="PAD_BUTTON3"> - PAD_BUTTON3 - </string> - <string name="PAD_BUTTON4"> - PAD_BUTTON4 - </string> - <string name="PAD_BUTTON5"> - PAD_BUTTON5 - </string> - <string name="PAD_BUTTON6"> - PAD_BUTTON6 - </string> - <string name="PAD_BUTTON7"> - PAD_BUTTON7 - </string> - <string name="PAD_BUTTON8"> - PAD_BUTTON8 - </string> - <string name="PAD_BUTTON9"> - PAD_BUTTON9 - </string> - <string name="PAD_BUTTON10"> - PAD_BUTTON10 - </string> - <string name="PAD_BUTTON11"> - PAD_BUTTON11 - </string> - <string name="PAD_BUTTON12"> - PAD_BUTTON12 - </string> - <string name="PAD_BUTTON13"> - PAD_BUTTON13 - </string> - <string name="PAD_BUTTON14"> - PAD_BUTTON14 - </string> - <string name="PAD_BUTTON15"> - PAD_BUTTON15 - </string> - <string name="-"> - - - </string> - <string name="="> - = - </string> - <string name="`"> - ` - </string> - <string name=";"> - ; - </string> - <string name="["> - [ - </string> - <string name="]"> - ] - </string> - <string name="\"> - \ - </string> - <string name="0"> - 0 - </string> - <string name="1"> - 1 - </string> - <string name="2"> - 2 - </string> - <string name="3"> - 3 - </string> - <string name="4"> - 4 - </string> - <string name="5"> - 5 - </string> - <string name="6"> - 6 - </string> - <string name="7"> - 7 - </string> - <string name="8"> - 8 - </string> - <string name="9"> - 9 - </string> - <string name="A"> - A - </string> - <string name="B"> - B - </string> - <string name="C"> - C - </string> - <string name="D"> - D - </string> - <string name="E"> - E - </string> - <string name="F"> - F - </string> - <string name="G"> - G - </string> - <string name="H"> - H - </string> - <string name="I"> - I - </string> - <string name="J"> - J - </string> - <string name="K"> - K - </string> - <string name="L"> - L - </string> - <string name="M"> - M - </string> - <string name="N"> - N - </string> - <string name="O"> - O - </string> - <string name="P"> - P - </string> - <string name="Q"> - Q - </string> - <string name="R"> - R - </string> - <string name="S"> - S - </string> - <string name="T"> - T - </string> - <string name="U"> - U - </string> - <string name="V"> - V - </string> - <string name="W"> - W - </string> - <string name="X"> - X - </string> - <string name="Y"> - Y - </string> - <string name="Z"> - Z - </string> - <string name="BeaconParticle"> - Viendo balizas de partÃculas (azules) - </string> - <string name="BeaconPhysical"> - Viendo balizas de objetos materiales (verdes) - </string> - <string name="BeaconScripted"> - Viendo balizas de objetos con script (rojas) - </string> - <string name="BeaconScriptedTouch"> - Viendo el objeto con script con balizas de función táctil (rojas) - </string> - <string name="BeaconSound"> - Viendo balizas de sonido (amarillas) - </string> - <string name="BeaconMedia"> - Viendo balizas de medios (blancas) - </string> - <string name="ParticleHiding"> - Ocultando las partÃculas - </string> -</strings> +<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- This file contains strings that used to be hardcoded in the source.
+ It is only for those strings which do not belong in a floater.
+ For example, the strings used in avatar chat bubbles, and strings
+ that are returned from one component and may appear in many places-->
+<strings>
+ <string name="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
+ <string name="SUPPORT_SITE">
+ Portal de Soporte de Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Identificando el hardware...
+ </string>
+ <string name="StartupLoading">
+ Instalando [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ Limpiando la caché...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Iniciando la caché de las texturas...
+ </string>
+ <string name="StartupInitializingVFS">
+ Iniciando VFS...
+ </string>
+ <string name="ProgressRestoring">
+ Restaurando...
+ </string>
+ <string name="ProgressChangingResolution">
+ Cambiando la resolución...
+ </string>
+ <string name="LoginInProgress">
+ Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Iniciando la sesión...
+ </string>
+ <string name="LoginAuthenticating">
+ Autenticando
+ </string>
+ <string name="LoginMaintenance">
+ Realizando el mantenimiento de la cuenta...
+ </string>
+ <string name="LoginAttempt">
+ Ha fallado el intento previo de iniciar sesión. Iniciando sesión, intento [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ Cargando el mundo...
+ </string>
+ <string name="LoginInitializingBrowser">
+ Iniciando el navegador web incorporado...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Iniciando multimedia...
+ </string>
+ <string name="LoginInitializingFonts">
+ Cargando las fuentes...
+ </string>
+ <string name="LoginVerifyingCache">
+ Comprobando los archivos de la caché (puede tardar entre 60 y 90 segundos)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Procesando la respuesta...
+ </string>
+ <string name="LoginInitializingWorld">
+ Iniciando el mundo...
+ </string>
+ <string name="LoginDecodingImages">
+ Decodificando las imágenes...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ Iniciando QuickTime...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ No se ha encontrado QuickTime. Imposible iniciarlo.
+ </string>
+ <string name="LoginQuicktimeOK">
+ QuickTime se ha iniciado adecuadamente.
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ Esperando la conexión con la región...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Conectando con la región...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Descargando la ropa...
+ </string>
+ <string name="InvalidCertificate">
+ El servidor devolvió un certificado no válido o dañado. Ponte en contacto con el administrador de la cuadrÃcula.
+ </string>
+ <string name="CertInvalidHostname">
+ El nombre de host utilizado para acceder al servidor no es válido. Comprueba tu SLURL o el nombre de host de la cuadrÃcula.
+ </string>
+ <string name="CertExpired">
+ Parece que el certificado que devolvió la cuadrÃcula está caducado. Comprueba el reloj del sistema o consulta al administrador de la cuadrÃcula.
+ </string>
+ <string name="CertKeyUsage">
+ El certificado que devolvió el servidor no puede utilizarse para SSL. Ponte en contacto con el administrador de la cuadrÃcula.
+ </string>
+ <string name="CertBasicConstraints">
+ La cadena de certificado del servidor contenÃa demasiados certificados. Ponte en contacto con el administrador de la cuadrÃcula.
+ </string>
+ <string name="CertInvalidSignature">
+ No se pudo verificar la firma del certificado devuelta por el servidor de la cuadrÃcula. Ponte en contacto con el administrador de la cuadrÃcula.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Error de red: no se ha podido conectar; por favor, revisa tu conexión a Internet.
+ </string>
+ <string name="LoginFailed">
+ Error en el inicio de sesión.
+ </string>
+ <string name="Quit">
+ Salir
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/index.php?lang=es-ES
+ </string>
+ <string name="AgentLostConnection">
+ Esta región puede estar teniendo problemas. Por favor, comprueba tu conexión a Internet.
+ </string>
+ <string name="SavingSettings">
+ Guardando tus configuraciones...
+ </string>
+ <string name="LoggingOut">
+ Cerrando sesión...
+ </string>
+ <string name="ShuttingDown">
+ Cerrando...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Has sido desconectado de la región en la que estabas.
+ </string>
+ <string name="SentToInvalidRegion">
+ Has sido enviado a una región no válida.
+ </string>
+ <string name="TestingDisconnect">
+ Probando la desconexión del visor
+ </string>
+ <string name="TooltipPerson">
+ Persona
+ </string>
+ <string name="TooltipNoName">
+ (sin nombre)
+ </string>
+ <string name="TooltipOwner">
+ Propietario:
+ </string>
+ <string name="TooltipPublic">
+ Público
+ </string>
+ <string name="TooltipIsGroup">
+ (Grupo)
+ </string>
+ <string name="TooltipForSaleL$">
+ En venta: [AMOUNT] L$
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Construir el grupo
+ </string>
+ <string name="TooltipFlagNoBuild">
+ No construir
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Construir el grupo
+ </string>
+ <string name="TooltipFlagNotSafe">
+ No seguro
+ </string>
+ <string name="TooltipFlagNoFly">
+ No volar
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Scripts el grupo
+ </string>
+ <string name="TooltipFlagNoScripts">
+ No scripts
+ </string>
+ <string name="TooltipLand">
+ Terreno:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Aquà se puede arrastrar sólo un Ãtem
+ </string>
+ <string name="TooltipPrice" value="[AMOUNT] L$:"/>
+ <string name="TooltipHttpUrl">
+ Pulsa para ver esta página web
+ </string>
+ <string name="TooltipSLURL">
+ Pulsa para ver la información de este lugar
+ </string>
+ <string name="TooltipAgentUrl">
+ Pulsa para ver el perfil del Residente
+ </string>
+ <string name="TooltipAgentInspect">
+ Obtén más información acerca de este residente.
+ </string>
+ <string name="TooltipAgentMute">
+ Pulsa para silenciar a este Residente
+ </string>
+ <string name="TooltipAgentUnmute">
+ Pulsa para quitar el silencio a este Residente
+ </string>
+ <string name="TooltipAgentIM">
+ Pulsa para enviar un MI a este Residente
+ </string>
+ <string name="TooltipAgentPay">
+ Pulsa para pagar a este Residente
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Pulsa para enviar una petición de teleporte a este Residente
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Pulsa para enviar una petición de amistad a este Residente
+ </string>
+ <string name="TooltipGroupUrl">
+ Pulsa para ver la descripción de este grupo
+ </string>
+ <string name="TooltipEventUrl">
+ Pulsa para ver la descripción de este evento
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Pulsa para ver este clasificado
+ </string>
+ <string name="TooltipParcelUrl">
+ Pulsa para ver la descripción de esta parcela
+ </string>
+ <string name="TooltipTeleportUrl">
+ Pulsa para teleportarte a esta posición
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Pulsa para ver la descripción de este objeto
+ </string>
+ <string name="TooltipMapUrl">
+ Pulsa para ver en el mapa esta localización
+ </string>
+ <string name="TooltipSLAPP">
+ Pulsa para ejecutar el comando secondlife://
+ </string>
+ <string name="CurrentURL" value="URL actual: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Teleportarse a
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Mostrarla en el mapa
+ </string>
+ <string name="SLappAgentMute">
+ Silenciar
+ </string>
+ <string name="SLappAgentUnmute">
+ Quitar el silencio
+ </string>
+ <string name="SLappAgentIM">
+ MI
+ </string>
+ <string name="SLappAgentPay">
+ Pagar
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Ofrecer teleporte a
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Petición de amistad
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Cerrar (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Cerrar (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Cerrar
+ </string>
+ <string name="BUTTON_RESTORE">
+ Maximizar
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimizar
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Separar la ventana
+ </string>
+ <string name="BUTTON_DOCK">
+ Fijar
+ </string>
+ <string name="BUTTON_HELP">
+ Ver la Ayuda
+ </string>
+ <string name="Searching">
+ Buscando...
+ </string>
+ <string name="NoneFound">
+ No se ha encontrado.
+ </string>
+ <string name="RetrievingData">
+ Reintentando...
+ </string>
+ <string name="ReleaseNotes">
+ Notas de la versión
+ </string>
+ <string name="RELEASE_NOTES_BASE_URL">
+ http://wiki.secondlife.com/wiki/Release_Notes/
+ </string>
+ <string name="LoadingData">
+ Cargando...
+ </string>
+ <string name="AvatarNameNobody">
+ (nadie)
+ </string>
+ <string name="AvatarNameWaiting">
+ (esperando)
+ </string>
+ <string name="GroupNameNone">
+ (ninguno)
+ </string>
+ <string name="AvalineCaller">
+ Avaline: [ORDER]
+ </string>
+ <string name="AssetErrorNone">
+ No hay ningún error
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Petición de asset: fallida
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Petición de asset: el archivo no existe
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Petición de asset: no se encontró el asset en la base de datos
+ </string>
+ <string name="AssetErrorEOF">
+ Fin del archivo
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ No puede abrirse el archivo
+ </string>
+ <string name="AssetErrorFileNotFound">
+ No se ha encontrado el archivo
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Tiempo de transferencia del archivo
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Circuito desconectado
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ No concuerda el precio en el visor y en el servidor
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ Estado desconocido
+ </string>
+ <string name="texture">
+ la textura
+ </string>
+ <string name="sound">
+ el sonido
+ </string>
+ <string name="calling card">
+ la tarjeta de visita
+ </string>
+ <string name="landmark">
+ el hito
+ </string>
+ <string name="legacy script">
+ el script antiguo
+ </string>
+ <string name="clothing">
+ esa ropa
+ </string>
+ <string name="object">
+ el objeto
+ </string>
+ <string name="note card">
+ la nota
+ </string>
+ <string name="folder">
+ la carpeta
+ </string>
+ <string name="root">
+ la ruta
+ </string>
+ <string name="lsl2 script">
+ ese script de LSL2
+ </string>
+ <string name="lsl bytecode">
+ el código intermedio de LSL
+ </string>
+ <string name="tga texture">
+ esa textura tga
+ </string>
+ <string name="body part">
+ esa parte del cuerpo
+ </string>
+ <string name="snapshot">
+ la foto
+ </string>
+ <string name="lost and found">
+ Objetos Perdidos
+ </string>
+ <string name="targa image">
+ esa imagen targa
+ </string>
+ <string name="trash">
+ la Papelera
+ </string>
+ <string name="jpeg image">
+ esa imagen jpeg
+ </string>
+ <string name="animation">
+ la animación
+ </string>
+ <string name="gesture">
+ el gesto
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ ese favorito
+ </string>
+ <string name="symbolic link">
+ el enlace
+ </string>
+ <string name="symbolic folder link">
+ enlace de la carpeta
+ </string>
+ <string name="AvatarAway">
+ Ausente
+ </string>
+ <string name="AvatarBusy">
+ Ocupado
+ </string>
+ <string name="AvatarMuted">
+ Ignorado
+ </string>
+ <string name="anim_express_afraid">
+ Susto
+ </string>
+ <string name="anim_express_anger">
+ Enfado
+ </string>
+ <string name="anim_away">
+ Ausente
+ </string>
+ <string name="anim_backflip">
+ Salto mortal atrás
+ </string>
+ <string name="anim_express_laugh">
+ Carcajada
+ </string>
+ <string name="anim_express_toothsmile">
+ Gran sonrisa
+ </string>
+ <string name="anim_blowkiss">
+ Mandar un beso
+ </string>
+ <string name="anim_express_bored">
+ Aburrimiento
+ </string>
+ <string name="anim_bow">
+ Reverencia
+ </string>
+ <string name="anim_clap">
+ Aplauso
+ </string>
+ <string name="anim_courtbow">
+ Reverencia floreada
+ </string>
+ <string name="anim_express_cry">
+ Llanto
+ </string>
+ <string name="anim_dance1">
+ Baile 1
+ </string>
+ <string name="anim_dance2">
+ Baile 2
+ </string>
+ <string name="anim_dance3">
+ Baile 3
+ </string>
+ <string name="anim_dance4">
+ Baile 4
+ </string>
+ <string name="anim_dance5">
+ Baile 5
+ </string>
+ <string name="anim_dance6">
+ Baile 6
+ </string>
+ <string name="anim_dance7">
+ Baile 7
+ </string>
+ <string name="anim_dance8">
+ Baile 8
+ </string>
+ <string name="anim_express_disdain">
+ Desdén
+ </string>
+ <string name="anim_drink">
+ Beber
+ </string>
+ <string name="anim_express_embarrased">
+ Azorarse
+ </string>
+ <string name="anim_angry_fingerwag">
+ Negar con el dedo
+ </string>
+ <string name="anim_fist_pump">
+ Éxito con el puño
+ </string>
+ <string name="anim_yoga_float">
+ Yoga flotando
+ </string>
+ <string name="anim_express_frown">
+ Fruncir el ceño
+ </string>
+ <string name="anim_impatient">
+ Impaciente
+ </string>
+ <string name="anim_jumpforjoy">
+ Salto de alegrÃa
+ </string>
+ <string name="anim_kissmybutt">
+ Bésame el culo
+ </string>
+ <string name="anim_express_kiss">
+ Besar
+ </string>
+ <string name="anim_laugh_short">
+ ReÃr
+ </string>
+ <string name="anim_musclebeach">
+ Sacar músculo
+ </string>
+ <string name="anim_no_unhappy">
+ No (con enfado)
+ </string>
+ <string name="anim_no_head">
+ No
+ </string>
+ <string name="anim_nyanya">
+ Ña-Ña-Ña
+ </string>
+ <string name="anim_punch_onetwo">
+ Puñetazo uno-dos
+ </string>
+ <string name="anim_express_open_mouth">
+ Abrir la boca
+ </string>
+ <string name="anim_peace">
+ 'V' con los dedos
+ </string>
+ <string name="anim_point_you">
+ Señalar a otro/a
+ </string>
+ <string name="anim_point_me">
+ Señalarse
+ </string>
+ <string name="anim_punch_l">
+ Puñetazo izquierdo
+ </string>
+ <string name="anim_punch_r">
+ Puñetazo derecho
+ </string>
+ <string name="anim_rps_countdown">
+ PPT cuenta
+ </string>
+ <string name="anim_rps_paper">
+ PPT papel
+ </string>
+ <string name="anim_rps_rock">
+ PPT piedra
+ </string>
+ <string name="anim_rps_scissors">
+ PPT tijera
+ </string>
+ <string name="anim_express_repulsed">
+ Repulsa
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Patada circular
+ </string>
+ <string name="anim_express_sad">
+ Triste
+ </string>
+ <string name="anim_salute">
+ Saludo militar
+ </string>
+ <string name="anim_shout">
+ Gritar
+ </string>
+ <string name="anim_express_shrug">
+ Encogerse de hombros
+ </string>
+ <string name="anim_express_smile">
+ SonreÃr
+ </string>
+ <string name="anim_smoke_idle">
+ Fumar: en la mano
+ </string>
+ <string name="anim_smoke_inhale">
+ Fumar
+ </string>
+ <string name="anim_smoke_throw_down">
+ Fumar: tirar el cigarro
+ </string>
+ <string name="anim_express_surprise">
+ Sorpresa
+ </string>
+ <string name="anim_sword_strike_r">
+ Estocadas
+ </string>
+ <string name="anim_angry_tantrum">
+ Berrinche
+ </string>
+ <string name="anim_express_tongue_out">
+ Sacar la lengua
+ </string>
+ <string name="anim_hello">
+ Agitar la mano
+ </string>
+ <string name="anim_whisper">
+ Cuchichear
+ </string>
+ <string name="anim_whistle">
+ Pitar
+ </string>
+ <string name="anim_express_wink">
+ Guiño
+ </string>
+ <string name="anim_wink_hollywood">
+ Guiño (Hollywood)
+ </string>
+ <string name="anim_express_worry">
+ Preocuparse
+ </string>
+ <string name="anim_yes_happy">
+ SÃ (contento)
+ </string>
+ <string name="anim_yes_head">
+ SÃ
+ </string>
+ <string name="texture_loading">
+ Cargando...
+ </string>
+ <string name="worldmap_offline">
+ Sin conexión
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [PRICE] L$ por [AREA] m²
+ </string>
+ <string name="worldmap_results_none_found">
+ No se ha encontrado.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Fin prematuro del archivo
+ </string>
+ <string name="ST_NO_JOINT">
+ No se puede encontrar ROOT o JOINT.
+ </string>
+ <string name="whisper">
+ susurra:
+ </string>
+ <string name="shout">
+ grita:
+ </string>
+ <string name="ringing">
+ Conectando al chat de voz...
+ </string>
+ <string name="connected">
+ Conectado
+ </string>
+ <string name="unavailable">
+ La voz no está disponible en su localización actual
+ </string>
+ <string name="hang_up">
+ Desconectado del chat de voz
+ </string>
+ <string name="reconnect_nearby">
+ Vas a ser reconectado al chat de voz con los cercanos
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ '[OBJECTNAME]', un objeto propiedad de '[OWNERNAME]', localizado en [REGIONNAME] con la posición [REGIONPOS], ha recibido permiso para: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ A '[OBJECTNAME]', un objeto propiedad de '[OWNERNAME]', localizado en [REGIONNAME] con la posición [REGIONPOS], se le ha denegado el permiso para: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Cogerle a usted dólares Linden (L$)
+ </string>
+ <string name="ActOnControlInputs">
+ Actuar en sus controles de entrada
+ </string>
+ <string name="RemapControlInputs">
+ Reconfigurar sus controles de entrada
+ </string>
+ <string name="AnimateYourAvatar">
+ Ejecutar animaciones en su avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Anexarse a su avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Anular la propiedad y que pase a ser público
+ </string>
+ <string name="LinkAndDelink">
+ Enlazar y desenlazar de otros objetos
+ </string>
+ <string name="AddAndRemoveJoints">
+ Añadir y quitar uniones con otros objetos
+ </string>
+ <string name="ChangePermissions">
+ Cambiar sus permisos
+ </string>
+ <string name="TrackYourCamera">
+ Seguir su cámara
+ </string>
+ <string name="ControlYourCamera">
+ Controlar su cámara
+ </string>
+ <string name="SIM_ACCESS_PG">
+ General
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Moderado
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ Adulto
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Desconectado
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ Desconocido
+ </string>
+ <string name="land_type_unknown">
+ (desconocido)
+ </string>
+ <string name="Estate / Full Region">
+ Estado /Región completa
+ </string>
+ <string name="Estate / Homestead">
+ Estado / Homestead
+ </string>
+ <string name="Mainland / Homestead">
+ Continente / Homestead
+ </string>
+ <string name="Mainland / Full Region">
+ Continente / Región completa
+ </string>
+ <string name="all_files">
+ Todos los archivos
+ </string>
+ <string name="sound_files">
+ Sonidos
+ </string>
+ <string name="animation_files">
+ Animaciones
+ </string>
+ <string name="image_files">
+ Imágenes
+ </string>
+ <string name="save_file_verb">
+ Guardar
+ </string>
+ <string name="load_file_verb">
+ Cargar
+ </string>
+ <string name="targa_image_files">
+ Imágenes Targa
+ </string>
+ <string name="bitmap_image_files">
+ Imágenes de mapa de bits
+ </string>
+ <string name="avi_movie_file">
+ Archivo de pelÃcula AVI
+ </string>
+ <string name="xaf_animation_file">
+ Archivo de anim. XAF
+ </string>
+ <string name="xml_file">
+ Archivo XML
+ </string>
+ <string name="raw_file">
+ Archivo RAW
+ </string>
+ <string name="compressed_image_files">
+ Imágenes comprimidas
+ </string>
+ <string name="load_files">
+ Cargar archivos
+ </string>
+ <string name="choose_the_directory">
+ Elegir directorio
+ </string>
+ <string name="AvatarSetNotAway">
+ Salir del estado ausente
+ </string>
+ <string name="AvatarSetAway">
+ Pasar al estado ausente
+ </string>
+ <string name="AvatarSetNotBusy">
+ Salir del estado ocupado
+ </string>
+ <string name="AvatarSetBusy">
+ Pasar al estado ocupado
+ </string>
+ <string name="shape">
+ Forma
+ </string>
+ <string name="skin">
+ Piel
+ </string>
+ <string name="hair">
+ Pelo
+ </string>
+ <string name="eyes">
+ Ojos
+ </string>
+ <string name="shirt">
+ Camisa
+ </string>
+ <string name="pants">
+ Pantalón
+ </string>
+ <string name="shoes">
+ Zapatos
+ </string>
+ <string name="socks">
+ Calcetines
+ </string>
+ <string name="jacket">
+ Chaqueta
+ </string>
+ <string name="gloves">
+ Guantes
+ </string>
+ <string name="undershirt">
+ Camiseta
+ </string>
+ <string name="underpants">
+ Ropa interior
+ </string>
+ <string name="skirt">
+ Falda
+ </string>
+ <string name="alpha">
+ Alfa
+ </string>
+ <string name="tattoo">
+ Tatuaje
+ </string>
+ <string name="physics">
+ FÃsica
+ </string>
+ <string name="invalid">
+ inválido/a
+ </string>
+ <string name="none">
+ ninguno
+ </string>
+ <string name="shirt_not_worn">
+ Camisa no puesta
+ </string>
+ <string name="pants_not_worn">
+ Pantalones no puestos
+ </string>
+ <string name="shoes_not_worn">
+ Zapatos no puestos
+ </string>
+ <string name="socks_not_worn">
+ Calcetines no puestos
+ </string>
+ <string name="jacket_not_worn">
+ Chaqueta no puesta
+ </string>
+ <string name="gloves_not_worn">
+ Guantes no puestos
+ </string>
+ <string name="undershirt_not_worn">
+ Camiseta no puesta
+ </string>
+ <string name="underpants_not_worn">
+ Ropa interior no puesta
+ </string>
+ <string name="skirt_not_worn">
+ Falda no puesta
+ </string>
+ <string name="alpha_not_worn">
+ Alfa no puesta
+ </string>
+ <string name="tattoo_not_worn">
+ Tatuaje no puesto
+ </string>
+ <string name="physics_not_worn">
+ FÃsica no puesta
+ </string>
+ <string name="invalid_not_worn">
+ no válido/a
+ </string>
+ <string name="create_new_shape">
+ Crear una anatomÃa nueva
+ </string>
+ <string name="create_new_skin">
+ Crear una piel nueva
+ </string>
+ <string name="create_new_hair">
+ Crear pelo nuevo
+ </string>
+ <string name="create_new_eyes">
+ Crear ojos nuevos
+ </string>
+ <string name="create_new_shirt">
+ Crear una camisa nueva
+ </string>
+ <string name="create_new_pants">
+ Crear unos pantalones nuevos
+ </string>
+ <string name="create_new_shoes">
+ Crear unos zapatos nuevos
+ </string>
+ <string name="create_new_socks">
+ Crear unos calcetines nuevos
+ </string>
+ <string name="create_new_jacket">
+ Crear una chaqueta nueva
+ </string>
+ <string name="create_new_gloves">
+ Crear unos guantes nuevos
+ </string>
+ <string name="create_new_undershirt">
+ Crear una camiseta nueva
+ </string>
+ <string name="create_new_underpants">
+ Crear ropa interior nueva
+ </string>
+ <string name="create_new_skirt">
+ Crear una falda nueva
+ </string>
+ <string name="create_new_alpha">
+ Crear una capa alfa nueva
+ </string>
+ <string name="create_new_tattoo">
+ Crear un tatuaje nuevo
+ </string>
+ <string name="create_new_physics">
+ Crear nueva fÃsica
+ </string>
+ <string name="create_new_invalid">
+ no válido/a
+ </string>
+ <string name="NewWearable">
+ Nuevo [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Siguiente
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Aviso de grupo
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Avisos del grupo
+ </string>
+ <string name="GroupNotifySentBy">
+ Enviado por
+ </string>
+ <string name="GroupNotifyAttached">
+ Adjunto:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Ver los avisos pasados u optar por dejar de recibir aquà estos mensajes.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Abrir el adjunto
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Guardar el adjunto
+ </string>
+ <string name="TeleportOffer">
+ Ofrecimiento de teleporte
+ </string>
+ <string name="StartUpNotifications">
+ Llegaron avisos nuevos mientras estabas ausente...
+ </string>
+ <string name="OverflowInfoChannelString">
+ Tienes [%d] aviso/s más
+ </string>
+ <string name="BodyPartsRightArm">
+ Brazo der.
+ </string>
+ <string name="BodyPartsHead">
+ Cabeza
+ </string>
+ <string name="BodyPartsLeftArm">
+ Brazo izq.
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Pierna izq.
+ </string>
+ <string name="BodyPartsTorso">
+ Torso
+ </string>
+ <string name="BodyPartsRightLeg">
+ Pierna der.
+ </string>
+ <string name="GraphicsQualityLow">
+ Bajo
+ </string>
+ <string name="GraphicsQualityMid">
+ Medio
+ </string>
+ <string name="GraphicsQualityHigh">
+ Alto
+ </string>
+ <string name="LeaveMouselook">
+ Pulsa ESC para salir de la vista subjetiva
+ </string>
+ <string name="InventoryNoMatchingItems">
+ ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/all/[SEARCH_TERM] Buscar].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/places/[SEARCH_TERM] Buscar].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Arrastra aquà un hito para tenerlo en tus favoritos.
+ </string>
+ <string name="InventoryNoTexture">
+ No tienes en tu inventario una copia de esta textura
+ </string>
+ <string name="no_transfer" value="(no transferible)"/>
+ <string name="no_modify" value="(no modificable)"/>
+ <string name="no_copy" value="(no copiable)"/>
+ <string name="worn" value="(puesto)"/>
+ <string name="link" value="(enlace)"/>
+ <string name="broken_link" value="(enlace roto)""/>
+ <string name="LoadingContents">
+ Cargando el contenido...
+ </string>
+ <string name="NoContents">
+ No hay contenido
+ </string>
+ <string name="WornOnAttachmentPoint" value="(lo llevas en: [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (activo)"/>
+ <string name="Chat Message" value="Chat:"/>
+ <string name="Sound" value="Sonido :"/>
+ <string name="Wait" value="--- Espera :"/>
+ <string name="AnimFlagStop" value="Parar la animación:"/>
+ <string name="AnimFlagStart" value="Empezar la animación:"/>
+ <string name="Wave" value="Onda"/>
+ <string name="GestureActionNone" value="Ninguno"/>
+ <string name="HelloAvatar" value="¡Hola, avatar!"/>
+ <string name="ViewAllGestures" value="Ver todos >>"/>
+ <string name="GetMoreGestures" value="Obtener más >>"/>
+ <string name="Animations" value="Animaciones,"/>
+ <string name="Calling Cards" value="Tarjetas de visita,"/>
+ <string name="Clothing" value="Ropa,"/>
+ <string name="Gestures" value="Gestos,"/>
+ <string name="Landmarks" value="Hitos,"/>
+ <string name="Notecards" value="Notas,"/>
+ <string name="Objects" value="Objetos,"/>
+ <string name="Scripts" value="Scripts,"/>
+ <string name="Sounds" value="Sonidos,"/>
+ <string name="Textures" value="Texturas,"/>
+ <string name="Snapshots" value="Fotos,"/>
+ <string name="No Filters" value="No"/>
+ <string name="Since Logoff" value="- Desde la desconexión"/>
+ <string name="InvFolder My Inventory">
+ Mi Inventario
+ </string>
+ <string name="InvFolder My Favorites">
+ Mis Favoritos
+ </string>
+ <string name="InvFolder Library">
+ Biblioteca
+ </string>
+ <string name="InvFolder Textures">
+ Texturas
+ </string>
+ <string name="InvFolder Sounds">
+ Sonidos
+ </string>
+ <string name="InvFolder Calling Cards">
+ Tarjetas de visita
+ </string>
+ <string name="InvFolder Landmarks">
+ Hitos
+ </string>
+ <string name="InvFolder Scripts">
+ Scripts
+ </string>
+ <string name="InvFolder Clothing">
+ Ropa
+ </string>
+ <string name="InvFolder Objects">
+ Objetos
+ </string>
+ <string name="InvFolder Notecards">
+ Notas
+ </string>
+ <string name="InvFolder New Folder">
+ Carpeta nueva
+ </string>
+ <string name="InvFolder Inventory">
+ Inventario
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Imágenes sin comprimir
+ </string>
+ <string name="InvFolder Body Parts">
+ Partes del cuerpo
+ </string>
+ <string name="InvFolder Trash">
+ Papelera
+ </string>
+ <string name="InvFolder Photo Album">
+ Ãlbum de fotos
+ </string>
+ <string name="InvFolder Lost And Found">
+ Objetos Perdidos
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Sonidos sin comprimir
+ </string>
+ <string name="InvFolder Animations">
+ Animaciones
+ </string>
+ <string name="InvFolder Gestures">
+ Gestos
+ </string>
+ <string name="InvFolder Favorite">
+ Favoritos
+ </string>
+ <string name="InvFolder favorite">
+ Favoritos
+ </string>
+ <string name="InvFolder Current Outfit">
+ Vestuario actual
+ </string>
+ <string name="InvFolder Initial Outfits">
+ Vestuario inicial
+ </string>
+ <string name="InvFolder My Outfits">
+ Mis vestuarios
+ </string>
+ <string name="InvFolder Accessories">
+ Accesorios
+ </string>
+ <string name="InvFolder Friends">
+ Amigos
+ </string>
+ <string name="InvFolder All">
+ Todas
+ </string>
+ <string name="Buy">
+ Comprar
+ </string>
+ <string name="BuyforL$">
+ Comprar por L$
+ </string>
+ <string name="Stone">
+ Piedra
+ </string>
+ <string name="Metal">
+ Metal
+ </string>
+ <string name="Glass">
+ Cristal
+ </string>
+ <string name="Wood">
+ Madera
+ </string>
+ <string name="Flesh">
+ Carne
+ </string>
+ <string name="Plastic">
+ Plástico
+ </string>
+ <string name="Rubber">
+ Goma
+ </string>
+ <string name="Light">
+ Claridad
+ </string>
+ <string name="KBShift">
+ Mayúsculas
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Tórax
+ </string>
+ <string name="Skull">
+ Cráneo
+ </string>
+ <string name="Left Shoulder">
+ Hombro izquierdo
+ </string>
+ <string name="Right Shoulder">
+ Hombro derecho
+ </string>
+ <string name="Left Hand">
+ Mano izq.
+ </string>
+ <string name="Right Hand">
+ Mano der.
+ </string>
+ <string name="Left Foot">
+ Pie izq.
+ </string>
+ <string name="Right Foot">
+ Pie der.
+ </string>
+ <string name="Spine">
+ Columna
+ </string>
+ <string name="Pelvis">
+ Pelvis
+ </string>
+ <string name="Mouth">
+ Boca
+ </string>
+ <string name="Chin">
+ Barbilla
+ </string>
+ <string name="Left Ear">
+ Oreja izq.
+ </string>
+ <string name="Right Ear">
+ Oreja der.
+ </string>
+ <string name="Left Eyeball">
+ Ojo izq.
+ </string>
+ <string name="Right Eyeball">
+ Ojo der.
+ </string>
+ <string name="Nose">
+ Nariz
+ </string>
+ <string name="R Upper Arm">
+ Brazo der.
+ </string>
+ <string name="R Forearm">
+ Antebrazo der.
+ </string>
+ <string name="L Upper Arm">
+ Brazo izq.
+ </string>
+ <string name="L Forearm">
+ Antebrazo izq.
+ </string>
+ <string name="Right Hip">
+ Cadera der.
+ </string>
+ <string name="R Upper Leg">
+ Muslo der.
+ </string>
+ <string name="R Lower Leg">
+ Pantorrilla der.
+ </string>
+ <string name="Left Hip">
+ Cadera izq.
+ </string>
+ <string name="L Upper Leg">
+ Muslo izq.
+ </string>
+ <string name="L Lower Leg">
+ Pantorrilla izq.
+ </string>
+ <string name="Stomach">
+ Abdomen
+ </string>
+ <string name="Left Pec">
+ Pecho izquierdo
+ </string>
+ <string name="Right Pec">
+ Pecho derecho
+ </string>
+ <string name="Invalid Attachment">
+ Punto de colocación no válido
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS] de edad
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] de edad
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS] de edad
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS] de edad
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS] de edad
+ </string>
+ <string name="TodayOld">
+ Registrado hoy
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] año
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] años
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] años
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] mes
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] meses
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] meses
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] semana
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] semanas
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] semanas
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] dÃa
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] dÃas
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] dÃas
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] miembro
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] miembros
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] miembros
+ </string>
+ <string name="AcctTypeResident">
+ Residente
+ </string>
+ <string name="AcctTypeTrial">
+ Prueba
+ </string>
+ <string name="AcctTypeCharterMember">
+ Miembro fundador
+ </string>
+ <string name="AcctTypeEmployee">
+ Empleado de Linden Lab
+ </string>
+ <string name="PaymentInfoUsed">
+ Ha usado información sobre la forma de pago
+ </string>
+ <string name="PaymentInfoOnFile">
+ Hay información archivada sobre la forma de pago
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ No hay información archivada sobre la forma de pago
+ </string>
+ <string name="AgeVerified">
+ Edad verificada
+ </string>
+ <string name="NotAgeVerified">
+ Edad no verificada
+ </string>
+ <string name="Center 2">
+ Centro 2
+ </string>
+ <string name="Top Right">
+ Arriba der.
+ </string>
+ <string name="Top">
+ Arriba
+ </string>
+ <string name="Top Left">
+ Arriba izq.
+ </string>
+ <string name="Center">
+ Centro
+ </string>
+ <string name="Bottom Left">
+ Abajo izq.
+ </string>
+ <string name="Bottom">
+ Abajo
+ </string>
+ <string name="Bottom Right">
+ Abajo der.
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Descargado, compilándolo
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ No se encuentra el script en el servidor.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problema al descargar
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Permisos insuficientes para descargar un script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Permisos insuficientes para
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Fallo desconocido en la descarga
+ </string>
+ <string name="CompileQueueTitle">
+ Recompilando
+ </string>
+ <string name="CompileQueueStart">
+ recompilar
+ </string>
+ <string name="ResetQueueTitle">
+ Progreso del reinicio
+ </string>
+ <string name="ResetQueueStart">
+ restaurar
+ </string>
+ <string name="RunQueueTitle">
+ Configurar según se ejecuta
+ </string>
+ <string name="RunQueueStart">
+ Configurando según se ejecuta
+ </string>
+ <string name="NotRunQueueTitle">
+ Configurar sin ejecutar
+ </string>
+ <string name="NotRunQueueStart">
+ Configurando sin ejecutarlo
+ </string>
+ <string name="CompileSuccessful">
+ ¡Compilación correcta!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Compilación correcta, guardando...
+ </string>
+ <string name="SaveComplete">
+ Guardado.
+ </string>
+ <string name="ObjectOutOfRange">
+ Script (objeto fuera de rango)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ El objeto [OBJECT] es propiedad de [OWNER]
+ </string>
+ <string name="GroupsNone">
+ ninguno
+ </string>
+ <string name="Group" value="(grupo)"/>
+ <string name="Unknown">
+ (Desconocido)
+ </string>
+ <string name="SummaryForTheWeek" value="Resumen de esta semana, empezando el"/>
+ <string name="NextStipendDay" value="El próximo dÃa de pago es el"/>
+ <string name="GroupIndividualShare" value="Grupo Aportaciones individuales"/>
+ <string name="GroupColumn" value="Grupo"/>
+ <string name="Balance">
+ Saldo
+ </string>
+ <string name="Credits">
+ Créditos
+ </string>
+ <string name="Debits">
+ Débitos
+ </string>
+ <string name="Total">
+ Total
+ </string>
+ <string name="NoGroupDataFound">
+ No se encontraron datos del grupo
+ </string>
+ <string name="IMParentEstate">
+ parent estate
+ </string>
+ <string name="IMMainland">
+ continente
+ </string>
+ <string name="IMTeen">
+ teen
+ </string>
+ <string name="RegionInfoError">
+ error
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ todos los estados propiedad de [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ todos los estados que posees
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ todos los estados que administras para [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Resientes autorizados: ([ALLOWEDAGENTS], de un máx. de [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Grupos autorizados: ([ALLOWEDGROUPS], de un máx. de [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Memoria de los scripts de la parcela
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Parcelas listadas: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Memoria usada: [COUNT] kb de un máx de [MAX] kb; [AVAILABLE] kb disponibles
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Memoria usada: [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ URLs de los scripts de la parcela
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URLs usadas: [COUNT] de un máx. de [MAX]; [AVAILABLE] disponibles
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URLs usadas: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Error al obtener la información
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ No hay una parcela seleccionada
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Error: la información del script sólo está disponible en tu región actual
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Obteniendo la información...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ No tienes permiso para examinar esta parcela
+ </string>
+ <string name="SITTING_ON">
+ Sentado en
+ </string>
+ <string name="ATTACH_CHEST">
+ Tórax
+ </string>
+ <string name="ATTACH_HEAD">
+ Cabeza
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Hombro izquierdo
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Hombro derecho
+ </string>
+ <string name="ATTACH_LHAND">
+ Mano izq.
+ </string>
+ <string name="ATTACH_RHAND">
+ Mano der.
+ </string>
+ <string name="ATTACH_LFOOT">
+ Pie izq.
+ </string>
+ <string name="ATTACH_RFOOT">
+ Pie der.
+ </string>
+ <string name="ATTACH_BACK">
+ Anterior
+ </string>
+ <string name="ATTACH_PELVIS">
+ Pelvis
+ </string>
+ <string name="ATTACH_MOUTH">
+ Boca
+ </string>
+ <string name="ATTACH_CHIN">
+ Barbilla
+ </string>
+ <string name="ATTACH_LEAR">
+ Oreja izq.
+ </string>
+ <string name="ATTACH_REAR">
+ Oreja der.
+ </string>
+ <string name="ATTACH_LEYE">
+ Ojo izq.
+ </string>
+ <string name="ATTACH_REYE">
+ Ojo der.
+ </string>
+ <string name="ATTACH_NOSE">
+ Nariz
+ </string>
+ <string name="ATTACH_RUARM">
+ Brazo der.
+ </string>
+ <string name="ATTACH_RLARM">
+ Antebrazo der.
+ </string>
+ <string name="ATTACH_LUARM">
+ Brazo izq.
+ </string>
+ <string name="ATTACH_LLARM">
+ Antebrazo izq.
+ </string>
+ <string name="ATTACH_RHIP">
+ Cadera der.
+ </string>
+ <string name="ATTACH_RULEG">
+ Muslo der.
+ </string>
+ <string name="ATTACH_RLLEG">
+ Pantorrilla der.
+ </string>
+ <string name="ATTACH_LHIP">
+ Cadera izq.
+ </string>
+ <string name="ATTACH_LULEG">
+ Muslo izq.
+ </string>
+ <string name="ATTACH_LLLEG">
+ Pantorrilla izq.
+ </string>
+ <string name="ATTACH_BELLY">
+ Vientre
+ </string>
+ <string name="ATTACH_RPEC">
+ Pecho derecho
+ </string>
+ <string name="ATTACH_LPEC">
+ Pecho izquierdo
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD: Centro 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD: arriba der.
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD: arriba centro
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD: arriba izq.
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD: Centro 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD: abajo izq.
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD: abajo
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD: abajo der.
+ </string>
+ <string name="CursorPos">
+ LÃnea [LINE], Columna [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] resultados
+ </string>
+ <string name="PanelContentsTooltip">
+ Contenido del objeto
+ </string>
+ <string name="PanelContentsNewScript">
+ Script nuevo
+ </string>
+ <string name="BusyModeResponseDefault">
+ El Residente al que has enviado un mensaje ha solicitado que no se le moleste porque está en modo ocupado. Podrá ver tu mensaje más adelante, ya que éste aparecerá en su panel de MI.
+ </string>
+ <string name="MuteByName">
+ (Por el nombre)
+ </string>
+ <string name="MuteAgent">
+ (Residente)
+ </string>
+ <string name="MuteObject">
+ (Objeto)
+ </string>
+ <string name="MuteGroup">
+ (Grupo)
+ </string>
+ <string name="MuteExternal">
+ (Externo)
+ </string>
+ <string name="RegionNoCovenant">
+ No se ha aportado un contrato para este estado.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ No se ha aportado un contrato para este estado. El terreno de este estado lo vende el propietario del estado, no Linden Lab. Por favor, contacta con ese propietario para informarte sobre la venta.
+ </string>
+ <string name="covenant_last_modified" value="Última modificación: "/>
+ <string name="none_text" value="(no hay)"/>
+ <string name="never_text" value=" (nunca)"/>
+ <string name="GroupOwned">
+ Propiedad del grupo
+ </string>
+ <string name="Public">
+ Público
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Clics: [TELEPORT] teleportes, [MAP] mapa, [PROFILE] perfil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (se actualizará tras la publicación)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ No has creado destacados ni clasificados. Pulsa el botón Más para crear uno.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ El usuario no tiene clasificados ni destacados
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Cargando...
+ </string>
+ <string name="MultiPreviewTitle">
+ Vista previa
+ </string>
+ <string name="MultiPropertiesTitle">
+ Propiedades
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Un objeto de nombre
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ propiedad del grupo
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ propiedad de un grupo desconocido
+ </string>
+ <string name="InvOfferOwnedBy">
+ propiedad de
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ propiedad de un usuario desconocido
+ </string>
+ <string name="InvOfferGaveYou">
+ te ha dado
+ </string>
+ <string name="InvOfferDecline">
+ Rechazas [DESC] de <nolink>[NAME]</nolink>.
+ </string>
+ <string name="GroupMoneyTotal">
+ Total
+ </string>
+ <string name="GroupMoneyBought">
+ comprado
+ </string>
+ <string name="GroupMoneyPaidYou">
+ pagado a ti
+ </string>
+ <string name="GroupMoneyPaidInto">
+ pagado en
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ pase comprado a
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ cuotas pagadas para el evento
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ precio pagado por el evento
+ </string>
+ <string name="GroupMoneyBalance">
+ Saldo
+ </string>
+ <string name="GroupMoneyCredits">
+ Créditos
+ </string>
+ <string name="GroupMoneyDebits">
+ Débitos
+ </string>
+ <string name="ViewerObjectContents">
+ Contenidos
+ </string>
+ <string name="AcquiredItems">
+ ArtÃculos adquiridos
+ </string>
+ <string name="Cancel">
+ Cancelar
+ </string>
+ <string name="UploadingCosts">
+ Subir [NAME] cuesta [AMOUNT] L$
+ </string>
+ <string name="BuyingCosts">
+ Comprar esto cuesta [AMOUNT] L$
+ </string>
+ <string name="UnknownFileExtension">
+ Extensión de archivo desconocida [.%s]
+Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh
+ </string>
+ <string name="MuteObject2">
+ Ignorar
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Guardarme este hito...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Editar este hito...
+ </string>
+ <string name="accel-mac-control">
+ ⌃
+ </string>
+ <string name="accel-mac-command">
+ ⌘
+ </string>
+ <string name="accel-mac-option">
+ ⌥
+ </string>
+ <string name="accel-mac-shift">
+ ⇧
+ </string>
+ <string name="accel-win-control">
+ Ctrl+
+ </string>
+ <string name="accel-win-alt">
+ Alt+
+ </string>
+ <string name="accel-win-shift">
+ Mayús+
+ </string>
+ <string name="FileSaved">
+ Archivo guardado
+ </string>
+ <string name="Receiving">
+ Recibiendo
+ </string>
+ <string name="AM">
+ AM
+ </string>
+ <string name="PM">
+ PM
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Direction_Forward">
+ Adelante
+ </string>
+ <string name="Direction_Left">
+ Izquierda
+ </string>
+ <string name="Direction_Right">
+ Derecha
+ </string>
+ <string name="Direction_Back">
+ Atrás
+ </string>
+ <string name="Direction_North">
+ Norte
+ </string>
+ <string name="Direction_South">
+ Sur
+ </string>
+ <string name="Direction_West">
+ Oeste
+ </string>
+ <string name="Direction_East">
+ Este
+ </string>
+ <string name="Direction_Up">
+ Arriba
+ </string>
+ <string name="Direction_Down">
+ Abajo
+ </string>
+ <string name="Any Category">
+ Cualquier categorÃa
+ </string>
+ <string name="Shopping">
+ Compras
+ </string>
+ <string name="Land Rental">
+ Terreno en alquiler
+ </string>
+ <string name="Property Rental">
+ Propiedad en alquiler
+ </string>
+ <string name="Special Attraction">
+ Atracción especial
+ </string>
+ <string name="New Products">
+ Nuevos productos
+ </string>
+ <string name="Employment">
+ Empleo
+ </string>
+ <string name="Wanted">
+ Se busca
+ </string>
+ <string name="Service">
+ Servicios
+ </string>
+ <string name="Personal">
+ Personal
+ </string>
+ <string name="None">
+ Ninguno
+ </string>
+ <string name="Linden Location">
+ Localización Linden
+ </string>
+ <string name="Adult">
+ Adulto
+ </string>
+ <string name="Arts&Culture">
+ Arte y Cultura
+ </string>
+ <string name="Business">
+ Negocios
+ </string>
+ <string name="Educational">
+ Educativo
+ </string>
+ <string name="Gaming">
+ Juegos de azar
+ </string>
+ <string name="Hangout">
+ Entretenimiento
+ </string>
+ <string name="Newcomer Friendly">
+ Para recién llegados
+ </string>
+ <string name="Parks&Nature">
+ Parques y Naturaleza
+ </string>
+ <string name="Residential">
+ Residencial
+ </string>
+ <string name="Stage">
+ Artes escénicas
+ </string>
+ <string name="Other">
+ Otra
+ </string>
+ <string name="Rental">
+ Terreno en alquiler
+ </string>
+ <string name="Any">
+ Cualquiera
+ </string>
+ <string name="You">
+ Tú
+ </string>
+ <string name="Multiple Media">
+ Múltiples medias
+ </string>
+ <string name="Play Media">
+ Play/Pausa los media
+ </string>
+ <string name="MBCmdLineError">
+ Ha habido un error analizando la lÃnea de comando.
+Por favor, consulta: http://wiki.secondlife.com/wiki/Client_parameters
+Error:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Uso de lÃnea de comando:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] no puede acceder a un archivo que necesita.
+
+Puede ser porque estés ejecutando varias copias, o porque tu sistema crea -equivocadamente- que el archivo está abierto.
+Si este mensaje persiste, reinicia tu ordenador y vuelve a intentarlo.
+Si aun asà sigue apareciendo el mensaje, debes desinstalar completamente [APP_NAME] y reinstalarlo.
+ </string>
+ <string name="MBFatalError">
+ Error fatal
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] requiere un procesador con AltiVec (G4 o posterior).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] ya se está ejecutando.
+Revisa tu barra de tareas para encontrar una copia minimizada del programa.
+Si este mensaje persiste, reinicia tu ordenador.
+ </string>
+ <string name="MBFrozenCrashed">
+ En su anterior ejecución, [APP_NAME] se congeló o se cayó.
+¿Quieres enviar un informe de caÃda?
+ </string>
+ <string name="MBAlert">
+ Alerta
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] no encuentra DirectX 9.0b o superior.
+[APP_NAME] usa DirectX para detectar el hardware o los drivers no actualizados que pueden provocar problemas de estabilidad, ejecución pobre y caÃdas. Aunque puedes ejecutar [APP_NAME] sin él, recomendamos encarecidamente hacerlo con DirectX 9.0b.
+
+¿Quieres continuar?
+ </string>
+ <string name="MBWarning">
+ ¡Atención!
+ </string>
+ <string name="MBNoAutoUpdate">
+ Las actualizaciones automáticas no están todavÃa implementadas para Linux.
+Por favor, descarga la última versión desde www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ Fallo en RegisterClass
+ </string>
+ <string name="MBError">
+ Error
+ </string>
+ <string name="MBFullScreenErr">
+ No puede ejecutarse a pantalla completa de [WIDTH] x [HEIGHT].
+Ejecutándose en una ventana.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Error Shutdown destruyendo la ventana (DestroyWindow() failed)
+ </string>
+ <string name="MBShutdownErr">
+ Error Shutdown
+ </string>
+ <string name="MBDevContextErr">
+ No se puede construir el 'GL device context'
+ </string>
+ <string name="MBPixelFmtErr">
+ No se puede encontrar un formato adecuado de pÃxel
+ </string>
+ <string name="MBPixelFmtDescErr">
+ No se puede conseguir la descripción del formato de pÃxel
+ </string>
+ <string name="MBTrueColorWindow">
+ Para ejecutarse, [APP_NAME] necesita True Color (32-bit).
+Por favor, en las configuraciones de tu ordenador ajusta el modo de color a 32-bit.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] no puede ejecutarse porque no puede obtener un canal alpha de 8 bit. Generalmente, se debe a alguna cuestión de los drivers de la tarjeta de vÃdeo.
+Por favor, comprueba que tienes instalados los últimos drivers para tu tarjeta de vÃdeo.
+Comprueba también que tu monitor esta configurado para True Color (32-bit) en Panel de Control > Apariencia y temas > Pantalla.
+Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ No se puede configurar el formato de pÃxel
+ </string>
+ <string name="MBGLContextErr">
+ No se puede crear el 'GL rendering context'
+ </string>
+ <string name="MBGLContextActErr">
+ No se puede activar el 'GL rendering context'
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] no puede ejecutarse porque los drivers de tu tarjeta de vÃdeo o no están bien instalados, o no están actualizados, o son para hardware no admitido. Por favor, comprueba que tienes los drivers más actuales para tu tarjeta de vÃdeo, y, aunque los tengas, intenta reinstalarlos.
+
+Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
+ </string>
+ <string name="5 O'Clock Shadow">
+ Barba del dÃa
+ </string>
+ <string name="All White">
+ Blanco del todo
+ </string>
+ <string name="Anime Eyes">
+ Ojos de cómic
+ </string>
+ <string name="Arced">
+ Arqueadas
+ </string>
+ <string name="Arm Length">
+ Brazos: longitud
+ </string>
+ <string name="Attached">
+ Cortos
+ </string>
+ <string name="Attached Earlobes">
+ Lóbulos
+ </string>
+ <string name="Back Fringe">
+ Nuca: largo
+ </string>
+ <string name="Baggy">
+ Marcadas
+ </string>
+ <string name="Bangs">
+ Bangs
+ </string>
+ <string name="Beady Eyes">
+ Ojos pequeños
+ </string>
+ <string name="Belly Size">
+ Barriga: tamaño
+ </string>
+ <string name="Big">
+ Grande
+ </string>
+ <string name="Big Butt">
+ Culo grande
+ </string>
+ <string name="Big Hair Back">
+ Pelo: moño
+ </string>
+ <string name="Big Hair Front">
+ Pelo: tupé
+ </string>
+ <string name="Big Hair Top">
+ Pelo: melena alta
+ </string>
+ <string name="Big Head">
+ Cabeza grande
+ </string>
+ <string name="Big Pectorals">
+ Grandes pectorales
+ </string>
+ <string name="Big Spikes">
+ Crestas grandes
+ </string>
+ <string name="Black">
+ Negro
+ </string>
+ <string name="Blonde">
+ Rubio
+ </string>
+ <string name="Blonde Hair">
+ Pelo rubio
+ </string>
+ <string name="Blush">
+ Colorete
+ </string>
+ <string name="Blush Color">
+ Color del colorete
+ </string>
+ <string name="Blush Opacity">
+ Opacidad del colorete
+ </string>
+ <string name="Body Definition">
+ Definición del cuerpo
+ </string>
+ <string name="Body Fat">
+ Cuerpo: gordura
+ </string>
+ <string name="Body Freckles">
+ Pecas del cuerpo
+ </string>
+ <string name="Body Thick">
+ Cuerpo grueso
+ </string>
+ <string name="Body Thickness">
+ Cuerpo: grosor
+ </string>
+ <string name="Body Thin">
+ Cuerpo delgado
+ </string>
+ <string name="Bow Legged">
+ Abiertas
+ </string>
+ <string name="Breast Buoyancy">
+ Busto: firmeza
+ </string>
+ <string name="Breast Cleavage">
+ Busto: canalillo
+ </string>
+ <string name="Breast Size">
+ Busto: tamaño
+ </string>
+ <string name="Bridge Width">
+ Puente: ancho
+ </string>
+ <string name="Broad">
+ Aumentar
+ </string>
+ <string name="Brow Size">
+ Arco ciliar
+ </string>
+ <string name="Bug Eyes">
+ Bug Eyes
+ </string>
+ <string name="Bugged Eyes">
+ Ojos saltones
+ </string>
+ <string name="Bulbous">
+ Bulbosa
+ </string>
+ <string name="Bulbous Nose">
+ Nariz de porra
+ </string>
+ <string name="Breast Physics Mass">
+ Masa del busto
+ </string>
+ <string name="Breast Physics Smoothing">
+ Suavizado del busto
+ </string>
+ <string name="Breast Physics Gravity">
+ Gravedad del busto
+ </string>
+ <string name="Breast Physics Drag">
+ Aerodinámica del busto
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Elasticidad
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Ganancia
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Amortiguación
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Elasticidad
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Ganancia
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Amortiguación
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Elasticidad
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Ganancia
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Amortiguación
+ </string>
+ <string name="Belly Physics Mass">
+ Masa de la barriga
+ </string>
+ <string name="Belly Physics Smoothing">
+ Suavizado de la barriga
+ </string>
+ <string name="Belly Physics Gravity">
+ Gravedad de la barriga
+ </string>
+ <string name="Belly Physics Drag">
+ Aerodinámica de la barriga
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Elasticidad
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Ganancia
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Amortiguación
+ </string>
+ <string name="Butt Physics Mass">
+ Masa del culo
+ </string>
+ <string name="Butt Physics Smoothing">
+ Suavizado del culo
+ </string>
+ <string name="Butt Physics Gravity">
+ Gravedad del culo
+ </string>
+ <string name="Butt Physics Drag">
+ Aerodinámica del culo
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Elasticidad
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Ganancia
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Amortiguación
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Elasticidad
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Ganancia
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Amortiguación
+ </string>
+ <string name="Bushy Eyebrows">
+ Cejijuntas
+ </string>
+ <string name="Bushy Hair">
+ Pelo tupido
+ </string>
+ <string name="Butt Size">
+ Culo: tamaño
+ </string>
+ <string name="Butt Gravity">
+ Gravedad del culo
+ </string>
+ <string name="bustle skirt">
+ Polisón
+ </string>
+ <string name="no bustle">
+ Sin polisón
+ </string>
+ <string name="more bustle">
+ Con polisón
+ </string>
+ <string name="Chaplin">
+ Cortito
+ </string>
+ <string name="Cheek Bones">
+ Pómulos
+ </string>
+ <string name="Chest Size">
+ Tórax: tamaño
+ </string>
+ <string name="Chin Angle">
+ Barbilla: ángulo
+ </string>
+ <string name="Chin Cleft">
+ Barbilla: contorno
+ </string>
+ <string name="Chin Curtains">
+ Barba en collar
+ </string>
+ <string name="Chin Depth">
+ Barbilla: largo
+ </string>
+ <string name="Chin Heavy">
+ Hacia la barbilla
+ </string>
+ <string name="Chin In">
+ Barbilla retraÃda
+ </string>
+ <string name="Chin Out">
+ Barbilla prominente
+ </string>
+ <string name="Chin-Neck">
+ Papada
+ </string>
+ <string name="Clear">
+ Transparente
+ </string>
+ <string name="Cleft">
+ Remarcar
+ </string>
+ <string name="Close Set Eyes">
+ Ojos juntos
+ </string>
+ <string name="Closed">
+ Cerrar
+ </string>
+ <string name="Closed Back">
+ Trasera cerrada
+ </string>
+ <string name="Closed Front">
+ Frontal cerrado
+ </string>
+ <string name="Closed Left">
+ Cerrada
+ </string>
+ <string name="Closed Right">
+ Cerrada
+ </string>
+ <string name="Coin Purse">
+ Poco abultada
+ </string>
+ <string name="Collar Back">
+ Espalda
+ </string>
+ <string name="Collar Front">
+ Escote
+ </string>
+ <string name="Corner Down">
+ Hacia abajo
+ </string>
+ <string name="Corner Up">
+ Hacia arriba
+ </string>
+ <string name="Creased">
+ CaÃdos
+ </string>
+ <string name="Crooked Nose">
+ Nariz torcida
+ </string>
+ <string name="Cuff Flare">
+ Acampanado
+ </string>
+ <string name="Dark">
+ Oscuridad
+ </string>
+ <string name="Dark Green">
+ Verde oscuro
+ </string>
+ <string name="Darker">
+ Más oscuros
+ </string>
+ <string name="Deep">
+ Remarcar
+ </string>
+ <string name="Default Heels">
+ Tacones por defecto
+ </string>
+ <string name="Dense">
+ Densas
+ </string>
+ <string name="Double Chin">
+ Mucha papada
+ </string>
+ <string name="Downturned">
+ Poco
+ </string>
+ <string name="Duffle Bag">
+ Muy abultada
+ </string>
+ <string name="Ear Angle">
+ Orejas: ángulo
+ </string>
+ <string name="Ear Size">
+ Orejas: tamaño
+ </string>
+ <string name="Ear Tips">
+ Orejas: forma
+ </string>
+ <string name="Egg Head">
+ Cabeza: ahuevada
+ </string>
+ <string name="Eye Bags">
+ Ojos: bolsas
+ </string>
+ <string name="Eye Color">
+ Ojos: color
+ </string>
+ <string name="Eye Depth">
+ Ojos: profundidad
+ </string>
+ <string name="Eye Lightness">
+ Ojos: brillo
+ </string>
+ <string name="Eye Opening">
+ Ojos: apertura
+ </string>
+ <string name="Eye Pop">
+ Ojos: simetrÃa
+ </string>
+ <string name="Eye Size">
+ Ojos: tamaño
+ </string>
+ <string name="Eye Spacing">
+ Ojos: separación
+ </string>
+ <string name="Eyebrow Arc">
+ Cejas: arco
+ </string>
+ <string name="Eyebrow Density">
+ Cejas: densidad
+ </string>
+ <string name="Eyebrow Height">
+ Cejas: altura
+ </string>
+ <string name="Eyebrow Points">
+ Cejas: en V
+ </string>
+ <string name="Eyebrow Size">
+ Cejas: tamaño
+ </string>
+ <string name="Eyelash Length">
+ Pestañas: longitud
+ </string>
+ <string name="Eyeliner">
+ Contorno de ojos
+ </string>
+ <string name="Eyeliner Color">
+ Contorno de ojos: color
+ </string>
+ <string name="Eyes Bugged">
+ Eyes Bugged
+ </string>
+ <string name="Face Shear">
+ Cara: simetrÃa
+ </string>
+ <string name="Facial Definition">
+ Rasgos marcados
+ </string>
+ <string name="Far Set Eyes">
+ Ojos separados
+ </string>
+ <string name="Fat Lips">
+ Prominentes
+ </string>
+ <string name="Female">
+ Mujer
+ </string>
+ <string name="Fingerless">
+ Sin dedos
+ </string>
+ <string name="Fingers">
+ Con dedos
+ </string>
+ <string name="Flared Cuffs">
+ Campana
+ </string>
+ <string name="Flat">
+ Redondeadas
+ </string>
+ <string name="Flat Butt">
+ Culo plano
+ </string>
+ <string name="Flat Head">
+ Cabeza plana
+ </string>
+ <string name="Flat Toe">
+ Empeine bajo
+ </string>
+ <string name="Foot Size">
+ Pie: tamaño
+ </string>
+ <string name="Forehead Angle">
+ Frente: ángulo
+ </string>
+ <string name="Forehead Heavy">
+ Hacia la frente
+ </string>
+ <string name="Freckles">
+ Pecas
+ </string>
+ <string name="Front Fringe">
+ Flequillo
+ </string>
+ <string name="Full Back">
+ Sin cortar
+ </string>
+ <string name="Full Eyeliner">
+ Contorno completo
+ </string>
+ <string name="Full Front">
+ Sin cortar
+ </string>
+ <string name="Full Hair Sides">
+ Pelo: volumen a los lados
+ </string>
+ <string name="Full Sides">
+ Volumen total
+ </string>
+ <string name="Glossy">
+ Con brillo
+ </string>
+ <string name="Glove Fingers">
+ Guantes: dedos
+ </string>
+ <string name="Glove Length">
+ Guantes: largo
+ </string>
+ <string name="Hair">
+ Pelo
+ </string>
+ <string name="Hair Back">
+ Pelo: nuca
+ </string>
+ <string name="Hair Front">
+ Pelo: delante
+ </string>
+ <string name="Hair Sides">
+ Pelo: lados
+ </string>
+ <string name="Hair Sweep">
+ Peinado: dirección
+ </string>
+ <string name="Hair Thickess">
+ Pelo: espesor
+ </string>
+ <string name="Hair Thickness">
+ Pelo: espesor
+ </string>
+ <string name="Hair Tilt">
+ Pelo: inclinación
+ </string>
+ <string name="Hair Tilted Left">
+ A la izq.
+ </string>
+ <string name="Hair Tilted Right">
+ A la der.
+ </string>
+ <string name="Hair Volume">
+ Pelo: volumen
+ </string>
+ <string name="Hand Size">
+ Manos: tamaño
+ </string>
+ <string name="Handlebars">
+ Muy largo
+ </string>
+ <string name="Head Length">
+ Cabeza: longitud
+ </string>
+ <string name="Head Shape">
+ Cabeza: forma
+ </string>
+ <string name="Head Size">
+ Cabeza: tamaño
+ </string>
+ <string name="Head Stretch">
+ Cabeza: estiramiento
+ </string>
+ <string name="Heel Height">
+ Tacón: altura
+ </string>
+ <string name="Heel Shape">
+ Tacón: forma
+ </string>
+ <string name="Height">
+ Altura
+ </string>
+ <string name="High">
+ Subir
+ </string>
+ <string name="High Heels">
+ Tacones altos
+ </string>
+ <string name="High Jaw">
+ MandÃbula alta
+ </string>
+ <string name="High Platforms">
+ Suela gorda
+ </string>
+ <string name="High and Tight">
+ Pegada
+ </string>
+ <string name="Higher">
+ Arrriba
+ </string>
+ <string name="Hip Length">
+ Cadera: altura
+ </string>
+ <string name="Hip Width">
+ Cadera: ancho
+ </string>
+ <string name="In">
+ Pegadas
+ </string>
+ <string name="In Shdw Color">
+ LÃnea de ojos: color
+ </string>
+ <string name="In Shdw Opacity">
+ LÃnea de ojos: opacidad
+ </string>
+ <string name="Inner Eye Corner">
+ Ojos: lagrimal
+ </string>
+ <string name="Inner Eye Shadow">
+ Inner Eye Shadow
+ </string>
+ <string name="Inner Shadow">
+ LÃnea de ojos
+ </string>
+ <string name="Jacket Length">
+ Chaqueta: largo
+ </string>
+ <string name="Jacket Wrinkles">
+ Chaqueta: arrugas
+ </string>
+ <string name="Jaw Angle">
+ MandÃbula: ángulo
+ </string>
+ <string name="Jaw Jut">
+ Maxilar inferior
+ </string>
+ <string name="Jaw Shape">
+ MandÃbula: forma
+ </string>
+ <string name="Join">
+ Más junto
+ </string>
+ <string name="Jowls">
+ Mofletes
+ </string>
+ <string name="Knee Angle">
+ Rodillas: ángulo
+ </string>
+ <string name="Knock Kneed">
+ Zambas
+ </string>
+ <string name="Large">
+ Aumentar
+ </string>
+ <string name="Large Hands">
+ Manos grandes
+ </string>
+ <string name="Left Part">
+ Raya: izq.
+ </string>
+ <string name="Leg Length">
+ Piernas: longitud
+ </string>
+ <string name="Leg Muscles">
+ Piernas: musculatura
+ </string>
+ <string name="Less">
+ Menos
+ </string>
+ <string name="Less Body Fat">
+ Menos gordura
+ </string>
+ <string name="Less Curtains">
+ Menos tupida
+ </string>
+ <string name="Less Freckles">
+ Menos pecas
+ </string>
+ <string name="Less Full">
+ Menos grosor
+ </string>
+ <string name="Less Gravity">
+ Más levantado
+ </string>
+ <string name="Less Love">
+ Menos michelines
+ </string>
+ <string name="Less Muscles">
+ Pocos músculos
+ </string>
+ <string name="Less Muscular">
+ Poca musculatura
+ </string>
+ <string name="Less Rosy">
+ Menos sonrosada
+ </string>
+ <string name="Less Round">
+ Menos redondeada
+ </string>
+ <string name="Less Saddle">
+ Menos cartucheras
+ </string>
+ <string name="Less Square">
+ Menos cuadrada
+ </string>
+ <string name="Less Volume">
+ Menos volumen
+ </string>
+ <string name="Less soul">
+ Pequeña
+ </string>
+ <string name="Lighter">
+ Más luminosos
+ </string>
+ <string name="Lip Cleft">
+ Labio: hoyuelo
+ </string>
+ <string name="Lip Cleft Depth">
+ Hoyuelo marcado
+ </string>
+ <string name="Lip Fullness">
+ Labios: grosor
+ </string>
+ <string name="Lip Pinkness">
+ Labios sonrosados
+ </string>
+ <string name="Lip Ratio">
+ Labios: ratio
+ </string>
+ <string name="Lip Thickness">
+ Labios: prominencia
+ </string>
+ <string name="Lip Width">
+ Labios: ancho
+ </string>
+ <string name="Lipgloss">
+ Brillo de labios
+ </string>
+ <string name="Lipstick">
+ Barra de labios
+ </string>
+ <string name="Lipstick Color">
+ Barra de labios: color
+ </string>
+ <string name="Long">
+ Más
+ </string>
+ <string name="Long Head">
+ Cabeza alargada
+ </string>
+ <string name="Long Hips">
+ Cadera larga
+ </string>
+ <string name="Long Legs">
+ Piernas largas
+ </string>
+ <string name="Long Neck">
+ Cuello largo
+ </string>
+ <string name="Long Pigtails">
+ Coletas largas
+ </string>
+ <string name="Long Ponytail">
+ Cola de caballo larga
+ </string>
+ <string name="Long Torso">
+ Torso largo
+ </string>
+ <string name="Long arms">
+ Brazos largos
+ </string>
+ <string name="Loose Pants">
+ Pantalón suelto
+ </string>
+ <string name="Loose Shirt">
+ Camiseta suelta
+ </string>
+ <string name="Loose Sleeves">
+ Puños anchos
+ </string>
+ <string name="Love Handles">
+ Michelines
+ </string>
+ <string name="Low">
+ Bajar
+ </string>
+ <string name="Low Heels">
+ Tacones bajos
+ </string>
+ <string name="Low Jaw">
+ MandÃbula baja
+ </string>
+ <string name="Low Platforms">
+ Suela fina
+ </string>
+ <string name="Low and Loose">
+ Suelta
+ </string>
+ <string name="Lower">
+ Abajo
+ </string>
+ <string name="Lower Bridge">
+ Puente: abajo
+ </string>
+ <string name="Lower Cheeks">
+ Mejillas: abajo
+ </string>
+ <string name="Male">
+ Varón
+ </string>
+ <string name="Middle Part">
+ Raya: en medio
+ </string>
+ <string name="More">
+ Más
+ </string>
+ <string name="More Blush">
+ Más colorete
+ </string>
+ <string name="More Body Fat">
+ Más gordura
+ </string>
+ <string name="More Curtains">
+ Más tupida
+ </string>
+ <string name="More Eyeshadow">
+ Más
+ </string>
+ <string name="More Freckles">
+ Más pecas
+ </string>
+ <string name="More Full">
+ Más grosor
+ </string>
+ <string name="More Gravity">
+ Menos levantado
+ </string>
+ <string name="More Lipstick">
+ Más barra de labios
+ </string>
+ <string name="More Love">
+ Más michelines
+ </string>
+ <string name="More Lower Lip">
+ Más el inferior
+ </string>
+ <string name="More Muscles">
+ Más músculos
+ </string>
+ <string name="More Muscular">
+ Más musculatura
+ </string>
+ <string name="More Rosy">
+ Más sonrosada
+ </string>
+ <string name="More Round">
+ Más redondeada
+ </string>
+ <string name="More Saddle">
+ Más cartucheras
+ </string>
+ <string name="More Sloped">
+ Más inclinada
+ </string>
+ <string name="More Square">
+ Más cuadrada
+ </string>
+ <string name="More Upper Lip">
+ Más el superior
+ </string>
+ <string name="More Vertical">
+ Más recta
+ </string>
+ <string name="More Volume">
+ Más volumen
+ </string>
+ <string name="More soul">
+ Grande
+ </string>
+ <string name="Moustache">
+ Bigote
+ </string>
+ <string name="Mouth Corner">
+ Comisuras
+ </string>
+ <string name="Mouth Position">
+ Boca: posición
+ </string>
+ <string name="Mowhawk">
+ Rapado
+ </string>
+ <string name="Muscular">
+ Muscular
+ </string>
+ <string name="Mutton Chops">
+ Patillas largas
+ </string>
+ <string name="Nail Polish">
+ Uñas pintadas
+ </string>
+ <string name="Nail Polish Color">
+ Uñas pintadas: color
+ </string>
+ <string name="Narrow">
+ Disminuir
+ </string>
+ <string name="Narrow Back">
+ Rapada
+ </string>
+ <string name="Narrow Front">
+ Entradas
+ </string>
+ <string name="Narrow Lips">
+ Labios estrechos
+ </string>
+ <string name="Natural">
+ Natural
+ </string>
+ <string name="Neck Length">
+ Cuello: longitud
+ </string>
+ <string name="Neck Thickness">
+ Cuello: grosor
+ </string>
+ <string name="No Blush">
+ Sin colorete
+ </string>
+ <string name="No Eyeliner">
+ Sin contorno
+ </string>
+ <string name="No Eyeshadow">
+ Menos
+ </string>
+ <string name="No Lipgloss">
+ Sin brillo
+ </string>
+ <string name="No Lipstick">
+ Sin barra de labios
+ </string>
+ <string name="No Part">
+ Sin raya
+ </string>
+ <string name="No Polish">
+ Sin pintar
+ </string>
+ <string name="No Red">
+ Nada
+ </string>
+ <string name="No Spikes">
+ Sin crestas
+ </string>
+ <string name="No White">
+ Sin blanco
+ </string>
+ <string name="No Wrinkles">
+ Sin arrugas
+ </string>
+ <string name="Normal Lower">
+ Normal Lower
+ </string>
+ <string name="Normal Upper">
+ Normal Upper
+ </string>
+ <string name="Nose Left">
+ Nariz a la izq.
+ </string>
+ <string name="Nose Right">
+ Nariz a la der.
+ </string>
+ <string name="Nose Size">
+ Nariz: tamaño
+ </string>
+ <string name="Nose Thickness">
+ Nariz: grosor
+ </string>
+ <string name="Nose Tip Angle">
+ Nariz: respingona
+ </string>
+ <string name="Nose Tip Shape">
+ Nariz: punta
+ </string>
+ <string name="Nose Width">
+ Nariz: ancho
+ </string>
+ <string name="Nostril Division">
+ Ventana: altura
+ </string>
+ <string name="Nostril Width">
+ Ventana: ancho
+ </string>
+ <string name="Opaque">
+ Opaco
+ </string>
+ <string name="Open">
+ Abrir
+ </string>
+ <string name="Open Back">
+ Apertura trasera
+ </string>
+ <string name="Open Front">
+ Apertura frontal
+ </string>
+ <string name="Open Left">
+ Abierta
+ </string>
+ <string name="Open Right">
+ Abierta
+ </string>
+ <string name="Orange">
+ Anaranjado
+ </string>
+ <string name="Out">
+ De soplillo
+ </string>
+ <string name="Out Shdw Color">
+ Sombra de ojos: color
+ </string>
+ <string name="Out Shdw Opacity">
+ Sombra de ojos: opacidad
+ </string>
+ <string name="Outer Eye Corner">
+ Ojos: comisura
+ </string>
+ <string name="Outer Eye Shadow">
+ Outer Eye Shadow
+ </string>
+ <string name="Outer Shadow">
+ Sombra de ojos
+ </string>
+ <string name="Overbite">
+ RetraÃdo
+ </string>
+ <string name="Package">
+ Pubis
+ </string>
+ <string name="Painted Nails">
+ Pintadas
+ </string>
+ <string name="Pale">
+ Pálida
+ </string>
+ <string name="Pants Crotch">
+ Pantalón: cruz
+ </string>
+ <string name="Pants Fit">
+ Ceñido
+ </string>
+ <string name="Pants Length">
+ Pernera: largo
+ </string>
+ <string name="Pants Waist">
+ Caja
+ </string>
+ <string name="Pants Wrinkles">
+ Pantalón: arrugas
+ </string>
+ <string name="Part">
+ Raya
+ </string>
+ <string name="Part Bangs">
+ Flequillo partido
+ </string>
+ <string name="Pectorals">
+ Pectorales
+ </string>
+ <string name="Pigment">
+ Tono
+ </string>
+ <string name="Pigtails">
+ Coletas
+ </string>
+ <string name="Pink">
+ Rosa
+ </string>
+ <string name="Pinker">
+ Más sonrosados
+ </string>
+ <string name="Platform Height">
+ Suela: altura
+ </string>
+ <string name="Platform Width">
+ Suela: ancho
+ </string>
+ <string name="Pointy">
+ En punta
+ </string>
+ <string name="Pointy Heels">
+ De aguja
+ </string>
+ <string name="Ponytail">
+ Cola de caballo
+ </string>
+ <string name="Poofy Skirt">
+ Con vuelo
+ </string>
+ <string name="Pop Left Eye">
+ Izquierdo más grande
+ </string>
+ <string name="Pop Right Eye">
+ Derecho más grande
+ </string>
+ <string name="Puffy">
+ Hinchadas
+ </string>
+ <string name="Puffy Eyelids">
+ Ojeras
+ </string>
+ <string name="Rainbow Color">
+ Irisación
+ </string>
+ <string name="Red Hair">
+ Pelirrojo
+ </string>
+ <string name="Regular">
+ Regular
+ </string>
+ <string name="Right Part">
+ Raya: der.
+ </string>
+ <string name="Rosy Complexion">
+ Tez sonrosada
+ </string>
+ <string name="Round">
+ Redondear
+ </string>
+ <string name="Ruddiness">
+ Rubicundez
+ </string>
+ <string name="Ruddy">
+ Rojiza
+ </string>
+ <string name="Rumpled Hair">
+ Pelo encrespado
+ </string>
+ <string name="Saddle Bags">
+ Cartucheras
+ </string>
+ <string name="Scrawny Leg">
+ Piernas flacas
+ </string>
+ <string name="Separate">
+ Más ancho
+ </string>
+ <string name="Shallow">
+ Sin marcar
+ </string>
+ <string name="Shear Back">
+ Nuca: corte
+ </string>
+ <string name="Shear Face">
+ Shear Face
+ </string>
+ <string name="Shear Front">
+ Shear Front
+ </string>
+ <string name="Shear Left Up">
+ Arriba - izq.
+ </string>
+ <string name="Shear Right Up">
+ Arriba - der.
+ </string>
+ <string name="Sheared Back">
+ Rapada
+ </string>
+ <string name="Sheared Front">
+ Rapada
+ </string>
+ <string name="Shift Left">
+ A la izq.
+ </string>
+ <string name="Shift Mouth">
+ Boca: ladeada
+ </string>
+ <string name="Shift Right">
+ A la der.
+ </string>
+ <string name="Shirt Bottom">
+ Alto de cintura
+ </string>
+ <string name="Shirt Fit">
+ Ceñido
+ </string>
+ <string name="Shirt Wrinkles">
+ Camisa: arrugas
+ </string>
+ <string name="Shoe Height">
+ Caña: altura
+ </string>
+ <string name="Short">
+ Menos
+ </string>
+ <string name="Short Arms">
+ Brazos cortos
+ </string>
+ <string name="Short Legs">
+ Piernas cortas
+ </string>
+ <string name="Short Neck">
+ Cuello corto
+ </string>
+ <string name="Short Pigtails">
+ Coletas cortas
+ </string>
+ <string name="Short Ponytail">
+ Cola de caballo corta
+ </string>
+ <string name="Short Sideburns">
+ Patillas cortas
+ </string>
+ <string name="Short Torso">
+ Torso corto
+ </string>
+ <string name="Short hips">
+ Cadera corta
+ </string>
+ <string name="Shoulders">
+ Hombros
+ </string>
+ <string name="Side Fringe">
+ Lados: franja
+ </string>
+ <string name="Sideburns">
+ Patillas
+ </string>
+ <string name="Sides Hair">
+ Pelo: lados
+ </string>
+ <string name="Sides Hair Down">
+ Bajar lados del pelo
+ </string>
+ <string name="Sides Hair Up">
+ Subir lados del pelo
+ </string>
+ <string name="Skinny Neck">
+ Cuello estrecho
+ </string>
+ <string name="Skirt Fit">
+ Falda: vuelo
+ </string>
+ <string name="Skirt Length">
+ Falda: largo
+ </string>
+ <string name="Slanted Forehead">
+ Slanted Forehead
+ </string>
+ <string name="Sleeve Length">
+ Largo de manga
+ </string>
+ <string name="Sleeve Looseness">
+ Ancho de puños
+ </string>
+ <string name="Slit Back">
+ Raja trasera
+ </string>
+ <string name="Slit Front">
+ Raja frontal
+ </string>
+ <string name="Slit Left">
+ Raja a la izq.
+ </string>
+ <string name="Slit Right">
+ Raja a la der.
+ </string>
+ <string name="Small">
+ Disminuir
+ </string>
+ <string name="Small Hands">
+ Manos pequeñas
+ </string>
+ <string name="Small Head">
+ Cabeza pequeña
+ </string>
+ <string name="Smooth">
+ Leves
+ </string>
+ <string name="Smooth Hair">
+ Pelo liso
+ </string>
+ <string name="Socks Length">
+ Calcetines: largo
+ </string>
+ <string name="Soulpatch">
+ Perilla
+ </string>
+ <string name="Sparse">
+ Depiladas
+ </string>
+ <string name="Spiked Hair">
+ Crestas
+ </string>
+ <string name="Square">
+ Cuadrada
+ </string>
+ <string name="Square Toe">
+ Punta cuadrada
+ </string>
+ <string name="Squash Head">
+ Cabeza aplastada
+ </string>
+ <string name="Stretch Head">
+ Cabeza estirada
+ </string>
+ <string name="Sunken">
+ Chupadas
+ </string>
+ <string name="Sunken Chest">
+ Estrecho de pecho
+ </string>
+ <string name="Sunken Eyes">
+ Ojos hundidos
+ </string>
+ <string name="Sweep Back">
+ Sweep Back
+ </string>
+ <string name="Sweep Forward">
+ Sweep Forward
+ </string>
+ <string name="Tall">
+ Más
+ </string>
+ <string name="Taper Back">
+ Cubierta trasera
+ </string>
+ <string name="Taper Front">
+ Cubierta frontal
+ </string>
+ <string name="Thick Heels">
+ Tacones grandes
+ </string>
+ <string name="Thick Neck">
+ Cuello ancho
+ </string>
+ <string name="Thick Toe">
+ Empeine alto
+ </string>
+ <string name="Thin">
+ Delgadas
+ </string>
+ <string name="Thin Eyebrows">
+ Cejas finas
+ </string>
+ <string name="Thin Lips">
+ Hacia dentro
+ </string>
+ <string name="Thin Nose">
+ Nariz fina
+ </string>
+ <string name="Tight Chin">
+ Poca papada
+ </string>
+ <string name="Tight Cuffs">
+ Sin campana
+ </string>
+ <string name="Tight Pants">
+ Pantalón ceñido
+ </string>
+ <string name="Tight Shirt">
+ Camisa ceñida
+ </string>
+ <string name="Tight Skirt">
+ Falda ceñida
+ </string>
+ <string name="Tight Sleeves">
+ Puños ceñidos
+ </string>
+ <string name="Toe Shape">
+ Punta: forma
+ </string>
+ <string name="Toe Thickness">
+ Empeine
+ </string>
+ <string name="Torso Length">
+ Torso: longitud
+ </string>
+ <string name="Torso Muscles">
+ Torso: musculatura
+ </string>
+ <string name="Torso Scrawny">
+ Torso flacucho
+ </string>
+ <string name="Unattached">
+ Largos
+ </string>
+ <string name="Uncreased">
+ Abiertos
+ </string>
+ <string name="Underbite">
+ Prognatismo
+ </string>
+ <string name="Unnatural">
+ No natural
+ </string>
+ <string name="Upper Bridge">
+ Puente: arriba
+ </string>
+ <string name="Upper Cheeks">
+ Mejillas: arriba
+ </string>
+ <string name="Upper Chin Cleft">
+ Barbilla: prominencia
+ </string>
+ <string name="Upper Eyelid Fold">
+ Párpados
+ </string>
+ <string name="Upturned">
+ Mucho
+ </string>
+ <string name="Very Red">
+ Del todo
+ </string>
+ <string name="Waist Height">
+ Cintura
+ </string>
+ <string name="Well-Fed">
+ Mofletes
+ </string>
+ <string name="White Hair">
+ Pelo blanco
+ </string>
+ <string name="Wide">
+ Aumentar
+ </string>
+ <string name="Wide Back">
+ Completa
+ </string>
+ <string name="Wide Front">
+ Completa
+ </string>
+ <string name="Wide Lips">
+ Labios anchos
+ </string>
+ <string name="Wild">
+ Total
+ </string>
+ <string name="Wrinkles">
+ Arrugas
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Añadir a mis hitos
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Editar mis hitos
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Ver más información de esta localización
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Historial de mis localizaciones
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Región Adulta
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Región Moderada
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Región General
+ </string>
+ <string name="UpdaterWindowTitle">
+ Actualizar [APP_NAME]
+ </string>
+ <string name="UpdaterNowUpdating">
+ Actualizando [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Instalando [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Tu visor [APP_NAME] se está actualizando a la última versión. Llevará algún tiempo, paciencia.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Descargando la actualización...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Descargando la actualización
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Fallo en la descarga de la actualización
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Ha habido un error actualizando [APP_NAME]. Por favor, descarga la última versión desde www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Fallo al instalar la actualización
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Fallo al iniciar el visor
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Los Ãtems se reciben muy rápido de [FROM_NAME]; desactivada la vista previa automática durante [TIME] sgs.
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Los Ãtems se reciben muy rápido; desactivada la vista previa automática durante [TIME] sgs.
+ </string>
+ <string name="IM_logging_string">
+ -- Activado el registro de los mensajes instantáneos --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] está escribiendo...
+ </string>
+ <string name="Unnamed">
+ (sin nombre)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderado: por defecto, desactivada la voz)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Para esta llamada no está disponible el chat de texto.
+ </string>
+ <string name="IM_muted_text_label">
+ Un moderador del grupo ha desactivado tu chat de texto.
+ </string>
+ <string name="IM_default_text_label">
+ Pulsa aquà para enviar un mensaje instantáneo.
+ </string>
+ <string name="IM_to_label">
+ A
+ </string>
+ <string name="IM_moderator_label">
+ (Moderador)
+ </string>
+ <string name="Saved_message">
+ (Guardado [LONG_TIMESTAMP])
+ </string>
+ <string name="answered_call">
+ Han respondido a tu llamada
+ </string>
+ <string name="you_started_call">
+ Has iniciado una llamada de voz
+ </string>
+ <string name="you_joined_call">
+ Has entrado en la llamada de voz
+ </string>
+ <string name="name_started_call">
+ [NAME] inició una llamada de voz
+ </string>
+ <string name="ringing-im">
+ Haciendo la llamada de voz...
+ </string>
+ <string name="connected-im">
+ Conectado, pulsa Colgar para salir
+ </string>
+ <string name="hang_up-im">
+ Se colgó la llamada de voz
+ </string>
+ <string name="conference-title-incoming">
+ Conferencia con [AGENT_NAME]
+ </string>
+ <string name="inventory_item_offered-im">
+ Ofrecido el item del inventario
+ </string>
+ <string name="no_session_message">
+ (La sesión de MI no existe)
+ </string>
+ <string name="only_user_message">
+ Usted es el único usuario en esta sesión.
+ </string>
+ <string name="offline_message">
+ [NAME] está desconectado.
+ </string>
+ <string name="invite_message">
+ Pulse el botón [BUTTON NAME] para aceptar/conectar este chat de voz.
+ </string>
+ <string name="muted_message">
+ Has ignorado a este residente. Enviándole un mensaje, automáticamente dejarás de ignorarle.
+ </string>
+ <string name="generic">
+ Error en lo solicitado, por favor, inténtalo más tarde.
+ </string>
+ <string name="generic_request_error">
+ Error al hacer lo solicitado; por favor, inténtelo más tarde.
+ </string>
+ <string name="insufficient_perms_error">
+ Usted no tiene permisos suficientes.
+ </string>
+ <string name="session_does_not_exist_error">
+ La sesión ya acabó
+ </string>
+ <string name="no_ability_error">
+ Usted no tiene esa capacidad.
+ </string>
+ <string name="no_ability">
+ Usted no tiene esa capacidad.
+ </string>
+ <string name="not_a_mod_error">
+ Usted no es un moderador de la sesión.
+ </string>
+ <string name="muted">
+ Un moderador del grupo ha desactivado tu chat de texto.
+ </string>
+ <string name="muted_error">
+ Un moderador del grupo le ha desactivado el chat de texto.
+ </string>
+ <string name="add_session_event">
+ No se ha podido añadir usuarios a la sesión de chat con [RECIPIENT].
+ </string>
+ <string name="message">
+ No se ha podido enviar tu mensaje a la sesión de chat con [RECIPIENT].
+ </string>
+ <string name="message_session_event">
+ No se ha podido enviar su mensaje a la sesión de chat con [RECIPIENT].
+ </string>
+ <string name="mute">
+ Error moderando.
+ </string>
+ <string name="removed">
+ Se te ha sacado del grupo.
+ </string>
+ <string name="removed_from_group">
+ Ha sido eliminado del grupo.
+ </string>
+ <string name="close_on_no_ability">
+ Usted ya no tendrá más la capacidad de estar en la sesión de chat.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] ha dicho algo nuevo
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] ha dicho algo nuevo
+ </string>
+ <string name="session_initialization_timed_out_error">
+ Se ha agotado el tiempo del inicio de sesión
+ </string>
+ <string name="voice_morphing_url">
+ http://secondlife.com/landing/voicemorphing
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] te ha pagado [AMOUNT] L$ [REASON].
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] te ha pagado [AMOUNT] L$.
+ </string>
+ <string name="you_paid_ldollars">
+ Has pagado [AMOUNT] L$ a [NAME] por [REASON].
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Has pagado[AMOUNT] L$
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Has pagado [AMOUNT] L$ a [NAME].
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Has pagado [AMOUNT] L$ por [REASON].
+ </string>
+ <string name="for item">
+ para [ITEM]
+ </string>
+ <string name="for a parcel of land">
+ para una parcela de terreno
+ </string>
+ <string name="for a land access pass">
+ para un pase de acceso a terrenos
+ </string>
+ <string name="for deeding land">
+ for deeding land
+ </string>
+ <string name="to create a group">
+ para crear un grupo
+ </string>
+ <string name="to join a group">
+ para entrar a un grupo
+ </string>
+ <string name="to upload">
+ to upload
+ </string>
+ <string name="to publish a classified ad">
+ para publicar un anuncio clasificado
+ </string>
+ <string name="giving">
+ Dando [AMOUNT] L$
+ </string>
+ <string name="uploading_costs">
+ Subir esto cuesta [AMOUNT] L$
+ </string>
+ <string name="this_costs">
+ Esto cuesta [AMOUNT] L$
+ </string>
+ <string name="buying_selected_land">
+ Compra del terreno seleccionado por [AMOUNT] L$
+ </string>
+ <string name="this_object_costs">
+ Este objeto cuesta [AMOUNT] L$
+ </string>
+ <string name="group_role_everyone">
+ Todos
+ </string>
+ <string name="group_role_officers">
+ Oficiales
+ </string>
+ <string name="group_role_owners">
+ Propietarios
+ </string>
+ <string name="group_member_status_online">
+ Conectado/a
+ </string>
+ <string name="uploading_abuse_report">
+ Subiendo...
+
+Denuncia de infracción
+ </string>
+ <string name="New Shape">
+ AnatomÃa nueva
+ </string>
+ <string name="New Skin">
+ Piel nueva
+ </string>
+ <string name="New Hair">
+ Pelo nuevo
+ </string>
+ <string name="New Eyes">
+ Ojos nuevos
+ </string>
+ <string name="New Shirt">
+ Camisa nueva
+ </string>
+ <string name="New Pants">
+ Pantalón nuevo
+ </string>
+ <string name="New Shoes">
+ Zapatos nuevos
+ </string>
+ <string name="New Socks">
+ Calcetines nuevos
+ </string>
+ <string name="New Jacket">
+ Chaqueta nueva
+ </string>
+ <string name="New Gloves">
+ Guantes nuevos
+ </string>
+ <string name="New Undershirt">
+ Camiseta nueva
+ </string>
+ <string name="New Underpants">
+ Ropa interior nueva
+ </string>
+ <string name="New Skirt">
+ Falda nueva
+ </string>
+ <string name="New Alpha">
+ Nueva Alfa
+ </string>
+ <string name="New Tattoo">
+ Tatuaje nuevo
+ </string>
+ <string name="New Physics">
+ Nueva fÃsica
+ </string>
+ <string name="Invalid Wearable">
+ No se puede poner
+ </string>
+ <string name="New Gesture">
+ Gesto nuevo
+ </string>
+ <string name="New Script">
+ Script nuevo
+ </string>
+ <string name="New Note">
+ Nota nueva
+ </string>
+ <string name="New Folder">
+ Carpeta nueva
+ </string>
+ <string name="Contents">
+ Contenidos
+ </string>
+ <string name="Gesture">
+ Gestos
+ </string>
+ <string name="Male Gestures">
+ Gestos de hombre
+ </string>
+ <string name="Female Gestures">
+ Gestos de mujer
+ </string>
+ <string name="Other Gestures">
+ Otros gestos
+ </string>
+ <string name="Speech Gestures">
+ Gestos al hablar
+ </string>
+ <string name="Common Gestures">
+ Gestos corrientes
+ </string>
+ <string name="Male - Excuse me">
+ Varón - Disculpa
+ </string>
+ <string name="Male - Get lost">
+ Varón – Déjame en paz
+ </string>
+ <string name="Male - Blow kiss">
+ Varón - Lanzar un beso
+ </string>
+ <string name="Male - Boo">
+ Varón - Abucheo
+ </string>
+ <string name="Male - Bored">
+ Varón - Aburrido
+ </string>
+ <string name="Male - Hey">
+ Varón – ¡Eh!
+ </string>
+ <string name="Male - Laugh">
+ Varón - Risa
+ </string>
+ <string name="Male - Repulsed">
+ Varón - Rechazo
+ </string>
+ <string name="Male - Shrug">
+ Varón - Encogimiento de hombros
+ </string>
+ <string name="Male - Stick tougue out">
+ Varón - Sacando la lengua
+ </string>
+ <string name="Male - Wow">
+ Varón - Admiración
+ </string>
+ <string name="Female - Chuckle">
+ Mujer - Risa suave
+ </string>
+ <string name="Female - Cry">
+ Mujer - Llorar
+ </string>
+ <string name="Female - Embarrassed">
+ Mujer - Ruborizada
+ </string>
+ <string name="Female - Excuse me">
+ Mujer - Disculpa
+ </string>
+ <string name="Female - Get lost">
+ Mujer – Déjame en paz
+ </string>
+ <string name="Female - Blow kiss">
+ Mujer - Lanzar un beso
+ </string>
+ <string name="Female - Boo">
+ Mujer - Abucheo
+ </string>
+ <string name="Female - Bored">
+ Mujer - Aburrida
+ </string>
+ <string name="Female - Hey">
+ Mujer - ¡Eh!
+ </string>
+ <string name="Female - Hey baby">
+ Mujer - ¡Eh, encanto!
+ </string>
+ <string name="Female - Laugh">
+ Mujer - Risa
+ </string>
+ <string name="Female - Looking good">
+ Mujer - Buen aspecto
+ </string>
+ <string name="Female - Over here">
+ Mujer - Por aquÃ
+ </string>
+ <string name="Female - Please">
+ Mujer - Por favor
+ </string>
+ <string name="Female - Repulsed">
+ Mujer - Rechazo
+ </string>
+ <string name="Female - Shrug">
+ Mujer - Encogimiento de hombros
+ </string>
+ <string name="Female - Stick tougue out">
+ Mujer - Sacando la lengua
+ </string>
+ <string name="Female - Wow">
+ Mujer - Admiración
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ ninguno/ninguno
+ </string>
+ <string name="texture_load_dimensions_error">
+ No se puede subir imágenes mayores de [WIDTH]*[HEIGHT]
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ Parece que hay algún problema que ha escapado a nuestros controles.
+
+ Visita status.secondlifegrid.net para ver si hay alguna incidencia conocida que esté afectando al servicio.
+ Si sigues teniendo problemas, comprueba la configuración de la red y del servidor de seguridad.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ Dom:Lun:Mar:Mié:Jue:Vie:Sáb
+ </string>
+ <string name="dateTimeMonthNames">
+ Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Septiembre:Octubre:Noviembre:Diciembre
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Ene:Feb:Mar:Abr:May:Jun:Jul:Ago:Sep:Oct:Nov:Dic
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ AM
+ </string>
+ <string name="dateTimePM">
+ PM
+ </string>
+ <string name="LocalEstimateUSD">
+ [AMOUNT] US$
+ </string>
+ <string name="Membership">
+ MembresÃa
+ </string>
+ <string name="Roles">
+ Roles
+ </string>
+ <string name="Group Identity">
+ Indentidad de grupo
+ </string>
+ <string name="Parcel Management">
+ Gestión de la parcela
+ </string>
+ <string name="Parcel Identity">
+ Identidad de la parcela
+ </string>
+ <string name="Parcel Settings">
+ Configuración de la parcela
+ </string>
+ <string name="Parcel Powers">
+ Poder de la parcela
+ </string>
+ <string name="Parcel Access">
+ Acceso a la parcela
+ </string>
+ <string name="Parcel Content">
+ Contenido de la parcela
+ </string>
+ <string name="Object Management">
+ Manejo de objetos
+ </string>
+ <string name="Accounting">
+ Contabilidad
+ </string>
+ <string name="Notices">
+ Avisos
+ </string>
+ <string name="Chat" value="Chat :">
+ Chat
+ </string>
+ <string name="DeleteItems">
+ ¿Deseas eliminar los elementos seleccionados?
+ </string>
+ <string name="DeleteItem">
+ ¿Deseas eliminar el elemento seleccionado?
+ </string>
+ <string name="EmptyOutfitText">
+ No hay elementos en este vestuario
+ </string>
+ <string name="ExternalEditorNotSet">
+ Selecciona un editor mediante la configuración de ExternalEditor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ No se encuentra el editor externo especificado.
+Inténtalo incluyendo la ruta de acceso al editor entre comillas
+(por ejemplo, "/ruta a mi/editor" "%s").
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Error al analizar el comando de editor externo.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Error al ejecutar el editor externo.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ Enter
+ </string>
+ <string name="Tab">
+ Tab
+ </string>
+ <string name="Ins">
+ Ins
+ </string>
+ <string name="Del">
+ Del
+ </string>
+ <string name="Backsp">
+ Backsp
+ </string>
+ <string name="Shift">
+ Shift
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Home">
+ Base
+ </string>
+ <string name="End">
+ End
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ Añadir
+ </string>
+ <string name="Subtract">
+ Restar
+ </string>
+ <string name="Multiply">
+ Multiplicar
+ </string>
+ <string name="Divide">
+ Dividir
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ Viendo balizas de partÃculas (azules)
+ </string>
+ <string name="BeaconPhysical">
+ Viendo balizas de objetos materiales (verdes)
+ </string>
+ <string name="BeaconScripted">
+ Viendo balizas de objetos con script (rojas)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Viendo el objeto con script con balizas de función táctil (rojas)
+ </string>
+ <string name="BeaconSound">
+ Viendo balizas de sonido (amarillas)
+ </string>
+ <string name="BeaconMedia">
+ Viendo balizas de medios (blancas)
+ </string>
+ <string name="ParticleHiding">
+ Ocultando las partÃculas
+ </string>
+</strings>
diff --git a/indra/newview/skins/default/xui/fr/floater_tos.xml b/indra/newview/skins/default/xui/fr/floater_tos.xml index 8a2a1e1d25..6d58cf77ca 100644 --- a/indra/newview/skins/default/xui/fr/floater_tos.xml +++ b/indra/newview/skins/default/xui/fr/floater_tos.xml @@ -4,7 +4,7 @@ http://secondlife.com/app/tos/ </floater.string> <floater.string name="loading_url"> - data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Chargement %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3Eles%20Conditions%20d%27utilisation%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <button label="Continuer" label_selected="Continuer" name="Continue"/> <button label="Annuler" label_selected="Annuler" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml index 7e29db6336..2172b9848b 100644 --- a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml @@ -34,10 +34,10 @@ Sostituisci con: </text> <line_editor name="replace_editor" tool_tip="Sostituisci le parole chiave con questi termini. Per esempio, sostituire la parola chiave 'salve' con 'ciao' modificherà la chat 'Volevo solo dire salve' in 'Volevo solo dire ciao' e avvierà la gesture!"/> - <text name="key_label"> + <text name="key_label" width="147"> Scorciatoia da tastiera: </text> - <combo_box label="Nessuno" name="modifier_combo" /> + <combo_box left_delta="150" label="Nessuno" name="modifier_combo" /> <combo_box label="Nessuno" name="key_combo" /> <text name="library_label"> Libreria: diff --git a/indra/newview/skins/default/xui/pl/floater_tos.xml b/indra/newview/skins/default/xui/pl/floater_tos.xml index bb2de773f0..8cdf267f4b 100644 --- a/indra/newview/skins/default/xui/pl/floater_tos.xml +++ b/indra/newview/skins/default/xui/pl/floater_tos.xml @@ -4,7 +4,7 @@ http://secondlife.com/app/tos/ </floater.string> <floater.string name="loading_url"> - data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Åadowanie %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3EWarunki%20Serwisu%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <button label="Kontynuuj" label_selected="Kontynuuj" name="Continue"/> <button label="Anuluj" label_selected="Anuluj" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/pt/floater_pay.xml b/indra/newview/skins/default/xui/pt/floater_pay.xml index 26d5710c4a..8094ad376c 100644 --- a/indra/newview/skins/default/xui/pt/floater_pay.xml +++ b/indra/newview/skins/default/xui/pt/floater_pay.xml @@ -6,18 +6,18 @@ <string name="payee_resident"> Pagar residente </string> - <text left="5" name="payee_label" width="110"> + <text left="5" name="payee_label"> Pagar: </text> <icon name="icon_person" tool_tip="Pessoa"/> - <text left="115" name="payee_name"> + <text name="payee_name"> Test Name That Is Extremely Long To Check Clipping </text> - <button label="L$1" label_selected="L$1" left="112" name="fastpay 1"/> + <button label="L$1" label_selected="L$1" name="fastpay 1"/> <button label="L$5" label_selected="L$5" name="fastpay 5"/> - <button label="L$10" label_selected="L$10" left="112" name="fastpay 10"/> + <button label="L$10" label_selected="L$10" name="fastpay 10"/> <button label="L$20" label_selected="L$20" name="fastpay 20"/> - <text left="4" name="amount text"> + <text name="amount text"> Outro valor: </text> <button label="Pagar" label_selected="Pagar" name="pay btn"/> diff --git a/indra/newview/skins/default/xui/pt/floater_tos.xml b/indra/newview/skins/default/xui/pt/floater_tos.xml index 2675979783..c4954cb61f 100644 --- a/indra/newview/skins/default/xui/pt/floater_tos.xml +++ b/indra/newview/skins/default/xui/pt/floater_tos.xml @@ -4,7 +4,7 @@ http://secondlife.com/app/tos/ </floater.string> <floater.string name="loading_url"> - data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Carregando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Carregando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETermos%20de%20Serviço%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <button label="Continuar" label_selected="Continuar" name="Continue"/> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index 4adfe8e37f..0786a62f13 100644 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -2730,7 +2730,7 @@ O botão será exibido quando houver espaço suficente. Selecione os residentes com quem compartilhar. </notification> <notification name="ShareItemsConfirmation"> - Tem certeza de que quer compartilhar os items abaixo? + Tem certeza de que quer compartilhar os itens abaixo? <nolink>[ITEMS]</nolink> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 6466f42c75..1dbbcafb0e 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -3587,6 +3587,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="conference-title-incoming"> Conversa com [AGENT_NAME] </string> + <string name="inventory_item_offered-im"> + Oferta de item de inventário + </string> <string name="no_session_message"> (Sessão de MI inexistente) </string> diff --git a/indra/newview/skins/default/xui/zh/panel_login.xml b/indra/newview/skins/default/xui/zh/panel_login.xml new file mode 100644 index 0000000000..9d094ff731 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/panel_login.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_login"> + <layout_stack name="login_widgets"> + <layout_panel name="login"> + <text name="username_text"> + 使用者å稱: + </text> + <text name="password_text"> + 密碼: + </text> + <check_box label="記ä½å¯†ç¢¼" name="remember_check"/> + <button label="登入" name="connect_btn"/> + <text name="mode_selection_text"> + 模å¼ï¼š + </text> + <combo_box name="mode_combo" tool_tip="é¸æ“‡ä¸€å€‹ç™»å…¥æ¨¡å¼"> + <combo_box.item label="基礎" name="Basic"/> + <combo_box.item label="進階" name="Advanced"/> + </combo_box> + <text name="start_location_text"> + 開始地點: + </text> + <combo_box name="start_location_combo"> + <combo_box.item label="上一次的地點" name="MyLastLocation"/> + <combo_box.item label="我的家" name="MyHome"/> + <combo_box.item label="<輸入å€åŸŸå>" name="Typeregionname"/> + </combo_box> + </layout_panel> + <layout_panel name="links"> + <text name="create_new_account_text"> + 註冊 + </text> + <text name="forgot_password_text"> + 忘記使用者å稱或密碼? + </text> + <text name="login_help"> + 如何登入? + </text> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png Binary files differnew file mode 100644 index 0000000000..b6e9eef891 --- /dev/null +++ b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png diff --git a/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png Binary files differnew file mode 100644 index 0000000000..687cb7fb53 --- /dev/null +++ b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png diff --git a/indra/newview/skins/minimal/textures/textures.xml b/indra/newview/skins/minimal/textures/textures.xml index b4848a0619..e3ed01721a 100644 --- a/indra/newview/skins/minimal/textures/textures.xml +++ b/indra/newview/skins/minimal/textures/textures.xml @@ -6,4 +6,6 @@ <texture name="bottomtray_close_off" file_name="bottomtray/close_off.png" preload="true" /> <texture name="bottomtray_close_over" file_name="bottomtray/close_over.png" preload="true" /> <texture name="bottomtray_close_press" file_name="bottomtray/close_press.png" preload="true" /> -</textures> + <texture name="Speak_Btn_Off" file_name="bottomtray/Speak_Btn_Off.png" preload="true" scale.left="4" scale.top="16" scale.right="8" scale.bottom="4" /> + <texture name="Speak_Btn_Selected_Press" file_name="bottomtray/Speak_Btn_Selected_Press.png" preload="true" scale.left="4" scale.top="16" scale.right="8" scale.bottom="4" /> + </textures> diff --git a/indra/newview/skins/minimal/xui/en/main_view.xml b/indra/newview/skins/minimal/xui/en/main_view.xml index 45ba785c1f..6e8ad9adaf 100644 --- a/indra/newview/skins/minimal/xui/en/main_view.xml +++ b/indra/newview/skins/minimal/xui/en/main_view.xml @@ -8,13 +8,13 @@ tab_stop="false" name="main_view" width="1024"> - <panel top="0" - follows="all" - height="768" - mouse_opaque="false" - name="login_panel_holder" - width="1024"/> - + <panel top="0" + follows="all" + height="768" + mouse_opaque="false" + name="login_panel_holder" + width="1024"/> + <layout_stack border_size="0" follows="all" mouse_opaque="false" @@ -96,6 +96,7 @@ name="stand_stop_flying_container" visible="false" width="500"/> + <panel follows="all" height="500" left="0" diff --git a/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml index b55e677276..80cf365c46 100644 --- a/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml +++ b/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml @@ -25,6 +25,14 @@ <menu_item_call.on_click function="Avatar.SendIM" /> </menu_item_call> + <menu_item_call + label="Call" + name="Call"> + <menu_item_call.on_click + function="Avatar.Call" /> + <menu_item_call.on_enable + function="Avatar.EnableCall" /> + </menu_item_call> <menu_item_separator /> <menu_item_call enabled="false" diff --git a/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml index b76629f401..2c81b5a778 100644 --- a/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml +++ b/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml @@ -25,6 +25,14 @@ <menu_item_call.on_click function="Avatar.SendIM" /> </menu_item_call> + <menu_item_call + label="Call" + name="Call"> + <menu_item_call.on_click + function="Avatar.Call" /> + <menu_item_call.on_enable + function="Avatar.EnableCall" /> + </menu_item_call> <menu_item_separator /> <menu_item_call enabled="false" diff --git a/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml index 5a4a059781..a11e367d66 100644 --- a/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml @@ -27,6 +27,15 @@ function="InspectAvatar.IM"/> </menu_item_call> <menu_item_call + label="Call" + enabled="true" + name="call"> + <menu_item_call.on_click + function="InspectAvatar.Call"/> + <menu_item_call.on_enable + function="InspectAvatar.Gear.EnableCall"/> + </menu_item_call> + <menu_item_call label="Teleport" name="teleport"> <menu_item_call.on_click diff --git a/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml index 3d64133f54..1840ebd491 100644 --- a/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml +++ b/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml @@ -36,6 +36,16 @@ <menu_item_call.on_click function="Avatar.IM" /> </menu_item_call> + <menu_item_call + label="Call" + layout="topleft" + name="Call"> + <menu_item_call.on_click + function="Avatar.Call" /> + <menu_item_call.on_enable + function="Avatar.EnableItem" + parameter="can_call" /> + </menu_item_call> <menu_item_check label="Block/Unblock" layout="topleft" diff --git a/indra/newview/skins/minimal/xui/en/notification_visibility.xml b/indra/newview/skins/minimal/xui/en/notification_visibility.xml index 616b544847..bdd3c3d4a4 100644 --- a/indra/newview/skins/minimal/xui/en/notification_visibility.xml +++ b/indra/newview/skins/minimal/xui/en/notification_visibility.xml @@ -1,12 +1,9 @@ <?xml version="1.0" ?> <notification_visibility> - <respond name="VoiceInviteP2P" response="Decline"/> - <respond name="VoiceInviteAdHoc" response="Decline"/> <respond name="VoiceInviteGroup" response="Decline"/> <!-- group and voice are disabled features --> <hide tag="group"/> - <hide tag="voice"/> <!-- no spammy scripts --> <!-- <hide name="ScriptDialog"/> --> @@ -16,6 +13,7 @@ <hide name="FirstInventory"/> <hide name="HintSidePanel"/> <hide name="HintMove"/> + <hide name="HintSpeak"/> <hide name="HintDisplayName"/> <hide name="HintInventory"/> <hide name="HintLindenDollar"/> diff --git a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml index 5730adab8a..39d1a90850 100644 --- a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml @@ -42,5 +42,40 @@ show_speaking_indicator="false" width="147" /> </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="130" + name="call_btn_panel" + user_resize="false" + visible="false"> + <button + follows="all" + height="20" + label="Call" + name="call_btn" + width="130" + top="5" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="130" + name="end_call_btn_panel" + user_resize="false" + visible="false"> + <button + follows="all" + height="20" + label="Leave Call" + name="end_call_btn" + top="5"/> + </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml index e0c0bd13d9..d722c54081 100644 --- a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml @@ -47,7 +47,7 @@ mouse_opaque="false" name="chat_bar_layout_panel" user_resize="true" - width="308" > + width="312" > <panel name="chat_bar" filename="panel_nearby_chat_bar.xml" @@ -61,6 +61,79 @@ </layout_panel> <layout_panel auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="35" + mouse_opaque="false" + name="speak_panel" + top_delta="0" + user_resize="false" + width="85"> + <button + follows="left|right" + height="23" + layout="topleft" + label="Speak" + left="0" + name="speak_btn" + tool_tip="Turn your microphone on and off" + pad_right="30" + halign="center" + use_ellipses="true" + tab_stop="true" + is_toggle="true" + image_selected="Speak_Btn_Selected_Press" + image_unselected="Speak_Btn_Off" + image_pressed="Speak_Btn_Selected_Press" + image_pressed_selected="Speak_Btn_Selected_Press" + top="5" + width="85"> + + <commit_callback + function="ToggleSpeak" + parameter="f1_help" /> + </button> + </layout_panel> + + <layout_panel + auto_resize="false" + follows="left|right" + height="28" + layout="topleft" + min_height="28" + min_width="20" + mouse_opaque="false" + name="speak_flyout_panel" + top_delta="0" + user_resize="false" + width="26"> + <button + follows="left|right" + width="20" + top="5" + left="0" + height="23" + name="flyout_btn" + label="" + tab_stop="false" + tool_tip="Change your sound preferences" + is_toggle="true" + image_disabled="ComboButton_UpOff" + image_unselected="ComboButton_UpOff" + image_selected="ComboButton_On" + image_pressed="ComboButton_UpSelected" + image_pressed_selected="ComboButton_Selected"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="sound_devices" /> + </button> + + </layout_panel> + + <layout_panel + auto_resize="false" follows="right" height="28" layout="topleft" @@ -70,7 +143,7 @@ name="gesture_panel" top_delta="0" user_resize="false" - width="85"> + width="88"> <gesture_combo_list follows="left|right" height="23" @@ -80,7 +153,7 @@ view_all="false" left="0" name="Gesture" - tool_tip="Shows/hides gestures" + tool_tip="Make your avatar do things" top="5" width="82"> <combo_button @@ -101,7 +174,7 @@ mouse_opaque="false" name="cam_panel" user_resize="false" - width="83"> + width="86"> <bottomtray_button can_drag="false" follows="left|right" @@ -114,7 +187,7 @@ layout="topleft" left="0" name="camera_btn" - tool_tip="Shows/hides camera controls" + tool_tip="Control your camera angle" top="5" use_ellipses="true" width="80"> @@ -128,15 +201,15 @@ follows="left|right" height="28" layout="topleft" - min_width="17" - name="splitter_panel" + min_width="8" + name="splitter_panel_1" user_resize="false" - width="17"> + width="8"> <icon follows="left|bottom" height="18" width="2" - left="6" + left="0" image_name="Button_Separator" name="separator" top="7"/> @@ -149,9 +222,9 @@ min_height="28" min_width="83" mouse_opaque="false" - name="avatar_and_destinations_panel" + name="destinations_panel" user_resize="false" - width="103"> + width="106"> <bottomtray_button can_drag="false" follows="left|right" @@ -163,7 +236,7 @@ layout="topleft" left="0" name="destination_btn" - tool_tip="Shows destinations window" + tool_tip="Travel through Second Life" top="5" is_toggle="true" use_ellipses="true" @@ -180,9 +253,9 @@ min_height="28" min_width="73" mouse_opaque="false" - name="avatar_and_destinations_panel" + name="avatar_panel" user_resize="false" - width="103"> + width="106"> <bottomtray_button can_drag="false" follows="left|right" @@ -196,6 +269,7 @@ name="avatar_btn" top="5" is_toggle="true" + tool_tip="Change your appearance" use_ellipses="true" width="100"> <bottomtray_button.commit_callback @@ -207,15 +281,15 @@ follows="left|right" height="28" layout="topleft" - min_width="17" - name="splitter_panel" + min_width="8" + name="splitter_panel_2" user_resize="false" - width="17"> + width="8"> <icon follows="left|bottom" height="18" width="2" - left="6" + left="0" image_name="Button_Separator" name="separator" top="7"/> @@ -231,7 +305,7 @@ name="people_panel" top_delta="0" user_resize="false" - width="105"> + width="106"> <bottomtray_button can_drag="false" follows="left|right" @@ -243,7 +317,7 @@ layout="topleft" left="0" name="show_people_button" - tool_tip="Shows people window" + tool_tip="Find people in Second Life" top="5" is_toggle="true" use_ellipses="true" @@ -264,7 +338,7 @@ name="profile_panel" top_delta="0" user_resize="false" - width="105"> + width="106"> <bottomtray_button can_drag="false" follows="left|right" @@ -276,7 +350,7 @@ layout="topleft" left="0" name="show_profile_btn" - tool_tip="Shows profile window" + tool_tip="View and edit your Profile" is_toggle="true" top="5" use_ellipses="true" @@ -297,7 +371,7 @@ name="howto_panel" top_delta="0" user_resize="false" - width="105"> + width="106"> <bottomtray_button can_drag="false" follows="left|right" @@ -309,7 +383,7 @@ layout="topleft" left="0" name="show_help_btn" - tool_tip="Open Second Life How To topics" + tool_tip="View Second Life help info" is_toggle="true" top="5" use_ellipses="true" diff --git a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml index c3f46f11e0..be13bc1bb7 100644 --- a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml +++ b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml @@ -78,6 +78,39 @@ width="140" /> </layout_panel> <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="140" + name="call_btn_panel" + user_resize="false"> + <button + follows="left|top|right" + height="23" + label="Call" + name="call_btn" + width="140" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="140" + name="end_call_btn_panel" + user_resize="false" + visible="false"> + <button + follows="left|top|right" + height="23" + label="End Call" + name="end_call_btn" + width="140" /> + </layout_panel> + <layout_panel mouse_opaque="false" auto_resize="true" follows="top|left" diff --git a/indra/newview/skins/minimal/xui/en/panel_people.xml b/indra/newview/skins/minimal/xui/en/panel_people.xml index 4a72653d76..76baacb091 100644 --- a/indra/newview/skins/minimal/xui/en/panel_people.xml +++ b/indra/newview/skins/minimal/xui/en/panel_people.xml @@ -452,6 +452,27 @@ Looking for people to hang out with? Try the Destinations button below. name="chat_btn_lp" user_resize="false" auto_resize="true" + width="52"> + <button + follows="bottom|left|right" + left="1" + height="23" + label="Call" + layout="topleft" + name="call_btn" + tool_tip="Call this Resident" + top="0" + width="51" /> + </layout_panel> + + <layout_panel + follows="bottom|left|right" + height="23" + layout="bottomleft" + left_pad="3" + name="chat_btn_lp" + user_resize="false" + auto_resize="true" width="77"> <button follows="bottom|left|right" diff --git a/indra/newview/skins/minimal/xui/es/menu_favorites.xml b/indra/newview/skins/minimal/xui/es/menu_favorites.xml index c8a7858ddb..85210d5c49 100644 --- a/indra/newview/skins/minimal/xui/es/menu_favorites.xml +++ b/indra/newview/skins/minimal/xui/es/menu_favorites.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="Popup"> - <menu_item_call label="Teleportarse" name="Teleport To Landmark"/> + <menu_item_call label="Teleportar" name="Teleport To Landmark"/> <menu_item_call label="Ver/Editar el hito" name="Landmark Open"/> <menu_item_call label="Copiar la SLurl" name="Copy slurl"/> <menu_item_call label="Mostrar en el mapa" name="Show On Map"/> diff --git a/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml index ebe33cea11..b4b964d096 100644 --- a/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml @@ -3,7 +3,7 @@ <menu_item_call label="Ver el perfil" name="view_profile"/> <menu_item_call label="Añadir como amigo" name="add_friend"/> <menu_item_call label="MI" name="im"/> - <menu_item_call label="Teleportarse" name="teleport"/> + <menu_item_call label="Teleportar" name="teleport"/> <menu_item_call label="Ignorar" name="block"/> <menu_item_call label="Designorar" name="unblock"/> <menu_item_call label="Denunciar" name="report"/> diff --git a/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml index ed33c55aca..c482907812 100644 --- a/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml +++ b/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Teleport History Item Context Menu"> - <menu_item_call label="Teleportarse" name="Teleport"/> + <menu_item_call label="Teleportar" name="Teleport"/> <menu_item_call label="Más información" name="More Information"/> <menu_item_call label="Copiar al portapapeles" name="CopyToClipboard"/> </context_menu> diff --git a/indra/newview/tests/gpus_results.txt b/indra/newview/tests/gpus_results.txt new file mode 100644 index 0000000000..7e9a064921 --- /dev/null +++ b/indra/newview/tests/gpus_results.txt @@ -0,0 +1,1595 @@ +GPU String Supported? Class Recognizer +------------------------------------------------------------------------------------------------------ ----------- ----- ------------------------------------ +ATI UNRECOGNIZED +ATI 3D-Analyze unsupported 0 ATI 3D-Analyze +ATI ASUS A9xxx supported 1 ATI ASUS A9xxx +ATI ASUS AH24xx supported 1 ATI ASUS AH24xx +ATI ASUS AH26xx supported 3 ATI ASUS AH26xx +ATI ASUS AH34xx supported 1 ATI ASUS AH34xx +ATI ASUS AH36xx supported 3 ATI ASUS AH36xx +ATI ASUS AH46xx supported 3 ATI ASUS AH46xx +ATI ASUS AX3xx supported 1 ATI ASUS AX3xx +ATI ASUS AX5xx supported 1 ATI ASUS AX5xx +ATI ASUS AX8xx supported 2 ATI ASUS AX8xx +ATI ASUS EAH38xx supported 3 ATI ASUS EAH38xx +ATI ASUS EAH43xx supported 1 ATI ASUS EAH43xx +ATI ASUS EAH45xx supported 1 ATI ASUS EAH45xx +ATI ASUS EAH48xx supported 3 ATI ASUS EAH48xx +ATI ASUS EAH57xx supported 3 ATI ASUS EAH57xx +ATI ASUS EAH58xx supported 3 ATI ASUS EAH58xx +ATI ASUS X1xxx supported 3 ATI ASUS Radeon X1xxx +ATI All-in-Wonder 9xxx supported 1 ATI All-in-Wonder 9xxx +ATI All-in-Wonder HD supported 1 ATI All-in-Wonder HD +ATI All-in-Wonder PCI-E supported 1 ATI All-in-Wonder PCI-E +ATI All-in-Wonder X1800 supported 3 ATI All-in-Wonder X1800 +ATI All-in-Wonder X1900 supported 3 ATI All-in-Wonder X1900 +ATI All-in-Wonder X600 supported 1 ATI All-in-Wonder X600 +ATI All-in-Wonder X800 supported 2 ATI All-in-Wonder X800 +ATI Diamond X1xxx supported 0 ATI Radeon X1xxx +ATI Display Adapter UNRECOGNIZED +ATI FireGL supported 0 ATI FireGL +ATI FireGL 5200 supported 0 ATI FireGL +ATI FireGL 5xxx supported 0 ATI FireGL +ATI FireMV supported 0 ATI FireMV +ATI Generic unsupported 0 ATI Generic +ATI Hercules 9800 supported 1 ATI Hercules 9800 +ATI IGP 340M unsupported 0 ATI IGP 340M +ATI M52 supported 1 ATI M52 +ATI M54 supported 1 ATI M54 +ATI M56 supported 1 ATI M56 +ATI M71 supported 1 ATI M71 +ATI M72 supported 1 ATI M72 +ATI M76 supported 3 ATI M76 +ATI Mobility Radeon supported 0 ATI Mobility Radeon +ATI Mobility Radeon 7xxx supported 0 ATI Mobility Radeon 7xxx +ATI Mobility Radeon 9600 supported 0 ATI Mobility Radeon 9600 +ATI Mobility Radeon 9700 supported 1 ATI Mobility Radeon 9700 +ATI Mobility Radeon 9800 supported 1 ATI Mobility Radeon 9800 +ATI Mobility Radeon HD 2300 supported 1 ATI Mobility Radeon HD 2300 +ATI Mobility Radeon HD 2400 supported 1 ATI Mobility Radeon HD 2400 +ATI Mobility Radeon HD 2600 supported 3 ATI Mobility Radeon HD 2600 +ATI Mobility Radeon HD 2700 supported 3 ATI Mobility Radeon HD 2700 +ATI Mobility Radeon HD 3400 supported 2 ATI Mobility Radeon HD 3400 +ATI Mobility Radeon HD 3600 supported 3 ATI Mobility Radeon HD 3600 +ATI Mobility Radeon HD 3800 supported 3 ATI Mobility Radeon HD 3800 +ATI Mobility Radeon HD 4200 supported 2 ATI Mobility Radeon HD 4200 +ATI Mobility Radeon HD 4300 supported 2 ATI Mobility Radeon HD 4300 +ATI Mobility Radeon HD 4500 supported 3 ATI Mobility Radeon HD 4500 +ATI Mobility Radeon HD 4600 supported 3 ATI Mobility Radeon HD 4600 +ATI Mobility Radeon HD 4800 supported 3 ATI Mobility Radeon HD 4800 +ATI Mobility Radeon HD 5400 supported 2 ATI Mobility Radeon HD 5400 +ATI Mobility Radeon HD 5600 supported 2 ATI Mobility Radeon HD 5600 +ATI Mobility Radeon X1xxx supported 0 ATI Radeon X1xxx +ATI Mobility Radeon X2xxx supported 0 ATI Mobility Radeon X2xxx +ATI Mobility Radeon X3xx supported 1 ATI Mobility Radeon X3xx +ATI Mobility Radeon X6xx supported 1 ATI Mobility Radeon X6xx +ATI Mobility Radeon X7xx supported 1 ATI Mobility Radeon X7xx +ATI Mobility Radeon Xxxx supported 0 ATI Mobility Radeon Xxxx +ATI RV380 supported 0 ATI RV380 +ATI RV530 supported 1 ATI RV530 +ATI Radeon 2100 supported 0 ATI Radeon 2100 +ATI Radeon 3000 supported 0 ATI Radeon 3000 +ATI Radeon 3100 supported 1 ATI Radeon 3100 +ATI Radeon 7000 supported 0 ATI Radeon 7xxx +ATI Radeon 7xxx supported 0 ATI Radeon 7xxx +ATI Radeon 8xxx supported 0 ATI Radeon 8xxx +ATI Radeon 9000 supported 0 ATI Radeon 9000 +ATI Radeon 9100 supported 0 ATI Radeon 9100 +ATI Radeon 9200 supported 0 ATI Radeon 9200 +ATI Radeon 9500 supported 0 ATI Radeon 9500 +ATI Radeon 9600 supported 0 ATI Radeon 9600 +ATI Radeon 9700 supported 1 ATI Radeon 9700 +ATI Radeon 9800 supported 1 ATI Radeon 9800 +ATI Radeon HD 2300 supported 0 ATI Radeon HD 2300 +ATI Radeon HD 2400 supported 1 ATI Radeon HD 2400 +ATI Radeon HD 2600 supported 2 ATI Radeon HD 2600 +ATI Radeon HD 2900 supported 3 ATI Radeon HD 2900 +ATI Radeon HD 3000 supported 0 ATI Radeon HD 3000 +ATI Radeon HD 3100 supported 1 ATI Radeon HD 3100 +ATI Radeon HD 3200 supported 0 ATI Radeon HD 3200 +ATI Radeon HD 3300 supported 1 ATI Radeon HD 3300 +ATI Radeon HD 3400 supported 1 ATI Radeon HD 3400 +ATI Radeon HD 3600 supported 3 ATI Radeon HD 3600 +ATI Radeon HD 3800 supported 3 ATI Radeon HD 3800 +ATI Radeon HD 4200 supported 1 ATI Radeon HD 4200 +ATI Radeon HD 4300 supported 1 ATI Radeon HD 4300 +ATI Radeon HD 4500 supported 3 ATI Radeon HD 4500 +ATI Radeon HD 4600 supported 3 ATI Radeon HD 4600 +ATI Radeon HD 4700 supported 3 ATI Radeon HD 4700 +ATI Radeon HD 4800 supported 3 ATI Radeon HD 4800 +ATI Radeon HD 5400 supported 3 ATI Radeon HD 5400 +ATI Radeon HD 5500 supported 3 ATI Radeon HD 5500 +ATI Radeon HD 5600 supported 3 ATI Radeon HD 5600 +ATI Radeon HD 5700 supported 3 ATI Radeon HD 5700 +ATI Radeon HD 5800 supported 3 ATI Radeon HD 5800 +ATI Radeon HD 5900 supported 3 ATI Radeon HD 5900 +ATI Radeon HD 6200 supported 2 ATI Radeon HD 6200 +ATI Radeon HD 6300 supported 2 ATI Radeon HD 6300 +ATI Radeon HD 6500 supported 3 ATI Radeon HD 6500 +ATI Radeon HD 6800 supported 3 ATI Radeon HD 6800 +ATI Radeon HD 6900 supported 3 ATI Radeon HD 6900 +ATI Radeon OpenGL supported 0 ATI Radeon +ATI Radeon RV250 supported 0 ATI Radeon RV250 +ATI Radeon RV600 supported 1 ATI Radeon RV600 +ATI Radeon RX9550 supported 1 ATI Radeon RX9550 +ATI Radeon VE unsupported 0 ATI Radeon VE +ATI Radeon X1000 supported 0 ATI Radeon X1xxx +ATI Radeon X1200 supported 0 ATI Radeon X1xxx +ATI Radeon X1300 supported 0 ATI Radeon X1xxx +ATI Radeon X13xx supported 0 ATI Radeon X1xxx +ATI Radeon X1400 supported 0 ATI Radeon X1xxx +ATI Radeon X1500 supported 0 ATI Radeon X1xxx +ATI Radeon X1600 supported 0 ATI Radeon X1xxx +ATI Radeon X16xx supported 0 ATI Radeon X1xxx +ATI Radeon X1700 supported 0 ATI Radeon X1xxx +ATI Radeon X1800 supported 0 ATI Radeon X1xxx +ATI Radeon X1900 supported 0 ATI Radeon X1xxx +ATI Radeon X19xx supported 0 ATI Radeon X1xxx +ATI Radeon X1xxx supported 0 ATI Radeon X1xxx +ATI Radeon X300 supported 0 ATI Radeon X300 +ATI Radeon X500 supported 0 ATI Radeon X500 +ATI Radeon X600 supported 1 ATI Radeon X600 +ATI Radeon X700 supported 1 ATI Radeon X700 +ATI Radeon X7xx supported 1 ATI Radeon X700 +ATI Radeon X800 supported 2 ATI Radeon X800 +ATI Radeon Xpress supported 0 ATI Radeon Xpress +ATI Rage 128 supported 0 ATI Rage 128 +ATI Technologies Inc. supported 0 ATI Technologies +ATI Technologies Inc. x86 supported 0 ATI Technologies +ATI Technologies Inc. x86/SSE2 supported 0 ATI Technologies +ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5730 supported 3 ATI Mobility Radeon HD 5700 +ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. AMD 760G supported 1 ATI 760G/Radeon 3000 +ATI Technologies Inc. AMD 760G (Microsoft WDDM 1.1) supported 1 ATI 760G/Radeon 3000 +ATI Technologies Inc. AMD 780L supported 1 ATI 780L/Radeon 3000 +ATI Technologies Inc. AMD FirePro 2270 supported 1 ATI FirePro 2000 +ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100 supported 0 ATI Mobility Radeon 4100 +ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200 supported 2 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250 supported 2 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. AMD RADEON HD 6450 supported 3 ATI Radeon HD 6400 +ATI Technologies Inc. AMD Radeon HD 6200 series Graphics supported 2 ATI Radeon HD 6200 +ATI Technologies Inc. AMD Radeon HD 6250 Graphics supported 2 ATI Radeon HD 6200 +ATI Technologies Inc. AMD Radeon HD 6300 series Graphics supported 2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6300M Series supported 2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6310 Graphics supported 2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6310M supported 2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6330M supported 2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6350 supported 2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6370M supported 2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6400M Series supported 3 ATI Radeon HD 6400 +ATI Technologies Inc. AMD Radeon HD 6450 supported 3 ATI Radeon HD 6400 +ATI Technologies Inc. AMD Radeon HD 6470M supported 3 ATI Radeon HD 6400 +ATI Technologies Inc. AMD Radeon HD 6490M supported 3 ATI Radeon HD 6400 +ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series supported 3 ATI Radeon HD 6500 +ATI Technologies Inc. AMD Radeon HD 6530M supported 3 ATI Radeon HD 6500 +ATI Technologies Inc. AMD Radeon HD 6550M supported 3 ATI Radeon HD 6500 +ATI Technologies Inc. AMD Radeon HD 6570 supported 3 ATI Radeon HD 6500 +ATI Technologies Inc. AMD Radeon HD 6570M supported 3 ATI Radeon HD 6500 +ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series supported 3 ATI Radeon HD 6500 +ATI Technologies Inc. AMD Radeon HD 6600M Series supported 3 ATI Radeon HD 66xx +ATI Technologies Inc. AMD Radeon HD 6650M supported 3 ATI Radeon HD 66xx +ATI Technologies Inc. AMD Radeon HD 6670 supported 3 ATI Radeon HD 66xx +ATI Technologies Inc. AMD Radeon HD 6700 Series supported 3 ATI Radeon HD 6700 +ATI Technologies Inc. AMD Radeon HD 6750 supported 3 ATI Radeon HD 6700 +ATI Technologies Inc. AMD Radeon HD 6750M supported 3 ATI Radeon HD 6700 +ATI Technologies Inc. AMD Radeon HD 6770 supported 3 ATI Radeon HD 6700 +ATI Technologies Inc. AMD Radeon HD 6800 Series supported 3 ATI Radeon HD 6800 +ATI Technologies Inc. AMD Radeon HD 6850M supported 3 ATI Radeon HD 6800 +ATI Technologies Inc. AMD Radeon HD 6870 supported 3 ATI Radeon HD 6800 +ATI Technologies Inc. AMD Radeon HD 6870M supported 3 ATI Radeon HD 6800 +ATI Technologies Inc. AMD Radeon HD 6900 Series supported 3 ATI Radeon HD 6900 +ATI Technologies Inc. AMD Radeon HD 6970M supported 3 ATI Radeon HD 6900 +ATI Technologies Inc. AMD Radeon HD 6990 supported 3 ATI Radeon HD 6900 +ATI Technologies Inc. AMD Radeon(TM) HD 6470M supported 0 ATI Technologies +ATI Technologies Inc. ASUS 5870 Eyefinity 6 supported 0 ATI Technologies +ATI Technologies Inc. ASUS AH2600 Series supported 3 ATI ASUS AH26xx +ATI Technologies Inc. ASUS AH3450 Series supported 1 ATI ASUS AH34xx +ATI Technologies Inc. ASUS AH3650 Series supported 3 ATI ASUS AH36xx +ATI Technologies Inc. ASUS AH4650 Series supported 3 ATI ASUS AH46xx +ATI Technologies Inc. ASUS ARES supported 0 ATI Technologies +ATI Technologies Inc. ASUS EAH2900 Series supported 0 ATI Technologies +ATI Technologies Inc. ASUS EAH3450 Series supported 1 ATI ASUS AH34xx +ATI Technologies Inc. ASUS EAH3650 Series supported 3 ATI ASUS AH36xx +ATI Technologies Inc. ASUS EAH4350 series supported 1 ATI ASUS EAH43xx +ATI Technologies Inc. ASUS EAH4550 series supported 1 ATI ASUS EAH45xx +ATI Technologies Inc. ASUS EAH4650 series supported 3 ATI ASUS AH46xx +ATI Technologies Inc. ASUS EAH4670 series supported 3 ATI ASUS AH46xx +ATI Technologies Inc. ASUS EAH4750 Series supported 0 ATI Technologies +ATI Technologies Inc. ASUS EAH4770 Series supported 0 ATI Technologies +ATI Technologies Inc. ASUS EAH4770 series supported 0 ATI Technologies +ATI Technologies Inc. ASUS EAH4850 series supported 3 ATI ASUS EAH48xx +ATI Technologies Inc. ASUS EAH5450 Series supported 0 ATI Technologies +ATI Technologies Inc. ASUS EAH5550 Series supported 0 ATI Technologies +ATI Technologies Inc. ASUS EAH5570 series supported 0 ATI Technologies +ATI Technologies Inc. ASUS EAH5670 Series supported 0 ATI Technologies +ATI Technologies Inc. ASUS EAH5750 Series supported 3 ATI ASUS EAH57xx +ATI Technologies Inc. ASUS EAH5770 Series supported 3 ATI ASUS EAH57xx +ATI Technologies Inc. ASUS EAH5830 Series supported 3 ATI ASUS EAH58xx +ATI Technologies Inc. ASUS EAH5850 Series supported 3 ATI ASUS EAH58xx +ATI Technologies Inc. ASUS EAH5870 Series supported 3 ATI ASUS EAH58xx +ATI Technologies Inc. ASUS EAH5970 Series supported 0 ATI Technologies +ATI Technologies Inc. ASUS EAH6850 Series supported 0 ATI Technologies +ATI Technologies Inc. ASUS EAH6870 Series supported 0 ATI Technologies +ATI Technologies Inc. ASUS EAH6950 Series supported 0 ATI Technologies +ATI Technologies Inc. ASUS EAH6970 Series supported 0 ATI Technologies +ATI Technologies Inc. ASUS EAHG4670 series supported 0 ATI Technologies +ATI Technologies Inc. ASUS Extreme AX600 Series supported 0 ATI Technologies +ATI Technologies Inc. ASUS Extreme AX600XT-TD supported 0 ATI Technologies +ATI Technologies Inc. ASUS X1300 Series x86/SSE2 supported 3 ATI ASUS Radeon X1xxx +ATI Technologies Inc. ASUS X1550 Series supported 3 ATI ASUS Radeon X1xxx +ATI Technologies Inc. ASUS X1950 Series x86/SSE2 supported 3 ATI ASUS Radeon X1xxx +ATI Technologies Inc. ASUS X800 Series supported 0 ATI Technologies +ATI Technologies Inc. ASUS X850 Series supported 0 ATI Technologies +ATI Technologies Inc. ATI All-in-Wonder HD supported 1 ATI All-in-Wonder HD +ATI Technologies Inc. ATI FirePro 2260 supported 1 ATI FirePro 2000 +ATI Technologies Inc. ATI FirePro 2450 supported 1 ATI FirePro 2000 +ATI Technologies Inc. ATI FirePro M5800 supported 3 ATI FirePro M5800 +ATI Technologies Inc. ATI FirePro M7740 supported 3 ATI FirePro M7740 +ATI Technologies Inc. ATI FirePro M7820 supported 3 ATI FirePro M7820 +ATI Technologies Inc. ATI FirePro V3700 (FireGL) supported 0 ATI FireGL +ATI Technologies Inc. ATI FirePro V3800 supported 1 ATI FirePro 3000 +ATI Technologies Inc. ATI FirePro V4800 supported 2 ATI FirePro 4000 +ATI Technologies Inc. ATI FirePro V4800 (FireGL) supported 0 ATI FireGL +ATI Technologies Inc. ATI FirePro V5800 supported 3 ATI FirePro 5000 +ATI Technologies Inc. ATI FirePro V7800 supported 3 ATI FirePro 7000 +ATI Technologies Inc. ATI MOBILITY RADEON 9XXX x86/SSE2 supported 0 ATI Mobility Radeon Xxxx +ATI Technologies Inc. ATI MOBILITY RADEON HD 3450 supported 2 ATI Mobility Radeon HD 3400 +ATI Technologies Inc. ATI MOBILITY RADEON X1600 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI MOBILITY RADEON X2300 supported 0 ATI Mobility Radeon X2xxx +ATI Technologies Inc. ATI MOBILITY RADEON X2300 HD x86/SSE2 supported 0 ATI Mobility Radeon X2xxx +ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2 supported 0 ATI Mobility Radeon X2xxx +ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/SSE2 supported 0 ATI Mobility Radeon X2xxx +ATI Technologies Inc. ATI MOBILITY RADEON X300 supported 1 ATI Mobility Radeon X3xx +ATI Technologies Inc. ATI MOBILITY RADEON X600 supported 1 ATI Mobility Radeon X6xx +ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200 supported 0 ATI Mobility Radeon Xxxx +ATI Technologies Inc. ATI Mobility FireGL V5700 supported 1 ATI FireGL 5xxx +ATI Technologies Inc. ATI Mobility Radeon 4100 supported 0 ATI Mobility Radeon 4100 +ATI Technologies Inc. ATI Mobility Radeon Graphics supported 0 ATI Mobility Radeon +ATI Technologies Inc. ATI Mobility Radeon HD 2300 supported 1 ATI Mobility Radeon HD 2300 +ATI Technologies Inc. ATI Mobility Radeon HD 2400 supported 1 ATI Mobility Radeon HD 2400 +ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT supported 1 ATI Mobility Radeon HD 2400 +ATI Technologies Inc. ATI Mobility Radeon HD 2600 supported 3 ATI Mobility Radeon HD 2600 +ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT supported 3 ATI Mobility Radeon HD 2600 +ATI Technologies Inc. ATI Mobility Radeon HD 2700 supported 3 ATI Mobility Radeon HD 2700 +ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series supported 2 ATI Mobility Radeon HD 3400 +ATI Technologies Inc. ATI Mobility Radeon HD 3430 supported 2 ATI Mobility Radeon HD 3400 +ATI Technologies Inc. ATI Mobility Radeon HD 3450 supported 2 ATI Mobility Radeon HD 3400 +ATI Technologies Inc. ATI Mobility Radeon HD 3470 supported 2 ATI Mobility Radeon HD 3400 +ATI Technologies Inc. ATI Mobility Radeon HD 3470 Hybrid X2 supported 2 ATI Mobility Radeon HD 3400 +ATI Technologies Inc. ATI Mobility Radeon HD 3650 supported 3 ATI Mobility Radeon HD 3600 +ATI Technologies Inc. ATI Mobility Radeon HD 4200 supported 2 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series supported 2 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. ATI Mobility Radeon HD 4225 supported 2 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series supported 2 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. ATI Mobility Radeon HD 4250 supported 2 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics supported 2 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. ATI Mobility Radeon HD 4270 supported 2 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series supported 2 ATI Mobility Radeon HD 4300 +ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series supported 2 ATI Mobility Radeon HD 4300 +ATI Technologies Inc. ATI Mobility Radeon HD 4330 supported 2 ATI Mobility Radeon HD 4300 +ATI Technologies Inc. ATI Mobility Radeon HD 4330 Series supported 2 ATI Mobility Radeon HD 4300 +ATI Technologies Inc. ATI Mobility Radeon HD 4350 supported 2 ATI Mobility Radeon HD 4300 +ATI Technologies Inc. ATI Mobility Radeon HD 4350 Series supported 2 ATI Mobility Radeon HD 4300 +ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series supported 3 ATI Mobility Radeon HD 4500 +ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series supported 3 ATI Mobility Radeon HD 4500 +ATI Technologies Inc. ATI Mobility Radeon HD 4530 supported 3 ATI Mobility Radeon HD 4500 +ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series supported 3 ATI Mobility Radeon HD 4500 +ATI Technologies Inc. ATI Mobility Radeon HD 4550 supported 3 ATI Mobility Radeon HD 4500 +ATI Technologies Inc. ATI Mobility Radeon HD 4570 supported 3 ATI Mobility Radeon HD 4500 +ATI Technologies Inc. ATI Mobility Radeon HD 4600 Series supported 3 ATI Mobility Radeon HD 4600 +ATI Technologies Inc. ATI Mobility Radeon HD 4650 supported 3 ATI Mobility Radeon HD 4600 +ATI Technologies Inc. ATI Mobility Radeon HD 4650 Series supported 3 ATI Mobility Radeon HD 4600 +ATI Technologies Inc. ATI Mobility Radeon HD 4670 supported 3 ATI Mobility Radeon HD 4600 +ATI Technologies Inc. ATI Mobility Radeon HD 4830 Series supported 3 ATI Mobility Radeon HD 4800 +ATI Technologies Inc. ATI Mobility Radeon HD 4850 supported 3 ATI Mobility Radeon HD 4800 +ATI Technologies Inc. ATI Mobility Radeon HD 4870 supported 3 ATI Mobility Radeon HD 4800 +ATI Technologies Inc. ATI Mobility Radeon HD 5000 supported 0 ATI Mobility Radeon +ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series supported 0 ATI Mobility Radeon +ATI Technologies Inc. ATI Mobility Radeon HD 5145 supported 2 ATI Mobility Radeon HD 5100 +ATI Technologies Inc. ATI Mobility Radeon HD 5165 supported 2 ATI Mobility Radeon HD 5100 +ATI Technologies Inc. ATI Mobility Radeon HD 530v supported 1 ATI Mobility Radeon HD 530v +ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series supported 2 ATI Mobility Radeon HD 5400 +ATI Technologies Inc. ATI Mobility Radeon HD 540v supported 2 ATI Mobility Radeon HD 540v +ATI Technologies Inc. ATI Mobility Radeon HD 5430 supported 2 ATI Mobility Radeon HD 5400 +ATI Technologies Inc. ATI Mobility Radeon HD 5450 supported 2 ATI Mobility Radeon HD 5400 +ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series supported 2 ATI Mobility Radeon HD 5400 +ATI Technologies Inc. ATI Mobility Radeon HD 545v supported 2 ATI Mobility Radeon HD 545v +ATI Technologies Inc. ATI Mobility Radeon HD 5470 supported 2 ATI Mobility Radeon HD 5400 +ATI Technologies Inc. ATI Mobility Radeon HD 550v supported 2 ATI Mobility Radeon HD 550v +ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series supported 2 ATI Mobility Radeon HD 5600 +ATI Technologies Inc. ATI Mobility Radeon HD 560v supported 2 ATI Mobility Radeon HD 560v +ATI Technologies Inc. ATI Mobility Radeon HD 5650 supported 2 ATI Mobility Radeon HD 5600 +ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series supported 3 ATI Mobility Radeon HD 5700 +ATI Technologies Inc. ATI Mobility Radeon HD 5730 supported 3 ATI Mobility Radeon HD 5700 +ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series supported 0 ATI Mobility Radeon +ATI Technologies Inc. ATI Mobility Radeon HD 5850 supported 0 ATI Mobility Radeon +ATI Technologies Inc. ATI Mobility Radeon HD 5870 supported 0 ATI Mobility Radeon +ATI Technologies Inc. ATI Mobility Radeon HD 6300 series supported 2 ATI Mobility Radeon HD 6300 +ATI Technologies Inc. ATI Mobility Radeon HD 6370 supported 2 ATI Mobility Radeon HD 6300 +ATI Technologies Inc. ATI Mobility Radeon HD 6470M supported 3 ATI Mobility Radeon HD 6400M +ATI Technologies Inc. ATI Mobility Radeon HD 6550 supported 3 ATI Mobility Radeon HD 6500M +ATI Technologies Inc. ATI Mobility Radeon HD 6570 supported 3 ATI Mobility Radeon HD 6500M +ATI Technologies Inc. ATI Mobility Radeon X1300 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Mobility Radeon X1300 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Mobility Radeon X1350 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Mobility Radeon X1350 x86/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Mobility Radeon X1400 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Mobility Radeon X1600 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Mobility Radeon X1700 x86/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Mobility Radeon X2300 supported 0 ATI Mobility Radeon X2xxx +ATI Technologies Inc. ATI Mobility Radeon X2300 (Omega 3.8.442) supported 0 ATI Mobility Radeon X2xxx +ATI Technologies Inc. ATI Mobility Radeon X2300 x86 supported 0 ATI Mobility Radeon X2xxx +ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2 supported 0 ATI Mobility Radeon X2xxx +ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2 supported 0 ATI Mobility Radeon X2xxx +ATI Technologies Inc. ATI Mobility Radeon X2500 supported 0 ATI Mobility Radeon X2xxx +ATI Technologies Inc. ATI Mobility Radeon X2500 x86/SSE2 supported 0 ATI Mobility Radeon X2xxx +ATI Technologies Inc. ATI Mobility Radeon. HD 530v supported 1 ATI Mobility Radeon HD 530v +ATI Technologies Inc. ATI Mobility Radeon. HD 5470 supported 2 ATI Mobility Radeon HD 5400 +ATI Technologies Inc. ATI RADEON HD 3200 T25XX by CAMILO supported 0 ATI Radeon HD 3200 +ATI Technologies Inc. ATI RADEON XPRESS 1100 supported 0 ATI Radeon Xpress +ATI Technologies Inc. ATI RADEON XPRESS 200 Series supported 0 ATI Radeon Xpress +ATI Technologies Inc. ATI RADEON XPRESS 200 Series x86/SSE2 supported 0 ATI Radeon Xpress +ATI Technologies Inc. ATI RADEON XPRESS 200M SERIES supported 0 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon supported 0 ATI Technologies +ATI Technologies Inc. ATI Radeon 2100 supported 0 ATI Radeon 2100 +ATI Technologies Inc. ATI Radeon 2100 (Microsoft - WDDM) supported 0 ATI Radeon 2100 +ATI Technologies Inc. ATI Radeon 2100 Graphics supported 0 ATI Radeon 2100 +ATI Technologies Inc. ATI Radeon 3000 supported 0 ATI Radeon 3000 +ATI Technologies Inc. ATI Radeon 3000 Graphics supported 0 ATI Radeon 3000 +ATI Technologies Inc. ATI Radeon 3100 Graphics supported 1 ATI Radeon 3100 +ATI Technologies Inc. ATI Radeon 5xxx series supported 3 ATI Radeon 5xxx +ATI Technologies Inc. ATI Radeon 9550 / X1050 Series supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/MMX/3DNow!/SSE supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon 9550 / X1050 Series(Microsoft - WDDM) supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon 9600 / X1050 Series supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon 9600/9550/X1050 Series supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon BA Prototype OpenGL Engine supported 0 ATI Technologies +ATI Technologies Inc. ATI Radeon BB Prototype OpenGL Engine supported 0 ATI Technologies +ATI Technologies Inc. ATI Radeon Cedar PRO Prototype OpenGL Engine supported 2 AMD CEDAR (HD 5450) +ATI Technologies Inc. ATI Radeon Cypress PRO Prototype OpenGL Engine supported 3 AMD CYPRESS (HD 5800) +ATI Technologies Inc. ATI Radeon Graphics Processor supported 0 ATI Technologies +ATI Technologies Inc. ATI Radeon HD 2200 Graphics supported 0 ATI Technologies +ATI Technologies Inc. ATI Radeon HD 2350 supported 0 ATI Radeon HD 2300 +ATI Technologies Inc. ATI Radeon HD 2400 supported 1 ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine supported 1 ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2400 PRO supported 1 ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2400 PRO AGP supported 1 ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2400 Pro supported 1 ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2400 Series supported 1 ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2400 XT supported 1 ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine supported 1 ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2600 OpenGL Engine supported 2 ATI Radeon HD 2600 +ATI Technologies Inc. ATI Radeon HD 2600 PRO supported 2 ATI Radeon HD 2600 +ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine supported 2 ATI Radeon HD 2600 +ATI Technologies Inc. ATI Radeon HD 2600 Pro supported 2 ATI Radeon HD 2600 +ATI Technologies Inc. ATI Radeon HD 2600 Series supported 2 ATI Radeon HD 2600 +ATI Technologies Inc. ATI Radeon HD 2600 XT supported 2 ATI Radeon HD 2600 +ATI Technologies Inc. ATI Radeon HD 2900 GT supported 3 ATI Radeon HD 2900 +ATI Technologies Inc. ATI Radeon HD 2900 XT supported 3 ATI Radeon HD 2900 +ATI Technologies Inc. ATI Radeon HD 3200 Graphics supported 0 ATI Radeon HD 3200 +ATI Technologies Inc. ATI Radeon HD 3300 Graphics supported 1 ATI Radeon HD 3300 +ATI Technologies Inc. ATI Radeon HD 3400 Series supported 1 ATI Radeon HD 3400 +ATI Technologies Inc. ATI Radeon HD 3450 supported 1 ATI Radeon HD 3400 +ATI Technologies Inc. ATI Radeon HD 3450 - Dell Optiplex supported 1 ATI Radeon HD 3400 +ATI Technologies Inc. ATI Radeon HD 3470 supported 1 ATI Radeon HD 3400 +ATI Technologies Inc. ATI Radeon HD 3470 - Dell Optiplex supported 1 ATI Radeon HD 3400 +ATI Technologies Inc. ATI Radeon HD 3550 supported 1 ATI Radeon HD 3500 +ATI Technologies Inc. ATI Radeon HD 3600 Series supported 3 ATI Radeon HD 3600 +ATI Technologies Inc. ATI Radeon HD 3650 supported 3 ATI Radeon HD 3600 +ATI Technologies Inc. ATI Radeon HD 3650 AGP supported 3 ATI Radeon HD 3600 +ATI Technologies Inc. ATI Radeon HD 3730 supported 3 ATI Radeon HD 3700 +ATI Technologies Inc. ATI Radeon HD 3800 Series supported 3 ATI Radeon HD 3800 +ATI Technologies Inc. ATI Radeon HD 3850 supported 3 ATI Radeon HD 3800 +ATI Technologies Inc. ATI Radeon HD 3850 AGP supported 3 ATI Radeon HD 3800 +ATI Technologies Inc. ATI Radeon HD 3870 supported 3 ATI Radeon HD 3800 +ATI Technologies Inc. ATI Radeon HD 3870 X2 supported 3 ATI Radeon HD 3800 +ATI Technologies Inc. ATI Radeon HD 4200 supported 1 ATI Radeon HD 4200 +ATI Technologies Inc. ATI Radeon HD 4250 supported 1 ATI Radeon HD 4200 +ATI Technologies Inc. ATI Radeon HD 4250 Graphics supported 1 ATI Radeon HD 4200 +ATI Technologies Inc. ATI Radeon HD 4270 supported 1 ATI Radeon HD 4200 +ATI Technologies Inc. ATI Radeon HD 4290 supported 1 ATI Radeon HD 4200 +ATI Technologies Inc. ATI Radeon HD 4300 Series supported 1 ATI Radeon HD 4300 +ATI Technologies Inc. ATI Radeon HD 4300/4500 Series supported 1 ATI Radeon HD 4300 +ATI Technologies Inc. ATI Radeon HD 4350 supported 1 ATI Radeon HD 4300 +ATI Technologies Inc. ATI Radeon HD 4350 (Microsoft WDDM 1.1) supported 1 ATI Radeon HD 4300 +ATI Technologies Inc. ATI Radeon HD 4450 supported 1 ATI Radeon HD 4400 +ATI Technologies Inc. ATI Radeon HD 4500 Series supported 3 ATI Radeon HD 4500 +ATI Technologies Inc. ATI Radeon HD 4550 supported 3 ATI Radeon HD 4500 +ATI Technologies Inc. ATI Radeon HD 4600 Series supported 3 ATI Radeon HD 4600 +ATI Technologies Inc. ATI Radeon HD 4650 supported 3 ATI Radeon HD 4600 +ATI Technologies Inc. ATI Radeon HD 4670 supported 3 ATI Radeon HD 4600 +ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine supported 3 ATI Radeon HD 4600 +ATI Technologies Inc. ATI Radeon HD 4700 Series supported 3 ATI Radeon HD 4700 +ATI Technologies Inc. ATI Radeon HD 4720 supported 3 ATI Radeon HD 4700 +ATI Technologies Inc. ATI Radeon HD 4730 supported 3 ATI Radeon HD 4700 +ATI Technologies Inc. ATI Radeon HD 4730 Series supported 3 ATI Radeon HD 4700 +ATI Technologies Inc. ATI Radeon HD 4750 supported 3 ATI Radeon HD 4700 +ATI Technologies Inc. ATI Radeon HD 4770 supported 3 ATI Radeon HD 4700 +ATI Technologies Inc. ATI Radeon HD 4800 Series supported 3 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 4850 supported 3 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine supported 3 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 4850 Series supported 3 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 4870 supported 3 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine supported 3 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 4870 X2 supported 3 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 5400 Series supported 3 ATI Radeon HD 5400 +ATI Technologies Inc. ATI Radeon HD 5450 supported 3 ATI Radeon HD 5400 +ATI Technologies Inc. ATI Radeon HD 5500 Series supported 3 ATI Radeon HD 5500 +ATI Technologies Inc. ATI Radeon HD 5570 supported 3 ATI Radeon HD 5500 +ATI Technologies Inc. ATI Radeon HD 5600 Series supported 3 ATI Radeon HD 5600 +ATI Technologies Inc. ATI Radeon HD 5630 supported 3 ATI Radeon HD 5600 +ATI Technologies Inc. ATI Radeon HD 5670 supported 3 ATI Radeon HD 5600 +ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine supported 3 ATI Radeon HD 5600 +ATI Technologies Inc. ATI Radeon HD 5700 Series supported 3 ATI Radeon HD 5700 +ATI Technologies Inc. ATI Radeon HD 5750 supported 3 ATI Radeon HD 5700 +ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine supported 3 ATI Radeon HD 5700 +ATI Technologies Inc. ATI Radeon HD 5770 supported 3 ATI Radeon HD 5700 +ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine supported 3 ATI Radeon HD 5700 +ATI Technologies Inc. ATI Radeon HD 5800 Series supported 3 ATI Radeon HD 5800 +ATI Technologies Inc. ATI Radeon HD 5850 supported 3 ATI Radeon HD 5800 +ATI Technologies Inc. ATI Radeon HD 5870 supported 3 ATI Radeon HD 5800 +ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine supported 3 ATI Radeon HD 5800 +ATI Technologies Inc. ATI Radeon HD 5900 Series supported 3 ATI Radeon HD 5900 +ATI Technologies Inc. ATI Radeon HD 5970 supported 3 ATI Radeon HD 5900 +ATI Technologies Inc. ATI Radeon HD 6230 supported 2 ATI Radeon HD 6200 +ATI Technologies Inc. ATI Radeon HD 6250 supported 2 ATI Radeon HD 6200 +ATI Technologies Inc. ATI Radeon HD 6350 supported 2 ATI Radeon HD 6300 +ATI Technologies Inc. ATI Radeon HD 6390 supported 2 ATI Radeon HD 6300 +ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine supported 3 ATI Radeon HD 6400 +ATI Technologies Inc. ATI Radeon HD 6510 supported 3 ATI Radeon HD 6500 +ATI Technologies Inc. ATI Radeon HD 6570M supported 3 ATI Radeon HD 6500 +ATI Technologies Inc. ATI Radeon HD 6750 supported 3 ATI Radeon HD 6700 +ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine supported 3 ATI Radeon HD 6700 +ATI Technologies Inc. ATI Radeon HD 6770 supported 3 ATI Radeon HD 6700 +ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine supported 3 ATI Radeon HD 6700 +ATI Technologies Inc. ATI Radeon HD 6800 Series supported 3 ATI Radeon HD 6800 +ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine supported 3 ATI Radeon HD 6900 +ATI Technologies Inc. ATI Radeon HD3750 supported 3 ATI Radeon HD 3700 +ATI Technologies Inc. ATI Radeon HD4300/HD4500 series supported 1 ATI Radeon HD 4300 +ATI Technologies Inc. ATI Radeon HD4670 supported 3 ATI Radeon HD 4600 +ATI Technologies Inc. ATI Radeon Juniper LE Prototype OpenGL Engine supported 3 AMD JUNIPER (HD 5700) +ATI Technologies Inc. ATI Radeon RV710 Prototype OpenGL Engine supported 1 AMD RV710 (HD 4300) +ATI Technologies Inc. ATI Radeon RV730 Prototype OpenGL Engine supported 3 AMD RV730 (HD 4600) +ATI Technologies Inc. ATI Radeon RV770 Prototype OpenGL Engine supported 3 AMD RV770 (HD 4800) +ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine supported 3 AMD RV790 (HD 4800) +ATI Technologies Inc. ATI Radeon Redwood PRO Prototype OpenGL Engine supported 3 AMD REDWOOD (HD 5500/5600) +ATI Technologies Inc. ATI Radeon Redwood XT Prototype OpenGL Engine supported 3 AMD REDWOOD (HD 5500/5600) +ATI Technologies Inc. ATI Radeon Whistler PRO/LP Prototype OpenGL Engine supported 0 ATI Technologies +ATI Technologies Inc. ATI Radeon X1050 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1050 Series supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1200 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1200 Series supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1250 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1250 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1270 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1300/X1550 Series supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1550 Series supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X1950 GT supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series supported 0 ATI Radeon X1xxx +ATI Technologies Inc. ATI Radeon Xpress 1100 supported 0 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1150 supported 0 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1150 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1200 supported 0 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1200 Series supported 0 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1200 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1250 supported 0 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1250 x86/SSE2 supported 0 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress Series supported 0 ATI Radeon Xpress +ATI Technologies Inc. ATI Yamaha HD 9000 supported 0 ATI Technologies +ATI Technologies Inc. ATi RS880M supported 1 ATI RS880M +ATI Technologies Inc. Carte graphique VGA standard supported 0 ATI Technologies +ATI Technologies Inc. Diamond Radeon X1550 Series supported 0 ATI Radeon X1xxx +ATI Technologies Inc. EG JUNIPER supported 3 AMD JUNIPER (HD 5700) +ATI Technologies Inc. EG PARK supported 3 AMD PARK +ATI Technologies Inc. FireGL V3100 Pentium 4 (SSE2) supported 0 ATI FireGL +ATI Technologies Inc. FireMV 2400 PCI DDR x86 supported 0 ATI FireMV +ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2 supported 0 ATI FireMV +ATI Technologies Inc. GeCube Radeon X1550 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Geforce 9500 GT supported 2 ATI Geforce 9500 GT +ATI Technologies Inc. Geforce 9500GT supported 2 ATI Geforce 9500 GT +ATI Technologies Inc. Geforce 9800 GT supported 2 ATI Geforce 9800 GT +ATI Technologies Inc. HD3730 supported 0 ATI Technologies +ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series supported 0 ATI Radeon 9500 +ATI Technologies Inc. HIGHTECH EXCALIBUR X700 PRO supported 0 ATI Technologies +ATI Technologies Inc. M21 x86/MMX/3DNow!/SSE2 supported 0 ATI Technologies +ATI Technologies Inc. M76M supported 3 ATI M76 +ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2 supported 0 ATI Mobility Radeon +ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2 supported 0 ATI Mobility Radeon +ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86/SSE2 supported 0 ATI Mobility Radeon +ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2 supported 0 ATI Mobility Radeon 9600 +ATI Technologies Inc. MOBILITY RADEON 9700 x86/SSE2 supported 1 ATI Mobility Radeon 9700 +ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2 supported 1 ATI Mobility Radeon X3xx +ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2 supported 1 ATI Mobility Radeon X6xx +ATI Technologies Inc. MOBILITY RADEON X700 SE x86 supported 1 ATI Mobility Radeon X7xx +ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2 supported 1 ATI Mobility Radeon X7xx +ATI Technologies Inc. MSI RX9550SE supported 1 ATI Radeon RX9550 +ATI Technologies Inc. Mobility Radeon X2300 HD supported 0 ATI Mobility Radeon X2xxx +ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2 supported 0 ATI Mobility Radeon X2xxx +ATI Technologies Inc. RADEON 7000 DDR x86/MMX/3DNow!/SSE supported 0 ATI Radeon 7xxx +ATI Technologies Inc. RADEON 7000 DDR x86/SSE2 supported 0 ATI Radeon 7xxx +ATI Technologies Inc. RADEON 7500 DDR x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 7xxx +ATI Technologies Inc. RADEON 7500 DDR x86/SSE2 supported 0 ATI Radeon 7xxx +ATI Technologies Inc. RADEON 9100 IGP DDR x86/SSE2 supported 0 ATI Radeon 9100 +ATI Technologies Inc. RADEON 9200 DDR x86/MMX/3DNow!/SSE supported 0 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9200 DDR x86/SSE2 supported 0 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9200 PRO DDR x86/MMX/3DNow!/SSE supported 0 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE supported 0 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE supported 0 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2 supported 0 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9200SE DDR x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9200SE DDR x86/SSE2 supported 0 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE supported 0 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/SSE2 supported 0 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9500 supported 0 ATI Radeon 9500 +ATI Technologies Inc. RADEON 9550 x86/SSE2 supported 0 ATI Radeon 9500 +ATI Technologies Inc. RADEON 9600 SERIES supported 0 ATI Radeon 9600 +ATI Technologies Inc. RADEON 9600 SERIES x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 9600 +ATI Technologies Inc. RADEON 9600 TX x86/SSE2 supported 0 ATI Radeon 9600 +ATI Technologies Inc. RADEON 9600 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 9600 +ATI Technologies Inc. RADEON 9600 x86/SSE2 supported 0 ATI Radeon 9600 +ATI Technologies Inc. RADEON 9700 PRO x86/MMX/3DNow!/SSE supported 1 ATI Radeon 9700 +ATI Technologies Inc. RADEON 9800 PRO supported 1 ATI Radeon 9800 +ATI Technologies Inc. RADEON 9800 x86/SSE2 supported 1 ATI Radeon 9800 +ATI Technologies Inc. RADEON IGP 340M DDR x86/SSE2 unsupported 0 ATI IGP 340M +ATI Technologies Inc. RADEON X300 Series x86/SSE2 supported 0 ATI Radeon X300 +ATI Technologies Inc. RADEON X300 x86/SSE2 supported 0 ATI Radeon X300 +ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2 supported 0 ATI Radeon X300 +ATI Technologies Inc. RADEON X550 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X500 +ATI Technologies Inc. RADEON X550 x86/SSE2 supported 0 ATI Radeon X500 +ATI Technologies Inc. RADEON X600 Series supported 1 ATI Radeon X600 +ATI Technologies Inc. RADEON X600 x86/SSE2 supported 1 ATI Radeon X600 +ATI Technologies Inc. RADEON X700 PRO x86/SSE2 supported 1 ATI Radeon X700 +ATI Technologies Inc. RADEON X800 SE x86/MMX/3DNow!/SSE2 supported 2 ATI Radeon X800 +ATI Technologies Inc. RADEON X800GT supported 2 ATI Radeon X800 +ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2 supported 0 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS 200 Series x86/SSE2 supported 0 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2 supported 0 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS 200M Series x86/SSE2 supported 0 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS Series x86/SSE2 supported 0 ATI Radeon Xpress +ATI Technologies Inc. RS740 supported 0 ATI Technologies +ATI Technologies Inc. RS780C supported 0 AMD RS780 (HD 3200) +ATI Technologies Inc. RS780M supported 0 AMD RS780 (HD 3200) +ATI Technologies Inc. RS880 supported 1 AMD RS880 (HD 4200) +ATI Technologies Inc. RV410 Pro x86/SSE2 supported 1 ATI RV410 (X700) +ATI Technologies Inc. RV790 supported 3 AMD RV790 (HD 4800) +ATI Technologies Inc. Radeon (TM) HD 6470M supported 0 ATI Technologies +ATI Technologies Inc. Radeon (TM) HD 6490M supported 0 ATI Technologies +ATI Technologies Inc. Radeon (TM) HD 6770M supported 0 ATI Technologies +ATI Technologies Inc. Radeon 7000 DDR x86/SSE2 supported 0 ATI Radeon 7xxx +ATI Technologies Inc. Radeon 7000 SDR x86/SSE2 supported 0 ATI Radeon 7xxx +ATI Technologies Inc. Radeon 7500 DDR x86/SSE2 supported 0 ATI Radeon 7xxx +ATI Technologies Inc. Radeon 9000 DDR x86/SSE2 supported 0 ATI Radeon 9000 +ATI Technologies Inc. Radeon DDR x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon DDR +ATI Technologies Inc. Radeon DDR x86/SSE supported 0 ATI Radeon DDR +ATI Technologies Inc. Radeon DDR x86/SSE2 supported 0 ATI Radeon DDR +ATI Technologies Inc. Radeon HD 6310 supported 2 ATI Radeon HD 6300 +ATI Technologies Inc. Radeon HD 6800 Series supported 3 ATI Radeon HD 6800 +ATI Technologies Inc. Radeon SDR x86/SSE2 supported 0 ATI Technologies +ATI Technologies Inc. Radeon X1300 Series supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X1300 Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X1300 Series x86/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X1300/X1550 Series supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X1300/X1550 Series x86/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X1550 64-bit (Microsoft - WDDM) supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X1550 Series supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X1550 Series x86/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X1600 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X1600 Pro / X1300XT x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X1600 Series x86/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X1600/X1650 Series supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X1650 Series supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X1650 Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X1650 Series x86/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X1900 Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X1950 Pro supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X1950 Pro x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X1950 Series supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X1950 Series (Microsoft - WDDM) supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X300/X550/X1050 Series supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Radeon X550/X700 Series supported 0 ATI Radeon X500 +ATI Technologies Inc. Radeon X550XTX x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X500 +ATI Technologies Inc. SAPPHIRE RADEON X300SE supported 0 ATI Radeon X300 +ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X300 +ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/SSE2 supported 0 ATI Radeon X300 +ATI Technologies Inc. SAPPHIRE Radeon X1550 Series supported 0 ATI Radeon X1xxx +ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X1xxx +ATI Technologies Inc. Sapphire Radeon HD 3730 supported 3 ATI Radeon HD 3700 +ATI Technologies Inc. Sapphire Radeon HD 3750 supported 3 ATI Radeon HD 3700 +ATI Technologies Inc. Standard VGA Graphics Adapter supported 0 ATI Technologies +ATI Technologies Inc. Tul, RADEON X600 PRO supported 0 ATI Technologies +ATI Technologies Inc. Tul, RADEON X600 PRO x86/SSE2 supported 0 ATI Technologies +ATI Technologies Inc. Tul, RADEON X700 PRO supported 0 ATI Technologies +ATI Technologies Inc. Tul, RADEON X700 PRO x86/MMX/3DNow!/SSE2 supported 0 ATI Technologies +ATI Technologies Inc. VisionTek Radeon 4350 supported 0 ATI Technologies +ATI Technologies Inc. VisionTek Radeon X1550 Series supported 0 ATI Radeon X1xxx +ATI Technologies Inc. WRESTLER 9802 supported 0 ATI Technologies +ATI Technologies Inc. WRESTLER 9803 supported 0 ATI Technologies +ATI Technologies Inc. XFX Radeon HD 4570 supported 3 ATI Radeon HD 4500 +ATI Technologies Inc. Yamaha ATI HD 9000da/s supported 0 ATI Technologies +ATI Technologies Inc. Yamaha ATI HD 9000da/s 2048 supported 0 ATI Technologies +Advanced Micro Devices, Inc. Mesa DRI R600 (RS780 9612) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 0 AMD RS780 (HD 3200) +Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9710) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 1 AMD RS880 (HD 4200) +Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9712) 20090101 TCL supported 1 AMD RS880 (HD 4200) +Advanced Micro Devices, Inc. Mesa DRI R600 (RV610 94C1) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 1 AMD RV610 (HD 2400) +Advanced Micro Devices, Inc. Mesa DRI R600 (RV610 94C9) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 AMD RV610 (HD 2400) +Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C4) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 AMD RV620 (HD 3400) +Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 1 AMD RV620 (HD 3400) +Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 AMD RV620 (HD 3400) +Advanced Micro Devices, Inc. Mesa DRI R600 (RV635 9596) 20090101 x86/MMX+/3DNow!+/SSE TCL DRI2 supported 3 AMD RV635 (HD 3600) +Advanced Micro Devices, Inc. Mesa DRI R600 (RV670 9505) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 3 AMD RV670 (HD 3800) +Advanced Micro Devices, Inc. Mesa DRI R600 (RV710 9552) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 AMD RV710 (HD 4300) +Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 3 AMD RV730 (HD 4600) +Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX/SSE2 TCL DRI2 supported 3 AMD RV730 (HD 4600) +Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9498) 20090101 TCL DRI2 supported 3 AMD RV730 (HD 4600) +Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9440) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 3 AMD RV770 (HD 4800) +Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9442) 20090101 x86/MMX/SSE2 TCL DRI2 supported 3 AMD RV770 (HD 4800) +Alex Mohr GL Hijacker! UNRECOGNIZED +Apple Software Renderer unsupported 0 Apple Software Renderer +DRI R300 Project Mesa DRI R300 (RS400 5954) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2 supported 1 ATI R300 (9700) +DRI R300 Project Mesa DRI R300 (RS400 5975) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2 supported 1 ATI R300 (9700) +DRI R300 Project Mesa DRI R300 (RS400 5A62) 20090101 x86/MMX/SSE2 NO-TCL DRI2 supported 1 ATI R300 (9700) +DRI R300 Project Mesa DRI R300 (RS600 7941) 20090101 x86/MMX/SSE2 NO-TCL unsupported 0 ATI RS600 (Xpress 3200) +DRI R300 Project Mesa DRI R300 (RS690 791F) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2 supported 1 ATI R300 (9700) +DRI R300 Project Mesa DRI R300 (RV350 4151) 20090101 AGP 4x x86/MMX+/3DNow!+/SSE TCL supported 0 ATI RV350 (9600) +DRI R300 Project Mesa DRI R300 (RV350 4153) 20090101 AGP 8x x86/MMX+/3DNow!+/SSE TCL supported 0 ATI RV350 (9600) +DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 0 ATI RV380 +DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX/SSE2 TCL DRI2 supported 0 ATI RV380 +DRI R300 Project Mesa DRI R300 (RV380 5B60) 20090101 x86/MMX/SSE2 TCL DRI2 supported 0 ATI RV380 +DRI R300 Project Mesa DRI R300 (RV380 5B62) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 0 ATI RV380 +DRI R300 Project Mesa DRI R300 (RV515 7145) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 ATI RV515 +DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 1 ATI RV515 +DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 ATI RV515 +DRI R300 Project Mesa DRI R300 (RV515 7149) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 ATI RV515 +DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL supported 1 ATI RV515 +DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 ATI RV515 +DRI R300 Project Mesa DRI R300 (RV530 71C4) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 ATI RV530 +GPU_CLASS_UNKNOWN UNRECOGNIZED +Humper Chromium UNRECOGNIZED +Intel UNRECOGNIZED +Intel HD Graphics Family supported 2 Intel HD Graphics +Intel 3D-Analyze v2.2 - http://www.tommti-systems.com UNRECOGNIZED +Intel 3D-Analyze v2.3 - http://www.tommti-systems.com UNRECOGNIZED +Intel 4 Series Internal Chipset UNRECOGNIZED +Intel 830M unsupported 0 Intel 830M +Intel 845G unsupported 0 Intel 845G +Intel 855GM unsupported 0 Intel 855GM +Intel 865G unsupported 0 Intel 865G +Intel 915G unsupported 0 Intel 915G +Intel 915GM unsupported 0 Intel 915GM +Intel 945G supported 0 Intel 945G +Intel 945GM supported 0 Intel 945GM +Intel 950 supported 0 Intel 950 +Intel 965 supported 0 Intel 965 +Intel B43 Express Chipset UNRECOGNIZED +Intel Bear Lake unsupported 0 Intel Bear Lake +Intel Broadwater unsupported 0 Intel Broadwater +Intel Brookdale unsupported 0 Intel Brookdale +Intel Cantiga unsupported 0 Intel Cantiga +Intel Eaglelake supported 0 Intel Eaglelake +Intel Familia Mobile 45 Express Chipset (Microsoft Corporation - WDDM 1.1) UNRECOGNIZED +Intel G33 unsupported 0 Intel G33 +Intel G41 supported 0 Intel G41 +Intel G41 Express Chipset supported 0 Intel G41 +Intel G45 supported 0 Intel G45 +Intel G45/G43 Express Chipset supported 0 Intel G45 +Intel Graphics Media Accelerator HD supported 0 Intel Graphics Media HD +Intel HD Graphics supported 2 Intel HD Graphics +Intel HD Graphics 100 supported 2 Intel HD Graphics +Intel HD Graphics 200 supported 2 Intel HD Graphics +Intel HD Graphics 200 BR-1101-00SH supported 2 Intel HD Graphics +Intel HD Graphics 200 BR-1101-00SJ supported 2 Intel HD Graphics +Intel HD Graphics 200 BR-1101-00SK supported 2 Intel HD Graphics +Intel HD Graphics 200 BR-1101-01M5 supported 2 Intel HD Graphics +Intel HD Graphics 200 BR-1101-01M6 supported 2 Intel HD Graphics +Intel HD Graphics BR-1004-01Y1 supported 2 Intel HD Graphics +Intel HD Graphics BR-1006-0364 supported 2 Intel HD Graphics +Intel HD Graphics BR-1006-0365 supported 2 Intel HD Graphics +Intel HD Graphics BR-1006-0366 supported 2 Intel HD Graphics +Intel HD Graphics BR-1007-02G4 supported 2 Intel HD Graphics +Intel HD Graphics BR-1101-04SY supported 2 Intel HD Graphics +Intel HD Graphics BR-1101-04SZ supported 2 Intel HD Graphics +Intel HD Graphics BR-1101-04T0 supported 2 Intel HD Graphics +Intel HD Graphics BR-1101-04T9 supported 2 Intel HD Graphics +Intel HD Graphics Family supported 2 Intel HD Graphics +Intel HD Graphics Family BR-1012-00Y8 supported 2 Intel HD Graphics +Intel HD Graphics Family BR-1012-00YF supported 2 Intel HD Graphics +Intel HD Graphics Family BR-1012-00ZD supported 2 Intel HD Graphics +Intel HD Graphics Family BR-1102-00ML supported 2 Intel HD Graphics +Intel Inc. Intel GMA 900 OpenGL Engine UNRECOGNIZED +Intel Inc. Intel GMA 950 OpenGL Engine supported 0 Intel 950 +Intel Inc. Intel GMA X3100 OpenGL Engine supported 0 Intel X3100 +Intel Inc. Intel HD Graphics 3000 OpenGL Engine supported 2 Intel HD Graphics +Intel Inc. Intel HD Graphics OpenGL Engine supported 2 Intel HD Graphics +Intel Inc. Intel HD xxxx OpenGL Engine UNRECOGNIZED +Intel Intel 845G unsupported 0 Intel 845G +Intel Intel 855GM unsupported 0 Intel 855GM +Intel Intel 865G unsupported 0 Intel 865G +Intel Intel 915G unsupported 0 Intel 915G +Intel Intel 915GM unsupported 0 Intel 915GM +Intel Intel 945G supported 0 Intel 945G +Intel Intel 945GM supported 0 Intel 945GM +Intel Intel 965/963 Graphics Media Accelerator supported 0 Intel 965 +Intel Intel Bear Lake B unsupported 0 Intel Bear Lake +Intel Intel Broadwater G unsupported 0 Intel Broadwater +Intel Intel Brookdale-G unsupported 0 Intel Brookdale +Intel Intel Calistoga UNRECOGNIZED +Intel Intel Cantiga unsupported 0 Intel Cantiga +Intel Intel Eaglelake supported 0 Intel Eaglelake +Intel Intel Grantsdale-G UNRECOGNIZED +Intel Intel HD Graphics 3000 supported 2 Intel HD Graphics +Intel Intel Lakeport UNRECOGNIZED +Intel Intel Montara-GM unsupported 0 Intel Montara +Intel Intel Pineview Platform supported 0 Intel Pineview +Intel Intel Springdale-G unsupported 0 Intel Springdale +Intel Mobile - famiglia Express Chipset 45 (Microsoft Corporation - WDDM 1.1) UNRECOGNIZED +Intel Mobile 4 Series supported 0 Intel Mobile 4 Series +Intel Mobile 4 Series Express Chipset Family supported 0 Intel Mobile 4 Series +Intel Mobile 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1) UNRECOGNIZED +Intel Mobile HD Graphics supported 2 Intel HD Graphics +Intel Mobile SandyBridge HD Graphics supported 2 Intel HD Graphics +Intel Montara unsupported 0 Intel Montara +Intel Pineview supported 0 Intel Pineview +Intel Q45/Q43 Express Chipset UNRECOGNIZED +Intel Royal BNA Driver UNRECOGNIZED +Intel SandyBridge HD Graphics supported 2 Intel HD Graphics +Intel SandyBridge HD Graphics BR-1006-00V8 supported 2 Intel HD Graphics +Intel Springdale unsupported 0 Intel Springdale +Intel X3100 supported 0 Intel X3100 +Intergraph wcgdrv 06.05.06.18 UNRECOGNIZED +Intergraph wcgdrv 06.06.00.35 UNRECOGNIZED +LegendgrafiX Mobile 945 Express C/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://Legendgra... UNRECOGNIZED +LegendgrafiX NVIDIA GeForce GT 430/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://Legendgr... supported 3 NVIDIA GT 430M +Linden Lab Headless UNRECOGNIZED +Matrox unsupported 0 Matrox +Mesa unsupported 0 Mesa +Mesa Project Software Rasterizer unsupported 0 Mesa +NVIDIA /PCI/SSE2 UNRECOGNIZED +NVIDIA /PCI/SSE2/3DNOW! UNRECOGNIZED +NVIDIA 205 supported 0 NVIDIA G 205M +NVIDIA 210 supported 1 NVIDIA G 210 +NVIDIA 310 supported 2 NVIDIA G 310M +NVIDIA 310M supported 2 NVIDIA G 310M +NVIDIA 315 supported 2 NVIDIA G 315 +NVIDIA 315M supported 2 NVIDIA G 315 +NVIDIA 320M supported 2 NVIDIA G 320M +NVIDIA C51 supported 0 NVIDIA C51 +NVIDIA D10M2-20/PCI/SSE2 UNRECOGNIZED +NVIDIA D10P1-25/PCI/SSE2 UNRECOGNIZED +NVIDIA D10P1-30/PCI/SSE2 UNRECOGNIZED +NVIDIA D10P2-50/PCI/SSE2 UNRECOGNIZED +NVIDIA D11M2-30/PCI/SSE2 UNRECOGNIZED +NVIDIA D12-P1-35/PCI/SSE2 UNRECOGNIZED +NVIDIA D12U-15/PCI/SSE2 UNRECOGNIZED +NVIDIA D13M1-40/PCI/SSE2 UNRECOGNIZED +NVIDIA D13P1-40/PCI/SSE2 UNRECOGNIZED +NVIDIA D13U-10/PCI/SSE2 UNRECOGNIZED +NVIDIA D13U/PCI/SSE2 UNRECOGNIZED +NVIDIA D9M supported 1 NVIDIA D9M +NVIDIA D9M-20/PCI/SSE2 supported 1 NVIDIA D9M +NVIDIA Entry Graphics/PCI/SSE2 UNRECOGNIZED +NVIDIA Entry Graphics/PCI/SSE2/3DNOW! UNRECOGNIZED +NVIDIA G 102M supported 0 NVIDIA G102M +NVIDIA G 103M supported 0 NVIDIA G103M +NVIDIA G 105M supported 0 NVIDIA G105M +NVIDIA G 110M supported 0 NVIDIA G 110M +NVIDIA G100 supported 0 NVIDIA G100 +NVIDIA G102M supported 0 NVIDIA G102M +NVIDIA G103M supported 0 NVIDIA G103M +NVIDIA G105M supported 0 NVIDIA G105M +NVIDIA G210 supported 1 NVIDIA G 210 +NVIDIA G210M supported 1 NVIDIA G 210 +NVIDIA G70/PCI/SSE2 UNRECOGNIZED +NVIDIA G72 supported 1 NVIDIA G72 +NVIDIA G73 supported 1 NVIDIA G73 +NVIDIA G84 supported 2 NVIDIA G84 +NVIDIA G86 supported 3 NVIDIA G86 +NVIDIA G92 supported 3 NVIDIA G92 +NVIDIA G92-200/PCI/SSE2 supported 3 NVIDIA G92 +NVIDIA G94 supported 3 NVIDIA G94 +NVIDIA G96/PCI/SSE2 UNRECOGNIZED +NVIDIA G98/PCI/SSE2 UNRECOGNIZED +NVIDIA GT 120 supported 2 NVIDIA GT 120M +NVIDIA GT 130 supported 2 NVIDIA GT 130M +NVIDIA GT 130M supported 2 NVIDIA GT 130M +NVIDIA GT 140 supported 2 NVIDIA GT 140M +NVIDIA GT 150 supported 2 NVIDIA GT 150M +NVIDIA GT 160M supported 2 NVIDIA GT 160M +NVIDIA GT 220 supported 2 NVIDIA GT 220M +NVIDIA GT 220/PCI/SSE2 supported 2 NVIDIA GT 220M +NVIDIA GT 220/PCI/SSE2/3DNOW! supported 2 NVIDIA GT 220M +NVIDIA GT 230 supported 2 NVIDIA GT 230M +NVIDIA GT 230M supported 2 NVIDIA GT 230M +NVIDIA GT 240 supported 2 NVIDIA GT 240M +NVIDIA GT 240M supported 2 NVIDIA GT 240M +NVIDIA GT 250M supported 2 NVIDIA GT 250M +NVIDIA GT 260M supported 2 NVIDIA GT 260M +NVIDIA GT 320 supported 2 NVIDIA GT 320M +NVIDIA GT 320M supported 2 NVIDIA GT 320M +NVIDIA GT 330 supported 3 NVIDIA GT 330M +NVIDIA GT 330M supported 3 NVIDIA GT 330M +NVIDIA GT 340 supported 2 NVIDIA GT 340M +NVIDIA GT 420 supported 2 NVIDIA GT 420M +NVIDIA GT 430 supported 3 NVIDIA GT 430M +NVIDIA GT 440 supported 3 NVIDIA GT 440M +NVIDIA GT 450 supported 3 NVIDIA GT 450M +NVIDIA GT 520 supported 3 NVIDIA GT 520M +NVIDIA GT 540 supported 3 NVIDIA GT 540M +NVIDIA GT 540M supported 3 NVIDIA GT 540M +NVIDIA GT-120 supported 2 NVIDIA GT 120 +NVIDIA GT200/PCI/SSE2 UNRECOGNIZED +NVIDIA GTS 150 supported 2 NVIDIA GT 150M +NVIDIA GTS 240 supported 3 NVIDIA GTS 240 +NVIDIA GTS 250 supported 3 NVIDIA GTS 250 +NVIDIA GTS 350M supported 3 NVIDIA GTS 350M +NVIDIA GTS 360 supported 3 NVIDIA GTS 360 +NVIDIA GTS 360M supported 3 NVIDIA GTS 360M +NVIDIA GTS 450 supported 3 NVIDIA GTS 450 +NVIDIA GTX 260 supported 3 NVIDIA GTX 260 +NVIDIA GTX 260M supported 3 NVIDIA GTX 260 +NVIDIA GTX 270 supported 3 NVIDIA GTX 270 +NVIDIA GTX 280 supported 3 NVIDIA GTX 280 +NVIDIA GTX 285 supported 3 NVIDIA GTX 285 +NVIDIA GTX 290 supported 3 NVIDIA GTX 290 +NVIDIA GTX 460 supported 3 NVIDIA GTX 460 +NVIDIA GTX 460M supported 3 NVIDIA GTX 460M +NVIDIA GTX 465 supported 3 NVIDIA GTX 465 +NVIDIA GTX 470 supported 3 NVIDIA GTX 470 +NVIDIA GTX 470M supported 3 NVIDIA GTX 470M +NVIDIA GTX 480 supported 3 NVIDIA GTX 480 +NVIDIA GTX 480M supported 3 NVIDIA GTX 480M +NVIDIA GTX 550 Ti supported 3 NVIDIA GTX 550 +NVIDIA GTX 560 supported 3 NVIDIA GTX 560 +NVIDIA GTX 560 Ti supported 3 NVIDIA GTX 560 +NVIDIA GTX 570 supported 3 NVIDIA GTX 570 +NVIDIA GTX 580 supported 3 NVIDIA GTX 580 +NVIDIA GTX 590 supported 3 NVIDIA GTX 590 +NVIDIA GeForce UNRECOGNIZED +NVIDIA GeForce 2 supported 0 NVIDIA GeForce 2 +NVIDIA GeForce 205/PCI/SSE2 supported 2 NVIDIA 205 +NVIDIA GeForce 210 supported 2 NVIDIA 210 +NVIDIA GeForce 210/PCI/SSE2 supported 2 NVIDIA 210 +NVIDIA GeForce 210/PCI/SSE2/3DNOW! supported 2 NVIDIA 210 +NVIDIA GeForce 3 supported 0 NVIDIA GeForce 3 +NVIDIA GeForce 305M/PCI/SSE2 supported 1 NVIDIA 305M +NVIDIA GeForce 310/PCI/SSE2 supported 3 NVIDIA 310 +NVIDIA GeForce 310/PCI/SSE2/3DNOW! supported 3 NVIDIA 310 +NVIDIA GeForce 310M/PCI/SSE2 supported 1 NVIDIA 310M +NVIDIA GeForce 315/PCI/SSE2 supported 3 NVIDIA 315 +NVIDIA GeForce 315/PCI/SSE2/3DNOW! supported 3 NVIDIA 315 +NVIDIA GeForce 315M/PCI/SSE2 supported 2 NVIDIA 315M +NVIDIA GeForce 320M/PCI/SSE2 supported 2 NVIDIA 320M +NVIDIA GeForce 4 Go supported 0 NVIDIA GeForce 4 +NVIDIA GeForce 4 MX supported 0 NVIDIA GeForce 4 +NVIDIA GeForce 4 Ti supported 0 NVIDIA GeForce 4 +NVIDIA GeForce 405/PCI/SSE2 supported 1 NVIDIA G 405 +NVIDIA GeForce 6100 supported 0 NVIDIA GeForce 6100 +NVIDIA GeForce 6100 nForce 400/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100 +NVIDIA GeForce 6100 nForce 405/PCI/SSE2 supported 0 NVIDIA GeForce 6100 +NVIDIA GeForce 6100 nForce 405/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100 +NVIDIA GeForce 6100 nForce 420/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100 +NVIDIA GeForce 6100 nForce 430/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100 +NVIDIA GeForce 6100/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100 +NVIDIA GeForce 6150 LE/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100 +NVIDIA GeForce 6150/PCI/SSE2 supported 0 NVIDIA GeForce 6100 +NVIDIA GeForce 6150/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100 +NVIDIA GeForce 6150SE nForce 430/PCI/SSE2 supported 0 NVIDIA GeForce 6100 +NVIDIA GeForce 6150SE nForce 430/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100 +NVIDIA GeForce 6150SE/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100 +NVIDIA GeForce 6200 supported 0 NVIDIA GeForce 6200 +NVIDIA GeForce 6200 A-LE/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 6200 +NVIDIA GeForce 6200 A-LE/AGP/SSE2 supported 0 NVIDIA GeForce 6200 +NVIDIA GeForce 6200 A-LE/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce 6200 +NVIDIA GeForce 6200 LE/PCI/SSE2 supported 0 NVIDIA GeForce 6200 +NVIDIA GeForce 6200 LE/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6200 +NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2 supported 0 NVIDIA GeForce 6200 +NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6200 +NVIDIA GeForce 6200/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 6200 +NVIDIA GeForce 6200/AGP/SSE2 supported 0 NVIDIA GeForce 6200 +NVIDIA GeForce 6200/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce 6200 +NVIDIA GeForce 6200/PCI/SSE/3DNOW! supported 0 NVIDIA GeForce 6200 +NVIDIA GeForce 6200/PCI/SSE2 supported 0 NVIDIA GeForce 6200 +NVIDIA GeForce 6200/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6200 +NVIDIA GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6200 +NVIDIA GeForce 6500 supported 0 NVIDIA GeForce 6500 +NVIDIA GeForce 6500/PCI/SSE2 supported 0 NVIDIA GeForce 6500 +NVIDIA GeForce 6600 supported 1 NVIDIA GeForce 6600 +NVIDIA GeForce 6600 GT/AGP/SSE/3DNOW! supported 1 NVIDIA GeForce 6600 +NVIDIA GeForce 6600 GT/AGP/SSE2 supported 1 NVIDIA GeForce 6600 +NVIDIA GeForce 6600 GT/PCI/SSE/3DNOW! supported 1 NVIDIA GeForce 6600 +NVIDIA GeForce 6600 GT/PCI/SSE2 supported 1 NVIDIA GeForce 6600 +NVIDIA GeForce 6600 GT/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 6600 +NVIDIA GeForce 6600 LE/PCI/SSE2 supported 1 NVIDIA GeForce 6600 +NVIDIA GeForce 6600/AGP/SSE/3DNOW! supported 1 NVIDIA GeForce 6600 +NVIDIA GeForce 6600/AGP/SSE2 supported 1 NVIDIA GeForce 6600 +NVIDIA GeForce 6600/AGP/SSE2/3DNOW! supported 1 NVIDIA GeForce 6600 +NVIDIA GeForce 6600/PCI/SSE2 supported 1 NVIDIA GeForce 6600 +NVIDIA GeForce 6600/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 6600 +NVIDIA GeForce 6700 supported 2 NVIDIA GeForce 6700 +NVIDIA GeForce 6800 supported 2 NVIDIA GeForce 6800 +NVIDIA GeForce 6800 GS/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 6800 +NVIDIA GeForce 6800 GT/AGP/SSE2 supported 2 NVIDIA GeForce 6800 +NVIDIA GeForce 6800 GT/PCI/SSE2 supported 2 NVIDIA GeForce 6800 +NVIDIA GeForce 6800 XT/AGP/SSE2 supported 2 NVIDIA GeForce 6800 +NVIDIA GeForce 6800 XT/PCI/SSE2 supported 2 NVIDIA GeForce 6800 +NVIDIA GeForce 6800/PCI/SSE2 supported 2 NVIDIA GeForce 6800 +NVIDIA GeForce 6800/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 6800 +NVIDIA GeForce 7000 supported 0 NVIDIA GeForce 7000 +NVIDIA GeForce 7000M supported 0 NVIDIA GeForce 7000 +NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2 supported 0 NVIDIA GeForce 7000 +NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000 +NVIDIA GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000 +NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2 supported 0 NVIDIA GeForce 7000 +NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000 +NVIDIA GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2 supported 0 NVIDIA GeForce 7000 +NVIDIA GeForce 7050 / NVIDIA nForce 620i/PCI/SSE2 supported 0 NVIDIA GeForce 7000 +NVIDIA GeForce 7050 / nForce 610i/PCI/SSE2 supported 0 NVIDIA GeForce 7000 +NVIDIA GeForce 7050 / nForce 620i/PCI/SSE2 supported 0 NVIDIA GeForce 7000 +NVIDIA GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000 +NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2 supported 0 NVIDIA GeForce 7000 +NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000 +NVIDIA GeForce 7050 SE / NVIDIA nForce 630a/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000 +NVIDIA GeForce 7100 supported 0 NVIDIA GeForce 7100 +NVIDIA GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2 supported 0 NVIDIA GeForce 7100 +NVIDIA GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2 supported 0 NVIDIA GeForce 7100 +NVIDIA GeForce 7100 / nForce 630i/PCI/SSE2 supported 0 NVIDIA GeForce 7100 +NVIDIA GeForce 7100 GS/PCI/SSE2 supported 0 NVIDIA GeForce 7100 +NVIDIA GeForce 7100 GS/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7100 +NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2 supported 0 NVIDIA GeForce 7100 +NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7100 +NVIDIA GeForce 7300 supported 1 NVIDIA GeForce 7300 +NVIDIA GeForce 7300 GS/PCI/SSE2 supported 1 NVIDIA GeForce 7300 +NVIDIA GeForce 7300 GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300 +NVIDIA GeForce 7300 GT/AGP/SSE2 supported 1 NVIDIA GeForce 7300 +NVIDIA GeForce 7300 GT/AGP/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300 +NVIDIA GeForce 7300 GT/PCI/SSE2 supported 1 NVIDIA GeForce 7300 +NVIDIA GeForce 7300 GT/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300 +NVIDIA GeForce 7300 LE/PCI/SSE2 supported 1 NVIDIA GeForce 7300 +NVIDIA GeForce 7300 LE/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300 +NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2 supported 1 NVIDIA GeForce 7300 +NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300 +NVIDIA GeForce 7300 SE/PCI/SSE2 supported 1 NVIDIA GeForce 7300 +NVIDIA GeForce 7300 SE/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300 +NVIDIA GeForce 7350 LE/PCI/SSE2 supported 1 NVIDIA GeForce 7300 +NVIDIA GeForce 7500 supported 1 NVIDIA GeForce 7500 +NVIDIA GeForce 7500 LE/PCI/SSE2 supported 1 NVIDIA GeForce 7500 +NVIDIA GeForce 7500 LE/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7500 +NVIDIA GeForce 7600 supported 2 NVIDIA GeForce 7600 +NVIDIA GeForce 7600 GS/AGP/SSE2 supported 2 NVIDIA GeForce 7600 +NVIDIA GeForce 7600 GS/AGP/SSE2/3DNOW! supported 2 NVIDIA GeForce 7600 +NVIDIA GeForce 7600 GS/PCI/SSE2 supported 2 NVIDIA GeForce 7600 +NVIDIA GeForce 7600 GS/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7600 +NVIDIA GeForce 7600 GT/AGP/SSE/3DNOW! supported 2 NVIDIA GeForce 7600 +NVIDIA GeForce 7600 GT/AGP/SSE2 supported 2 NVIDIA GeForce 7600 +NVIDIA GeForce 7600 GT/PCI/SSE2 supported 2 NVIDIA GeForce 7600 +NVIDIA GeForce 7600 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7600 +NVIDIA GeForce 7650 GS/PCI/SSE2 supported 2 NVIDIA GeForce 7600 +NVIDIA GeForce 7800 supported 2 NVIDIA GeForce 7800 +NVIDIA GeForce 7800 GS/AGP/SSE2 supported 2 NVIDIA GeForce 7800 +NVIDIA GeForce 7800 GS/AGP/SSE2/3DNOW! supported 2 NVIDIA GeForce 7800 +NVIDIA GeForce 7800 GT/PCI/SSE2 supported 2 NVIDIA GeForce 7800 +NVIDIA GeForce 7800 GTX/PCI/SSE2 supported 2 NVIDIA GeForce 7800 +NVIDIA GeForce 7800 GTX/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7800 +NVIDIA GeForce 7900 supported 2 NVIDIA GeForce 7900 +NVIDIA GeForce 7900 GS/PCI/SSE2 supported 2 NVIDIA GeForce 7900 +NVIDIA GeForce 7900 GS/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7900 +NVIDIA GeForce 7900 GT/GTO/PCI/SSE2 supported 2 NVIDIA GeForce 7900 +NVIDIA GeForce 7900 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7900 +NVIDIA GeForce 7900 GTX/PCI/SSE2 supported 2 NVIDIA GeForce 7900 +NVIDIA GeForce 7950 GT/PCI/SSE2 supported 2 NVIDIA GeForce 7900 +NVIDIA GeForce 7950 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7900 +NVIDIA GeForce 8100 supported 1 NVIDIA GeForce 8100 +NVIDIA GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8100 +NVIDIA GeForce 8200 supported 1 NVIDIA GeForce 8200 +NVIDIA GeForce 8200/PCI/SSE2 supported 1 NVIDIA GeForce 8200 +NVIDIA GeForce 8200/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8200 +NVIDIA GeForce 8200M supported 1 NVIDIA GeForce 8200M +NVIDIA GeForce 8200M G/PCI/SSE2 supported 1 NVIDIA GeForce 8200M +NVIDIA GeForce 8200M G/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8200M +NVIDIA GeForce 8300 supported 1 NVIDIA GeForce 8300 +NVIDIA GeForce 8300 GS/PCI/SSE2 supported 1 NVIDIA GeForce 8300 +NVIDIA GeForce 8400 supported 1 NVIDIA GeForce 8400 +NVIDIA GeForce 8400 GS/PCI/SSE/3DNOW! supported 1 NVIDIA GeForce 8400 +NVIDIA GeForce 8400 GS/PCI/SSE2 supported 1 NVIDIA GeForce 8400 +NVIDIA GeForce 8400 GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8400 +NVIDIA GeForce 8400/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8400 +NVIDIA GeForce 8400GS/PCI/SSE2 supported 1 NVIDIA GeForce 8400 +NVIDIA GeForce 8400GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8400 +NVIDIA GeForce 8400M supported 1 NVIDIA GeForce 8400M +NVIDIA GeForce 8400M G/PCI/SSE2 supported 1 NVIDIA GeForce 8400M +NVIDIA GeForce 8400M G/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8400M +NVIDIA GeForce 8400M GS/PCI/SSE2 supported 1 NVIDIA GeForce 8400M +NVIDIA GeForce 8400M GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8400M +NVIDIA GeForce 8400M GT/PCI/SSE2 supported 1 NVIDIA GeForce 8400M +NVIDIA GeForce 8500 supported 3 NVIDIA GeForce 8500 +NVIDIA GeForce 8500 GT/PCI/SSE2 supported 3 NVIDIA GeForce 8500 +NVIDIA GeForce 8500 GT/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8500 +NVIDIA GeForce 8600 supported 3 NVIDIA GeForce 8600 +NVIDIA GeForce 8600 GS/PCI/SSE2 supported 3 NVIDIA GeForce 8600 +NVIDIA GeForce 8600 GS/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8600 +NVIDIA GeForce 8600 GT/PCI/SSE2 supported 3 NVIDIA GeForce 8600 +NVIDIA GeForce 8600 GT/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8600 +NVIDIA GeForce 8600 GTS/PCI/SSE2 supported 3 NVIDIA GeForce 8600 +NVIDIA GeForce 8600 GTS/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8600 +NVIDIA GeForce 8600GS/PCI/SSE2 supported 3 NVIDIA GeForce 8600 +NVIDIA GeForce 8600M supported 1 NVIDIA GeForce 8600M +NVIDIA GeForce 8600M GS/PCI/SSE2 supported 1 NVIDIA GeForce 8600M +NVIDIA GeForce 8600M GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8600M +NVIDIA GeForce 8600M GT/PCI/SSE2 supported 1 NVIDIA GeForce 8600M +NVIDIA GeForce 8700 supported 3 NVIDIA GeForce 8700 +NVIDIA GeForce 8700M supported 3 NVIDIA GeForce 8700M +NVIDIA GeForce 8700M GT/PCI/SSE2 supported 3 NVIDIA GeForce 8700M +NVIDIA GeForce 8800 supported 3 NVIDIA GeForce 8800 +NVIDIA GeForce 8800 GS/PCI/SSE2 supported 3 NVIDIA GeForce 8800 +NVIDIA GeForce 8800 GT/PCI/SSE2 supported 3 NVIDIA GeForce 8800 +NVIDIA GeForce 8800 GT/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8800 +NVIDIA GeForce 8800 GTS 512/PCI/SSE2 supported 3 NVIDIA GeForce 8800 +NVIDIA GeForce 8800 GTS 512/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8800 +NVIDIA GeForce 8800 GTS/PCI/SSE2 supported 3 NVIDIA GeForce 8800 +NVIDIA GeForce 8800 GTS/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8800 +NVIDIA GeForce 8800 GTX/PCI/SSE2 supported 3 NVIDIA GeForce 8800 +NVIDIA GeForce 8800 Ultra/PCI/SSE2 supported 3 NVIDIA GeForce 8800 +NVIDIA GeForce 8800M GTS/PCI/SSE2 supported 3 NVIDIA GeForce 8800M +NVIDIA GeForce 8800M GTX/PCI/SSE2 supported 3 NVIDIA GeForce 8800M +NVIDIA GeForce 9100 supported 0 NVIDIA GeForce 9100 +NVIDIA GeForce 9100/PCI/SSE2 supported 0 NVIDIA GeForce 9100 +NVIDIA GeForce 9100/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 9100 +NVIDIA GeForce 9100M supported 0 NVIDIA GeForce 9100M +NVIDIA GeForce 9100M G/PCI/SSE2 supported 0 NVIDIA GeForce 9100M +NVIDIA GeForce 9100M G/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 9100M +NVIDIA GeForce 9200 supported 1 NVIDIA GeForce 9200 +NVIDIA GeForce 9200/PCI/SSE2 supported 1 NVIDIA GeForce 9200 +NVIDIA GeForce 9200/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9200 +NVIDIA GeForce 9200M GE/PCI/SSE2 supported 1 NVIDIA GeForce 9200M +NVIDIA GeForce 9200M GS/PCI/SSE2 supported 1 NVIDIA GeForce 9200M +NVIDIA GeForce 9300 supported 1 NVIDIA GeForce 9300 +NVIDIA GeForce 9300 / nForce 730i/PCI/SSE2 supported 1 NVIDIA GeForce 9300 +NVIDIA GeForce 9300 GE/PCI/SSE2 supported 1 NVIDIA GeForce 9300 +NVIDIA GeForce 9300 GE/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9300 +NVIDIA GeForce 9300 GS/PCI/SSE2 supported 1 NVIDIA GeForce 9300 +NVIDIA GeForce 9300 GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9300 +NVIDIA GeForce 9300 SE/PCI/SSE2 supported 1 NVIDIA GeForce 9300 +NVIDIA GeForce 9300M supported 1 NVIDIA GeForce 9300M +NVIDIA GeForce 9300M G/PCI/SSE2 supported 1 NVIDIA GeForce 9300M +NVIDIA GeForce 9300M G/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9300M +NVIDIA GeForce 9300M GS/PCI/SSE2 supported 1 NVIDIA GeForce 9300M +NVIDIA GeForce 9300M GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9300M +NVIDIA GeForce 9400 supported 1 NVIDIA GeForce 9400 +NVIDIA GeForce 9400 GT/PCI/SSE2 supported 1 NVIDIA GeForce 9400 +NVIDIA GeForce 9400 GT/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9400 +NVIDIA GeForce 9400/PCI/SSE2 supported 1 NVIDIA GeForce 9400 +NVIDIA GeForce 9400M supported 1 NVIDIA GeForce 9400M +NVIDIA GeForce 9400M G/PCI/SSE2 supported 1 NVIDIA GeForce 9400M +NVIDIA GeForce 9400M/PCI/SSE2 supported 1 NVIDIA GeForce 9400M +NVIDIA GeForce 9500 supported 2 NVIDIA GeForce 9500 +NVIDIA GeForce 9500 GS/PCI/SSE2 supported 2 NVIDIA GeForce 9500 +NVIDIA GeForce 9500 GS/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 9500 +NVIDIA GeForce 9500 GT/PCI/SSE2 supported 2 NVIDIA GeForce 9500 +NVIDIA GeForce 9500 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 9500 +NVIDIA GeForce 9500M supported 2 NVIDIA GeForce 9500M +NVIDIA GeForce 9500M GS/PCI/SSE2 supported 2 NVIDIA GeForce 9500M +NVIDIA GeForce 9600 supported 2 NVIDIA GeForce 9600 +NVIDIA GeForce 9600 GS/PCI/SSE2 supported 2 NVIDIA GeForce 9600 +NVIDIA GeForce 9600 GSO 512/PCI/SSE2 supported 2 NVIDIA GeForce 9600 +NVIDIA GeForce 9600 GSO/PCI/SSE2 supported 2 NVIDIA GeForce 9600 +NVIDIA GeForce 9600 GSO/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 9600 +NVIDIA GeForce 9600 GT/PCI/SSE2 supported 2 NVIDIA GeForce 9600 +NVIDIA GeForce 9600 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 9600 +NVIDIA GeForce 9600M supported 3 NVIDIA GeForce 9600M +NVIDIA GeForce 9600M GS/PCI/SSE2 supported 3 NVIDIA GeForce 9600M +NVIDIA GeForce 9600M GT/PCI/SSE2 supported 3 NVIDIA GeForce 9600M +NVIDIA GeForce 9650M GT/PCI/SSE2 supported 2 NVIDIA GeForce 9600 +NVIDIA GeForce 9700M supported 2 NVIDIA GeForce 9700M +NVIDIA GeForce 9700M GT/PCI/SSE2 supported 2 NVIDIA GeForce 9700M +NVIDIA GeForce 9700M GTS/PCI/SSE2 supported 2 NVIDIA GeForce 9700M +NVIDIA GeForce 9800 supported 3 NVIDIA GeForce 9800 +NVIDIA GeForce 9800 GT/PCI/SSE2 supported 3 NVIDIA GeForce 9800 +NVIDIA GeForce 9800 GT/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 9800 +NVIDIA GeForce 9800 GTX+/PCI/SSE2 supported 3 NVIDIA GeForce 9800 +NVIDIA GeForce 9800 GTX+/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 9800 +NVIDIA GeForce 9800 GTX/9800 GTX+/PCI/SSE2 supported 3 NVIDIA GeForce 9800 +NVIDIA GeForce 9800 GTX/PCI/SSE2 supported 3 NVIDIA GeForce 9800 +NVIDIA GeForce 9800 GX2/PCI/SSE2 supported 3 NVIDIA GeForce 9800 +NVIDIA GeForce 9800M supported 3 NVIDIA GeForce 9800M +NVIDIA GeForce 9800M GS/PCI/SSE2 supported 3 NVIDIA GeForce 9800M +NVIDIA GeForce 9800M GT/PCI/SSE2 supported 3 NVIDIA GeForce 9800M +NVIDIA GeForce 9800M GTS/PCI/SSE2 supported 3 NVIDIA GeForce 9800M +NVIDIA GeForce FX 5100 supported 0 NVIDIA GeForce FX 5100 +NVIDIA GeForce FX 5100/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce FX 5100 +NVIDIA GeForce FX 5200 supported 0 NVIDIA GeForce FX 5200 +NVIDIA GeForce FX 5200/AGP/SSE supported 0 NVIDIA GeForce FX 5200 +NVIDIA GeForce FX 5200/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce FX 5200 +NVIDIA GeForce FX 5200/AGP/SSE2 supported 0 NVIDIA GeForce FX 5200 +NVIDIA GeForce FX 5200/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce FX 5200 +NVIDIA GeForce FX 5200/PCI/SSE2 supported 0 NVIDIA GeForce FX 5200 +NVIDIA GeForce FX 5200/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce FX 5200 +NVIDIA GeForce FX 5200LE/AGP/SSE2 supported 0 NVIDIA GeForce FX 5200 +NVIDIA GeForce FX 5500 supported 0 NVIDIA GeForce FX 5500 +NVIDIA GeForce FX 5500/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce FX 5500 +NVIDIA GeForce FX 5500/AGP/SSE2 supported 0 NVIDIA GeForce FX 5500 +NVIDIA GeForce FX 5500/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce FX 5500 +NVIDIA GeForce FX 5500/PCI/SSE2 supported 0 NVIDIA GeForce FX 5500 +NVIDIA GeForce FX 5500/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce FX 5500 +NVIDIA GeForce FX 5600 supported 0 NVIDIA GeForce FX 5600 +NVIDIA GeForce FX 5600/AGP/SSE2 supported 0 NVIDIA GeForce FX 5600 +NVIDIA GeForce FX 5600/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce FX 5600 +NVIDIA GeForce FX 5600XT/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce FX 5600 +NVIDIA GeForce FX 5700 supported 1 NVIDIA GeForce FX 5700 +NVIDIA GeForce FX 5700/AGP/SSE/3DNOW! supported 1 NVIDIA GeForce FX 5700 +NVIDIA GeForce FX 5700LE/AGP/SSE supported 1 NVIDIA GeForce FX 5700 +NVIDIA GeForce FX 5700LE/AGP/SSE/3DNOW! supported 1 NVIDIA GeForce FX 5700 +NVIDIA GeForce FX 5800 supported 1 NVIDIA GeForce FX 5800 +NVIDIA GeForce FX 5900 supported 1 NVIDIA GeForce FX 5900 +NVIDIA GeForce FX 5900/AGP/SSE2 supported 1 NVIDIA GeForce FX 5900 +NVIDIA GeForce FX 5900XT/AGP/SSE2 supported 1 NVIDIA GeForce FX 5900 +NVIDIA GeForce FX Go5100 supported 0 NVIDIA GeForce FX Go5100 +NVIDIA GeForce FX Go5100/AGP/SSE2 supported 0 NVIDIA GeForce FX Go5100 +NVIDIA GeForce FX Go5200 supported 0 NVIDIA GeForce FX Go5200 +NVIDIA GeForce FX Go5200/AGP/SSE2 supported 0 NVIDIA GeForce FX Go5200 +NVIDIA GeForce FX Go5300 supported 0 NVIDIA GeForce FX Go5300 +NVIDIA GeForce FX Go5600 supported 0 NVIDIA GeForce FX Go5600 +NVIDIA GeForce FX Go5600/AGP/SSE2 supported 0 NVIDIA GeForce FX Go5600 +NVIDIA GeForce FX Go5650/AGP/SSE2 supported 0 NVIDIA GeForce FX Go5600 +NVIDIA GeForce FX Go5700 supported 1 NVIDIA GeForce FX Go5700 +NVIDIA GeForce FX Go5xxx/AGP/SSE2 supported 0 NVIDIA GeForce FX Go5xxx +NVIDIA GeForce G 103M/PCI/SSE2 supported 0 NVIDIA G103M +NVIDIA GeForce G 105M/PCI/SSE2 supported 0 NVIDIA G105M +NVIDIA GeForce G 110M/PCI/SSE2 supported 0 NVIDIA G 110M +NVIDIA GeForce G100/PCI/SSE2 supported 0 NVIDIA G100 +NVIDIA GeForce G100/PCI/SSE2/3DNOW! supported 0 NVIDIA G100 +NVIDIA GeForce G102M/PCI/SSE2 supported 0 NVIDIA G102M +NVIDIA GeForce G105M/PCI/SSE2 supported 0 NVIDIA G105M +NVIDIA GeForce G200/PCI/SSE2 supported 0 NVIDIA G 200 +NVIDIA GeForce G205M/PCI/SSE2 supported 0 NVIDIA G 205M +NVIDIA GeForce G210/PCI/SSE2 supported 1 NVIDIA G 210 +NVIDIA GeForce G210/PCI/SSE2/3DNOW! supported 1 NVIDIA G 210 +NVIDIA GeForce G210M/PCI/SSE2 supported 1 NVIDIA G 210 +NVIDIA GeForce G310M/PCI/SSE2 supported 2 NVIDIA G 310M +NVIDIA GeForce GT 120/PCI/SSE2 supported 2 NVIDIA GT 120M +NVIDIA GeForce GT 120/PCI/SSE2/3DNOW! supported 2 NVIDIA GT 120M +NVIDIA GeForce GT 120M/PCI/SSE2 supported 2 NVIDIA GT 120M +NVIDIA GeForce GT 130M/PCI/SSE2 supported 2 NVIDIA GT 130M +NVIDIA GeForce GT 140/PCI/SSE2 supported 2 NVIDIA GT 140M +NVIDIA GeForce GT 220/PCI/SSE2 supported 2 NVIDIA GT 220M +NVIDIA GeForce GT 220/PCI/SSE2/3DNOW! supported 2 NVIDIA GT 220M +NVIDIA GeForce GT 220M/PCI/SSE2 supported 2 NVIDIA GT 220M +NVIDIA GeForce GT 230/PCI/SSE2 supported 2 NVIDIA GT 230M +NVIDIA GeForce GT 230M/PCI/SSE2 supported 2 NVIDIA GT 230M +NVIDIA GeForce GT 240 supported 2 NVIDIA GT 240M +NVIDIA GeForce GT 240/PCI/SSE2 supported 2 NVIDIA GT 240M +NVIDIA GeForce GT 240/PCI/SSE2/3DNOW! supported 2 NVIDIA GT 240M +NVIDIA GeForce GT 240M/PCI/SSE2 supported 2 NVIDIA GT 240M +NVIDIA GeForce GT 320/PCI/SSE2 supported 2 NVIDIA GT 320M +NVIDIA GeForce GT 320M/PCI/SSE2 supported 2 NVIDIA GT 320M +NVIDIA GeForce GT 325M/PCI/SSE2 supported 0 NVIDIA GT 325M +NVIDIA GeForce GT 330/PCI/SSE2 supported 3 NVIDIA GT 330M +NVIDIA GeForce GT 330/PCI/SSE2/3DNOW! supported 3 NVIDIA GT 330M +NVIDIA GeForce GT 330M/PCI/SSE2 supported 3 NVIDIA GT 330M +NVIDIA GeForce GT 335M/PCI/SSE2 supported 1 NVIDIA GT 335M +NVIDIA GeForce GT 340/PCI/SSE2 supported 2 NVIDIA GT 340M +NVIDIA GeForce GT 340/PCI/SSE2/3DNOW! supported 2 NVIDIA GT 340M +NVIDIA GeForce GT 415M/PCI/SSE2 supported 2 NVIDIA GT 415M +NVIDIA GeForce GT 420/PCI/SSE2 supported 2 NVIDIA GT 420M +NVIDIA GeForce GT 420M/PCI/SSE2 supported 2 NVIDIA GT 420M +NVIDIA GeForce GT 425M/PCI/SSE2 supported 3 NVIDIA GT 425M +NVIDIA GeForce GT 430/PCI/SSE2 supported 3 NVIDIA GT 430M +NVIDIA GeForce GT 430/PCI/SSE2/3DNOW! supported 3 NVIDIA GT 430M +NVIDIA GeForce GT 435M/PCI/SSE2 supported 3 NVIDIA GT 435M +NVIDIA GeForce GT 440/PCI/SSE2 supported 3 NVIDIA GT 440M +NVIDIA GeForce GT 440/PCI/SSE2/3DNOW! supported 3 NVIDIA GT 440M +NVIDIA GeForce GT 445M/PCI/SSE2 supported 3 NVIDIA GT 445M +NVIDIA GeForce GT 520M/PCI/SSE2 supported 3 NVIDIA GT 520M +NVIDIA GeForce GT 525M/PCI/SSE2 supported 3 NVIDIA GT 525M +NVIDIA GeForce GT 540M/PCI/SSE2 supported 3 NVIDIA GT 540M +NVIDIA GeForce GT 550M/PCI/SSE2 supported 3 NVIDIA GT 550M +NVIDIA GeForce GT 555M/PCI/SSE2 supported 3 NVIDIA GT 555M +NVIDIA GeForce GTS 150/PCI/SSE2 supported 2 NVIDIA GT 150M +NVIDIA GeForce GTS 160M/PCI/SSE2 supported 2 NVIDIA GTS 160M +NVIDIA GeForce GTS 240/PCI/SSE2 supported 3 NVIDIA GTS 240 +NVIDIA GeForce GTS 250/PCI/SSE2 supported 3 NVIDIA GTS 250 +NVIDIA GeForce GTS 250/PCI/SSE2/3DNOW! supported 3 NVIDIA GTS 250 +NVIDIA GeForce GTS 250M/PCI/SSE2 supported 3 NVIDIA GTS 250 +NVIDIA GeForce GTS 350M/PCI/SSE2 supported 3 NVIDIA GTS 350M +NVIDIA GeForce GTS 360M/PCI/SSE2 supported 3 NVIDIA GTS 360M +NVIDIA GeForce GTS 450/PCI/SSE2 supported 3 NVIDIA GTS 450 +NVIDIA GeForce GTS 450/PCI/SSE2/3DNOW! supported 3 NVIDIA GTS 450 +NVIDIA GeForce GTS 455/PCI/SSE2 supported 3 NVIDIA GTS 450 +NVIDIA GeForce GTX 260/PCI/SSE2 supported 3 NVIDIA GTX 260 +NVIDIA GeForce GTX 260/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 260 +NVIDIA GeForce GTX 260M/PCI/SSE2 supported 3 NVIDIA GTX 260 +NVIDIA GeForce GTX 275/PCI/SSE2 supported 3 NVIDIA GTX 275 +NVIDIA GeForce GTX 280 supported 3 NVIDIA GTX 280 +NVIDIA GeForce GTX 280/PCI/SSE2 supported 3 NVIDIA GTX 280 +NVIDIA GeForce GTX 280M/PCI/SSE2 supported 3 NVIDIA GTX 280 +NVIDIA GeForce GTX 285/PCI/SSE2 supported 3 NVIDIA GTX 285 +NVIDIA GeForce GTX 295/PCI/SSE2 supported 3 NVIDIA GTX 295 +NVIDIA GeForce GTX 460 SE/PCI/SSE2 supported 3 NVIDIA GTX 460 +NVIDIA GeForce GTX 460 SE/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 460 +NVIDIA GeForce GTX 460/PCI/SSE2 supported 3 NVIDIA GTX 460 +NVIDIA GeForce GTX 460/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 460 +NVIDIA GeForce GTX 460M/PCI/SSE2 supported 3 NVIDIA GTX 460M +NVIDIA GeForce GTX 465/PCI/SSE2 supported 3 NVIDIA GTX 465 +NVIDIA GeForce GTX 465/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 465 +NVIDIA GeForce GTX 470/PCI/SSE2 supported 3 NVIDIA GTX 470 +NVIDIA GeForce GTX 470/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 470 +NVIDIA GeForce GTX 480/PCI/SSE2 supported 3 NVIDIA GTX 480 +NVIDIA GeForce GTX 550 Ti/PCI/SSE2 supported 3 NVIDIA GTX 550 +NVIDIA GeForce GTX 550 Ti/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 550 +NVIDIA GeForce GTX 560 Ti/PCI/SSE2 supported 3 NVIDIA GTX 560 +NVIDIA GeForce GTX 560 Ti/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 560 +NVIDIA GeForce GTX 560/PCI/SSE2 supported 3 NVIDIA GTX 560 +NVIDIA GeForce GTX 570/PCI/SSE2 supported 3 NVIDIA GTX 570 +NVIDIA GeForce GTX 570/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 570 +NVIDIA GeForce GTX 580/PCI/SSE2 supported 3 NVIDIA GTX 580 +NVIDIA GeForce GTX 580/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 580 +NVIDIA GeForce GTX 580M/PCI/SSE2 supported 3 NVIDIA GTX 580M +NVIDIA GeForce GTX 590/PCI/SSE2 supported 3 NVIDIA GTX 590 +NVIDIA GeForce Go 6 supported 1 NVIDIA GeForce Go 6 +NVIDIA GeForce Go 6100 supported 0 NVIDIA GeForce Go 6100 +NVIDIA GeForce Go 6100/PCI/SSE2 supported 0 NVIDIA GeForce Go 6100 +NVIDIA GeForce Go 6100/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce Go 6100 +NVIDIA GeForce Go 6150/PCI/SSE2 supported 0 NVIDIA GeForce Go 6100 +NVIDIA GeForce Go 6150/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce Go 6100 +NVIDIA GeForce Go 6200 supported 0 NVIDIA GeForce Go 6200 +NVIDIA GeForce Go 6200/PCI/SSE2 supported 0 NVIDIA GeForce Go 6200 +NVIDIA GeForce Go 6400 supported 1 NVIDIA GeForce Go 6400 +NVIDIA GeForce Go 6400/PCI/SSE2 supported 1 NVIDIA GeForce Go 6400 +NVIDIA GeForce Go 6600 supported 1 NVIDIA GeForce Go 6600 +NVIDIA GeForce Go 6600/PCI/SSE2 supported 1 NVIDIA GeForce Go 6600 +NVIDIA GeForce Go 6800 supported 1 NVIDIA GeForce Go 6800 +NVIDIA GeForce Go 6800 Ultra/PCI/SSE2 supported 1 NVIDIA GeForce Go 6800 +NVIDIA GeForce Go 6800/PCI/SSE2 supported 1 NVIDIA GeForce Go 6800 +NVIDIA GeForce Go 7200 supported 1 NVIDIA GeForce Go 7200 +NVIDIA GeForce Go 7200/PCI/SSE2 supported 1 NVIDIA GeForce Go 7200 +NVIDIA GeForce Go 7200/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce Go 7200 +NVIDIA GeForce Go 7300 supported 1 NVIDIA GeForce Go 7300 +NVIDIA GeForce Go 7300/PCI/SSE2 supported 1 NVIDIA GeForce Go 7300 +NVIDIA GeForce Go 7300/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce Go 7300 +NVIDIA GeForce Go 7400 supported 1 NVIDIA GeForce Go 7400 +NVIDIA GeForce Go 7400/PCI/SSE2 supported 1 NVIDIA GeForce Go 7400 +NVIDIA GeForce Go 7400/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce Go 7400 +NVIDIA GeForce Go 7600 supported 2 NVIDIA GeForce Go 7600 +NVIDIA GeForce Go 7600/PCI/SSE2 supported 2 NVIDIA GeForce Go 7600 +NVIDIA GeForce Go 7600/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce Go 7600 +NVIDIA GeForce Go 7700 supported 2 NVIDIA GeForce Go 7700 +NVIDIA GeForce Go 7800 supported 2 NVIDIA GeForce Go 7800 +NVIDIA GeForce Go 7800 GTX/PCI/SSE2 supported 2 NVIDIA GeForce Go 7800 +NVIDIA GeForce Go 7900 supported 2 NVIDIA GeForce Go 7900 +NVIDIA GeForce Go 7900 GS/PCI/SSE2 supported 2 NVIDIA GeForce Go 7900 +NVIDIA GeForce Go 7900 GTX/PCI/SSE2 supported 2 NVIDIA GeForce Go 7900 +NVIDIA GeForce Go 7950 GTX/PCI/SSE2 supported 2 NVIDIA GeForce Go 7900 +NVIDIA GeForce PCX supported 0 NVIDIA GeForce PCX +NVIDIA GeForce2 GTS/AGP/SSE supported 0 NVIDIA GeForce 2 +NVIDIA GeForce2 MX/AGP/3DNOW! supported 0 NVIDIA GeForce 2 +NVIDIA GeForce2 MX/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 2 +NVIDIA GeForce2 MX/AGP/SSE2 supported 0 NVIDIA GeForce 2 +NVIDIA GeForce2 MX/PCI/SSE2 supported 0 NVIDIA GeForce 2 +NVIDIA GeForce3/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 3 +NVIDIA GeForce3/AGP/SSE2 supported 0 NVIDIA GeForce 3 +NVIDIA GeForce4 420 Go 32M/AGP/SSE2 supported 0 NVIDIA GeForce 4 +NVIDIA GeForce4 420 Go 32M/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce 4 +NVIDIA GeForce4 420 Go 32M/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 4 +NVIDIA GeForce4 440 Go 64M/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce 4 +NVIDIA GeForce4 460 Go/AGP/SSE2 supported 0 NVIDIA GeForce 4 +NVIDIA GeForce4 MX 4000/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 4 +NVIDIA GeForce4 MX 4000/AGP/SSE2 supported 0 NVIDIA GeForce 4 +NVIDIA GeForce4 MX 4000/PCI/3DNOW! supported 0 NVIDIA GeForce 4 +NVIDIA GeForce4 MX 4000/PCI/SSE/3DNOW! supported 0 NVIDIA GeForce 4 +NVIDIA GeForce4 MX 4000/PCI/SSE2 supported 0 NVIDIA GeForce 4 +NVIDIA GeForce4 MX 420/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 4 +NVIDIA GeForce4 MX 420/AGP/SSE2 supported 0 NVIDIA GeForce 4 +NVIDIA GeForce4 MX 440 with AGP8X/AGP/SSE2 supported 0 NVIDIA GeForce 4 +NVIDIA GeForce4 MX 440/AGP/SSE2 supported 0 NVIDIA GeForce 4 +NVIDIA GeForce4 MX 440/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce 4 +NVIDIA GeForce4 MX 440SE with AGP8X/AGP/SSE2 supported 0 NVIDIA GeForce 4 +NVIDIA GeForce4 MX Integrated GPU/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 4 +NVIDIA GeForce4 Ti 4200 with AGP8X/AGP/SSE supported 0 NVIDIA GeForce 4 +NVIDIA GeForce4 Ti 4200/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 4 +NVIDIA GeForce4 Ti 4400/AGP/SSE2 supported 0 NVIDIA GeForce 4 +NVIDIA Generic UNRECOGNIZED +NVIDIA ION LE/PCI/SSE2 supported 2 NVIDIA ION +NVIDIA ION/PCI/SSE2 supported 2 NVIDIA ION +NVIDIA ION/PCI/SSE2/3DNOW! supported 2 NVIDIA ION +NVIDIA MCP61/PCI/SSE2 UNRECOGNIZED +NVIDIA MCP61/PCI/SSE2/3DNOW! UNRECOGNIZED +NVIDIA MCP73/PCI/SSE2 UNRECOGNIZED +NVIDIA MCP79MH/PCI/SSE2 UNRECOGNIZED +NVIDIA MCP79MX/PCI/SSE2 UNRECOGNIZED +NVIDIA MCP7A-O/PCI/SSE2 UNRECOGNIZED +NVIDIA MCP7A-S/PCI/SSE2 UNRECOGNIZED +NVIDIA MCP89-EPT/PCI/SSE2 UNRECOGNIZED +NVIDIA N10M-GE1/PCI/SSE2 UNRECOGNIZED +NVIDIA N10P-GE1/PCI/SSE2 UNRECOGNIZED +NVIDIA N10P-GV2/PCI/SSE2 UNRECOGNIZED +NVIDIA N11M-GE1/PCI/SSE2 UNRECOGNIZED +NVIDIA N11M-GE2/PCI/SSE2 UNRECOGNIZED +NVIDIA N12E-GS-A1/PCI/SSE2 UNRECOGNIZED +NVIDIA NB9M-GE/PCI/SSE2 UNRECOGNIZED +NVIDIA NB9M-GE1/PCI/SSE2 UNRECOGNIZED +NVIDIA NB9M-GS/PCI/SSE2 UNRECOGNIZED +NVIDIA NB9M-NS/PCI/SSE2 UNRECOGNIZED +NVIDIA NB9P-GE1/PCI/SSE2 UNRECOGNIZED +NVIDIA NB9P-GS/PCI/SSE2 UNRECOGNIZED +NVIDIA NV17/AGP/3DNOW! UNRECOGNIZED +NVIDIA NV17/AGP/SSE2 UNRECOGNIZED +NVIDIA NV34 supported 0 NVIDIA NV34 +NVIDIA NV35 supported 0 NVIDIA NV35 +NVIDIA NV36/AGP/SSE/3DNOW! UNRECOGNIZED +NVIDIA NV36/AGP/SSE2 UNRECOGNIZED +NVIDIA NV41/PCI/SSE2 UNRECOGNIZED +NVIDIA NV43 supported 1 NVIDIA NV43 +NVIDIA NV44 supported 1 NVIDIA NV44 +NVIDIA NVIDIA GeForce 210 OpenGL Engine supported 2 NVIDIA 210 +NVIDIA NVIDIA GeForce 320M OpenGL Engine supported 2 NVIDIA 320M +NVIDIA NVIDIA GeForce 7300 GT OpenGL Engine supported 1 NVIDIA GeForce 7300 +NVIDIA NVIDIA GeForce 7600 GT OpenGL Engine supported 2 NVIDIA GeForce 7600 +NVIDIA NVIDIA GeForce 8600M GT OpenGL Engine supported 1 NVIDIA GeForce 8600M +NVIDIA NVIDIA GeForce 8800 GS OpenGL Engine supported 3 NVIDIA GeForce 8800 +NVIDIA NVIDIA GeForce 8800 GT OpenGL Engine supported 3 NVIDIA GeForce 8800 +NVIDIA NVIDIA GeForce 9400 OpenGL Engine supported 1 NVIDIA GeForce 9400 +NVIDIA NVIDIA GeForce 9400M OpenGL Engine supported 1 NVIDIA GeForce 9400M +NVIDIA NVIDIA GeForce 9500 GT OpenGL Engine supported 2 NVIDIA GeForce 9500 +NVIDIA NVIDIA GeForce 9600M GT OpenGL Engine supported 3 NVIDIA GeForce 9600M +NVIDIA NVIDIA GeForce GT 120 OpenGL Engine supported 2 NVIDIA GT 120M +NVIDIA NVIDIA GeForce GT 130 OpenGL Engine supported 2 NVIDIA GT 130M +NVIDIA NVIDIA GeForce GT 220 OpenGL Engine supported 2 NVIDIA GT 220M +NVIDIA NVIDIA GeForce GT 230M OpenGL Engine supported 2 NVIDIA GT 230M +NVIDIA NVIDIA GeForce GT 240M OpenGL Engine supported 2 NVIDIA GT 240M +NVIDIA NVIDIA GeForce GT 330M OpenGL Engine supported 3 NVIDIA GT 330M +NVIDIA NVIDIA GeForce GT 420M OpenGL Engine supported 2 NVIDIA GT 420M +NVIDIA NVIDIA GeForce GT 425M OpenGL Engine supported 3 NVIDIA GT 425M +NVIDIA NVIDIA GeForce GT 430 OpenGL Engine supported 3 NVIDIA GT 430M +NVIDIA NVIDIA GeForce GT 440 OpenGL Engine supported 3 NVIDIA GT 440M +NVIDIA NVIDIA GeForce GT 540M OpenGL Engine supported 3 NVIDIA GT 540M +NVIDIA NVIDIA GeForce GTS 240 OpenGL Engine supported 3 NVIDIA GTS 240 +NVIDIA NVIDIA GeForce GTS 250 OpenGL Engine supported 3 NVIDIA GTS 250 +NVIDIA NVIDIA GeForce GTS 450 OpenGL Engine supported 3 NVIDIA GTS 450 +NVIDIA NVIDIA GeForce GTX 285 OpenGL Engine supported 3 NVIDIA GTX 285 +NVIDIA NVIDIA GeForce GTX 460 OpenGL Engine supported 3 NVIDIA GTX 460 +NVIDIA NVIDIA GeForce GTX 460M OpenGL Engine supported 3 NVIDIA GTX 460M +NVIDIA NVIDIA GeForce GTX 465 OpenGL Engine supported 3 NVIDIA GTX 465 +NVIDIA NVIDIA GeForce GTX 470 OpenGL Engine supported 3 NVIDIA GTX 470 +NVIDIA NVIDIA GeForce GTX 480 OpenGL Engine supported 3 NVIDIA GTX 480 +NVIDIA NVIDIA GeForce Pre-Release ION OpenGL Engine UNRECOGNIZED +NVIDIA NVIDIA GeForce4 OpenGL Engine supported 0 NVIDIA GeForce 4 +NVIDIA NVIDIA NV34MAP OpenGL Engine supported 0 NVIDIA NV34 +NVIDIA NVIDIA Quadro 4000 OpenGL Engine supported 3 NVIDIA Quadro 4000 +NVIDIA NVIDIA Quadro FX 4800 OpenGL Engine supported 3 NVIDIA Quadro FX 4800 +NVIDIA NVS 2100M/PCI/SSE2 supported 2 NVIDIA Quadro NVS 2100M +NVIDIA NVS 300/PCI/SSE2 supported 0 NVIDIA Quadro NVS +NVIDIA NVS 3100M/PCI/SSE2 supported 2 NVIDIA Quadro NVS 3100M +NVIDIA NVS 4100/PCI/SSE2/3DNOW! supported 0 NVIDIA Quadro NVS +NVIDIA NVS 4200M/PCI/SSE2 supported 2 NVIDIA Quadro NVS 4200M +NVIDIA NVS 5100M/PCI/SSE2 supported 2 NVIDIA Quadro NVS 5100M +NVIDIA PCI UNRECOGNIZED +NVIDIA Quadro 2000/PCI/SSE2 supported 3 NVIDIA Quadro 2000 M/D +NVIDIA Quadro 4000 supported 3 NVIDIA Quadro 4000 +NVIDIA Quadro 4000 OpenGL Engine supported 3 NVIDIA Quadro 4000 +NVIDIA Quadro 4000/PCI/SSE2 supported 3 NVIDIA Quadro 4000 +NVIDIA Quadro 5000/PCI/SSE2 supported 3 NVIDIA Quadro 50x0 M +NVIDIA Quadro 5000M/PCI/SSE2 supported 3 NVIDIA Quadro 50x0 M +NVIDIA Quadro 600 supported 2 NVIDIA Quadro 600 +NVIDIA Quadro 600/PCI/SSE2 supported 2 NVIDIA Quadro 600 +NVIDIA Quadro 600/PCI/SSE2/3DNOW! supported 2 NVIDIA Quadro 600 +NVIDIA Quadro 6000 supported 3 NVIDIA Quadro 6000 +NVIDIA Quadro 6000/PCI/SSE2 supported 3 NVIDIA Quadro 6000 +NVIDIA Quadro CX/PCI/SSE2 UNRECOGNIZED +NVIDIA Quadro DCC supported 0 NVIDIA Quadro DCC +NVIDIA Quadro FX supported 1 NVIDIA Quadro FX +NVIDIA Quadro FX 1100/AGP/SSE2 supported 1 NVIDIA Quadro FX +NVIDIA Quadro FX 1400/PCI/SSE2 supported 2 NVIDIA Quadro 400 +NVIDIA Quadro FX 1500 supported 1 NVIDIA Quadro FX +NVIDIA Quadro FX 1500M/PCI/SSE2 supported 1 NVIDIA Quadro FX 1500M +NVIDIA Quadro FX 1600M/PCI/SSE2 supported 2 NVIDIA Quadro 600 +NVIDIA Quadro FX 1700 supported 1 NVIDIA Quadro FX +NVIDIA Quadro FX 1700M/PCI/SSE2 supported 1 NVIDIA Quadro FX +NVIDIA Quadro FX 1800 supported 1 NVIDIA Quadro FX +NVIDIA Quadro FX 1800/PCI/SSE2 supported 1 NVIDIA Quadro FX +NVIDIA Quadro FX 1800M/PCI/SSE2 supported 1 NVIDIA Quadro FX +NVIDIA Quadro FX 2500M/PCI/SSE2 supported 2 NVIDIA Quadro FX 2500M +NVIDIA Quadro FX 2700M/PCI/SSE2 supported 3 NVIDIA Quadro FX 2700M +NVIDIA Quadro FX 2800M/PCI/SSE2 supported 3 NVIDIA Quadro FX 2800M +NVIDIA Quadro FX 3400 supported 2 NVIDIA Quadro 400 +NVIDIA Quadro FX 3450 supported 1 NVIDIA Quadro FX +NVIDIA Quadro FX 3450/4000 SDI/PCI/SSE2 supported 2 NVIDIA Quadro 400 +NVIDIA Quadro FX 3500 supported 2 NVIDIA Quadro FX 3500 +NVIDIA Quadro FX 3500M/PCI/SSE2 supported 2 NVIDIA Quadro FX 3500 +NVIDIA Quadro FX 360M/PCI/SSE2 supported 1 NVIDIA Quadro FX +NVIDIA Quadro FX 370 supported 1 NVIDIA Quadro FX +NVIDIA Quadro FX 370/PCI/SSE2 supported 1 NVIDIA Quadro FX +NVIDIA Quadro FX 3700 supported 3 NVIDIA Quadro FX 3700 +NVIDIA Quadro FX 3700M/PCI/SSE2 supported 3 NVIDIA Quadro FX 3700 +NVIDIA Quadro FX 370M/PCI/SSE2 supported 1 NVIDIA Quadro FX +NVIDIA Quadro FX 3800 supported 3 NVIDIA Quadro FX 3800 +NVIDIA Quadro FX 3800M/PCI/SSE2 supported 3 NVIDIA Quadro FX 3800 +NVIDIA Quadro FX 4500 supported 3 NVIDIA Quadro FX 4500 +NVIDIA Quadro FX 4600 supported 2 NVIDIA Quadro 600 +NVIDIA Quadro FX 4800 supported 3 NVIDIA Quadro FX 4800 +NVIDIA Quadro FX 4800/PCI/SSE2 supported 3 NVIDIA Quadro FX 4800 +NVIDIA Quadro FX 560 supported 1 NVIDIA Quadro FX +NVIDIA Quadro FX 5600 supported 2 NVIDIA Quadro 600 +NVIDIA Quadro FX 570 supported 1 NVIDIA Quadro FX +NVIDIA Quadro FX 570/PCI/SSE2 supported 1 NVIDIA Quadro FX +NVIDIA Quadro FX 570M/PCI/SSE2 supported 1 NVIDIA Quadro FX +NVIDIA Quadro FX 580/PCI/SSE2 supported 1 NVIDIA Quadro FX +NVIDIA Quadro FX 770M/PCI/SSE2 supported 2 NVIDIA Quadro FX 770M +NVIDIA Quadro FX 880M supported 3 NVIDIA Quadro FX 880M +NVIDIA Quadro FX 880M/PCI/SSE2 supported 3 NVIDIA Quadro FX 880M +NVIDIA Quadro FX Go700/AGP/SSE2 supported 1 NVIDIA Quadro FX +NVIDIA Quadro NVS supported 0 NVIDIA Quadro NVS +NVIDIA Quadro NVS 110M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM +NVIDIA Quadro NVS 130M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM +NVIDIA Quadro NVS 135M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM +NVIDIA Quadro NVS 140M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM +NVIDIA Quadro NVS 150M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM +NVIDIA Quadro NVS 160M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM +NVIDIA Quadro NVS 210S/PCI/SSE2/3DNOW! supported 0 NVIDIA Quadro NVS +NVIDIA Quadro NVS 285/PCI/SSE2 supported 0 NVIDIA Quadro NVS +NVIDIA Quadro NVS 290/PCI/SSE2 supported 0 NVIDIA Quadro NVS +NVIDIA Quadro NVS 295/PCI/SSE2 supported 0 NVIDIA Quadro NVS +NVIDIA Quadro NVS 320M/PCI/SSE2 supported 2 NVIDIA Quadro NVS 320M +NVIDIA Quadro NVS 55/280 PCI/PCI/SSE2 supported 0 NVIDIA Quadro NVS +NVIDIA Quadro NVS/PCI/SSE2 supported 0 NVIDIA Quadro NVS +NVIDIA Quadro PCI-E Series/PCI/SSE2/3DNOW! UNRECOGNIZED +NVIDIA Quadro VX 200/PCI/SSE2 UNRECOGNIZED +NVIDIA Quadro/AGP/SSE2 UNRECOGNIZED +NVIDIA Quadro2 supported 0 NVIDIA Quadro2 +NVIDIA Quadro4 supported 0 NVIDIA Quadro4 +NVIDIA RIVA TNT unsupported 0 NVIDIA RIVA TNT +NVIDIA RIVA TNT2/AGP/SSE2 unsupported 0 NVIDIA RIVA TNT +NVIDIA RIVA TNT2/PCI/3DNOW! unsupported 0 NVIDIA RIVA TNT +NVIDIA nForce unsupported 0 NVIDIA nForce +NVIDIA unknown board/AGP/SSE2 UNRECOGNIZED +NVIDIA unknown board/PCI/SSE2 UNRECOGNIZED +NVIDIA unknown board/PCI/SSE2/3DNOW! UNRECOGNIZED +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine supported 3 ATI Radeon HD 5600 +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine supported 3 ATI Radeon HD 5700 +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine supported 3 ATI Radeon HD 5700 +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6490M OpenGL Engine supported 3 ATI Radeon HD 6400 +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine supported 3 ATI Radeon HD 6700 +Parallels and Intel Inc. 3D-Analyze v2.3 - http://www.tommti-systems.com UNRECOGNIZED +Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine supported 2 Intel HD Graphics +Parallels and NVIDIA Parallels using NVIDIA GeForce 320M OpenGL Engine supported 2 NVIDIA 320M +Parallels and NVIDIA Parallels using NVIDIA GeForce 9400 OpenGL Engine supported 1 NVIDIA GeForce 9400 +Parallels and NVIDIA Parallels using NVIDIA GeForce GT 120 OpenGL Engine supported 2 NVIDIA GT 120M +Parallels and NVIDIA Parallels using NVIDIA GeForce GT 330M OpenGL Engine supported 3 NVIDIA GT 330M +Radeon RV350 on Gallium supported 0 ATI RV350 (9600) +S3 UNRECOGNIZED +S3 Graphics VIA/S3G UniChrome IGP/MMX/K3D unsupported 0 S3 +S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE unsupported 0 S3 +S3 Graphics, Incorporated ProSavage/Twister unsupported 0 S3 +S3 Graphics, Incorporated S3 Graphics Chrome9 HC unsupported 0 S3 +S3 Graphics, Incorporated S3 Graphics DeltaChrome unsupported 0 S3 +S3 Graphics, Incorporated VIA Chrome9 HC IGP unsupported 0 S3 +SiS unsupported 0 SiS +SiS 661 VGA unsupported 0 SiS +SiS 662 VGA unsupported 0 SiS +SiS 741 VGA unsupported 0 SiS +SiS 760 VGA unsupported 0 SiS +SiS 761GX VGA unsupported 0 SiS +SiS Mirage Graphics3 unsupported 0 SiS +Trident unsupported 0 Trident +Tungsten Graphics unsupported 0 Tungsten Graphics +Tungsten Graphics, Inc Mesa DRI 865G GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 865G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 915G GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 915G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 915GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 915GM GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 915GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 945G unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 945G GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 945GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 945GM GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100328 2010Q1 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 945GME x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 945GME 20061017 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 945GME GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 945GME GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 945GME GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090326 2009Q1 RC2 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 965GM GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI 965GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI G33 20061017 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI G33 GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI G33 GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI G41 GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI G41 GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI GMA500 20081116 - 5.0.1.0046 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI IGD GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI IGDNG_D GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI Ironlake Desktop GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI Ironlake Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset 20080716 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20090712 2009Q2 RC3 x86/MMX... unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100328 2010Q1 unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT unsupported 0 Mesa +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MM... unsupported 0 Mesa +Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5964) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 unsupported 0 Mesa +VIA unsupported 0 VIA +VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE; UNRECOGNIZED +VMware, Inc. Gallium 0.4 on i915 (chipset: 945GM) UNRECOGNIZED +VMware, Inc. Gallium 0.4 on llvmpipe UNRECOGNIZED +VMware, Inc. Gallium 0.4 on softpipe UNRECOGNIZED +X.Org Gallium 0.4 on AMD BARTS supported 3 AMD BARTS (HD 6800) +X.Org Gallium 0.4 on AMD CEDAR supported 2 AMD CEDAR (HD 5450) +X.Org Gallium 0.4 on AMD HEMLOCK supported 3 AMD HEMLOCK (HD 5970) +X.Org Gallium 0.4 on AMD JUNIPER supported 3 AMD JUNIPER (HD 5700) +X.Org Gallium 0.4 on AMD REDWOOD supported 3 AMD REDWOOD (HD 5500/5600) +X.Org Gallium 0.4 on AMD RS780 supported 0 AMD RS780 (HD 3200) +X.Org Gallium 0.4 on AMD RS880 supported 1 AMD RS880 (HD 4200) +X.Org Gallium 0.4 on AMD RV610 supported 1 AMD RV610 (HD 2400) +X.Org Gallium 0.4 on AMD RV620 supported 1 AMD RV620 (HD 3400) +X.Org Gallium 0.4 on AMD RV630 supported 2 AMD RV630 (HD 2600) +X.Org Gallium 0.4 on AMD RV635 supported 3 AMD RV635 (HD 3600) +X.Org Gallium 0.4 on AMD RV710 supported 1 AMD RV710 (HD 4300) +X.Org Gallium 0.4 on AMD RV730 supported 3 AMD RV730 (HD 4600) +X.Org Gallium 0.4 on AMD RV740 supported 3 AMD RV740 (HD 4700) +X.Org Gallium 0.4 on AMD RV770 supported 3 AMD RV770 (HD 4800) +X.Org R300 Project Gallium 0.4 on ATI R300 supported 1 ATI R300 (9700) +X.Org R300 Project Gallium 0.4 on ATI R580 supported 3 ATI R580 (X1900) +X.Org R300 Project Gallium 0.4 on ATI RC410 unsupported 0 ATI RC410 (Xpress 200) +X.Org R300 Project Gallium 0.4 on ATI RS482 unsupported 0 ATI RS48x (Xpress 200x) +X.Org R300 Project Gallium 0.4 on ATI RS600 unsupported 0 ATI RS600 (Xpress 3200) +X.Org R300 Project Gallium 0.4 on ATI RS690 supported 1 ATI R300 (9700) +X.Org R300 Project Gallium 0.4 on ATI RV350 supported 0 ATI RV350 (9600) +X.Org R300 Project Gallium 0.4 on ATI RV370 supported 0 ATI RV370 (X300) +X.Org R300 Project Gallium 0.4 on ATI RV410 supported 1 ATI RV410 (X700) +X.Org R300 Project Gallium 0.4 on ATI RV515 supported 1 ATI RV515 +X.Org R300 Project Gallium 0.4 on ATI RV530 supported 1 ATI RV530 +X.Org R300 Project Gallium 0.4 on ATI RV570 supported 3 ATI RV570 (X1900 GT/PRO) +X.Org R300 Project Gallium 0.4 on R420 supported 1 ATI R300 (9700) +X.Org R300 Project Gallium 0.4 on R580 supported 3 ATI R580 (X1900) +X.Org R300 Project Gallium 0.4 on RC410 unsupported 0 ATI RC410 (Xpress 200) +X.Org R300 Project Gallium 0.4 on RS480 unsupported 0 ATI RS48x (Xpress 200x) +X.Org R300 Project Gallium 0.4 on RS482 unsupported 0 ATI RS48x (Xpress 200x) +X.Org R300 Project Gallium 0.4 on RS600 unsupported 0 ATI RS600 (Xpress 3200) +X.Org R300 Project Gallium 0.4 on RS690 supported 1 ATI R300 (9700) +X.Org R300 Project Gallium 0.4 on RS740 supported 1 ATI R300 (9700) +X.Org R300 Project Gallium 0.4 on RV350 supported 0 ATI RV350 (9600) +X.Org R300 Project Gallium 0.4 on RV370 supported 0 ATI RV370 (X300) +X.Org R300 Project Gallium 0.4 on RV410 supported 1 ATI RV410 (X700) +X.Org R300 Project Gallium 0.4 on RV515 supported 1 ATI RV515 +X.Org R300 Project Gallium 0.4 on RV530 supported 1 ATI RV530 +XGI unsupported 0 XGI +nouveau Gallium 0.4 on NV34 UNRECOGNIZED +nouveau Gallium 0.4 on NV36 UNRECOGNIZED +nouveau Gallium 0.4 on NV46 UNRECOGNIZED +nouveau Gallium 0.4 on NV49 UNRECOGNIZED +nouveau Gallium 0.4 on NV4A UNRECOGNIZED +nouveau Gallium 0.4 on NV4B UNRECOGNIZED +nouveau Gallium 0.4 on NV4E UNRECOGNIZED +nouveau Gallium 0.4 on NV50 UNRECOGNIZED +nouveau Gallium 0.4 on NV84 UNRECOGNIZED +nouveau Gallium 0.4 on NV86 UNRECOGNIZED +nouveau Gallium 0.4 on NV92 UNRECOGNIZED +nouveau Gallium 0.4 on NV94 UNRECOGNIZED +nouveau Gallium 0.4 on NV96 UNRECOGNIZED +nouveau Gallium 0.4 on NV98 UNRECOGNIZED +nouveau Gallium 0.4 on NVA0 UNRECOGNIZED +nouveau Gallium 0.4 on NVA3 UNRECOGNIZED +nouveau Gallium 0.4 on NVA5 UNRECOGNIZED +nouveau Gallium 0.4 on NVA8 UNRECOGNIZED +nouveau Gallium 0.4 on NVAA UNRECOGNIZED +nouveau Gallium 0.4 on NVAC UNRECOGNIZED diff --git a/indra/newview/tests/gpus_seen.txt b/indra/newview/tests/gpus_seen.txt new file mode 100644 index 0000000000..c807f22b58 --- /dev/null +++ b/indra/newview/tests/gpus_seen.txt @@ -0,0 +1,1593 @@ +ATI +ATI 3D-Analyze +ATI ASUS A9xxx +ATI ASUS AH24xx +ATI ASUS AH26xx +ATI ASUS AH34xx +ATI ASUS AH36xx +ATI ASUS AH46xx +ATI ASUS AX3xx +ATI ASUS AX5xx +ATI ASUS AX8xx +ATI ASUS EAH38xx +ATI ASUS EAH43xx +ATI ASUS EAH45xx +ATI ASUS EAH48xx +ATI ASUS EAH57xx +ATI ASUS EAH58xx +ATI ASUS X1xxx +ATI All-in-Wonder 9xxx +ATI All-in-Wonder HD +ATI All-in-Wonder PCI-E +ATI All-in-Wonder X1800 +ATI All-in-Wonder X1900 +ATI All-in-Wonder X600 +ATI All-in-Wonder X800 +ATI Diamond X1xxx +ATI Display Adapter +ATI FireGL +ATI FireGL 5200 +ATI FireGL 5xxx +ATI FireMV +ATI Generic +ATI Hercules 9800 +ATI IGP 340M +ATI M52 +ATI M54 +ATI M56 +ATI M71 +ATI M72 +ATI M76 +ATI Mobility Radeon +ATI Mobility Radeon 7xxx +ATI Mobility Radeon 9600 +ATI Mobility Radeon 9700 +ATI Mobility Radeon 9800 +ATI Mobility Radeon HD 2300 +ATI Mobility Radeon HD 2400 +ATI Mobility Radeon HD 2600 +ATI Mobility Radeon HD 2700 +ATI Mobility Radeon HD 3400 +ATI Mobility Radeon HD 3600 +ATI Mobility Radeon HD 3800 +ATI Mobility Radeon HD 4200 +ATI Mobility Radeon HD 4300 +ATI Mobility Radeon HD 4500 +ATI Mobility Radeon HD 4600 +ATI Mobility Radeon HD 4800 +ATI Mobility Radeon HD 5400 +ATI Mobility Radeon HD 5600 +ATI Mobility Radeon X1xxx +ATI Mobility Radeon X2xxx +ATI Mobility Radeon X3xx +ATI Mobility Radeon X6xx +ATI Mobility Radeon X7xx +ATI Mobility Radeon Xxxx +ATI RV380 +ATI RV530 +ATI Radeon 2100 +ATI Radeon 3000 +ATI Radeon 3100 +ATI Radeon 7000 +ATI Radeon 7xxx +ATI Radeon 8xxx +ATI Radeon 9000 +ATI Radeon 9100 +ATI Radeon 9200 +ATI Radeon 9500 +ATI Radeon 9600 +ATI Radeon 9700 +ATI Radeon 9800 +ATI Radeon HD 2300 +ATI Radeon HD 2400 +ATI Radeon HD 2600 +ATI Radeon HD 2900 +ATI Radeon HD 3000 +ATI Radeon HD 3100 +ATI Radeon HD 3200 +ATI Radeon HD 3300 +ATI Radeon HD 3400 +ATI Radeon HD 3600 +ATI Radeon HD 3800 +ATI Radeon HD 4200 +ATI Radeon HD 4300 +ATI Radeon HD 4500 +ATI Radeon HD 4600 +ATI Radeon HD 4700 +ATI Radeon HD 4800 +ATI Radeon HD 5400 +ATI Radeon HD 5500 +ATI Radeon HD 5600 +ATI Radeon HD 5700 +ATI Radeon HD 5800 +ATI Radeon HD 5900 +ATI Radeon HD 6200 +ATI Radeon HD 6300 +ATI Radeon HD 6500 +ATI Radeon HD 6800 +ATI Radeon HD 6900 +ATI Radeon OpenGL +ATI Radeon RV250 +ATI Radeon RV600 +ATI Radeon RX9550 +ATI Radeon VE +ATI Radeon X1000 +ATI Radeon X1200 +ATI Radeon X1300 +ATI Radeon X13xx +ATI Radeon X1400 +ATI Radeon X1500 +ATI Radeon X1600 +ATI Radeon X16xx +ATI Radeon X1700 +ATI Radeon X1800 +ATI Radeon X1900 +ATI Radeon X19xx +ATI Radeon X1xxx +ATI Radeon X300 +ATI Radeon X500 +ATI Radeon X600 +ATI Radeon X700 +ATI Radeon X7xx +ATI Radeon X800 +ATI Radeon Xpress +ATI Rage 128 +ATI Technologies Inc. +ATI Technologies Inc. x86 +ATI Technologies Inc. x86/SSE2 +ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5730 +ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/SSE2 +ATI Technologies Inc. AMD 760G +ATI Technologies Inc. AMD 760G (Microsoft WDDM 1.1) +ATI Technologies Inc. AMD 780L +ATI Technologies Inc. AMD FirePro 2270 +ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100 +ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200 +ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250 +ATI Technologies Inc. AMD RADEON HD 6450 +ATI Technologies Inc. AMD Radeon HD 6200 series Graphics +ATI Technologies Inc. AMD Radeon HD 6250 Graphics +ATI Technologies Inc. AMD Radeon HD 6300 series Graphics +ATI Technologies Inc. AMD Radeon HD 6300M Series +ATI Technologies Inc. AMD Radeon HD 6310 Graphics +ATI Technologies Inc. AMD Radeon HD 6310M +ATI Technologies Inc. AMD Radeon HD 6330M +ATI Technologies Inc. AMD Radeon HD 6350 +ATI Technologies Inc. AMD Radeon HD 6370M +ATI Technologies Inc. AMD Radeon HD 6400M Series +ATI Technologies Inc. AMD Radeon HD 6450 +ATI Technologies Inc. AMD Radeon HD 6470M +ATI Technologies Inc. AMD Radeon HD 6490M +ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series +ATI Technologies Inc. AMD Radeon HD 6530M +ATI Technologies Inc. AMD Radeon HD 6550M +ATI Technologies Inc. AMD Radeon HD 6570 +ATI Technologies Inc. AMD Radeon HD 6570M +ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series +ATI Technologies Inc. AMD Radeon HD 6600M Series +ATI Technologies Inc. AMD Radeon HD 6650M +ATI Technologies Inc. AMD Radeon HD 6670 +ATI Technologies Inc. AMD Radeon HD 6700 Series +ATI Technologies Inc. AMD Radeon HD 6750 +ATI Technologies Inc. AMD Radeon HD 6750M +ATI Technologies Inc. AMD Radeon HD 6770 +ATI Technologies Inc. AMD Radeon HD 6800 Series +ATI Technologies Inc. AMD Radeon HD 6850M +ATI Technologies Inc. AMD Radeon HD 6870 +ATI Technologies Inc. AMD Radeon HD 6870M +ATI Technologies Inc. AMD Radeon HD 6900 Series +ATI Technologies Inc. AMD Radeon HD 6970M +ATI Technologies Inc. AMD Radeon HD 6990 +ATI Technologies Inc. AMD Radeon(TM) HD 6470M +ATI Technologies Inc. ASUS 5870 Eyefinity 6 +ATI Technologies Inc. ASUS AH2600 Series +ATI Technologies Inc. ASUS AH3450 Series +ATI Technologies Inc. ASUS AH3650 Series +ATI Technologies Inc. ASUS AH4650 Series +ATI Technologies Inc. ASUS ARES +ATI Technologies Inc. ASUS EAH2900 Series +ATI Technologies Inc. ASUS EAH3450 Series +ATI Technologies Inc. ASUS EAH3650 Series +ATI Technologies Inc. ASUS EAH4350 series +ATI Technologies Inc. ASUS EAH4550 series +ATI Technologies Inc. ASUS EAH4650 series +ATI Technologies Inc. ASUS EAH4670 series +ATI Technologies Inc. ASUS EAH4750 Series +ATI Technologies Inc. ASUS EAH4770 Series +ATI Technologies Inc. ASUS EAH4770 series +ATI Technologies Inc. ASUS EAH4850 series +ATI Technologies Inc. ASUS EAH5450 Series +ATI Technologies Inc. ASUS EAH5550 Series +ATI Technologies Inc. ASUS EAH5570 series +ATI Technologies Inc. ASUS EAH5670 Series +ATI Technologies Inc. ASUS EAH5750 Series +ATI Technologies Inc. ASUS EAH5770 Series +ATI Technologies Inc. ASUS EAH5830 Series +ATI Technologies Inc. ASUS EAH5850 Series +ATI Technologies Inc. ASUS EAH5870 Series +ATI Technologies Inc. ASUS EAH5970 Series +ATI Technologies Inc. ASUS EAH6850 Series +ATI Technologies Inc. ASUS EAH6870 Series +ATI Technologies Inc. ASUS EAH6950 Series +ATI Technologies Inc. ASUS EAH6970 Series +ATI Technologies Inc. ASUS EAHG4670 series +ATI Technologies Inc. ASUS Extreme AX600 Series +ATI Technologies Inc. ASUS Extreme AX600XT-TD +ATI Technologies Inc. ASUS X1300 Series x86/SSE2 +ATI Technologies Inc. ASUS X1550 Series +ATI Technologies Inc. ASUS X1950 Series x86/SSE2 +ATI Technologies Inc. ASUS X800 Series +ATI Technologies Inc. ASUS X850 Series +ATI Technologies Inc. ATI All-in-Wonder HD +ATI Technologies Inc. ATI FirePro 2260 +ATI Technologies Inc. ATI FirePro 2450 +ATI Technologies Inc. ATI FirePro M5800 +ATI Technologies Inc. ATI FirePro M7740 +ATI Technologies Inc. ATI FirePro M7820 +ATI Technologies Inc. ATI FirePro V3700 (FireGL) +ATI Technologies Inc. ATI FirePro V3800 +ATI Technologies Inc. ATI FirePro V4800 +ATI Technologies Inc. ATI FirePro V4800 (FireGL) +ATI Technologies Inc. ATI FirePro V5800 +ATI Technologies Inc. ATI FirePro V7800 +ATI Technologies Inc. ATI MOBILITY RADEON 9XXX x86/SSE2 +ATI Technologies Inc. ATI MOBILITY RADEON HD 3450 +ATI Technologies Inc. ATI MOBILITY RADEON X1600 +ATI Technologies Inc. ATI MOBILITY RADEON X2300 +ATI Technologies Inc. ATI MOBILITY RADEON X2300 HD x86/SSE2 +ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/SSE2 +ATI Technologies Inc. ATI MOBILITY RADEON X300 +ATI Technologies Inc. ATI MOBILITY RADEON X600 +ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200 +ATI Technologies Inc. ATI Mobility FireGL V5700 +ATI Technologies Inc. ATI Mobility Radeon 4100 +ATI Technologies Inc. ATI Mobility Radeon Graphics +ATI Technologies Inc. ATI Mobility Radeon HD 2300 +ATI Technologies Inc. ATI Mobility Radeon HD 2400 +ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT +ATI Technologies Inc. ATI Mobility Radeon HD 2600 +ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT +ATI Technologies Inc. ATI Mobility Radeon HD 2700 +ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series +ATI Technologies Inc. ATI Mobility Radeon HD 3430 +ATI Technologies Inc. ATI Mobility Radeon HD 3450 +ATI Technologies Inc. ATI Mobility Radeon HD 3470 +ATI Technologies Inc. ATI Mobility Radeon HD 3470 Hybrid X2 +ATI Technologies Inc. ATI Mobility Radeon HD 3650 +ATI Technologies Inc. ATI Mobility Radeon HD 4200 +ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4225 +ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4250 +ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics +ATI Technologies Inc. ATI Mobility Radeon HD 4270 +ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4330 +ATI Technologies Inc. ATI Mobility Radeon HD 4330 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4350 +ATI Technologies Inc. ATI Mobility Radeon HD 4350 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4530 +ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4550 +ATI Technologies Inc. ATI Mobility Radeon HD 4570 +ATI Technologies Inc. ATI Mobility Radeon HD 4600 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4650 +ATI Technologies Inc. ATI Mobility Radeon HD 4650 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4670 +ATI Technologies Inc. ATI Mobility Radeon HD 4830 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4850 +ATI Technologies Inc. ATI Mobility Radeon HD 4870 +ATI Technologies Inc. ATI Mobility Radeon HD 5000 +ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series +ATI Technologies Inc. ATI Mobility Radeon HD 5145 +ATI Technologies Inc. ATI Mobility Radeon HD 5165 +ATI Technologies Inc. ATI Mobility Radeon HD 530v +ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series +ATI Technologies Inc. ATI Mobility Radeon HD 540v +ATI Technologies Inc. ATI Mobility Radeon HD 5430 +ATI Technologies Inc. ATI Mobility Radeon HD 5450 +ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series +ATI Technologies Inc. ATI Mobility Radeon HD 545v +ATI Technologies Inc. ATI Mobility Radeon HD 5470 +ATI Technologies Inc. ATI Mobility Radeon HD 550v +ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series +ATI Technologies Inc. ATI Mobility Radeon HD 560v +ATI Technologies Inc. ATI Mobility Radeon HD 5650 +ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series +ATI Technologies Inc. ATI Mobility Radeon HD 5730 +ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series +ATI Technologies Inc. ATI Mobility Radeon HD 5850 +ATI Technologies Inc. ATI Mobility Radeon HD 5870 +ATI Technologies Inc. ATI Mobility Radeon HD 6300 series +ATI Technologies Inc. ATI Mobility Radeon HD 6370 +ATI Technologies Inc. ATI Mobility Radeon HD 6470M +ATI Technologies Inc. ATI Mobility Radeon HD 6550 +ATI Technologies Inc. ATI Mobility Radeon HD 6570 +ATI Technologies Inc. ATI Mobility Radeon X1300 +ATI Technologies Inc. ATI Mobility Radeon X1300 x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2 +ATI Technologies Inc. ATI Mobility Radeon X1350 +ATI Technologies Inc. ATI Mobility Radeon X1350 x86/SSE2 +ATI Technologies Inc. ATI Mobility Radeon X1400 +ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2 +ATI Technologies Inc. ATI Mobility Radeon X1600 +ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2 +ATI Technologies Inc. ATI Mobility Radeon X1700 x86/SSE2 +ATI Technologies Inc. ATI Mobility Radeon X2300 +ATI Technologies Inc. ATI Mobility Radeon X2300 (Omega 3.8.442) +ATI Technologies Inc. ATI Mobility Radeon X2300 x86 +ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2 +ATI Technologies Inc. ATI Mobility Radeon X2500 +ATI Technologies Inc. ATI Mobility Radeon X2500 x86/SSE2 +ATI Technologies Inc. ATI Mobility Radeon. HD 530v +ATI Technologies Inc. ATI Mobility Radeon. HD 5470 +ATI Technologies Inc. ATI RADEON HD 3200 T25XX by CAMILO +ATI Technologies Inc. ATI RADEON XPRESS 1100 +ATI Technologies Inc. ATI RADEON XPRESS 200 Series +ATI Technologies Inc. ATI RADEON XPRESS 200 Series x86/SSE2 +ATI Technologies Inc. ATI RADEON XPRESS 200M SERIES +ATI Technologies Inc. ATI Radeon +ATI Technologies Inc. ATI Radeon 2100 +ATI Technologies Inc. ATI Radeon 2100 (Microsoft - WDDM) +ATI Technologies Inc. ATI Radeon 2100 Graphics +ATI Technologies Inc. ATI Radeon 3000 +ATI Technologies Inc. ATI Radeon 3000 Graphics +ATI Technologies Inc. ATI Radeon 3100 Graphics +ATI Technologies Inc. ATI Radeon 5xxx series +ATI Technologies Inc. ATI Radeon 9550 / X1050 Series +ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/MMX/3DNow!/SSE +ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/SSE2 +ATI Technologies Inc. ATI Radeon 9550 / X1050 Series(Microsoft - WDDM) +ATI Technologies Inc. ATI Radeon 9600 / X1050 Series +ATI Technologies Inc. ATI Radeon 9600/9550/X1050 Series +ATI Technologies Inc. ATI Radeon BA Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon BB Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon Cedar PRO Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon Cypress PRO Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon Graphics Processor +ATI Technologies Inc. ATI Radeon HD 2200 Graphics +ATI Technologies Inc. ATI Radeon HD 2350 +ATI Technologies Inc. ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 2400 PRO +ATI Technologies Inc. ATI Radeon HD 2400 PRO AGP +ATI Technologies Inc. ATI Radeon HD 2400 Pro +ATI Technologies Inc. ATI Radeon HD 2400 Series +ATI Technologies Inc. ATI Radeon HD 2400 XT +ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 2600 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 2600 PRO +ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 2600 Pro +ATI Technologies Inc. ATI Radeon HD 2600 Series +ATI Technologies Inc. ATI Radeon HD 2600 XT +ATI Technologies Inc. ATI Radeon HD 2900 GT +ATI Technologies Inc. ATI Radeon HD 2900 XT +ATI Technologies Inc. ATI Radeon HD 3200 Graphics +ATI Technologies Inc. ATI Radeon HD 3300 Graphics +ATI Technologies Inc. ATI Radeon HD 3400 Series +ATI Technologies Inc. ATI Radeon HD 3450 +ATI Technologies Inc. ATI Radeon HD 3450 - Dell Optiplex +ATI Technologies Inc. ATI Radeon HD 3470 +ATI Technologies Inc. ATI Radeon HD 3470 - Dell Optiplex +ATI Technologies Inc. ATI Radeon HD 3550 +ATI Technologies Inc. ATI Radeon HD 3600 Series +ATI Technologies Inc. ATI Radeon HD 3650 +ATI Technologies Inc. ATI Radeon HD 3650 AGP +ATI Technologies Inc. ATI Radeon HD 3730 +ATI Technologies Inc. ATI Radeon HD 3800 Series +ATI Technologies Inc. ATI Radeon HD 3850 +ATI Technologies Inc. ATI Radeon HD 3850 AGP +ATI Technologies Inc. ATI Radeon HD 3870 +ATI Technologies Inc. ATI Radeon HD 3870 X2 +ATI Technologies Inc. ATI Radeon HD 4200 +ATI Technologies Inc. ATI Radeon HD 4250 +ATI Technologies Inc. ATI Radeon HD 4250 Graphics +ATI Technologies Inc. ATI Radeon HD 4270 +ATI Technologies Inc. ATI Radeon HD 4290 +ATI Technologies Inc. ATI Radeon HD 4300 Series +ATI Technologies Inc. ATI Radeon HD 4300/4500 Series +ATI Technologies Inc. ATI Radeon HD 4350 +ATI Technologies Inc. ATI Radeon HD 4350 (Microsoft WDDM 1.1) +ATI Technologies Inc. ATI Radeon HD 4450 +ATI Technologies Inc. ATI Radeon HD 4500 Series +ATI Technologies Inc. ATI Radeon HD 4550 +ATI Technologies Inc. ATI Radeon HD 4600 Series +ATI Technologies Inc. ATI Radeon HD 4650 +ATI Technologies Inc. ATI Radeon HD 4670 +ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 4700 Series +ATI Technologies Inc. ATI Radeon HD 4720 +ATI Technologies Inc. ATI Radeon HD 4730 +ATI Technologies Inc. ATI Radeon HD 4730 Series +ATI Technologies Inc. ATI Radeon HD 4750 +ATI Technologies Inc. ATI Radeon HD 4770 +ATI Technologies Inc. ATI Radeon HD 4800 Series +ATI Technologies Inc. ATI Radeon HD 4850 +ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 4850 Series +ATI Technologies Inc. ATI Radeon HD 4870 +ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 4870 X2 +ATI Technologies Inc. ATI Radeon HD 5400 Series +ATI Technologies Inc. ATI Radeon HD 5450 +ATI Technologies Inc. ATI Radeon HD 5500 Series +ATI Technologies Inc. ATI Radeon HD 5570 +ATI Technologies Inc. ATI Radeon HD 5600 Series +ATI Technologies Inc. ATI Radeon HD 5630 +ATI Technologies Inc. ATI Radeon HD 5670 +ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 5700 Series +ATI Technologies Inc. ATI Radeon HD 5750 +ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 5770 +ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 5800 Series +ATI Technologies Inc. ATI Radeon HD 5850 +ATI Technologies Inc. ATI Radeon HD 5870 +ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 5900 Series +ATI Technologies Inc. ATI Radeon HD 5970 +ATI Technologies Inc. ATI Radeon HD 6230 +ATI Technologies Inc. ATI Radeon HD 6250 +ATI Technologies Inc. ATI Radeon HD 6350 +ATI Technologies Inc. ATI Radeon HD 6390 +ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 6510 +ATI Technologies Inc. ATI Radeon HD 6570M +ATI Technologies Inc. ATI Radeon HD 6750 +ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 6770 +ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 6800 Series +ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine +ATI Technologies Inc. ATI Radeon HD3750 +ATI Technologies Inc. ATI Radeon HD4300/HD4500 series +ATI Technologies Inc. ATI Radeon HD4670 +ATI Technologies Inc. ATI Radeon Juniper LE Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon RV710 Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon RV730 Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon RV770 Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon Redwood PRO Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon Redwood XT Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon Whistler PRO/LP Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon X1050 +ATI Technologies Inc. ATI Radeon X1050 Series +ATI Technologies Inc. ATI Radeon X1200 +ATI Technologies Inc. ATI Radeon X1200 Series +ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Radeon X1250 +ATI Technologies Inc. ATI Radeon X1250 x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Radeon X1270 +ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Radeon X1300/X1550 Series +ATI Technologies Inc. ATI Radeon X1550 Series +ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine +ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine +ATI Technologies Inc. ATI Radeon X1950 GT +ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series +ATI Technologies Inc. ATI Radeon Xpress 1100 +ATI Technologies Inc. ATI Radeon Xpress 1150 +ATI Technologies Inc. ATI Radeon Xpress 1150 x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Radeon Xpress 1200 +ATI Technologies Inc. ATI Radeon Xpress 1200 Series +ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Radeon Xpress 1200 x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Radeon Xpress 1250 +ATI Technologies Inc. ATI Radeon Xpress 1250 x86/SSE2 +ATI Technologies Inc. ATI Radeon Xpress Series +ATI Technologies Inc. ATI Yamaha HD 9000 +ATI Technologies Inc. ATi RS880M +ATI Technologies Inc. Carte graphique VGA standard +ATI Technologies Inc. Diamond Radeon X1550 Series +ATI Technologies Inc. EG JUNIPER +ATI Technologies Inc. EG PARK +ATI Technologies Inc. FireGL V3100 Pentium 4 (SSE2) +ATI Technologies Inc. FireMV 2400 PCI DDR x86 +ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2 +ATI Technologies Inc. GeCube Radeon X1550 +ATI Technologies Inc. Geforce 9500 GT +ATI Technologies Inc. Geforce 9500GT +ATI Technologies Inc. Geforce 9800 GT +ATI Technologies Inc. HD3730 +ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series +ATI Technologies Inc. HIGHTECH EXCALIBUR X700 PRO +ATI Technologies Inc. M21 x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. M76M +ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON 9700 x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON X700 SE x86 +ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2 +ATI Technologies Inc. MSI RX9550SE +ATI Technologies Inc. Mobility Radeon X2300 HD +ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2 +ATI Technologies Inc. RADEON 7000 DDR x86/MMX/3DNow!/SSE +ATI Technologies Inc. RADEON 7000 DDR x86/SSE2 +ATI Technologies Inc. RADEON 7500 DDR x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON 7500 DDR x86/SSE2 +ATI Technologies Inc. RADEON 9100 IGP DDR x86/SSE2 +ATI Technologies Inc. RADEON 9200 DDR x86/MMX/3DNow!/SSE +ATI Technologies Inc. RADEON 9200 DDR x86/SSE2 +ATI Technologies Inc. RADEON 9200 PRO DDR x86/MMX/3DNow!/SSE +ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE +ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE +ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2 +ATI Technologies Inc. RADEON 9200SE DDR x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON 9200SE DDR x86/SSE2 +ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE +ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/SSE2 +ATI Technologies Inc. RADEON 9500 +ATI Technologies Inc. RADEON 9550 x86/SSE2 +ATI Technologies Inc. RADEON 9600 SERIES +ATI Technologies Inc. RADEON 9600 SERIES x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON 9600 TX x86/SSE2 +ATI Technologies Inc. RADEON 9600 x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON 9600 x86/SSE2 +ATI Technologies Inc. RADEON 9700 PRO x86/MMX/3DNow!/SSE +ATI Technologies Inc. RADEON 9800 PRO +ATI Technologies Inc. RADEON 9800 x86/SSE2 +ATI Technologies Inc. RADEON IGP 340M DDR x86/SSE2 +ATI Technologies Inc. RADEON X300 Series x86/SSE2 +ATI Technologies Inc. RADEON X300 x86/SSE2 +ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2 +ATI Technologies Inc. RADEON X550 x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON X550 x86/SSE2 +ATI Technologies Inc. RADEON X600 Series +ATI Technologies Inc. RADEON X600 x86/SSE2 +ATI Technologies Inc. RADEON X700 PRO x86/SSE2 +ATI Technologies Inc. RADEON X800 SE x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON X800GT +ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2 +ATI Technologies Inc. RADEON XPRESS 200 Series x86/SSE2 +ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2 +ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON XPRESS 200M Series x86/SSE2 +ATI Technologies Inc. RADEON XPRESS Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON XPRESS Series x86/SSE2 +ATI Technologies Inc. RS740 +ATI Technologies Inc. RS780C +ATI Technologies Inc. RS780M +ATI Technologies Inc. RS880 +ATI Technologies Inc. RV410 Pro x86/SSE2 +ATI Technologies Inc. RV790 +ATI Technologies Inc. Radeon (TM) HD 6470M +ATI Technologies Inc. Radeon (TM) HD 6490M +ATI Technologies Inc. Radeon (TM) HD 6770M +ATI Technologies Inc. Radeon 7000 DDR x86/SSE2 +ATI Technologies Inc. Radeon 7000 SDR x86/SSE2 +ATI Technologies Inc. Radeon 7500 DDR x86/SSE2 +ATI Technologies Inc. Radeon 9000 DDR x86/SSE2 +ATI Technologies Inc. Radeon DDR x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. Radeon DDR x86/SSE +ATI Technologies Inc. Radeon DDR x86/SSE2 +ATI Technologies Inc. Radeon HD 6310 +ATI Technologies Inc. Radeon HD 6800 Series +ATI Technologies Inc. Radeon SDR x86/SSE2 +ATI Technologies Inc. Radeon X1300 Series +ATI Technologies Inc. Radeon X1300 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. Radeon X1300 Series x86/SSE2 +ATI Technologies Inc. Radeon X1300/X1550 Series +ATI Technologies Inc. Radeon X1300/X1550 Series x86/SSE2 +ATI Technologies Inc. Radeon X1550 64-bit (Microsoft - WDDM) +ATI Technologies Inc. Radeon X1550 Series +ATI Technologies Inc. Radeon X1550 Series x86/SSE2 +ATI Technologies Inc. Radeon X1600 +ATI Technologies Inc. Radeon X1600 Pro / X1300XT x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. Radeon X1600 Series x86/SSE2 +ATI Technologies Inc. Radeon X1600/X1650 Series +ATI Technologies Inc. Radeon X1650 Series +ATI Technologies Inc. Radeon X1650 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. Radeon X1650 Series x86/SSE2 +ATI Technologies Inc. Radeon X1900 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. Radeon X1950 Pro +ATI Technologies Inc. Radeon X1950 Pro x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. Radeon X1950 Series +ATI Technologies Inc. Radeon X1950 Series (Microsoft - WDDM) +ATI Technologies Inc. Radeon X300/X550/X1050 Series +ATI Technologies Inc. Radeon X550/X700 Series +ATI Technologies Inc. Radeon X550XTX x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. SAPPHIRE RADEON X300SE +ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/SSE2 +ATI Technologies Inc. SAPPHIRE Radeon X1550 Series +ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. Sapphire Radeon HD 3730 +ATI Technologies Inc. Sapphire Radeon HD 3750 +ATI Technologies Inc. Standard VGA Graphics Adapter +ATI Technologies Inc. Tul, RADEON X600 PRO +ATI Technologies Inc. Tul, RADEON X600 PRO x86/SSE2 +ATI Technologies Inc. Tul, RADEON X700 PRO +ATI Technologies Inc. Tul, RADEON X700 PRO x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. VisionTek Radeon 4350 +ATI Technologies Inc. VisionTek Radeon X1550 Series +ATI Technologies Inc. WRESTLER 9802 +ATI Technologies Inc. WRESTLER 9803 +ATI Technologies Inc. XFX Radeon HD 4570 +ATI Technologies Inc. Yamaha ATI HD 9000da/s +ATI Technologies Inc. Yamaha ATI HD 9000da/s 2048 +Advanced Micro Devices, Inc. Mesa DRI R600 (RS780 9612) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 +Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9710) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 +Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9712) 20090101 TCL +Advanced Micro Devices, Inc. Mesa DRI R600 (RV610 94C1) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 +Advanced Micro Devices, Inc. Mesa DRI R600 (RV610 94C9) 20090101 x86/MMX/SSE2 TCL DRI2 +Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C4) 20090101 x86/MMX/SSE2 TCL DRI2 +Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 +Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX/SSE2 TCL DRI2 +Advanced Micro Devices, Inc. Mesa DRI R600 (RV635 9596) 20090101 x86/MMX+/3DNow!+/SSE TCL DRI2 +Advanced Micro Devices, Inc. Mesa DRI R600 (RV670 9505) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 +Advanced Micro Devices, Inc. Mesa DRI R600 (RV710 9552) 20090101 x86/MMX/SSE2 TCL DRI2 +Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 +Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX/SSE2 TCL DRI2 +Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9498) 20090101 TCL DRI2 +Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9440) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 +Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9442) 20090101 x86/MMX/SSE2 TCL DRI2 +Alex Mohr GL Hijacker! +Apple Software Renderer +DRI R300 Project Mesa DRI R300 (RS400 5954) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2 +DRI R300 Project Mesa DRI R300 (RS400 5975) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2 +DRI R300 Project Mesa DRI R300 (RS400 5A62) 20090101 x86/MMX/SSE2 NO-TCL DRI2 +DRI R300 Project Mesa DRI R300 (RS600 7941) 20090101 x86/MMX/SSE2 NO-TCL +DRI R300 Project Mesa DRI R300 (RS690 791F) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2 +DRI R300 Project Mesa DRI R300 (RV350 4151) 20090101 AGP 4x x86/MMX+/3DNow!+/SSE TCL +DRI R300 Project Mesa DRI R300 (RV350 4153) 20090101 AGP 8x x86/MMX+/3DNow!+/SSE TCL +DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 +DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX/SSE2 TCL DRI2 +DRI R300 Project Mesa DRI R300 (RV380 5B60) 20090101 x86/MMX/SSE2 TCL DRI2 +DRI R300 Project Mesa DRI R300 (RV380 5B62) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 +DRI R300 Project Mesa DRI R300 (RV515 7145) 20090101 x86/MMX/SSE2 TCL DRI2 +DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 +DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX/SSE2 TCL DRI2 +DRI R300 Project Mesa DRI R300 (RV515 7149) 20090101 x86/MMX/SSE2 TCL DRI2 +DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL +DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL DRI2 +DRI R300 Project Mesa DRI R300 (RV530 71C4) 20090101 x86/MMX/SSE2 TCL DRI2 +GPU_CLASS_UNKNOWN +Humper Chromium +Intel +Intel HD Graphics Family +Intel 3D-Analyze v2.2 - http://www.tommti-systems.com +Intel 3D-Analyze v2.3 - http://www.tommti-systems.com +Intel 4 Series Internal Chipset +Intel 830M +Intel 845G +Intel 855GM +Intel 865G +Intel 915G +Intel 915GM +Intel 945G +Intel 945GM +Intel 950 +Intel 965 +Intel B43 Express Chipset +Intel Bear Lake +Intel Broadwater +Intel Brookdale +Intel Cantiga +Intel Eaglelake +Intel Familia Mobile 45 Express Chipset (Microsoft Corporation - WDDM 1.1) +Intel G33 +Intel G41 +Intel G41 Express Chipset +Intel G45 +Intel G45/G43 Express Chipset +Intel Graphics Media Accelerator HD +Intel HD Graphics +Intel HD Graphics 100 +Intel HD Graphics 200 +Intel HD Graphics 200 BR-1101-00SH +Intel HD Graphics 200 BR-1101-00SJ +Intel HD Graphics 200 BR-1101-00SK +Intel HD Graphics 200 BR-1101-01M5 +Intel HD Graphics 200 BR-1101-01M6 +Intel HD Graphics BR-1004-01Y1 +Intel HD Graphics BR-1006-0364 +Intel HD Graphics BR-1006-0365 +Intel HD Graphics BR-1006-0366 +Intel HD Graphics BR-1007-02G4 +Intel HD Graphics BR-1101-04SY +Intel HD Graphics BR-1101-04SZ +Intel HD Graphics BR-1101-04T0 +Intel HD Graphics BR-1101-04T9 +Intel HD Graphics Family +Intel HD Graphics Family BR-1012-00Y8 +Intel HD Graphics Family BR-1012-00YF +Intel HD Graphics Family BR-1012-00ZD +Intel HD Graphics Family BR-1102-00ML +Intel Inc. Intel GMA 900 OpenGL Engine +Intel Inc. Intel GMA 950 OpenGL Engine +Intel Inc. Intel GMA X3100 OpenGL Engine +Intel Inc. Intel HD Graphics 3000 OpenGL Engine +Intel Inc. Intel HD Graphics OpenGL Engine +Intel Inc. Intel HD xxxx OpenGL Engine +Intel Intel 845G +Intel Intel 855GM +Intel Intel 865G +Intel Intel 915G +Intel Intel 915GM +Intel Intel 945G +Intel Intel 945GM +Intel Intel 965/963 Graphics Media Accelerator +Intel Intel Bear Lake B +Intel Intel Broadwater G +Intel Intel Brookdale-G +Intel Intel Calistoga +Intel Intel Cantiga +Intel Intel Eaglelake +Intel Intel Grantsdale-G +Intel Intel HD Graphics 3000 +Intel Intel Lakeport +Intel Intel Montara-GM +Intel Intel Pineview Platform +Intel Intel Springdale-G +Intel Mobile - famiglia Express Chipset 45 (Microsoft Corporation - WDDM 1.1) +Intel Mobile 4 Series +Intel Mobile 4 Series Express Chipset Family +Intel Mobile 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1) +Intel Mobile HD Graphics +Intel Mobile SandyBridge HD Graphics +Intel Montara +Intel Pineview +Intel Q45/Q43 Express Chipset +Intel Royal BNA Driver +Intel SandyBridge HD Graphics +Intel SandyBridge HD Graphics BR-1006-00V8 +Intel Springdale +Intel X3100 +Intergraph wcgdrv 06.05.06.18 +Intergraph wcgdrv 06.06.00.35 +LegendgrafiX Mobile 945 Express C/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://LegendgrafiX.tk +LegendgrafiX NVIDIA GeForce GT 430/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://LegendgrafiX.tk +Linden Lab Headless +Matrox +Mesa +Mesa Project Software Rasterizer +NVIDIA /PCI/SSE2 +NVIDIA /PCI/SSE2/3DNOW! +NVIDIA 205 +NVIDIA 210 +NVIDIA 310 +NVIDIA 310M +NVIDIA 315 +NVIDIA 315M +NVIDIA 320M +NVIDIA C51 +NVIDIA D10M2-20/PCI/SSE2 +NVIDIA D10P1-25/PCI/SSE2 +NVIDIA D10P1-30/PCI/SSE2 +NVIDIA D10P2-50/PCI/SSE2 +NVIDIA D11M2-30/PCI/SSE2 +NVIDIA D12-P1-35/PCI/SSE2 +NVIDIA D12U-15/PCI/SSE2 +NVIDIA D13M1-40/PCI/SSE2 +NVIDIA D13P1-40/PCI/SSE2 +NVIDIA D13U-10/PCI/SSE2 +NVIDIA D13U/PCI/SSE2 +NVIDIA D9M +NVIDIA D9M-20/PCI/SSE2 +NVIDIA Entry Graphics/PCI/SSE2 +NVIDIA Entry Graphics/PCI/SSE2/3DNOW! +NVIDIA G 102M +NVIDIA G 103M +NVIDIA G 105M +NVIDIA G 110M +NVIDIA G100 +NVIDIA G102M +NVIDIA G103M +NVIDIA G105M +NVIDIA G210 +NVIDIA G210M +NVIDIA G70/PCI/SSE2 +NVIDIA G72 +NVIDIA G73 +NVIDIA G84 +NVIDIA G86 +NVIDIA G92 +NVIDIA G92-200/PCI/SSE2 +NVIDIA G94 +NVIDIA G96/PCI/SSE2 +NVIDIA G98/PCI/SSE2 +NVIDIA GT 120 +NVIDIA GT 130 +NVIDIA GT 130M +NVIDIA GT 140 +NVIDIA GT 150 +NVIDIA GT 160M +NVIDIA GT 220 +NVIDIA GT 220/PCI/SSE2 +NVIDIA GT 220/PCI/SSE2/3DNOW! +NVIDIA GT 230 +NVIDIA GT 230M +NVIDIA GT 240 +NVIDIA GT 240M +NVIDIA GT 250M +NVIDIA GT 260M +NVIDIA GT 320 +NVIDIA GT 320M +NVIDIA GT 330 +NVIDIA GT 330M +NVIDIA GT 340 +NVIDIA GT 420 +NVIDIA GT 430 +NVIDIA GT 440 +NVIDIA GT 450 +NVIDIA GT 520 +NVIDIA GT 540 +NVIDIA GT 540M +NVIDIA GT-120 +NVIDIA GT200/PCI/SSE2 +NVIDIA GTS 150 +NVIDIA GTS 240 +NVIDIA GTS 250 +NVIDIA GTS 350M +NVIDIA GTS 360 +NVIDIA GTS 360M +NVIDIA GTS 450 +NVIDIA GTX 260 +NVIDIA GTX 260M +NVIDIA GTX 270 +NVIDIA GTX 280 +NVIDIA GTX 285 +NVIDIA GTX 290 +NVIDIA GTX 460 +NVIDIA GTX 460M +NVIDIA GTX 465 +NVIDIA GTX 470 +NVIDIA GTX 470M +NVIDIA GTX 480 +NVIDIA GTX 480M +NVIDIA GTX 550 Ti +NVIDIA GTX 560 +NVIDIA GTX 560 Ti +NVIDIA GTX 570 +NVIDIA GTX 580 +NVIDIA GTX 590 +NVIDIA GeForce +NVIDIA GeForce 2 +NVIDIA GeForce 205/PCI/SSE2 +NVIDIA GeForce 210 +NVIDIA GeForce 210/PCI/SSE2 +NVIDIA GeForce 210/PCI/SSE2/3DNOW! +NVIDIA GeForce 3 +NVIDIA GeForce 305M/PCI/SSE2 +NVIDIA GeForce 310/PCI/SSE2 +NVIDIA GeForce 310/PCI/SSE2/3DNOW! +NVIDIA GeForce 310M/PCI/SSE2 +NVIDIA GeForce 315/PCI/SSE2 +NVIDIA GeForce 315/PCI/SSE2/3DNOW! +NVIDIA GeForce 315M/PCI/SSE2 +NVIDIA GeForce 320M/PCI/SSE2 +NVIDIA GeForce 4 Go +NVIDIA GeForce 4 MX +NVIDIA GeForce 4 Ti +NVIDIA GeForce 405/PCI/SSE2 +NVIDIA GeForce 6100 +NVIDIA GeForce 6100 nForce 400/PCI/SSE2/3DNOW! +NVIDIA GeForce 6100 nForce 405/PCI/SSE2 +NVIDIA GeForce 6100 nForce 405/PCI/SSE2/3DNOW! +NVIDIA GeForce 6100 nForce 420/PCI/SSE2/3DNOW! +NVIDIA GeForce 6100 nForce 430/PCI/SSE2/3DNOW! +NVIDIA GeForce 6100/PCI/SSE2/3DNOW! +NVIDIA GeForce 6150 LE/PCI/SSE2/3DNOW! +NVIDIA GeForce 6150/PCI/SSE2 +NVIDIA GeForce 6150/PCI/SSE2/3DNOW! +NVIDIA GeForce 6150SE nForce 430/PCI/SSE2 +NVIDIA GeForce 6150SE nForce 430/PCI/SSE2/3DNOW! +NVIDIA GeForce 6150SE/PCI/SSE2/3DNOW! +NVIDIA GeForce 6200 +NVIDIA GeForce 6200 A-LE/AGP/SSE/3DNOW! +NVIDIA GeForce 6200 A-LE/AGP/SSE2 +NVIDIA GeForce 6200 A-LE/AGP/SSE2/3DNOW! +NVIDIA GeForce 6200 LE/PCI/SSE2 +NVIDIA GeForce 6200 LE/PCI/SSE2/3DNOW! +NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2 +NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2/3DNOW! +NVIDIA GeForce 6200/AGP/SSE/3DNOW! +NVIDIA GeForce 6200/AGP/SSE2 +NVIDIA GeForce 6200/AGP/SSE2/3DNOW! +NVIDIA GeForce 6200/PCI/SSE/3DNOW! +NVIDIA GeForce 6200/PCI/SSE2 +NVIDIA GeForce 6200/PCI/SSE2/3DNOW! +NVIDIA GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW! +NVIDIA GeForce 6500 +NVIDIA GeForce 6500/PCI/SSE2 +NVIDIA GeForce 6600 +NVIDIA GeForce 6600 GT/AGP/SSE/3DNOW! +NVIDIA GeForce 6600 GT/AGP/SSE2 +NVIDIA GeForce 6600 GT/PCI/SSE/3DNOW! +NVIDIA GeForce 6600 GT/PCI/SSE2 +NVIDIA GeForce 6600 GT/PCI/SSE2/3DNOW! +NVIDIA GeForce 6600 LE/PCI/SSE2 +NVIDIA GeForce 6600/AGP/SSE/3DNOW! +NVIDIA GeForce 6600/AGP/SSE2 +NVIDIA GeForce 6600/AGP/SSE2/3DNOW! +NVIDIA GeForce 6600/PCI/SSE2 +NVIDIA GeForce 6600/PCI/SSE2/3DNOW! +NVIDIA GeForce 6700 +NVIDIA GeForce 6800 +NVIDIA GeForce 6800 GS/PCI/SSE2/3DNOW! +NVIDIA GeForce 6800 GT/AGP/SSE2 +NVIDIA GeForce 6800 GT/PCI/SSE2 +NVIDIA GeForce 6800 XT/AGP/SSE2 +NVIDIA GeForce 6800 XT/PCI/SSE2 +NVIDIA GeForce 6800/PCI/SSE2 +NVIDIA GeForce 6800/PCI/SSE2/3DNOW! +NVIDIA GeForce 7000 +NVIDIA GeForce 7000M +NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2 +NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! +NVIDIA GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW! +NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2 +NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW! +NVIDIA GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2 +NVIDIA GeForce 7050 / NVIDIA nForce 620i/PCI/SSE2 +NVIDIA GeForce 7050 / nForce 610i/PCI/SSE2 +NVIDIA GeForce 7050 / nForce 620i/PCI/SSE2 +NVIDIA GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW! +NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2 +NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2/3DNOW! +NVIDIA GeForce 7050 SE / NVIDIA nForce 630a/PCI/SSE2/3DNOW! +NVIDIA GeForce 7100 +NVIDIA GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2 +NVIDIA GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2 +NVIDIA GeForce 7100 / nForce 630i/PCI/SSE2 +NVIDIA GeForce 7100 GS/PCI/SSE2 +NVIDIA GeForce 7100 GS/PCI/SSE2/3DNOW! +NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2 +NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW! +NVIDIA GeForce 7300 +NVIDIA GeForce 7300 GS/PCI/SSE2 +NVIDIA GeForce 7300 GS/PCI/SSE2/3DNOW! +NVIDIA GeForce 7300 GT/AGP/SSE2 +NVIDIA GeForce 7300 GT/AGP/SSE2/3DNOW! +NVIDIA GeForce 7300 GT/PCI/SSE2 +NVIDIA GeForce 7300 GT/PCI/SSE2/3DNOW! +NVIDIA GeForce 7300 LE/PCI/SSE2 +NVIDIA GeForce 7300 LE/PCI/SSE2/3DNOW! +NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2 +NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW! +NVIDIA GeForce 7300 SE/PCI/SSE2 +NVIDIA GeForce 7300 SE/PCI/SSE2/3DNOW! +NVIDIA GeForce 7350 LE/PCI/SSE2 +NVIDIA GeForce 7500 +NVIDIA GeForce 7500 LE/PCI/SSE2 +NVIDIA GeForce 7500 LE/PCI/SSE2/3DNOW! +NVIDIA GeForce 7600 +NVIDIA GeForce 7600 GS/AGP/SSE2 +NVIDIA GeForce 7600 GS/AGP/SSE2/3DNOW! +NVIDIA GeForce 7600 GS/PCI/SSE2 +NVIDIA GeForce 7600 GS/PCI/SSE2/3DNOW! +NVIDIA GeForce 7600 GT/AGP/SSE/3DNOW! +NVIDIA GeForce 7600 GT/AGP/SSE2 +NVIDIA GeForce 7600 GT/PCI/SSE2 +NVIDIA GeForce 7600 GT/PCI/SSE2/3DNOW! +NVIDIA GeForce 7650 GS/PCI/SSE2 +NVIDIA GeForce 7800 +NVIDIA GeForce 7800 GS/AGP/SSE2 +NVIDIA GeForce 7800 GS/AGP/SSE2/3DNOW! +NVIDIA GeForce 7800 GT/PCI/SSE2 +NVIDIA GeForce 7800 GTX/PCI/SSE2 +NVIDIA GeForce 7800 GTX/PCI/SSE2/3DNOW! +NVIDIA GeForce 7900 +NVIDIA GeForce 7900 GS/PCI/SSE2 +NVIDIA GeForce 7900 GS/PCI/SSE2/3DNOW! +NVIDIA GeForce 7900 GT/GTO/PCI/SSE2 +NVIDIA GeForce 7900 GT/PCI/SSE2/3DNOW! +NVIDIA GeForce 7900 GTX/PCI/SSE2 +NVIDIA GeForce 7950 GT/PCI/SSE2 +NVIDIA GeForce 7950 GT/PCI/SSE2/3DNOW! +NVIDIA GeForce 8100 +NVIDIA GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW! +NVIDIA GeForce 8200 +NVIDIA GeForce 8200/PCI/SSE2 +NVIDIA GeForce 8200/PCI/SSE2/3DNOW! +NVIDIA GeForce 8200M +NVIDIA GeForce 8200M G/PCI/SSE2 +NVIDIA GeForce 8200M G/PCI/SSE2/3DNOW! +NVIDIA GeForce 8300 +NVIDIA GeForce 8300 GS/PCI/SSE2 +NVIDIA GeForce 8400 +NVIDIA GeForce 8400 GS/PCI/SSE/3DNOW! +NVIDIA GeForce 8400 GS/PCI/SSE2 +NVIDIA GeForce 8400 GS/PCI/SSE2/3DNOW! +NVIDIA GeForce 8400/PCI/SSE2/3DNOW! +NVIDIA GeForce 8400GS/PCI/SSE2 +NVIDIA GeForce 8400GS/PCI/SSE2/3DNOW! +NVIDIA GeForce 8400M +NVIDIA GeForce 8400M G/PCI/SSE2 +NVIDIA GeForce 8400M G/PCI/SSE2/3DNOW! +NVIDIA GeForce 8400M GS/PCI/SSE2 +NVIDIA GeForce 8400M GS/PCI/SSE2/3DNOW! +NVIDIA GeForce 8400M GT/PCI/SSE2 +NVIDIA GeForce 8500 +NVIDIA GeForce 8500 GT/PCI/SSE2 +NVIDIA GeForce 8500 GT/PCI/SSE2/3DNOW! +NVIDIA GeForce 8600 +NVIDIA GeForce 8600 GS/PCI/SSE2 +NVIDIA GeForce 8600 GS/PCI/SSE2/3DNOW! +NVIDIA GeForce 8600 GT/PCI/SSE2 +NVIDIA GeForce 8600 GT/PCI/SSE2/3DNOW! +NVIDIA GeForce 8600 GTS/PCI/SSE2 +NVIDIA GeForce 8600 GTS/PCI/SSE2/3DNOW! +NVIDIA GeForce 8600GS/PCI/SSE2 +NVIDIA GeForce 8600M +NVIDIA GeForce 8600M GS/PCI/SSE2 +NVIDIA GeForce 8600M GS/PCI/SSE2/3DNOW! +NVIDIA GeForce 8600M GT/PCI/SSE2 +NVIDIA GeForce 8700 +NVIDIA GeForce 8700M +NVIDIA GeForce 8700M GT/PCI/SSE2 +NVIDIA GeForce 8800 +NVIDIA GeForce 8800 GS/PCI/SSE2 +NVIDIA GeForce 8800 GT/PCI/SSE2 +NVIDIA GeForce 8800 GT/PCI/SSE2/3DNOW! +NVIDIA GeForce 8800 GTS 512/PCI/SSE2 +NVIDIA GeForce 8800 GTS 512/PCI/SSE2/3DNOW! +NVIDIA GeForce 8800 GTS/PCI/SSE2 +NVIDIA GeForce 8800 GTS/PCI/SSE2/3DNOW! +NVIDIA GeForce 8800 GTX/PCI/SSE2 +NVIDIA GeForce 8800 Ultra/PCI/SSE2 +NVIDIA GeForce 8800M GTS/PCI/SSE2 +NVIDIA GeForce 8800M GTX/PCI/SSE2 +NVIDIA GeForce 9100 +NVIDIA GeForce 9100/PCI/SSE2 +NVIDIA GeForce 9100/PCI/SSE2/3DNOW! +NVIDIA GeForce 9100M +NVIDIA GeForce 9100M G/PCI/SSE2 +NVIDIA GeForce 9100M G/PCI/SSE2/3DNOW! +NVIDIA GeForce 9200 +NVIDIA GeForce 9200/PCI/SSE2 +NVIDIA GeForce 9200/PCI/SSE2/3DNOW! +NVIDIA GeForce 9200M GE/PCI/SSE2 +NVIDIA GeForce 9200M GS/PCI/SSE2 +NVIDIA GeForce 9300 +NVIDIA GeForce 9300 / nForce 730i/PCI/SSE2 +NVIDIA GeForce 9300 GE/PCI/SSE2 +NVIDIA GeForce 9300 GE/PCI/SSE2/3DNOW! +NVIDIA GeForce 9300 GS/PCI/SSE2 +NVIDIA GeForce 9300 GS/PCI/SSE2/3DNOW! +NVIDIA GeForce 9300 SE/PCI/SSE2 +NVIDIA GeForce 9300M +NVIDIA GeForce 9300M G/PCI/SSE2 +NVIDIA GeForce 9300M G/PCI/SSE2/3DNOW! +NVIDIA GeForce 9300M GS/PCI/SSE2 +NVIDIA GeForce 9300M GS/PCI/SSE2/3DNOW! +NVIDIA GeForce 9400 +NVIDIA GeForce 9400 GT/PCI/SSE2 +NVIDIA GeForce 9400 GT/PCI/SSE2/3DNOW! +NVIDIA GeForce 9400/PCI/SSE2 +NVIDIA GeForce 9400M +NVIDIA GeForce 9400M G/PCI/SSE2 +NVIDIA GeForce 9400M/PCI/SSE2 +NVIDIA GeForce 9500 +NVIDIA GeForce 9500 GS/PCI/SSE2 +NVIDIA GeForce 9500 GS/PCI/SSE2/3DNOW! +NVIDIA GeForce 9500 GT/PCI/SSE2 +NVIDIA GeForce 9500 GT/PCI/SSE2/3DNOW! +NVIDIA GeForce 9500M +NVIDIA GeForce 9500M GS/PCI/SSE2 +NVIDIA GeForce 9600 +NVIDIA GeForce 9600 GS/PCI/SSE2 +NVIDIA GeForce 9600 GSO 512/PCI/SSE2 +NVIDIA GeForce 9600 GSO/PCI/SSE2 +NVIDIA GeForce 9600 GSO/PCI/SSE2/3DNOW! +NVIDIA GeForce 9600 GT/PCI/SSE2 +NVIDIA GeForce 9600 GT/PCI/SSE2/3DNOW! +NVIDIA GeForce 9600M +NVIDIA GeForce 9600M GS/PCI/SSE2 +NVIDIA GeForce 9600M GT/PCI/SSE2 +NVIDIA GeForce 9650M GT/PCI/SSE2 +NVIDIA GeForce 9700M +NVIDIA GeForce 9700M GT/PCI/SSE2 +NVIDIA GeForce 9700M GTS/PCI/SSE2 +NVIDIA GeForce 9800 +NVIDIA GeForce 9800 GT/PCI/SSE2 +NVIDIA GeForce 9800 GT/PCI/SSE2/3DNOW! +NVIDIA GeForce 9800 GTX+/PCI/SSE2 +NVIDIA GeForce 9800 GTX+/PCI/SSE2/3DNOW! +NVIDIA GeForce 9800 GTX/9800 GTX+/PCI/SSE2 +NVIDIA GeForce 9800 GTX/PCI/SSE2 +NVIDIA GeForce 9800 GX2/PCI/SSE2 +NVIDIA GeForce 9800M +NVIDIA GeForce 9800M GS/PCI/SSE2 +NVIDIA GeForce 9800M GT/PCI/SSE2 +NVIDIA GeForce 9800M GTS/PCI/SSE2 +NVIDIA GeForce FX 5100 +NVIDIA GeForce FX 5100/AGP/SSE/3DNOW! +NVIDIA GeForce FX 5200 +NVIDIA GeForce FX 5200/AGP/SSE +NVIDIA GeForce FX 5200/AGP/SSE/3DNOW! +NVIDIA GeForce FX 5200/AGP/SSE2 +NVIDIA GeForce FX 5200/AGP/SSE2/3DNOW! +NVIDIA GeForce FX 5200/PCI/SSE2 +NVIDIA GeForce FX 5200/PCI/SSE2/3DNOW! +NVIDIA GeForce FX 5200LE/AGP/SSE2 +NVIDIA GeForce FX 5500 +NVIDIA GeForce FX 5500/AGP/SSE/3DNOW! +NVIDIA GeForce FX 5500/AGP/SSE2 +NVIDIA GeForce FX 5500/AGP/SSE2/3DNOW! +NVIDIA GeForce FX 5500/PCI/SSE2 +NVIDIA GeForce FX 5500/PCI/SSE2/3DNOW! +NVIDIA GeForce FX 5600 +NVIDIA GeForce FX 5600/AGP/SSE2 +NVIDIA GeForce FX 5600/AGP/SSE2/3DNOW! +NVIDIA GeForce FX 5600XT/AGP/SSE2/3DNOW! +NVIDIA GeForce FX 5700 +NVIDIA GeForce FX 5700/AGP/SSE/3DNOW! +NVIDIA GeForce FX 5700LE/AGP/SSE +NVIDIA GeForce FX 5700LE/AGP/SSE/3DNOW! +NVIDIA GeForce FX 5800 +NVIDIA GeForce FX 5900 +NVIDIA GeForce FX 5900/AGP/SSE2 +NVIDIA GeForce FX 5900XT/AGP/SSE2 +NVIDIA GeForce FX Go5100 +NVIDIA GeForce FX Go5100/AGP/SSE2 +NVIDIA GeForce FX Go5200 +NVIDIA GeForce FX Go5200/AGP/SSE2 +NVIDIA GeForce FX Go5300 +NVIDIA GeForce FX Go5600 +NVIDIA GeForce FX Go5600/AGP/SSE2 +NVIDIA GeForce FX Go5650/AGP/SSE2 +NVIDIA GeForce FX Go5700 +NVIDIA GeForce FX Go5xxx/AGP/SSE2 +NVIDIA GeForce G 103M/PCI/SSE2 +NVIDIA GeForce G 105M/PCI/SSE2 +NVIDIA GeForce G 110M/PCI/SSE2 +NVIDIA GeForce G100/PCI/SSE2 +NVIDIA GeForce G100/PCI/SSE2/3DNOW! +NVIDIA GeForce G102M/PCI/SSE2 +NVIDIA GeForce G105M/PCI/SSE2 +NVIDIA GeForce G200/PCI/SSE2 +NVIDIA GeForce G205M/PCI/SSE2 +NVIDIA GeForce G210/PCI/SSE2 +NVIDIA GeForce G210/PCI/SSE2/3DNOW! +NVIDIA GeForce G210M/PCI/SSE2 +NVIDIA GeForce G310M/PCI/SSE2 +NVIDIA GeForce GT 120/PCI/SSE2 +NVIDIA GeForce GT 120/PCI/SSE2/3DNOW! +NVIDIA GeForce GT 120M/PCI/SSE2 +NVIDIA GeForce GT 130M/PCI/SSE2 +NVIDIA GeForce GT 140/PCI/SSE2 +NVIDIA GeForce GT 220/PCI/SSE2 +NVIDIA GeForce GT 220/PCI/SSE2/3DNOW! +NVIDIA GeForce GT 220M/PCI/SSE2 +NVIDIA GeForce GT 230/PCI/SSE2 +NVIDIA GeForce GT 230M/PCI/SSE2 +NVIDIA GeForce GT 240 +NVIDIA GeForce GT 240/PCI/SSE2 +NVIDIA GeForce GT 240/PCI/SSE2/3DNOW! +NVIDIA GeForce GT 240M/PCI/SSE2 +NVIDIA GeForce GT 320/PCI/SSE2 +NVIDIA GeForce GT 320M/PCI/SSE2 +NVIDIA GeForce GT 325M/PCI/SSE2 +NVIDIA GeForce GT 330/PCI/SSE2 +NVIDIA GeForce GT 330/PCI/SSE2/3DNOW! +NVIDIA GeForce GT 330M/PCI/SSE2 +NVIDIA GeForce GT 335M/PCI/SSE2 +NVIDIA GeForce GT 340/PCI/SSE2 +NVIDIA GeForce GT 340/PCI/SSE2/3DNOW! +NVIDIA GeForce GT 415M/PCI/SSE2 +NVIDIA GeForce GT 420/PCI/SSE2 +NVIDIA GeForce GT 420M/PCI/SSE2 +NVIDIA GeForce GT 425M/PCI/SSE2 +NVIDIA GeForce GT 430/PCI/SSE2 +NVIDIA GeForce GT 430/PCI/SSE2/3DNOW! +NVIDIA GeForce GT 435M/PCI/SSE2 +NVIDIA GeForce GT 440/PCI/SSE2 +NVIDIA GeForce GT 440/PCI/SSE2/3DNOW! +NVIDIA GeForce GT 445M/PCI/SSE2 +NVIDIA GeForce GT 520M/PCI/SSE2 +NVIDIA GeForce GT 525M/PCI/SSE2 +NVIDIA GeForce GT 540M/PCI/SSE2 +NVIDIA GeForce GT 550M/PCI/SSE2 +NVIDIA GeForce GT 555M/PCI/SSE2 +NVIDIA GeForce GTS 150/PCI/SSE2 +NVIDIA GeForce GTS 160M/PCI/SSE2 +NVIDIA GeForce GTS 240/PCI/SSE2 +NVIDIA GeForce GTS 250/PCI/SSE2 +NVIDIA GeForce GTS 250/PCI/SSE2/3DNOW! +NVIDIA GeForce GTS 250M/PCI/SSE2 +NVIDIA GeForce GTS 350M/PCI/SSE2 +NVIDIA GeForce GTS 360M/PCI/SSE2 +NVIDIA GeForce GTS 450/PCI/SSE2 +NVIDIA GeForce GTS 450/PCI/SSE2/3DNOW! +NVIDIA GeForce GTS 455/PCI/SSE2 +NVIDIA GeForce GTX 260/PCI/SSE2 +NVIDIA GeForce GTX 260/PCI/SSE2/3DNOW! +NVIDIA GeForce GTX 260M/PCI/SSE2 +NVIDIA GeForce GTX 275/PCI/SSE2 +NVIDIA GeForce GTX 280 +NVIDIA GeForce GTX 280/PCI/SSE2 +NVIDIA GeForce GTX 280M/PCI/SSE2 +NVIDIA GeForce GTX 285/PCI/SSE2 +NVIDIA GeForce GTX 295/PCI/SSE2 +NVIDIA GeForce GTX 460 SE/PCI/SSE2 +NVIDIA GeForce GTX 460 SE/PCI/SSE2/3DNOW! +NVIDIA GeForce GTX 460/PCI/SSE2 +NVIDIA GeForce GTX 460/PCI/SSE2/3DNOW! +NVIDIA GeForce GTX 460M/PCI/SSE2 +NVIDIA GeForce GTX 465/PCI/SSE2 +NVIDIA GeForce GTX 465/PCI/SSE2/3DNOW! +NVIDIA GeForce GTX 470/PCI/SSE2 +NVIDIA GeForce GTX 470/PCI/SSE2/3DNOW! +NVIDIA GeForce GTX 480/PCI/SSE2 +NVIDIA GeForce GTX 550 Ti/PCI/SSE2 +NVIDIA GeForce GTX 550 Ti/PCI/SSE2/3DNOW! +NVIDIA GeForce GTX 560 Ti/PCI/SSE2 +NVIDIA GeForce GTX 560 Ti/PCI/SSE2/3DNOW! +NVIDIA GeForce GTX 560/PCI/SSE2 +NVIDIA GeForce GTX 570/PCI/SSE2 +NVIDIA GeForce GTX 570/PCI/SSE2/3DNOW! +NVIDIA GeForce GTX 580/PCI/SSE2 +NVIDIA GeForce GTX 580/PCI/SSE2/3DNOW! +NVIDIA GeForce GTX 580M/PCI/SSE2 +NVIDIA GeForce GTX 590/PCI/SSE2 +NVIDIA GeForce Go 6 +NVIDIA GeForce Go 6100 +NVIDIA GeForce Go 6100/PCI/SSE2 +NVIDIA GeForce Go 6100/PCI/SSE2/3DNOW! +NVIDIA GeForce Go 6150/PCI/SSE2 +NVIDIA GeForce Go 6150/PCI/SSE2/3DNOW! +NVIDIA GeForce Go 6200 +NVIDIA GeForce Go 6200/PCI/SSE2 +NVIDIA GeForce Go 6400 +NVIDIA GeForce Go 6400/PCI/SSE2 +NVIDIA GeForce Go 6600 +NVIDIA GeForce Go 6600/PCI/SSE2 +NVIDIA GeForce Go 6800 +NVIDIA GeForce Go 6800 Ultra/PCI/SSE2 +NVIDIA GeForce Go 6800/PCI/SSE2 +NVIDIA GeForce Go 7200 +NVIDIA GeForce Go 7200/PCI/SSE2 +NVIDIA GeForce Go 7200/PCI/SSE2/3DNOW! +NVIDIA GeForce Go 7300 +NVIDIA GeForce Go 7300/PCI/SSE2 +NVIDIA GeForce Go 7300/PCI/SSE2/3DNOW! +NVIDIA GeForce Go 7400 +NVIDIA GeForce Go 7400/PCI/SSE2 +NVIDIA GeForce Go 7400/PCI/SSE2/3DNOW! +NVIDIA GeForce Go 7600 +NVIDIA GeForce Go 7600/PCI/SSE2 +NVIDIA GeForce Go 7600/PCI/SSE2/3DNOW! +NVIDIA GeForce Go 7700 +NVIDIA GeForce Go 7800 +NVIDIA GeForce Go 7800 GTX/PCI/SSE2 +NVIDIA GeForce Go 7900 +NVIDIA GeForce Go 7900 GS/PCI/SSE2 +NVIDIA GeForce Go 7900 GTX/PCI/SSE2 +NVIDIA GeForce Go 7950 GTX/PCI/SSE2 +NVIDIA GeForce PCX +NVIDIA GeForce2 GTS/AGP/SSE +NVIDIA GeForce2 MX/AGP/3DNOW! +NVIDIA GeForce2 MX/AGP/SSE/3DNOW! +NVIDIA GeForce2 MX/AGP/SSE2 +NVIDIA GeForce2 MX/PCI/SSE2 +NVIDIA GeForce3/AGP/SSE/3DNOW! +NVIDIA GeForce3/AGP/SSE2 +NVIDIA GeForce4 420 Go 32M/AGP/SSE2 +NVIDIA GeForce4 420 Go 32M/AGP/SSE2/3DNOW! +NVIDIA GeForce4 420 Go 32M/PCI/SSE2/3DNOW! +NVIDIA GeForce4 440 Go 64M/AGP/SSE2/3DNOW! +NVIDIA GeForce4 460 Go/AGP/SSE2 +NVIDIA GeForce4 MX 4000/AGP/SSE/3DNOW! +NVIDIA GeForce4 MX 4000/AGP/SSE2 +NVIDIA GeForce4 MX 4000/PCI/3DNOW! +NVIDIA GeForce4 MX 4000/PCI/SSE/3DNOW! +NVIDIA GeForce4 MX 4000/PCI/SSE2 +NVIDIA GeForce4 MX 420/AGP/SSE/3DNOW! +NVIDIA GeForce4 MX 420/AGP/SSE2 +NVIDIA GeForce4 MX 440 with AGP8X/AGP/SSE2 +NVIDIA GeForce4 MX 440/AGP/SSE2 +NVIDIA GeForce4 MX 440/AGP/SSE2/3DNOW! +NVIDIA GeForce4 MX 440SE with AGP8X/AGP/SSE2 +NVIDIA GeForce4 MX Integrated GPU/AGP/SSE/3DNOW! +NVIDIA GeForce4 Ti 4200 with AGP8X/AGP/SSE +NVIDIA GeForce4 Ti 4200/AGP/SSE/3DNOW! +NVIDIA GeForce4 Ti 4400/AGP/SSE2 +NVIDIA Generic +NVIDIA ION LE/PCI/SSE2 +NVIDIA ION/PCI/SSE2 +NVIDIA ION/PCI/SSE2/3DNOW! +NVIDIA MCP61/PCI/SSE2 +NVIDIA MCP61/PCI/SSE2/3DNOW! +NVIDIA MCP73/PCI/SSE2 +NVIDIA MCP79MH/PCI/SSE2 +NVIDIA MCP79MX/PCI/SSE2 +NVIDIA MCP7A-O/PCI/SSE2 +NVIDIA MCP7A-S/PCI/SSE2 +NVIDIA MCP89-EPT/PCI/SSE2 +NVIDIA N10M-GE1/PCI/SSE2 +NVIDIA N10P-GE1/PCI/SSE2 +NVIDIA N10P-GV2/PCI/SSE2 +NVIDIA N11M-GE1/PCI/SSE2 +NVIDIA N11M-GE2/PCI/SSE2 +NVIDIA N12E-GS-A1/PCI/SSE2 +NVIDIA NB9M-GE/PCI/SSE2 +NVIDIA NB9M-GE1/PCI/SSE2 +NVIDIA NB9M-GS/PCI/SSE2 +NVIDIA NB9M-NS/PCI/SSE2 +NVIDIA NB9P-GE1/PCI/SSE2 +NVIDIA NB9P-GS/PCI/SSE2 +NVIDIA NV17/AGP/3DNOW! +NVIDIA NV17/AGP/SSE2 +NVIDIA NV34 +NVIDIA NV35 +NVIDIA NV36/AGP/SSE/3DNOW! +NVIDIA NV36/AGP/SSE2 +NVIDIA NV41/PCI/SSE2 +NVIDIA NV43 +NVIDIA NV44 +NVIDIA NVIDIA GeForce 210 OpenGL Engine +NVIDIA NVIDIA GeForce 320M OpenGL Engine +NVIDIA NVIDIA GeForce 7300 GT OpenGL Engine +NVIDIA NVIDIA GeForce 7600 GT OpenGL Engine +NVIDIA NVIDIA GeForce 8600M GT OpenGL Engine +NVIDIA NVIDIA GeForce 8800 GS OpenGL Engine +NVIDIA NVIDIA GeForce 8800 GT OpenGL Engine +NVIDIA NVIDIA GeForce 9400 OpenGL Engine +NVIDIA NVIDIA GeForce 9400M OpenGL Engine +NVIDIA NVIDIA GeForce 9500 GT OpenGL Engine +NVIDIA NVIDIA GeForce 9600M GT OpenGL Engine +NVIDIA NVIDIA GeForce GT 120 OpenGL Engine +NVIDIA NVIDIA GeForce GT 130 OpenGL Engine +NVIDIA NVIDIA GeForce GT 220 OpenGL Engine +NVIDIA NVIDIA GeForce GT 230M OpenGL Engine +NVIDIA NVIDIA GeForce GT 240M OpenGL Engine +NVIDIA NVIDIA GeForce GT 330M OpenGL Engine +NVIDIA NVIDIA GeForce GT 420M OpenGL Engine +NVIDIA NVIDIA GeForce GT 425M OpenGL Engine +NVIDIA NVIDIA GeForce GT 430 OpenGL Engine +NVIDIA NVIDIA GeForce GT 440 OpenGL Engine +NVIDIA NVIDIA GeForce GT 540M OpenGL Engine +NVIDIA NVIDIA GeForce GTS 240 OpenGL Engine +NVIDIA NVIDIA GeForce GTS 250 OpenGL Engine +NVIDIA NVIDIA GeForce GTS 450 OpenGL Engine +NVIDIA NVIDIA GeForce GTX 285 OpenGL Engine +NVIDIA NVIDIA GeForce GTX 460 OpenGL Engine +NVIDIA NVIDIA GeForce GTX 460M OpenGL Engine +NVIDIA NVIDIA GeForce GTX 465 OpenGL Engine +NVIDIA NVIDIA GeForce GTX 470 OpenGL Engine +NVIDIA NVIDIA GeForce GTX 480 OpenGL Engine +NVIDIA NVIDIA GeForce Pre-Release ION OpenGL Engine +NVIDIA NVIDIA GeForce4 OpenGL Engine +NVIDIA NVIDIA NV34MAP OpenGL Engine +NVIDIA NVIDIA Quadro 4000 OpenGL Engine +NVIDIA NVIDIA Quadro FX 4800 OpenGL Engine +NVIDIA NVS 2100M/PCI/SSE2 +NVIDIA NVS 300/PCI/SSE2 +NVIDIA NVS 3100M/PCI/SSE2 +NVIDIA NVS 4100/PCI/SSE2/3DNOW! +NVIDIA NVS 4200M/PCI/SSE2 +NVIDIA NVS 5100M/PCI/SSE2 +NVIDIA PCI +NVIDIA Quadro 2000/PCI/SSE2 +NVIDIA Quadro 4000 +NVIDIA Quadro 4000 OpenGL Engine +NVIDIA Quadro 4000/PCI/SSE2 +NVIDIA Quadro 5000/PCI/SSE2 +NVIDIA Quadro 5000M/PCI/SSE2 +NVIDIA Quadro 600 +NVIDIA Quadro 600/PCI/SSE2 +NVIDIA Quadro 600/PCI/SSE2/3DNOW! +NVIDIA Quadro 6000 +NVIDIA Quadro 6000/PCI/SSE2 +NVIDIA Quadro CX/PCI/SSE2 +NVIDIA Quadro DCC +NVIDIA Quadro FX +NVIDIA Quadro FX 1100/AGP/SSE2 +NVIDIA Quadro FX 1400/PCI/SSE2 +NVIDIA Quadro FX 1500 +NVIDIA Quadro FX 1500M/PCI/SSE2 +NVIDIA Quadro FX 1600M/PCI/SSE2 +NVIDIA Quadro FX 1700 +NVIDIA Quadro FX 1700M/PCI/SSE2 +NVIDIA Quadro FX 1800 +NVIDIA Quadro FX 1800/PCI/SSE2 +NVIDIA Quadro FX 1800M/PCI/SSE2 +NVIDIA Quadro FX 2500M/PCI/SSE2 +NVIDIA Quadro FX 2700M/PCI/SSE2 +NVIDIA Quadro FX 2800M/PCI/SSE2 +NVIDIA Quadro FX 3400 +NVIDIA Quadro FX 3450 +NVIDIA Quadro FX 3450/4000 SDI/PCI/SSE2 +NVIDIA Quadro FX 3500 +NVIDIA Quadro FX 3500M/PCI/SSE2 +NVIDIA Quadro FX 360M/PCI/SSE2 +NVIDIA Quadro FX 370 +NVIDIA Quadro FX 370/PCI/SSE2 +NVIDIA Quadro FX 3700 +NVIDIA Quadro FX 3700M/PCI/SSE2 +NVIDIA Quadro FX 370M/PCI/SSE2 +NVIDIA Quadro FX 3800 +NVIDIA Quadro FX 3800M/PCI/SSE2 +NVIDIA Quadro FX 4500 +NVIDIA Quadro FX 4600 +NVIDIA Quadro FX 4800 +NVIDIA Quadro FX 4800/PCI/SSE2 +NVIDIA Quadro FX 560 +NVIDIA Quadro FX 5600 +NVIDIA Quadro FX 570 +NVIDIA Quadro FX 570/PCI/SSE2 +NVIDIA Quadro FX 570M/PCI/SSE2 +NVIDIA Quadro FX 580/PCI/SSE2 +NVIDIA Quadro FX 770M/PCI/SSE2 +NVIDIA Quadro FX 880M +NVIDIA Quadro FX 880M/PCI/SSE2 +NVIDIA Quadro FX Go700/AGP/SSE2 +NVIDIA Quadro NVS +NVIDIA Quadro NVS 110M/PCI/SSE2 +NVIDIA Quadro NVS 130M/PCI/SSE2 +NVIDIA Quadro NVS 135M/PCI/SSE2 +NVIDIA Quadro NVS 140M/PCI/SSE2 +NVIDIA Quadro NVS 150M/PCI/SSE2 +NVIDIA Quadro NVS 160M/PCI/SSE2 +NVIDIA Quadro NVS 210S/PCI/SSE2/3DNOW! +NVIDIA Quadro NVS 285/PCI/SSE2 +NVIDIA Quadro NVS 290/PCI/SSE2 +NVIDIA Quadro NVS 295/PCI/SSE2 +NVIDIA Quadro NVS 320M/PCI/SSE2 +NVIDIA Quadro NVS 55/280 PCI/PCI/SSE2 +NVIDIA Quadro NVS/PCI/SSE2 +NVIDIA Quadro PCI-E Series/PCI/SSE2/3DNOW! +NVIDIA Quadro VX 200/PCI/SSE2 +NVIDIA Quadro/AGP/SSE2 +NVIDIA Quadro2 +NVIDIA Quadro4 +NVIDIA RIVA TNT +NVIDIA RIVA TNT2/AGP/SSE2 +NVIDIA RIVA TNT2/PCI/3DNOW! +NVIDIA nForce +NVIDIA unknown board/AGP/SSE2 +NVIDIA unknown board/PCI/SSE2 +NVIDIA unknown board/PCI/SSE2/3DNOW! +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6490M OpenGL Engine +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine +Parallels and Intel Inc. 3D-Analyze v2.3 - http://www.tommti-systems.com +Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine +Parallels and NVIDIA Parallels using NVIDIA GeForce 320M OpenGL Engine +Parallels and NVIDIA Parallels using NVIDIA GeForce 9400 OpenGL Engine +Parallels and NVIDIA Parallels using NVIDIA GeForce GT 120 OpenGL Engine +Parallels and NVIDIA Parallels using NVIDIA GeForce GT 330M OpenGL Engine +Radeon RV350 on Gallium +S3 +S3 Graphics VIA/S3G UniChrome IGP/MMX/K3D +S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE +S3 Graphics, Incorporated ProSavage/Twister +S3 Graphics, Incorporated S3 Graphics Chrome9 HC +S3 Graphics, Incorporated S3 Graphics DeltaChrome +S3 Graphics, Incorporated VIA Chrome9 HC IGP +SiS +SiS 661 VGA +SiS 662 VGA +SiS 741 VGA +SiS 760 VGA +SiS 761GX VGA +SiS Mirage Graphics3 +Trident +Tungsten Graphics +Tungsten Graphics, Inc Mesa DRI 865G GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 865G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 915G GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 915G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 915GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 915GM GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 915GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 945G +Tungsten Graphics, Inc Mesa DRI 945G GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT +Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 945GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 945GM GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100328 2010Q1 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 945GME x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 945GME 20061017 +Tungsten Graphics, Inc Mesa DRI 945GME GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 945GME GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 945GME GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090326 2009Q1 RC2 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 965GM GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI 965GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI G33 20061017 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI G33 GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI G33 GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI G41 GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI G41 GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI GMA500 20081116 - 5.0.1.0046 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI IGD GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT +Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI IGDNG_D GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Ironlake Desktop GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Ironlake Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset 20080716 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100328 2010Q1 +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5964) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 +VIA +VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE; +VMware, Inc. Gallium 0.4 on i915 (chipset: 945GM) +VMware, Inc. Gallium 0.4 on llvmpipe +VMware, Inc. Gallium 0.4 on softpipe +X.Org Gallium 0.4 on AMD BARTS +X.Org Gallium 0.4 on AMD CEDAR +X.Org Gallium 0.4 on AMD HEMLOCK +X.Org Gallium 0.4 on AMD JUNIPER +X.Org Gallium 0.4 on AMD REDWOOD +X.Org Gallium 0.4 on AMD RS780 +X.Org Gallium 0.4 on AMD RS880 +X.Org Gallium 0.4 on AMD RV610 +X.Org Gallium 0.4 on AMD RV620 +X.Org Gallium 0.4 on AMD RV630 +X.Org Gallium 0.4 on AMD RV635 +X.Org Gallium 0.4 on AMD RV710 +X.Org Gallium 0.4 on AMD RV730 +X.Org Gallium 0.4 on AMD RV740 +X.Org Gallium 0.4 on AMD RV770 +X.Org R300 Project Gallium 0.4 on ATI R300 +X.Org R300 Project Gallium 0.4 on ATI R580 +X.Org R300 Project Gallium 0.4 on ATI RC410 +X.Org R300 Project Gallium 0.4 on ATI RS482 +X.Org R300 Project Gallium 0.4 on ATI RS600 +X.Org R300 Project Gallium 0.4 on ATI RS690 +X.Org R300 Project Gallium 0.4 on ATI RV350 +X.Org R300 Project Gallium 0.4 on ATI RV370 +X.Org R300 Project Gallium 0.4 on ATI RV410 +X.Org R300 Project Gallium 0.4 on ATI RV515 +X.Org R300 Project Gallium 0.4 on ATI RV530 +X.Org R300 Project Gallium 0.4 on ATI RV570 +X.Org R300 Project Gallium 0.4 on R420 +X.Org R300 Project Gallium 0.4 on R580 +X.Org R300 Project Gallium 0.4 on RC410 +X.Org R300 Project Gallium 0.4 on RS480 +X.Org R300 Project Gallium 0.4 on RS482 +X.Org R300 Project Gallium 0.4 on RS600 +X.Org R300 Project Gallium 0.4 on RS690 +X.Org R300 Project Gallium 0.4 on RS740 +X.Org R300 Project Gallium 0.4 on RV350 +X.Org R300 Project Gallium 0.4 on RV370 +X.Org R300 Project Gallium 0.4 on RV410 +X.Org R300 Project Gallium 0.4 on RV515 +X.Org R300 Project Gallium 0.4 on RV530 +XGI +nouveau Gallium 0.4 on NV34 +nouveau Gallium 0.4 on NV36 +nouveau Gallium 0.4 on NV46 +nouveau Gallium 0.4 on NV49 +nouveau Gallium 0.4 on NV4A +nouveau Gallium 0.4 on NV4B +nouveau Gallium 0.4 on NV4E +nouveau Gallium 0.4 on NV50 +nouveau Gallium 0.4 on NV84 +nouveau Gallium 0.4 on NV86 +nouveau Gallium 0.4 on NV92 +nouveau Gallium 0.4 on NV94 +nouveau Gallium 0.4 on NV96 +nouveau Gallium 0.4 on NV98 +nouveau Gallium 0.4 on NVA0 +nouveau Gallium 0.4 on NVA3 +nouveau Gallium 0.4 on NVA5 +nouveau Gallium 0.4 on NVA8 +nouveau Gallium 0.4 on NVAA +nouveau Gallium 0.4 on NVAC diff --git a/indra/newview/tests/llremoteparcelrequest_test.cpp b/indra/newview/tests/llremoteparcelrequest_test.cpp index 9a6e08ee84..ed66066b0a 100644 --- a/indra/newview/tests/llremoteparcelrequest_test.cpp +++ b/indra/newview/tests/llremoteparcelrequest_test.cpp @@ -35,7 +35,6 @@ #include "llurlentry.h" namespace { - LLControlGroup s_saved_settings("dummy_settings"); const LLUUID TEST_PARCEL_ID("11111111-1111-1111-1111-111111111111"); } @@ -64,13 +63,12 @@ LLMessageSystem * gMessageSystem; char const* const _PREHASH_AgentID = 0; // never dereferenced during this test char const* const _PREHASH_AgentData = 0; // never dereferenced during this test LLAgent gAgent; -LLAgent::LLAgent() : mAgentAccess(s_saved_settings) { } +LLAgent::LLAgent() : mAgentAccess(NULL) { } LLAgent::~LLAgent() { } void LLAgent::sendReliableMessage(void) { } LLUUID gAgentSessionID; LLUUID gAgentID; LLUIColor::LLUIColor(void) { } -LLAgentAccess::LLAgentAccess(LLControlGroup & settings) : mSavedSettings(settings) { } LLControlGroup::LLControlGroup(std::string const & name) : LLInstanceTracker<LLControlGroup, std::string>(name) { } LLControlGroup::~LLControlGroup(void) { } void LLUrlEntryParcel::processParcelInfo(const LLUrlEntryParcel::LLParcelData& parcel_data) { } diff --git a/indra/newview/tests/llviewerhelputil_test.cpp b/indra/newview/tests/llviewerhelputil_test.cpp index b425b50c8b..710881d811 100644 --- a/indra/newview/tests/llviewerhelputil_test.cpp +++ b/indra/newview/tests/llviewerhelputil_test.cpp @@ -73,11 +73,9 @@ static void substitute_string(std::string &input, const std::string &search, con } #include "../llagent.h" -LLAgent::LLAgent() : mAgentAccess(gSavedSettings) { } +LLAgent::LLAgent() : mAgentAccess(NULL) { } LLAgent::~LLAgent() { } bool LLAgent::isGodlike() const { return FALSE; } -LLAgentAccess::LLAgentAccess(LLControlGroup& settings) : mSavedSettings(settings) { } -LLUIColor::LLUIColor() {} LLAgent gAgent; diff --git a/indra/newview/tests/llxmlrpclistener_test.cpp b/indra/newview/tests/llxmlrpclistener_test.cpp index 4d5df1043e..711c2a3d51 100644 --- a/indra/newview/tests/llxmlrpclistener_test.cpp +++ b/indra/newview/tests/llxmlrpclistener_test.cpp @@ -40,8 +40,10 @@ #include "llevents.h" #include "lleventfilter.h" #include "llsd.h" +#include "llhost.h" #include "llcontrol.h" #include "tests/wrapllerrs.h" +#include "tests/commtest.h" LLControlGroup gSavedSettings("Global"); @@ -54,7 +56,8 @@ namespace tut { data(): pumps(LLEventPumps::instance()), - uri("http://127.0.0.1:8000") + uri(std::string("http://") + + LLHost("127.0.0.1", commtest_data::getport("PORT")).getString()) { // These variables are required by machinery used by // LLXMLRPCTransaction. The values reflect reality for this test @@ -145,7 +148,7 @@ namespace tut pumps.obtain("LLXMLRPCTransaction").post(request); // Set the timer F32 timeout(10); - watchdog.eventAfter(timeout, LLSD().insert("timeout", 0)); + watchdog.eventAfter(timeout, LLSD().with("timeout", 0)); // and pump "mainloop" until we get something, whether from // LLXMLRPCListener or from the watchdog filter. LLTimer timer; @@ -182,7 +185,7 @@ namespace tut pumps.obtain("LLXMLRPCTransaction").post(request); // Set the timer F32 timeout(10); - watchdog.eventAfter(timeout, LLSD().insert("timeout", 0)); + watchdog.eventAfter(timeout, LLSD().with("timeout", 0)); // and pump "mainloop" until we get something, whether from // LLXMLRPCListener or from the watchdog filter. LLTimer timer; @@ -218,7 +221,7 @@ namespace tut pumps.obtain("LLXMLRPCTransaction").post(request); // Set the timer F32 timeout(10); - watchdog.eventAfter(timeout, LLSD().insert("timeout", 0)); + watchdog.eventAfter(timeout, LLSD().with("timeout", 0)); // and pump "mainloop" until we get something, whether from // LLXMLRPCListener or from the watchdog filter. LLTimer timer; diff --git a/indra/newview/tests/test_llxmlrpc_peer.py b/indra/newview/tests/test_llxmlrpc_peer.py index 1c7204a6b6..281b72a058 100644 --- a/indra/newview/tests/test_llxmlrpc_peer.py +++ b/indra/newview/tests/test_llxmlrpc_peer.py @@ -37,7 +37,7 @@ from SimpleXMLRPCServer import SimpleXMLRPCServer mydir = os.path.dirname(__file__) # expected to be .../indra/newview/tests/ sys.path.insert(0, os.path.join(mydir, os.pardir, os.pardir, "lib", "python")) sys.path.insert(1, os.path.join(mydir, os.pardir, os.pardir, "llmessage", "tests")) -from testrunner import run, debug +from testrunner import freeport, run, debug class TestServer(SimpleXMLRPCServer): def _dispatch(self, method, params): @@ -66,11 +66,16 @@ class TestServer(SimpleXMLRPCServer): # Suppress error output as well pass -class ServerRunner(Thread): - def run(self): - server = TestServer(('127.0.0.1', 8000)) - debug("Starting XMLRPC server...\n") - server.serve_forever() - if __name__ == "__main__": - sys.exit(run(server=ServerRunner(name="xmlrpc"), *sys.argv[1:])) + # Instantiate a TestServer on the first free port in the specified port + # range. Doing this inline is better than in a daemon thread: if it blows + # up here, we'll get a traceback. If it blew up in some other thread, the + # traceback would get eaten and we'd run the subject test program anyway. + xmlrpcd, port = freeport(xrange(8000, 8020), + lambda port: TestServer(('127.0.0.1', port))) + # Pass the selected port number to the subject test program via the + # environment. We don't want to impose requirements on the test program's + # command-line parsing -- and anyway, for C++ integration tests, that's + # performed in TUT code rather than our own. + os.environ["PORT"] = str(port) + sys.exit(run(server=Thread(name="xmlrpc", target=xmlrpcd.serve_forever), *sys.argv[1:])) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index a04b4a9ca0..8aa94616d6 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -114,6 +114,16 @@ class ViewerManifest(LLManifest): # Files in the newview/ directory self.path("gpu_table.txt") + # The summary.json file gets left in the base checkout dir by + # build.sh. It's only created for a build.sh build, therefore we + # have to check whether it exists. :-P + summary_json = "summary.json" + summary_json_path = os.path.join(os.pardir, os.pardir, summary_json) + if os.path.exists(os.path.join(self.get_src_prefix(), summary_json_path)): + self.path(summary_json_path, summary_json) + else: + print "No %s" % os.path.join(self.get_src_prefix(), summary_json_path) + def login_channel(self): """Channel reported for login and upgrade purposes ONLY; used for A/B testing""" diff --git a/indra/viewer_components/login/CMakeLists.txt b/indra/viewer_components/login/CMakeLists.txt index fe64926da6..7720619df3 100644 --- a/indra/viewer_components/login/CMakeLists.txt +++ b/indra/viewer_components/login/CMakeLists.txt @@ -9,13 +9,11 @@ endif(LL_TESTS) include(LLCommon) include(LLMath) include(LLXML) -include(Pth) include_directories( ${LLCOMMON_INCLUDE_DIRS} ${LLMATH_INCLUDE_DIRS} ${LLXML_INCLUDE_DIRS} - ${PTH_INCLUDE_DIRS} ) set(login_SOURCE_FILES @@ -42,7 +40,6 @@ target_link_libraries(lllogin ${LLCOMMON_LIBRARIES} ${LLMATH_LIBRARIES} ${LLXML_LIBRARIES} - ${PTH_LIBRARIES} ) if(LL_TESTS) @@ -50,11 +47,5 @@ if(LL_TESTS) lllogin.cpp ) - set_source_files_properties( - lllogin.cpp - PROPERTIES - LL_TEST_ADDITIONAL_LIBRARIES "${PTH_LIBRARIES}" - ) - LL_ADD_PROJECT_UNIT_TESTS(lllogin "${lllogin_TEST_SOURCE_FILES}") endif(LL_TESTS) diff --git a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp index 88ab5a2284..e19d5724f1 100644 --- a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp +++ b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp @@ -59,12 +59,6 @@ class LLDir_Mock : public LLDir return 0; } - BOOL getNextFileInDir(const std::string &dirname, - const std::string &mask, - std::string &fname) - { - return false; - } void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) {} |