diff options
Diffstat (limited to 'indra/newview')
2114 files changed, 70833 insertions, 28070 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 040fc7955e..e411794759 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -9,16 +9,15 @@ include(Linking) include(Boost) include(bugsplat) -if (NOT USESYSTEMLIBS) -include(BuildPackagesInfo) -endif () +#include(BuildPackagesInfo) include(BuildVersion) include(CMakeCopyIfDifferent) include(CubemapToEquirectangularJS) -if (NOT USESYSTEMLIBS) -include(DBusGlib) -endif () +#include(DBusGlib) include(DragDrop) +if (USE_DISCORD) + include(Discord) +endif () include(EXPAT) include(Hunspell) include(JPEGEncoderBasic) @@ -45,20 +44,21 @@ include(ThreeJS) include(Tracy) include(UI) include(ViewerMiscLibs) -if (NOT USESYSTEMLIBS) -include(ViewerManager) -endif () +#include(ViewerManager) include(VisualLeakDetector) -include(VulkanGltf) +#include(VulkanGltf) include(ZLIBNG) include(LLPrimitive) +if (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64) + include(UnixInstall) +endif () if (ENABLE_MEDIA_PLUGINS) include(LibVLCPlugin) include(CEFPlugin) -endif (ENABLE_MEDIA_PLUGINS) +endif () -if (NOT HAVOK_TPV) +if (HAVOK) # When using HAVOK_TPV, the library is precompiled, so no need for this # Stub and probably havok lib itself is a hack, autobuild loads a 3p that really is a source tarball @@ -67,6 +67,11 @@ if (NOT HAVOK_TPV) # which means we need to duct tape this togther ... add_subdirectory(${LLPHYSICSEXTENSIONS_SRC_DIR} llphysicsextensions) + if (NOT "${LLPHYSICSEXTENSIONS_STUB_DIR}" STREQUAL "") + # for darwin universal builds we need both real llphysicsextensions and the stub for aarch64 fallback + # this will only be set when HAVOK is ON, otherwise the normal stub fallback will be in effect + add_subdirectory(${LLPHYSICSEXTENSIONS_STUB_DIR} llphysicsextensionsstub) + endif() # Another hack that works with newer cmake versions: cmake_policy( SET CMP0079 NEW) @@ -79,7 +84,7 @@ if (NOT HAVOK_TPV) target_compile_options( llphysicsextensions PRIVATE -Wno-unused-local-typedef) endif (DARWIN) endif() -endif (NOT HAVOK_TPV) +endif () set(viewer_SOURCE_FILES gltfscenemanager.cpp @@ -87,6 +92,7 @@ set(viewer_SOURCE_FILES gltf/accessor.cpp gltf/primitive.cpp gltf/animation.cpp + gltf/llgltfloader.cpp groupchatlistener.cpp llaccountingcostmanager.cpp llaisapi.cpp @@ -103,6 +109,7 @@ set(viewer_SOURCE_FILES llagentwearables.cpp llanimstatelabels.cpp llappcorehttp.cpp + llappearancelistener.cpp llappearancemgr.cpp llappviewer.cpp llappviewerlistener.cpp @@ -188,11 +195,11 @@ set(viewer_SOURCE_FILES llflexibleobject.cpp llfloater360capture.cpp llfloaterabout.cpp + llfloateravatarwelcomepack.cpp llfloaterbvhpreview.cpp llfloateraddpaymentmethod.cpp llfloaterauction.cpp llfloaterautoreplacesettings.cpp - llfloateravatar.cpp llfloateravatarpicker.cpp llfloateravatarrendersettings.cpp llfloateravatartextures.cpp @@ -211,6 +218,7 @@ set(viewer_SOURCE_FILES llfloatercamera.cpp llfloatercamerapresets.cpp llfloaterchangeitemthumbnail.cpp + llfloaterchatmentionpicker.cpp llfloaterchatvoicevolume.cpp llfloaterclassified.cpp llfloatercolorpicker.cpp @@ -219,6 +227,7 @@ set(viewer_SOURCE_FILES llfloatercreatelandmark.cpp llfloaterdeleteprefpreset.cpp llfloaterdestinations.cpp + llfloaterdirectory.cpp llfloaterdisplayname.cpp llfloatereditenvironmentbase.cpp llfloatereditextdaycycle.cpp @@ -243,7 +252,6 @@ set(viewer_SOURCE_FILES llfloaterhelpbrowser.cpp llfloaterhoverheight.cpp mpfloatertuning.cpp - fsfloatersearch.cpp llfloaterhowto.cpp llfloaterhud.cpp llfloaterimagepreview.cpp @@ -304,6 +312,7 @@ set(viewer_SOURCE_FILES llfloatersettingscolor.cpp llfloatersettingsdebug.cpp llfloatersidepanelcontainer.cpp + llfloaterslapptest.cpp llfloatersnapshot.cpp llfloatersounddevices.cpp llfloaterspellchecksettings.cpp @@ -348,6 +357,7 @@ set(viewer_SOURCE_FILES llhudeffectpointat.cpp llhudeffecttrail.cpp llhudeffectblob.cpp + llhudeffectresetskeleton.cpp llhudicon.cpp llhudmanager.cpp llhudnametag.cpp @@ -373,6 +383,7 @@ set(viewer_SOURCE_FILES llinventorygallerymenu.cpp llinventoryicon.cpp llinventoryitemslist.cpp + llinventorylistener.cpp llinventorylistitem.cpp llinventorymodel.cpp llinventorymodelbackgroundfetch.cpp @@ -397,6 +408,7 @@ set(viewer_SOURCE_FILES llmaniprotate.cpp llmanipscale.cpp llmaniptranslate.cpp + llfloatermarketplace.cpp llmarketplacefunctions.cpp llmarketplacenotifications.cpp llmaterialeditor.cpp @@ -439,11 +451,20 @@ set(viewer_SOURCE_FILES llpanelblockedlist.cpp llpanelclassified.cpp llpanelcontents.cpp + llpaneldirbrowser.cpp + llpaneldirclassified.cpp + llpaneldirevents.cpp + llpaneldirgroups.cpp + llpaneldirland.cpp + llpaneldirpeople.cpp + llpaneldirplaces.cpp + llpaneldirweb.cpp llpaneleditsky.cpp llpaneleditwater.cpp llpaneleditwearable.cpp llpanelemojicomplete.cpp llpanelenvironment.cpp + llpaneleventinfo.cpp llpanelexperiencelisteditor.cpp llpanelexperiencelog.cpp llpanelexperiencepicker.cpp @@ -724,7 +745,6 @@ set(viewer_SOURCE_FILES llvovolume.cpp llvowater.cpp llvowlsky.cpp - llwatchdog.cpp llwearableitemslist.cpp llwearablelist.cpp llweb.cpp @@ -741,11 +761,16 @@ set(viewer_SOURCE_FILES llxmlrpctransaction.cpp noise.cpp pipeline.cpp + rlvactions.cpp + rlvcommon.cpp + rlvfloaters.cpp + rlvhelper.cpp + rlvhandler.cpp ) -if (CMAKE_SYSTEM_NAME MATCHES FreeBSD) +if (CMAKE_SYSTEM_NAME MATCHES FreeBSD OR ($ENV{MSYSTEM_CARCH} MATCHES aarch64) OR (${LINUX_DISTRO} MATCHES debian AND CMAKE_SYSTEM_PROCESSOR MATCHES aarch64)) list(REMOVE_ITEM viewer_SOURCE_FILES llvoicewebrtc.cpp) -endif (CMAKE_SYSTEM_NAME MATCHES FreeBSD) +endif () set(VIEWER_BINARY_NAME "secondlife-bin" CACHE STRING "The name of the viewer executable to create.") @@ -760,6 +785,7 @@ set(viewer_HEADER_FILES gltf/buffer_util.h gltf/primitive.h gltf/animation.h + gltf/llgltfloader.h llaccountingcost.h llaccountingcostmanager.h llaisapi.h @@ -777,6 +803,7 @@ set(viewer_HEADER_FILES llanimstatelabels.h llappcorehttp.h llappearance.h + llappearancelistener.h llappearancemgr.h llappviewer.h llappviewerlistener.h @@ -862,11 +889,11 @@ set(viewer_HEADER_FILES llflexibleobject.h llfloater360capture.h llfloaterabout.h + llfloateravatarwelcomepack.h llfloaterbvhpreview.h llfloateraddpaymentmethod.h llfloaterauction.h llfloaterautoreplacesettings.h - llfloateravatar.h llfloateravatarpicker.h llfloateravatarrendersettings.h llfloateravatartextures.h @@ -884,6 +911,7 @@ set(viewer_HEADER_FILES llfloaterbuyland.h llfloatercamerapresets.h llfloaterchangeitemthumbnail.h + llfloaterchatmentionpicker.h llfloatercamera.h llfloaterchatvoicevolume.h llfloaterclassified.h @@ -893,6 +921,7 @@ set(viewer_HEADER_FILES llfloatercreatelandmark.h llfloaterdeleteprefpreset.h llfloaterdestinations.h + llfloaterdirectory.h llfloaterdisplayname.h llfloatereditenvironmentbase.h llfloatereditextdaycycle.h @@ -917,7 +946,6 @@ set(viewer_HEADER_FILES llfloaterhelpbrowser.h llfloaterhoverheight.h mpfloatertuning.h - fsfloatersearch.h llfloaterhowto.h llfloaterhud.h llfloaterimagepreview.h @@ -937,6 +965,7 @@ set(viewer_HEADER_FILES llfloaterlinkreplace.h llfloaterloadprefpreset.h llfloatermap.h + llfloatermarketplace.h llfloatermarketplacelistings.h llfloatermediasettings.h llfloatermemleak.h @@ -981,6 +1010,7 @@ set(viewer_HEADER_FILES llfloatersettingscolor.h llfloatersettingsdebug.h llfloatersidepanelcontainer.h + llfloaterslapptest.h llfloatersnapshot.h llfloatersounddevices.h llfloaterspellchecksettings.h @@ -1024,6 +1054,7 @@ set(viewer_HEADER_FILES llhudeffectpointat.h llhudeffecttrail.h llhudeffectblob.h + llhudeffectresetskeleton.h llhudicon.h llhudmanager.h llhudnametag.h @@ -1048,6 +1079,7 @@ set(viewer_HEADER_FILES llinventorygallerymenu.h llinventoryicon.h llinventoryitemslist.h + llinventorylistener.h llinventorylistitem.h llinventorymodel.h llinventorymodelbackgroundfetch.h @@ -1105,11 +1137,20 @@ set(viewer_HEADER_FILES llpanelblockedlist.h llpanelclassified.h llpanelcontents.h + llpaneldirbrowser.h + llpaneldirclassified.h + llpaneldirevents.h + llpaneldirgroups.h + llpaneldirland.h + llpaneldirpeople.h + llpaneldirplaces.h + llpaneldirweb.h llpaneleditsky.h llpaneleditwater.h llpaneleditwearable.h llpanelemojicomplete.h llpanelenvironment.h + llpaneleventinfo.h llpanelexperiencelisteditor.h llpanelexperiencelog.h llpanelexperiencepicker.h @@ -1391,7 +1432,6 @@ set(viewer_HEADER_FILES llvovolume.h llvowater.h llvowlsky.h - llwatchdog.h llwearableitemslist.h llwearablelist.h llweb.h @@ -1408,6 +1448,12 @@ set(viewer_HEADER_FILES llxmlrpctransaction.h noise.h pipeline.h + rlvdefines.h + rlvactions.h + rlvcommon.h + rlvfloaters.h + rlvhelper.h + rlvhandler.h roles_constants.h VertexCache.h VorbisFramework.h @@ -1424,7 +1470,7 @@ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt" "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}\n") set_source_files_properties( - llversioninfo.cpp tests/llversioninfo_test.cpp + llversioninfo.cpp tests/llversioninfo_test.cpp PROPERTIES COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" # see BuildVersion.cmake ) @@ -1436,11 +1482,24 @@ if (DARWIN) LIST(APPEND viewer_SOURCE_FILES llfilepicker_mac.mm) LIST(APPEND viewer_HEADER_FILES llfilepicker_mac.h) + set_source_files_properties( + llappviewermacosx-objc.mm + PROPERTIES + SKIP_PRECOMPILE_HEADERS TRUE + ) + + set_source_files_properties( + llfilepicker_mac.mm + PROPERTIES + SKIP_PRECOMPILE_HEADERS TRUE + ) + # This should be compiled with the viewer. LIST(APPEND viewer_SOURCE_FILES llappdelegate-objc.mm) set_source_files_properties( llappdelegate-objc.mm PROPERTIES + SKIP_PRECOMPILE_HEADERS TRUE COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" # BugsplatMac is a module, imported with @import. That language feature # demands these -f switches. @@ -1448,14 +1507,14 @@ if (DARWIN) # pointer variables. As of 2019-06-26, the BugsplatMac version we're using # does not yet do so in its own header files. This -W flag prevents fatal # warnings. - COMPILE_FLAGS "-fmodules -fcxx-modules -Wno-nullability-completeness" + COMPILE_FLAGS "-fmodules -fcxx-modules -Wno-nullability-completeness -std=c++17" ) # Add resource files to the project. set(viewer_RESOURCE_FILES secondlife.icns Info-SecondLife.plist - SecondLife.xib/ + SecondLife.xib # CMake doesn't seem to support Xcode language variants well just yet English.lproj/InfoPlist.strings English.lproj/language.txt @@ -1468,18 +1527,20 @@ if (DARWIN) list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES}) endif (DARWIN) -if (USESYSTEMLIBS AND NOT DARWIN) +if (NOT (DARWIN OR WINDOWS)) LIST(APPEND viewer_SOURCE_FILES llappviewerlinux.cpp) set_source_files_properties( llappviewerlinux.cpp PROPERTIES COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" + COMPILE_FLAGS "-DAPP_PLUGIN_DIR=\\\"${INSTALL_LIBRARY_DIR}\\\"" ) - if (NOT CMAKE_CXX_COMPILER_ID MATCHES "AppleClang") + #LIST(APPEND viewer_SOURCE_FILES llappviewerlinux_api_dbus.cpp) + if (NOT CMAKE_CXX_COMPILER_ID MATCHES AppleClang) SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed") endif () -endif (USESYSTEMLIBS AND NOT DARWIN) +endif () if (WINDOWS) @@ -1567,6 +1628,7 @@ if (WINDOWS) res-sdl/ll_icon.BMP res/ll_icon.BMP res/ll_icon.ico + res/ll_icon_small.ico res/resource.h res/toolpickobject.cur res/toolpickobject2.cur @@ -1626,7 +1688,7 @@ endif (WINDOWS) file(GLOB_RECURSE viewer_XUI_FILES LIST_DIRECTORIES FALSE ${CMAKE_CURRENT_SOURCE_DIR}/skins/*.xml) source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR}/skins PREFIX "XUI Files" FILES ${viewer_XUI_FILES}) -set_source_files_properties(${viewer_XUI_FILES} +set_source_files_properties(${viewer_XUI_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) list(APPEND viewer_SOURCE_FILES ${viewer_XUI_FILES}) @@ -1634,7 +1696,7 @@ list(APPEND viewer_SOURCE_FILES ${viewer_XUI_FILES}) file(GLOB_RECURSE viewer_SHADER_FILES LIST_DIRECTORIES FALSE ${CMAKE_CURRENT_SOURCE_DIR}/app_settings/shaders/*.glsl) source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR}/app_settings/shaders PREFIX "Shaders" FILES ${viewer_SHADER_FILES}) -set_source_files_properties(${viewer_SHADER_FILES} +set_source_files_properties(${viewer_SHADER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) list(APPEND viewer_SOURCE_FILES ${viewer_SHADER_FILES}) @@ -1659,17 +1721,13 @@ set(viewer_APPSETTINGS_FILES app_settings/toolbars.xml app_settings/trees.xml app_settings/viewerart.xml - ${CMAKE_SOURCE_DIR}/../etc/message.xml + app_settings/message.xml ${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg - packages-info.txt + #packages-info.txt featuretable.txt featuretable_mac.txt ) -if (USESYSTEMLIBS) - list(REMOVE_ITEM viewer_APPSETTINGS_FILES packages-info.txt) -endif () - source_group("App Settings" FILES ${viewer_APPSETTINGS_FILES}) set_source_files_properties(${viewer_APPSETTINGS_FILES} @@ -1702,10 +1760,6 @@ if (WINDOWS) list(APPEND viewer_SOURCE_FILES ${viewer_INSTALLER_FILES}) endif (WINDOWS) -if (HAVOK OR HAVOK_TPV) - set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_HAVOK") -endif (HAVOK OR HAVOK_TPV) - if( DEFINED LLSTARTUP_COMPILE_FLAGS ) # progress view disables/enables icons based on available packages set_source_files_properties(llprogressview.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}") @@ -1729,6 +1783,101 @@ list(APPEND EVENT_HOST_SCRIPTS ${EVENT_HOST_SCRIPT_GLOB_LIST}) set(PACKAGE ON CACHE BOOL "Add a package target that builds an installer package.") +if (PACKAGE) + set(CPACK_PACKAGE_NAME ${VIEWER_BINARY_NAME} + CACHE STRING "Viewer binary name.") + set(CPACK_PACKAGE_VERSION ${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION} + CACHE STRING "Viewer major.minor.patch.revision versions.") + set(VIEWER_PACKAGE_COMMENT "A fork of the Second Life viewer") + set(VIEWER_PACKAGE_DESCRIPTION "An entrance to virtual empires in only megabytes. A shelter for the metaverse refugees, especially those from less supported operating systems.") + string(TOLOWER ${VIEWER_BINARY_NAME} DOMAIN_NAME) + set(VIEWER_PACKAGE_DOMAIN_NAME ${DOMAIN_NAME}.net) +endif () + +if (CMAKE_COMMAND MATCHES /usr/bin/cmake) + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} POST_BUILD + COMMAND sed + ARGS -e '/Linden Lab.*/d' ${CMAKE_HOME_DIRECTORY}/../doc/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/following residents.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/along with.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/^$$/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/\t.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/^ .*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sort + ARGS -R contributions.txt -o ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND paste + ARGS -s -d, ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt + COMMAND sed + ARGS -i 's/,/, /g' ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt + ) +elseif (WINDOWS) + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} POST_BUILD + COMMAND sed + ARGS -e '/Linden Lab.*/d' ${CMAKE_HOME_DIRECTORY}/../doc/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/following residents.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/along with.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/^$$/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/\t.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/^ B.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/^ C.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/^ M.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/^ O.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/^ S.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/^ s.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '/^ V.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sort + ARGS -R contributions.txt -o ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND paste + ARGS -s -d, ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt + COMMAND sed + ARGS -i 's/,/, /g' ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt + ) +else () + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} POST_BUILD + COMMAND sed + ARGS -e '/Linden Lab.*/d' ${CMAKE_HOME_DIRECTORY}/../doc/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '' -e '/following residents.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '' -e '/along with.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '' -e '/^$$/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '' -e '/\t.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sed + ARGS -i '' -e '/^ .*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sort + ARGS -R contributions.txt -o ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND paste + ARGS -s -d, ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt + COMMAND sed + ARGS -i '' -e 's/,/, /g' ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt + ) +endif () + +if(USE_PRECOMPILED_HEADERS) + target_precompile_headers( ${VIEWER_BINARY_NAME} PRIVATE llviewerprecompiledheaders.h ) +endif(USE_PRECOMPILED_HEADERS) + if (WINDOWS) set_target_properties(${VIEWER_BINARY_NAME} PROPERTIES @@ -1739,9 +1888,7 @@ if (WINDOWS) ) target_compile_options(${VIEWER_BINARY_NAME} PRIVATE /bigobj) - if(USE_PRECOMPILED_HEADERS) - target_precompile_headers( ${VIEWER_BINARY_NAME} PRIVATE llviewerprecompiledheaders.h ) - endif(USE_PRECOMPILED_HEADERS) + if (FALSE) # If adding a file to viewer_manifest.py in the WindowsManifest.construct() method, be sure to add the dependency # here. @@ -1756,8 +1903,8 @@ if (WINDOWS) # And of course it's straightforward to read a text file in Python. set(COPY_INPUT_DEPENDENCIES - # The following commented dependencies are determined at variably at build time. Can't do this here. - ${CMAKE_SOURCE_DIR}/../etc/message.xml + # The following commented dependencies are determined variably at build time. Can't do this here. + app_settings/message.xml ${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg ${SHARED_LIB_STAGING_DIR}/openjp2.dll ${SHARED_LIB_STAGING_DIR}/llwebrtc.dll @@ -1786,6 +1933,12 @@ if (WINDOWS) ) endif (ADDRESS_SIZE EQUAL 64) + if (TARGET ll::discord_sdk) + list(APPEND COPY_INPUT_DEPENDENCIES + ${SHARED_LIB_STAGING_DIR}/discord_partner_sdk.dll + ) + endif () + if (TARGET ll::openal) list(APPEND COPY_INPUT_DEPENDENCIES ${SHARED_LIB_STAGING_DIR}/OpenAL32.dll @@ -1802,6 +1955,7 @@ if (WINDOWS) --arch=${ARCH} --artwork=${ARTWORK_DIR} "--bugsplat=${BUGSPLAT_DB}" + "--discord=${USE_DISCORD}" "--openal=${USE_OPENAL}" "--tracy=${USE_TRACY}" --build=${CMAKE_CURRENT_BINARY_DIR} @@ -1840,6 +1994,7 @@ if (WINDOWS) --arch=${ARCH} --artwork=${ARTWORK_DIR} "--bugsplat=${BUGSPLAT_DB}" + "--discord=${USE_DISCORD}" "--openal=${USE_OPENAL}" "--tracy=${USE_TRACY}" --build=${CMAKE_CURRENT_BINARY_DIR} @@ -1870,6 +2025,8 @@ if (WINDOWS) add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts) endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) + endif (FALSE) + add_dependencies(${VIEWER_BINARY_NAME} SLPlugin) # sets the 'working directory' for debugging from visual studio. @@ -1882,6 +2039,17 @@ if (WINDOWS) endif (NOT UNATTENDED) if (PACKAGE) + + set(CPACK_NSIS_DISPLAY_NAME ${VIEWER_BINARY_NAME}) + set(CPACK_NSIS_PACKAGE_NAME ${VIEWER_BINARY_NAME}) + set(CPACK_NSIS_HELP_LINK https://${VIEWER_PACKAGE_DOMAIN_NAME}) + set(CPACK_NSIS_URL_INFO_ABOUT https://${VIEWER_PACKAGE_DOMAIN_NAME}) + set(CPACK_NSIS_CONTACT $ENV{USERNAME}@${VIEWER_PACKAGE_DOMAIN_NAME}) + set(CPACK_NSIS_WELCOME_TITLE "Welcome to ${VIEWER_BINARY_NAME}!") + set(CPACK_NSIS_MENU_LINKS ${VIEWER_BINARY_NAME}.exe "${VIEWER_BINARY_NAME} Viewer") + set(CPACK_PACKAGE_INSTALL_DIRECTORY ${VIEWER_BINARY_NAME}) + + if (FALSE) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.xz COMMAND ${PYTHON_EXECUTABLE} @@ -1904,6 +2072,7 @@ if (WINDOWS) --arch=${ARCH} --artwork=${ARTWORK_DIR} "--bugsplat=${BUGSPLAT_DB}" + "--discord=${USE_DISCORD}" "--openal=${USE_OPENAL}" "--tracy=${USE_TRACY}" --build=${CMAKE_CURRENT_BINARY_DIR} @@ -1928,13 +2097,40 @@ if (WINDOWS) # temporarily disable packaging of event_host until hg subrepos get # sorted out on the parabuild cluster... #${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.xz) + endif (FALSE) endif (PACKAGE) elseif (DARWIN) set_target_properties(${VIEWER_BINARY_NAME} PROPERTIES - LINK_FLAGS_RELEASE "${LINK_FLAGS_RELEASE} -Xlinker -dead_strip -Xlinker -map -Xlinker ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_BINARY_NAME}.MAP" + RESOURCE SecondLife.xib + LINK_FLAGS_RELEASE "${LINK_FLAGS_RELEASE} -Xlinker -dead_strip" ) + if(HAVOK) + set_target_properties(${VIEWER_BINARY_NAME} + PROPERTIES + # arch specific flags for universal builds: https://stackoverflow.com/a/77942065 + XCODE_ATTRIBUTE_OTHER_CFLAGS[arch=x86_64] "$(inherited) -DLLPHYSICSEXTENSIONS_USE_FULL -DLL_HAVOK=1" + XCODE_ATTRIBUTE_OTHER_CFLAGS[arch=arm64] "$(inherited) -DLLPHYSICSEXTENSIONS_USE_STUB" + # only generate the .MAP file for llphysicsextensions_tpv on x86_64 + XCODE_ATTRIBUTE_OTHER_LDFLAGS[arch=x86_64] "$(inherited) -L${CMAKE_CURRENT_BINARY_DIR}/llphysicsextensions/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,${CMAKE_CFG_INTDIR}>/ -lllphysicsextensions -Xlinker -map -Xlinker ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_BINARY_NAME}.MAP" + XCODE_ATTRIBUTE_OTHER_LDFLAGS[arch=arm64] "$(inherited) -L${CMAKE_BINARY_DIR}/llphysicsextensionsos/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,${CMAKE_CFG_INTDIR}>/ -lllphysicsextensionsos" + ) + add_dependencies(${VIEWER_BINARY_NAME} llphysicsextensionsos) + elseif(HAVOK_TPV) + set_target_properties(${VIEWER_BINARY_NAME} + PROPERTIES + # arch specific flags for universal builds: https://stackoverflow.com/a/77942065 + XCODE_ATTRIBUTE_OTHER_CFLAGS[arch=x86_64] "$(inherited) -DLLPHYSICSEXTENSIONS_USE_FULL -DLL_HAVOK=1" + XCODE_ATTRIBUTE_OTHER_CFLAGS[arch=arm64] "$(inherited) -DLLPHYSICSEXTENSIONS_USE_STUB" + # only generate the .MAP file for llphysicsextensions_tpv on x86_64 + XCODE_ATTRIBUTE_OTHER_LDFLAGS[arch=x86_64] "$(inherited) -L${ARCH_PREBUILT_DIRS}/ -lllphysicsextensions_tpv" + XCODE_ATTRIBUTE_OTHER_LDFLAGS[arch=arm64] "$(inherited) -L${CMAKE_BINARY_DIR}/llphysicsextensionsos/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,${CMAKE_CFG_INTDIR}>/ -lllphysicsextensionsos" + ) + add_dependencies(${VIEWER_BINARY_NAME} llphysicsextensionsos) + else() + target_link_libraries(${VIEWER_BINARY_NAME} llphysicsextensionsos) + endif() else (WINDOWS) # Linux set_target_properties(${VIEWER_BINARY_NAME} @@ -1956,7 +2152,7 @@ endif (WINDOWS) # one of these being libz where you can find four or more versions in play # at once. On Linux, libz can be found at link and run time via a number # of paths: -# +# # => -lfreetype # => libz.so.1 (on install machine, not build) # => -lSDL @@ -1994,20 +2190,25 @@ target_link_libraries(${VIEWER_BINARY_NAME} llappearance ${LLPHYSICSEXTENSIONS_LIBRARIES} ll::bugsplat + ll::ndof ll::tracy ll::openxr ) -if (NOT CMAKE_SYSTEM_NAME MATCHES FreeBSD) +if (NOT (CMAKE_SYSTEM_NAME MATCHES FreeBSD OR ($ENV{MSYSTEM_CARCH} MATCHES aarch64) OR (${LINUX_DISTRO} MATCHES debian AND CMAKE_SYSTEM_PROCESSOR MATCHES aarch64))) target_link_libraries(${VIEWER_BINARY_NAME} llwebrtc ) -endif (NOT CMAKE_SYSTEM_NAME MATCHES FreeBSD) +endif () if (ENABLE_MEDIA_PLUGINS) target_link_libraries(${VIEWER_BINARY_NAME} ll::libvlc ) if (DARWIN OR LINUX) target_link_libraries(${VIEWER_BINARY_NAME} ll::cef ) - endif (DARWIN OR LINUX) -endif (ENABLE_MEDIA_PLUGINS) + endif () +endif () + +if (USE_DISCORD) + target_link_libraries(${VIEWER_BINARY_NAME} ll::discord_sdk ) +endif () if( TARGET ll::intel_memops ) target_link_libraries(${VIEWER_BINARY_NAME} ll::intel_memops ) @@ -2017,18 +2218,23 @@ if( TARGET ll::nvapi ) target_link_libraries(${VIEWER_BINARY_NAME} ll::nvapi ) endif() +if ( TARGET llconvexdecomposition ) + target_link_libraries(${VIEWER_BINARY_NAME} llconvexdecomposition ) +endif () + set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH "Path to artwork files.") -set_source_files_properties(llinventorygallery.cpp PROPERTIES COMPILE_FLAGS - -Wno-unused-but-set-variable) -if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") +if (NOT WINDOWS) + set_source_files_properties(llinventorygallery.cpp PROPERTIES COMPILE_FLAGS -Wno-unused-but-set-variable) +endif () +if (CMAKE_CXX_COMPILER_ID MATCHES Clang) set_source_files_properties(llappviewerlinux.cpp PROPERTIES COMPILE_FLAGS -Wno-dangling-gsl ) set_source_files_properties(llviewerstats.cpp PROPERTIES COMPILE_FLAGS -Wno-unused-value) -elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU") +elseif (CMAKE_CXX_COMPILER_ID MATCHES GNU) set_source_files_properties( llface.cpp llhttpretrypolicy.cpp @@ -2042,6 +2248,23 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU") COMPILE_FLAGS -Wno-uninitialized) set_source_files_properties(llviewerstats.cpp PROPERTIES COMPILE_FLAGS -Wno-unused-value) + set_source_files_properties( + gltf/llgltfloader.cpp + llaisapi.cpp + llconversationlog.cpp + llconversationmodel.cpp + lleventnotifier.cpp + llfloateravatarrendersettings.cpp + llfloatereditextdaycycle.cpp + llfloaternewfeaturenotification.cpp + llinventoryfunctions.cpp + llnotificationlistitem.cpp + llpanelenvironment.cpp + llpanelgroupnotices.cpp + llpanelteleporthistory.cpp + lltoastgroupnotifypanel.cpp + llvoavatar.cpp + PROPERTIES COMPILE_FLAGS -Wno-stringop-overflow) set_source_files_properties(llurl.cpp PROPERTIES COMPILE_FLAGS -Wno-stringop-truncation) set_source_files_properties( @@ -2058,6 +2281,8 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU") gltf/animation.cpp gltf/primitive.cpp PROPERTIES COMPILE_FLAGS -Wno-unused-function) + set_source_files_properties(llmutelist.cpp + PROPERTIES COMPILE_FLAGS -Wno-free-nonheap-object) endif () message("Copying fonts") @@ -2078,104 +2303,12 @@ foreach(elem ${country_codes}) set(emoji_mapping_src_file "${emoji_mapping_src_folder}/${elem}/emoji_characters.xml") set(emoji_mapping_dst_file - "${emoji_mapping_dst_folder}/${elem}/emoji_characters.xml") + "${emoji_mapping_dst_folder}/${elem}/emoji_characters.xml") configure_file(${emoji_mapping_src_file} ${emoji_mapping_dst_file} COPYONLY) endforeach() -if (PACKAGE AND USESYSTEMLIBS) - set(CPACK_PACKAGE_NAME ${VIEWER_BINARY_NAME} - CACHE STRING "Viewer binary name.") - set(CPACK_PACKAGE_VERSION ${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION} - CACHE STRING "Viewer major.minor.patch.revision versions.") - set(VIEWER_PACKAGE_COMMENT - "A fork of the Second Life viewer" - ) - set(VIEWER_PACKAGE_DESCRIPTION - "An entrance to virtual empires in only megabytes. A shelter for the metaverse refugees, especially those from less supported operating systems." - ) - set(VIEWER_PACKAGE_DOMAIN_NAME - ${VIEWER_BINARY_NAME}.net - ) -endif (PACKAGE AND USESYSTEMLIBS) - if (LINUX) - if (USESYSTEMLIBS) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_SYSROOT}/usr/bin/sed - ARGS -e '/Linden Lab.*/d' ${CMAKE_HOME_DIRECTORY}/../doc/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND ${CMAKE_SYSROOT}/usr/bin/sed - ARGS -i ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt -e '/following residents.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND ${CMAKE_SYSROOT}/usr/bin/sed - ARGS -i ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt -e '/along with.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND ${CMAKE_SYSROOT}/usr/bin/sed - ARGS -i ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt -e '/^$$/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND ${CMAKE_SYSROOT}/usr/bin/sed - ARGS -i ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt -e '/\t.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND ${CMAKE_SYSROOT}/usr/bin/sed - ARGS -i ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt -e '/^ .*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND sort - ARGS -R contributions.txt -o ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND paste - ARGS -s -d, ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt - COMMAND ${CMAKE_SYSROOT}/usr/bin/sed - ARGS -i ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt -e 's/,/, /g' ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt - ) - if (PACKAGE) - if (${LINUX_DISTRO} MATCHES debian OR ${LINUX_DISTRO} MATCHES ubuntu) - set(CPACK_BINARY_DEB ON CACHE BOOL "Able to package Debian DEB.") - set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE - amd64 - CACHE STRING "Debian package architecture.") - set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${VIEWER_PACKAGE_COMMENT} - CACHE STRING "Debian package description.") - set(CPACK_DEBIAN_PACKAGE_MAINTAINER - $ENV{USER}@${VIEWER_PACKAGE_DOMAIN_NAME} - CACHE STRING "Debian package maintainer.") - set(CPACK_DEBIAN_PACKAGE_SECTION net - CACHE STRING "Debian package section.") - if (${LINUX_DISTRO} MATCHES debian) - set(CPACK_DEBIAN_PACKAGE_DEPENDS - "libalut0, libaprutil1, libboost-fiber1.81.0, libboost-filesystem1.81.0, libboost-program-options1.81.0, libboost-regex1.81.0, libboost-thread1.81.0, libboost-url1.81.0, libexpat1, libfltk1.3, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1, libnghttp2-14, libsdl2-2.0-0, liburiparser1, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base" - CACHE STRING "Debian package dependencies.") - elseif (${LINUX_DISTRO} MATCHES ubuntu) - set(CPACK_DEBIAN_PACKAGE_DEPENDS - "libaprutil1t64, libboost-fiber1.83.0, libboost-filesystem1.83.0, libboost-program-options1.83.0, libboost-regex1.83.0, libboost-thread1.83.0, libboost-url1.83.0, libexpat1, libfltk1.3t64, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1, libnghttp2-14, libsdl2-2.0-0, liburiparser1, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base" - CACHE STRING "Debian package dependencies.") - endif (${LINUX_DISTRO} MATCHES debian) - elseif (${LINUX_DISTRO} MATCHES fedora OR (${LINUX_DISTRO} MATCHES opensuse-tumbleweed)) - set(CPACK_BINARY_RPM ON CACHE BOOL "Able to package Fedora RPM.") - set(CPACK_RPM_PACKAGE_SUMMARY ${VIEWER_PACKAGE_COMMENT} - CACHE STRING "RPM package summary.") - set(CPACK_RPM_PACKAGE_ARCHITECTURE - ${CMAKE_SYSTEM_PROCESSOR} - CACHE STRING "RPM package architecture.") - set(CPACK_RPM_PACKAGE_LICENSE LGPL-2.1-only - CACHE STRING "RPM package license.") - set(CPACK_RPM_PACKAGE_VENDOR ${VIEWER_CHANNEL} - CACHE STRING "RPM package vendor.") - set(CPACK_RPM_PACKAGE_URL - https://${VIEWER_PACKAGE_DOMAIN_NAME} - CACHE STRING "RPM package URL.") - set(CPACK_RPM_PACKAGE_DESCRIPTION ${VIEWER_PACKAGE_DESCRIPTION} - CACHE STRING "RPM package description.") - if (${LINUX_DISTRO} MATCHES fedora) - set(CPACK_RPM_PACKAGE_REQUIRES - "apr-util, boost-fiber, boost-program-options, boost-regex, boost-thread, boost-url, expat, fltk, mesa-libGLU, hunspell, libnghttp2, SDL2, uriparser, vlc-libs, vlc-plugins-base, libvorbis" - CACHE STRING "RPM package requirements.") - elseif (${LINUX_DISTRO} MATCHES opensuse-tumbleweed) - set(CPACK_RPM_PACKAGE_REQUIRES - "libapr-util1-0, libboost_fiber1_87_0, libboost_program_options1_87_0, libboost_regex1_87_0, libboost_thread1_87_0, libboost_url1_87_0, libboost_url1_87_0-x86-64-v3, expat, libfltk1_3, libGLU1, libhunspell-1_7-0, libnghttp2-14, libSDL2-2_0-0, liburiparser1, libvlc5, vlc-codecs, libvorbis0" - CACHE STRING "RPM package requirements.") - endif (${LINUX_DISTRO} MATCHES fedora) - elseif (${LINUX_DISTRO} MATCHES arch) - configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/PKGBUILD.in - ${CMAKE_BINARY_DIR}/PKGBUILD - ) - endif (${LINUX_DISTRO} MATCHES debian OR ${LINUX_DISTRO} MATCHES ubuntu) - endif (PACKAGE) - else (USESYSTEMLIBS) + if (FALSE) set(product SecondLife-${ARCH}-${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}) # These are the generated targets that are copied to package/ @@ -2198,6 +2331,7 @@ if (LINUX) --arch=${ARCH} --artwork=${ARTWORK_DIR} "--bugsplat=${BUGSPLAT_DB}" + "--discord=${USE_DISCORD}" "--openal=${USE_OPENAL}" "--tracy=${USE_TRACY}" --build=${CMAKE_CURRENT_BINARY_DIR} @@ -2213,10 +2347,64 @@ if (LINUX) ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ${COPY_INPUT_DEPENDENCIES} ) + endif (FALSE) if (PACKAGE) + if (${LINUX_DISTRO} MATCHES arch) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/PKGBUILD.in + ${CMAKE_BINARY_DIR}/PKGBUILD + ) + elseif (${LINUX_DISTRO} MATCHES debian OR ${LINUX_DISTRO} MATCHES ubuntu) + set(CPACK_BINARY_DEB ON CACHE BOOL "Able to package Debian DEB.") + if (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64) + set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE arm64 CACHE STRING "Debian package architecture.") + elseif (CMAKE_SYSTEM_PROCESSOR MATCHES x86_64) + set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE amd64 CACHE STRING "Debian package architecture.") + endif () + set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${VIEWER_PACKAGE_COMMENT} + CACHE STRING "Debian package description.") + set(CPACK_DEBIAN_PACKAGE_MAINTAINER $ENV{USER}@${VIEWER_PACKAGE_DOMAIN_NAME} + CACHE STRING "Debian package maintainer.") + set(CPACK_DEBIAN_PACKAGE_SECTION net + CACHE STRING "Debian package section.") + if (${LINUX_DISTRO} MATCHES debian) + if (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64) + set(CPACK_DEBIAN_PACKAGE_DEPENDS "libalut0, libaprutil1t64, libboost-fiber1.83.0, libboost-filesystem1.83.0, libboost-program-options1.83.0, libboost-regex1.83.0, libboost-thread1.83.0, libboost-url1.83.0, libexpat1, libfltk1.4, libgles-dev, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1t64, libnghttp2-14, libnspr4, libnss3, libopenjp2-7, libsdl2-2.0-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base" + CACHE STRING "Debian package dependencies.") + else () + set(CPACK_DEBIAN_PACKAGE_DEPENDS "libaprutil1t64, libboost-fiber1.83.0, libboost-filesystem1.83.0, libboost-program-options1.83.0, libboost-regex1.83.0, libboost-thread1.83.0, libboost-url1.83.0, libexpat1, libfltk1.4, libgles-dev, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1t64, libnghttp2-14, libnspr4, libnss3, libopenjp2-7, libsdl2-2.0-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base" + CACHE STRING "Debian package dependencies.") + endif () + else () + set(CPACK_DEBIAN_PACKAGE_DEPENDS "libaprutil1t64, libboost-fiber1.83.0, libboost-filesystem1.83.0, libboost-program-options1.83.0, libboost-regex1.83.0, libboost-thread1.83.0, libboost-url1.83.0, libexpat1, libfltk1.3t64, libgles-dev, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1t64, libnghttp2-14, libnspr4, libnss3, libsdl2-2.0-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base" + CACHE STRING "Debian package dependencies.") + endif () + elseif (${LINUX_DISTRO} MATCHES fedora OR (${LINUX_DISTRO} MATCHES opensuse-tumbleweed)) + set(CPACK_BINARY_RPM ON CACHE BOOL "Able to package Fedora RPM.") + set(CPACK_RPM_PACKAGE_SUMMARY ${VIEWER_PACKAGE_COMMENT} + CACHE STRING "RPM package summary.") + set(CPACK_RPM_PACKAGE_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR} + CACHE STRING "RPM package architecture.") + set(CPACK_RPM_PACKAGE_LICENSE LGPL-2.1-only + CACHE STRING "RPM package license.") + set(CPACK_RPM_PACKAGE_VENDOR ${VIEWER_CHANNEL} + CACHE STRING "RPM package vendor.") + set(CPACK_RPM_PACKAGE_URL https://${VIEWER_PACKAGE_DOMAIN_NAME} + CACHE STRING "RPM package URL.") + set(CPACK_RPM_PACKAGE_DESCRIPTION ${VIEWER_PACKAGE_DESCRIPTION} + CACHE STRING "RPM package description.") + if (${LINUX_DISTRO} MATCHES fedora) + set(CPACK_RPM_PACKAGE_REQUIRES "apr-util, boost-fiber, boost-program-options, boost-regex, boost-thread, boost-url, expat, fltk, mesa-libGLU, hunspell, libnghttp2, openjpeg2, SDL2, vlc-libs, vlc-plugins-base, libvorbis" + CACHE STRING "RPM package requirements.") + else () + set(CPACK_RPM_PACKAGE_REQUIRES "libapr-util1-0, libboost_fiber1_90_0, libboost_program_options1_90_0, libboost_regex1_90_0, libboost_thread1_90_0, libboost_url1_90_0, libboost_url1_90_0-x86-64-v3, libpng16-16 expat, libfltk1_3, libGLU1, libhunspell-1_7-0, libnghttp2-14, openjpeg2, libSDL2-2_0-0, libvlc5, libvorbis0" + CACHE STRING "RPM package requirements.") + endif () + endif () endif (PACKAGE) + if (FALSE) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched COMMAND ${PYTHON_EXECUTABLE} @@ -2226,6 +2414,7 @@ if (LINUX) --arch=${ARCH} --artwork=${ARTWORK_DIR} "--bugsplat=${BUGSPLAT_DB}" + "--discord=${USE_DISCORD}" "--openal=${USE_OPENAL}" "--tracy=${USE_TRACY}" --build=${CMAKE_CURRENT_BINARY_DIR} @@ -2250,52 +2439,33 @@ if (LINUX) add_dependencies(llpackage copy_l_viewer_manifest) check_message_template(llpackage) endif (PACKAGE) - endif (USESYSTEMLIBS) -elseif (USESYSTEMLIBS) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND sed - ARGS -e '/Linden Lab.*/d' ${CMAKE_HOME_DIRECTORY}/../doc/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND sed - ARGS -i '' -e '/following residents.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND sed - ARGS -i '' -e '/along with.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND sed - ARGS -i '' -e '/^$$/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND sed - ARGS -i '' -e '/\t.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND sed - ARGS -i '' -e '/^ .*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND sort - ARGS -R contributions.txt -o ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND paste - ARGS -s -d, ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt - COMMAND sed - ARGS -i '' -e 's/,/, /g' ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt - ) - if (CMAKE_SYSTEM_NAME MATCHES FreeBSD AND PACKAGE) - set(CPACK_BINARY_FREEBSD ON CACHE BOOL "Able to package FreeBSD PKG.") - set(CPACK_FREEBSD_PACKAGE_COMMENT ${VIEWER_PACKAGE_COMMENT} - CACHE STRING "FreeBSD package comment.") - set(CPACK_FREEBSD_PACKAGE_DESCRIPTION ${VIEWER_PACKAGE_DESCRIPTION} - CACHE STRING "FreeBSD package description.") - set(CPACK_FREEBSD_PACKAGE_WWW - https://${VIEWER_PACKAGE_DOMAIN_NAME} - CACHE STRING "FreeBSD package WWW.") - set(CPACK_FREEBSD_PACKAGE_LICENSE LGPL21 - CACHE STRING "FreeBSD package license.") - set(CPACK_FREEBSD_PACKAGE_MAINTAINER - $ENV{USER}@${VIEWER_PACKAGE_DOMAIN_NAME} - CACHE STRING "FreeBSD package maintainer.") - set(CPACK_FREEBSD_PACKAGE_ORIGIN net/${VIEWER_BINARY_NAME} - CACHE STRING "FreeBSD package origin.") - set(CPACK_FREEBSD_PACKAGE_DEPS - "audio/freealut;graphics/libGLU;textproc/hunspell;misc/meshoptimizer;archivers/minizip;www/libnghttp2;net/uriparser;multimedia/vlc;audio/libvorbis" - CACHE STRING "FreeBSD package dependencies.") - endif (CMAKE_SYSTEM_NAME MATCHES FreeBSD AND PACKAGE) + endif (FALSE) + +elseif (CMAKE_SYSTEM_NAME MATCHES FreeBSD AND PACKAGE) + set(CPACK_BINARY_FREEBSD ON CACHE BOOL "Able to package FreeBSD PKG.") + set(CPACK_FREEBSD_PACKAGE_COMMENT ${VIEWER_PACKAGE_COMMENT} + CACHE STRING "FreeBSD package comment.") + set(CPACK_FREEBSD_PACKAGE_DESCRIPTION ${VIEWER_PACKAGE_DESCRIPTION} + CACHE STRING "FreeBSD package description.") + set(CPACK_FREEBSD_PACKAGE_WWW https://${VIEWER_PACKAGE_DOMAIN_NAME} + CACHE STRING "FreeBSD package WWW.") + set(CPACK_FREEBSD_PACKAGE_LICENSE LGPL21 + CACHE STRING "FreeBSD package license.") + set(CPACK_FREEBSD_PACKAGE_MAINTAINER $ENV{USER}@${VIEWER_PACKAGE_DOMAIN_NAME} + CACHE STRING "FreeBSD package maintainer.") + set(CPACK_FREEBSD_PACKAGE_ORIGIN net/${VIEWER_BINARY_NAME} + CACHE STRING "FreeBSD package origin.") + set(CPACK_FREEBSD_PACKAGE_DEPS "audio/freealut;devel/apr;devel/boost-libs;x11-toolkits/fltk;textproc/hunspell;misc/meshoptimizer;archivers/minizip;www/libnghttp2;graphics/openjpeg;devel/sdl2;multimedia/vlc;audio/libvorbis" + CACHE STRING "FreeBSD package dependencies.") + endif (LINUX) if (DARWIN) + execute_process( + COMMAND ibtool --compile + ${CMAKE_CURRENT_BINARY_DIR}/SecondLife.nib + ${CMAKE_CURRENT_SOURCE_DIR}/SecondLife.xib + ) # These all get set with PROPERTIES. It's not that the property names are # magically known to CMake -- it's that these names are referenced in the # Info-SecondLife.plist file in the configure_file() directive below. @@ -2308,22 +2478,18 @@ if (DARWIN) set(MACOSX_BUNDLE_BUNDLE_NAME "Megapahit") set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}") set(MACOSX_BUNDLE_BUNDLE_VERSION "${VIEWER_SHORT_VERSION}${VIEWER_MACOSX_PHASE}${VIEWER_REVISION}") - set(MACOSX_BUNDLE_COPYRIGHT "Copyright © Megapahit 2025") + set(MACOSX_BUNDLE_COPYRIGHT "Copyright © Megapahit 2026") set(MACOSX_BUNDLE_NSMAIN_NIB_FILE "SecondLife.nib") set(MACOSX_BUNDLE_NSPRINCIPAL_CLASS "LLApplication") # https://blog.kitware.com/upcoming-in-cmake-2-8-12-osx-rpath-support/ set(CMAKE_MACOSX_RPATH 1) - + set_target_properties( ${VIEWER_BINARY_NAME} PROPERTIES OUTPUT_NAME "${product}" # From Contents/MacOS/SecondLife, look in Contents/Frameworks - INSTALL_RPATH "@loader_path/../Frameworks" - # SIGH, as of 2018-05-24 (cmake 3.11.1) the INSTALL_RPATH property simply - # does not work. Try this: - LINK_FLAGS "-rpath @loader_path/../Frameworks" MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Info-SecondLife.plist" XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${MACOSX_BUNDLE_GUI_IDENTIFIER}" MACOSX_BUNDLE TRUE @@ -2337,12 +2503,12 @@ if (DARWIN) "${VIEWER_APP_BUNDLE}/Contents/Info.plist" ) - if (USESYSTEMLIBS) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/English.lproj/InfoPlist.strings ${CMAKE_CURRENT_BINARY_DIR}/InfoPlist.strings ) - else (USESYSTEMLIBS) + + if (FALSE) add_custom_command( TARGET ${VIEWER_BINARY_NAME} POST_BUILD COMMAND ${PYTHON_EXECUTABLE} @@ -2352,6 +2518,7 @@ if (DARWIN) --arch=${ARCH} --artwork=${ARTWORK_DIR} "--bugsplat=${BUGSPLAT_DB}" + "--discord=${USE_DISCORD}" "--openal=${USE_OPENAL}" "--tracy=${USE_TRACY}" --build=${CMAKE_CURRENT_BINARY_DIR} @@ -2363,15 +2530,12 @@ if (DARWIN) --grid=${GRID} --source=${CMAKE_CURRENT_SOURCE_DIR} --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt - DEPENDS - ${VIEWER_BINARY_NAME} - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ) - endif (USESYSTEMLIBS) + endif () - if (ENABLE_MEDIA_PLUGINS) + if (ENABLE_MEDIA_PLUGINS) add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_libvlc media_plugin_cef) - endif () + endif () if (ENABLE_SIGNING) set(SIGNING_SETTING "--signature=${SIGNING_IDENTITY}") @@ -2380,26 +2544,22 @@ if (DARWIN) endif (ENABLE_SIGNING) if (PACKAGE) - if (USESYSTEMLIBS) - set(CPACK_DMG_VOLUME_NAME "${product} Installer" - CACHE STRING "Disk image volume name.") - set(CPACK_DMG_FORMAT UDRW CACHE STRING "Disk image format.") - set(CPACK_DMG_DS_STORE - ${CMAKE_CURRENT_SOURCE_DIR}/installers/darwin/release-dmg/_DS_Store - CACHE STRING "Disk image .DS_Store file.") - set(CPACK_DMG_DS_STORE_SETUP_SCRIPT - ${CMAKE_CURRENT_SOURCE_DIR}/installers/darwin/dmg-cleanup.applescript - CACHE STRING "Disk image AppleScript file.") - set(CPACK_DMG_BACKGROUND_IMAGE - ${CMAKE_CURRENT_SOURCE_DIR}/installers/darwin/release-dmg/background.jpg - CACHE STRING "Disk image background image.") - set(CPACK_BUNDLE_NAME ${product} CACHE STRING "Bundle name.") - set(CPACK_BUNDLE_PLIST ${VIEWER_APP_BUNDLE}/Contents/Info.plist - CACHE STRING "Bundle Property List file.") - set(CPACK_BUNDLE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/secondlife.icns - CACHE STRING "Bundle icon file.") + set(CPACK_DMG_VOLUME_NAME "${product} Installer" + CACHE STRING "Disk image volume name.") + set(CPACK_DMG_FORMAT UDRW CACHE STRING "Disk image format.") + set(CPACK_DMG_DS_STORE ${CMAKE_CURRENT_SOURCE_DIR}/installers/darwin/release-dmg/_DS_Store + CACHE STRING "Disk image .DS_Store file.") + set(CPACK_DMG_DS_STORE_SETUP_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/installers/darwin/dmg-cleanup.applescript + CACHE STRING "Disk image AppleScript file.") + set(CPACK_DMG_BACKGROUND_IMAGE ${CMAKE_CURRENT_SOURCE_DIR}/installers/darwin/release-dmg/background.jpg + CACHE STRING "Disk image background image.") + set(CPACK_BUNDLE_NAME ${product} CACHE STRING "Bundle name.") + set(CPACK_BUNDLE_PLIST ${VIEWER_APP_BUNDLE}/Contents/Info.plist + CACHE STRING "Bundle Property List file.") + set(CPACK_BUNDLE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/secondlife.icns + CACHE STRING "Bundle icon file.") - else (USESYSTEMLIBS) + if (FALSE) add_custom_target(llpackage ALL DEPENDS ${VIEWER_BINARY_NAME}) add_custom_command( @@ -2410,6 +2570,7 @@ if (DARWIN) --arch=${ARCH} --artwork=${ARTWORK_DIR} "--bugsplat=${BUGSPLAT_DB}" + "--discord=${USE_DISCORD}" "--openal=${USE_OPENAL}" "--tracy=${USE_TRACY}" --build=${CMAKE_CURRENT_BINARY_DIR} @@ -2422,19 +2583,17 @@ if (DARWIN) --touch=${CMAKE_CURRENT_BINARY_DIR}/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,>/.${product}.bat --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt ${SIGNING_SETTING} - DEPENDS - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ) - endif (USESYSTEMLIBS) + endif () endif (PACKAGE) endif (DARWIN) if (INSTALL) include(${CMAKE_CURRENT_SOURCE_DIR}/ViewerInstall.cmake) endif (INSTALL) -if (PACKAGE AND USESYSTEMLIBS) +if (PACKAGE) include(CPack) -endif (PACKAGE AND USESYSTEMLIBS) +endif () if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIEWER_SYMBOL_FILE) if (USE_BUGSPLAT) @@ -2467,7 +2626,7 @@ if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIE PROPERTIES XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf-with-dsym" XCODE_ATTRIBUTE_DWARF_DSYM_FOLDER_PATH "${SYMBOLS_STAGING_DIR}/dSYMs") - + add_custom_command(OUTPUT "${VIEWER_APP_XCARCHIVE}" COMMAND "zip" ARGS @@ -2502,7 +2661,7 @@ if (LL_TESTS) # llremoteparcelrequest.cpp llviewerhelputil.cpp llversioninfo.cpp -# llvocache.cpp +# llvocache.cpp llworldmap.cpp llworldmipmap.cpp ) @@ -2511,7 +2670,7 @@ if (LL_TESTS) llworldmap.cpp llworldmipmap.cpp PROPERTIES - LL_TEST_ADDITIONAL_SOURCE_FILES + LL_TEST_ADDITIONAL_SOURCE_FILES tests/llviewertexture_stub.cpp #llviewertexturelist.cpp ) @@ -2545,7 +2704,7 @@ if (LL_TESTS) llworldmap.cpp llworldmipmap.cpp PROPERTIES - LL_TEST_ADDITIONAL_SOURCE_FILES + LL_TEST_ADDITIONAL_SOURCE_FILES tests/llviewertexture_stub.cpp ) diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings index 25f517d364..8a053f87c3 100644 --- a/indra/newview/English.lproj/InfoPlist.strings +++ b/indra/newview/English.lproj/InfoPlist.strings @@ -3,5 +3,5 @@ CFBundleName = "Megapahit"; CFBundleShortVersionString = "Megapahit version ${MACOSX_BUNDLE_SHORT_VERSION_STRING}"; -CFBundleGetInfoString = "Megapahit version ${MACOSX_BUNDLE_SHORT_VERSION_STRING}, Copyright 2025 Megapahit."; +CFBundleGetInfoString = "Megapahit version ${MACOSX_BUNDLE_SHORT_VERSION_STRING}, Copyright 2026 Megapahit."; diff --git a/indra/newview/FixBundle.cmake.in b/indra/newview/FixBundle.cmake.in index 7f06249224..fbeea05359 100644 --- a/indra/newview/FixBundle.cmake.in +++ b/indra/newview/FixBundle.cmake.in @@ -10,16 +10,6 @@ file(CREATE_LINK SYMBOLIC ) file(CREATE_LINK - "../../../../Frameworks/libpng16.16.dylib" - "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libpng16.16.dylib" - SYMBOLIC - ) -file(CREATE_LINK - "../../../../Frameworks/libjpeg.8.dylib" - "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libjpeg.8.dylib" - SYMBOLIC - ) -file(CREATE_LINK "../../../../Frameworks/libaprutil-1.0.dylib" "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libaprutil-1.0.dylib" SYMBOLIC @@ -65,16 +55,6 @@ file(CREATE_LINK SYMBOLIC ) file(CREATE_LINK - "../../../../Frameworks/libboost_regex-mt.dylib" - "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_regex-mt.dylib" - SYMBOLIC - ) -file(CREATE_LINK - "../../../../Frameworks/libboost_system-mt.dylib" - "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_system-mt.dylib" - SYMBOLIC - ) -file(CREATE_LINK "../../../../Frameworks/libboost_thread-mt.dylib" "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_thread-mt.dylib" SYMBOLIC @@ -85,28 +65,18 @@ file(CREATE_LINK SYMBOLIC ) file(CREATE_LINK - "../../../../Frameworks/libexpat.1.dylib" - "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libexpat.1.dylib" - SYMBOLIC - ) -file(CREATE_LINK - "../../../../Frameworks/libfreetype.6.dylib" - "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libfreetype.6.dylib" - SYMBOLIC - ) -file(CREATE_LINK - "../../../../Frameworks/libbz2.1.0.dylib" - "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libbz2.1.0.dylib" + "../../../../Frameworks/libboost_regex-mt.dylib" + "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_regex-mt.dylib" SYMBOLIC ) file(CREATE_LINK - "../../../../Frameworks/libbrotlidec.1.dylib" - "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libbrotlidec.1.dylib" + "../../../../Frameworks/libboost_system-mt.dylib" + "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_system-mt.dylib" SYMBOLIC ) file(CREATE_LINK - "../../../../Frameworks/libbrotlicommon.1.dylib" - "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libbrotlicommon.1.dylib" + "../../../../Frameworks/libexpat.1.dylib" + "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libexpat.1.dylib" SYMBOLIC ) file(CREATE_LINK @@ -134,6 +104,7 @@ fixup_bundle(${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/MacOS/${VIEWER_ file(CHMOD "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper.app/Contents/MacOS/DullahanHelper" + "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper (Alerts).app/Contents/MacOS/DullahanHelper (Alerts)" "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper (GPU).app/Contents/MacOS/DullahanHelper (GPU)" "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper (Plugin).app/Contents/MacOS/DullahanHelper (Plugin)" "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper (Renderer).app/Contents/MacOS/DullahanHelper (Renderer)" @@ -178,21 +149,18 @@ execute_process( COMMAND lipo libboost_url-mt.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libboost_url-mt.dylib - COMMAND lipo libbrotlicommon.1.1.0.dylib + COMMAND lipo libbrotlicommon.1.2.0.dylib -thin ${CMAKE_OSX_ARCHITECTURES} - -output libbrotlicommon.1.1.0.dylib - COMMAND lipo libbrotlidec.1.1.0.dylib + -output libbrotlicommon.1.2.0.dylib + COMMAND lipo libbrotlidec.1.2.0.dylib -thin ${CMAKE_OSX_ARCHITECTURES} - -output libbrotlidec.1.1.0.dylib + -output libbrotlidec.1.2.0.dylib COMMAND lipo libbz2.1.0.8.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libbz2.1.0.8.dylib - COMMAND lipo libcollada14dom.2.3-r8.dylib + COMMAND lipo libexpat.1.11.1.dylib -thin ${CMAKE_OSX_ARCHITECTURES} - -output libcollada14dom.2.3-r8.dylib - COMMAND lipo libexpat.1.10.0.dylib - -thin ${CMAKE_OSX_ARCHITECTURES} - -output libexpat.1.10.0.dylib + -output libexpat.1.11.1.dylib COMMAND lipo libfreetype.6.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libfreetype.6.dylib @@ -238,6 +206,9 @@ execute_process( COMMAND lipo libopenal.1.24.2.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libopenal.1.24.2.dylib + COMMAND lipo libopenjp2.2.5.4.dylib + -thin ${CMAKE_OSX_ARCHITECTURES} + -output libopenjp2.2.5.4.dylib COMMAND lipo libpng16.16.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libpng16.16.dylib @@ -271,6 +242,7 @@ execute_process( COMMAND sudo codesign -f -s ${SIGNING_IDENTITY} --timestamp -o runtime --runtime-version ${CMAKE_OSX_DEPLOYMENT_TARGET} Frameworks/Chromium\ Embedded\ Framework.framework/Libraries/libEGL.dylib Frameworks/Chromium\ Embedded\ Framework.framework/Libraries/libGLESv2.dylib + Frameworks/Chromium\ Embedded\ Framework.framework/Libraries/libcef_sandbox.dylib Frameworks/Chromium\ Embedded\ Framework.framework/Libraries/libvk_swiftshader.dylib Frameworks/Chromium\ Embedded\ Framework.framework Frameworks/libalut.0.dylib @@ -285,11 +257,11 @@ execute_process( Frameworks/libboost_system-mt.dylib Frameworks/libboost_thread-mt.dylib Frameworks/libboost_url-mt.dylib - Frameworks/libbrotlicommon.1.1.0.dylib - Frameworks/libbrotlidec.1.1.0.dylib + Frameworks/libbrotlicommon.1.2.0.dylib + Frameworks/libbrotlidec.1.2.0.dylib Frameworks/libbz2.1.0.8.dylib - Frameworks/libcollada14dom.2.3-r8.dylib - Frameworks/libexpat.1.10.0.dylib + Frameworks/libdiscord_partner_sdk.dylib + Frameworks/libexpat.1.11.1.dylib Frameworks/libfreetype.6.dylib Frameworks/libhunspell-1.7.0.dylib Frameworks/libiconv.2.dylib @@ -305,6 +277,7 @@ execute_process( Frameworks/libnghttp2.14.dylib Frameworks/libogg.0.dylib Frameworks/libopenal.1.24.2.dylib + Frameworks/libopenjp2.2.5.4.dylib Frameworks/libpng16.16.dylib Frameworks/libvlc.5.dylib Frameworks/libvlccore.9.dylib @@ -314,357 +287,356 @@ execute_process( Frameworks/libxml2.2.dylib Frameworks/libz.1.3.1.dylib Resources/libndofdev.dylib - Resources/llplugin/media_plugin_cef.dylib - Resources/llplugin/media_plugin_libvlc.dylib - Resources/llplugin/plugins/liba52_plugin.dylib - Resources/llplugin/plugins/libaccess_concat_plugin.dylib - Resources/llplugin/plugins/libaccess_imem_plugin.dylib - Resources/llplugin/plugins/libaccess_mms_plugin.dylib - Resources/llplugin/plugins/libaccess_output_dummy_plugin.dylib - Resources/llplugin/plugins/libaccess_output_file_plugin.dylib - Resources/llplugin/plugins/libaccess_output_http_plugin.dylib - Resources/llplugin/plugins/libaccess_output_livehttp_plugin.dylib - Resources/llplugin/plugins/libaccess_output_rist_plugin.dylib - Resources/llplugin/plugins/libaccess_output_shout_plugin.dylib - Resources/llplugin/plugins/libaccess_output_srt_plugin.dylib - Resources/llplugin/plugins/libaccess_output_udp_plugin.dylib - Resources/llplugin/plugins/libaccess_realrtsp_plugin.dylib - Resources/llplugin/plugins/libaccess_srt_plugin.dylib - Resources/llplugin/plugins/libadaptive_plugin.dylib - Resources/llplugin/plugins/libaddonsfsstorage_plugin.dylib - Resources/llplugin/plugins/libaddonsvorepository_plugin.dylib - Resources/llplugin/plugins/libadf_plugin.dylib - Resources/llplugin/plugins/libadjust_plugin.dylib - Resources/llplugin/plugins/libadpcm_plugin.dylib - Resources/llplugin/plugins/libadummy_plugin.dylib - Resources/llplugin/plugins/libaes3_plugin.dylib - Resources/llplugin/plugins/libafile_plugin.dylib - Resources/llplugin/plugins/libaiff_plugin.dylib - Resources/llplugin/plugins/libalphamask_plugin.dylib - Resources/llplugin/plugins/libamem_plugin.dylib - Resources/llplugin/plugins/libanaglyph_plugin.dylib - Resources/llplugin/plugins/libantiflicker_plugin.dylib - Resources/llplugin/plugins/libaom_plugin.dylib - Resources/llplugin/plugins/libaraw_plugin.dylib - Resources/llplugin/plugins/libarchive_plugin.dylib - Resources/llplugin/plugins/libaribsub_plugin.dylib - Resources/llplugin/plugins/libasf_plugin.dylib - Resources/llplugin/plugins/libattachment_plugin.dylib - Resources/llplugin/plugins/libau_plugin.dylib - Resources/llplugin/plugins/libaudio_format_plugin.dylib - Resources/llplugin/plugins/libaudiobargraph_a_plugin.dylib - Resources/llplugin/plugins/libaudiobargraph_v_plugin.dylib - Resources/llplugin/plugins/libaudioscrobbler_plugin.dylib - Resources/llplugin/plugins/libaudiotoolboxmidi_plugin.dylib - Resources/llplugin/plugins/libauhal_plugin.dylib - Resources/llplugin/plugins/libavaudiocapture_plugin.dylib - Resources/llplugin/plugins/libavcapture_plugin.dylib - Resources/llplugin/plugins/libavcodec_plugin.dylib - Resources/llplugin/plugins/libavi_plugin.dylib - Resources/llplugin/plugins/libball_plugin.dylib - Resources/llplugin/plugins/libblend_plugin.dylib - Resources/llplugin/plugins/libblendbench_plugin.dylib - Resources/llplugin/plugins/libbluescreen_plugin.dylib - Resources/llplugin/plugins/libbluray-awt-j2se-1.3.2.jar - Resources/llplugin/plugins/libbluray-j2se-1.3.2.jar - Resources/llplugin/plugins/libbonjour_plugin.dylib - Resources/llplugin/plugins/libcache_block_plugin.dylib - Resources/llplugin/plugins/libcache_read_plugin.dylib - Resources/llplugin/plugins/libcaf_plugin.dylib - Resources/llplugin/plugins/libcanvas_plugin.dylib - Resources/llplugin/plugins/libcaopengllayer_plugin.dylib - Resources/llplugin/plugins/libcc_plugin.dylib - Resources/llplugin/plugins/libcdda_plugin.dylib - Resources/llplugin/plugins/libcdg_plugin.dylib - Resources/llplugin/plugins/libchain_plugin.dylib - Resources/llplugin/plugins/libchorus_flanger_plugin.dylib - Resources/llplugin/plugins/libci_filters_plugin.dylib - Resources/llplugin/plugins/libclone_plugin.dylib - Resources/llplugin/plugins/libcolorthres_plugin.dylib - Resources/llplugin/plugins/libcompressor_plugin.dylib - Resources/llplugin/plugins/libconsole_logger_plugin.dylib - Resources/llplugin/plugins/libcroppadd_plugin.dylib - Resources/llplugin/plugins/libcvdsub_plugin.dylib - Resources/llplugin/plugins/libcvpx_plugin.dylib - Resources/llplugin/plugins/libdav1d_plugin.dylib - Resources/llplugin/plugins/libdca_plugin.dylib - Resources/llplugin/plugins/libdcp_plugin.dylib - Resources/llplugin/plugins/libddummy_plugin.dylib - Resources/llplugin/plugins/libdecomp_plugin.dylib - Resources/llplugin/plugins/libdeinterlace_plugin.dylib - Resources/llplugin/plugins/libdemux_cdg_plugin.dylib - Resources/llplugin/plugins/libdemux_chromecast_plugin.dylib - Resources/llplugin/plugins/libdemux_stl_plugin.dylib - Resources/llplugin/plugins/libdemuxdump_plugin.dylib - Resources/llplugin/plugins/libdiracsys_plugin.dylib - Resources/llplugin/plugins/libdirectory_demux_plugin.dylib - Resources/llplugin/plugins/libdolby_surround_decoder_plugin.dylib - Resources/llplugin/plugins/libdummy_plugin.dylib - Resources/llplugin/plugins/libdvbsub_plugin.dylib - Resources/llplugin/plugins/libdvdnav_plugin.dylib - Resources/llplugin/plugins/libdvdread_plugin.dylib - Resources/llplugin/plugins/libdynamicoverlay_plugin.dylib - Resources/llplugin/plugins/libedgedetection_plugin.dylib - Resources/llplugin/plugins/libedummy_plugin.dylib - Resources/llplugin/plugins/libequalizer_plugin.dylib - Resources/llplugin/plugins/liberase_plugin.dylib - Resources/llplugin/plugins/libes_plugin.dylib - Resources/llplugin/plugins/libexport_plugin.dylib - Resources/llplugin/plugins/libextract_plugin.dylib - Resources/llplugin/plugins/libfaad_plugin.dylib - Resources/llplugin/plugins/libfile_keystore_plugin.dylib - Resources/llplugin/plugins/libfile_logger_plugin.dylib - Resources/llplugin/plugins/libfilesystem_plugin.dylib - Resources/llplugin/plugins/libfingerprinter_plugin.dylib - Resources/llplugin/plugins/libflac_plugin.dylib - Resources/llplugin/plugins/libflacsys_plugin.dylib - Resources/llplugin/plugins/libflaschen_plugin.dylib - Resources/llplugin/plugins/libfloat_mixer_plugin.dylib - Resources/llplugin/plugins/libfolder_plugin.dylib - Resources/llplugin/plugins/libfps_plugin.dylib - Resources/llplugin/plugins/libfreetype_plugin.dylib - Resources/llplugin/plugins/libfreeze_plugin.dylib - Resources/llplugin/plugins/libftp_plugin.dylib - Resources/llplugin/plugins/libg711_plugin.dylib - Resources/llplugin/plugins/libgain_plugin.dylib - Resources/llplugin/plugins/libgaussianblur_plugin.dylib - Resources/llplugin/plugins/libgestures_plugin.dylib - Resources/llplugin/plugins/libglconv_cvpx_plugin.dylib - Resources/llplugin/plugins/libgme_plugin.dylib - Resources/llplugin/plugins/libgnutls_plugin.dylib - Resources/llplugin/plugins/libgoom_plugin.dylib - Resources/llplugin/plugins/libgradfun_plugin.dylib - Resources/llplugin/plugins/libgradient_plugin.dylib - Resources/llplugin/plugins/libgrain_plugin.dylib - Resources/llplugin/plugins/libgrey_yuv_plugin.dylib - Resources/llplugin/plugins/libh26x_plugin.dylib - Resources/llplugin/plugins/libhds_plugin.dylib - Resources/llplugin/plugins/libheadphone_channel_mixer_plugin.dylib - Resources/llplugin/plugins/libhotkeys_plugin.dylib - Resources/llplugin/plugins/libhqdn3d_plugin.dylib - Resources/llplugin/plugins/libhttp_plugin.dylib - Resources/llplugin/plugins/libhttps_plugin.dylib - Resources/llplugin/plugins/libi420_10_p010_plugin.dylib - Resources/llplugin/plugins/libi420_nv12_plugin.dylib - Resources/llplugin/plugins/libi420_rgb_mmx_plugin.dylib - Resources/llplugin/plugins/libi420_rgb_plugin.dylib - Resources/llplugin/plugins/libi420_rgb_sse2_plugin.dylib - Resources/llplugin/plugins/libi420_yuy2_mmx_plugin.dylib - Resources/llplugin/plugins/libi420_yuy2_plugin.dylib - Resources/llplugin/plugins/libi420_yuy2_sse2_plugin.dylib - Resources/llplugin/plugins/libi422_i420_plugin.dylib - Resources/llplugin/plugins/libi422_yuy2_mmx_plugin.dylib - Resources/llplugin/plugins/libi422_yuy2_plugin.dylib - Resources/llplugin/plugins/libi422_yuy2_sse2_plugin.dylib - Resources/llplugin/plugins/libidummy_plugin.dylib - Resources/llplugin/plugins/libimage_plugin.dylib - Resources/llplugin/plugins/libimem_plugin.dylib - Resources/llplugin/plugins/libinflate_plugin.dylib - Resources/llplugin/plugins/libinteger_mixer_plugin.dylib - Resources/llplugin/plugins/libinvert_plugin.dylib - Resources/llplugin/plugins/libjpeg_plugin.dylib - Resources/llplugin/plugins/libkaraoke_plugin.dylib - Resources/llplugin/plugins/libkate_plugin.dylib - Resources/llplugin/plugins/libkeychain_plugin.dylib - Resources/llplugin/plugins/liblibass_plugin.dylib - Resources/llplugin/plugins/liblibbluray_plugin.dylib - Resources/llplugin/plugins/liblibmpeg2_plugin.dylib - Resources/llplugin/plugins/liblive555_plugin.dylib - Resources/llplugin/plugins/liblogger_plugin.dylib - Resources/llplugin/plugins/liblogo_plugin.dylib - Resources/llplugin/plugins/liblpcm_plugin.dylib - Resources/llplugin/plugins/liblua_plugin.dylib - Resources/llplugin/plugins/libmacosx_plugin.dylib - Resources/llplugin/plugins/libmad_plugin.dylib - Resources/llplugin/plugins/libmagnify_plugin.dylib - Resources/llplugin/plugins/libmarq_plugin.dylib - Resources/llplugin/plugins/libmediadirs_plugin.dylib - Resources/llplugin/plugins/libmemory_keystore_plugin.dylib - Resources/llplugin/plugins/libmirror_plugin.dylib - Resources/llplugin/plugins/libmjpeg_plugin.dylib - Resources/llplugin/plugins/libmkv_plugin.dylib - Resources/llplugin/plugins/libmod_plugin.dylib - Resources/llplugin/plugins/libmono_plugin.dylib - Resources/llplugin/plugins/libmosaic_plugin.dylib - Resources/llplugin/plugins/libmotion_plugin.dylib - Resources/llplugin/plugins/libmotionblur_plugin.dylib - Resources/llplugin/plugins/libmotiondetect_plugin.dylib - Resources/llplugin/plugins/libmp4_plugin.dylib - Resources/llplugin/plugins/libmpc_plugin.dylib - Resources/llplugin/plugins/libmpg123_plugin.dylib - Resources/llplugin/plugins/libmpgv_plugin.dylib - Resources/llplugin/plugins/libmux_asf_plugin.dylib - Resources/llplugin/plugins/libmux_avi_plugin.dylib - Resources/llplugin/plugins/libmux_dummy_plugin.dylib - Resources/llplugin/plugins/libmux_mp4_plugin.dylib - Resources/llplugin/plugins/libmux_mpjpeg_plugin.dylib - Resources/llplugin/plugins/libmux_ogg_plugin.dylib - Resources/llplugin/plugins/libmux_ps_plugin.dylib - Resources/llplugin/plugins/libmux_ts_plugin.dylib - Resources/llplugin/plugins/libmux_wav_plugin.dylib - Resources/llplugin/plugins/libncurses_plugin.dylib - Resources/llplugin/plugins/libnetsync_plugin.dylib - Resources/llplugin/plugins/libnfs_plugin.dylib - Resources/llplugin/plugins/libnormvol_plugin.dylib - Resources/llplugin/plugins/libnoseek_plugin.dylib - Resources/llplugin/plugins/libnsc_plugin.dylib - Resources/llplugin/plugins/libnsspeechsynthesizer_plugin.dylib - Resources/llplugin/plugins/libnsv_plugin.dylib - Resources/llplugin/plugins/libnuv_plugin.dylib - Resources/llplugin/plugins/libogg_plugin.dylib - Resources/llplugin/plugins/liboggspots_plugin.dylib - Resources/llplugin/plugins/liboldmovie_plugin.dylib - Resources/llplugin/plugins/liboldrc_plugin.dylib - Resources/llplugin/plugins/libopus_plugin.dylib - Resources/llplugin/plugins/libosx_notifications_plugin.dylib - Resources/llplugin/plugins/libpacketizer_a52_plugin.dylib - Resources/llplugin/plugins/libpacketizer_av1_plugin.dylib - Resources/llplugin/plugins/libpacketizer_copy_plugin.dylib - Resources/llplugin/plugins/libpacketizer_dirac_plugin.dylib - Resources/llplugin/plugins/libpacketizer_dts_plugin.dylib - Resources/llplugin/plugins/libpacketizer_flac_plugin.dylib - Resources/llplugin/plugins/libpacketizer_h264_plugin.dylib - Resources/llplugin/plugins/libpacketizer_hevc_plugin.dylib - Resources/llplugin/plugins/libpacketizer_mlp_plugin.dylib - Resources/llplugin/plugins/libpacketizer_mpeg4audio_plugin.dylib - Resources/llplugin/plugins/libpacketizer_mpeg4video_plugin.dylib - Resources/llplugin/plugins/libpacketizer_mpegaudio_plugin.dylib - Resources/llplugin/plugins/libpacketizer_mpegvideo_plugin.dylib - Resources/llplugin/plugins/libpacketizer_vc1_plugin.dylib - Resources/llplugin/plugins/libparam_eq_plugin.dylib - Resources/llplugin/plugins/libplaylist_plugin.dylib - Resources/llplugin/plugins/libpng_plugin.dylib - Resources/llplugin/plugins/libpodcast_plugin.dylib - Resources/llplugin/plugins/libposterize_plugin.dylib - Resources/llplugin/plugins/libpostproc_plugin.dylib - Resources/llplugin/plugins/libprefetch_plugin.dylib - Resources/llplugin/plugins/libps_plugin.dylib - Resources/llplugin/plugins/libpsychedelic_plugin.dylib - Resources/llplugin/plugins/libpuzzle_plugin.dylib - Resources/llplugin/plugins/libpva_plugin.dylib - Resources/llplugin/plugins/librawaud_plugin.dylib - Resources/llplugin/plugins/librawdv_plugin.dylib - Resources/llplugin/plugins/librawvid_plugin.dylib - Resources/llplugin/plugins/librawvideo_plugin.dylib - Resources/llplugin/plugins/libreal_plugin.dylib - Resources/llplugin/plugins/librecord_plugin.dylib - Resources/llplugin/plugins/libremap_plugin.dylib - Resources/llplugin/plugins/libremoteosd_plugin.dylib - Resources/llplugin/plugins/libripple_plugin.dylib - Resources/llplugin/plugins/librist_plugin.dylib - Resources/llplugin/plugins/librotate_plugin.dylib - Resources/llplugin/plugins/librss_plugin.dylib - Resources/llplugin/plugins/librtp_plugin.dylib - Resources/llplugin/plugins/librtpvideo_plugin.dylib - Resources/llplugin/plugins/librv32_plugin.dylib - Resources/llplugin/plugins/libsamplerate_plugin.dylib - Resources/llplugin/plugins/libsap_plugin.dylib - Resources/llplugin/plugins/libsatip_plugin.dylib - Resources/llplugin/plugins/libscale_plugin.dylib - Resources/llplugin/plugins/libscaletempo_pitch_plugin.dylib - Resources/llplugin/plugins/libscaletempo_plugin.dylib - Resources/llplugin/plugins/libscene_plugin.dylib - Resources/llplugin/plugins/libschroedinger_plugin.dylib - Resources/llplugin/plugins/libscreen_plugin.dylib - Resources/llplugin/plugins/libscte18_plugin.dylib - Resources/llplugin/plugins/libscte27_plugin.dylib - Resources/llplugin/plugins/libsdp_plugin.dylib - Resources/llplugin/plugins/libsecuretransport_plugin.dylib - Resources/llplugin/plugins/libsepia_plugin.dylib - Resources/llplugin/plugins/libsftp_plugin.dylib - Resources/llplugin/plugins/libsharpen_plugin.dylib - Resources/llplugin/plugins/libshm_plugin.dylib - Resources/llplugin/plugins/libsid_plugin.dylib - Resources/llplugin/plugins/libsimple_channel_mixer_plugin.dylib - Resources/llplugin/plugins/libskiptags_plugin.dylib - Resources/llplugin/plugins/libsmf_plugin.dylib - Resources/llplugin/plugins/libspatialaudio_plugin.dylib - Resources/llplugin/plugins/libspatializer_plugin.dylib - Resources/llplugin/plugins/libspdif_plugin.dylib - Resources/llplugin/plugins/libspeex_plugin.dylib - Resources/llplugin/plugins/libspeex_resampler_plugin.dylib - Resources/llplugin/plugins/libspudec_plugin.dylib - Resources/llplugin/plugins/libstats_plugin.dylib - Resources/llplugin/plugins/libstereo_widen_plugin.dylib - Resources/llplugin/plugins/libstl_plugin.dylib - Resources/llplugin/plugins/libstream_out_autodel_plugin.dylib - Resources/llplugin/plugins/libstream_out_bridge_plugin.dylib - Resources/llplugin/plugins/libstream_out_chromaprint_plugin.dylib - Resources/llplugin/plugins/libstream_out_chromecast_plugin.dylib - Resources/llplugin/plugins/libstream_out_cycle_plugin.dylib - Resources/llplugin/plugins/libstream_out_delay_plugin.dylib - Resources/llplugin/plugins/libstream_out_description_plugin.dylib - Resources/llplugin/plugins/libstream_out_display_plugin.dylib - Resources/llplugin/plugins/libstream_out_dummy_plugin.dylib - Resources/llplugin/plugins/libstream_out_duplicate_plugin.dylib - Resources/llplugin/plugins/libstream_out_es_plugin.dylib - Resources/llplugin/plugins/libstream_out_gather_plugin.dylib - Resources/llplugin/plugins/libstream_out_mosaic_bridge_plugin.dylib - Resources/llplugin/plugins/libstream_out_record_plugin.dylib - Resources/llplugin/plugins/libstream_out_rtp_plugin.dylib - Resources/llplugin/plugins/libstream_out_setid_plugin.dylib - Resources/llplugin/plugins/libstream_out_smem_plugin.dylib - Resources/llplugin/plugins/libstream_out_standard_plugin.dylib - Resources/llplugin/plugins/libstream_out_stats_plugin.dylib - Resources/llplugin/plugins/libstream_out_transcode_plugin.dylib - Resources/llplugin/plugins/libsubsdec_plugin.dylib - Resources/llplugin/plugins/libsubsdelay_plugin.dylib - Resources/llplugin/plugins/libsubstx3g_plugin.dylib - Resources/llplugin/plugins/libsubsusf_plugin.dylib - Resources/llplugin/plugins/libsubtitle_plugin.dylib - Resources/llplugin/plugins/libsvcdsub_plugin.dylib - Resources/llplugin/plugins/libswscale_plugin.dylib - Resources/llplugin/plugins/libsyslog_plugin.dylib - Resources/llplugin/plugins/libt140_plugin.dylib - Resources/llplugin/plugins/libtaglib_plugin.dylib - Resources/llplugin/plugins/libtcp_plugin.dylib - Resources/llplugin/plugins/libtdummy_plugin.dylib - Resources/llplugin/plugins/libtelx_plugin.dylib - Resources/llplugin/plugins/libtextst_plugin.dylib - Resources/llplugin/plugins/libtheora_plugin.dylib - Resources/llplugin/plugins/libtimecode_plugin.dylib - Resources/llplugin/plugins/libtospdif_plugin.dylib - Resources/llplugin/plugins/libtransform_plugin.dylib - Resources/llplugin/plugins/libtrivial_channel_mixer_plugin.dylib - Resources/llplugin/plugins/libts_plugin.dylib - Resources/llplugin/plugins/libtta_plugin.dylib - Resources/llplugin/plugins/libttml_plugin.dylib - Resources/llplugin/plugins/libtwolame_plugin.dylib - Resources/llplugin/plugins/libty_plugin.dylib - Resources/llplugin/plugins/libudp_plugin.dylib - Resources/llplugin/plugins/libugly_resampler_plugin.dylib - Resources/llplugin/plugins/libuleaddvaudio_plugin.dylib - Resources/llplugin/plugins/libupnp_plugin.dylib - Resources/llplugin/plugins/libvc1_plugin.dylib - Resources/llplugin/plugins/libvcd_plugin.dylib - Resources/llplugin/plugins/libvdr_plugin.dylib - Resources/llplugin/plugins/libvdummy_plugin.dylib - Resources/llplugin/plugins/libvhs_plugin.dylib - Resources/llplugin/plugins/libvideotoolbox_plugin.dylib - Resources/llplugin/plugins/libvisual_plugin.dylib - Resources/llplugin/plugins/libvlc.5.dylib - Resources/llplugin/plugins/libvlccore.9.dylib - Resources/llplugin/plugins/libvmem_plugin.dylib - Resources/llplugin/plugins/libvobsub_plugin.dylib - Resources/llplugin/plugins/libvoc_plugin.dylib - Resources/llplugin/plugins/libvod_rtsp_plugin.dylib - Resources/llplugin/plugins/libvorbis_plugin.dylib - Resources/llplugin/plugins/libvout_macosx_plugin.dylib - Resources/llplugin/plugins/libvpx_plugin.dylib - Resources/llplugin/plugins/libwall_plugin.dylib - Resources/llplugin/plugins/libwav_plugin.dylib - Resources/llplugin/plugins/libwave_plugin.dylib - Resources/llplugin/plugins/libwebvtt_plugin.dylib - Resources/llplugin/plugins/libx26410b_plugin.dylib - Resources/llplugin/plugins/libx264_plugin.dylib - Resources/llplugin/plugins/libx265_plugin.dylib - Resources/llplugin/plugins/libxa_plugin.dylib - Resources/llplugin/plugins/libxml_plugin.dylib - Resources/llplugin/plugins/libyuv_plugin.dylib - Resources/llplugin/plugins/libyuvp_plugin.dylib - Resources/llplugin/plugins/libyuy2_i420_plugin.dylib - Resources/llplugin/plugins/libyuy2_i422_plugin.dylib - Resources/llplugin/plugins/libzvbi_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/media_plugin_cef.dylib + Resources/SLPlugin.app/Contents/Frameworks/media_plugin_libvlc.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_concat_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_imem_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_mms_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_dummy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_file_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_http_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_livehttp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_rist_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_shout_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_srt_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_udp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_realrtsp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_srt_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libadaptive_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaddonsfsstorage_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaddonsvorepository_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libadf_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libadjust_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libadpcm_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libadummy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaes3_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libafile_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaiff_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libalphamask_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libamem_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libanaglyph_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libantiflicker_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaom_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaraw_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libarchive_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaribsub_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libasf_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libattachment_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libau_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaudio_format_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaudiobargraph_a_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaudiobargraph_v_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaudioscrobbler_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaudiotoolboxmidi_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libauhal_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libavaudiocapture_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libavcapture_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libavcodec_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libavi_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libball_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libblend_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libblendbench_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libbluescreen_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libbluray-awt-j2se-1.4.0.jar + Resources/SLPlugin.app/Contents/Frameworks/plugins/libbluray-j2se-1.4.0.jar + Resources/SLPlugin.app/Contents/Frameworks/plugins/libbonjour_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcache_block_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcache_read_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcaf_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcanvas_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcaopengllayer_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcc_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcdda_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcdg_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libchain_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libchorus_flanger_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libci_filters_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libclone_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcolorthres_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcompressor_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libconsole_logger_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcroppadd_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcvdsub_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcvpx_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdav1d_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdcp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libddummy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdecomp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdeinterlace_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdemux_cdg_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdemux_chromecast_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdemux_stl_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdemuxdump_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdiracsys_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdirectory_demux_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdmxmus_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdolby_surround_decoder_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdummy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdvbsub_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdvdnav_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdvdread_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdynamicoverlay_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libedgedetection_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libedummy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libequalizer_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liberase_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libes_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libexport_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libextract_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libfaad_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libfile_keystore_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libfile_logger_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libfilesystem_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libfingerprinter_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libflac_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libflacsys_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libflaschen_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libfloat_mixer_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libfolder_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libfps_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libfreetype_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libfreeze_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libftp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libg711_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libgain_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libgaussianblur_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libgestures_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libglconv_cvpx_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libgme_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libgnutls_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libgoom_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libgradfun_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libgradient_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libgrain_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libgrey_yuv_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libh26x_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libhds_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libheadphone_channel_mixer_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libhotkeys_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libhqdn3d_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libhttp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libhttps_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_10_p010_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_nv12_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_rgb_mmx_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_rgb_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_rgb_sse2_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_yuy2_mmx_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_yuy2_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_yuy2_sse2_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi422_i420_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi422_yuy2_mmx_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi422_yuy2_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi422_yuy2_sse2_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libidummy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libimage_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libimem_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libinflate_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libinteger_mixer_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libinvert_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libjpeg_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libkaraoke_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libkate_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libkeychain_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liblibass_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liblibbluray_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liblive555_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liblogger_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liblogo_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liblpcm_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liblua_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmacosx_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmad_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmagnify_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmarq_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmediadirs_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmemory_keystore_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmirror_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmjpeg_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmkv_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmod_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmono_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmosaic_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmotion_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmotionblur_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmotiondetect_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmp4_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmpc_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmpg123_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmpgv_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_asf_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_avi_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_dummy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_mp4_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_mpjpeg_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_ogg_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_ps_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_ts_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_wav_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libncurses_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libnetsync_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libnfs_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libnormvol_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libnoseek_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libnsc_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libnsspeechsynthesizer_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libnsv_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libnuv_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libogg_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liboggspots_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liboldmovie_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liboldrc_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libopus_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libosx_notifications_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_a52_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_av1_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_copy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_dirac_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_dts_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_flac_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_h264_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_hevc_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_mlp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_mpeg4audio_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_mpeg4video_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_mpegaudio_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_mpegvideo_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_vc1_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libparam_eq_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libplaylist_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpng_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpodcast_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libposterize_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpostproc_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libprefetch_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libps_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpsychedelic_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpuzzle_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpva_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librawaud_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librawdv_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librawvid_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librawvideo_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libreal_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librecord_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libremap_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libremoteosd_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libripple_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librist_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librotate_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librss_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librtp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librtpvideo_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librv32_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsamplerate_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsap_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsatip_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libscale_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libscaletempo_pitch_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libscaletempo_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libscene_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libschroedinger_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libscreen_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libscte18_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libscte27_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsdp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsecuretransport_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsepia_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsftp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsharpen_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libshm_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsid_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsimple_channel_mixer_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libskiptags_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsmf_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libspatialaudio_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libspatializer_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libspdif_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libspeex_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libspeex_resampler_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libspudec_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstats_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstereo_widen_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstl_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_autodel_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_bridge_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_chromaprint_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_chromecast_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_cycle_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_delay_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_description_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_display_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_dummy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_duplicate_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_es_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_gather_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_mosaic_bridge_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_record_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_rtp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_setid_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_smem_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_standard_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_stats_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_transcode_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsubsdec_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsubsdelay_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsubstx3g_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsubsusf_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsubtitle_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsvcdsub_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libswscale_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsyslog_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libt140_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtaglib_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtcp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtdummy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtelx_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtextst_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtheora_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtimecode_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtospdif_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtransform_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtrivial_channel_mixer_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libts_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtta_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libttml_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtwolame_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libty_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libudp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libugly_resampler_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libuleaddvaudio_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libupnp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvc1_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvcd_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvdr_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvdummy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvhs_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvideotoolbox_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvisual_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvlc.5.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvlccore.9.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvmem_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvobsub_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvoc_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvod_rtsp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvorbis_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvout_macosx_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvpx_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libwall_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libwav_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libwave_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libwebvtt_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libx26410b_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libx264_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libx265_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libxa_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libxml_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libyuv_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libyuvp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libyuy2_i420_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libyuy2_i422_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libzvbi_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper\ \(Alerts\).app/Contents/MacOS/DullahanHelper\ \(Alerts\) Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper\ \(GPU\).app/Contents/MacOS/DullahanHelper\ \(GPU\) Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper\ \(Plugin\).app/Contents/MacOS/DullahanHelper\ \(Plugin\) WORKING_DIRECTORY ${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents @@ -677,6 +649,7 @@ execute_process( DullahanHelper\ \(Renderer\).app/Contents/MacOS/DullahanHelper\ \(Renderer\) COMMAND sudo codesign -f -s ${SIGNING_IDENTITY} --timestamp -o runtime --runtime-version ${CMAKE_OSX_DEPLOYMENT_TARGET} --deep + DullahanHelper\ \(Alerts\).app DullahanHelper\ \(GPU\).app DullahanHelper\ \(Plugin\).app WORKING_DIRECTORY ${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks diff --git a/indra/newview/FixPackage.cmake.in b/indra/newview/FixPackage.cmake.in index 074a6e5815..17272f5881 100644 --- a/indra/newview/FixPackage.cmake.in +++ b/indra/newview/FixPackage.cmake.in @@ -10,16 +10,6 @@ file(CREATE_LINK SYMBOLIC ) file(CREATE_LINK - "../../../../Frameworks/libpng16.16.dylib" - "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libpng16.16.dylib" - SYMBOLIC - ) -file(CREATE_LINK - "../../../../Frameworks/libjpeg.8.dylib" - "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libjpeg.8.dylib" - SYMBOLIC - ) -file(CREATE_LINK "../../../../Frameworks/libaprutil-1.0.dylib" "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libaprutil-1.0.dylib" SYMBOLIC @@ -65,16 +55,6 @@ file(CREATE_LINK SYMBOLIC ) file(CREATE_LINK - "../../../../Frameworks/libboost_regex-mt.dylib" - "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_regex-mt.dylib" - SYMBOLIC - ) -file(CREATE_LINK - "../../../../Frameworks/libboost_system-mt.dylib" - "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_system-mt.dylib" - SYMBOLIC - ) -file(CREATE_LINK "../../../../Frameworks/libboost_thread-mt.dylib" "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_thread-mt.dylib" SYMBOLIC @@ -85,28 +65,18 @@ file(CREATE_LINK SYMBOLIC ) file(CREATE_LINK - "../../../../Frameworks/libexpat.1.dylib" - "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libexpat.1.dylib" - SYMBOLIC - ) -file(CREATE_LINK - "../../../../Frameworks/libfreetype.6.dylib" - "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libfreetype.6.dylib" - SYMBOLIC - ) -file(CREATE_LINK - "../../../../Frameworks/libbz2.1.0.dylib" - "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libbz2.1.0.dylib" + "../../../../Frameworks/libboost_regex-mt.dylib" + "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_regex-mt.dylib" SYMBOLIC ) file(CREATE_LINK - "../../../../Frameworks/libbrotlidec.1.dylib" - "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libbrotlidec.1.dylib" + "../../../../Frameworks/libboost_system-mt.dylib" + "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libboost_system-mt.dylib" SYMBOLIC ) file(CREATE_LINK - "../../../../Frameworks/libbrotlicommon.1.dylib" - "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libbrotlicommon.1.dylib" + "../../../../Frameworks/libexpat.1.dylib" + "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libexpat.1.dylib" SYMBOLIC ) file(CREATE_LINK @@ -134,6 +104,7 @@ fixup_bundle(${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/ file(CHMOD "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper.app/Contents/MacOS/DullahanHelper" + "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper (Alerts).app/Contents/MacOS/DullahanHelper (Alerts)" "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper (GPU).app/Contents/MacOS/DullahanHelper (GPU)" "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper (Plugin).app/Contents/MacOS/DullahanHelper (Plugin)" "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper (Renderer).app/Contents/MacOS/DullahanHelper (Renderer)" @@ -178,21 +149,18 @@ execute_process( COMMAND lipo libboost_url-mt.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libboost_url-mt.dylib - COMMAND lipo libbrotlicommon.1.1.0.dylib + COMMAND lipo libbrotlicommon.1.2.0.dylib -thin ${CMAKE_OSX_ARCHITECTURES} - -output libbrotlicommon.1.1.0.dylib - COMMAND lipo libbrotlidec.1.1.0.dylib + -output libbrotlicommon.1.2.0.dylib + COMMAND lipo libbrotlidec.1.2.0.dylib -thin ${CMAKE_OSX_ARCHITECTURES} - -output libbrotlidec.1.1.0.dylib + -output libbrotlidec.1.2.0.dylib COMMAND lipo libbz2.1.0.8.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libbz2.1.0.8.dylib - COMMAND lipo libcollada14dom.2.3-r8.dylib + COMMAND lipo libexpat.1.11.1.dylib -thin ${CMAKE_OSX_ARCHITECTURES} - -output libcollada14dom.2.3-r8.dylib - COMMAND lipo libexpat.1.10.0.dylib - -thin ${CMAKE_OSX_ARCHITECTURES} - -output libexpat.1.10.0.dylib + -output libexpat.1.11.1.dylib COMMAND lipo libfreetype.6.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libfreetype.6.dylib @@ -238,6 +206,9 @@ execute_process( COMMAND lipo libopenal.1.24.2.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libopenal.1.24.2.dylib + COMMAND lipo libopenjp2.2.5.4.dylib + -thin ${CMAKE_OSX_ARCHITECTURES} + -output libopenjp2.2.5.4.dylib COMMAND lipo libpng16.16.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libpng16.16.dylib @@ -271,6 +242,7 @@ execute_process( COMMAND sudo codesign -f -s ${SIGNING_IDENTITY} --timestamp -o runtime --runtime-version ${CMAKE_OSX_DEPLOYMENT_TARGET} Frameworks/Chromium\ Embedded\ Framework.framework/Libraries/libEGL.dylib Frameworks/Chromium\ Embedded\ Framework.framework/Libraries/libGLESv2.dylib + Frameworks/Chromium\ Embedded\ Framework.framework/Libraries/libcef_sandbox.dylib Frameworks/Chromium\ Embedded\ Framework.framework/Libraries/libvk_swiftshader.dylib Frameworks/Chromium\ Embedded\ Framework.framework Frameworks/libalut.0.dylib @@ -285,11 +257,11 @@ execute_process( Frameworks/libboost_system-mt.dylib Frameworks/libboost_thread-mt.dylib Frameworks/libboost_url-mt.dylib - Frameworks/libbrotlicommon.1.1.0.dylib - Frameworks/libbrotlidec.1.1.0.dylib + Frameworks/libbrotlicommon.1.2.0.dylib + Frameworks/libbrotlidec.1.2.0.dylib Frameworks/libbz2.1.0.8.dylib - Frameworks/libcollada14dom.2.3-r8.dylib - Frameworks/libexpat.1.10.0.dylib + Frameworks/libdiscord_partner_sdk.dylib + Frameworks/libexpat.1.11.1.dylib Frameworks/libfreetype.6.dylib Frameworks/libhunspell-1.7.0.dylib Frameworks/libiconv.2.dylib @@ -305,6 +277,7 @@ execute_process( Frameworks/libnghttp2.14.dylib Frameworks/libogg.0.dylib Frameworks/libopenal.1.24.2.dylib + Frameworks/libopenjp2.2.5.4.dylib Frameworks/libpng16.16.dylib Frameworks/libvlc.5.dylib Frameworks/libvlccore.9.dylib @@ -314,358 +287,357 @@ execute_process( Frameworks/libxml2.2.dylib Frameworks/libz.1.3.1.dylib Resources/libndofdev.dylib - Resources/llplugin/media_plugin_cef.dylib - Resources/llplugin/media_plugin_libvlc.dylib - Resources/llplugin/plugins/liba52_plugin.dylib - Resources/llplugin/plugins/libaccess_concat_plugin.dylib - Resources/llplugin/plugins/libaccess_imem_plugin.dylib - Resources/llplugin/plugins/libaccess_mms_plugin.dylib - Resources/llplugin/plugins/libaccess_output_dummy_plugin.dylib - Resources/llplugin/plugins/libaccess_output_file_plugin.dylib - Resources/llplugin/plugins/libaccess_output_http_plugin.dylib - Resources/llplugin/plugins/libaccess_output_livehttp_plugin.dylib - Resources/llplugin/plugins/libaccess_output_rist_plugin.dylib - Resources/llplugin/plugins/libaccess_output_shout_plugin.dylib - Resources/llplugin/plugins/libaccess_output_srt_plugin.dylib - Resources/llplugin/plugins/libaccess_output_udp_plugin.dylib - Resources/llplugin/plugins/libaccess_realrtsp_plugin.dylib - Resources/llplugin/plugins/libaccess_srt_plugin.dylib - Resources/llplugin/plugins/libadaptive_plugin.dylib - Resources/llplugin/plugins/libaddonsfsstorage_plugin.dylib - Resources/llplugin/plugins/libaddonsvorepository_plugin.dylib - Resources/llplugin/plugins/libadf_plugin.dylib - Resources/llplugin/plugins/libadjust_plugin.dylib - Resources/llplugin/plugins/libadpcm_plugin.dylib - Resources/llplugin/plugins/libadummy_plugin.dylib - Resources/llplugin/plugins/libaes3_plugin.dylib - Resources/llplugin/plugins/libafile_plugin.dylib - Resources/llplugin/plugins/libaiff_plugin.dylib - Resources/llplugin/plugins/libalphamask_plugin.dylib - Resources/llplugin/plugins/libamem_plugin.dylib - Resources/llplugin/plugins/libanaglyph_plugin.dylib - Resources/llplugin/plugins/libantiflicker_plugin.dylib - Resources/llplugin/plugins/libaom_plugin.dylib - Resources/llplugin/plugins/libaraw_plugin.dylib - Resources/llplugin/plugins/libarchive_plugin.dylib - Resources/llplugin/plugins/libaribsub_plugin.dylib - Resources/llplugin/plugins/libasf_plugin.dylib - Resources/llplugin/plugins/libattachment_plugin.dylib - Resources/llplugin/plugins/libau_plugin.dylib - Resources/llplugin/plugins/libaudio_format_plugin.dylib - Resources/llplugin/plugins/libaudiobargraph_a_plugin.dylib - Resources/llplugin/plugins/libaudiobargraph_v_plugin.dylib - Resources/llplugin/plugins/libaudioscrobbler_plugin.dylib - Resources/llplugin/plugins/libaudiotoolboxmidi_plugin.dylib - Resources/llplugin/plugins/libauhal_plugin.dylib - Resources/llplugin/plugins/libavaudiocapture_plugin.dylib - Resources/llplugin/plugins/libavcapture_plugin.dylib - Resources/llplugin/plugins/libavcodec_plugin.dylib - Resources/llplugin/plugins/libavi_plugin.dylib - Resources/llplugin/plugins/libball_plugin.dylib - Resources/llplugin/plugins/libblend_plugin.dylib - Resources/llplugin/plugins/libblendbench_plugin.dylib - Resources/llplugin/plugins/libbluescreen_plugin.dylib - Resources/llplugin/plugins/libbluray-awt-j2se-1.3.2.jar - Resources/llplugin/plugins/libbluray-j2se-1.3.2.jar - Resources/llplugin/plugins/libbonjour_plugin.dylib - Resources/llplugin/plugins/libcache_block_plugin.dylib - Resources/llplugin/plugins/libcache_read_plugin.dylib - Resources/llplugin/plugins/libcaf_plugin.dylib - Resources/llplugin/plugins/libcanvas_plugin.dylib - Resources/llplugin/plugins/libcaopengllayer_plugin.dylib - Resources/llplugin/plugins/libcc_plugin.dylib - Resources/llplugin/plugins/libcdda_plugin.dylib - Resources/llplugin/plugins/libcdg_plugin.dylib - Resources/llplugin/plugins/libchain_plugin.dylib - Resources/llplugin/plugins/libchorus_flanger_plugin.dylib - Resources/llplugin/plugins/libci_filters_plugin.dylib - Resources/llplugin/plugins/libclone_plugin.dylib - Resources/llplugin/plugins/libcolorthres_plugin.dylib - Resources/llplugin/plugins/libcompressor_plugin.dylib - Resources/llplugin/plugins/libconsole_logger_plugin.dylib - Resources/llplugin/plugins/libcroppadd_plugin.dylib - Resources/llplugin/plugins/libcvdsub_plugin.dylib - Resources/llplugin/plugins/libcvpx_plugin.dylib - Resources/llplugin/plugins/libdav1d_plugin.dylib - Resources/llplugin/plugins/libdca_plugin.dylib - Resources/llplugin/plugins/libdcp_plugin.dylib - Resources/llplugin/plugins/libddummy_plugin.dylib - Resources/llplugin/plugins/libdecomp_plugin.dylib - Resources/llplugin/plugins/libdeinterlace_plugin.dylib - Resources/llplugin/plugins/libdemux_cdg_plugin.dylib - Resources/llplugin/plugins/libdemux_chromecast_plugin.dylib - Resources/llplugin/plugins/libdemux_stl_plugin.dylib - Resources/llplugin/plugins/libdemuxdump_plugin.dylib - Resources/llplugin/plugins/libdiracsys_plugin.dylib - Resources/llplugin/plugins/libdirectory_demux_plugin.dylib - Resources/llplugin/plugins/libdolby_surround_decoder_plugin.dylib - Resources/llplugin/plugins/libdummy_plugin.dylib - Resources/llplugin/plugins/libdvbsub_plugin.dylib - Resources/llplugin/plugins/libdvdnav_plugin.dylib - Resources/llplugin/plugins/libdvdread_plugin.dylib - Resources/llplugin/plugins/libdynamicoverlay_plugin.dylib - Resources/llplugin/plugins/libedgedetection_plugin.dylib - Resources/llplugin/plugins/libedummy_plugin.dylib - Resources/llplugin/plugins/libequalizer_plugin.dylib - Resources/llplugin/plugins/liberase_plugin.dylib - Resources/llplugin/plugins/libes_plugin.dylib - Resources/llplugin/plugins/libexport_plugin.dylib - Resources/llplugin/plugins/libextract_plugin.dylib - Resources/llplugin/plugins/libfaad_plugin.dylib - Resources/llplugin/plugins/libfile_keystore_plugin.dylib - Resources/llplugin/plugins/libfile_logger_plugin.dylib - Resources/llplugin/plugins/libfilesystem_plugin.dylib - Resources/llplugin/plugins/libfingerprinter_plugin.dylib - Resources/llplugin/plugins/libflac_plugin.dylib - Resources/llplugin/plugins/libflacsys_plugin.dylib - Resources/llplugin/plugins/libflaschen_plugin.dylib - Resources/llplugin/plugins/libfloat_mixer_plugin.dylib - Resources/llplugin/plugins/libfolder_plugin.dylib - Resources/llplugin/plugins/libfps_plugin.dylib - Resources/llplugin/plugins/libfreetype_plugin.dylib - Resources/llplugin/plugins/libfreeze_plugin.dylib - Resources/llplugin/plugins/libftp_plugin.dylib - Resources/llplugin/plugins/libg711_plugin.dylib - Resources/llplugin/plugins/libgain_plugin.dylib - Resources/llplugin/plugins/libgaussianblur_plugin.dylib - Resources/llplugin/plugins/libgestures_plugin.dylib - Resources/llplugin/plugins/libglconv_cvpx_plugin.dylib - Resources/llplugin/plugins/libgme_plugin.dylib - Resources/llplugin/plugins/libgnutls_plugin.dylib - Resources/llplugin/plugins/libgoom_plugin.dylib - Resources/llplugin/plugins/libgradfun_plugin.dylib - Resources/llplugin/plugins/libgradient_plugin.dylib - Resources/llplugin/plugins/libgrain_plugin.dylib - Resources/llplugin/plugins/libgrey_yuv_plugin.dylib - Resources/llplugin/plugins/libh26x_plugin.dylib - Resources/llplugin/plugins/libhds_plugin.dylib - Resources/llplugin/plugins/libheadphone_channel_mixer_plugin.dylib - Resources/llplugin/plugins/libhotkeys_plugin.dylib - Resources/llplugin/plugins/libhqdn3d_plugin.dylib - Resources/llplugin/plugins/libhttp_plugin.dylib - Resources/llplugin/plugins/libhttps_plugin.dylib - Resources/llplugin/plugins/libi420_10_p010_plugin.dylib - Resources/llplugin/plugins/libi420_nv12_plugin.dylib - Resources/llplugin/plugins/libi420_rgb_mmx_plugin.dylib - Resources/llplugin/plugins/libi420_rgb_plugin.dylib - Resources/llplugin/plugins/libi420_rgb_sse2_plugin.dylib - Resources/llplugin/plugins/libi420_yuy2_mmx_plugin.dylib - Resources/llplugin/plugins/libi420_yuy2_plugin.dylib - Resources/llplugin/plugins/libi420_yuy2_sse2_plugin.dylib - Resources/llplugin/plugins/libi422_i420_plugin.dylib - Resources/llplugin/plugins/libi422_yuy2_mmx_plugin.dylib - Resources/llplugin/plugins/libi422_yuy2_plugin.dylib - Resources/llplugin/plugins/libi422_yuy2_sse2_plugin.dylib - Resources/llplugin/plugins/libidummy_plugin.dylib - Resources/llplugin/plugins/libimage_plugin.dylib - Resources/llplugin/plugins/libimem_plugin.dylib - Resources/llplugin/plugins/libinflate_plugin.dylib - Resources/llplugin/plugins/libinteger_mixer_plugin.dylib - Resources/llplugin/plugins/libinvert_plugin.dylib - Resources/llplugin/plugins/libjpeg_plugin.dylib - Resources/llplugin/plugins/libkaraoke_plugin.dylib - Resources/llplugin/plugins/libkate_plugin.dylib - Resources/llplugin/plugins/libkeychain_plugin.dylib - Resources/llplugin/plugins/liblibass_plugin.dylib - Resources/llplugin/plugins/liblibbluray_plugin.dylib - Resources/llplugin/plugins/liblibmpeg2_plugin.dylib - Resources/llplugin/plugins/liblive555_plugin.dylib - Resources/llplugin/plugins/liblogger_plugin.dylib - Resources/llplugin/plugins/liblogo_plugin.dylib - Resources/llplugin/plugins/liblpcm_plugin.dylib - Resources/llplugin/plugins/liblua_plugin.dylib - Resources/llplugin/plugins/libmacosx_plugin.dylib - Resources/llplugin/plugins/libmad_plugin.dylib - Resources/llplugin/plugins/libmagnify_plugin.dylib - Resources/llplugin/plugins/libmarq_plugin.dylib - Resources/llplugin/plugins/libmediadirs_plugin.dylib - Resources/llplugin/plugins/libmemory_keystore_plugin.dylib - Resources/llplugin/plugins/libmirror_plugin.dylib - Resources/llplugin/plugins/libmjpeg_plugin.dylib - Resources/llplugin/plugins/libmkv_plugin.dylib - Resources/llplugin/plugins/libmod_plugin.dylib - Resources/llplugin/plugins/libmono_plugin.dylib - Resources/llplugin/plugins/libmosaic_plugin.dylib - Resources/llplugin/plugins/libmotion_plugin.dylib - Resources/llplugin/plugins/libmotionblur_plugin.dylib - Resources/llplugin/plugins/libmotiondetect_plugin.dylib - Resources/llplugin/plugins/libmp4_plugin.dylib - Resources/llplugin/plugins/libmpc_plugin.dylib - Resources/llplugin/plugins/libmpg123_plugin.dylib - Resources/llplugin/plugins/libmpgv_plugin.dylib - Resources/llplugin/plugins/libmux_asf_plugin.dylib - Resources/llplugin/plugins/libmux_avi_plugin.dylib - Resources/llplugin/plugins/libmux_dummy_plugin.dylib - Resources/llplugin/plugins/libmux_mp4_plugin.dylib - Resources/llplugin/plugins/libmux_mpjpeg_plugin.dylib - Resources/llplugin/plugins/libmux_ogg_plugin.dylib - Resources/llplugin/plugins/libmux_ps_plugin.dylib - Resources/llplugin/plugins/libmux_ts_plugin.dylib - Resources/llplugin/plugins/libmux_wav_plugin.dylib - Resources/llplugin/plugins/libncurses_plugin.dylib - Resources/llplugin/plugins/libnetsync_plugin.dylib - Resources/llplugin/plugins/libnfs_plugin.dylib - Resources/llplugin/plugins/libnormvol_plugin.dylib - Resources/llplugin/plugins/libnoseek_plugin.dylib - Resources/llplugin/plugins/libnsc_plugin.dylib - Resources/llplugin/plugins/libnsspeechsynthesizer_plugin.dylib - Resources/llplugin/plugins/libnsv_plugin.dylib - Resources/llplugin/plugins/libnuv_plugin.dylib - Resources/llplugin/plugins/libogg_plugin.dylib - Resources/llplugin/plugins/liboggspots_plugin.dylib - Resources/llplugin/plugins/liboldmovie_plugin.dylib - Resources/llplugin/plugins/liboldrc_plugin.dylib - Resources/llplugin/plugins/libopus_plugin.dylib - Resources/llplugin/plugins/libosx_notifications_plugin.dylib - Resources/llplugin/plugins/libpacketizer_a52_plugin.dylib - Resources/llplugin/plugins/libpacketizer_av1_plugin.dylib - Resources/llplugin/plugins/libpacketizer_copy_plugin.dylib - Resources/llplugin/plugins/libpacketizer_dirac_plugin.dylib - Resources/llplugin/plugins/libpacketizer_dts_plugin.dylib - Resources/llplugin/plugins/libpacketizer_flac_plugin.dylib - Resources/llplugin/plugins/libpacketizer_h264_plugin.dylib - Resources/llplugin/plugins/libpacketizer_hevc_plugin.dylib - Resources/llplugin/plugins/libpacketizer_mlp_plugin.dylib - Resources/llplugin/plugins/libpacketizer_mpeg4audio_plugin.dylib - Resources/llplugin/plugins/libpacketizer_mpeg4video_plugin.dylib - Resources/llplugin/plugins/libpacketizer_mpegaudio_plugin.dylib - Resources/llplugin/plugins/libpacketizer_mpegvideo_plugin.dylib - Resources/llplugin/plugins/libpacketizer_vc1_plugin.dylib - Resources/llplugin/plugins/libparam_eq_plugin.dylib - Resources/llplugin/plugins/libplaylist_plugin.dylib - Resources/llplugin/plugins/libpng_plugin.dylib - Resources/llplugin/plugins/libpodcast_plugin.dylib - Resources/llplugin/plugins/libposterize_plugin.dylib - Resources/llplugin/plugins/libpostproc_plugin.dylib - Resources/llplugin/plugins/libprefetch_plugin.dylib - Resources/llplugin/plugins/libps_plugin.dylib - Resources/llplugin/plugins/libpsychedelic_plugin.dylib - Resources/llplugin/plugins/libpuzzle_plugin.dylib - Resources/llplugin/plugins/libpva_plugin.dylib - Resources/llplugin/plugins/librawaud_plugin.dylib - Resources/llplugin/plugins/librawdv_plugin.dylib - Resources/llplugin/plugins/librawvid_plugin.dylib - Resources/llplugin/plugins/librawvideo_plugin.dylib - Resources/llplugin/plugins/libreal_plugin.dylib - Resources/llplugin/plugins/librecord_plugin.dylib - Resources/llplugin/plugins/libremap_plugin.dylib - Resources/llplugin/plugins/libremoteosd_plugin.dylib - Resources/llplugin/plugins/libripple_plugin.dylib - Resources/llplugin/plugins/librist_plugin.dylib - Resources/llplugin/plugins/librotate_plugin.dylib - Resources/llplugin/plugins/librss_plugin.dylib - Resources/llplugin/plugins/librtp_plugin.dylib - Resources/llplugin/plugins/librtpvideo_plugin.dylib - Resources/llplugin/plugins/librv32_plugin.dylib - Resources/llplugin/plugins/libsamplerate_plugin.dylib - Resources/llplugin/plugins/libsap_plugin.dylib - Resources/llplugin/plugins/libsatip_plugin.dylib - Resources/llplugin/plugins/libscale_plugin.dylib - Resources/llplugin/plugins/libscaletempo_pitch_plugin.dylib - Resources/llplugin/plugins/libscaletempo_plugin.dylib - Resources/llplugin/plugins/libscene_plugin.dylib - Resources/llplugin/plugins/libschroedinger_plugin.dylib - Resources/llplugin/plugins/libscreen_plugin.dylib - Resources/llplugin/plugins/libscte18_plugin.dylib - Resources/llplugin/plugins/libscte27_plugin.dylib - Resources/llplugin/plugins/libsdp_plugin.dylib - Resources/llplugin/plugins/libsecuretransport_plugin.dylib - Resources/llplugin/plugins/libsepia_plugin.dylib - Resources/llplugin/plugins/libsftp_plugin.dylib - Resources/llplugin/plugins/libsharpen_plugin.dylib - Resources/llplugin/plugins/libshm_plugin.dylib - Resources/llplugin/plugins/libsid_plugin.dylib - Resources/llplugin/plugins/libsimple_channel_mixer_plugin.dylib - Resources/llplugin/plugins/libskiptags_plugin.dylib - Resources/llplugin/plugins/libsmf_plugin.dylib - Resources/llplugin/plugins/libspatialaudio_plugin.dylib - Resources/llplugin/plugins/libspatializer_plugin.dylib - Resources/llplugin/plugins/libspdif_plugin.dylib - Resources/llplugin/plugins/libspeex_plugin.dylib - Resources/llplugin/plugins/libspeex_resampler_plugin.dylib - Resources/llplugin/plugins/libspudec_plugin.dylib - Resources/llplugin/plugins/libstats_plugin.dylib - Resources/llplugin/plugins/libstereo_widen_plugin.dylib - Resources/llplugin/plugins/libstl_plugin.dylib - Resources/llplugin/plugins/libstream_out_autodel_plugin.dylib - Resources/llplugin/plugins/libstream_out_bridge_plugin.dylib - Resources/llplugin/plugins/libstream_out_chromaprint_plugin.dylib - Resources/llplugin/plugins/libstream_out_chromecast_plugin.dylib - Resources/llplugin/plugins/libstream_out_cycle_plugin.dylib - Resources/llplugin/plugins/libstream_out_delay_plugin.dylib - Resources/llplugin/plugins/libstream_out_description_plugin.dylib - Resources/llplugin/plugins/libstream_out_display_plugin.dylib - Resources/llplugin/plugins/libstream_out_dummy_plugin.dylib - Resources/llplugin/plugins/libstream_out_duplicate_plugin.dylib - Resources/llplugin/plugins/libstream_out_es_plugin.dylib - Resources/llplugin/plugins/libstream_out_gather_plugin.dylib - Resources/llplugin/plugins/libstream_out_mosaic_bridge_plugin.dylib - Resources/llplugin/plugins/libstream_out_record_plugin.dylib - Resources/llplugin/plugins/libstream_out_rtp_plugin.dylib - Resources/llplugin/plugins/libstream_out_setid_plugin.dylib - Resources/llplugin/plugins/libstream_out_smem_plugin.dylib - Resources/llplugin/plugins/libstream_out_standard_plugin.dylib - Resources/llplugin/plugins/libstream_out_stats_plugin.dylib - Resources/llplugin/plugins/libstream_out_transcode_plugin.dylib - Resources/llplugin/plugins/libsubsdec_plugin.dylib - Resources/llplugin/plugins/libsubsdelay_plugin.dylib - Resources/llplugin/plugins/libsubstx3g_plugin.dylib - Resources/llplugin/plugins/libsubsusf_plugin.dylib - Resources/llplugin/plugins/libsubtitle_plugin.dylib - Resources/llplugin/plugins/libsvcdsub_plugin.dylib - Resources/llplugin/plugins/libswscale_plugin.dylib - Resources/llplugin/plugins/libsyslog_plugin.dylib - Resources/llplugin/plugins/libt140_plugin.dylib - Resources/llplugin/plugins/libtaglib_plugin.dylib - Resources/llplugin/plugins/libtcp_plugin.dylib - Resources/llplugin/plugins/libtdummy_plugin.dylib - Resources/llplugin/plugins/libtelx_plugin.dylib - Resources/llplugin/plugins/libtextst_plugin.dylib - Resources/llplugin/plugins/libtheora_plugin.dylib - Resources/llplugin/plugins/libtimecode_plugin.dylib - Resources/llplugin/plugins/libtospdif_plugin.dylib - Resources/llplugin/plugins/libtransform_plugin.dylib - Resources/llplugin/plugins/libtrivial_channel_mixer_plugin.dylib - Resources/llplugin/plugins/libts_plugin.dylib - Resources/llplugin/plugins/libtta_plugin.dylib - Resources/llplugin/plugins/libttml_plugin.dylib - Resources/llplugin/plugins/libtwolame_plugin.dylib - Resources/llplugin/plugins/libty_plugin.dylib - Resources/llplugin/plugins/libudp_plugin.dylib - Resources/llplugin/plugins/libugly_resampler_plugin.dylib - Resources/llplugin/plugins/libuleaddvaudio_plugin.dylib - Resources/llplugin/plugins/libupnp_plugin.dylib - Resources/llplugin/plugins/libvc1_plugin.dylib - Resources/llplugin/plugins/libvcd_plugin.dylib - Resources/llplugin/plugins/libvdr_plugin.dylib - Resources/llplugin/plugins/libvdummy_plugin.dylib - Resources/llplugin/plugins/libvhs_plugin.dylib - Resources/llplugin/plugins/libvideotoolbox_plugin.dylib - Resources/llplugin/plugins/libvisual_plugin.dylib - Resources/llplugin/plugins/libvlc.5.dylib - Resources/llplugin/plugins/libvlccore.9.dylib - Resources/llplugin/plugins/libvmem_plugin.dylib - Resources/llplugin/plugins/libvobsub_plugin.dylib - Resources/llplugin/plugins/libvoc_plugin.dylib - Resources/llplugin/plugins/libvod_rtsp_plugin.dylib - Resources/llplugin/plugins/libvorbis_plugin.dylib - Resources/llplugin/plugins/libvout_macosx_plugin.dylib - Resources/llplugin/plugins/libvpx_plugin.dylib - Resources/llplugin/plugins/libwall_plugin.dylib - Resources/llplugin/plugins/libwav_plugin.dylib - Resources/llplugin/plugins/libwave_plugin.dylib - Resources/llplugin/plugins/libwebvtt_plugin.dylib - Resources/llplugin/plugins/libx26410b_plugin.dylib - Resources/llplugin/plugins/libx264_plugin.dylib - Resources/llplugin/plugins/libx265_plugin.dylib - Resources/llplugin/plugins/libxa_plugin.dylib - Resources/llplugin/plugins/libxml_plugin.dylib - Resources/llplugin/plugins/libyuv_plugin.dylib - Resources/llplugin/plugins/libyuvp_plugin.dylib - Resources/llplugin/plugins/libyuy2_i420_plugin.dylib - Resources/llplugin/plugins/libyuy2_i422_plugin.dylib - Resources/llplugin/plugins/libzvbi_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/media_plugin_cef.dylib + Resources/SLPlugin.app/Contents/Frameworks/media_plugin_libvlc.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_concat_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_imem_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_mms_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_dummy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_file_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_http_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_livehttp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_rist_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_shout_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_srt_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_output_udp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_realrtsp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaccess_srt_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libadaptive_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaddonsfsstorage_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaddonsvorepository_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libadf_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libadjust_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libadpcm_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libadummy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaes3_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libafile_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaiff_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libalphamask_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libamem_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libanaglyph_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libantiflicker_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaom_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaraw_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libarchive_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaribsub_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libasf_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libattachment_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libau_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaudio_format_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaudiobargraph_a_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaudiobargraph_v_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaudioscrobbler_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libaudiotoolboxmidi_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libauhal_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libavaudiocapture_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libavcapture_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libavcodec_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libavi_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libball_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libblend_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libblendbench_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libbluescreen_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libbluray-awt-j2se-1.4.0.jar + Resources/SLPlugin.app/Contents/Frameworks/plugins/libbluray-j2se-1.4.0.jar + Resources/SLPlugin.app/Contents/Frameworks/plugins/libbonjour_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcache_block_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcache_read_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcaf_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcanvas_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcaopengllayer_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcc_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcdda_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcdg_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libchain_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libchorus_flanger_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libci_filters_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libclone_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcolorthres_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcompressor_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libconsole_logger_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcroppadd_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcvdsub_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libcvpx_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdav1d_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdcp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libddummy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdecomp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdeinterlace_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdemux_cdg_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdemux_chromecast_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdemux_stl_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdemuxdump_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdiracsys_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdirectory_demux_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdmxmus_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdolby_surround_decoder_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdummy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdvbsub_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdvdnav_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdvdread_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libdynamicoverlay_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libedgedetection_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libedummy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libequalizer_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liberase_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libes_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libexport_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libextract_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libfaad_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libfile_keystore_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libfile_logger_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libfilesystem_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libfingerprinter_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libflac_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libflacsys_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libflaschen_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libfloat_mixer_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libfolder_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libfps_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libfreetype_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libfreeze_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libftp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libg711_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libgain_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libgaussianblur_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libgestures_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libglconv_cvpx_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libgme_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libgnutls_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libgoom_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libgradfun_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libgradient_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libgrain_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libgrey_yuv_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libh26x_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libhds_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libheadphone_channel_mixer_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libhotkeys_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libhqdn3d_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libhttp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libhttps_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_10_p010_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_nv12_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_rgb_mmx_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_rgb_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_rgb_sse2_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_yuy2_mmx_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_yuy2_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi420_yuy2_sse2_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi422_i420_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi422_yuy2_mmx_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi422_yuy2_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libi422_yuy2_sse2_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libidummy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libimage_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libimem_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libinflate_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libinteger_mixer_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libinvert_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libjpeg_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libkaraoke_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libkate_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libkeychain_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liblibass_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liblibbluray_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liblive555_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liblogger_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liblogo_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liblpcm_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liblua_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmacosx_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmad_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmagnify_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmarq_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmediadirs_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmemory_keystore_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmirror_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmjpeg_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmkv_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmod_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmono_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmosaic_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmotion_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmotionblur_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmotiondetect_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmp4_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmpc_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmpg123_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmpgv_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_asf_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_avi_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_dummy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_mp4_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_mpjpeg_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_ogg_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_ps_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_ts_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libmux_wav_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libncurses_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libnetsync_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libnfs_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libnormvol_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libnoseek_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libnsc_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libnsspeechsynthesizer_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libnsv_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libnuv_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libogg_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liboggspots_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liboldmovie_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/liboldrc_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libopus_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libosx_notifications_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_a52_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_av1_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_copy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_dirac_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_dts_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_flac_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_h264_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_hevc_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_mlp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_mpeg4audio_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_mpeg4video_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_mpegaudio_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_mpegvideo_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpacketizer_vc1_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libparam_eq_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libplaylist_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpng_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpodcast_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libposterize_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpostproc_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libprefetch_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libps_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpsychedelic_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpuzzle_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libpva_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librawaud_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librawdv_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librawvid_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librawvideo_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libreal_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librecord_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libremap_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libremoteosd_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libripple_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librist_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librotate_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librss_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librtp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librtpvideo_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/librv32_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsamplerate_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsap_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsatip_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libscale_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libscaletempo_pitch_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libscaletempo_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libscene_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libschroedinger_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libscreen_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libscte18_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libscte27_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsdp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsecuretransport_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsepia_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsftp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsharpen_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libshm_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsid_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsimple_channel_mixer_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libskiptags_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsmf_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libspatialaudio_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libspatializer_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libspdif_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libspeex_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libspeex_resampler_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libspudec_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstats_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstereo_widen_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstl_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_autodel_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_bridge_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_chromaprint_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_chromecast_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_cycle_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_delay_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_description_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_display_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_dummy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_duplicate_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_es_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_gather_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_mosaic_bridge_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_record_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_rtp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_setid_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_smem_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_standard_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_stats_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libstream_out_transcode_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsubsdec_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsubsdelay_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsubstx3g_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsubsusf_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsubtitle_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsvcdsub_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libswscale_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libsyslog_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libt140_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtaglib_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtcp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtdummy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtelx_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtextst_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtheora_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtimecode_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtospdif_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtransform_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtrivial_channel_mixer_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libts_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtta_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libttml_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libtwolame_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libty_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libudp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libugly_resampler_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libuleaddvaudio_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libupnp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvc1_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvcd_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvdr_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvdummy_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvhs_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvideotoolbox_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvisual_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvlc.5.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvlccore.9.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvmem_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvobsub_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvoc_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvod_rtsp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvorbis_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvout_macosx_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libvpx_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libwall_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libwav_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libwave_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libwebvtt_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libx26410b_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libx264_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libx265_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libxa_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libxml_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libyuv_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libyuvp_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libyuy2_i420_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libyuy2_i422_plugin.dylib + Resources/SLPlugin.app/Contents/Frameworks/plugins/libzvbi_plugin.dylib Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper.app + Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper\ \(Alerts\).app/Contents/MacOS/DullahanHelper\ \(Alerts\) Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper\ \(GPU\).app/Contents/MacOS/DullahanHelper\ \(GPU\) Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper\ \(Plugin\).app/Contents/MacOS/DullahanHelper\ \(Plugin\) WORKING_DIRECTORY ${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents @@ -676,6 +648,7 @@ execute_process( DullahanHelper\ \(Renderer\).app/Contents/MacOS/DullahanHelper\ \(Renderer\) COMMAND sudo codesign -f -s ${SIGNING_IDENTITY} --timestamp -o runtime --runtime-version ${CMAKE_OSX_DEPLOYMENT_TARGET} --deep + DullahanHelper\ \(Alerts\).app DullahanHelper\ \(GPU\).app DullahanHelper\ \(Plugin\).app WORKING_DIRECTORY ${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks diff --git a/indra/newview/PKGBUILD.in b/indra/newview/PKGBUILD.in index f288b12287..3310c6c601 100644 --- a/indra/newview/PKGBUILD.in +++ b/indra/newview/PKGBUILD.in @@ -6,7 +6,7 @@ pkgdesc="${VIEWER_PACKAGE_COMMENT}" arch=('${CMAKE_SYSTEM_PROCESSOR}') url="https://${VIEWER_PACKAGE_DOMAIN_NAME}" license=('LGPL-2.1') -depends=(apr-util boost-libs fltk glu hunspell libnghttp2 sdl2 uriparser vlc libvorbis) +depends=(apr-util at-spi2-core boost-libs fltk glu hunspell libnghttp2 openjpeg2 sdl2 vlc libvorbis) package() { cd "$startdir" diff --git a/indra/newview/SecondLife.nib b/indra/newview/SecondLife.nib Binary files differdeleted file mode 100644 index ef0fa80b12..0000000000 --- a/indra/newview/SecondLife.nib +++ /dev/null diff --git a/indra/newview/SecondLife.xib b/indra/newview/SecondLife.xib index 8302392f5d..d123eee79e 100644 --- a/indra/newview/SecondLife.xib +++ b/indra/newview/SecondLife.xib @@ -1,1136 +1,193 @@ <?xml version="1.0" encoding="UTF-8"?> -<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00"> - <data> - <int key="IBDocument.SystemTarget">1060</int> - <string key="IBDocument.SystemVersion">12E55</string> - <string key="IBDocument.InterfaceBuilderVersion">4457.6</string> - <string key="IBDocument.AppKitVersion">1187.39</string> - <string key="IBDocument.HIToolboxVersion">626.00</string> - <object class="NSMutableDictionary" key="IBDocument.PluginVersions"> - <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="NS.object.0">4457.6</string> - </object> - <array key="IBDocument.IntegratedClassDependencies"> - <string>NSCustomObject</string> - <string>NSMenu</string> - <string>NSMenuItem</string> - <string>NSScrollView</string> - <string>NSScroller</string> - <string>NSTextView</string> - <string>NSView</string> - <string>NSWindowTemplate</string> - </array> - <array key="IBDocument.PluginDependencies"> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - </array> - <object class="NSMutableDictionary" key="IBDocument.Metadata"> - <string key="NS.key.0">PluginDependencyRecalculationVersion</string> - <integer value="1" key="NS.object.0"/> - </object> - <array class="NSMutableArray" key="IBDocument.RootObjects" id="1048"> - <object class="NSCustomObject" id="1021"> - <string key="NSClassName">NSApplication</string> - </object> - <object class="NSCustomObject" id="1014"> - <string key="NSClassName">FirstResponder</string> - </object> - <object class="NSCustomObject" id="1050"> - <string key="NSClassName">NSApplication</string> - </object> - <object class="NSMenu" id="649796088"> - <string key="NSTitle">Main Menu</string> - <array class="NSMutableArray" key="NSMenuItems"> - <object class="NSMenuItem" id="694149608"> - <reference key="NSMenu" ref="649796088"/> - <string key="NSTitle">Megapahit</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <object class="NSCustomResource" key="NSOnImage" id="353210768"> - <string key="NSClassName">NSImage</string> - <string key="NSResourceName">NSMenuCheckmark</string> - </object> - <object class="NSCustomResource" key="NSMixedImage" id="549394948"> - <string key="NSClassName">NSImage</string> - <string key="NSResourceName">NSMenuMixedState</string> - </object> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="110575045"> - <string key="NSTitle">Megapahit</string> - <array class="NSMutableArray" key="NSMenuItems"> - <object class="NSMenuItem" id="238522557"> - <reference key="NSMenu" ref="110575045"/> - <string key="NSTitle">About Megapahit</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - <object class="NSMenuItem" id="304266470"> - <reference key="NSMenu" ref="110575045"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - <object class="NSMenuItem" id="609285721"> - <reference key="NSMenu" ref="110575045"/> - <string key="NSTitle">Preferences…</string> - <string key="NSKeyEquiv">,</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - <object class="NSMenuItem" id="481834944"> - <reference key="NSMenu" ref="110575045"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - <object class="NSMenuItem" id="1046388886"> - <reference key="NSMenu" ref="110575045"/> - <string key="NSTitle">Services</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="752062318"> - <string key="NSTitle">Services</string> - <array class="NSMutableArray" key="NSMenuItems"/> - <string key="NSName">_NSServicesMenu</string> - </object> - </object> - <object class="NSMenuItem" id="646227648"> - <reference key="NSMenu" ref="110575045"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - <object class="NSMenuItem" id="755159360"> - <reference key="NSMenu" ref="110575045"/> - <string key="NSTitle">Hide Megapahit</string> - <string key="NSKeyEquiv">h</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - <object class="NSMenuItem" id="342932134"> - <reference key="NSMenu" ref="110575045"/> - <string key="NSTitle">Hide Others</string> - <string key="NSKeyEquiv">h</string> - <int key="NSKeyEquivModMask">1572864</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - <object class="NSMenuItem" id="908899353"> - <reference key="NSMenu" ref="110575045"/> - <string key="NSTitle">Show All</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - <object class="NSMenuItem" id="1056857174"> - <reference key="NSMenu" ref="110575045"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - <object class="NSMenuItem" id="632727374"> - <reference key="NSMenu" ref="110575045"/> - <string key="NSTitle">Quit Megapahit</string> - <string key="NSKeyEquiv">q</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - </array> - <string key="NSName">_NSAppleMenu</string> - </object> - </object> - <object class="NSMenuItem" id="725688984"> - <reference key="NSMenu" ref="649796088"/> - <string key="NSTitle">Edit</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="701759256"> - <string key="NSTitle">Edit</string> - <array class="NSMutableArray" key="NSMenuItems"> - <object class="NSMenuItem" id="521487141"> - <reference key="NSMenu" ref="701759256"/> - <string key="NSTitle">Undo</string> - <string key="NSKeyEquiv">z</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - <object class="NSMenuItem" id="668936019"> - <reference key="NSMenu" ref="701759256"/> - <string key="NSTitle">Redo</string> - <string key="NSKeyEquiv">Z</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - <object class="NSMenuItem" id="383018193"> - <reference key="NSMenu" ref="701759256"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - <object class="NSMenuItem" id="984623395"> - <reference key="NSMenu" ref="701759256"/> - <string key="NSTitle">Cut</string> - <string key="NSKeyEquiv">x</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - <object class="NSMenuItem" id="656529582"> - <reference key="NSMenu" ref="701759256"/> - <string key="NSTitle">Copy</string> - <string key="NSKeyEquiv">c</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - <object class="NSMenuItem" id="1032676691"> - <reference key="NSMenu" ref="701759256"/> - <string key="NSTitle">Paste</string> - <string key="NSKeyEquiv">v</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - <object class="NSMenuItem" id="538907583"> - <reference key="NSMenu" ref="701759256"/> - <string key="NSTitle">Select All</string> - <string key="NSKeyEquiv">a</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - </array> - </object> - </object> - <object class="NSMenuItem" id="713487014"> - <reference key="NSMenu" ref="649796088"/> - <string key="NSTitle">Window</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="835318025"> - <string key="NSTitle">Window</string> - <array class="NSMutableArray" key="NSMenuItems"> - <object class="NSMenuItem" id="1011231497"> - <reference key="NSMenu" ref="835318025"/> - <string key="NSTitle">Minimize</string> - <string key="NSKeyEquiv">m</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - <object class="NSMenuItem" id="575023229"> - <reference key="NSMenu" ref="835318025"/> - <string key="NSTitle">Zoom</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - <object class="NSMenuItem" id="86356408"> - <reference key="NSMenu" ref="835318025"/> - <string key="NSTitle">Enter Full Screen</string> - <string key="NSKeyEquiv">f</string> - <int key="NSKeyEquivModMask">1310720</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - <object class="NSMenuItem" id="299356726"> - <reference key="NSMenu" ref="835318025"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - <object class="NSMenuItem" id="625202149"> - <reference key="NSMenu" ref="835318025"/> - <string key="NSTitle">Bring All to Front</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - </array> - <string key="NSName">_NSWindowsMenu</string> - </object> - </object> - <object class="NSMenuItem" id="391199113"> - <reference key="NSMenu" ref="649796088"/> - <string key="NSTitle">Help</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="353210768"/> - <reference key="NSMixedImage" ref="549394948"/> - </object> - </array> - <string key="NSName">_NSMainMenu</string> - </object> - <object class="NSCustomObject" id="756173070"> - <string key="NSClassName">LLAppDelegate</string> - </object> - <object class="NSWindowTemplate" id="110292814"> - <int key="NSWindowStyleMask">15</int> - <int key="NSWindowBacking">2</int> - <string key="NSWindowRect">{{196, 240}, {1024, 600}}</string> - <int key="NSWTFlags">74974208</int> - <string key="NSWindowTitle">Megapahit</string> - <string key="NSWindowClass">LLNSWindow</string> - <nil key="NSViewClass"/> - <nil key="NSUserInterfaceItemIdentifier"/> - <object class="NSView" key="NSWindowView" id="305280978"> - <reference key="NSNextResponder"/> - <int key="NSvFlags">256</int> - <array class="NSMutableArray" key="NSSubviews"/> - <string key="NSFrameSize">{1024, 600}</string> - <reference key="NSSuperview"/> - <reference key="NSWindow"/> - <string key="NSReuseIdentifierKey">_NS:20</string> - </object> - <string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string> - <string key="NSMaxSize">{10000000000000, 10000000000000}</string> - <string key="NSFrameAutosaveName">Megapahit</string> - <int key="NSWindowCollectionBehavior">128</int> - <bool key="NSWindowIsRestorable">NO</bool> - </object> - <object class="NSWindowTemplate" id="979091056"> - <int key="NSWindowStyleMask">31</int> - <int key="NSWindowBacking">2</int> - <string key="NSWindowRect">{{272, 176}, {938, 42}}</string> - <int key="NSWTFlags">-1535638528</int> - <string key="NSWindowTitle">Input Window</string> - <string key="NSWindowClass">LLUserInputWindow</string> - <nil key="NSViewClass"/> - <nil key="NSUserInterfaceItemIdentifier"/> - <object class="NSView" key="NSWindowView" id="1044753903"> - <reference key="NSNextResponder"/> - <int key="NSvFlags">256</int> - <array class="NSMutableArray" key="NSSubviews"> - <object class="NSScrollView" id="238626476"> - <reference key="NSNextResponder" ref="1044753903"/> - <int key="NSvFlags">256</int> - <array class="NSMutableArray" key="NSSubviews"> - <object class="NSClipView" id="871543330"> - <reference key="NSNextResponder" ref="238626476"/> - <int key="NSvFlags">2322</int> - <array class="NSMutableArray" key="NSSubviews"> - <object class="NSTextView" id="395788163"> - <reference key="NSNextResponder" ref="871543330"/> - <int key="NSvFlags">2322</int> - <set class="NSMutableSet" key="NSDragTypes"> - <string>Apple HTML pasteboard type</string> - <string>Apple PDF pasteboard type</string> - <string>Apple PICT pasteboard type</string> - <string>Apple PNG pasteboard type</string> - <string>Apple URL pasteboard type</string> - <string>CorePasteboardFlavorType 0x6D6F6F76</string> - <string>NSColor pasteboard type</string> - <string>NSFilenamesPboardType</string> - <string>NSStringPboardType</string> - <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string> - <string>NeXT RTFD pasteboard type</string> - <string>NeXT Rich Text Format v1.0 pasteboard type</string> - <string>NeXT TIFF v4.0 pasteboard type</string> - <string>NeXT font pasteboard type</string> - <string>NeXT ruler pasteboard type</string> - <string>WebURLsWithTitlesPboardType</string> - <string>public.url</string> - </set> - <string key="NSFrameSize">{938, 42}</string> - <reference key="NSSuperview" ref="871543330"/> - <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="339833963"/> - <string key="NSReuseIdentifierKey">_NS:13</string> - <object class="NSTextContainer" key="NSTextContainer" id="648552009"> - <object class="NSLayoutManager" key="NSLayoutManager"> - <object class="NSTextStorage" key="NSTextStorage"> - <object class="NSMutableString" key="NSString"> - <characters key="NS.bytes"/> - </object> - <nil key="NSDelegate"/> - </object> - <array class="NSMutableArray" key="NSTextContainers"> - <reference ref="648552009"/> - </array> - <int key="NSLMFlags">166</int> - <nil key="NSDelegate"/> - </object> - <reference key="NSTextView" ref="395788163"/> - <double key="NSWidth">938</double> - <int key="NSTCFlags">1</int> - </object> - <object class="NSTextViewSharedData" key="NSSharedData"> - <int key="NSFlags">67121127</int> - <int key="NSTextCheckingTypes">0</int> - <nil key="NSMarkedAttributes"/> - <object class="NSColor" key="NSBackgroundColor" id="535647664"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MQA</bytes> - </object> - <dictionary key="NSSelectedAttributes"> - <object class="NSColor" key="NSBackgroundColor"> - <int key="NSColorSpace">6</int> - <string key="NSCatalogName">System</string> - <string key="NSColorName">selectedTextBackgroundColor</string> - <object class="NSColor" key="NSColor"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes> - </object> - </object> - <object class="NSColor" key="NSColor"> - <int key="NSColorSpace">6</int> - <string key="NSCatalogName">System</string> - <string key="NSColorName">selectedTextColor</string> - <object class="NSColor" key="NSColor" id="835883401"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MAA</bytes> - </object> - </object> - </dictionary> - <reference key="NSInsertionColor" ref="835883401"/> - <dictionary key="NSLinkAttributes"> - <object class="NSColor" key="NSColor"> - <int key="NSColorSpace">1</int> - <bytes key="NSRGB">MCAwIDEAA</bytes> - </object> - <object class="NSCursor" key="NSCursor"> - <string key="NSHotSpot">{8, -8}</string> - <int key="NSCursorType">13</int> - </object> - <integer value="1" key="NSUnderline"/> - </dictionary> - <nil key="NSDefaultParagraphStyle"/> - <nil key="NSTextFinder"/> - <int key="NSPreferredTextFinderStyle">1</int> - </object> - <int key="NSTVFlags">6</int> - <string key="NSMaxSize">{939, 10000000}</string> - <nil key="NSDelegate"/> - </object> - </array> - <string key="NSFrame">{{1, 1}, {938, 42}}</string> - <reference key="NSSuperview" ref="238626476"/> - <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="395788163"/> - <string key="NSReuseIdentifierKey">_NS:11</string> - <reference key="NSDocView" ref="395788163"/> - <reference key="NSBGColor" ref="535647664"/> - <object class="NSCursor" key="NSCursor"> - <string key="NSHotSpot">{4, 5}</string> - <object class="NSImage" key="NSImage"> - <int key="NSImageFlags">79691776</int> - <array key="NSReps"> - <array> - <integer value="5"/> - <object class="NSURL"> - <nil key="NS.base"/> - <string key="NS.relative">file://localhost/Applications/Xcode.app/Contents/SharedFrameworks/DVTKit.framework/Resources/DVTIbeamCursor.tiff</string> - </object> - </array> - </array> - <object class="NSColor" key="NSColor"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MCAwAA</bytes> - </object> - </object> - </object> - <int key="NScvFlags">4</int> - </object> - <object class="NSScroller" id="339833963"> - <reference key="NSNextResponder" ref="238626476"/> - <int key="NSvFlags">256</int> - <string key="NSFrame">{{923, 1}, {16, 42}}</string> - <reference key="NSSuperview" ref="238626476"/> - <reference key="NSWindow"/> - <reference key="NSNextKeyView"/> - <string key="NSReuseIdentifierKey">_NS:83</string> - <bool key="NSAllowsLogicalLayoutDirection">NO</bool> - <reference key="NSTarget" ref="238626476"/> - <string key="NSAction">_doScroller:</string> - <double key="NSPercent">0.96666666666666667</double> - </object> - <object class="NSScroller" id="1067057765"> - <reference key="NSNextResponder" ref="238626476"/> - <int key="NSvFlags">-2147483392</int> - <string key="NSFrame">{{-100, -100}, {87, 18}}</string> - <reference key="NSSuperview" ref="238626476"/> - <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="871543330"/> - <string key="NSReuseIdentifierKey">_NS:33</string> - <bool key="NSAllowsLogicalLayoutDirection">NO</bool> - <int key="NSsFlags">1</int> - <reference key="NSTarget" ref="238626476"/> - <string key="NSAction">_doScroller:</string> - <double key="NSCurValue">1</double> - <double key="NSPercent">0.94565218687057495</double> - </object> - </array> - <string key="NSFrame">{{-1, -1}, {940, 44}}</string> - <reference key="NSSuperview" ref="1044753903"/> - <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="1067057765"/> - <string key="NSReuseIdentifierKey">_NS:9</string> - <int key="NSsFlags">133138</int> - <reference key="NSVScroller" ref="339833963"/> - <reference key="NSHScroller" ref="1067057765"/> - <reference key="NSContentView" ref="871543330"/> - <double key="NSMinMagnification">0.25</double> - <double key="NSMaxMagnification">4</double> - <double key="NSMagnification">1</double> - </object> - </array> - <string key="NSFrameSize">{938, 42}</string> - <reference key="NSSuperview"/> - <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="238626476"/> - <string key="NSReuseIdentifierKey">_NS:21</string> - </object> - <string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string> - <string key="NSMaxSize">{10000000000000, 10000000000000}</string> - <bool key="NSWindowIsRestorable">YES</bool> - </object> - </array> - <object class="IBObjectContainer" key="IBDocument.Objects"> - <array class="NSMutableArray" key="connectionRecords"> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">terminate:</string> - <reference key="source" ref="1050"/> - <reference key="destination" ref="632727374"/> - </object> - <int key="connectionID">823</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">orderFrontStandardAboutPanel:</string> - <reference key="source" ref="1021"/> - <reference key="destination" ref="238522557"/> - </object> - <int key="connectionID">142</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="1021"/> - <reference key="destination" ref="756173070"/> - </object> - <int key="connectionID">845</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">performMiniaturize:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="1011231497"/> - </object> - <int key="connectionID">37</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">arrangeInFront:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="625202149"/> - </object> - <int key="connectionID">39</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">performZoom:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="575023229"/> - </object> - <int key="connectionID">240</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">hide:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="755159360"/> - </object> - <int key="connectionID">369</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">hideOtherApplications:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="342932134"/> - </object> - <int key="connectionID">370</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">unhideAllApplications:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="908899353"/> - </object> - <int key="connectionID">372</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">cut:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="984623395"/> - </object> - <int key="connectionID">768</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">paste:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="1032676691"/> - </object> - <int key="connectionID">769</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">undo:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="521487141"/> - </object> - <int key="connectionID">776</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">copy:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="656529582"/> - </object> - <int key="connectionID">782</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">selectAll:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="538907583"/> - </object> - <int key="connectionID">785</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">toggleFullScreen:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="86356408"/> - </object> - <int key="connectionID">842</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">window</string> - <reference key="source" ref="756173070"/> - <reference key="destination" ref="110292814"/> - </object> - <int key="connectionID">850</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">inputWindow</string> - <reference key="source" ref="756173070"/> - <reference key="destination" ref="979091056"/> - </object> - <int key="connectionID">953</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">inputView</string> - <reference key="source" ref="756173070"/> - <reference key="destination" ref="395788163"/> - </object> - <int key="connectionID">954</int> - </object> - </array> - <object class="IBMutableOrderedSet" key="objectRecords"> - <array key="orderedObjects"> - <object class="IBObjectRecord"> - <int key="objectID">0</int> - <array key="object" id="0"/> - <reference key="children" ref="1048"/> - <nil key="parent"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">-2</int> - <reference key="object" ref="1021"/> - <reference key="parent" ref="0"/> - <string key="objectName">File's Owner</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">-1</int> - <reference key="object" ref="1014"/> - <reference key="parent" ref="0"/> - <string key="objectName">First Responder</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">-3</int> - <reference key="object" ref="1050"/> - <reference key="parent" ref="0"/> - <string key="objectName">Application</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">29</int> - <reference key="object" ref="649796088"/> - <array class="NSMutableArray" key="children"> - <reference ref="713487014"/> - <reference ref="694149608"/> - <reference ref="391199113"/> - <reference ref="725688984"/> - </array> - <reference key="parent" ref="0"/> - <string key="objectName">Main Menu</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">19</int> - <reference key="object" ref="713487014"/> - <array class="NSMutableArray" key="children"> - <reference ref="835318025"/> - </array> - <reference key="parent" ref="649796088"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">56</int> - <reference key="object" ref="694149608"/> - <array class="NSMutableArray" key="children"> - <reference ref="110575045"/> - </array> - <reference key="parent" ref="649796088"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">103</int> - <reference key="object" ref="391199113"/> - <array class="NSMutableArray" key="children"/> - <reference key="parent" ref="649796088"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">57</int> - <reference key="object" ref="110575045"/> - <array class="NSMutableArray" key="children"> - <reference ref="238522557"/> - <reference ref="755159360"/> - <reference ref="908899353"/> - <reference ref="632727374"/> - <reference ref="646227648"/> - <reference ref="609285721"/> - <reference ref="481834944"/> - <reference ref="304266470"/> - <reference ref="1046388886"/> - <reference ref="1056857174"/> - <reference ref="342932134"/> - </array> - <reference key="parent" ref="694149608"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">58</int> - <reference key="object" ref="238522557"/> - <reference key="parent" ref="110575045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">134</int> - <reference key="object" ref="755159360"/> - <reference key="parent" ref="110575045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">150</int> - <reference key="object" ref="908899353"/> - <reference key="parent" ref="110575045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">136</int> - <reference key="object" ref="632727374"/> - <reference key="parent" ref="110575045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">144</int> - <reference key="object" ref="646227648"/> - <reference key="parent" ref="110575045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">129</int> - <reference key="object" ref="609285721"/> - <reference key="parent" ref="110575045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">143</int> - <reference key="object" ref="481834944"/> - <reference key="parent" ref="110575045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">236</int> - <reference key="object" ref="304266470"/> - <reference key="parent" ref="110575045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">131</int> - <reference key="object" ref="1046388886"/> - <array class="NSMutableArray" key="children"> - <reference ref="752062318"/> - </array> - <reference key="parent" ref="110575045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">149</int> - <reference key="object" ref="1056857174"/> - <reference key="parent" ref="110575045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">145</int> - <reference key="object" ref="342932134"/> - <reference key="parent" ref="110575045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">130</int> - <reference key="object" ref="752062318"/> - <reference key="parent" ref="1046388886"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">24</int> - <reference key="object" ref="835318025"/> - <array class="NSMutableArray" key="children"> - <reference ref="299356726"/> - <reference ref="625202149"/> - <reference ref="575023229"/> - <reference ref="1011231497"/> - <reference ref="86356408"/> - </array> - <reference key="parent" ref="713487014"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">92</int> - <reference key="object" ref="299356726"/> - <reference key="parent" ref="835318025"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5</int> - <reference key="object" ref="625202149"/> - <reference key="parent" ref="835318025"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">239</int> - <reference key="object" ref="575023229"/> - <reference key="parent" ref="835318025"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">23</int> - <reference key="object" ref="1011231497"/> - <reference key="parent" ref="835318025"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">711</int> - <reference key="object" ref="725688984"/> - <array class="NSMutableArray" key="children"> - <reference ref="701759256"/> - </array> - <reference key="parent" ref="649796088"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">712</int> - <reference key="object" ref="701759256"/> - <array class="NSMutableArray" key="children"> - <reference ref="521487141"/> - <reference ref="668936019"/> - <reference ref="383018193"/> - <reference ref="984623395"/> - <reference ref="656529582"/> - <reference ref="1032676691"/> - <reference ref="538907583"/> - </array> - <reference key="parent" ref="725688984"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">716</int> - <reference key="object" ref="984623395"/> - <reference key="parent" ref="701759256"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">717</int> - <reference key="object" ref="656529582"/> - <reference key="parent" ref="701759256"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">718</int> - <reference key="object" ref="1032676691"/> - <reference key="parent" ref="701759256"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">721</int> - <reference key="object" ref="538907583"/> - <reference key="parent" ref="701759256"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">824</int> - <reference key="object" ref="756173070"/> - <reference key="parent" ref="0"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">841</int> - <reference key="object" ref="86356408"/> - <reference key="parent" ref="835318025"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">828</int> - <reference key="object" ref="110292814"/> - <array class="NSMutableArray" key="children"> - <reference ref="305280978"/> - </array> - <reference key="parent" ref="0"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">829</int> - <reference key="object" ref="305280978"/> - <array class="NSMutableArray" key="children"/> - <reference key="parent" ref="110292814"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">713</int> - <reference key="object" ref="521487141"/> - <reference key="parent" ref="701759256"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">714</int> - <reference key="object" ref="668936019"/> - <reference key="parent" ref="701759256"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">715</int> - <reference key="object" ref="383018193"/> - <reference key="parent" ref="701759256"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">941</int> - <reference key="object" ref="979091056"/> - <array class="NSMutableArray" key="children"> - <reference ref="1044753903"/> - </array> - <reference key="parent" ref="0"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">942</int> - <reference key="object" ref="1044753903"/> - <array class="NSMutableArray" key="children"> - <reference ref="238626476"/> - </array> - <reference key="parent" ref="979091056"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">943</int> - <reference key="object" ref="238626476"/> - <array class="NSMutableArray" key="children"> - <reference ref="395788163"/> - <reference ref="1067057765"/> - <reference ref="339833963"/> - </array> - <reference key="parent" ref="1044753903"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">944</int> - <reference key="object" ref="395788163"/> - <reference key="parent" ref="238626476"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">945</int> - <reference key="object" ref="1067057765"/> - <reference key="parent" ref="238626476"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">946</int> - <reference key="object" ref="339833963"/> - <reference key="parent" ref="238626476"/> - </object> - </array> - </object> - <dictionary class="NSMutableDictionary" key="flattenedProperties"> - <string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="103.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="129.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="130.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="131.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="134.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="136.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="143.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="144.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="145.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="149.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="150.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="19.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="23.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="236.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="239.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="24.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="29.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="56.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="57.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="58.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="711.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="712.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="713.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="714.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="715.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="716.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="717.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="718.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="721.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="824.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <boolean value="YES" key="828.IBNSWindowAutoPositionCentersHorizontal"/> - <boolean value="YES" key="828.IBNSWindowAutoPositionCentersVertical"/> - <string key="828.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <boolean value="YES" key="828.NSWindowTemplate.visibleAtLaunch"/> - <string key="829.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="841.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="92.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="941.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <boolean value="NO" key="941.NSWindowTemplate.visibleAtLaunch"/> - <string key="942.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="943.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="944.CustomClassName">LLNonInlineTextView</string> - <string key="944.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="945.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="946.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> - </dictionary> - <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/> - <nil key="activeLocalization"/> - <dictionary class="NSMutableDictionary" key="localizations"/> - <nil key="sourceID"/> - <int key="maxID">954</int> - </object> - <object class="IBClassDescriber" key="IBDocument.Classes"> - <array class="NSMutableArray" key="referencedPartialClassDescriptions"> - <object class="IBPartialClassDescription"> - <string key="className">LLAppDelegate</string> - <string key="superclassName">NSObject</string> - <dictionary class="NSMutableDictionary" key="outlets"> - <string key="inputView">LLNonInlineTextView</string> - <string key="inputWindow">NSWindow</string> - <string key="window">LLNSWindow</string> - </dictionary> - <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName"> - <object class="IBToOneOutletInfo" key="inputView"> - <string key="name">inputView</string> - <string key="candidateClassName">LLNonInlineTextView</string> - </object> - <object class="IBToOneOutletInfo" key="inputWindow"> - <string key="name">inputWindow</string> - <string key="candidateClassName">NSWindow</string> - </object> - <object class="IBToOneOutletInfo" key="window"> - <string key="name">window</string> - <string key="candidateClassName">LLNSWindow</string> - </object> - </dictionary> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">./Classes/LLAppDelegate.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">LLNSWindow</string> - <string key="superclassName">NSWindow</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">./Classes/LLNSWindow.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">LLNonInlineTextView</string> - <string key="superclassName">NSTextView</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">./Classes/LLNonInlineTextView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">LLUserInputWindow</string> - <string key="superclassName">NSPanel</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">./Classes/LLUserInputWindow.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSTextView</string> - <dictionary class="NSMutableDictionary" key="actions"> - <string key="orderFrontSharingServicePicker:">id</string> - <string key="toggleQuickLookPreviewPanel:">id</string> - </dictionary> - <dictionary class="NSMutableDictionary" key="actionInfosByName"> - <object class="IBActionInfo" key="orderFrontSharingServicePicker:"> - <string key="name">orderFrontSharingServicePicker:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo" key="toggleQuickLookPreviewPanel:"> - <string key="name">toggleQuickLookPreviewPanel:</string> - <string key="candidateClassName">id</string> - </object> - </dictionary> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">./Classes/NSTextView.h</string> - </object> - </object> - </array> - </object> - <int key="IBDocument.localizationMode">0</int> - <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string> - <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies"> - <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string> - <real value="1060" key="NS.object.0"/> - </object> - <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies"> - <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string> - <integer value="4600" key="NS.object.0"/> - </object> - <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> - <int key="IBDocument.defaultPropertyAccessControl">3</int> - <dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes"> - <string key="NSMenuCheckmark">{11, 11}</string> - <string key="NSMenuMixedState">{10, 3}</string> - </dictionary> - </data> -</archive> +<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="23727" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> + <dependencies> + <deployment version="110000" identifier="macosx"/> + <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="23727"/> + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> + </dependencies> + <objects> + <customObject id="-2" userLabel="File's Owner" customClass="NSApplication"> + <connections> + <outlet property="delegate" destination="824" id="845"/> + </connections> + </customObject> + <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> + <customObject id="-3" userLabel="Application" customClass="NSObject"/> + <menu title="Main Menu" systemMenu="main" id="29" userLabel="Main Menu"> + <items> + <menuItem title="Megapahit" id="56"> + <modifierMask key="keyEquivalentModifierMask"/> + <menu key="submenu" title="Megapahit" systemMenu="apple" id="57"> + <items> + <menuItem title="About Megapahit" id="58"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="orderFrontStandardAboutPanel:" target="-2" id="142"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="236"/> + <menuItem title="Preferences…" keyEquivalent="," id="129"/> + <menuItem isSeparatorItem="YES" id="143"/> + <menuItem title="Services" id="131"> + <modifierMask key="keyEquivalentModifierMask"/> + <menu key="submenu" title="Services" systemMenu="services" id="130"/> + </menuItem> + <menuItem isSeparatorItem="YES" id="144"/> + <menuItem title="Hide Megapahit" keyEquivalent="h" id="134"> + <connections> + <action selector="hide:" target="-1" id="369"/> + </connections> + </menuItem> + <menuItem title="Hide Others" keyEquivalent="h" id="145"> + <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> + <connections> + <action selector="hideOtherApplications:" target="-1" id="370"/> + </connections> + </menuItem> + <menuItem title="Show All" id="150"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="unhideAllApplications:" target="-1" id="372"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="149"/> + <menuItem title="Quit Megapahit" keyEquivalent="q" id="136"> + <connections> + <action selector="terminate:" target="-3" id="823"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="Edit" id="711"> + <modifierMask key="keyEquivalentModifierMask"/> + <menu key="submenu" title="Edit" id="712"> + <items> + <menuItem title="Undo" keyEquivalent="z" id="713"> + <connections> + <action selector="undo:" target="-1" id="776"/> + </connections> + </menuItem> + <menuItem title="Redo" keyEquivalent="Z" id="714"/> + <menuItem isSeparatorItem="YES" id="715"/> + <menuItem title="Cut" keyEquivalent="x" id="716"> + <connections> + <action selector="cut:" target="-1" id="768"/> + </connections> + </menuItem> + <menuItem title="Copy" keyEquivalent="c" id="717"> + <connections> + <action selector="copy:" target="-1" id="782"/> + </connections> + </menuItem> + <menuItem title="Paste" keyEquivalent="v" id="718"> + <connections> + <action selector="paste:" target="-1" id="769"/> + </connections> + </menuItem> + <menuItem title="Select All" keyEquivalent="a" id="721"> + <connections> + <action selector="selectAll:" target="-1" id="785"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="Window" id="19"> + <modifierMask key="keyEquivalentModifierMask"/> + <menu key="submenu" title="Window" systemMenu="window" id="24"> + <items> + <menuItem title="Minimize" keyEquivalent="m" id="23"> + <connections> + <action selector="performMiniaturize:" target="-1" id="37"/> + </connections> + </menuItem> + <menuItem title="Zoom" id="239"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="performZoom:" target="-1" id="240"/> + </connections> + </menuItem> + <menuItem title="Enter Full Screen" keyEquivalent="f" id="841"> + <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/> + <connections> + <action selector="toggleFullScreen:" target="-1" id="842"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="92"/> + <menuItem title="Bring All to Front" id="5"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="arrangeInFront:" target="-1" id="39"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="Help" id="103"> + <modifierMask key="keyEquivalentModifierMask"/> + </menuItem> + </items> + <point key="canvasLocation" x="87" y="149"/> + </menu> + <customObject id="824" customClass="LLAppDelegate"> + <connections> + <outlet property="inputView" destination="944" id="954"/> + <outlet property="inputWindow" destination="941" id="953"/> + <outlet property="window" destination="828" id="850"/> + </connections> + </customObject> + <window title="Megapahit" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" restorable="NO" deferred="NO" frameAutosaveName="Megapahit" animationBehavior="default" id="828" customClass="LLNSWindow"> + <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/> + <windowCollectionBehavior key="collectionBehavior" fullScreenPrimary="YES"/> + <rect key="contentRect" x="196" y="240" width="1024" height="600"/> + <rect key="screenRect" x="0.0" y="0.0" width="1920" height="1055"/> + <view key="contentView" id="829"> + <rect key="frame" x="0.0" y="0.0" width="1024" height="600"/> + <autoresizingMask key="autoresizingMask"/> + </view> + <point key="canvasLocation" x="-48" y="-285"/> + </window> + <window title="Input Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" visibleAtLaunch="NO" animationBehavior="default" id="941" customClass="LLUserInputWindow"> + <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES" utility="YES"/> + <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> + <rect key="contentRect" x="272" y="176" width="938" height="42"/> + <rect key="screenRect" x="0.0" y="0.0" width="1920" height="1055"/> + <view key="contentView" id="942"> + <rect key="frame" x="0.0" y="0.0" width="938" height="42"/> + <autoresizingMask key="autoresizingMask"/> + <subviews> + <scrollView fixedFrame="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="943"> + <rect key="frame" x="-1" y="-1" width="940" height="44"/> + <autoresizingMask key="autoresizingMask"/> + <clipView key="contentView" id="Mvi-Vb-2zK"> + <rect key="frame" x="1" y="1" width="938" height="42"/> + <autoresizingMask key="autoresizingMask"/> + <subviews> + <textView importsGraphics="NO" verticallyResizable="YES" usesFontPanel="YES" findStyle="panel" continuousSpellChecking="YES" allowsUndo="YES" usesRuler="YES" spellingCorrection="YES" smartInsertDelete="YES" id="944" customClass="LLNonInlineTextView"> + <rect key="frame" x="0.0" y="0.0" width="938" height="42"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> + <size key="minSize" width="938" height="42"/> + <size key="maxSize" width="940" height="10000000"/> + <color key="insertionPointColor" name="textColor" catalog="System" colorSpace="catalog"/> + </textView> + </subviews> + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> + </clipView> + <scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="YES" id="945"> + <rect key="frame" x="-100" y="-100" width="87" height="18"/> + <autoresizingMask key="autoresizingMask"/> + </scroller> + <scroller key="verticalScroller" verticalHuggingPriority="750" horizontal="NO" id="946"> + <rect key="frame" x="924" y="1" width="15" height="42"/> + <autoresizingMask key="autoresizingMask"/> + </scroller> + </scrollView> + </subviews> + </view> + <point key="canvasLocation" x="87" y="144"/> + </window> + </objects> +</document> diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index 0f9f025fe4..2aaedf9944 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -7.1.12 +26.1.0 diff --git a/indra/newview/ViewerInstall.cmake b/indra/newview/ViewerInstall.cmake index 373c771253..5aadc51869 100644 --- a/indra/newview/ViewerInstall.cmake +++ b/indra/newview/ViewerInstall.cmake @@ -31,7 +31,7 @@ if (DARWIN) ) install(FILES - SecondLife.nib + ${CMAKE_CURRENT_BINARY_DIR}/SecondLife.nib ${AUTOBUILD_INSTALL_DIR}/ca-bundle.crt cube.dae featuretable_mac.txt @@ -54,7 +54,6 @@ if (DARWIN) install(FILES ${SCRIPTS_DIR}/messages/message_template.msg - ${SCRIPTS_DIR}/../etc/message.xml ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt DESTINATION app_settings ) @@ -66,7 +65,7 @@ if (DARWIN) if (NDOF) install(FILES - "${AUTOBUILD_INSTALL_DIR}/lib/release/libndofdev.dylib" + "${ARCH_PREBUILT_DIRS_RELEASE}/libndofdev.dylib" DESTINATION . ) endif () @@ -84,35 +83,132 @@ if (DARWIN) endif (PACKAGE) install(SCRIPT ${CMAKE_CURRENT_BINARY_DIR}/FixBundle.cmake) +elseif (WINDOWS) + + install(DIRECTORY + app_settings + character + fonts + skins + DESTINATION . + ) + + install(FILES + ${AUTOBUILD_INSTALL_DIR}/ca-bundle.crt + cube.dae + featuretable.txt + DESTINATION . + ) + + install(FILES + licenses-win32.txt + RENAME licenses.txt + DESTINATION . + ) + + install(FILES + ${SCRIPTS_DIR}/messages/message_template.msg + ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt + DESTINATION app_settings + ) + + install(DIRECTORY + ${AUTOBUILD_INSTALL_DIR}/dictionaries + DESTINATION app_settings + ) + + if ($ENV{MSYSTEM_CARCH} MATCHES aarch64) + install( + PROGRAMS + ${prefix_result}/../bin/libcrypto-3-arm64.dll + ${prefix_result}/../bin/libssl-3-arm64.dll + ${prefix_result}/../bin/libcurl.dll + DESTINATION . + ) + set(BOOST_PLATFORM a${ADDRESS_SIZE}) + else () + set(BOOST_PLATFORM x${ADDRESS_SIZE}) + endif () + + install( + PROGRAMS + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${VIEWER_BINARY_NAME}.exe + ${prefix_result}/../bin/OpenAL32.dll + ${prefix_result}/../bin/alut.dll + ${prefix_result}/../bin/boost_context-vc143-mt-${BOOST_PLATFORM}-1_90.dll + ${prefix_result}/../bin/boost_fiber-vc143-mt-${BOOST_PLATFORM}-1_90.dll + ${prefix_result}/../bin/boost_filesystem-vc143-mt-${BOOST_PLATFORM}-1_90.dll + ${prefix_result}/../bin/boost_json-vc143-mt-${BOOST_PLATFORM}-1_90.dll + ${prefix_result}/../bin/boost_program_options-vc143-mt-${BOOST_PLATFORM}-1_90.dll + ${prefix_result}/../bin/boost_thread-vc143-mt-${BOOST_PLATFORM}-1_90.dll + ${prefix_result}/../bin/boost_url-vc143-mt-${BOOST_PLATFORM}-1_90.dll + ${prefix_result}/../bin/brotlicommon.dll + ${prefix_result}/../bin/brotlidec.dll + ${prefix_result}/../bin/bz2.dll + ${prefix_result}/../bin/fmt.dll + ${prefix_result}/../bin/freetype.dll + ${prefix_result}/../bin/hunspell-1.7-0.dll + ${prefix_result}/../bin/iconv-2.dll + ${prefix_result}/../bin/jpeg62.dll + ${prefix_result}/../bin/libapr-1.dll + ${prefix_result}/../bin/libaprutil-1.dll + ${prefix_result}/../bin/libexpat.dll + ${prefix_result}/../bin/libpng16.dll + ${prefix_result}/../bin/libxml2.dll + ${prefix_result}/../bin/meshoptimizer.dll + ${prefix_result}/../bin/minizip.dll + ${prefix_result}/../bin/nghttp2.dll + ${prefix_result}/../bin/ogg.dll + ${prefix_result}/../bin/openjp2.dll + ${prefix_result}/../bin/vorbis.dll + ${prefix_result}/../bin/vorbisenc.dll + ${prefix_result}/../bin/vorbisfile.dll + ${prefix_result}/../bin/zlib1.dll + DESTINATION . + ) + + if (USE_DISCORD) + install( + PROGRAMS ${LIBS_PREBUILT_DIR}/bin/release/discord_partner_sdk.dll + DESTINATION . + ) + endif () + + install( + PROGRAMS + ${prefix_result}/../bin/boost_context-vc143-mt-${BOOST_PLATFORM}-1_90.dll + ${prefix_result}/../bin/boost_fiber-vc143-mt-${BOOST_PLATFORM}-1_90.dll + ${prefix_result}/../bin/libapr-1.dll + ${prefix_result}/../bin/libaprutil-1.dll + ${prefix_result}/../bin/libexpat.dll + DESTINATION llplugin + ) + else (DARWIN) install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_BINARY_NAME} DESTINATION bin ) -if (${LINUX_DISTRO} MATCHES arch) - install(PROGRAMS linux_tools/launch_url.sh - DESTINATION lib/${VIEWER_BINARY_NAME} - ) -else (${LINUX_DISTRO} MATCHES arch) - install(PROGRAMS linux_tools/launch_url.sh - DESTINATION libexec/${VIEWER_BINARY_NAME} - ) -endif (${LINUX_DISTRO} MATCHES arch) - if (LINUX) if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu)) set(_LIB lib/${ARCH}-linux-gnu) - elseif (${LINUX_DISTRO} MATCHES fedora OR (${LINUX_DISTRO} MATCHES opensuse-tumbleweed)) + elseif (${LINUX_DISTRO} MATCHES fedora OR (${LINUX_DISTRO} MATCHES opensuse-tumbleweed) OR (${LINUX_DISTRO} MATCHES gentoo)) set(_LIB lib${ADDRESS_SIZE}) else () set(_LIB lib) endif () + if (USE_DISCORD) + install( + FILES ${ARCH_PREBUILT_DIRS_RELEASE}/libdiscord_partner_sdk.so + DESTINATION ${_LIB} + ) + endif () if (USE_FMODSTUDIO) install(FILES - ${AUTOBUILD_INSTALL_DIR}/lib/release/libfmod.so - ${AUTOBUILD_INSTALL_DIR}/lib/release/libfmod.so.13 - ${AUTOBUILD_INSTALL_DIR}/lib/release/libfmod.so.13.27 + ${ARCH_PREBUILT_DIRS_RELEASE}/libfmod.so + ${ARCH_PREBUILT_DIRS_RELEASE}/libfmod.so.13 + ${ARCH_PREBUILT_DIRS_RELEASE}/libfmod.so.13.33 DESTINATION ${_LIB}) endif (USE_FMODSTUDIO) endif (LINUX) @@ -152,7 +248,6 @@ endif (IS_ARTWORK_PRESENT) ) install(FILES ${SCRIPTS_DIR}/messages/message_template.msg - ${SCRIPTS_DIR}/../etc/message.xml ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt DESTINATION share/${VIEWER_BINARY_NAME}/app_settings ) diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml index 635e5e40f5..6a05466e06 100644 --- a/indra/newview/app_settings/commands.xml +++ b/indra/newview/app_settings/commands.xml @@ -26,9 +26,9 @@ label_ref="Command_Avatar_Label" tooltip_ref="Command_Avatar_Tooltip" execute_function="Floater.ToggleOrBringToFront" - execute_parameters="avatar" + execute_parameters="avatar_welcome_pack" is_running_function="Floater.IsOpen" - is_running_parameters="avatar" + is_running_parameters="avatar_welcome_pack" /> <command name="build" available_in_toybox="true" diff --git a/indra/newview/app_settings/message.xml b/indra/newview/app_settings/message.xml new file mode 100755 index 0000000000..dee3fd72dd --- /dev/null +++ b/indra/newview/app_settings/message.xml @@ -0,0 +1,751 @@ +<?xml version="1.0"?> +<llsd> + <map> + <key>serverDefaults</key> + <!-- + a map of server names to default message transport + --> + <map> + <key>simulator</key> + <string>template</string> + + <key>spaceserver</key> + <string>template</string> + + <key>dataserver</key> + <string>template</string> + + <key>logDataserver</key> + <string>template</string> + + <key>inventoryDataserver</key> + <string>template</string> + + <key>rpcserver</key> + <string>template</string> + + <key>mapserver</key> + <string>template</string> + + <key>viewer</key> + <string>template</string> + + </map> + <key>messages</key> + <!-- + a map of individual message names that override defaults + --> + <map> + <!-- + Circuit related messages + --> + <key>PacketAck</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>OpenCircuit</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>CloseCircuit</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>StartPingCheck</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>CompletePingCheck</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>AddCircuitCode</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>UseCircuitCode</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>CreateTrustedCircuit</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>RequestTrustedCircuit</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <!-- + Simulator to Launcher + until we get a HTTP server in the launcher + --> + <key>ReportAutosaveCrash</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>SetCPURatio</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <!-- + Viewer to simulator messages sent before UntrustedSimulatorMessage cap received. + --> + <key>CompleteAgentMovement</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>EconomyDataRequest</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>ViewerEffect</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>RegionHandshakeReply</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <!-- + Viewer to simulator messages sent unreliably. + --> + <key>AgentUpdate</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <!-- + Messages created by LLThrottleGroup clients + --> + <key>ImagePacket</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>LayerData</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>ObjectUpdateCached</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>ObjectUpdateCompressed</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>ObjectUpdate</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>ImprovedTerseObjectUpdate</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>AvatarAnimation</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>ObjectAnimation</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>AvatarAppearance</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <!-- Simulator to simulator reliable messages --> + <key>GodKickUser</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>RoutedMoneyBalanceReply</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <!-- Simulator to simulator unreliable messages --> + <key>EdgeDataPacket</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>CoarseLocationUpdate</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>true</boolean> + <key>only-send-latest</key> + <boolean>true</boolean> + </map> + + <key>SimulatorLoad</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>EstablishAgentCommunication</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>AgentGroupDataUpdate</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>AgentDropGroup</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>ChatterBoxSessionStartReply</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>ChatterBoxSessionEventReply</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>ForceCloseChatterBoxSession</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>ChatterBoxSessionAgentListUpdates</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>ChatterBoxSessionUpdate</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>ChatterBoxInvitation</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <!-- Client to server --> + <key>ParcelVoiceInfoRequest</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <!-- Server to client --> + <key>DisplayNameUpdate</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>ParcelVoiceInfo</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>ParcelNavigateMedia</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>ParcelObjectOwnersReply</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>ParcelProperties</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>LandStatReply</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>PlacesReply</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>SetDisplayNameReply</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>SimConsoleResponse</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>DirLandReply</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>avatarnotesrequest</key> + <map> + <key>service_name</key> + <string>avatar-notes</string> + <key>builder</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>avatarclassifiedsrequest</key> + <map> + <key>service_name</key> + <string>avatar-classifieds</string> + <key>builder</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>avatarpicksrequest</key> + <map> + <key>service_name</key> + <string>avatar-pick</string> + <key>builder</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>pickinforequest</key> + <map> + <key>service_name</key> + <string>pick-info</string> + <key>builder</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>ProvisionVoiceAccountRequest</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>VoiceSignalingRequest</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + <!-- Server to client --> + <key>RequiredVoiceVersion</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>EnableSimulator</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>TeleportFinish</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>TeleportFailed</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>CrossedRegion</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>NavMeshStatusUpdate</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>AgentStateUpdate</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <!-- UDPDeprecated Messages --> + <key>ScriptRunningReply</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>LandStatReply</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>StartGroupProposal</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>FetchInventoryDescendents</key> + <map> + <key>flavor</key> + <string>template</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>GroupProposalBallot</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>RpcScriptRequestInboundForward</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>false</boolean> + </map> + + <key>ObjectPhysicsProperties</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + </map> + <key>capBans</key> + <map> + <key>MapLayer</key> + <boolean>false</boolean> + + <key>MapLayerGod</key> + <boolean>false</boolean> + + <key>NewFileAgentInventory</key> + <boolean>false</boolean> + + <key>UpdateGestureAgentInventory</key> + <boolean>false</boolean> + + <key>UpdateNotecardAgentInventory</key> + <boolean>false</boolean> + + <key>UpdateScriptAgentInventory</key> + <boolean>false</boolean> + + <key>UpdateGestureTaskInventory</key> + <boolean>false</boolean> + + <key>UpdateNotecardTaskInventory</key> + <boolean>false</boolean> + + <key>UpdateScriptTaskInventory</key> + <boolean>false</boolean> + + <key>ViewerStartAuction</key> + <boolean>true</boolean> + + <key>ParcelGodReserveForNewbie</key> + <boolean>true</boolean> + + <key>SendUserReport</key> + <boolean>false</boolean> + + <key>SendUserReportWithScreenshot</key> + <boolean>false</boolean> + + <key>RequestTextureDownload</key> + <boolean>true</boolean> + + <key>EventQueueGet</key> + <boolean>false</boolean> + + <key>UntrustedSimulatorMessage</key> + <boolean>false</boolean> + + <key>SendPostcard</key> + <boolean>false</boolean> + + <key>SendPostcard2</key> + <boolean>true</boolean> + + <key>SendPostcard3</key> + <boolean>true</boolean> + + <key>ParcelVoiceInfoRequest</key> + <boolean>false</boolean> + + <key>ChatSessionRequest</key> + <boolean>false</boolean> + + <key>ProvisionVoiceAccountRequest</key> + <boolean>false</boolean> + + <key>VoiceSignalingRequest</key> + <boolean>false</boolean> + + <key>RemoteParcelRequest</key> + <boolean>false</boolean> + + <key>SearchStatTracking</key> + <boolean>false</boolean> + + <key>ParcelPropertiesUpdate</key> + <boolean>false</boolean> + + <key>EstateChangeInfo</key> + <boolean>true</boolean> + + <key>FetchInventoryDescendents2</key> + <boolean>false</boolean> + + <key>FetchInventory2</key> + <boolean>false</boolean> + + <key>FetchLibDescendents2</key> + <boolean>false</boolean> + + <key>FetchLib2</key> + <boolean>false</boolean> + + <key>UploadBakedTexture</key> + <boolean>true</boolean> + + <key>ObjectMedia</key> + <boolean>false</boolean> + + <key>ObjectMediaNavigate</key> + <boolean>false</boolean> + + </map> + + <key>messageBans</key> + <map> + <key>trusted</key> + <map> + </map> + + <key>untrusted</key> + <map> + </map> + </map> + + <key>maxQueuedEvents</key> + <integer>100</integer> + </map> +</llsd> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 1aec56447d..dd644b6e30 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -2,7 +2,7 @@ <llsd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="llsd.xsd"> <map> - <key>ImporterDebug</key> + <key>ImporterDebugVerboseLogging</key> <map> <key>Comment</key> <string>Enable debug output to more precisely identify sources of import errors. Warning: the output can slow down import on many machines.</string> @@ -27,7 +27,7 @@ <key>ImporterModelLimit</key> <map> <key>Comment</key> - <string>Limits amount of importer generated models for dae files</string> + <string>Limits amount of importer generated (when over 8 faces) models for dae and gltf files</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -35,6 +35,17 @@ <key>Value</key> <integer>768</integer> </map> + <key>ImporterDebugMode</key> + <map> + <key>Comment</key> + <string>At 0 does nothing, at 1 dumps skinning data near orifinal file, at 2 dumps skining data and positions/weights of first 5 models, at 3 dumps skinning data and models as llsd</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>0</integer> + </map> <key>ImporterPreprocessDAE</key> <map> <key>Comment</key> @@ -113,7 +124,7 @@ <key>Type</key> <string>S32</string> <key>Value</key> - <real>300.0</real> + <real>300</real> </map> <key>AckCollectTime</key> <map> @@ -368,6 +379,17 @@ <key>Value</key> <real>0.5</real> </map> + <key>AudioLevelWind</key> + <map> + <key>Comment</key> + <string>Audio level of wind noise when standing still</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>0.5</real> + </map> <key>AudioStreamingMedia</key> <map> <key>Comment</key> @@ -632,16 +654,16 @@ <key>Value</key> <real>16.0</real> </map> - <key>AvatarPickerURL</key> + <key>AvatarWelcomePack</key> <map> - <key>Comment</key> - <string>Avatar picker contents</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string>http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/avatars.html</string> + <key>Comment</key> + <string>Avatar Welcome Pack contents</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>https://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/vawp/index.html</string> </map> <!--AvatarBakedTextureUploadTimeout is in use by QA--> <key>AvatarBakedTextureUploadTimeout</key> @@ -655,6 +677,28 @@ <key>Value</key> <integer>60</integer> </map> + <key>AvatarRotateThresholdSlow</key> + <map> + <key>Comment</key> + <string>Angle between avatar facing and camera facing at which avatar turns to face same direction as camera, when moving slowly (degrees)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <integer>60</integer> + </map> + <key>AvatarRotateThresholdFast</key> + <map> + <key>Comment</key> + <string>Angle between avatar facing and camera facing at which avatar turns to face same direction as camera, when moving fast (degrees)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <integer>2</integer> + </map> <key>AvatarPhysics</key> <map> <key>Comment</key> @@ -1150,6 +1194,39 @@ <key>Value</key> <integer>1</integer> </map> + <key>EnableDiscord</key> + <map> + <key>Comment</key> + <string>When set, connect to Discord to enable Rich Presence</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>ShowDiscordActivityDetails</key> + <map> + <key>Comment</key> + <string>When set, show avatar name on Discord Rich Presence</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>ShowDiscordActivityState</key> + <map> + <key>Comment</key> + <string>When set, show location on Discord Rich Presence</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>EnableDiskCacheDebugInfo</key> <map> <key>Comment</key> @@ -1164,13 +1241,13 @@ <key>DiskCachePercentOfTotal</key> <map> <key>Comment</key> - <string>The percent of total cache size (defined by CacheSize) to use for the disk cache</string> + <string>The percent of total cache size (defined by CacheSize) to use for the disk cache (ex: asset storage, excludes textures)</string> <key>Persist</key> <integer>1</integer> <key>Type</key> <string>F32</string> <key>Value</key> - <real>40.0</real> + <real>35.0</real> </map> <key>DiskCacheDirName</key> <map> @@ -1214,7 +1291,7 @@ <key>Type</key> <string>U32</string> <key>Value</key> - <integer>4096</integer> + <integer>6144</integer> </map> <key>CacheValidateCounter</key> <map> @@ -1875,6 +1952,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>DebugSelectionLODs</key> + <map> + <key>Comment</key> + <string>Force selection to show specific LOD, -1 for off, 0 - lowest, 4 - high.</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>-1</integer> + </map> <key>AnimatedObjectsAllowLeftClick</key> <map> <key>Comment</key> @@ -2401,7 +2489,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/guide.html</string> + <string>https://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/guide.html</string> </map> <key>DisableCameraConstraints</key> <map> @@ -2425,16 +2513,16 @@ <key>Value</key> <integer>0</integer> </map> - <key>DisableMouseWarp</key> + <key>MouseWarpMode</key> <map> <key>Comment</key> - <string>Disable warping of the mouse to the center of the screen during alt-zoom and mouse look. Useful with certain input devices, mouse sharing programs like Synergy, or running under Parallels.</string> + <string>Controls warping of the mouse to the center of the screen during alt-zoom and mouse look. Useful with certain input devices, mouse sharing programs like Synergy, or running under Parallels. 0 - automatic, 1 - on, 2 - off</string> <key>Persist</key> <integer>1</integer> <key>Type</key> - <string>Boolean</string> + <string>S32</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>DisableExternalBrowser</key> <map> @@ -2546,7 +2634,7 @@ <key>Value</key> <integer>0</integer> </map> - <key>DoubleClickTeleport</key> + <key>DoubleClickTeleport</key> <map> <key>Comment</key> <string>Enable double-click to teleport where allowed (afects minimap and people panel)</string> @@ -2720,7 +2808,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>http://events.[GRID]/viewer/embed/event/[EVENT_ID]</string> + <string>https://events.[GRID]/viewer/embed/event/[EVENT_ID]</string> </map> <key>MainWorkTime</key> <map> @@ -3377,7 +3465,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>http://viewer-help.secondlife.com/[LANGUAGE]/[CHANNEL]/[VERSION]/[TOPIC][DEBUG_MODE]</string> + <string>https://viewer-help.secondlife.com/[LANGUAGE]/[CHANNEL]/[VERSION]/[TOPIC][DEBUG_MODE]</string> </map> <key>HowToHelpURL</key> <map> @@ -3388,7 +3476,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/howto/index.html</string> + <string>https://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/howto/index.html</string> </map> <key>HomeSidePanelURL</key> <map> @@ -3709,6 +3797,17 @@ <key>Value</key> <integer>5000</integer> </map> + <key>InventoryExposeFolderID</key> + <map> + <key>Comment</key> + <string>Allows copying folder id from context menu</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>MarketplaceListingsSortOrder</key> <map> <key>Comment</key> @@ -3993,7 +4092,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>http://wiki.secondlife.com/wiki/[LSL_STRING]</string> + <string>https://wiki.secondlife.com/wiki/[LSL_STRING]</string> </map> <key>LSLFontSizeName</key> <map> @@ -4336,7 +4435,7 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <real>40.0</real> + <real>90.0</real> </map> <key>LogMessages</key> <map> @@ -4418,13 +4517,24 @@ <key>MainloopTimeoutDefault</key> <map> <key>Comment</key> - <string>Timeout duration for mainloop lock detection, in seconds.</string> + <string>Timeout duration for mainloop lock detection during teleports, login and logout, in seconds.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> <string>F32</string> <key>Value</key> - <real>60.0</real> + <real>120.0</real> + </map> + <key>MainloopTimeoutStarted</key> + <map> + <key>Comment</key> + <string>Timeout duration for mainloop lock detection when logged in and not teleporting, in seconds.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>60.0</real> </map> <key>MapScale</key> <map> @@ -6405,6 +6515,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>PlaySoundChatMention</key> + <map> + <key>Comment</key> + <string>Plays a sound when got mentioned in a chat</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>PluginAttachDebuggerToPlugins</key> <map> <key>Comment</key> @@ -7241,7 +7362,7 @@ <key>RenderAvatarCloth</key> <map> <key>Comment</key> - <string>DEPRECATED - only false supported - Controls if avatars use wavy cloth</string> + <string>Controls if system avatar clothes use wavy cloth</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -7280,7 +7401,7 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <real>32.0</real> + <real>48.0</real> </map> <key>RenderCPUBasis</key> <map> @@ -7841,7 +7962,7 @@ <key>RenderMaxOpenGLVersion</key> <map> <key>Comment</key> - <string>Maximum OpenGL version to attempt use (minimum 3.1 maximum 4.6). Requires restart.</string> + <string>Maximum OpenGL version to attempt use (minimum 3.1 maximum 4.6). Requires restart. Windows only.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -7860,16 +7981,27 @@ <key>Value</key> <integer>0</integer> </map> + <key>RenderTextureVRAMDivisor</key> + <map> + <key>Comment</key> + <string>Divisor for maximum amount of VRAM the viewer will use for textures. 1 = all the VRAM. Used in conjunction with RenderMaxVRAMBudget.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>1</integer> + </map> <key>RenderMinFreeMainMemoryThreshold</key> <map> <key>Comment</key> - <string>Minimum of available physical memory in MB before textures get scaled down</string> + <string>If available free physical memory is below this value textures get agresively scaled down</string> <key>Persist</key> - <integer>0</integer> + <integer>1</integer> <key>Type</key> <string>U32</string> <key>Value</key> - <integer>512</integer> + <integer>256</integer> </map> <key>RenderLowMemMinDiscardIncrement</key> <map> @@ -8442,7 +8574,7 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <real>0.8</real> + <real>0.7</real> </map> <key>RenderShadowGaussian</key> @@ -8470,7 +8602,7 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <real>1.4</real> + <real>1.0</real> </map> <key>RenderShadowBlurSamples</key> <map> @@ -8987,6 +9119,17 @@ <key>Value</key> <integer>16</integer> </map> + <key>RenderReflectionProbeShowTransparent</key> + <map> + <key>Comment</key> + <string>Show reflection probes in the transparency debug view</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>RenderReflectionProbeVolumes</key> <map> <key>Comment</key> @@ -9078,7 +9221,7 @@ <key>RenderQualityPerformance</key> <map> <key>Comment</key> - <string>Which graphics settings you've chosen</string> + <string>Which graphics settings you've chosen. Don't use this setting to change quality directly from debug settings.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -9086,6 +9229,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>DebugQualityPerformance</key> + <map> + <key>Comment</key> + <string>Allows to change performance quality directly from debug settings.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>1</integer> + </map> <key>RenderReflectionDetail</key> <map> @@ -9131,6 +9285,28 @@ <key>Value</key> <integer>1</integer> </map> + <key>RenderReflectionProbeDynamicAllocation</key> + <map> + <key>Comment</key> + <string>Enable dynamic allocation of reflection probes. -1 means no dynamic allocation. Sets a buffer to allocate when a dynamic allocation occurs otherwise.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>-1</integer> + </map> + <key>RenderReflectionProbeCount</key> + <map> + <key>Comment</key> + <string>Number of probes to render. Maximum of 256. Clamps to the nearest power of 2.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>256</integer> + </map> <key>RenderReflectionProbeResolution</key> <map> <key>Comment</key> @@ -9153,7 +9329,7 @@ <key>Value</key> <real>1.0</real> </map> - + <key>RenderReflectionProbeDrawDistance</key> <map> <key>Comment</key> @@ -9227,9 +9403,9 @@ <key>Persist</key> <integer>1</integer> <key>Type</key> - <string>U32</string> + <string>F32</string> <key>Value</key> - <integer>1</integer> + <integer>1.0</integer> </map> <key>RenderShaderLightingMaxLevel</key> <map> @@ -9352,7 +9528,7 @@ <key>Value</key> <real>1.0</real> </map> - + <key>RenderReflectionProbeMaxLocalLightAmbiance</key> <map> <key>Comment</key> @@ -9584,6 +9760,28 @@ <key>Value</key> <integer>0</integer> </map> + <key>RenderBalanceInSnapshot</key> + <map> + <key>Comment</key> + <string>Display L$ balance in snapshot</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>ObscureBalanceInStatusBar</key> + <map> + <key>Comment</key> + <string>If true, balance will be shows as '*'</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>RenderUIBuffer</key> <map> <key>Comment</key> @@ -10019,6 +10217,83 @@ <key>Value</key> <string>https://megapahit.com/enter_bug.cgi?product=Viewer</string> </map> + <key>RestrainedLove</key> + <map> + <key>Comment</key> + <string>Toggles RLVa features (requires restart)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <boolean>0</boolean> + </map> + <key>RestrainedLoveDebug</key> + <map> + <key>Comment</key> + <string>Toggles RLVa debug mode (displays the commands when in debug mode)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <boolean>0</boolean> + </map> + <key>RLVaBlockedExperiences</key> + <map> + <key>Comment</key> + <string>List of experiences blocked from interacting with RLVa</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>bfe25fb4-222c-11e5-85a2-fa4c4ccaa202</string> + </map> + <key>RLVaDebugHideUnsetDuplicate</key> + <map> + <key>Comment</key> + <string>Suppresses reporting "unset" or "duplicate" command restrictions when RestrainedLoveDebug is TRUE</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <boolean>0</boolean> + </map> + <key>RLVaEnableTemporaryAttachments</key> + <map> + <key>Comment</key> + <string>Allows temporary attachments (regardless of origin) to issue RLV commands</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <boolean>1</boolean> + </map> + <key>RLVaExperimentalCommands</key> + <map> + <key>Comment</key> + <string>Enables the experimental command set</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <boolean>1</boolean> + </map> + <key>RLVaTopLevelMenu</key> + <map> + <key>Comment</key> + <string>Show the RLVa specific menu as a top level menu</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <boolean>1</boolean> + </map> <key>RevokePermsOnStopAnimation</key> <map> <key>Comment</key> @@ -10253,13 +10528,13 @@ <key>SceneLoadRearMaxRadiusFraction</key> <map> <key>Comment</key> - <string>a percentage of draw distance beyond which all objects outside of view frustum will be unloaded, regardless of pixel threshold</string> + <string>a fraction of draw distance beyond which all objects outside of view frustum will be unloaded, regardless of pixel threshold</string> <key>Persist</key> <integer>1</integer> <key>Type</key> <string>F32</string> <key>Value</key> - <real>75.0</real> + <real>0.75</real> </map> <key>SceneLoadRearPixelThreshold</key> <map> @@ -10854,7 +11129,7 @@ <string>Boolean</string> <key>Value</key> <integer>0</integer> - </map> + </map> <key>NearbyListShowMap</key> <map> <key>Comment</key> @@ -11019,6 +11294,45 @@ <key>Value</key> <integer>0</integer> </map> + <key>ShowPGClassifieds</key> + <map> + <key>Comment</key> + <string>Display results of find classifieds that are flagged as general</string> + <key>Persist</key> + <integer>1</integer> + <key>HideFromEditor</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>ShowMatureClassifieds</key> + <map> + <key>Comment</key> + <string>Display results of find classifieds that are flagged as moderate</string> + <key>Persist</key> + <integer>1</integer> + <key>HideFromEditor</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>ShowAdultClassifieds</key> + <map> + <key>Comment</key> + <string>Display results of find classifieds that are flagged as adult</string> + <key>Persist</key> + <integer>1</integer> + <key>HideFromEditor</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>ShowPGSims</key> <map> <key>Comment</key> @@ -11058,6 +11372,54 @@ <key>Value</key> <integer>0</integer> </map> + <key>ShowPGEvents</key> + <map> + <key>Comment</key> + <string>Display results of find events that are flagged as general</string> + <key>Persist</key> + <integer>1</integer> + <key>HideFromEditor</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>ShowMatureGroups</key> + <map> + <key>Comment</key> + <string>Include groups that are flagged as mature to Search results</string> + <key>Persist</key> + <integer>1</integer> + <key>HideFromEditor</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>FindLandArea</key> + <map> + <key>Comment</key> + <string>Enables filtering of land search results by area</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>FindLandPrice</key> + <map> + <key>Comment</key> + <string>Enables filtering of land search results by price</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>ShowNearClip</key> <map> <key>Comment</key> @@ -11367,6 +11729,17 @@ <key>Value</key> <integer>75</integer> </map> + <key>SnapshotTimestamp</key> + <map> + <key>Comment</key> + <string>Add timestamp to snapshot file names</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>AbuseReportScreenshotDelay</key> <map> <key>Comment</key> @@ -11477,6 +11850,28 @@ <key>Value</key> <string>fss.txt</string> </map> + <key>StatsFrametimeSampleSeconds</key> + <map> + <key>Comment</key> + <string>The number of seconds to sample extended frametime data (percentiles, stddev).</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>5</integer> + </map> + <key>StatsFrametimeEventThreshold</key> + <map> + <key>Comment</key> + <string>The percentage that the frametime difference must exceed in order to register a frametime event. 0.1 = 10%, 0.25 = 25%, etc.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>0.1</real> + </map> <key>SystemLanguage</key> <map> <key>Comment</key> @@ -11684,7 +12079,7 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <real>0.04</real> + <real>0.0095</real> </map> <key>TextureScaleMaxAreaFactor</key> <map> @@ -12395,6 +12790,28 @@ <key>Value</key> <string>2ca849ba-2885-4bc3-90ef-d4987a5b983a</string> </map> + <key>UISndChatMention</key> + <map> + <key>Comment</key> + <string>Sound file for chat mention(uuid for sound asset)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>03e77cb5-592c-5b33-d271-2e46497c3fb3</string> + </map> + <key>UISndChatPing</key> + <map> + <key>Comment</key> + <string>Sound file for chat ping(uuid for sound asset)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>7dd36df6-2624-5438-f988-fdf8588a0ad9</string> + </map> <key>UISndClick</key> <map> <key>Comment</key> @@ -12915,9 +13332,9 @@ <key>Use24HourClock</key> <map> <key>Comment</key> - <string>12 vs 24. At the moment only for region restart schedule floater</string> + <string>12 vs 24. At the moment coverage is partial</string> <key>Persist</key> - <integer>0</integer> + <integer>1</integer> <key>Type</key> <string>Boolean</string> <key>Value</key> @@ -13610,7 +14027,7 @@ <key>WatchdogEnabled</key> <map> <key>Comment</key> - <string>Controls whether the thread watchdog timer is activated. Value is boolean. Set to -1 to defer to built-in default.</string> + <string>Controls whether the thread watchdog timer is activated. Value is S32. Set to -1 to defer to built-in default.</string> <key>Persist</key> <integer>0</integer> <key>Type</key> @@ -13687,7 +14104,7 @@ <key>FullScreen</key> <map> <key>Comment</key> - <string>run a fullscreen session</string> + <string>Run a fullscreen session. MacOS not supported</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -14110,7 +14527,133 @@ <!-- megapahit settings --> - <key>MPVBufferOptiMode</key> + + <key>MPVertexBufferMode</key> + <map> + <key>Comment</key> + <string>Vertex Buffer Mode for Mac (0=LL, 1=MP)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>MPHDRDisplay</key> + <map> + <key>Comment</key> + <string>Enable / Disable HDR Display Support (Mac)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>MPHDRBoost</key> + <map> + <key>Comment</key> + <string>HDR Boost</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <integer>1.0</integer> + </map> + <key>MPHDRGamma</key> + <map> + <key>Comment</key> + <string>HDR Gamma</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <integer>2.4</integer> + </map> + <key>MPHDRUIBoost</key> + <map> + <key>Comment</key> + <string>HDR UI Boost</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <integer>1.0</integer> + </map> + <key>MPColorPrecision</key> + <map> + <key>Comment</key> + <string>Color buffers precision</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>MPNoGLDebug</key> + <map> + <key>Comment</key> + <string>Enable / Disable GL Debug</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>MPGamma</key> + <map> + <key>Comment</key> + <string>Enable / Disable Gamma</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>MPTone</key> + <map> + <key>Comment</key> + <string>Enable / Disable Tonemap</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>MPGlow</key> + <map> + <key>Comment</key> + <string>Enable / Disable Glow</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>MPLuminanceMipmap</key> + <map> + <key>Comment</key> + <string> + Luminance Map Mipmaps: + (set to 0 to fix post-processing slowdowns) + 0:no + 1:yes + </string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>1</integer> + </map> <map> <key>Comment</key> <string> @@ -14126,28 +14669,138 @@ <key>Value</key> <integer>0</integer> </map> - <key>MPVCameraCollapsed</key> + <key>MPRenderShadowMaxDist</key> <map> <key>Comment</key> - <string> - Camera floater collapsed</string> + <string>Shadows Max Draw distance</string> <key>Persist</key> <integer>1</integer> <key>Type</key> - <string>Boolean</string> + <string>F32</string> + <key>Value</key> + <integer>64</integer> + </map> + <key>MPRenderBloom</key> + <map> + <key>Comment</key> + <string>Automatic bloom (n blur iterations, 0: Disable)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> <key>Value</key> <integer>0</integer> </map> - <key>MPVNearMeRange</key> + <key>MPBloomExtractBrightness</key> <map> <key>Comment</key> - <string>Search radius in the people panel</string> + <string>Auto bloom: Min extracted brightness</string> <key>Persist</key> <integer>1</integer> <key>Type</key> <string>F32</string> <key>Value</key> - <integer>4096</integer> + <real>0.20</real> + </map> + <key>MPBloomExtractMetal</key> + <map> + <key>Comment</key> + <string>Auto bloom: Metal roughness limit filter</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>0.40</real> + </map> + <key>MPBloomExtractNonMetal</key> + <map> + <key>Comment</key> + <string>Auto bloom: Non Metal roughness limit filter</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>0.0</real> + </map> + <key>MPBloomStrength</key> + <map> + <key>Comment</key> + <string>Auto bloom Strength (0.1 to 1.5)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>1.0</real> + </map> + <key>MPBloomBlurRadius</key> + <map> + <key>Comment</key> + <string>Auto bloom: Radius</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>1.5</real> + </map> + <key>MPBloomBlurRadiusAdd</key> + <map> + <key>Comment</key> + <string>Auto bloom: Radius add</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>0.9</real> + </map> + <key>MPRenderProbeUpdatePeriod</key> + <map> + <key>Comment</key> + <string>Delay between probes updates</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>15.0</real> + </map> + <key>MPRenderProbeSlowDown</key> + <map> + <key>Comment</key> + <string>Slow down probes updates</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>0.05</real> + </map> + <key>MPRenderProbeProgressive</key> + <map> + <key>Comment</key> + <string>Calculate Radiance progressively</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <real>0</real> + </map> + <key>MPVCameraCollapsed</key> + <map> + <key>Comment</key> + <string> + Camera floater collapsed</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> </map> <key>RenderVSyncEnabled</key> <map> @@ -14524,10 +15177,32 @@ <key>Value</key> <integer>1</integer> </map> - <key>OutfitGallerySortByName</key> + <key>OutfitGallerySortOrder</key> + <map> + <key>Comment</key> + <string>Gallery sorting: 0 - sort outfits by name, 1 - images frst, 2 - favorites first</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>OutfitListSortOrder</key> + <map> + <key>Comment</key> + <string>How outfit list in Avatar's floater is sorted. 0 - by name 1 - favorites to top</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>OutfitListFilterFullList</key> <map> <key>Comment</key> - <string>Always sort outfits by name in Outfit Gallery</string> + <string> 0 - show only matches. 1 - show all items in outfit as long as outfit or item inside matches.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -14764,7 +15439,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/404.html</string> + <string>https://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/404.html</string> </map> <key>OpenIMOnVoice</key> <map> @@ -14793,7 +15468,7 @@ <key>Comment</key> <string>Avatar follows cursor with avatars eyes, when disabled, avatar will look forward</string> <key>Persist</key> - <integer>0</integer> + <integer>1</integer> <key>Type</key> <string>Boolean</string> <key>Value</key> @@ -16408,6 +17083,50 @@ <key>Value</key> <integer>0</integer> </map> + <key>InventoryFavoritesUseStar</key> + <map> + <key>Comment</key> + <string>Show star near favorited items in inventory</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>InventoryFavoritesUseHollowStar</key> + <map> + <key>Comment</key> + <string>Show star near folders that contain favorites</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>InventoryFavoritesColorText</key> + <map> + <key>Comment</key> + <string>render favorite items using InventoryFavoriteText as color</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>InventoryAddAttachmentBehavior</key> + <map> + <key>Comment</key> + <string>Defines behavior when hitting return on an inventory item</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>StatsReportMaxDuration</key> <map> <key>Comment</key> @@ -16496,5 +17215,71 @@ <key>Value</key> <integer>1</integer> </map> + <key>MediaAutoPlayHuds</key> + <map> + <key>Comment</key> + <string>Automatically play HUD media</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>MediaFirstClickInteract</key> + <map> + <key>Comment</key> + <string>This setting controls which media (once loaded) does not require a first click to focus before interaction can begin. This allows clicks to be passed directly to media bypassing the focus click requirement. This setting is a bitfield, precomputed values are as follows: Disabled=0; Worn HUDs only=1; Owned objects=2; Friend objects=4; Group objects=8; Landowner objects=16; Any object=32767; All MOAP=32768. For complete details see lltoolpie.h enum MediaFirstClickTypes.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>31</integer> + </map> + <key>EnableSelectionHints</key> + <map> + <key>Comment</key> + <string>Whether or not to send editing hints to animate the arm when editing an object.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>EnableLookAtTarget</key> + <map> + <key>Comment</key> + <string>Whether or not to animate the avatar head and send look at targets when moving the cursor or focusing on objects</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>LimitLookAtTarget</key> + <map> + <key>Comment</key> + <string>Whether or not to clamp the look at targets around the avatar head before sending</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>LimitLookAtTargetDistance</key> + <map> + <key>Comment</key> + <string>Distance to limit look at target to</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <integer>2</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 80a4bec57f..8361a50b6c 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -329,7 +329,7 @@ <key>KeepConversationLogTranscripts</key> <map> <key>Comment</key> - <string>Keep a conversation log and transcripts</string> + <string>Keep a conversation log and transcripts 2 - both, 1 - logs, 0 - none</string> <key>Persist</key> <integer>1</integer> <key>Type</key> diff --git a/indra/newview/app_settings/shaders/class1/deferred/CASF.glsl b/indra/newview/app_settings/shaders/class1/deferred/CASF.glsl index 017855325c..8e12d09443 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/CASF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/CASF.glsl @@ -2545,12 +2545,31 @@ A_STATIC void CasSetup( #endif #ifdef A_GPU + +#ifdef LEGACY_GAMMA +uniform float gamma; + +vec3 legacyGamma(vec3 color) +{ + vec3 c = 1. - clamp(color, vec3(0.), vec3(1.)); + c = 1. - pow(c, vec3(gamma)); // s/b inverted already CPU-side + + return c; +} +#endif + void main() { vec4 diff = vec4(0.f); uvec2 point = uvec2(vary_fragcoord * out_screen_res.xy); CasFilter(diff.r, diff.g, diff.b, point, cas_param_0, cas_param_1, true); diff.a = texture(diffuseRect, vary_fragcoord).a; + diff.rgb = linear_to_srgb(diff.rgb); + +#ifdef LEGACY_GAMMA + diff.rgb = legacyGamma(diff.rgb); +#endif + frag_color = diff; } #endif diff --git a/indra/newview/app_settings/shaders/class1/deferred/MPHDRDisplayGammaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/MPHDRDisplayGammaF.glsl new file mode 100644 index 0000000000..503974cb7c --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/MPHDRDisplayGammaF.glsl @@ -0,0 +1,55 @@ +/** + * @file postDeferredGammaCorrect.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, 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$ + */ + +/*[EXTRA_CODE_HERE]*/ + +out vec4 frag_color; + +uniform sampler2D diffuseRect; + +uniform float gamma = 2.2; +uniform float mpHDRBoost = 1.0; + +in vec2 vary_fragcoord; + +vec3 clampHDRRange(vec3 color); + +vec3 HDRDisplayGamma(vec3 linearRGB) +{ + bvec3 cutoff = lessThan(linearRGB, vec3(0.0031308)); + vec3 higher = vec3(1.055)*pow(linearRGB, vec3(1.0/gamma)) - vec3(0.055); + vec3 lower = linearRGB * vec3(12.92); + + return mix(higher, lower, cutoff); +} + +void main() +{ + vec4 diff = texture(diffuseRect, vary_fragcoord); + diff.rgb = mpHDRBoost * HDRDisplayGamma(diff.rgb); + diff.rgb = clampHDRRange(diff.rgb); + frag_color = diff; +} + diff --git a/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl b/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl index fdb77cce6e..10a48f1e01 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl @@ -1351,6 +1351,10 @@ float4 SMAABlendingWeightCalculationPS(float2 texcoord, //----------------------------------------------------------------------------- // Neighborhood Blending Pixel Shader (Third Pass) +vec3 srgb_to_linear(vec3 cs); +vec4 srgb_to_linear4(vec4 cs); +vec3 linear_to_srgb(vec3 cl); + float4 SMAANeighborhoodBlendingPS(float2 texcoord, float4 offset, SMAATexture2D(colorTex), @@ -1369,6 +1373,7 @@ float4 SMAANeighborhoodBlendingPS(float2 texcoord, SMAA_BRANCH if (dot(a, float4(1.0, 1.0, 1.0, 1.0)) < 1e-5) { float4 color = SMAASampleLevelZero(colorTex, texcoord); + //color.rgb = srgb_to_linear(color.rgb); #if SMAA_REPROJECTION float2 velocity = SMAA_DECODE_VELOCITY(SMAASampleLevelZero(velocityTex, texcoord)); @@ -1377,6 +1382,7 @@ float4 SMAANeighborhoodBlendingPS(float2 texcoord, color.a = sqrt(5.0 * length(velocity)); #endif + //color.rgb = linear_to_srgb(color.rgb); return color; } else { bool h = max(a.x, a.z) > max(a.y, a.w); // max(horizontal) > max(vertical) @@ -1393,8 +1399,13 @@ float4 SMAANeighborhoodBlendingPS(float2 texcoord, // We exploit bilinear filtering to mix current pixel with the chosen // neighbor: - float4 color = blendingWeight.x * SMAASampleLevelZero(colorTex, blendingCoord.xy); - color += blendingWeight.y * SMAASampleLevelZero(colorTex, blendingCoord.zw); + float4 color = SMAASampleLevelZero(colorTex, blendingCoord.xy); + //color.rgb = srgb_to_linear(color.rgb); + color = blendingWeight.x * color; + + float4 color2 = SMAASampleLevelZero(colorTex, blendingCoord.zw); + //color2.rgb = srgb_to_linear(color2.rgb); + color += blendingWeight.y * color2; #if SMAA_REPROJECTION // Antialias velocity for proper reprojection in a later stage: @@ -1405,6 +1416,7 @@ float4 SMAANeighborhoodBlendingPS(float2 texcoord, color.a = sqrt(5.0 * length(velocity)); #endif + //color.rgb = linear_to_srgb(color.rgb); return color; } } diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaMaskShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaMaskShadowF.glsl index f1e0295859..084a334346 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaMaskShadowF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaMaskShadowF.glsl @@ -23,7 +23,7 @@ * $/LicenseInfo$ */ -out vec4 frag_color; +//out vec4 frag_color; uniform float minimum_alpha; uniform sampler2D diffuseMap; @@ -49,5 +49,5 @@ void main() } } - frag_color = vec4(1,1,1,1); + //frag_color = vec4(1,1,1,1); } diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaShadowF.glsl index 18ce998cb6..5986e8e462 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaShadowF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaShadowF.glsl @@ -23,7 +23,7 @@ * $/LicenseInfo$ */ -out vec4 frag_color; +//out vec4 frag_color; uniform float minimum_alpha; @@ -51,5 +51,5 @@ void main() } } - frag_color = vec4(1,1,1,1); + //frag_color = vec4(1,1,1,1); } diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl index 37dcbbd328..4396ae89a4 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl @@ -25,10 +25,10 @@ /*[EXTRA_CODE_HERE]*/ -out vec4 frag_color; +//out vec4 frag_color; void main() { - frag_color = vec4(1,1,1,1); + //frag_color = vec4(1,1,1,1); } diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl index aabbbac12a..1b1233790e 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl @@ -28,6 +28,9 @@ uniform mat4 projection_matrix; in vec3 position; in vec3 normal; in vec2 texcoord0; +#ifdef AVATAR_CLOTH +in vec4 clothing; +#endif mat4 getSkinnedTransform(); @@ -37,6 +40,15 @@ out vec3 vary_normal; out vec2 vary_texcoord0; out vec3 vary_position; +#ifdef AVATAR_CLOTH +uniform vec4 gWindDir; +uniform vec4 gSinWaveParams; +uniform vec4 gGravity; + +const vec4 gMinMaxConstants = vec4(1.0, 0.166666, 0.0083143, .00018542); // #minimax-generated coefficients +const vec4 gPiConstants = vec4(0.159154943, 6.28318530, 3.141592653, 1.5707963); // # {1/2PI, 2PI, PI, PI/2} +#endif + void main() { vary_texcoord0 = texcoord0; @@ -46,16 +58,78 @@ void main() vec4 pos_in = vec4(position.xyz, 1.0); mat4 trans = getSkinnedTransform(); - pos.x = dot(trans[0], pos_in); - pos.y = dot(trans[1], pos_in); - pos.z = dot(trans[2], pos_in); - pos.w = 1.0; norm.x = dot(trans[0].xyz, normal); norm.y = dot(trans[1].xyz, normal); norm.z = dot(trans[2].xyz, normal); norm = normalize(norm); +#ifdef AVATAR_CLOTH + //wind + vec4 windEffect; + windEffect = vec4(dot(norm, gWindDir.xyz)); + pos.x = dot(trans[2], pos_in); + windEffect.xyz = pos.x * vec3(0.015, 0.015, 0.015) + + windEffect.xyz; + windEffect.w = windEffect.w * 2.0 + 1.0; // move wind offset value to [-1, 3] + windEffect.w = windEffect.w*gWindDir.w; // modulate wind strength + + windEffect.xyz = windEffect.xyz*gSinWaveParams.xyz + +vec3(gSinWaveParams.w); // use sin wave params to scale and offset input + + //reduce to period of 2 PI + vec4 temp1, temp0, temp2, offsetPos; + temp1.xyz = windEffect.xyz * gPiConstants.x; // change input as multiple of [0-2PI] to [0-1] + temp0.y = mod(temp1.x,1.0); + windEffect.x = temp0.y * gPiConstants.y; // scale from [0,1] to [0, 2PI] + temp1.z = temp1.z - gPiConstants.w; // shift normal oscillation by PI/2 + temp0.y = mod(temp1.z,1.0); + + windEffect.z = temp0.y * gPiConstants.y; // scale from [0,1] to [0, 2PI] + windEffect.xyz = windEffect.xyz + vec3(-3.141592); // offset to [-PI, PI] + + //calculate sinusoid + vec4 sinWave; + temp1 = windEffect*windEffect; + sinWave = -temp1 * gMinMaxConstants.w + + vec4(gMinMaxConstants.z); // y = -(x^2)/7! + 1/5! + sinWave = sinWave * -temp1 + vec4(gMinMaxConstants.y); // y = -(x^2) * (-(x^2)/7! + 1/5!) + 1/3! + sinWave = sinWave * -temp1 + vec4(gMinMaxConstants.x); // y = -(x^2) * (-(x^2) * (-(x^2)/7! + 1/5!) + 1/3!) + 1 + sinWave = sinWave * windEffect; // y = x * (-(x^2) * (-(x^2) * (-(x^2)/7! + 1/5!) + 1/3!) + 1) + + // sinWave.x holds sin(norm . wind_direction) with primary frequency + // sinWave.y holds sin(norm . wind_direction) with secondary frequency + // sinWave.z hold cos(norm . wind_direction) with primary frequency + sinWave.xyz = sinWave.xyz * gWindDir.w + + vec3(windEffect.w); // multiply by wind strength in gWindDir.w [-wind, wind] + + // add normal facing bias offset [-wind,wind] -> [-wind - .25, wind + 1] + temp1 = vec4(dot(norm, gGravity.xyz)); // how much is this normal facing in direction of gGravity? + temp1 = min(temp1, vec4(0.2,0.0,0.0,0.0)); // clamp [-1, 1] to [-1, 0.2] + temp1 = temp1*vec4(1.5,0.0,0.0,0.0); // scale from [-1,0.2] to [-1.5, 0.3] + sinWave.x = sinWave.x + temp1.x; // add gGravity effect to sinwave (only primary frequency) + sinWave.xyz = sinWave.xyz * clothing.w; // modulate by clothing coverage + + sinWave.xyz = max(sinWave.xyz, vec3(-1.0, -1.0, -1.0)); // clamp to underlying body shape + offsetPos = clothing * sinWave.x; // multiply wind effect times clothing displacement + temp2 = gWindDir*sinWave.z + vec4(norm,0); // calculate normal offset due to wind oscillation + offsetPos = vec4(1.0,1.0,1.0,0.0)*offsetPos+pos_in; // add to offset vertex position, and zero out effect from w + norm += temp2.xyz*2.0; // add sin wave effect on normals (exaggerated) + + //renormalize normal (again) + norm = normalize(norm); + + pos.x = dot(trans[0], offsetPos); + pos.y = dot(trans[1], offsetPos); + pos.z = dot(trans[2], offsetPos); + pos.w = 1.0; +#else + pos.x = dot(trans[0], pos_in); + pos.y = dot(trans[1], pos_in); + pos.z = dot(trans[2], pos_in); + pos.w = 1.0; +#endif + vary_normal = norm; vary_position = pos.xyz; diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl index d32455d70c..63ab0b9b38 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl @@ -80,6 +80,18 @@ vec3 atmosFragLightingLinear(vec3 light, vec3 additive, vec3 atten); vec4 decodeNormal(vec4 norm); +vec3 clampHDRRange(vec3 color) +{ + // Why do this? + // There are situations where the color range will go to something insane - potentially producing infs and NaNs even. + // This is a safety measure to prevent that. + // As to the specific number there - allegedly some HDR displays expect values to be in the 0-11.2 range. Citation needed. + // -Geenz 2025-03-05 + color = mix(color, vec3(1), isinf(color)); + color = mix(color, vec3(0.0), isnan(color)); + return clamp(color, vec3(0.0), vec3(11.2)); +} + float calcLegacyDistanceAttenuation(float distance, float falloff) { float dist_atten = 1.0 - clamp((distance + falloff)/(1.0 + falloff), 0.0, 1.0); @@ -426,9 +438,10 @@ float geometricOcclusion(PBRInfo pbrInputs) float NdotL = pbrInputs.NdotL; float NdotV = pbrInputs.NdotV; float r = pbrInputs.alphaRoughness; + float r2 = r * r; - float attenuationL = 2.0 * NdotL / (NdotL + sqrt(r * r + (1.0 - r * r) * (NdotL * NdotL))); - float attenuationV = 2.0 * NdotV / (NdotV + sqrt(r * r + (1.0 - r * r) * (NdotV * NdotV))); + float attenuationL = 2.0 * NdotL / (NdotL + sqrt(r2 + (1.0 - r2) * (NdotL * NdotL))); + float attenuationV = 2.0 * NdotV / (NdotV + sqrt(r2 + (1.0 - r2) * (NdotV * NdotV))); return attenuationL * attenuationV; } @@ -613,24 +626,11 @@ vec3 pbrBaseLight(vec3 diffuseColor, vec3 specularColor, float metallic, vec3 v, uniform vec4 waterPlane; uniform float waterSign; -// discard if given position in eye space is on the wrong side of the waterPlane according to waterSign void waterClip(vec3 pos) { - // TODO: make this less branchy - if (waterSign > 0.0) + if (((dot(pos.xyz, waterPlane.xyz) + waterPlane.w) * waterSign) < 0.0) { - if ((dot(pos.xyz, waterPlane.xyz) + waterPlane.w) < 0.0) - { - discard; - } + discard; } - else - { - if ((dot(pos.xyz, waterPlane.xyz) + waterPlane.w) > 0.0) - { - discard; - } - } - } diff --git a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl index 4acab159cb..4331418b33 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl @@ -37,14 +37,10 @@ uniform sampler2D emissiveRect; uniform sampler2D normalMap; uniform float diffuse_luminance_scale; -float lum(vec3 col) -{ - vec3 l = vec3(0.2126, 0.7152, 0.0722); - return dot(l, col); -} void main() { + const vec3 l = vec3(0.2126, 0.7152, 0.0722); vec2 tc = vary_fragcoord*0.6+0.2; tc.y -= 0.1; // HACK - nudge exposure sample down a little bit to favor ground over sky vec3 c = texture(diffuseRect, tc).rgb; @@ -62,7 +58,7 @@ void main() c += texture(emissiveRect, tc).rgb; - float L = lum(c); + float L = dot(l, c); frag_color = vec4(max(L, 0.0)); } diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaBlendF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaBlendF.glsl index dbaab9bbda..90d81ab6b2 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaBlendF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaBlendF.glsl @@ -23,7 +23,7 @@ * $/LicenseInfo$ */ -out vec4 frag_color; +//out vec4 frag_color; uniform sampler2D diffuseMap; @@ -52,5 +52,5 @@ void main() } } - frag_color = vec4(1,1,1,1); + //frag_color = vec4(1,1,1,1); } diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl index 07a2218db2..2b314db51a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl @@ -23,7 +23,7 @@ * $/LicenseInfo$ */ -out vec4 frag_color; +//out vec4 frag_color; uniform sampler2D diffuseMap; @@ -42,5 +42,5 @@ void main() discard; } - frag_color = vec4(1,1,1,1); + //frag_color = vec4(1,1,1,1); } diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index 9797bcd2ce..4e737492a7 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -69,6 +69,8 @@ void dofSampleNear(inout vec4 diff, inout float w, float min_sc, vec2 tc) w += wg; } +vec3 clampHDRRange(vec3 color); + void main() { vec2 tc = vary_fragcoord.xy; @@ -120,5 +122,6 @@ void main() diff /= w; } + diff.rgb = clampHDRRange(diff.rgb); frag_color = diff; } diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl index befd2ae6da..a24e7c0b90 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl @@ -30,7 +30,7 @@ out vec4 frag_color; uniform sampler2D diffuseRect; uniform float gamma; -uniform vec2 screen_res; +//uniform vec2 screen_res; in vec2 vary_fragcoord; vec3 linear_to_srgb(vec3 cl); @@ -53,6 +53,7 @@ void main() diff.rgb = legacyGamma(diff.rgb); #endif - frag_color = max(diff, vec4(0)); + diff.rgb = clamp(diff.rgb, vec3(0.0), vec3(1.0)); + frag_color = diff; } diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl index 32b0a1ac8e..c05b4eed7a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl @@ -71,6 +71,7 @@ float noise(vec2 x) { //============================= +vec3 clampHDRRange(vec3 color); void main() @@ -84,6 +85,7 @@ void main() diff.rgb += nz*0.003; #endif + diff.rgb = clampHDRRange(diff.rgb); frag_color = diff; gl_FragDepth = texture(depthMap, vary_fragcoord.xy).r; diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredTonemap.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredTonemap.glsl index c4610bffac..b1218d61af 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredTonemap.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredTonemap.glsl @@ -31,9 +31,25 @@ uniform sampler2D diffuseRect; in vec2 vary_fragcoord; +#ifdef GAMMA_CORRECT +uniform float gamma; +#endif + vec3 linear_to_srgb(vec3 cl); vec3 toneMap(vec3 color); +vec3 clampHDRRange(vec3 color); + +#ifdef GAMMA_CORRECT +vec3 legacyGamma(vec3 color) +{ + vec3 c = 1. - clamp(color, vec3(0.), vec3(1.)); + c = 1. - pow(c, vec3(gamma)); // s/b inverted already CPU-side + + return c; +} +#endif + void main() { //this is the one of the rare spots where diffuseRect contains linear color values (not sRGB) @@ -45,7 +61,18 @@ void main() diff.rgb = clamp(diff.rgb, vec3(0.0), vec3(1.0)); #endif +#ifdef GAMMA_CORRECT + diff.rgb = linear_to_srgb(diff.rgb); + +#ifdef LEGACY_GAMMA + diff.rgb = legacyGamma(diff.rgb); +#endif + +#endif + + diff.rgb = clamp(diff.rgb, vec3(0.0), vec3(1.0)); // We should always be 0-1 past this point + //debugExposure(diff.rgb); - frag_color = max(diff, vec4(0)); + frag_color = diff; } diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl index f208ac746b..a37e970feb 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl @@ -25,7 +25,7 @@ /*[EXTRA_CODE_HERE]*/ -out vec4 frag_color; +//out vec4 frag_color; in vec4 post_pos; in float target_pos_x; @@ -59,5 +59,5 @@ void main() } } - frag_color = vec4(1,1,1,1); + //frag_color = vec4(1,1,1,1); } diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl index b55d769fd6..c4e4c4d051 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl @@ -23,9 +23,9 @@ * $/LicenseInfo$ */ -out vec4 frag_color; +//out vec4 frag_color; void main() { - frag_color = vec4(1,1,1,1); + //frag_color = vec4(1,1,1,1); } diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl index 6f7bd2bf3c..033c2f924a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl @@ -113,8 +113,8 @@ float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen) if (spos.z > -shadow_clip.w) { vec4 lpos; - vec4 near_split = shadow_clip*-0.75; - vec4 far_split = shadow_clip*-1.25; + vec4 near_split = shadow_clip*-0.9; + vec4 far_split = shadow_clip*-1.1; vec4 transition_domain = near_split-far_split; float weight = 0.0; @@ -131,7 +131,10 @@ float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen) shadow += contrib; weight += w; } - shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0); + + //shadow += max( (pos.z+shadow_clip.z) / (shadow_clip.z-shadow_clip.w) * 2.0 - 1.0, 0.0); + shadow += max( (pos.z+shadow_clip.z) / (shadow_clip.z-shadow_clip.w) * 1.0, 0.0); + //shadow -= max( (shadow_clip.z + pos.z) / (shadow_clip.z - shadow_clip.w) , 0.0); } if (spos.z < near_split.y && spos.z > far_split.z) diff --git a/indra/newview/app_settings/shaders/class1/deferred/tonemapUtilF.glsl b/indra/newview/app_settings/shaders/class1/deferred/tonemapUtilF.glsl index a63b8d7c2b..774ccb6baf 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/tonemapUtilF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/tonemapUtilF.glsl @@ -117,27 +117,34 @@ uniform float exposure; uniform float tonemap_mix; uniform int tonemap_type; + vec3 toneMap(vec3 color) { #ifndef NO_POST - float exp_scale = texture(exposureMap, vec2(0.5,0.5)).r; - - color *= exposure * exp_scale; + vec3 linear_input_color = color; - vec3 clamped_color = clamp(color.rgb, vec3(0.0), vec3(1.0)); + float exp_scale = texture(exposureMap, vec2(0.5,0.5)).r; + float final_exposure = exposure * exp_scale; + vec3 exposed_color = color * final_exposure; + vec3 tonemapped_color = exposed_color; switch(tonemap_type) { case 0: - color = PBRNeutralToneMapping(color); + tonemapped_color = PBRNeutralToneMapping(exposed_color); break; case 1: - color = toneMapACES_Hill(color); + tonemapped_color = toneMapACES_Hill(exposed_color); break; } - // mix tonemapped and linear here to provide adjustment - color = mix(clamped_color, color, tonemap_mix); + vec3 exposed_linear_input = linear_input_color * final_exposure; + color = mix(exposed_linear_input, tonemapped_color, tonemap_mix); + + color = clamp(color, 0.0, 1.0); +#else + color *= exposure * texture(exposureMap, vec2(0.5,0.5)).r; + color = clamp(color, 0.0, 1.0); #endif return color; @@ -147,20 +154,24 @@ vec3 toneMap(vec3 color) vec3 toneMapNoExposure(vec3 color) { #ifndef NO_POST - vec3 clamped_color = clamp(color.rgb, vec3(0.0), vec3(1.0)); + vec3 linear_input_color = color; + vec3 tonemapped_color = color; switch(tonemap_type) { case 0: - color = PBRNeutralToneMapping(color); + tonemapped_color = PBRNeutralToneMapping(color); break; case 1: - color = toneMapACES_Hill(color); + tonemapped_color = toneMapACES_Hill(color); break; } - // mix tonemapped and linear here to provide adjustment - color = mix(clamped_color, color, tonemap_mix); + color = mix(linear_input_color, tonemapped_color, tonemap_mix); + + color = clamp(color, 0.0, 1.0); +#else + color = clamp(color, 0.0, 1.0); #endif return color; diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl index 33a5efa45d..4579d4fbe0 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl @@ -26,7 +26,7 @@ /*[EXTRA_CODE_HERE]*/ -out vec4 frag_color; +//out vec4 frag_color; uniform float minimum_alpha; @@ -43,5 +43,5 @@ void main() discard; } - frag_color = vec4(1,1,1,1); + //frag_color = vec4(1,1,1,1); } diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomBlurF.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomBlurF.glsl new file mode 100644 index 0000000000..0efbbdce96 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/effects/bloomBlurF.glsl @@ -0,0 +1,37 @@ +out vec4 frag_color; + +in vec2 vary_texcoord0; + +uniform sampler2D bloomEMap; + +uniform bool bloomHorizontal; +uniform float bloomBlurRadius = 1.5; + +uniform float weight[5] = float[] (0.227027, 0.1945946, 0.1216216, 0.054054, 0.016216); + +void main() +{ + vec2 size = vec2(bloomBlurRadius, bloomBlurRadius); + + vec2 tex_offset = size / textureSize(bloomEMap, 0); // gets size of single texel + vec3 result = texture(bloomEMap, vary_texcoord0).rgb * weight[0]; // current fragment's contribution + + if(bloomHorizontal) + { + for(int i = 1; i < 5; i++) + { + result += texture(bloomEMap, vary_texcoord0 + vec2(tex_offset.x * i, 0.0)).rgb * weight[i]; + result += texture(bloomEMap, vary_texcoord0 - vec2(tex_offset.x * i, 0.0)).rgb * weight[i]; + } + } + else + { + for(int i = 1; i < 5; i++) + { + result += texture(bloomEMap, vary_texcoord0 + vec2(0.0, tex_offset.y * i)).rgb * weight[i]; + result += texture(bloomEMap, vary_texcoord0 - vec2(0.0, tex_offset.y * i)).rgb * weight[i]; + } + } + + frag_color = vec4(result, 1.0); +}
\ No newline at end of file diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomBlurV.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomBlurV.glsl new file mode 100644 index 0000000000..e40b60ed3c --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/effects/bloomBlurV.glsl @@ -0,0 +1,8 @@ +in vec3 position; +out vec2 vary_texcoord0; + +void main() +{ + gl_Position = vec4(position, 1.0); + vary_texcoord0.xy = position.xy * 0.5 + 0.5; +}
\ No newline at end of file diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomCombineF.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomCombineF.glsl new file mode 100644 index 0000000000..40cfdd6bff --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/effects/bloomCombineF.glsl @@ -0,0 +1,21 @@ +out vec4 frag_color; + +in vec2 vary_texcoord0; + +uniform sampler2D diffuseMap; +uniform sampler2D bloomBlurredMap; + +uniform float bloomStrength; +uniform float bloomClampValue; + +void main() +{ + vec4 hdrColor = texture(diffuseMap, vary_texcoord0); + vec4 bloomColor = texture(bloomBlurredMap, vary_texcoord0); + vec4 result = hdrColor; + + result.rgb += bloomStrength * bloomColor.rgb; + result.rgb = clamp(result.rgb, vec3(0.0), vec3(bloomClampValue)); + + frag_color = result; +}
\ No newline at end of file diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomCombineV.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomCombineV.glsl new file mode 100644 index 0000000000..e40b60ed3c --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/effects/bloomCombineV.glsl @@ -0,0 +1,8 @@ +in vec3 position; +out vec2 vary_texcoord0; + +void main() +{ + gl_Position = vec4(position, 1.0); + vary_texcoord0.xy = position.xy * 0.5 + 0.5; +}
\ No newline at end of file diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomExtractF.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomExtractF.glsl new file mode 100644 index 0000000000..66d86eec1f --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/effects/bloomExtractF.glsl @@ -0,0 +1,89 @@ +out vec4 frag_color; + +uniform sampler2D diffuseMap; +uniform sampler2D bloomExtractORM; // orm +//uniform sampler2D bloomExtractEmissive; // emissive +uniform sampler2D bloomExtractEmissive2; // emissive 2 + +uniform float bloomExtractBrightness = 0.9; +uniform float bloomExtractMetal = 0.20; +uniform float bloomExtractNonMetal = 0.20; + +in vec2 vary_texcoord0; + +void main() +{ + vec4 col = texture(diffuseMap, vary_texcoord0.xy); + + if(col.a > 0.001) + { + discard; + return; + } + + //int valid = 0; + //float brightness = dot(col.rgb, vec3(0.2126, 0.7152, 0.0722)); + float brightness = dot(col.rgb, vec3(0.3, 0.5, 0.2)); + + if(brightness < bloomExtractBrightness) + { + discard; + return; + } + + /* + vec3 emi = texture(bloomExtractEmissive, vary_texcoord0.xy).rgb; + if(emi.r + emi.g + emi.b > 0.01) + { + discard; + return; + } + */ + + vec3 emi = texture(bloomExtractEmissive2, vary_texcoord0.xy).rgb; + if(emi.r + emi.g + emi.b > 0.01) + { + discard; + return; + } + + vec4 orm = texture(bloomExtractORM, vary_texcoord0.xy); + + if(orm.r < 0.7) + { + discard; + return; + } + + if(bloomExtractMetal == 1.0 && bloomExtractNonMetal == 1.0) + { + frag_color = vec4(col.rgb, 0.0); + return; + } + + if(orm.b < 0.15) + { + // non metal + if(orm.g >= bloomExtractNonMetal) + { + discard; + return; + } + } + else if(orm.b > 0.8) + { + // metal + if(orm.g >= bloomExtractMetal) + { + discard; + return; + } + } + else + { + discard; + return; + } + + frag_color = vec4(col.rgb, 0.0); +}
\ No newline at end of file diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomExtractV.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomExtractV.glsl new file mode 100644 index 0000000000..e40b60ed3c --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/effects/bloomExtractV.glsl @@ -0,0 +1,8 @@ +in vec3 position; +out vec2 vary_texcoord0; + +void main() +{ + gl_Position = vec4(position, 1.0); + vary_texcoord0.xy = position.xy * 0.5 + 0.5; +}
\ No newline at end of file diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl index c7cb076099..ffc5d86d9d 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl @@ -28,7 +28,6 @@ out vec4 frag_color; uniform float minimum_alpha; vec3 atmosLighting(vec3 light); -vec3 scaleSoftClip(vec3 light); in vec4 vertex_color; in vec2 vary_texcoord0; @@ -45,7 +44,6 @@ void default_lighting() color *= vertex_color; color.rgb = atmosLighting(color.rgb); - color.rgb = scaleSoftClip(color.rgb); frag_color = max(color, vec4(0)); } diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl index 77324edcff..0519ae1090 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl @@ -30,7 +30,6 @@ uniform float minimum_alpha; uniform sampler2D diffuseMap; vec3 atmosLighting(vec3 light); -vec3 scaleSoftClip(vec3 light); in vec4 vertex_color; in vec2 vary_texcoord0; @@ -48,7 +47,6 @@ void default_lighting() color.rgb = atmosLighting(color.rgb); - color.rgb = scaleSoftClip(color.rgb); frag_color = max(color, vec4(0)); } diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl index e8523935ed..2d43ef60be 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl @@ -29,7 +29,6 @@ in vec4 vertex_color; in vec2 vary_texcoord0; vec3 atmosLighting(vec3 light); -vec3 scaleSoftClip(vec3 light); void default_lighting() { @@ -37,7 +36,6 @@ void default_lighting() color.rgb = atmosLighting(color.rgb); - color.rgb = scaleSoftClip(color.rgb); frag_color = max(color, vec4(0)); } diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl index 95200444b9..83c36dea6d 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl @@ -31,7 +31,7 @@ in vec2 vary_texcoord0; uniform sampler2D diffuseMap; vec3 atmosLighting(vec3 light); -vec3 scaleSoftClip(vec3 light); +//vec3 scaleSoftClip(vec3 light); void default_lighting() { @@ -39,7 +39,7 @@ void default_lighting() color.rgb = atmosLighting(color.rgb); - color.rgb = scaleSoftClip(color.rgb); + //color.rgb = scaleSoftClip(color.rgb); frag_color = max(color, vec4(0)); } diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleColorF.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleColorF.glsl index dea76da5a5..30d70122cb 100644 --- a/indra/newview/app_settings/shaders/class1/objects/simpleColorF.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/simpleColorF.glsl @@ -33,20 +33,9 @@ uniform float waterSign; void waterClip(vec3 pos) { - // TODO: make this less branchy - if (waterSign > 0) + if (((dot(pos.xyz, waterPlane.xyz) + waterPlane.w) * waterSign) < 0.0) { - if ((dot(pos.xyz, waterPlane.xyz) + waterPlane.w) < 0.0) - { - discard; - } - } - else - { - if ((dot(pos.xyz, waterPlane.xyz) + waterPlane.w) > 0.0) - { - discard; - } + discard; } } diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl index a892ff9cdc..6fc1747089 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl @@ -25,7 +25,6 @@ vec3 getAdditiveColor(); vec3 getAtmosAttenuation(); -vec3 scaleSoftClipFrag(vec3 light); vec3 srgb_to_linear(vec3 col); vec3 linear_to_srgb(vec3 col); diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl index 02108a9ec1..9101fc0222 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl @@ -154,6 +154,7 @@ void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, ou if (classic_mode < 1) { amblit = srgb_to_linear(amblit); + amblit = vec3(dot(amblit, vec3(0.2126, 0.7152, 0.0722))); sunlit = srgb_to_linear(sunlit); } diff --git a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl index f8803f1a29..9b6b2e5b33 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl @@ -39,7 +39,6 @@ uniform int sun_up_factor; uniform int classic_mode; vec4 applySkyAndWaterFog(vec3 pos, vec3 additive, vec3 atten, vec4 color); -vec3 scaleSoftClipFragLinear(vec3 l); void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, out vec3 sunlit, out vec3 amblit, out vec3 atten, out vec3 additive); void calcHalfVectors(vec3 lv, vec3 n, vec3 v, out vec3 h, out vec3 l, out float nh, out float nl, out float nv, out float vh, out float lightDist); diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl index 2e288184bf..2b42d757cb 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl @@ -64,7 +64,6 @@ vec4 getPositionWithDepth(vec2 pos_screen, float depth); void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, out vec3 sunlit, out vec3 amblit, out vec3 atten, out vec3 additive); vec3 atmosFragLightingLinear(vec3 l, vec3 additive, vec3 atten); -vec3 scaleSoftClipFragLinear(vec3 l); // reflection probe interface void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, @@ -104,6 +103,7 @@ vec3 pbrBaseLight(vec3 diffuseColor, vec3 atten); GBufferInfo getGBuffer(vec2 screenpos); +vec3 clampHDRRange(vec3 color); void adjustIrradiance(inout vec3 irradiance, float ambocc) { @@ -278,6 +278,7 @@ void main() float final_scale = 1; if (classic_mode > 0) final_scale = 1.1; - frag_color.rgb = max(color.rgb * final_scale, vec3(0)); //output linear since local lights will be added to this shader's results + + frag_color.rgb = clampHDRRange(color.rgb * final_scale); //output linear since local lights will be added to this shader's results frag_color.a = 0.0; } diff --git a/indra/newview/app_settings/shaders/class3/environment/waterF.glsl b/indra/newview/app_settings/shaders/class3/environment/waterF.glsl index d08bae0d7d..c2167dfcba 100644 --- a/indra/newview/app_settings/shaders/class3/environment/waterF.glsl +++ b/indra/newview/app_settings/shaders/class3/environment/waterF.glsl @@ -33,7 +33,6 @@ out vec4 frag_color; float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen); #endif -vec3 scaleSoftClipFragLinear(vec3 l); void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, out vec3 sunlit, out vec3 amblit, out vec3 atten, out vec3 additive); vec4 applyWaterFogViewLinear(vec3 pos, vec4 color); @@ -119,7 +118,6 @@ vec3 srgb_to_linear(vec3 col); vec3 linear_to_srgb(vec3 col); vec3 atmosLighting(vec3 light); -vec3 scaleSoftClip(vec3 light); vec3 toneMapNoExposure(vec3 color); vec3 vN, vT, vB; @@ -265,7 +263,12 @@ void main() vec3 refPos = getPositionWithNDC(vec3(distort*2.0-vec2(1.0), depth*2.0-1.0)); // Calculate some distance fade in the water to better assist with refraction blending and reducing the refraction texture's "disconnect". - fade = max(0.0,min(1.0, (pos.z - refPos.z) / 10.0)) * water_mask; +#ifdef SHORELINE_FADE + fade = max(0.0,min(1.0, (pos.z - refPos.z) / 10.0)); +#else + fade = 1.0; +#endif + fade *= water_mask; distort2 = mix(distort, distort2, min(1.0, fade * 10.0)); depth = texture(depthMap, distort2).r; @@ -323,7 +326,7 @@ void main() radiance *= df2.y; //radiance = toneMapNoExposure(radiance); vec3 color = vec3(0); - color = mix(fb.rgb, radiance, min(1.0, df2.x)) + punctual.rgb; + color = mix(fb.rgb, radiance, min(5.0, df2.x)) + punctual.rgb; float water_haze_scale = 4.0; @@ -341,6 +344,5 @@ void main() float spec = min(max(max(punctual.r, punctual.g), punctual.b), 0.0); - frag_color = min(vec4(1),max(vec4(color.rgb, spec * water_mask), vec4(0))); + frag_color = min(vec4(5),max(vec4(color.rgb, spec * water_mask), vec4(0))); } - diff --git a/indra/newview/character/attentions.xml b/indra/newview/character/attentions.xml index 9bda3309ac..be9a2b28fc 100644 --- a/indra/newview/character/attentions.xml +++ b/indra/newview/character/attentions.xml @@ -33,7 +33,7 @@ MOUSELOOK: Tracks center of view when in mouselook view mode. <param attention="hover" priority="4.0" timeout="1.0" /> <param attention="conversation" priority="0.0" timeout="-1" /> <param attention="select" priority="6.0" timeout="-1" /> - <param attention="focus" priority="0.0" timeout="-1" /> + <param attention="focus" priority="6.0" timeout="-1" /> <param attention="mouselook" priority="7.0" timeout="-1" /> </gender> <gender name="Feminine"> @@ -44,7 +44,7 @@ MOUSELOOK: Tracks center of view when in mouselook view mode. <param attention="hover" priority="4.0" timeout="1.0" /> <param attention="conversation" priority="0.0" timeout="-1" /> <param attention="select" priority="6.0" timeout="-1" /> - <param attention="focus" priority="0.0" timeout="-1" /> + <param attention="focus" priority="6.0" timeout="-1" /> <param attention="mouselook" priority="7.0" timeout="-1" /> </gender> </linden_attentions> diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index cb79410d72..1090dd8ffb 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -1,4 +1,4 @@ -version 73 +version 74 // The version number above should be incremented IF AND ONLY IF some // change has been made that is sufficiently important to justify // resetting the graphics preferences of all users to the recommended @@ -86,6 +86,7 @@ RenderTonemapType 1 1 RenderTonemapMix 1 1 RenderDisableVintageMode 1 1 RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 1 256 // // Low Graphics Settings @@ -128,6 +129,7 @@ RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderDisableVintageMode 1 0 RenderMaxTextureResolution 1 512 +RenderReflectionProbeCount 1 1 // // Medium Low Graphics Settings @@ -170,6 +172,7 @@ RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderDisableVintageMode 1 0 RenderMaxTextureResolution 1 1024 +RenderReflectionProbeCount 1 32 // // Medium Graphics Settings (standard) @@ -211,6 +214,7 @@ RenderExposure 1 1 RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 1 64 // // Medium High Graphics Settings @@ -241,7 +245,7 @@ RenderFSAASamples 1 1 RenderReflectionsEnabled 1 1 RenderReflectionProbeDetail 1 1 RenderScreenSpaceReflections 1 0 -RenderReflectionProbeLevel 1 2 +RenderReflectionProbeLevel 1 1 RenderMirrors 1 0 RenderHeroProbeResolution 1 512 RenderHeroProbeDistance 1 6 @@ -252,6 +256,7 @@ RenderExposure 1 1 RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 1 64 // // High Graphics Settings (SSAO + sun shadows) @@ -282,7 +287,7 @@ RenderFSAASamples 1 2 RenderReflectionsEnabled 1 1 RenderReflectionProbeDetail 1 1 RenderScreenSpaceReflections 1 0 -RenderReflectionProbeLevel 1 3 +RenderReflectionProbeLevel 1 2 RenderMirrors 1 0 RenderHeroProbeResolution 1 512 RenderHeroProbeDistance 1 8 @@ -293,6 +298,7 @@ RenderExposure 1 1 RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 1 128 // // High Ultra Graphics Settings (deferred + SSAO + all shadows) @@ -334,6 +340,7 @@ RenderExposure 1 1 RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 1 256 // // Ultra graphics (REALLY PURTY!) @@ -375,6 +382,7 @@ RenderExposure 1 1 RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 1 256 // // Class Unknown Hardware (unknown) @@ -408,6 +416,7 @@ RenderReflectionProbeDetail 0 -1 RenderMirrors 0 0 RenderDisableVintageMode 1 0 RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 0 0 list Intel RenderAnisotropic 1 0 @@ -429,6 +438,7 @@ RenderMirrors 0 0 RenderGLMultiThreadedTextures 0 0 RenderGLMultiThreadedMedia 0 0 RenderDisableVintageMode 1 0 +RenderReflectionProbeCount 0 0 list TexUnit16orLess RenderTerrainPBRDetail 1 -1 diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index d8d4f08429..f97ff28062 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -48,6 +48,7 @@ RenderLocalLights 1 1 RenderReflectionDetail 1 4 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTerrainPBRDetail 1 0 RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderVBOEnable 1 1 @@ -88,6 +89,7 @@ RenderObjectBump 1 0 RenderReflectionDetail 1 0 RenderTerrainDetail 1 0 RenderTerrainLODFactor 1 1 +RenderTerrainPBRDetail 1 -1 RenderTransparentWater 1 0 RenderTreeLODFactor 1 0 RenderVolumeLODFactor 1 1.125 @@ -128,6 +130,7 @@ RenderTerrainDetail 1 0 RenderTerrainLODFactor 1 1 RenderTransparentWater 1 0 RenderTreeLODFactor 1 0 +RenderTerrainPBRDetail 1 -1 RenderVolumeLODFactor 1 1.125 WindLightUseAtmosShaders 1 0 RenderDeferred 1 0 @@ -166,6 +169,7 @@ RenderTerrainLODFactor 1 1.0 RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 1.125 +RenderTerrainPBRDetail 1 -1 WindLightUseAtmosShaders 1 0 RenderDeferred 1 0 RenderDeferredSSAO 1 0 @@ -200,6 +204,7 @@ RenderLocalLights 1 1 RenderReflectionDetail 1 0 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTerrainPBRDetail 1 0 RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 1.125 @@ -237,6 +242,7 @@ RenderLocalLights 1 1 RenderReflectionDetail 1 0 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTerrainPBRDetail 1 0 RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 1.125 @@ -274,6 +280,7 @@ RenderLocalLights 1 1 RenderReflectionDetail 1 0 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTerrainPBRDetail 1 0 RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 1.125 @@ -311,6 +318,7 @@ RenderLocalLights 1 1 RenderReflectionDetail 1 0 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTerrainPBRDetail 1 0 RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 1.125 @@ -347,6 +355,7 @@ RenderObjectBump 1 1 RenderReflectionDetail 1 4 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTerrainPBRDetail 1 0 RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderVolumeLODFactor 1 2.0 @@ -755,3 +764,5 @@ RenderShaderLightingMaxLevel 1 2 list NVIDIA_GeForce_Go_7900 RenderShaderLightingMaxLevel 1 2 +list TexUnit16orLess +RenderTerrainPBRDetail 1 -1 diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index f3c3c4fcd9..396ece9dc1 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -1,4 +1,4 @@ -version 72 +version 73 // The version number above should be incremented IF AND ONLY IF some // change has been made that is sufficiently important to justify // resetting the graphics preferences of all users to the recommended @@ -69,7 +69,7 @@ RenderMaxTextureIndex 1 16 RenderGLContextCoreProfile 1 1 RenderGLMultiThreadedTextures 1 1 RenderGLMultiThreadedMedia 1 1 -RenderAppleUseMultGL 1 1 +RenderAppleUseMultGL 1 0 RenderReflectionsEnabled 1 1 RenderReflectionProbeDetail 1 2 RenderScreenSpaceReflections 1 1 @@ -86,6 +86,7 @@ RenderTonemapMix 1 1 RenderDisableVintageMode 1 1 RenderDownScaleMethod 1 0 RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 1 256 // // Low Graphics Settings @@ -105,7 +106,7 @@ RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 1.0 RenderTerrainPBRDetail 1 -1 RenderTerrainPBRPlanarSampleCount 1 1 -RenderTransparentWater 1 1 +RenderTransparentWater 1 0 RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 1.125 RenderDeferredSSAO 1 0 @@ -113,12 +114,12 @@ RenderShadowDetail 1 0 WLSkyDetail 1 96 RenderFSAAType 1 0 RenderFSAASamples 1 0 -RenderReflectionsEnabled 1 0 +RenderReflectionsEnabled 1 1 RenderReflectionProbeDetail 1 0 RenderScreenSpaceReflections 1 0 RenderReflectionProbeLevel 1 0 RenderMirrors 1 0 -RenderHeroProbeResolution 1 256 +RenderHeroProbeResolution 1 64 RenderHeroProbeDistance 1 4 RenderHeroProbeUpdateRate 1 6 RenderHeroProbeConservativeUpdateMultiplier 1 16 @@ -128,6 +129,8 @@ RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderDisableVintageMode 1 0 RenderMaxTextureResolution 1 512 +RenderReflectionProbeCount 1 4 +RenderReflectionProbeDrawDistance 1 16.0 // @@ -150,7 +153,7 @@ RenderTerrainPBRDetail 1 -1 RenderTerrainPBRPlanarSampleCount 1 1 RenderTransparentWater 1 0 RenderTreeLODFactor 1 0.5 -RenderVolumeLODFactor 1 1.125 +RenderVolumeLODFactor 1 2.0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 WLSkyDetail 1 96 @@ -171,6 +174,8 @@ RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderDisableVintageMode 1 0 RenderMaxTextureResolution 1 1024 +RenderReflectionProbeCount 1 16 +RenderReflectionProbeDrawDistance 1 24.0 // // Medium Graphics Settings (standard) @@ -192,7 +197,7 @@ RenderTerrainPBRDetail 1 0 RenderTerrainPBRPlanarSampleCount 1 1 RenderTransparentWater 1 0 RenderTreeLODFactor 1 0.5 -RenderVolumeLODFactor 1 1.25 +RenderVolumeLODFactor 1 2.5 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 WLSkyDetail 1 96 @@ -212,6 +217,8 @@ RenderExposure 1 1 RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 1 64 +RenderReflectionProbeDrawDistance 1 32.0 // // Medium High Graphics Settings @@ -233,7 +240,7 @@ RenderTerrainPBRDetail 1 0 RenderTerrainPBRPlanarSampleCount 1 1 RenderTransparentWater 1 0 RenderTreeLODFactor 1 0.5 -RenderVolumeLODFactor 1 1.375 +RenderVolumeLODFactor 1 3.5 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 WLSkyDetail 1 96 @@ -253,6 +260,7 @@ RenderExposure 1 1 RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 1 64 // // High Graphics Settings (SSAO + sun shadows) @@ -274,7 +282,7 @@ RenderTerrainPBRDetail 1 0 RenderTerrainPBRPlanarSampleCount 1 3 RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 -RenderVolumeLODFactor 1 1.5 +RenderVolumeLODFactor 1 3.8 RenderDeferredSSAO 1 1 RenderShadowDetail 1 1 WLSkyDetail 1 96 @@ -294,6 +302,7 @@ RenderExposure 1 1 RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 1 128 // // High Ultra Graphics Settings (SSAO + all shadows) @@ -315,7 +324,7 @@ RenderTerrainPBRDetail 1 0 RenderTerrainPBRPlanarSampleCount 1 3 RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 -RenderVolumeLODFactor 1 1.75 +RenderVolumeLODFactor 1 4.0 RenderDeferredSSAO 1 1 RenderShadowDetail 1 2 WLSkyDetail 1 96 @@ -335,6 +344,7 @@ RenderExposure 1 1 RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 1 256 // // Ultra graphics (REALLY PURTY!) @@ -355,7 +365,7 @@ RenderTerrainPBRDetail 1 0 RenderTerrainPBRPlanarSampleCount 1 3 RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 -RenderVolumeLODFactor 1 2.0 +RenderVolumeLODFactor 1 4.0 WindLightUseAtmosShaders 1 1 WLSkyDetail 1 128 RenderDeferredSSAO 1 1 @@ -376,6 +386,7 @@ RenderExposure 1 1 RenderTonemapType 1 1 RenderTonemapMix 1 0.7 RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 1 256 // // Class Unknown Hardware (unknown) @@ -398,7 +409,7 @@ RenderCompressTextures 1 0 // list safe RenderAnisotropic 1 0 -RenderAvatarMaxNonImpostors 1 16 +RenderAvatarMaxNonImpostors 1 3 RenderAvatarMaxComplexity 1 80000 RenderLocalLightCount 1 0 RenderMaxPartCount 1 1024 @@ -408,6 +419,7 @@ RenderShadowDetail 0 0 RenderMirrors 0 0 RenderDisableVintageMode 1 0 RenderMaxTextureResolution 1 2048 +RenderReflectionProbeCount 0 0 list TexUnit8orLess RenderDeferredSSAO 0 0 @@ -448,6 +460,7 @@ RenderReflectionProbeDetail 0 0 RenderReflectionsEnabled 0 0 RenderMirrors 0 0 RenderDisableVintageMode 1 0 +RenderReflectionProbeCount 0 0 list VaryingVectors16orLess RenderTerrainPBRPlanarSampleCount 1 1 diff --git a/indra/newview/fsfloatersearch.cpp b/indra/newview/fsfloatersearch.cpp deleted file mode 100644 index 7e0a873452..0000000000 --- a/indra/newview/fsfloatersearch.cpp +++ /dev/null @@ -1,3212 +0,0 @@ -/** - * @file fsfloatersearch.cpp - * @brief Firestorm Search Floater - * - * $LicenseInfo:firstyear=2012&license=fsviewerlgpl$ - * Phoenix Firestorm Viewer Source Code - * Copyright (C) 2012, Cinder Roxley <cinder.roxley@phoenixviewer.com> - * - * 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 - * - * The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA - * http://www.firestormviewer.org - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "fsfloatersearch.h" - -#include "lldispatcher.h" -#include "llagent.h" -#include "llavataractions.h" -#include "llavatarname.h" -#include "llavatarnamecache.h" -#include "llavatarpropertiesprocessor.h" -#include "llclassifiedflags.h" -#include "llclassifiedinfo.h" -#include "llcombobox.h" -#include "lldateutil.h" -#include "lleventflags.h" -#include "lleventnotifier.h" -#include "llfloaterreg.h" -#include "llfloaterworldmap.h" -#include "llgroupactions.h" -#include "llgroupmgr.h" -#include "llloadingindicator.h" -#include "lllogininstance.h" -#include "llnotificationsutil.h" -#include "llpanelprofile.h" -#include "llpanelprofileclassifieds.h" -#include "llparcel.h" -#include "llproductinforequest.h" -#include "llqueryflags.h" -#include "llregionhandle.h" -#include "llremoteparcelrequest.h" -#include "lltimer.h" -#include "lltrans.h" -#include "llviewercontrol.h" -#include "llviewergenericmessage.h" -#include "llviewernetwork.h" -#include "llviewerregion.h" -#include "llworldmapmessage.h" -#include "message.h" -#include <boost/tokenizer.hpp> -#include <boost/algorithm/string.hpp> -#include <string> - -#include <chrono> - -static const S32 MIN_SEARCH_STRING_SIZE = 2; -static const S32 RESULT_PAGE_SIZE = 100; - -// (observeur) Hack to avoid Find to be called several times (due to a bug in llsearchcombobox) -static std::chrono::time_point<std::chrono::system_clock> lastRequestTime; -static const S32 REQUEST_MIN_ELAPSED_TIME = 500; - -std::string filterShortWords(std::string query_string); -void fillSearchComboBox(LLSearchComboBox* search_combo); - -//////////////////////////////////////// -// Observer Classes // -//////////////////////////////////////// - -class FSSearchRemoteParcelInfoObserver : public LLRemoteParcelInfoObserver -{ -public: - FSSearchRemoteParcelInfoObserver(FSFloaterSearch* floater, bool for_events) : LLRemoteParcelInfoObserver(), - mParent(floater), - mForEvents(for_events) - {} - - ~FSSearchRemoteParcelInfoObserver() - { - // remove any in-flight observers - std::set<LLUUID>::iterator it; - for (it = mParcelIDs.begin(); it != mParcelIDs.end(); ++it) - { - const LLUUID &id = *it; - LLRemoteParcelInfoProcessor::getInstance()->removeObserver(id, this); - } - mParcelIDs.clear(); - } - - /*virtual*/ void processParcelInfo(const LLParcelData& parcel_data) - { - if (mParent) - { - if (mForEvents) - { - mParent->displayEventParcelImage(parcel_data); - } - else - { - mParent->displayParcelDetails(parcel_data); - } - } - mParcelIDs.erase(parcel_data.parcel_id); - LLRemoteParcelInfoProcessor::getInstance()->removeObserver(parcel_data.parcel_id, this); - } - - /*virtual*/ void setParcelID(const LLUUID& parcel_id) - { - if (!parcel_id.isNull()) - { - mParcelIDs.insert(parcel_id); - LLRemoteParcelInfoProcessor::getInstance()->addObserver(parcel_id, this); - LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(parcel_id); - } - } - - /*virtual*/ void setErrorStatus(S32 status, const std::string& reason) - { - LL_WARNS("Search") << "Can't complete remote parcel request. Http Status: " << status << ". Reason : " << reason << LL_ENDL; - } -private: - std::set<LLUUID> mParcelIDs; - FSFloaterSearch* mParent; - bool mForEvents; -}; - -///// Avatar Properties Observer ///// - -class FSSearchAvatarPropertiesObserver : public LLAvatarPropertiesObserver -{ -public: - FSSearchAvatarPropertiesObserver(FSFloaterSearch* floater) : LLAvatarPropertiesObserver(), - mParent(floater) - {} - - ~FSSearchAvatarPropertiesObserver() - { - // remove any in-flight observers - std::set<LLUUID>::iterator it; - for (it = mAvatarIDs.begin(); it != mAvatarIDs.end(); ++it) - { - const LLUUID &id = *it; - LLAvatarPropertiesProcessor::getInstance()->removeObserver(id, this); - } - mAvatarIDs.clear(); - } - - void processProperties(void* data, EAvatarProcessorType type) - { - if (!data) - return; - - if (APT_PROPERTIES == type) - { - LLAvatarData* avatar_data = static_cast<LLAvatarData*>(data); - if (avatar_data) - { - mParent->displayAvatarDetails(avatar_data); - LLAvatarPropertiesProcessor::getInstance()->removeObserver(avatar_data->avatar_id, this); - } - } - else if (APT_PROPERTIES_LEGACY == type) - { - LLAvatarData avatar_data(*static_cast<LLAvatarLegacyData*>(data)); - mParent->displayAvatarDetails(&avatar_data); - LLAvatarPropertiesProcessor::getInstance()->removeObserver(avatar_data.avatar_id, this); - } - if (APT_CLASSIFIED_INFO == type) - { - LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data); - if (c_info) - { - mParent->displayClassifiedDetails(c_info); - LLAvatarPropertiesProcessor::getInstance()->removeObserver(c_info->classified_id, this); - std::string url = gAgent.getRegionCapability("SearchStatRequest"); - if (!url.empty()) - { - LL_INFOS("Search") << "Classified stat request via capability" << LL_ENDL; - LLSD body; - body["classified_id"] = c_info->classified_id; - LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpPost(url, body, boost::bind(&LLPanelProfileClassified::handleSearchStatResponse, c_info->classified_id, _1)); - } - } - } - } -private: - std::set<LLUUID> mAvatarIDs; - FSFloaterSearch* mParent; -}; - -///// Group Info Observer ///// - -class FSSearchGroupInfoObserver : public LLGroupMgrObserver -{ -public: - FSSearchGroupInfoObserver(const LLUUID& group_id, FSFloaterSearch* parent) : - LLGroupMgrObserver(group_id), - mParent(parent) - { - LLGroupMgr* groupmgr = LLGroupMgr::getInstance(); - if (!group_id.isNull() && groupmgr) - { - groupmgr->addObserver(this); - mID = group_id; - groupmgr->sendGroupPropertiesRequest(group_id); - } - } - - ~FSSearchGroupInfoObserver() - { - LLGroupMgr::getInstance()->removeObserver(this); - } - - void changed(LLGroupChange gc) - { - if (gc == GC_PROPERTIES) - { - LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(mID); - mParent->displayGroupDetails(group_data); - LLGroupMgr::getInstance()->removeObserver(this); - } - } -private: - FSFloaterSearch* mParent; - LLUUID mID; -}; - -///// Silly Classified Clickthrough Class ///// -class FSDispatchClassifiedClickThrough : public LLDispatchHandler -{ -public: - virtual bool operator()( - const LLDispatcher* dispatcher, - const std::string& key, - const LLUUID& invoice, - const sparam_t& strings) - { - if (strings.size() != 4) return false; - LLUUID classified_id(strings[0]); - S32 teleport_clicks = atoi(strings[1].c_str()); - S32 map_clicks = atoi(strings[2].c_str()); - S32 profile_clicks = atoi(strings[3].c_str()); - - LLPanelProfileClassified::setClickThrough( - classified_id, teleport_clicks, map_clicks, profile_clicks, false); - - return true; - } -}; -static FSDispatchClassifiedClickThrough sClassifiedClickThrough; - -SearchQuery::SearchQuery() -: category("category", "") -, query("query") -{} - -//////////////////////////////////////// -// The floater itself // -//////////////////////////////////////// - -FSFloaterSearch::FSFloaterSearch(const Params& key) -: LLFloater(key) -{ - mRemoteParcelObserver = new FSSearchRemoteParcelInfoObserver(this, false); - mRemoteParcelEventLocationObserver = new FSSearchRemoteParcelInfoObserver(this, true); - mAvatarPropertiesObserver = new FSSearchAvatarPropertiesObserver(this); - mEventNotifierConnection = gEventNotifier.setNewEventCallback(boost::bind(&FSFloaterSearch::displayEventDetails, this, boost::placeholders::_1)); -} - -FSFloaterSearch::~FSFloaterSearch() -{ - mEventNotifierConnection.disconnect(); - delete mRemoteParcelObserver; - delete mRemoteParcelEventLocationObserver; - delete mAvatarPropertiesObserver; - gGenericDispatcher.addHandler("classifiedclickthrough", nullptr); -} - -// virtual -void FSFloaterSearch::onOpen(const LLSD& key) -{ - Params p(key); - mPanelWeb->loadURL(p.search); - if (key.has("query")) - { - mTabContainer->selectTabPanel(mPanelWeb); - } - else if (key.has("tab") && key["tab"].asString() == "groups") - { - mTabContainer->selectTabPanel(mPanelGroups); - } - - FSSearchPanelBase* current_panel = dynamic_cast<FSSearchPanelBase*>(mTabContainer->getCurrentPanel()); - if (current_panel) - { - current_panel->focusDefaultElement(); - } -} - -//virtual -void FSFloaterSearch::onClose(bool app_quitting) -{ - if (mTabContainer) - { - gSavedSettings.setS32("FSLastSearchTab", mTabContainer->getCurrentPanelIndex()); - } -} - -bool FSFloaterSearch::postBuild() -{ - childSetAction("people_profile_btn", boost::bind(&FSFloaterSearch::onBtnPeopleProfile, this)); - childSetAction("people_message_btn", boost::bind(&FSFloaterSearch::onBtnPeopleIM, this)); - childSetAction("people_friend_btn", boost::bind(&FSFloaterSearch::onBtnPeopleFriend, this)); - childSetAction("group_profile_btn", boost::bind(&FSFloaterSearch::onBtnGroupProfile, this)); - childSetAction("group_message_btn", boost::bind(&FSFloaterSearch::onBtnGroupChat, this)); - childSetAction("group_join_btn", boost::bind(&FSFloaterSearch::onBtnGroupJoin, this)); - childSetAction("event_reminder_btn", boost::bind(&FSFloaterSearch::onBtnEventReminder, this)); - childSetAction("teleport_btn", boost::bind(&FSFloaterSearch::onBtnTeleport, this)); - childSetAction("map_btn", boost::bind(&FSFloaterSearch::onBtnMap, this)); - resetVerbs(); - - mPanelPeople = findChild<FSPanelSearchPeople>("panel_ls_people"); - mPanelGroups = findChild<FSPanelSearchGroups>("panel_ls_groups"); - mPanelPlaces = findChild<FSPanelSearchPlaces>("panel_ls_places"); - mPanelEvents = findChild<FSPanelSearchEvents>("panel_ls_events"); - mPanelLand = findChild<FSPanelSearchLand>("panel_ls_land"); - mPanelClassifieds = findChild<FSPanelSearchClassifieds>("panel_ls_classifieds"); - mPanelWeb = findChild<FSPanelSearchWeb>("panel_ls_web"); - - mDetailsPanel = getChild<LLPanel>("panel_ls_details"); - mDetailTitle = getChild<LLTextEditor>("title"); - mDetailDesc = getChild<LLTextEditor>("desc"); - mDetailAux1 = getChild<LLTextEditor>("aux1"); - mDetailAux2 = getChild<LLTextEditor>("aux2"); - mDetailLocation = getChild<LLTextEditor>("location"); - mDetailSnapshot = getChild<LLTextureCtrl>("snapshot"); - mDetailSnapshotParcel = getChild<LLTextureCtrl>("snapshot_parcel"); - mDetailMaturity = getChild<LLIconCtrl>("maturity_icon"); - mTabContainer = getChild<LLTabContainer>("ls_tabs"); - - mTabContainer->setCommitCallback(boost::bind(&FSFloaterSearch::onTabChange, this)); - - flushDetails(); - - mDetailsPanel->setVisible(false); - - mHasSelection = false; - - if (!mTabContainer->selectTab(gSavedSettings.getS32("FSLastSearchTab"))) - { - mTabContainer->selectFirstTab(); - } - - return TRUE; -} - -void FSFloaterSearch::onTabChange() -{ - LL_INFOS() << "onTabChange()()" << LL_ENDL; - - flushDetails(); - - LLPanel* active_panel = mTabContainer->getCurrentPanel(); - - if (active_panel == mPanelWeb) - { - mDetailsPanel->setVisible(false); - mPanelWeb->resetFocusOnLoad(); - } - else if (active_panel == mPanelPeople) - { - mDetailsPanel->setVisible(mHasSelection); - } - - if (active_panel == mPanelPeople || active_panel == mPanelGroups) - { - mDetailSnapshotParcel->setVisible(FALSE); - mDetailSnapshot->setVisible(TRUE); - } - else if (active_panel == mPanelPlaces || active_panel == mPanelLand || - active_panel == mPanelEvents || active_panel == mPanelClassifieds) - { - mDetailSnapshot->setVisible(FALSE); - mDetailSnapshotParcel->setVisible(TRUE); - } -} - -//static -template <class T> -T* FSFloaterSearch::getSearchPanel(const std::string& panel_name) -{ - FSFloaterSearch* search_instance = LLFloaterReg::findTypedInstance<FSFloaterSearch>("search"); - if (search_instance && search_instance->mTabContainer) - { - return dynamic_cast<T*>(search_instance->mTabContainer->getPanelByName(panel_name)); - } - else - { - return nullptr; - } -} - -void FSFloaterSearch::onSelectedItem(const LLUUID& selected_item, ESearchCategory type) -{ - LL_INFOS() << "onSelectedItem()" << LL_ENDL; - - if (!selected_item.isNull()) - { - mSelectedID = selected_item; - resetVerbs(); - flushDetails(); - switch (type) - { - case SC_AVATAR: - { - LLAvatarPropertiesProcessor::getInstance()->addObserver(selected_item, mAvatarPropertiesObserver); - LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesRequest(selected_item); - } - break; - case SC_GROUP: - mGroupPropertiesRequest = new FSSearchGroupInfoObserver(selected_item, this); - break; - case SC_PLACE: - mRemoteParcelObserver->setParcelID(selected_item); - break; - case SC_CLASSIFIED: - LLAvatarPropertiesProcessor::getInstance()->addObserver(selected_item, mAvatarPropertiesObserver); - LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(selected_item); - gGenericDispatcher.addHandler("classifiedclickthrough", &sClassifiedClickThrough); - break; - } - setLoadingProgress(true); - } -} - -void FSFloaterSearch::onSelectedEvent(const S32 selected_event) -{ - LL_INFOS() << "onSelectedEvent()()" << LL_ENDL; - - resetVerbs(); - flushDetails(); - - gMessageSystem->newMessageFast(_PREHASH_EventInfoRequest); - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgentSessionID); - gMessageSystem->nextBlockFast(_PREHASH_EventData); - gMessageSystem->addU32Fast(_PREHASH_EventID, selected_event); - gAgent.sendReliableMessage(); -} - -void FSFloaterSearch::displayParcelDetails(const LLParcelData& parcel_data) -{ - S32 region_x; - S32 region_y; - S32 region_z; - region_x = ll_round(parcel_data.global_x) % REGION_WIDTH_UNITS; - region_y = ll_round(parcel_data.global_y) % REGION_WIDTH_UNITS; - region_z = ll_round(parcel_data.global_z); - // HACK: Flag 0x2 == adult region, - // Flag 0x1 == mature region, otherwise assume PG - if (parcel_data.flags & 0x2) - { - mDetailMaturity->setValue("Parcel_R_Dark"); - } - else if (parcel_data.flags & 0x1) - { - mDetailMaturity->setValue("Parcel_M_Dark"); - } - else - { - mDetailMaturity->setValue("Parcel_PG_Dark"); - } - - LLStringUtil::format_map_t map; - map["DWELL"] = llformat("%.0f", (F64)parcel_data.dwell); - map["AREA"] = llformat("%d m²", parcel_data.actual_area); - map["LOCATION"] = llformat("%s (%d, %d, %d)", parcel_data.sim_name.c_str(), region_x, region_y, region_z); - - mParcelGlobal = LLVector3d(parcel_data.global_x, parcel_data.global_y, parcel_data.global_z); - mDetailsPanel->setVisible(mTabContainer->getCurrentPanel()->getName() == "panel_ls_places" || mTabContainer->getCurrentPanel()->getName() == "panel_ls_land"); - mHasSelection = true; - mDetailMaturity->setVisible(true); - mDetailTitle->setValue(parcel_data.name); - mDetailDesc->setValue(parcel_data.desc); - mDetailAux1->setValue(getString("string.traffic", map)); - mDetailAux2->setValue(getString("string.area", map)); - mDetailLocation->setValue(getString("string.location", map)); - mDetailSnapshotParcel->setValue(parcel_data.snapshot_id); - childSetVisible("teleport_btn", true); - childSetVisible("map_btn", true); - setLoadingProgress(false); -} - -void FSFloaterSearch::displayAvatarDetails(LLAvatarData* avatar_data) -{ - if (avatar_data) - { - LLStringUtil::format_map_t map; - map["AGE"] = LLDateUtil::ageFromDate(avatar_data->born_on, LLDate::now()); - if (avatar_data->partner_id.notNull()) - { - map["PARTNER"] = LLSLURL("agent", avatar_data->partner_id, "inspect").getSLURLString(); - mDetailAux2->setValue(getString("string.partner", map)); - } - - mDetailsPanel->setVisible(mTabContainer->getCurrentPanel()->getName() == "panel_ls_people"); - mHasSelection = true; - mDetailTitle->setValue(LLTrans::getString("LoadingData")); - mDetailDesc->setValue(avatar_data->about_text); - mDetailSnapshot->setValue(avatar_data->image_id); - mDetailAux1->setValue(avatar_data->hide_age ? "" : getString("string.age", map)); - LLAvatarNameCache::get(avatar_data->avatar_id, boost::bind(&FSFloaterSearch::avatarNameUpdatedCallback,this, _1, _2)); - childSetVisible("people_profile_btn", true); - childSetVisible("people_message_btn", true); - childSetVisible("people_friend_btn", true); - getChildView("people_friend_btn")->setEnabled(!LLAvatarActions::isFriend(avatar_data->avatar_id)); - } -} - -void FSFloaterSearch::displayGroupDetails(LLGroupMgrGroupData*& group_data) -{ - if (group_data) - { - LLStringUtil::format_map_t map; - map["MEMBER_COUNT"] = llformat("%d",group_data->mMemberCount); - map["FOUNDER"] = LLSLURL("agent", group_data->mFounderID, "inspect").getSLURLString(); - - mDetailsPanel->setVisible(mTabContainer->getCurrentPanel()->getName() == "panel_ls_groups"); - mHasSelection = true; - mDetailTitle->setValue(LLTrans::getString("LoadingData")); - mDetailDesc->setValue(group_data->mCharter); - mDetailSnapshot->setValue(group_data->mInsigniaID); - mDetailAux1->setValue(getString("string.members", map)); - mDetailAux2->setValue(getString("string.founder", map)); - LLGroupData agent_gdatap; - bool is_member = gAgent.getGroupData(getSelectedID(),agent_gdatap) || gAgent.isGodlike(); - bool join_btn_enabled = !is_member && group_data->mOpenEnrollment; - childSetVisible("group_profile_btn", true); - childSetVisible("group_message_btn", true); - childSetVisible("group_join_btn", true); - getChildView("group_join_btn")->setEnabled(join_btn_enabled); - getChildView("group_message_btn")->setEnabled(is_member); - gCacheName->getGroup(getSelectedID(), boost::bind(&FSFloaterSearch::groupNameUpdatedCallback, this, _1, _2, _3)); - } -} - -void FSFloaterSearch::displayClassifiedDetails(LLAvatarClassifiedInfo*& c_info) -{ - if (c_info) - { - if (c_info->flags & CLASSIFIED_FLAG_MATURE) - { - mDetailMaturity->setValue("Parcel_M_Dark"); - } - else - { - mDetailMaturity->setValue("Parcel_PG_Dark"); - } - - LLStringUtil::format_map_t map; - map["LISTING_PRICE"] = llformat("L$%d", c_info->price_for_listing); - map["SLURL"] = LLSLURL("parcel", c_info->parcel_id, "about").getSLURLString(); - - mDetailsPanel->setVisible(mTabContainer->getCurrentPanel()->getName() == "panel_ls_classifieds"); - mHasSelection = true; - mDetailMaturity->setVisible(true); - mParcelGlobal = c_info->pos_global; - mDetailTitle->setValue(c_info->name); - mDetailDesc->setValue(c_info->description); - mDetailSnapshotParcel->setValue(c_info->snapshot_id); - mDetailAux1->setValue(getString("string.listing_price", map)); - mDetailLocation->setValue(getString("string.slurl", map)); - childSetVisible("teleport_btn", true); - childSetVisible("map_btn", true); - setLoadingProgress(false); - } -} - -bool FSFloaterSearch::displayEventDetails(LLEventStruct event) -{ - if (event.flags == EVENT_FLAG_ADULT) - { - mDetailMaturity->setValue("Parcel_R_Dark"); - } - else if (event.flags == EVENT_FLAG_MATURE) - { - mDetailMaturity->setValue("Parcel_M_Dark"); - } - else - { - mDetailMaturity->setValue("Parcel_PG_Dark"); - } - - S32 region_x; - S32 region_y; - S32 region_z; - region_x = (S64)ll_round(event.globalPos.mdV[VX]) % REGION_WIDTH_UNITS; - region_y = (S64)ll_round(event.globalPos.mdV[VY]) % REGION_WIDTH_UNITS; - region_z = (S32)ll_round(event.globalPos.mdV[VZ]); - LLStringUtil::format_map_t map; - map["DURATION"] = llformat("%d:%.2d", event.duration / 60, event.duration % 60); - map["LOCATION"] = llformat("%s (%d, %d, %d)", event.simName.c_str(), region_x, region_y, region_z); - if (event.cover > 0) - { - map["COVERCHARGE"] = llformat("L$%d", event.cover); - mDetailAux2->setValue(getString("string.covercharge", map)); - } - - mParcelGlobal = event.globalPos; - mEventID = event.eventId; - mDetailsPanel->setVisible(mTabContainer->getCurrentPanel()->getName() == "panel_ls_events"); - mHasSelection = true; - mDetailMaturity->setVisible(true); - mDetailTitle->setValue(event.eventName); - mDetailDesc->setValue(event.desc); - mDetailAux1->setValue(getString("string.duration", map)); - mDetailLocation->setValue(getString("string.location", map)); - mDetailSnapshotParcel->setValue(LLUUID::null); - childSetVisible("teleport_btn", true); - childSetVisible("map_btn", true); - childSetVisible("event_reminder_btn", true); - - LLWorldMapMessage::getInstance()->sendNamedRegionRequest(event.simName, boost::bind(&FSFloaterSearch::regionHandleCallback, this, _1, event.globalPos), "", false); - return true; -} - -void FSFloaterSearch::regionHandleCallback(U64 region_handle, LLVector3d pos_global) -{ - std::string url = gAgent.getRegionCapability("RemoteParcelRequest"); - if (!url.empty()) - { - auto region_origin = from_region_handle(region_handle); - LLVector3 pos_region(LLVector3(pos_global - region_origin)); - - LLRemoteParcelInfoProcessor::getInstance()->requestRegionParcelInfo(url, - LLUUID::null, pos_region, pos_global, mRemoteParcelEventLocationObserver->getObserverHandle()); - } - else - { - setLoadingProgress(false); - } -} - -void FSFloaterSearch::displayEventParcelImage(const LLParcelData& parcel_data) -{ - mDetailSnapshotParcel->setValue(parcel_data.snapshot_id); - setLoadingProgress(false); -} - -void FSFloaterSearch::avatarNameUpdatedCallback(const LLUUID& id, const LLAvatarName& av_name) -{ - if (id == getSelectedID()) - { - mDetailTitle->setValue(av_name.getCompleteName()); - setLoadingProgress(false); - } - // Otherwise possibly a request for an older selection, ignore it. -} - -void FSFloaterSearch::groupNameUpdatedCallback(const LLUUID& id, const std::string& name, bool is_group) -{ - if (id == getSelectedID()) - { - mDetailTitle->setValue( LLSD(name) ); - setLoadingProgress(false); - } - // Otherwise possibly a request for an older selection, ignore it. -} - -void FSFloaterSearch::setLoadingProgress(bool started) -{ - LLLoadingIndicator* indicator = getChild<LLLoadingIndicator>("loading"); - - indicator->setVisible(started); - - if (started) - { - indicator->start(); - } - else - { - indicator->stop(); - } -} - -void FSFloaterSearch::resetVerbs() -{ - childSetVisible("people_profile_btn", false); - childSetVisible("people_message_btn", false); - childSetVisible("people_friend_btn", false); - childSetVisible("group_profile_btn", false); - childSetVisible("group_message_btn", false); - childSetVisible("group_join_btn", false); - childSetVisible("event_reminder_btn", false); - childSetVisible("teleport_btn", false); - childSetVisible("map_btn", false); -} - -void FSFloaterSearch::flushDetails() -{ - LL_INFOS() << "flushDetails()" << LL_ENDL; - mDetailTitle->setValue(""); - mDetailDesc->setValue(""); - mDetailAux1->setValue(""); - mDetailAux2->setValue(""); - mDetailLocation->setValue(""); - mDetailSnapshot->setValue(LLSD()); - mDetailMaturity->setVisible(false); - mParcelGlobal.setZero(); -} - -void FSFloaterSearch::onBtnPeopleProfile() -{ - LLAvatarActions::showProfile(getSelectedID()); -} - -void FSFloaterSearch::onBtnPeopleIM() -{ - LLAvatarActions::startIM(getSelectedID()); -} - -void FSFloaterSearch::onBtnPeopleFriend() -{ - LLAvatarActions::requestFriendshipDialog(getSelectedID()); -} - -void FSFloaterSearch::onBtnGroupProfile() -{ - LLGroupActions::show(getSelectedID()); -} - -void FSFloaterSearch::onBtnGroupChat() -{ - LLGroupActions::startIM(getSelectedID()); -} - -void FSFloaterSearch::onBtnGroupJoin() -{ - LLGroupActions::join(getSelectedID()); -} - -void FSFloaterSearch::onBtnTeleport() -{ - if (!mParcelGlobal.isExactlyZero()) - { - gAgent.teleportViaLocationLookAt(mParcelGlobal); - LLFloaterWorldMap::getInstance()->trackLocation(mParcelGlobal); - /// <FS:CR> What should we do when when we teleport? The default (1) is to close the floater, - /// the user may elect to minimize the floater (2), or to do nothing (any other setting) - static LLCachedControl<U32> teleport_action(gSavedSettings, "FSLegacySearchActionOnTeleport"); - if (teleport_action == 1) - { - closeFloater(); - } - else if (teleport_action == 2) - { - setMinimized(TRUE); - } - } -} - -void FSFloaterSearch::onBtnMap() -{ - if (!mParcelGlobal.isExactlyZero()) - { - LLFloaterWorldMap::getInstance()->trackLocation(mParcelGlobal); - LLFloaterReg::showInstance("world_map", "center"); - } -} - -void FSFloaterSearch::onBtnEventReminder() -{ - gEventNotifier.add(mEventID); -} - -//////////////////////////////////////// -// People Search Panel // -//////////////////////////////////////// - -static LLPanelInjector<FSPanelSearchPeople> t_panel_fs_search_people("panel_ls_people"); - -FSPanelSearchPeople::FSPanelSearchPeople() : FSSearchPanelBase() -, mQueryID(nullptr) -, mStartSearch(0) -, mResultsReceived(0) -, mResultsContent() -, mAvatarNameCallbackConnection() -{ -} - -FSPanelSearchPeople::~FSPanelSearchPeople() -{ - if (mAvatarNameCallbackConnection.connected()) - { - mAvatarNameCallbackConnection.disconnect(); - } -} - -bool FSPanelSearchPeople::postBuild() -{ - mSearchComboBox = findChild<LLSearchComboBox>("people_edit"); - mSearchResults = findChild<LLScrollListCtrl>("search_results_people"); - if (mSearchComboBox) - { - mSearchComboBox->setCommitCallback(boost::bind(&FSPanelSearchPeople::onBtnFind, this)); - fillSearchComboBox(mSearchComboBox); - } - if (mSearchResults) - { - mSearchResults->setCommitCallback(boost::bind(&FSPanelSearchPeople::onSelectItem, this)); - mSearchResults->setEnabled(FALSE); - mSearchResults->setCommentText(LLTrans::getString("no_results")); - mSearchResults->setContextMenu(LLScrollListCtrl::MENU_AVATAR); - } - - childSetAction("people_next", boost::bind(&FSPanelSearchPeople::onBtnNext, this)); - childSetAction("people_back", boost::bind(&FSPanelSearchPeople::onBtnBack, this)); - getChildView("people_next")->setEnabled(FALSE); - getChildView("people_back")->setEnabled(FALSE); - - return TRUE; -} - -void FSPanelSearchPeople::focusDefaultElement() -{ - mSearchComboBox->focusTextEntry(); -} - -void FSPanelSearchPeople::find() -{ - std::string text = mSearchComboBox->getSimple(); - boost::trim(text); - - if (text.size() <= MIN_SEARCH_STRING_SIZE) - { - mSearchResults->setCommentText(LLTrans::getString("search_short")); - return; - } - - if (LLUUID::validate(text)) - { - LLUUID id(text); - - mSearchResults->deleteAllItems(); - mSearchResults->setCommentText(LLTrans::getString("searching")); - mResultsReceived = 0; - mNumResultsReturned = 0; - - if (mAvatarNameCallbackConnection.connected()) - { - mAvatarNameCallbackConnection.disconnect(); - } - mAvatarNameCallbackConnection = LLAvatarNameCache::get(id, boost::bind(&FSPanelSearchPeople::onAvatarNameCallback, this, _1, _2)); - - return; - } - - LLStringUtil::replaceChar(text, '.', ' '); - - mResultsReceived = 0; - if (mQueryID.notNull()) - { - mQueryID.setNull(); - } - mQueryID.generate(); - - if (mStartSearch < 0) - { - mStartSearch = 0; - } - - gMessageSystem->newMessage("DirFindQuery"); - gMessageSystem->nextBlock("AgentData"); - gMessageSystem->addUUID("AgentID", gAgentID); - gMessageSystem->addUUID("SessionID", gAgentSessionID); - gMessageSystem->nextBlock("QueryData"); - gMessageSystem->addUUID("QueryID", getQueryID()); - gMessageSystem->addString("QueryText", text); - gMessageSystem->addU32("QueryFlags", DFQ_PEOPLE); - gMessageSystem->addS32("QueryStart", mStartSearch); - gAgent.sendReliableMessage(); - LL_INFOS("Search") << "Firing off search request: " << getQueryID() << LL_ENDL; - - mSearchResults->deleteAllItems(); - mSearchResults->setCommentText(LLTrans::getString("searching")); - mNumResultsReturned = 0; -} - -void FSPanelSearchPeople::onBtnFind() -{ - std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now(); - auto elapsed = now - lastRequestTime; - U64 elapsedMS = std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count(); - if(elapsedMS < REQUEST_MIN_ELAPSED_TIME) return; - lastRequestTime = now; - - std::string text = mSearchComboBox->getSimple(); - - if (!text.empty()) - { - LLSearchHistory::getInstance()->addEntry(text); - } - - resetSearch(); - - find(); -} - -void FSPanelSearchPeople::onBtnNext() -{ - mStartSearch += RESULT_PAGE_SIZE; - getChildView("people_back")->setEnabled(TRUE); - - find(); -} - -void FSPanelSearchPeople::onBtnBack() -{ - mStartSearch -= RESULT_PAGE_SIZE; - getChildView("people_back")->setEnabled(mStartSearch > 0); - - find(); -} - -void FSPanelSearchPeople::resetSearch() -{ - mStartSearch = 0; - getChildView("people_back")->setEnabled(FALSE); - getChildView("people_next")->setEnabled(FALSE); -} - -S32 FSPanelSearchPeople::showNextButton(S32 rows) -{ - bool show_next_button = (mResultsReceived > RESULT_PAGE_SIZE); - getChildView("people_next")->setEnabled(show_next_button); - if (show_next_button) - { - rows -= (mResultsReceived - RESULT_PAGE_SIZE); - } - return rows; -} - -void FSPanelSearchPeople::onSelectItem() -{ - if (!mSearchResults) - { - return; - } - FSFloaterSearch* search_instance = LLFloaterReg::findTypedInstance<FSFloaterSearch>("search"); - if (search_instance) - { - search_instance->FSFloaterSearch::onSelectedItem(mSearchResults->getSelectedValue(), FSFloaterSearch::SC_AVATAR); - } -} - -// static -void FSPanelSearchPeople::processSearchReply(LLMessageSystem* msg, void**) -{ - LLUUID query_id; - std::string first_name; - std::string last_name; - LLUUID agent_id; - - msg->getUUIDFast(_PREHASH_QueryData, _PREHASH_QueryID, query_id); - msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); - - // This result is not for us. - if (agent_id != gAgentID) - { - return; - } - LL_INFOS("Search") << "received search results - QueryID: " << query_id << " AgentID: " << agent_id << LL_ENDL; - - FSPanelSearchPeople* self = FSFloaterSearch::getSearchPanel<FSPanelSearchPeople>("panel_ls_people"); - - // floater is closed or these are not results from our last request - if (!self || query_id != self->getQueryID()) - { - return; - } - - LLScrollListCtrl* search_results = self->getChild<LLScrollListCtrl>("search_results_people"); - - if (self->mNumResultsReturned++ == 0) - { - search_results->deleteAllItems(); - } - - // Check for status messages - if (msg->getNumberOfBlocks("StatusData")) - { - U32 status; - msg->getU32("StatusData", "Status", status); - if (status & STATUS_SEARCH_PLACES_FOUNDNONE) - { - LLStringUtil::format_map_t map; - map["[TEXT]"] = self->getChild<LLUICtrl>("people_edit")->getValue().asString(); - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("not_found", map)); - return; - } - else if (status & STATUS_SEARCH_PLACES_SHORTSTRING) - { - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("search_short")); - return; - } - else if (status & STATUS_SEARCH_PLACES_BANNEDWORD) - { - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("search_banned")); - return; - } - else if (status & STATUS_SEARCH_PLACES_SEARCHDISABLED) - { - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("search_disabled")); - return; - } - } - - bool found_one = false; - S32 num_new_rows = msg->getNumberOfBlocksFast(_PREHASH_QueryReplies); - if (num_new_rows == 0 && self->mResultsReceived == 0) - { - LLStringUtil::format_map_t map; - map["[TEXT]"] = self->getChild<LLUICtrl>("people_edit")->getValue().asString(); - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("not_found", map)); - } - - self->mResultsReceived += num_new_rows; - num_new_rows = self->showNextButton(num_new_rows); - - for (S32 i = 0; i < num_new_rows; i++) - { - msg->getStringFast( _PREHASH_QueryReplies, _PREHASH_FirstName, first_name, i); - msg->getStringFast( _PREHASH_QueryReplies, _PREHASH_LastName, last_name, i); - msg->getUUIDFast( _PREHASH_QueryReplies, _PREHASH_AgentID, agent_id, i); - //msg->getU8Fast( _PREHASH_QueryReplies, _PREHASH_Online, online, i); - - if (agent_id.isNull()) - { - LL_INFOS("Search") << "Null result returned for QueryID: " << query_id << LL_ENDL; - LLStringUtil::format_map_t map; - map["[TEXT]"] = self->getChild<LLUICtrl>("people_edit")->getValue().asString(); - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("not_found", map)); - } - else - { - LL_DEBUGS("Search") << "Got: " << first_name << " " << last_name << " AgentID: " << agent_id << LL_ENDL; - search_results->setEnabled(TRUE); - found_one = true; - - std::string avatar_name; - avatar_name = LLCacheName::buildFullName(first_name, last_name); - - LLSD content; - LLSD element; - - element["id"] = agent_id; - - element["columns"][0]["column"] = "icon"; - element["columns"][0]["type"] = "icon"; - element["columns"][0]["value"] = "icon_avatar_offline.tga"; - - element["columns"][1]["column"] = "username"; - element["columns"][1]["value"] = avatar_name; - - content["name"] = avatar_name; - - search_results->addElement(element, ADD_BOTTOM); - self->mResultsContent[agent_id.asString()] = content; - } - } - if (found_one) - { - search_results->selectFirstItem(); - search_results->setFocus(TRUE); - self->onSelectItem(); - } -} - -void FSPanelSearchPeople::onAvatarNameCallback(const LLUUID& id, const LLAvatarName& av_name) -{ - if (mAvatarNameCallbackConnection.connected()) - { - mAvatarNameCallbackConnection.disconnect(); - } - - LLScrollListCtrl* search_results = getChild<LLScrollListCtrl>("search_results_people"); - - if (av_name.getAccountName() != "(?\?\?).(?\?\?)") - { - LLSD content; - LLSD data; - data["id"] = id; - - data["columns"][0]["column"] = "icon"; - data["columns"][0]["type"] = "icon"; - data["columns"][0]["value"] = "icon_avatar_offline.tga"; - - data["columns"][1]["name"] = "username"; - data["columns"][1]["value"] = av_name.getUserName(); - - content["name"] = av_name.getUserName(); - - search_results->addElement(data); - - mResultsContent[id.asString()] = content; - mResultsReceived = 1; - mNumResultsReturned = 1; - - search_results->setEnabled(TRUE); - search_results->selectFirstItem(); - search_results->setFocus(TRUE); - onSelectItem(); - } - else - { - LLStringUtil::format_map_t map; - map["[TEXT]"] = getChild<LLUICtrl>("people_edit")->getValue().asString(); - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("not_found", map)); - } -} - -//////////////////////////////////////// -// Groups Search Panel // -//////////////////////////////////////// - -static LLPanelInjector<FSPanelSearchGroups> t_panel_fs_search_groups("panel_ls_groups"); - -FSPanelSearchGroups::FSPanelSearchGroups() : FSSearchPanelBase() -, mQueryID(nullptr) -, mStartSearch(0) -, mResultsReceived(0) -, mResultsContent() -{ -} - -FSPanelSearchGroups::~FSPanelSearchGroups() -{ -} - -bool FSPanelSearchGroups::postBuild() -{ - mSearchComboBox = findChild<LLSearchComboBox>("groups_edit"); - mSearchResults = findChild<LLScrollListCtrl>("search_results_groups"); - if (mSearchComboBox) - { - mSearchComboBox->setCommitCallback(boost::bind(&FSPanelSearchGroups::onBtnFind, this)); - fillSearchComboBox(mSearchComboBox); - } - if (mSearchResults) - { - mSearchResults->setCommitCallback(boost::bind(&FSPanelSearchGroups::onSelectItem, this)); - mSearchResults->setEnabled(FALSE); - mSearchResults->setCommentText(LLTrans::getString("no_results")); - } - - childSetAction("groups_next", boost::bind(&FSPanelSearchGroups::onBtnNext, this)); - childSetAction("groups_back", boost::bind(&FSPanelSearchGroups::onBtnBack, this)); - getChildView("groups_next")->setEnabled(FALSE); - getChildView("groups_back")->setEnabled(FALSE); - - lastRequestTime = std::chrono::system_clock::now(); - - return TRUE; -} - -void FSPanelSearchGroups::focusDefaultElement() -{ - mSearchComboBox->focusTextEntry(); -} - -void FSPanelSearchGroups::find() -{ - std::string text = filterShortWords(mSearchComboBox->getSimple()); - if (text.size() == 0) - { - mSearchResults->setCommentText(LLTrans::getString("search_short")); - return; - } - - static LLUICachedControl<bool> inc_pg("ShowPGSims", 1); - static LLUICachedControl<bool> inc_mature("ShowMatureSims", 0); - static LLUICachedControl<bool> inc_adult("ShowAdultSims", 0); - if (!(inc_pg || inc_mature || inc_adult)) - { - LLNotificationsUtil::add("NoContentToSearch"); - return; - } - U32 scope = 0; - if (gAgent.wantsPGOnly()) - { - scope |= DFQ_PG_SIMS_ONLY; - } - bool adult_enabled = gAgent.canAccessAdult(); - bool mature_enabled = gAgent.canAccessMature(); - if (inc_pg) - { - scope |= DFQ_INC_PG; - } - if (inc_mature && mature_enabled) - { - scope |= DFQ_INC_MATURE; - } - if (inc_adult && adult_enabled) - { - scope |= DFQ_INC_ADULT; - } - scope |= DFQ_GROUPS; - - mResultsReceived = 0; - if (mQueryID.notNull()) - { - mQueryID.setNull(); - } - mQueryID.generate(); - - if (mStartSearch < 0) - { - mStartSearch = 0; - } - - gMessageSystem->newMessage("DirFindQuery"); - gMessageSystem->nextBlock("AgentData"); - gMessageSystem->addUUID("AgentID", gAgentID); - gMessageSystem->addUUID("SessionID", gAgentSessionID); - gMessageSystem->nextBlock("QueryData"); - gMessageSystem->addUUID("QueryID", getQueryID()); - gMessageSystem->addString("QueryText", text); - gMessageSystem->addU32("QueryFlags", scope); - gMessageSystem->addS32("QueryStart", mStartSearch); - gAgent.sendReliableMessage(); - LL_DEBUGS("Search") << "Firing off search request: " << getQueryID() << LL_ENDL; - - mSearchResults->deleteAllItems(); - mSearchResults->setCommentText(LLTrans::getString("searching")); - mNumResultsReturned = 0; -} - -void FSPanelSearchGroups::onBtnFind() -{ - std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now(); - auto elapsed = now - lastRequestTime; - U64 elapsedMS = std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count(); - if(elapsedMS < REQUEST_MIN_ELAPSED_TIME) return; - lastRequestTime = now; - - std::string text = mSearchComboBox->getSimple(); - if (!text.empty()) - { - LLSearchHistory::getInstance()->addEntry(text); - } - - resetSearch(); - - find(); -} - -void FSPanelSearchGroups::onBtnNext() -{ - mStartSearch += RESULT_PAGE_SIZE; - getChildView("groups_back")->setEnabled(TRUE); - - find(); -} - -void FSPanelSearchGroups::onBtnBack() -{ - mStartSearch -= RESULT_PAGE_SIZE; - getChildView("groups_back")->setEnabled(mStartSearch > 0); - - find(); -} - -void FSPanelSearchGroups::resetSearch() -{ - mStartSearch = 0; - getChildView("groups_back")->setEnabled(FALSE); - getChildView("groups_next")->setEnabled(FALSE); -} - -S32 FSPanelSearchGroups::showNextButton(S32 rows) -{ - bool show_next_button = (mResultsReceived > RESULT_PAGE_SIZE); - getChildView("groups_next")->setEnabled(show_next_button); - if (show_next_button) - { - rows -= (mResultsReceived - RESULT_PAGE_SIZE); - } - return rows; -} - -void FSPanelSearchGroups::onSelectItem() -{ - if (!mSearchResults) - { - return; - } - FSFloaterSearch* search_instance = LLFloaterReg::findTypedInstance<FSFloaterSearch>("search"); - if (search_instance) - { - search_instance->FSFloaterSearch::onSelectedItem(mSearchResults->getSelectedValue(), FSFloaterSearch::SC_GROUP); - } -} - -// static -void FSPanelSearchGroups::processSearchReply(LLMessageSystem* msg, void**) -{ - LLUUID query_id; - LLUUID group_id; - LLUUID agent_id; - std::string group_name; - S32 members; - F32 search_order; - - msg->getUUIDFast( _PREHASH_QueryData, _PREHASH_QueryID, query_id); - msg->getUUIDFast( _PREHASH_AgentData, _PREHASH_AgentID, agent_id); - - // Not for us - if (agent_id != gAgentID) - { - return; - } - LL_DEBUGS("Search") << "received directory request - QueryID: " << query_id << " AgentID: " << agent_id << LL_ENDL; - - FSPanelSearchGroups* self = FSFloaterSearch::getSearchPanel<FSPanelSearchGroups>("panel_ls_groups"); - - // floater is closed or these are not results from our last request - if (!self || query_id != self->mQueryID) - { - return; - } - - LLScrollListCtrl* search_results = self->getChild<LLScrollListCtrl>("search_results_groups"); - - // Clear "Searching" label on first results - if (self->mNumResultsReturned++ == 0) - { - search_results->deleteAllItems(); - } - - // Check for status messages - if (msg->getNumberOfBlocks("StatusData")) - { - U32 status; - msg->getU32("StatusData", "Status", status); - if (status & STATUS_SEARCH_PLACES_FOUNDNONE) - { - LLStringUtil::format_map_t map; - map["[TEXT]"] = self->getChild<LLUICtrl>("groups_edit")->getValue().asString(); - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("not_found", map)); - return; - } - else if(status & STATUS_SEARCH_PLACES_SHORTSTRING) - { - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("search_short")); - return; - } - else if (status & STATUS_SEARCH_PLACES_BANNEDWORD) - { - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("search_banned")); - return; - } - else if (status & STATUS_SEARCH_PLACES_SEARCHDISABLED) - { - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("search_disabled")); - return; - } - } - - bool found_one = false; - S32 num_new_rows = msg->getNumberOfBlocksFast(_PREHASH_QueryReplies); - if (num_new_rows == 0 && self->mResultsReceived == 0) - { - LLStringUtil::format_map_t map; - map["[TEXT]"] = self->getChild<LLUICtrl>("groups_edit")->getValue().asString(); - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("not_found", map)); - } - - self->mResultsReceived += num_new_rows; - num_new_rows = self->showNextButton(num_new_rows); - - for (S32 i = 0; i < num_new_rows; i++) - { - msg->getUUIDFast( _PREHASH_QueryReplies, _PREHASH_GroupID, group_id, i); - msg->getStringFast( _PREHASH_QueryReplies, _PREHASH_GroupName, group_name, i); - msg->getS32Fast( _PREHASH_QueryReplies, _PREHASH_Members, members, i); - msg->getF32Fast( _PREHASH_QueryReplies, _PREHASH_SearchOrder, search_order,i); - if (group_id.isNull()) - { - LL_DEBUGS("Search") << "No results returned for QueryID: " << query_id << LL_ENDL; - LLStringUtil::format_map_t map; - map["[TEXT]"] = self->getChild<LLUICtrl>("groups_edit")->getValue().asString(); - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("not_found", map)); - } - else - { - LL_DEBUGS("Search") << "Got: " << group_name << " GroupID: " << group_id << LL_ENDL; - search_results->setEnabled(TRUE); - found_one = true; - - LLSD content; - LLSD element; - - element["id"] = group_id; - - element["columns"][0]["column"] = "icon"; - element["columns"][0]["type"] = "icon"; - element["columns"][0]["value"] = "Icon_Group"; - - element["columns"][1]["column"] = "group_name"; - element["columns"][1]["value"] = group_name; - - element["columns"][2]["column"] = "members"; - element["columns"][2]["value"] = members; - - element["columns"][3]["column"] = "score"; - element["columns"][3]["value"] = search_order; - - content["name"] = group_name; - - search_results->addElement(element, ADD_BOTTOM); - self->mResultsContent[group_id.asString()] = content; - } - } - if (found_one) - { - search_results->selectFirstItem(); - search_results->setFocus(TRUE); - self->onSelectItem(); - } -} - -//////////////////////////////////////// -// Places Search Panel // -//////////////////////////////////////// - -static LLPanelInjector<FSPanelSearchPlaces> t_panel_fs_search_places("panel_ls_places"); - -FSPanelSearchPlaces::FSPanelSearchPlaces() : FSSearchPanelBase() -, mQueryID(nullptr) -, mStartSearch(0) -, mResultsReceived(0) -, mResultsContent() -{ - mCommitCallbackRegistrar.add("CommitSearch", boost::bind(&FSPanelSearchPlaces::find, this)); -} - -FSPanelSearchPlaces::~FSPanelSearchPlaces() -{ -} - -bool FSPanelSearchPlaces::postBuild() -{ - mSearchComboBox = findChild<LLSearchComboBox>("places_edit"); - mSearchResults = findChild<LLScrollListCtrl>("search_results_places"); - mPlacesCategory = findChild<LLComboBox>("places_category"); - if (mSearchComboBox) - { - mSearchComboBox->setCommitCallback(boost::bind(&FSPanelSearchPlaces::onBtnFind, this)); - fillSearchComboBox(mSearchComboBox); - } - if (mSearchResults) - { - mSearchResults->setCommitCallback(boost::bind(&FSPanelSearchPlaces::onSelectItem, this)); - mSearchResults->setEnabled(FALSE); - mSearchResults->setCommentText(LLTrans::getString("no_results")); - } - if (mPlacesCategory) - { - mPlacesCategory->add(LLTrans::getString("all_categories"), LLSD("any")); - mPlacesCategory->addSeparator(); - for (int category = LLParcel::C_LINDEN; category < LLParcel::C_COUNT; category++) - { - LLParcel::ECategory eCategory = (LLParcel::ECategory)category; - mPlacesCategory->add(LLTrans::getString(LLParcel::getCategoryUIString(eCategory)), LLParcel::getCategoryString(eCategory)); - } - } - childSetAction("places_next", boost::bind(&FSPanelSearchPlaces::onBtnNext, this)); - childSetAction("places_back", boost::bind(&FSPanelSearchPlaces::onBtnBack, this)); - getChildView("places_next")->setEnabled(FALSE); - getChildView("places_back")->setEnabled(FALSE); - - return TRUE; -} - -void FSPanelSearchPlaces::focusDefaultElement() -{ - mSearchComboBox->focusTextEntry(); -} - -void FSPanelSearchPlaces::find() -{ - std::string text = filterShortWords(mSearchComboBox->getSimple()); - if (text.empty()) - { - mSearchResults->setCommentText(LLTrans::getString("search_short")); - return; - } - - static LLUICachedControl<bool> inc_pg("ShowPGSims", 1); - static LLUICachedControl<bool> inc_mature("ShowMatureSims", 0); - static LLUICachedControl<bool> inc_adult("ShowAdultSims", 0); - if (!(inc_pg || inc_mature || inc_adult)) - { - LLNotificationsUtil::add("NoContentToSearch"); - return; - } - S8 category; - std::string category_string = mPlacesCategory->getSelectedValue(); - if (category_string == "any") - { - category = LLParcel::C_ANY; - } - else - { - category = LLParcel::getCategoryFromString(category_string); - } - U32 scope = 0; - if (gAgent.wantsPGOnly()) - { - scope |= DFQ_PG_SIMS_ONLY; - } - bool adult_enabled = gAgent.canAccessAdult(); - bool mature_enabled = gAgent.canAccessMature(); - if (inc_pg) - { - scope |= DFQ_INC_PG; - } - if (inc_mature && mature_enabled) - { - scope |= DFQ_INC_MATURE; - } - if (inc_adult && adult_enabled) - { - scope |= DFQ_INC_ADULT; - } - scope |= DFQ_DWELL_SORT; - - mResultsReceived = 0; - if (mQueryID.notNull()) - { - mQueryID.setNull(); - } - mQueryID.generate(); - - if (mStartSearch < 0) - { - mStartSearch = 0; - } - - gMessageSystem->newMessage("DirPlacesQuery"); - gMessageSystem->nextBlock("AgentData"); - gMessageSystem->addUUID("AgentID", gAgentID); - gMessageSystem->addUUID("SessionID", gAgentSessionID); - gMessageSystem->nextBlock("QueryData"); - gMessageSystem->addUUID("QueryID", getQueryID()); - gMessageSystem->addString("QueryText", text); - gMessageSystem->addU32("QueryFlags", scope); - gMessageSystem->addS8("Category", category); - // TODO: Search filter by region name. - gMessageSystem->addString("SimName", ""); - gMessageSystem->addS32("QueryStart", mStartSearch); - gAgent.sendReliableMessage(); - LL_INFOS("Search") << "Firing off places search request: " << getQueryID() << LL_ENDL; - - mSearchResults->deleteAllItems(); - mSearchResults->setCommentText(LLTrans::getString("searching")); - mNumResultsReturned = 0; -} - -void FSPanelSearchPlaces::onBtnFind() -{ - std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now(); - auto elapsed = now - lastRequestTime; - U64 elapsedMS = std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count(); - if(elapsedMS < REQUEST_MIN_ELAPSED_TIME) return; - lastRequestTime = now; - - std::string text = mSearchComboBox->getSimple(); - if (!text.empty()) - { - LLSearchHistory::getInstance()->addEntry(text); - } - - resetSearch(); - - find(); -} - -void FSPanelSearchPlaces::onBtnNext() -{ - mStartSearch += RESULT_PAGE_SIZE; - getChildView("places_back")->setEnabled(TRUE); - - find(); -} - -void FSPanelSearchPlaces::onBtnBack() -{ - mStartSearch -= RESULT_PAGE_SIZE; - getChildView("places_back")->setEnabled(mStartSearch > 0); - - find(); -} - -void FSPanelSearchPlaces::resetSearch() -{ - mStartSearch = 0; - getChildView("places_back")->setEnabled(FALSE); - getChildView("places_next")->setEnabled(FALSE); -} - -S32 FSPanelSearchPlaces::showNextButton(S32 rows) -{ - bool show_next_button = (mResultsReceived > RESULT_PAGE_SIZE); - getChildView("places_next")->setEnabled(show_next_button); - if (show_next_button) - { - rows -= (mResultsReceived - RESULT_PAGE_SIZE); - } - return rows; -} - -void FSPanelSearchPlaces::onSelectItem() -{ - if (!mSearchResults) - { - return; - } - FSFloaterSearch* search_instance = LLFloaterReg::findTypedInstance<FSFloaterSearch>("search"); - if (search_instance) - { - search_instance->FSFloaterSearch::onSelectedItem(mSearchResults->getSelectedValue(), FSFloaterSearch::SC_PLACE); - } -} - -// static -void FSPanelSearchPlaces::processSearchReply(LLMessageSystem* msg, void**) -{ - LLUUID agent_id; - LLUUID query_id; - LLUUID parcel_id; - std::string name; - bool for_sale; - bool auction; - F32 dwell; - - msg->getUUID("AgentData", "AgentID", agent_id); - msg->getUUID("QueryData", "QueryID", query_id); - - // Not for us - if (agent_id != gAgentID) - { - return; - } - LL_DEBUGS("Search") << "received directory request - QueryID: " << query_id << " AgentID: " << agent_id << LL_ENDL; - - FSPanelSearchPlaces* self = FSFloaterSearch::getSearchPanel<FSPanelSearchPlaces>("panel_ls_places"); - - // floater is closed or these are not results from our last request - if (!self || query_id != self->getQueryID()) - { - return; - } - - LLScrollListCtrl* search_results = self->getChild<LLScrollListCtrl>("search_results_places"); - - // Clear "Searching" label on first results - if (self->mNumResultsReturned++ == 0) - { - search_results->deleteAllItems(); - } - - // Check for status messages - if (msg->getNumberOfBlocks("StatusData")) - { - U32 status; - msg->getU32("StatusData", "Status", status); - if (status & STATUS_SEARCH_PLACES_FOUNDNONE) - { - LLStringUtil::format_map_t map; - map["[TEXT]"] = self->getChild<LLUICtrl>("places_edit")->getValue().asString(); - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("not_found", map)); - return; - } - else if(status & STATUS_SEARCH_PLACES_SHORTSTRING) - { - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("search_short")); - return; - } - else if (status & STATUS_SEARCH_PLACES_BANNEDWORD) - { - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("search_banned")); - return; - } - else if (status & STATUS_SEARCH_PLACES_SEARCHDISABLED) - { - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("search_disabled")); - return; - } - else if (status & STATUS_SEARCH_PLACES_ESTATEEMPTY) - { - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("search_disabled")); - return; - } - } - - bool found_one = false; - S32 num_new_rows = msg->getNumberOfBlocks("QueryReplies"); - if (num_new_rows == 0 && self->mResultsReceived == 0) - { - LLStringUtil::format_map_t map; - map["[TEXT]"] = self->getChild<LLUICtrl>("places_edit")->getValue().asString(); - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("not_found", map)); - } - - self->mResultsReceived += num_new_rows; - num_new_rows = self->showNextButton(num_new_rows); - - for (S32 i = 0; i < num_new_rows; i++) - { - msg->getUUID( "QueryReplies", "ParcelID", parcel_id, i); - msg->getString( "QueryReplies", "Name", name, i); - msg->getBOOL( "QueryReplies", "ForSale", for_sale,i); - msg->getBOOL( "QueryReplies", "Auction", auction, i); - msg->getF32( "QueryReplies", "Dwell", dwell, i); - if (parcel_id.isNull()) - { - LL_DEBUGS("Search") << "Null result returned for QueryID: " << query_id << LL_ENDL; - LLStringUtil::format_map_t map; - map["[TEXT]"] = self->getChild<LLUICtrl>("places_edit")->getValue().asString(); - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("not_found", map)); - } - else - { - LL_DEBUGS("Search") << "Got: " << name << " ParcelID: " << parcel_id << LL_ENDL; - search_results->setEnabled(TRUE); - found_one = true; - - LLSD content; - LLSD element; - - element["id"] = parcel_id; - - if (auction) - { - element["columns"][0]["column"] = "icon"; - element["columns"][0]["type"] = "icon"; - element["columns"][0]["value"] = "Icon_Auction"; - } - else if (for_sale) - { - element["columns"][0]["column"] = "icon"; - element["columns"][0]["type"] = "icon"; - element["columns"][0]["value"] = "Icon_For_Sale"; - } - else - { - element["columns"][0]["column"] = "icon"; - element["columns"][0]["type"] = "icon"; - element["columns"][0]["value"] = "Icon_Place"; - } - - element["columns"][1]["column"] = "place_name"; - element["columns"][1]["value"] = name; - - content["name"] = name; - - std::string buffer = llformat("%.0f", (F64)dwell); - element["columns"][2]["column"] = "dwell"; - element["columns"][2]["value"] = buffer; - - search_results->addElement(element, ADD_BOTTOM); - self->mResultsContent[parcel_id.asString()] = content; - } - } - if (found_one) - { - search_results->selectFirstItem(); - search_results->setFocus(TRUE); - self->onSelectItem(); - } -} - -//////////////////////////////////////// -// Land Search Panel // -//////////////////////////////////////// - -static LLPanelInjector<FSPanelSearchLand> t_panel_fs_search_land("panel_ls_land"); - -FSPanelSearchLand::FSPanelSearchLand() : FSSearchPanelBase() -, mQueryID(nullptr) -, mStartSearch(0) -, mResultsReceived(0) -, mResultsContent() -{ - mCommitCallbackRegistrar.add("CommitSearch", boost::bind(&FSPanelSearchLand::find, this)); -} - -FSPanelSearchLand::~FSPanelSearchLand() -{ -} - -bool FSPanelSearchLand::postBuild() -{ - mSearchResults = getChild<LLScrollListCtrl>("search_results_land"); - mPriceEditor = findChild<LLLineEditor>("price_edit"); - mAreaEditor = findChild<LLLineEditor>("area_edit"); - if (mSearchResults) - { - mSearchResults->setCommitCallback(boost::bind(&FSPanelSearchLand::onSelectItem, this)); - mSearchResults->setEnabled(FALSE); - mSearchResults->setCommentText(LLTrans::getString("no_results")); - } - if (mPriceEditor) - { - mPriceEditor->setCommitOnFocusLost(false); - mPriceEditor->setCommitCallback(boost::bind(&FSPanelSearchLand::onBtnFind, this)); - } - if (mAreaEditor) - { - mAreaEditor->setCommitOnFocusLost(false); - mAreaEditor->setCommitCallback(boost::bind(&FSPanelSearchLand::find, this)); - } - childSetAction("land_find", boost::bind(&FSPanelSearchLand::onBtnFind, this)); - childSetAction("land_next", boost::bind(&FSPanelSearchLand::onBtnNext, this)); - childSetAction("land_back", boost::bind(&FSPanelSearchLand::onBtnBack, this)); - - getChildView("land_next")->setEnabled(FALSE); - getChildView("land_back")->setEnabled(FALSE); - - return TRUE; -} - -void FSPanelSearchLand::find() -{ - static LLUICachedControl<bool> inc_pg("ShowPGLand", 1); - static LLUICachedControl<bool> inc_mature("ShowMatureLand", 0); - static LLUICachedControl<bool> inc_adult("ShowAdultLand", 0); - static LLUICachedControl<bool> limit_price("FindLandPrice", 1); - static LLUICachedControl<bool> limit_area("FindLandArea", 1); - if (!(inc_pg || inc_mature || inc_adult)) - { - LLNotificationsUtil::add("NoContentToSearch"); - return; - } - - U32 category = ST_ALL; - const std::string& selection = findChild<LLComboBox>("land_category")->getSelectedValue().asString(); - if (!selection.empty()) - { - if (selection == "Auction") - { - category = ST_AUCTION; - } - else if (selection == "Mainland") - { - category = ST_MAINLAND; - } - else if (selection == "Estate") - { - category = ST_ESTATE; - } - } - - U32 scope = 0; - if (gAgent.wantsPGOnly()) - { - scope |= DFQ_PG_SIMS_ONLY; - } - bool mature_enabled = gAgent.canAccessMature(); - bool adult_enabled = gAgent.canAccessAdult(); - if (inc_pg) - { - scope |= DFQ_INC_PG; - } - if (inc_mature && mature_enabled) - { - scope |= DFQ_INC_MATURE; - } - if (inc_adult && adult_enabled) - { - scope |= DFQ_INC_ADULT; - } - const std::string& sort = findChild<LLComboBox>("land_sort_combo")->getSelectedValue().asString(); - if (!sort.empty()) - { - if (sort == "Name") - { - scope |= DFQ_NAME_SORT; - } - else if (sort == "Price") - { - scope |= DFQ_PRICE_SORT; - } - else if (sort == "PPM") - { - scope |= DFQ_PER_METER_SORT; - } - else if (sort == "Area") - { - scope |= DFQ_AREA_SORT; - } - } - else - { - scope |= DFQ_PRICE_SORT; - } - if (childGetValue("ascending_check").asBoolean()) - { - scope |= DFQ_SORT_ASC; - } - if (limit_price) - { - scope |= DFQ_LIMIT_BY_PRICE; - } - if (limit_area) - { - scope |= DFQ_LIMIT_BY_AREA; - } - S32 price = childGetValue("edit_price").asInteger(); - S32 area = childGetValue("edit_area").asInteger(); - - mResultsReceived = 0; - if (mQueryID.notNull()) - { - mQueryID.setNull(); - } - mQueryID.generate(); - - if (mStartSearch < 0) - { - mStartSearch = 0; - } - - gMessageSystem->newMessage("DirLandQuery"); - gMessageSystem->nextBlock("AgentData"); - gMessageSystem->addUUID("AgentID", gAgentID); - gMessageSystem->addUUID("SessionID", gAgentSessionID); - gMessageSystem->nextBlock("QueryData"); - gMessageSystem->addUUID("QueryID", getQueryID()); - gMessageSystem->addU32("QueryFlags", scope); - gMessageSystem->addU32("SearchType", category); - gMessageSystem->addS32("Price", price); - gMessageSystem->addS32("Area", area); - gMessageSystem->addS32("QueryStart", mStartSearch); - gAgent.sendReliableMessage(); - LL_DEBUGS("Search") << "Firing off places search request: " << getQueryID() << category << LL_ENDL; - - mSearchResults->deleteAllItems(); - mSearchResults->setCommentText(LLTrans::getString("searching")); - mNumResultsReturned = 0; -} - -void FSPanelSearchLand::onBtnFind() -{ - std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now(); - auto elapsed = now - lastRequestTime; - U64 elapsedMS = std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count(); - if(elapsedMS < REQUEST_MIN_ELAPSED_TIME) return; - lastRequestTime = now; - - resetSearch(); - - find(); -} - -void FSPanelSearchLand::onBtnNext() -{ - mStartSearch += RESULT_PAGE_SIZE; - getChildView("land_back")->setEnabled(TRUE); - - find(); -} - -void FSPanelSearchLand::onBtnBack() -{ - mStartSearch -= RESULT_PAGE_SIZE; - getChildView("land_back")->setEnabled(mStartSearch > 0); - - find(); -} - -void FSPanelSearchLand::resetSearch() -{ - mStartSearch = 0; - getChildView("land_back")->setEnabled(FALSE); - getChildView("land_next")->setEnabled(FALSE); -} - -S32 FSPanelSearchLand::showNextButton(S32 rows) -{ - bool show_next_button = (mResultsReceived > RESULT_PAGE_SIZE); - getChildView("land_next")->setEnabled(show_next_button); - if (show_next_button) - { - rows -= (mResultsReceived - RESULT_PAGE_SIZE); - } - return rows; -} - -void FSPanelSearchLand::onSelectItem() -{ - if (!mSearchResults) - { - return; - } - FSFloaterSearch* search_instance = LLFloaterReg::findTypedInstance<FSFloaterSearch>("search"); - if (search_instance) - { - search_instance->FSFloaterSearch::onSelectedItem(mSearchResults->getSelectedValue(), FSFloaterSearch::SC_PLACE); - } -} - -// static -void FSPanelSearchLand::processSearchReply(LLMessageSystem* msg, void**) -{ - LLUUID agent_id; - LLUUID query_id; - LLUUID parcel_id; - std::string name; - std::string land_sku; - std::string land_type; - bool auction; - bool for_sale; - S32 price; - S32 area; - - msg->getUUID("AgentData", "AgentID", agent_id); - msg->getUUID("QueryData", "QueryID", query_id); - - // Not for us - if (agent_id != gAgentID) - { - return; - } - LL_DEBUGS("Search") << "received directory request - QueryID: " << query_id << " AgentID: " << agent_id << LL_ENDL; - - FSPanelSearchLand* self = FSFloaterSearch::getSearchPanel<FSPanelSearchLand>("panel_ls_land"); - - // floater is closed or these are not results from our last request - if (!self || query_id != self->mQueryID) - { - return; - } - - LLScrollListCtrl* search_results = self->getChild<LLScrollListCtrl>("search_results_land"); - // clear "Searching" label on first results - if (self->mNumResultsReturned++ == 0) - { - search_results->deleteAllItems(); - } - - static LLUICachedControl<bool> use_price("FindLandPrice", 1); - static LLUICachedControl<bool> use_area("FindLandArea", 1); - S32 limit_price = self->childGetValue("edit_price").asInteger(); - S32 limit_area = self->childGetValue("edit_area").asInteger(); - - bool found_one = false; - S32 num_new_rows = msg->getNumberOfBlocks("QueryReplies"); - if (num_new_rows == 0 && self->mResultsReceived == 0) - { - LLStringUtil::format_map_t map; - map["[TEXT]"] = self->getChild<LLUICtrl>("events_edit")->getValue().asString(); - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("not_found", map)); - } - self->mResultsReceived += num_new_rows; - - S32 not_auction = 0; - for (S32 i = 0; i < num_new_rows; i++) - { - msg->getUUID( "QueryReplies", "ParcelID", parcel_id, i); - msg->getString( "QueryReplies", "Name", name, i); - msg->getBOOL( "QueryReplies", "Auction", auction, i); - msg->getBOOL( "QueryReplies", "ForSale", for_sale, i); - msg->getS32( "QueryReplies", "SalePrice", price, i); - msg->getS32( "QueryReplies", "ActualArea", area, i); - if (parcel_id.isNull()) - { - LL_DEBUGS("Search") << "Null result returned for QueryID: " << query_id << LL_ENDL; - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("no_results")); - } - else - { - LL_DEBUGS("Search") << "Got: " << name << " ClassifiedID: " << parcel_id << LL_ENDL; - search_results->setEnabled(TRUE); - found_one = true; - if (msg->getSizeFast(_PREHASH_QueryReplies, i, _PREHASH_ProductSKU) > 0) - { - msg->getStringFast( _PREHASH_QueryReplies, _PREHASH_ProductSKU, land_sku, i); - land_type = LLProductInfoRequestManager::instance().getDescriptionForSku(land_sku); - } - else - { - land_sku.clear(); - land_type = LLTrans::getString("land_type_unknown"); - } - if (parcel_id.isNull()) - { - continue; - } - if (use_price && (price > limit_price)) - { - continue; - } - if (use_area && (area < limit_area)) - { - continue; - } - - LLSD content; - LLSD element; - - element["id"] = parcel_id; - if (auction) - { - element["columns"][0]["column"] = "icon"; - element["columns"][0]["type"] = "icon"; - element["columns"][0]["value"] = "Icon_Auction"; - } - else if (for_sale) - { - element["columns"][0]["column"] = "icon"; - element["columns"][0]["type"] = "icon"; - element["columns"][0]["value"] = "Icon_For_Sale"; - } - else - { - element["columns"][0]["column"] = "icon"; - element["columns"][0]["type"] = "icon"; - element["columns"][0]["value"] = "Icon_Place"; - } - - element["columns"][1]["column"] = "land_name"; - element["columns"][1]["value"] = name; - - content["place_name"] = name; - - std::string buffer = "Auction"; - if (!auction) - { - buffer = llformat("%d", price); - not_auction++; - } - element["columns"][2]["column"] = "price"; - element["columns"][2]["value"] = price; - - element["columns"][3]["column"] = "area"; - element["columns"][3]["value"] = area; - if (!auction) - { - F32 ppm; - if (area > 0) - { - ppm = (F32)price / (F32)area; - } - else - { - ppm = 0.f; - } - std::string ppm_buffer = llformat("%.1f", ppm); - element["columns"][4]["column"] = "ppm"; - element["columns"][4]["value"] = ppm_buffer; - } - else - { - element["columns"][4]["column"] = "ppm"; - element["columns"][4]["value"] = "1.0"; - } - - element["columns"][5]["column"] = "land_type"; - element["columns"][5]["value"] = land_type; - - search_results->addElement(element, ADD_BOTTOM); - self->mResultsContent[parcel_id.asString()] = content; - } - // We test against non-auction properties because they don't count towards the page limit. - self->showNextButton(not_auction); - } - if (found_one) - { - search_results->selectFirstItem(); - search_results->setFocus(TRUE); - self->onSelectItem(); - } -} - -//////////////////////////////////////// -// Classifieds Search Panel // -//////////////////////////////////////// - -static LLPanelInjector<FSPanelSearchClassifieds> t_panel_fs_search_classifieds("panel_ls_classifieds"); - -FSPanelSearchClassifieds::FSPanelSearchClassifieds() : FSSearchPanelBase() -, mQueryID(nullptr) -, mStartSearch(0) -, mResultsReceived(0) -, mResultsContent() -{ - mCommitCallbackRegistrar.add("CommitSearch", boost::bind(&FSPanelSearchClassifieds::find, this)); -} - -FSPanelSearchClassifieds::~FSPanelSearchClassifieds() -{ -} - -bool FSPanelSearchClassifieds::postBuild() -{ - mSearchComboBox = findChild<LLSearchComboBox>("classifieds_edit"); - mSearchResults = getChild<LLScrollListCtrl>("search_results_classifieds"); - if (mSearchComboBox) - { - mSearchComboBox->setCommitCallback(boost::bind(&FSPanelSearchClassifieds::onBtnFind, this)); - fillSearchComboBox(mSearchComboBox); - } - if (mSearchResults) - { - mSearchResults->setCommitCallback(boost::bind(&FSPanelSearchClassifieds::onSelectItem, this)); - mSearchResults->setEnabled(FALSE); - mSearchResults->setCommentText(LLTrans::getString("no_results")); - } - - mClassifiedsCategory = getChild<LLComboBox>("classifieds_category"); - if (mClassifiedsCategory) - { - LLClassifiedInfo::cat_map::iterator iter; - mClassifiedsCategory->add(LLTrans::getString("all_categories"), LLSD(0)); - mClassifiedsCategory->addSeparator(); - for (iter = LLClassifiedInfo::sCategories.begin(); - iter != LLClassifiedInfo::sCategories.end(); - iter++) - { - mClassifiedsCategory->add(LLTrans::getString(iter->second), LLSD((S32)iter->first)); - } - } - childSetAction("classifieds_next", boost::bind(&FSPanelSearchClassifieds::onBtnNext, this)); - childSetAction("classifieds_back", boost::bind(&FSPanelSearchClassifieds::onBtnBack, this)); - - getChildView("classifieds_next")->setEnabled(FALSE); - getChildView("classifieds_back")->setEnabled(FALSE); - - return TRUE; -} - -void FSPanelSearchClassifieds::focusDefaultElement() -{ - mSearchComboBox->focusTextEntry(); -} - -void FSPanelSearchClassifieds::find() -{ - std::string text = filterShortWords(mSearchComboBox->getSimple()); - if (text.size() == 0) - { - mSearchResults->setCommentText(LLTrans::getString("search_short")); - return; - } - - static LLUICachedControl<bool> inc_pg("ShowPGClassifieds", 1); - static LLUICachedControl<bool> inc_mature("ShowMatureClassifieds", 0); - static LLUICachedControl<bool> inc_adult("ShowAdultClassifieds", 0); - if (!(inc_pg || inc_mature || inc_adult)) - { - LLNotificationsUtil::add("NoContentToSearch"); - return; - } - U32 category = mClassifiedsCategory->getValue().asInteger(); - bool auto_renew = FALSE; - U32 flags = pack_classified_flags_request(auto_renew, inc_pg, inc_mature, inc_adult); - - mResultsReceived = 0; - if (mQueryID.notNull()) - { - mQueryID.setNull(); - } - mQueryID.generate(); - - if (mStartSearch < 0) - { - mStartSearch = 0; - } - - gMessageSystem->newMessageFast(_PREHASH_DirClassifiedQuery); - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgentSessionID); - gMessageSystem->nextBlockFast(_PREHASH_QueryData); - gMessageSystem->addUUIDFast(_PREHASH_QueryID, getQueryID()); - gMessageSystem->addStringFast(_PREHASH_QueryText, text); - gMessageSystem->addU32Fast(_PREHASH_QueryFlags, flags); - gMessageSystem->addU32Fast(_PREHASH_Category, category); - gMessageSystem->addS32Fast(_PREHASH_QueryStart, mStartSearch); - gAgent.sendReliableMessage(); - LL_DEBUGS("Search") << "Firing off classified ad search request: " << getQueryID() << LL_ENDL; - - mSearchResults->deleteAllItems(); - mSearchResults->setCommentText(LLTrans::getString("searching")); - mNumResultsReturned = 0; -} - -void FSPanelSearchClassifieds::onBtnFind() -{ - std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now(); - auto elapsed = now - lastRequestTime; - U64 elapsedMS = std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count(); - if(elapsedMS < REQUEST_MIN_ELAPSED_TIME) return; - lastRequestTime = now; - - std::string text = mSearchComboBox->getSimple(); - if (!text.empty()) - { - LLSearchHistory::getInstance()->addEntry(text); - } - - resetSearch(); - - find(); -} - -void FSPanelSearchClassifieds::onBtnNext() -{ - mStartSearch += RESULT_PAGE_SIZE; - getChildView("classifieds_back")->setEnabled(TRUE); - - find(); -} - -void FSPanelSearchClassifieds::onBtnBack() -{ - mStartSearch -= RESULT_PAGE_SIZE; - getChildView("classifieds_back")->setEnabled(mStartSearch > 0); - - find(); -} - -void FSPanelSearchClassifieds::resetSearch() -{ - mStartSearch = 0; - getChildView("classifieds_back")->setEnabled(FALSE); - getChildView("classifieds_next")->setEnabled(FALSE); -} - -S32 FSPanelSearchClassifieds::showNextButton(S32 rows) -{ - bool show_next_button = (mResultsReceived > RESULT_PAGE_SIZE); - getChildView("classifieds_next")->setEnabled(show_next_button); - if (show_next_button) - { - rows -= (mResultsReceived - RESULT_PAGE_SIZE); - } - return rows; -} - -void FSPanelSearchClassifieds::onSelectItem() -{ - if (!mSearchResults) - { - return; - } - FSFloaterSearch* search_instance = LLFloaterReg::findTypedInstance<FSFloaterSearch>("search"); - if (search_instance) - { - search_instance->FSFloaterSearch::onSelectedItem(mSearchResults->getSelectedValue(), FSFloaterSearch::SC_CLASSIFIED); - } -} - -// static -void FSPanelSearchClassifieds::processSearchReply(LLMessageSystem* msg, void**) -{ - LLUUID agent_id; - LLUUID query_id; - LLUUID classified_id; - std::string name; - U32 creation_date; - U32 expiration_date; - S32 price_for_listing; - - msg->getUUID("AgentData", "AgentID", agent_id); - msg->getUUID("QueryData", "QueryID", query_id); - - // Not for us - if (agent_id != gAgentID) - { - return; - } - LL_DEBUGS("Search") << "received directory request - QueryID: " << query_id << " AgentID: " << agent_id << LL_ENDL; - - FSPanelSearchClassifieds* self = FSFloaterSearch::getSearchPanel<FSPanelSearchClassifieds>("panel_ls_classifieds"); - - if (msg->getNumberOfBlocks("StatusData")) - { - U32 status; - msg->getU32("StatusData", "Status", status); - if (status & STATUS_SEARCH_CLASSIFIEDS_BANNEDWORD) - { - LLNotificationsUtil::add("SearchWordBanned"); - } - } - - // floater is closed or these are not results from our last request - if (!self || query_id != self->mQueryID) - { - return; - } - - LLScrollListCtrl* search_results = self->getChild<LLScrollListCtrl>("search_results_classifieds"); - - // Clear "Searching" label on first results - if (self->mNumResultsReturned++ == 0) - { - search_results->deleteAllItems(); - } - - // Check for status messages - if (msg->getNumberOfBlocks("StatusData")) - { - U32 status; - msg->getU32("StatusData", "Status", status); - if (status & STATUS_SEARCH_PLACES_FOUNDNONE) - { - LLStringUtil::format_map_t map; - map["[TEXT]"] = self->getChild<LLUICtrl>("classifieds_edit")->getValue().asString(); - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("not_found", map)); - return; - } - else if(status & STATUS_SEARCH_PLACES_SHORTSTRING) - { - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("search_short")); - return; - } - else if (status & STATUS_SEARCH_CLASSIFIEDS_BANNEDWORD) - { - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("search_banned")); - return; - } - else if (status & STATUS_SEARCH_PLACES_SEARCHDISABLED) - { - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("search_disabled")); - return; - } - } - - bool found_one = false; - S32 num_new_rows = msg->getNumberOfBlocks("QueryReplies"); - if (num_new_rows == 0 && self->mResultsReceived == 0) - { - LLStringUtil::format_map_t map; - map["[TEXT]"] = self->getChild<LLUICtrl>("classifieds_edit")->getValue().asString(); - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("not_found", map)); - } - self->mResultsReceived += num_new_rows; - num_new_rows = self->showNextButton(num_new_rows); - - for (S32 i = 0; i < num_new_rows; i++) - { - msg->getUUID( "QueryReplies", "ClassifiedID", classified_id, i); - msg->getString( "QueryReplies", "Name", name, i); - msg->getU32( "QueryReplies", "CreationDate", creation_date, i); - msg->getU32( "QueryReplies", "ExpirationDate", expiration_date,i); - msg->getS32( "QueryReplies", "PriceForListing", price_for_listing,i); - if (classified_id.isNull()) - { - LL_DEBUGS("Search") << "Null result returned for QueryID: " << query_id << LL_ENDL; - LLStringUtil::format_map_t map; - map["[TEXT]"] = self->getChild<LLUICtrl>("classifieds_edit")->getValue().asString(); - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("not_found", map)); - } - else - { - LL_DEBUGS("Search") << "Got: " << name << " ClassifiedID: " << classified_id << LL_ENDL; - search_results->setEnabled(TRUE); - found_one = true; - - LLSD content; - LLSD element; - - element["id"] = classified_id; - - element["columns"][0]["column"] = "icon"; - element["columns"][0]["type"] = "icon"; - element["columns"][0]["value"] = "icon_top_pick.tga"; - - element["columns"][1]["column"] = "classified_name"; - element["columns"][1]["value"] = name; - - element["columns"][2]["column"] = "price"; - element["columns"][2]["value"] = price_for_listing; - - content["name"] = name; - - search_results->addElement(element, ADD_BOTTOM); - self->mResultsContent[classified_id.asString()] = content; - } - } - if (found_one) - { - search_results->selectFirstItem(); - search_results->setFocus(TRUE); - self->onSelectItem(); - } -} - -//////////////////////////////////////// -// Events Search Panel // -//////////////////////////////////////// - -static LLPanelInjector<FSPanelSearchEvents> t_panel_fs_search_events("panel_ls_events"); - -FSPanelSearchEvents::FSPanelSearchEvents() : FSSearchPanelBase() -, mQueryID(nullptr) -, mResultsReceived(0) -, mStartSearch(0) -, mDay(0) -, mResultsContent() -{ - mCommitCallbackRegistrar.add("CommitSearch", boost::bind(&FSPanelSearchEvents::find, this)); -} - -FSPanelSearchEvents::~FSPanelSearchEvents() -{ -} - -bool FSPanelSearchEvents::postBuild() -{ - mSearchComboBox = findChild<LLSearchComboBox>("events_edit"); - mSearchResults = getChild<LLScrollListCtrl>("search_results_events"); - mEventsMode = findChild<LLRadioGroup>("events_search_mode"); - if (mSearchComboBox) - { - mSearchComboBox->setCommitCallback(boost::bind(&FSPanelSearchEvents::onBtnFind, this)); - fillSearchComboBox(mSearchComboBox); - } - if (mSearchResults) - { - mSearchResults->setCommitCallback(boost::bind(&FSPanelSearchEvents::onSelectItem, this)); - mSearchResults->setEnabled(FALSE); - mSearchResults->setCommentText(LLTrans::getString("no_results")); - } - if (mEventsMode) - { - mEventsMode->setCommitCallback(boost::bind(&FSPanelSearchEvents::onSearchModeChanged, this)); - mEventsMode->selectFirstItem(); - } - - childSetAction("events_next", boost::bind(&FSPanelSearchEvents::onBtnNext, this)); - childSetAction("events_back", boost::bind(&FSPanelSearchEvents::onBtnBack, this)); - childSetAction("events_tomorrow", boost::bind(&FSPanelSearchEvents::onBtnTomorrow, this)); - childSetAction("events_yesterday", boost::bind(&FSPanelSearchEvents::onBtnYesterday, this)); - childSetAction("events_today", boost::bind(&FSPanelSearchEvents::onBtnToday, this)); - - getChildView("events_next")->setEnabled(FALSE); - getChildView("events_back")->setEnabled(FALSE); - getChildView("events_tomorrow")->setEnabled(FALSE); - getChildView("events_yesterday")->setEnabled(FALSE); - getChildView("events_today")->setEnabled(FALSE); - setDay(0); - - return TRUE; -} - -void FSPanelSearchEvents::focusDefaultElement() -{ - mSearchComboBox->focusTextEntry(); -} - -void FSPanelSearchEvents::find() -{ - std::string text = filterShortWords(mSearchComboBox->getSimple()); - - static LLUICachedControl<bool> inc_pg("ShowPGEvents", 1); - static LLUICachedControl<bool> inc_mature("ShowMatureEvents", 0); - static LLUICachedControl<bool> inc_adult("ShowAdultEvents", 0); - if (!(inc_pg || inc_mature || inc_adult)) - { - LLNotificationsUtil::add("NoContentToSearch"); - return; - } - - U32 category = findChild<LLComboBox>("events_category")->getSelectedValue().asInteger(); - U32 scope = DFQ_DATE_EVENTS; - if (gAgent.wantsPGOnly()) - { - scope |= DFQ_PG_SIMS_ONLY; - } - bool mature_enabled = gAgent.canAccessMature(); - bool adult_enabled = gAgent.canAccessAdult(); - if (inc_pg) - { - scope |= DFQ_INC_PG; - } - if (inc_mature && mature_enabled) - { - scope |= DFQ_INC_MATURE; - } - if (inc_adult && adult_enabled) - { - scope |= DFQ_INC_ADULT; - } - - std::ostringstream string; - - if ("current" == childGetValue("events_search_mode").asString()) - { - string << "u|"; - } - else - { - string << mDay << "|"; - } - string << category << "|"; - string << text; - - mResultsReceived = 0; - if (mQueryID.notNull()) - { - mQueryID.setNull(); - } - mQueryID.generate(); - - if (mStartSearch < 0) - { - mStartSearch = 0; - } - - gMessageSystem->newMessage("DirFindQuery"); - gMessageSystem->nextBlock("AgentData"); - gMessageSystem->addUUID("AgentID", gAgentID); - gMessageSystem->addUUID("SessionID", gAgentSessionID); - gMessageSystem->nextBlock("QueryData"); - gMessageSystem->addUUID("QueryID", getQueryID()); - gMessageSystem->addString("QueryText", string.str()); - gMessageSystem->addU32("QueryFlags", scope); - gMessageSystem->addS32("QueryStart", mStartSearch); - gAgent.sendReliableMessage(); - LL_INFOS("Search") << "Firing off search request: " << getQueryID() << " Search Text: " << string.str() << LL_ENDL; - - mSearchResults->deleteAllItems(); - mSearchResults->setCommentText(LLTrans::getString("searching")); - mNumResultsReturned = 0; -} - -void FSPanelSearchEvents::onBtnFind() -{ - std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now(); - auto elapsed = now - lastRequestTime; - U64 elapsedMS = std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count(); - if(elapsedMS < REQUEST_MIN_ELAPSED_TIME) return; - lastRequestTime = now; - - std::string text = mSearchComboBox->getSimple(); - if (!text.empty()) - { - LLSearchHistory::getInstance()->addEntry(text); - } - - resetSearch(); - - find(); -} - -void FSPanelSearchEvents::onBtnNext() -{ - mStartSearch += RESULT_PAGE_SIZE; - getChildView("events_back")->setEnabled(TRUE); - - find(); -} - -void FSPanelSearchEvents::onBtnBack() -{ - mStartSearch -= RESULT_PAGE_SIZE; - getChildView("events_back")->setEnabled(mStartSearch > 0); - - find(); -} - -void FSPanelSearchEvents::onBtnTomorrow() -{ - resetSearch(); - setDay(mDay + 1); - - find(); -} - -void FSPanelSearchEvents::onBtnYesterday() -{ - resetSearch(); - setDay(mDay - 1); - - find(); -} - -void FSPanelSearchEvents::onBtnToday() -{ - resetSearch(); - setDay(0); - - find(); -} - -void FSPanelSearchEvents::resetSearch() -{ - mStartSearch = 0; - getChildView("events_back")->setEnabled(FALSE); - getChildView("events_next")->setEnabled(FALSE); -} - -void FSPanelSearchEvents::onSearchModeChanged() -{ - if (mEventsMode->getValue().asString() == "current") - { - getChildView("events_yesterday")->setEnabled(FALSE); - getChildView("events_tomorrow")->setEnabled(FALSE); - getChildView("events_today")->setEnabled(FALSE); - } - else - { - getChildView("events_yesterday")->setEnabled(TRUE); - getChildView("events_tomorrow")->setEnabled(TRUE); - getChildView("events_today")->setEnabled(TRUE); - } -} - -void FSPanelSearchEvents::setDay(S32 day) -{ - mDay = day; - struct tm* internal_time; - - time_t utc = time_corrected(); - utc += day * 24 * 60 * 60; - internal_time = utc_to_pacific_time(utc, is_daylight_savings()); - std::string buffer = llformat("%d/%d", 1 + internal_time->tm_mon, internal_time->tm_mday); - childSetValue("events_date", buffer); -} - -S32 FSPanelSearchEvents::showNextButton(S32 rows) -{ - bool show_next_button = (mResultsReceived > RESULT_PAGE_SIZE); - getChildView("events_next")->setEnabled(show_next_button); - if (show_next_button) - { - rows -= (mResultsReceived - RESULT_PAGE_SIZE); - } - return rows; -} - -void FSPanelSearchEvents::onSelectItem() -{ - if (!mSearchResults) - { - return; - } - S32 event_id = mSearchResults->getSelectedValue(); - FSFloaterSearch* search_instance = LLFloaterReg::findTypedInstance<FSFloaterSearch>("search"); - if (search_instance) - { - search_instance->FSFloaterSearch::onSelectedEvent(event_id); - } -} - -// static -void FSPanelSearchEvents::processSearchReply(LLMessageSystem* msg, void**) -{ - LLUUID agent_id; - LLUUID query_id; - LLUUID owner_id; - std::string name; - std::string date; - - msg->getUUID("AgentData", "AgentID", agent_id); - msg->getUUID("QueryData", "QueryID", query_id); - - // Not for us - if (agent_id != gAgentID) - { - return; - } - LL_DEBUGS("Search") << "received directory request - QueryID: " << query_id << " AgentID: " << agent_id << LL_ENDL; - - FSPanelSearchEvents* self = FSFloaterSearch::getSearchPanel<FSPanelSearchEvents>("panel_ls_events"); - - // floater is closed or these are not results from our last request - if (!self || query_id != self->mQueryID) - { - return; - } - - LLScrollListCtrl* search_results = self->getChild<LLScrollListCtrl>("search_results_events"); - - // Clear "Searching" label on first results - if (self->mNumResultsReturned++ == 0) - { - search_results->deleteAllItems(); - } - // Check for status messages - if (msg->getNumberOfBlocks("StatusData")) - { - U32 status; - msg->getU32("StatusData", "Status", status); - if (status & STATUS_SEARCH_EVENTS_FOUNDNONE) - { - LLStringUtil::format_map_t map; - map["[TEXT]"] = self->getChild<LLUICtrl>("events_edit")->getValue().asString(); - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("not_found", map)); - return; - } - else if(status & STATUS_SEARCH_EVENTS_SHORTSTRING) - { - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("search_short")); - return; - } - else if (status & STATUS_SEARCH_EVENTS_BANNEDWORD) - { - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("search_banned")); - return; - } - else if (status & STATUS_SEARCH_EVENTS_SEARCHDISABLED) - { - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("search_disabled")); - return; - } - else if (status & STATUS_SEARCH_EVENTS_NODATEOFFSET) - { - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("search_no_date_offset")); - return; - } - else if (status & STATUS_SEARCH_EVENTS_NOCATEGORY) - { - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("search_no_events_category")); - return; - } - else if (status & STATUS_SEARCH_EVENTS_NOQUERY) - { - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("search_no_query")); - return; - } - } - - S32 num_new_rows = msg->getNumberOfBlocks("QueryReplies"); - if (num_new_rows == 0 && self->mResultsReceived == 0) - { - LLStringUtil::format_map_t map; - map["[TEXT]"] = self->getChild<LLUICtrl>("events_edit")->getValue().asString(); - search_results->setEnabled(FALSE); - search_results->setCommentText(LLTrans::getString("not_found", map)); - } - - self->mResultsReceived += num_new_rows; - num_new_rows = self->showNextButton(num_new_rows); - static LLUICachedControl<bool> inc_pg("ShowPGEvents", 1); - static LLUICachedControl<bool> inc_mature("ShowMatureEvents", 0); - static LLUICachedControl<bool> inc_adult("ShowAdultEvents", 0); - bool found_one = false; - - for (S32 i = 0; i < num_new_rows; i++) - { - U32 event_id; - U32 unix_time; - U32 event_flags; - - msg->getUUID( "QueryReplies", "OwnerID", owner_id, i); - msg->getString( "QueryReplies", "Name", name, i); - msg->getU32( "QueryReplies", "EventID", event_id, i); - msg->getString( "QueryReplies", "Date", date, i); - msg->getU32( "QueryReplies", "UnixTime", unix_time, i); - msg->getU32( "QueryReplies", "EventFlags", event_flags,i); - - // Skip empty events... - if (owner_id.isNull()) - { - LL_INFOS("Search") << "Skipped " << event_id << " because of a nullptr owner result" << LL_ENDL; - continue; - } - // Skips events that don't match our scope... - if (((event_flags & (EVENT_FLAG_ADULT | EVENT_FLAG_MATURE)) == EVENT_FLAG_NONE) && !inc_pg) - { - LL_INFOS("Search") << "Skipped " << event_id << " because it was out of scope" << LL_ENDL; - continue; - } - if ((event_flags & EVENT_FLAG_MATURE) && !inc_mature) - { - LL_INFOS("Search") << "Skipped " << event_id << " because it was out of scope" << LL_ENDL; - continue; - } - if ((event_flags & EVENT_FLAG_ADULT) && !inc_adult) - { - LL_INFOS("Search") << "Skipped " << event_id << " because it was out of scope" << LL_ENDL; - continue; - } - search_results->setEnabled(TRUE); - found_one = true; - - LLSD content; - LLSD element; - - element["id"] = llformat("%u", event_id); - - if (event_flags == EVENT_FLAG_ADULT) - { - element["columns"][0]["column"] = "icon"; - element["columns"][0]["type"] = "icon"; - element["columns"][0]["value"] = "Icon_Legacy_Event_Adult"; - } - else if (event_flags == EVENT_FLAG_MATURE) - { - element["columns"][0]["column"] = "icon"; - element["columns"][0]["type"] = "icon"; - element["columns"][0]["value"] = "Icon_Legacy_Event_Mature"; - } - else - { - element["columns"][0]["column"] = "icon"; - element["columns"][0]["type"] = "icon"; - element["columns"][0]["value"] = "Icon_Legacy_Event_PG"; - } - element["columns"][1]["column"] = "name"; - element["columns"][1]["value"] = name; - - element["columns"][2]["column"] = "date"; - element["columns"][2]["value"] = date; - - element["columns"][3]["column"] = "time"; - element["columns"][3]["value"] = llformat("%u", unix_time); - - content["name"] = name; - content["event_id"] = (S32)event_id; - - search_results->addElement(element, ADD_BOTTOM); - std::string event = llformat("%u", event_id); - self->mResultsContent[event] = content; - } - if (found_one) - { - search_results->selectFirstItem(); - search_results->setFocus(TRUE); - self->onSelectItem(); - } -} - -//////////////////////////////////////// -// WebSearch Panel // -//////////////////////////////////////// - -static LLPanelInjector<FSPanelSearchWeb> t_panel_fs_search_web("panel_ls_web"); - -FSPanelSearchWeb::FSPanelSearchWeb() : FSSearchPanelBase() -, mWebBrowser(nullptr) -, mResetFocusOnLoad(false) -{ - // Second Life grids use a different URL format now - mCategoryPaths = LLSD::emptyMap(); - if (LLGridManager::getInstance()->isInSecondlife()) - { - // declare a map that transforms a category name into - // the parameter list that is used to search that category - mCategoryPaths["people"] = "collection_chosen=people"; - mCategoryPaths["places"] = "collection_chosen=places"; - mCategoryPaths["events"] = "collection_chosen=events"; - mCategoryPaths["groups"] = "collection_chosen=groups"; - mCategoryPaths["destinations"] = "collection_chosen=destinations"; - - mCategoryPaths["classifieds"] = "search_type=classified"; - mCategoryPaths["wiki"] = "search/wiki"; // not sure if this is still a thing in the new search - - mCategoryPaths["all"] = mCategoryPaths["people"].asString() + "&" + - mCategoryPaths["places"].asString() + "&" + - mCategoryPaths["events"].asString() + "&" + - mCategoryPaths["groups"].asString() + "&" + - mCategoryPaths["destinations"].asString(); - } - // OpenSim currently still uses the old URL format - else - { - // declare a map that transforms a category name into - // the URL suffix that is used to search that category - mCategoryPaths["all"] = "search"; - mCategoryPaths["people"] = "search/people"; - mCategoryPaths["places"] = "search/places"; - mCategoryPaths["events"] = "search/events"; - mCategoryPaths["groups"] = "search/groups"; - mCategoryPaths["wiki"] = "search/wiki"; - mCategoryPaths["destinations"] = "destinations"; - mCategoryPaths["classifieds"] = "classifieds"; - } -} - -bool FSPanelSearchWeb::postBuild() -{ - mWebBrowser = getChild<LLMediaCtrl>("search_browser"); - return TRUE; -} - -void FSPanelSearchWeb::loadURL(const SearchQuery &p) -{ - if (!mWebBrowser || !p.validateBlock()) - { - return; - } - - // CATEGORY is no longer used as part of the path on Second Life grids - LLSD subs = LLSD().with("CATEGORY", ""); - - // on OpenSim grids it probably is currently still being used, so keep the old behavior - if (!LLGridManager::getInstance()->isInSecondlife()) - { - // work out the subdir to use based on the requested category - LLSD subs = LLSD().with("CATEGORY", (mCategoryPaths.has(p.category.getValue()) ? mCategoryPaths[p.category.getValue()].asString() : mCategoryPaths["all"].asString())); - } - - // add the search query string - subs["QUERY"] = LLURI::escape(p.query.getValue()); - - // add the permissions token that login.cgi gave us - // We use "search_token", and fallback to "auth_token" if not present. - LLSD search_token = LLLoginInstance::getInstance()->getResponse("search_token"); - if (search_token.asString().empty()) - { - search_token = LLLoginInstance::getInstance()->getResponse("auth_token"); - } - subs["AUTH_TOKEN"] = search_token.asString(); - - // add the user's preferred maturity (can be changed via prefs) - std::string maturity; - - // on Second Life grids, the maturity level is now a "&maturity" parameter that's not in the provided search URL - if (LLGridManager::getInstance()->isInSecondlife()) - { - if (gAgent.prefersAdult()) - { - maturity = "gma"; // PG,Mature,Adult - } - else if (gAgent.prefersMature()) - { - maturity = "gm"; // PG,Mature - } - else - { - maturity = "g"; // PG - } - - // not used on the SL search anymore, so clear out the respective parameter - subs["MATURITY"] = ""; - } - // OpenSim probably still uses the old maturity variant, so keep the old behavior here - else - { - if (gAgent.prefersAdult()) - { - maturity = "42"; // PG,Mature,Adult - } - else if (gAgent.prefersMature()) - { - maturity = "21"; // PG,Mature - } - else - { - maturity = "13"; // PG - } - subs["MATURITY"] = maturity; - } - - // add the user's god status - subs["GODLIKE"] = gAgent.isGodlike() ? "1" : "0"; - - // Get the search URL and expand all of the substitutions - // (also adds things like [LANGUAGE], [VERSION], [OS], etc.) - - // add the maturity and category variables to the new Second Life search URL - //std::string url = gAgent.getRegion() != nullptr ? gAgent.getRegion()->getSearchServerURL() : gSavedSettings.getString(LLGridManager::getInstance()->isInOpenSim() ? "OpenSimSearchURL" : "SearchURL"); - - std::string url = gSavedSettings.getString("SearchURL"); - - if (LLGridManager::getInstance()->isInSecondlife()) - { - url.append("&maturity=" + maturity + "&" + mCategoryPaths[p.category.getValue()].asString()); - } - - url = LLWeb::expandURLSubstitutions(url, subs); - - // Finally, load the URL in the webpanel - mWebBrowser->navigateTo(url, HTTP_CONTENT_TEXT_HTML); -} - -void FSPanelSearchWeb::focusDefaultElement() -{ - mWebBrowser->setFocus(TRUE); -} - -void FSPanelSearchWeb::draw() -{ - if (mResetFocusOnLoad) - { - focusDefaultElement(); - mResetFocusOnLoad = false; - } - - FSSearchPanelBase::draw(); -} - -//////////////////////////////////////// -// Local functions // -//////////////////////////////////////// - -std::string filterShortWords(std::string query_string) -{ - if (query_string.length() < 1) - { - return ""; - } - - std::string final_query; - bool filtered = false; - boost::char_separator<char> sep(" "); - boost::tokenizer<boost::char_separator<char> > tokens(query_string, sep); - boost::tokenizer<boost::char_separator<char> >::iterator iter = tokens.begin(); - boost::tokenizer<boost::char_separator<char> >::iterator last = tokens.end(); - boost::tokenizer<boost::char_separator<char> >::iterator temp; - for (; iter != last; ++iter) - { - if ((*iter).length() > MIN_SEARCH_STRING_SIZE) - { - final_query.append((*iter)); - temp = iter; ++temp; - if (temp != last) - { - final_query.append(" "); - } - } - else - { - filtered = true; - } - } - - if (filtered) - { - LLSD args = LLSD().with("FINALQUERY", final_query); - LLNotificationsUtil::add("SeachFilteredOnShortWords", args); - } - - return final_query; -} - -void fillSearchComboBox(LLSearchComboBox* search_combo) -{ - if (search_combo == nullptr) - { - return; - } - - LLSearchHistory::getInstance()->load(); - - LLSearchHistory::search_history_list_t search_list = - LLSearchHistory::getInstance()->getSearchHistoryList(); - LLSearchHistory::search_history_list_t::const_iterator it = search_list.begin(); - for ( ; search_list.end() != it; ++it) - { - LLSearchHistory::LLSearchHistoryItem item = *it; - search_combo->add(item.search_query); - } -} diff --git a/indra/newview/fsfloatersearch.h b/indra/newview/fsfloatersearch.h deleted file mode 100644 index 90e2a8cb89..0000000000 --- a/indra/newview/fsfloatersearch.h +++ /dev/null @@ -1,404 +0,0 @@ -/** - * @file fsfloatersearch.h - * @brief Firestorm search definitions - * - * $LicenseInfo:firstyear=2012&license=fsviewerlgpl$ - * Phoenix Firestorm Viewer Source Code - * Copyright (C) 2012, Cinder Roxley <cinder.roxley@phoenixviewer.com> - * - * 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 - * - * The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA - * http://www.firestormviewer.org - * $/LicenseInfo$ - */ - -#ifndef FS_FLOATERSEARCH_H -#define FS_FLOATERSEARCH_H - -#include "llfloater.h" -#include "lliconctrl.h" -#include "lltexteditor.h" -#include "lltexturectrl.h" -#include "llremoteparcelrequest.h" -#include "llavatarpropertiesprocessor.h" -#include "llgroupmgr.h" -#include "llavatarnamecache.h" -#include "llmediactrl.h" -#include "llradiogroup.h" -#include "llsearchcombobox.h" -#include "llscrolllistctrl.h" -#include "lltabcontainer.h" -#include "lleventnotifier.h" - -class FSSearchRemoteParcelInfoObserver; -class LLAvatarPropertiesObserver; -class LLGroupMgrObserver; -class LLSearchEditor; -class LLSearchComboBox; -class FSFloaterSearch; -class LLPanelProfile; -class FSScrollListCtrl; - -struct SearchQuery : public LLInitParam::Block<SearchQuery> -{ - Optional<std::string> category; - Optional<std::string> query; - - SearchQuery(); -}; - -/////////////////////////////// -// Search Panels // -/////////////////////////////// - -class FSSearchPanelBase : public LLPanel -{ -public: - FSSearchPanelBase() : LLPanel() { } - virtual ~FSSearchPanelBase() = default; - virtual void focusDefaultElement() { } -}; - -class FSPanelSearchPeople : public FSSearchPanelBase -{ - LOG_CLASS(FSFloaterSearch); -public: - FSPanelSearchPeople(); - static void processSearchReply(LLMessageSystem* msg, void**); - - /*virtual*/ void focusDefaultElement(); - -protected: - const S32& getNumResultsReturned() const { return mNumResultsReturned; }; - const S32& getNumResultsReceived() const { return mResultsReceived; }; - -private: - /*virtual*/ bool postBuild(); - virtual ~FSPanelSearchPeople(); - - void onBtnFind(); - void onSelectItem(); - void onBtnNext(); - void onBtnBack(); - - void find(); - void resetSearch(); - S32 showNextButton(S32); - - const LLUUID& getQueryID() const { return mQueryID; } - - void onAvatarNameCallback(const LLUUID& id, const LLAvatarName& av_name); - - typedef boost::signals2::connection avatar_name_callback_connection_t; - avatar_name_callback_connection_t mAvatarNameCallbackConnection; - - S32 mNumResultsReturned; - S32 mStartSearch; - S32 mResultsReceived; - LLSD mResultsContent; - LLUUID mQueryID; - - LLSearchComboBox* mSearchComboBox; - LLScrollListCtrl* mSearchResults; -}; - -class FSPanelSearchGroups : public FSSearchPanelBase -{ - LOG_CLASS(FSFloaterSearch); -public: - FSPanelSearchGroups(); - static void processSearchReply(LLMessageSystem* msg, void**); - - /*virtual*/ void focusDefaultElement(); - -private: - /*virtual*/ bool postBuild(); - virtual ~FSPanelSearchGroups(); - - void onBtnFind(); - void onSelectItem(); - void onBtnNext(); - void onBtnBack(); - - void find(); - void resetSearch(); - S32 showNextButton(S32); - - const LLUUID& getQueryID() const { return mQueryID; } - - S32 mNumResultsReturned; - S32 mStartSearch; - S32 mResultsReceived; - LLSD mResultsContent; - LLUUID mQueryID; - - LLSearchComboBox* mSearchComboBox; - LLScrollListCtrl* mSearchResults; -}; - -class FSPanelSearchPlaces : public FSSearchPanelBase -{ - LOG_CLASS(FSFloaterSearch); -public: - FSPanelSearchPlaces(); - static void processSearchReply(LLMessageSystem* msg, void**); - - /*virtual*/ void focusDefaultElement(); - -private: - /*virtual*/ bool postBuild(); - virtual ~FSPanelSearchPlaces(); - - void onBtnFind(); - void onSelectItem(); - void onBtnNext(); - void onBtnBack(); - - void find(); - void resetSearch(); - S32 showNextButton(S32); - - const LLUUID& getQueryID() const { return mQueryID; } - - S32 mNumResultsReturned; - S32 mStartSearch; - S32 mResultsReceived; - LLSD mResultsContent; - LLUUID mQueryID; - - LLSearchComboBox* mSearchComboBox; - LLScrollListCtrl* mSearchResults; - LLComboBox* mPlacesCategory; -}; - -class FSPanelSearchLand : public FSSearchPanelBase -{ - LOG_CLASS(FSFloaterSearch); -public: - FSPanelSearchLand(); - static void processSearchReply(LLMessageSystem* msg, void**); - -private: - /*virtual*/ bool postBuild(); - virtual ~FSPanelSearchLand(); - - void onBtnFind(); - void onSelectItem(); - void onBtnNext(); - void onBtnBack(); - - void find(); - void resetSearch(); - S32 showNextButton(S32); - - const LLUUID& getQueryID() const { return mQueryID; } - - S32 mNumResultsReturned; - S32 mStartSearch; - S32 mResultsReceived; - LLSD mResultsContent; - LLUUID mQueryID; - - LLLineEditor* mPriceEditor; - LLLineEditor* mAreaEditor; - LLScrollListCtrl* mSearchResults; -}; - -class FSPanelSearchClassifieds : public FSSearchPanelBase -{ - LOG_CLASS(FSFloaterSearch); -public: - FSPanelSearchClassifieds(); - static void processSearchReply(LLMessageSystem* msg, void**); - - /*virtual*/ void focusDefaultElement(); - -private: - /*virtual*/ bool postBuild(); - virtual ~FSPanelSearchClassifieds(); - - void onBtnFind(); - void onSelectItem(); - void onBtnNext(); - void onBtnBack(); - - void find(); - void resetSearch(); - S32 showNextButton(S32); - - const LLUUID& getQueryID() const { return mQueryID; } - - S32 mNumResultsReturned; - S32 mStartSearch; - S32 mResultsReceived; - LLSD mResultsContent; - LLUUID mQueryID; - - LLSearchComboBox* mSearchComboBox; - LLScrollListCtrl* mSearchResults; - LLComboBox* mClassifiedsCategory; -}; - -class FSPanelSearchEvents : public FSSearchPanelBase -{ - LOG_CLASS(FSFloaterSearch); -public: - FSPanelSearchEvents(); - static void processSearchReply(LLMessageSystem* msg, void**); - - /*virtual*/ void focusDefaultElement(); - -private: - /*virtual*/ bool postBuild(); - virtual ~FSPanelSearchEvents(); - - void onBtnFind(); - void onSelectItem(); - void onBtnNext(); - void onBtnBack(); - void onBtnTomorrow(); - void onBtnYesterday(); - void onBtnToday(); - - void find(); - void setDay(S32 day); - void onSearchModeChanged(); - void resetSearch(); - S32 showNextButton(S32); - - const LLUUID& getQueryID() const { return mQueryID; } - - S32 mNumResultsReturned; - S32 mResultsReceived; - S32 mStartSearch; - S32 mDay; - LLSD mResultsContent; - LLUUID mQueryID; - - LLSearchComboBox* mSearchComboBox; - LLScrollListCtrl* mSearchResults; - LLRadioGroup* mEventsMode; -}; - -class FSPanelSearchWeb : public FSSearchPanelBase -{ - LOG_CLASS(FSFloaterSearch); -public: - FSPanelSearchWeb(); - /*virtual*/ bool postBuild(); - void loadURL(const SearchQuery &query); - /*virtual*/ void focusDefaultElement(); - /*virtual*/ void draw(); - void resetFocusOnLoad() { mResetFocusOnLoad = true; } - -private: - virtual ~FSPanelSearchWeb() {}; - - LLMediaCtrl* mWebBrowser; - LLSD mCategoryPaths; - - bool mResetFocusOnLoad; -}; - -class FSFloaterSearch : public LLFloater -{ - LOG_CLASS(FSFloaterSearch); -public: - typedef enum e_search_category - { - SC_AVATAR, - SC_GROUP, - SC_PLACE, - SC_CLASSIFIED - } ESearchCategory; - - struct _Params : public LLInitParam::Block<_Params, LLFloater::Params> - { - Optional<SearchQuery> search; - }; - - typedef LLSDParamAdapter<_Params> Params; - - FSFloaterSearch(const Params& key); - ~FSFloaterSearch(); - void onOpen(const LLSD& key); - bool postBuild(); - - void avatarNameUpdatedCallback(const LLUUID& id, const LLAvatarName& av_name); - void groupNameUpdatedCallback(const LLUUID& id, const std::string& name, bool is_group); - void onSelectedItem(const LLUUID& selected_item, ESearchCategory type); - void onSelectedEvent(const S32 selected_event); - void displayParcelDetails(const LLParcelData& parcel_data); - void displayClassifiedDetails(LLAvatarClassifiedInfo*& c_info); - void displayAvatarDetails(LLAvatarData* avatar_data); - void displayGroupDetails(LLGroupMgrGroupData*& group_data); - bool displayEventDetails(LLEventStruct event); - void displayEventParcelImage(const LLParcelData& parcel_data); - void setLoadingProgress(bool started); - - template <class T> - static T* getSearchPanel(const std::string& panel_name); - -private: - virtual void onClose(bool app_quitting); - const LLUUID& getSelectedID() { return mSelectedID; } - LLVector3d mParcelGlobal; - LLUUID mSelectedID; - U32 mEventID; - bool mHasSelection; - - void resetVerbs(); - void flushDetails(); - void onTabChange(); - void onBtnPeopleProfile(); - void onBtnPeopleIM(); - void onBtnPeopleFriend(); - void onBtnGroupProfile(); - void onBtnGroupChat(); - void onBtnGroupJoin(); - void onBtnEventReminder(); - void onBtnTeleport(); - void onBtnMap(); - - void regionHandleCallback(U64 region_handle, LLVector3d pos_global); - - FSSearchRemoteParcelInfoObserver* mRemoteParcelObserver; - FSSearchRemoteParcelInfoObserver* mRemoteParcelEventLocationObserver; - LLAvatarPropertiesObserver* mAvatarPropertiesObserver; - LLGroupMgrObserver* mGroupPropertiesRequest; - boost::signals2::connection mEventNotifierConnection; - - FSPanelSearchPeople* mPanelPeople; - FSPanelSearchGroups* mPanelGroups; - FSPanelSearchPlaces* mPanelPlaces; - FSPanelSearchEvents* mPanelEvents; - FSPanelSearchLand* mPanelLand; - FSPanelSearchClassifieds* mPanelClassifieds; - FSPanelSearchWeb* mPanelWeb; - - LLPanel* mDetailsPanel; - LLTextEditor* mDetailTitle; - LLTextEditor* mDetailDesc; - LLTextEditor* mDetailAux1; - LLTextEditor* mDetailAux2; - LLTextEditor* mDetailLocation; - LLTextureCtrl* mDetailSnapshot; - LLTextureCtrl* mDetailSnapshotParcel; - LLIconCtrl* mDetailMaturity; - LLTabContainer* mTabContainer; -}; - -#endif // FS_FLOATERSEARCH_H diff --git a/indra/newview/gltf/accessor.cpp b/indra/newview/gltf/accessor.cpp index d1845605d4..f0ad3fa594 100644 --- a/indra/newview/gltf/accessor.cpp +++ b/indra/newview/gltf/accessor.cpp @@ -158,8 +158,13 @@ bool Buffer::prep(Asset& asset) { std::string dir = gDirUtilp->getDirName(asset.mFilename); std::string bin_file = dir + gDirUtilp->getDirDelimiter() + mUri; + if (!gDirUtilp->fileExists(bin_file)) + { + // Characters might be escaped in the URI + bin_file = dir + gDirUtilp->getDirDelimiter() + LLURI::unescape(mUri); + } - std::ifstream file(bin_file, std::ios::binary); + llifstream file(bin_file.c_str(), std::ios::binary); if (!file.is_open()) { LL_WARNS("GLTF") << "Failed to open file: " << bin_file << LL_ENDL; diff --git a/indra/newview/gltf/asset.cpp b/indra/newview/gltf/asset.cpp index a399a59f40..a2f9cd2852 100644 --- a/indra/newview/gltf/asset.cpp +++ b/indra/newview/gltf/asset.cpp @@ -33,10 +33,11 @@ #include "../llviewertexturelist.h" #include "../pipeline.h" #include "buffer_util.h" -#include <boost/url.hpp> #include "llimagejpeg.h" #include "../llskinningutil.h" +#include <future> + using namespace LL::GLTF; using namespace boost::json; @@ -50,6 +51,10 @@ namespace LL "KHR_texture_transform" }; + static std::unordered_set<std::string> ExtensionsIgnored = { + "KHR_materials_pbrSpecularGlossiness" + }; + Material::AlphaMode gltf_alpha_mode_to_enum(const std::string& alpha_mode) { if (alpha_mode == "OPAQUE") @@ -472,11 +477,14 @@ void Asset::update() for (auto& image : mImages) { - if (image.mTexture.notNull()) - { // HACK - force texture to be loaded full rez - // TODO: calculate actual vsize - image.mTexture->addTextureStats(2048.f * 2048.f); - image.mTexture->setBoostLevel(LLViewerTexture::BOOST_HIGH); + if (image.mLoadIntoTexturePipe) + { + if (image.mTexture.notNull()) + { // HACK - force texture to be loaded full rez + // TODO: calculate actual vsize + image.mTexture->addTextureStats(2048.f * 2048.f); + image.mTexture->setBoostLevel(LLViewerTexture::BOOST_HIGH); + } } } } @@ -486,18 +494,23 @@ void Asset::update() bool Asset::prep() { LL_PROFILE_ZONE_SCOPED_CATEGORY_GLTF; - // check required extensions and fail if not supported - bool unsupported = false; + // check required extensions for (auto& extension : mExtensionsRequired) { if (ExtensionsSupported.find(extension) == ExtensionsSupported.end()) { - LL_WARNS() << "Unsupported extension: " << extension << LL_ENDL; - unsupported = true; + if (ExtensionsIgnored.find(extension) == ExtensionsIgnored.end()) + { + LL_WARNS() << "Unsupported extension: " << extension << LL_ENDL; + mUnsupportedExtensions.push_back(extension); + } + else + { + mIgnoredExtensions.push_back(extension); + } } } - - if (unsupported) + if (mUnsupportedExtensions.size() > 0) { return false; } @@ -513,7 +526,7 @@ bool Asset::prep() for (auto& image : mImages) { - if (!image.prep(*this)) + if (!image.prep(*this, mLoadIntoVRAM)) { return false; } @@ -542,102 +555,110 @@ bool Asset::prep() return false; } } + if (mLoadIntoVRAM) + { + // prepare vertex buffers - // prepare vertex buffers - - // material count is number of materials + 1 for default material - U32 mat_count = (U32) mMaterials.size() + 1; - - if (LLGLSLShader::sCurBoundShaderPtr == nullptr) - { // make sure a shader is bound to satisfy mVertexBuffer->setBuffer - gDebugProgram.bind(); - } + // material count is number of materials + 1 for default material + U32 mat_count = (U32) mMaterials.size() + 1; - for (S32 double_sided = 0; double_sided < 2; ++double_sided) - { - RenderData& rd = mRenderData[double_sided]; - for (U32 i = 0; i < LLGLSLShader::NUM_GLTF_VARIANTS; ++i) - { - rd.mBatches[i].resize(mat_count); + if (LLGLSLShader::sCurBoundShaderPtr == nullptr) + { // make sure a shader is bound to satisfy mVertexBuffer->setBuffer + gDebugProgram.bind(); } - // for each material - for (S32 mat_id = -1; mat_id < (S32)mMaterials.size(); ++mat_id) + for (S32 double_sided = 0; double_sided < 2; ++double_sided) { - // for each shader variant - U32 vertex_count[LLGLSLShader::NUM_GLTF_VARIANTS] = { 0 }; - U32 index_count[LLGLSLShader::NUM_GLTF_VARIANTS] = { 0 }; - - S32 ds_mat = mat_id == -1 ? 0 : mMaterials[mat_id].mDoubleSided; - if (ds_mat != double_sided) + RenderData& rd = mRenderData[double_sided]; + for (U32 i = 0; i < LLGLSLShader::NUM_GLTF_VARIANTS; ++i) { - continue; + rd.mBatches[i].resize(mat_count); } - for (U32 variant = 0; variant < LLGLSLShader::NUM_GLTF_VARIANTS; ++variant) + // for each material + for (S32 mat_id = -1; mat_id < (S32)mMaterials.size(); ++mat_id) { - U32 attribute_mask = 0; - // for each mesh - for (auto& mesh : mMeshes) + // for each shader variant + U32 vertex_count[LLGLSLShader::NUM_GLTF_VARIANTS] = { 0 }; + U32 index_count[LLGLSLShader::NUM_GLTF_VARIANTS] = { 0 }; + + S32 ds_mat = mat_id == -1 ? 0 : mMaterials[mat_id].mDoubleSided; + if (ds_mat != double_sided) + { + continue; + } + + for (U32 variant = 0; variant < LLGLSLShader::NUM_GLTF_VARIANTS; ++variant) { - // for each primitive - for (auto& primitive : mesh.mPrimitives) +#ifdef SHOW_ASSERT + U32 attribute_mask = 0; +#endif + // for each mesh + for (auto& mesh : mMeshes) { - if (primitive.mMaterial == mat_id && primitive.mShaderVariant == variant) + // for each primitive + for (auto& primitive : mesh.mPrimitives) { - // accumulate vertex and index counts - primitive.mVertexOffset = vertex_count[variant]; - primitive.mIndexOffset = index_count[variant]; + if (primitive.mMaterial == mat_id && primitive.mShaderVariant == variant) + { + // accumulate vertex and index counts + primitive.mVertexOffset = vertex_count[variant]; + primitive.mIndexOffset = index_count[variant]; - vertex_count[variant] += primitive.getVertexCount(); - index_count[variant] += primitive.getIndexCount(); + vertex_count[variant] += primitive.getVertexCount(); + index_count[variant] += primitive.getIndexCount(); - // all primitives of a given variant and material should all have the same attribute mask - llassert(attribute_mask == 0 || primitive.mAttributeMask == attribute_mask); - attribute_mask |= primitive.mAttributeMask; + // all primitives of a given variant and material should all have the same attribute mask + llassert(attribute_mask == 0 || primitive.mAttributeMask == attribute_mask); +#ifdef SHOW_ASSERT + attribute_mask |= primitive.mAttributeMask; +#endif + } } } - } - // allocate vertex buffer and pack it - if (vertex_count[variant] > 0) - { - U32 mat_idx = mat_id + 1; - LLVertexBuffer* vb = new LLVertexBuffer(attribute_mask); + // allocate vertex buffer and pack it + if (vertex_count[variant] > 0) + { + U32 mat_idx = mat_id + 1; + #if 0 + LLVertexBuffer* vb = new LLVertexBuffer(attribute_mask); - rd.mBatches[variant][mat_idx].mVertexBuffer = vb; - vb->allocateBuffer(vertex_count[variant], - index_count[variant] * 2); // hack double index count... TODO: find a better way to indicate 32-bit indices will be used - vb->setBuffer(); + rd.mBatches[variant][mat_idx].mVertexBuffer = vb; + vb->allocateBuffer(vertex_count[variant], + index_count[variant] * 2); // hack double index count... TODO: find a better way to indicate 32-bit indices will be used + vb->setBuffer(); - for (auto& mesh : mMeshes) - { - for (auto& primitive : mesh.mPrimitives) + for (auto& mesh : mMeshes) { - if (primitive.mMaterial == mat_id && primitive.mShaderVariant == variant) + for (auto& primitive : mesh.mPrimitives) { - primitive.upload(vb); + if (primitive.mMaterial == mat_id && primitive.mShaderVariant == variant) + { + primitive.upload(vb); + } } } - } - vb->unmapBuffer(); + vb->unmapBuffer(); - vb->unbind(); + vb->unbind(); + #endif + } } } } - } - // sanity check that all primitives have a vertex buffer - for (auto& mesh : mMeshes) - { - for (auto& primitive : mesh.mPrimitives) + // sanity check that all primitives have a vertex buffer + for (auto& mesh : mMeshes) { - llassert(primitive.mVertexBuffer.notNull()); + for (auto& primitive : mesh.mPrimitives) + { + //llassert(primitive.mVertexBuffer.notNull()); + } } } - + #if 0 // build render batches for (S32 node_id = 0; node_id < mNodes.size(); ++node_id) { @@ -664,6 +685,7 @@ bool Asset::prep() } } } + #endif return true; } @@ -672,13 +694,14 @@ Asset::Asset(const Value& src) *this = src; } -bool Asset::load(std::string_view filename) +bool Asset::load(std::string_view filename, bool loadIntoVRAM) { LL_PROFILE_ZONE_SCOPED_CATEGORY_GLTF; + mLoadIntoVRAM = loadIntoVRAM; mFilename = filename; std::string ext = gDirUtilp->getExtension(mFilename); - std::ifstream file(filename.data(), std::ios::binary); + llifstream file(filename.data(), std::ios::binary); if (file.is_open()) { std::string str((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>()); @@ -692,7 +715,7 @@ bool Asset::load(std::string_view filename) } else if (ext == "glb") { - return loadBinary(str); + return loadBinary(str, mLoadIntoVRAM); } else { @@ -709,8 +732,9 @@ bool Asset::load(std::string_view filename) return false; } -bool Asset::loadBinary(const std::string& data) +bool Asset::loadBinary(const std::string& data, bool loadIntoVRAM) { + mLoadIntoVRAM = loadIntoVRAM; // load from binary gltf const U8* ptr = (const U8*)data.data(); const U8* end = ptr + data.size(); @@ -935,11 +959,44 @@ void Asset::eraseBufferView(S32 bufferView) LLViewerFetchedTexture* fetch_texture(const LLUUID& id); -bool Image::prep(Asset& asset) +bool Image::prep(Asset& asset, bool loadIntoVRAM) { + mLoadIntoTexturePipe = loadIntoVRAM; + LLUUID id; if (mUri.size() == UUID_STR_SIZE && LLUUID::parseUUID(mUri, &id) && id.notNull()) { // loaded from an asset, fetch the texture from the asset system + LL_DEBUGS("GLTF") << "Loading image from an id" << id<< LL_ENDL; + } + else if (mUri.find("data:") == 0) + { // embedded in a data URI, load the texture from the URI + LL_WARNS("GLTF") << "Data URIs not yet supported" << LL_ENDL; + return false; + } + + // Image::prepImpl containes code that must run on the main thread + std::promise<bool> prep_promise; + std::future<bool> prep_future = prep_promise.get_future(); + + LLAppViewer::instance()->postToMainCoro([this, &asset, id, &prep_promise]() mutable { + try { + bool result = prepImpl(asset, id); + prep_promise.set_value(result); + } + catch (...) { + // Propagate exception to the waiting thread + prep_promise.set_exception(std::current_exception()); + } + }); + + // Block until prep is done on the main thread + return prep_future.get(); +} + +bool Image::prepImpl(Asset& asset, const LLUUID& id) +{ + if (id.notNull()) + { // loaded from an asset, fetch the texture from the asset system mTexture = fetch_texture(id); } else if (mUri.find("data:") == 0) @@ -951,12 +1008,12 @@ bool Image::prep(Asset& asset) { // embedded in a buffer, load the texture from the buffer BufferView& bufferView = asset.mBufferViews[mBufferView]; Buffer& buffer = asset.mBuffers[bufferView.mBuffer]; - - U8* data = buffer.mData.data() + bufferView.mByteOffset; - - mTexture = LLViewerTextureManager::getFetchedTextureFromMemory(data, bufferView.mByteLength, mMimeType); - - if (mTexture.isNull()) + if (mLoadIntoTexturePipe) + { + U8* data = buffer.mData.data() + bufferView.mByteOffset; + mTexture = LLViewerTextureManager::getFetchedTextureFromMemory(data, bufferView.mByteLength, mMimeType); + } + else if (mTexture.isNull() && mLoadIntoTexturePipe) { LL_WARNS("GLTF") << "Failed to load image from buffer:" << LL_ENDL; LL_WARNS("GLTF") << " image: " << mName << LL_ENDL; @@ -971,12 +1028,12 @@ bool Image::prep(Asset& asset) std::string img_file = dir + gDirUtilp->getDirDelimiter() + mUri; LLUUID tracking_id = LLLocalBitmapMgr::getInstance()->addUnit(img_file); - if (tracking_id.notNull()) + if (tracking_id.notNull() && mLoadIntoTexturePipe) { LLUUID world_id = LLLocalBitmapMgr::getInstance()->getWorldID(tracking_id); mTexture = LLViewerTextureManager::getFetchedTexture(world_id); } - else + else if (mLoadIntoTexturePipe) { LL_WARNS("GLTF") << "Failed to load image from file:" << LL_ENDL; LL_WARNS("GLTF") << " image: " << mName << LL_ENDL; @@ -991,7 +1048,7 @@ bool Image::prep(Asset& asset) return false; } - if (!asset.mFilename.empty()) + if (!asset.mFilename.empty() && mLoadIntoTexturePipe) { // local preview, boost image so it doesn't discard and force to save raw image in case we save out or upload mTexture->setBoostLevel(LLViewerTexture::BOOST_PREVIEW); mTexture->forceToSaveRawImage(0, F32_MAX); diff --git a/indra/newview/gltf/asset.h b/indra/newview/gltf/asset.h index 27821659db..2802664ed3 100644 --- a/indra/newview/gltf/asset.h +++ b/indra/newview/gltf/asset.h @@ -286,6 +286,7 @@ namespace LL void serialize(boost::json::object& dst) const; }; + // Image is for images that we want to load for the given asset. This acts as an interface into the viewer's texture pipe. class Image { public: @@ -301,6 +302,8 @@ namespace LL S32 mBits = -1; S32 mPixelType = -1; + bool mLoadIntoTexturePipe = false; + LLPointer<LLViewerFetchedTexture> mTexture; const Image& operator=(const Value& src); @@ -316,7 +319,9 @@ namespace LL // preserve only uri and name void clearData(Asset& asset); - bool prep(Asset& asset); + bool prep(Asset& asset, bool loadIntoVRAM); + private: + bool prepImpl(Asset& asset, const LLUUID& id); }; // Render Batch -- vertex buffer and list of primitives to render using @@ -391,6 +396,10 @@ namespace LL // UBO for storing material data U32 mMaterialsUBO = 0; + bool mLoadIntoVRAM = false; + + std::vector<std::string> mUnsupportedExtensions; + std::vector<std::string> mIgnoredExtensions; // prepare for first time use bool prep(); @@ -428,12 +437,12 @@ namespace LL // accepts .gltf and .glb files // Any existing data will be lost // returns result of prep() on success - bool load(std::string_view filename); + bool load(std::string_view filename, bool loadIntoVRAM); // load .glb contents from memory // data - binary contents of .glb file // returns result of prep() on success - bool loadBinary(const std::string& data); + bool loadBinary(const std::string& data, bool loadIntoVRAM); const Asset& operator=(const Value& src); void serialize(boost::json::object& dst) const; diff --git a/indra/newview/gltf/buffer_util.h b/indra/newview/gltf/buffer_util.h index ef9bba8128..c231443a9e 100644 --- a/indra/newview/gltf/buffer_util.h +++ b/indra/newview/gltf/buffer_util.h @@ -147,6 +147,12 @@ namespace LL } template<> + inline void copyVec3<F32, LLVector2>(F32* src, LLVector2& dst) + { + dst.set(src[0], src[1]); + } + + template<> inline void copyVec3<F32, vec3>(F32* src, vec3& dst) { dst = vec3(src[0], src[1], src[2]); @@ -159,6 +165,12 @@ namespace LL } template<> + inline void copyVec3<F32, LLColor4U>(F32* src, LLColor4U& dst) + { + dst.set((U8)(src[0] * 255.f), (U8)(src[1] * 255.f), (U8)(src[2] * 255.f), 255); + } + + template<> inline void copyVec3<U16, LLColor4U>(U16* src, LLColor4U& dst) { dst.set((U8)(src[0]), (U8)(src[1]), (U8)(src[2]), 255); @@ -369,7 +381,18 @@ namespace LL template<class T> inline void copy(Asset& asset, Accessor& accessor, LLStrider<T>& dst) { + if (accessor.mBufferView == INVALID_INDEX + || accessor.mBufferView >= asset.mBufferViews.size()) + { + LL_WARNS("GLTF") << "Invalid buffer" << LL_ENDL; + return; + } const BufferView& bufferView = asset.mBufferViews[accessor.mBufferView]; + if (bufferView.mBuffer >= asset.mBuffers.size()) + { + LL_WARNS("GLTF") << "Invalid buffer view" << LL_ENDL; + return; + } const Buffer& buffer = asset.mBuffers[bufferView.mBuffer]; const U8* src = buffer.mData.data() + bufferView.mByteOffset + accessor.mByteOffset; diff --git a/indra/newview/gltf/common.h b/indra/newview/gltf/common.h index 742daff715..8cf3f1dff7 100644 --- a/indra/newview/gltf/common.h +++ b/indra/newview/gltf/common.h @@ -26,8 +26,6 @@ * $/LicenseInfo$ */ -#define GLM_ENABLE_EXPERIMENTAL 1 - #include "glm/vec2.hpp" #include "glm/vec3.hpp" #include "glm/vec4.hpp" diff --git a/indra/newview/gltf/llgltfloader.cpp b/indra/newview/gltf/llgltfloader.cpp new file mode 100644 index 0000000000..3a1d8079a9 --- /dev/null +++ b/indra/newview/gltf/llgltfloader.cpp @@ -0,0 +1,1840 @@ +/** + * @file LLGLTFLoader.cpp + * @brief LLGLTFLoader class implementation + * + * $LicenseInfo:firstyear=2022&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2022, 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 "llgltfloader.h" +#include "meshoptimizer.h" +#include <glm/gtc/packing.hpp> + +// Import & define single-header gltf import/export lib +#define TINYGLTF_IMPLEMENTATION +#define TINYGLTF_USE_CPP14 // default is C++ 11 + +// tinygltf by default loads image files using STB +#define STB_IMAGE_IMPLEMENTATION +// to use our own image loading: +// 1. replace this definition with TINYGLTF_NO_STB_IMAGE +// 2. provide image loader callback with TinyGLTF::SetImageLoader(LoadimageDataFunction LoadImageData, void *user_data) + +// tinygltf saves image files using STB +#define STB_IMAGE_WRITE_IMPLEMENTATION +// similarly, can override with TINYGLTF_NO_STB_IMAGE_WRITE and TinyGLTF::SetImageWriter(fxn, data) + +// Additionally, disable inclusion of STB header files entirely with +// TINYGLTF_NO_INCLUDE_STB_IMAGE +// TINYGLTF_NO_INCLUDE_STB_IMAGE_WRITE +#include "tinygltf/tiny_gltf.h" + + +// TODO: includes inherited from dae loader. Validate / prune + +#include "llsdserialize.h" +#include "lljoint.h" +#include "llbase64.h" +#include "lldir.h" + +#include "llmatrix4a.h" + +#include <boost/regex.hpp> +#include <boost/algorithm/string/replace.hpp> +#include <boost/exception/diagnostic_information.hpp> +#include <fstream> + +static const std::string lod_suffix[LLModel::NUM_LODS] = +{ + "_LOD0", + "_LOD1", + "_LOD2", + "", + "_PHYS", +}; + +// Premade rotation matrix, GLTF is Y-up while SL is Z-up +static const glm::mat4 coord_system_rotation( + 1.f, 0.f, 0.f, 0.f, + 0.f, 0.f, 1.f, 0.f, + 0.f, -1.f, 0.f, 0.f, + 0.f, 0.f, 0.f, 1.f +); + + +static const glm::mat4 coord_system_rotationxy( + 0.f, 1.f, 0.f, 0.f, + -1.f, 0.f, 0.f, 0.f, + 0.f, 0.f, 1.f, 0.f, + 0.f, 0.f, 0.f, 1.f +); + +static const S32 VERTEX_SPLIT_SAFETY_MARGIN = 3 * 3 + 1; // 10 vertices: 3 complete triangles plus remapping overhead +static const S32 VERTEX_LIMIT = USHRT_MAX - VERTEX_SPLIT_SAFETY_MARGIN; + +LLGLTFLoader::LLGLTFLoader(std::string filename, + S32 lod, + LLModelLoader::load_callback_t load_cb, + LLModelLoader::joint_lookup_func_t joint_lookup_func, + LLModelLoader::texture_load_func_t texture_load_func, + LLModelLoader::state_callback_t state_cb, + void * opaque_userdata, + JointTransformMap & jointTransformMap, + JointNameSet & jointsFromNodes, + std::map<std::string, std::string, std::less<>> & jointAliasMap, + U32 maxJointsPerMesh, + U32 modelLimit, + U32 debugMode, + std::vector<LLJointData> viewer_skeleton) //, + //bool preprocess) + : LLModelLoader( filename, + lod, + load_cb, + joint_lookup_func, + texture_load_func, + state_cb, + opaque_userdata, + jointTransformMap, + jointsFromNodes, + jointAliasMap, + maxJointsPerMesh, + modelLimit, + debugMode) + , mViewerJointData(viewer_skeleton) + , mGltfLoaded(false) + , mApplyXYRotation(false) +{ +} + +LLGLTFLoader::~LLGLTFLoader() {} + +bool LLGLTFLoader::OpenFile(const std::string &filename) +{ + // Clear the material cache for new file + mMaterialCache.clear(); + + tinygltf::TinyGLTF loader; + std::string filename_lc(filename); + LLStringUtil::toLower(filename_lc); + + try + { + mGltfLoaded = mGLTFAsset.load(filename, false); + } + catch (const std::exception& e) + { + LL_WARNS() << "Exception in LLModelLoader::run: " << e.what() << LL_ENDL; + LLSD args; + args["Message"] = "ParsingErrorException"; + args["FILENAME"] = filename; + args["EXCEPTION"] = e.what(); + mWarningsArray.append(args); + setLoadState(ERROR_PARSING); + return false; + } + catch (...) + { + LOG_UNHANDLED_EXCEPTION("LLGLTFLoader"); + LLSD args; + args["Message"] = "ParsingErrorException"; + args["FILENAME"] = filename; + args["EXCEPTION"] = boost::current_exception_diagnostic_information(); + mWarningsArray.append(args); + setLoadState(ERROR_PARSING); + return false; + } + + if (!mGltfLoaded) + { + notifyUnsupportedExtension(true); + + for (const auto& buffer : mGLTFAsset.mBuffers) + { + if (buffer.mByteLength > 0 && buffer.mData.empty()) + { + bool bin_file = buffer.mUri.ends_with(".bin"); + LLSD args; + args["Message"] = bin_file ? "ParsingErrorMissingBufferBin" : "ParsingErrorMissingBuffer"; + args["BUFFER_NAME"] = buffer.mName; + args["BUFFER_URI"] = buffer.mUri; + mWarningsArray.append(args); + } + } + setLoadState(ERROR_PARSING); + return false; + } + + notifyUnsupportedExtension(false); + + bool meshesLoaded = parseMeshes(); + + setLoadState(DONE); + + return meshesLoaded; +} + +void LLGLTFLoader::addModelToScene( + LLModel* pModel, + const std::string& model_name, + U32 submodel_limit, + const LLMatrix4& transformation, + const LLVolumeParams& volume_params, + const material_map& mats) +{ + U32 volume_faces = pModel->getNumVolumeFaces(); + + // Side-steps all manner of issues when splitting models + // and matching lower LOD materials to base models + // + pModel->sortVolumeFacesByMaterialName(); + + int submodelID = 0; + + // remove all faces that definitely won't fit into one model and submodel limit + U32 face_limit = (submodel_limit + 1) * LL_SCULPT_MESH_MAX_FACES; + if (face_limit < volume_faces) + { + LL_WARNS("GLTF_IMPORT") << "Model contains " << volume_faces + << " faces, exceeding the limit of " << face_limit << LL_ENDL; + + LLSD args; + args["Message"] = "ModelTooManySubmodels"; + args["MODEL_NAME"] = pModel->mLabel; + args["SUBMODEL_COUNT"] = static_cast<S32>(llfloor((F32)volume_faces / LL_SCULPT_MESH_MAX_FACES)); + args["SUBMODEL_LIMIT"] = static_cast<S32>(submodel_limit); + mWarningsArray.append(args); + + pModel->setNumVolumeFaces(face_limit); + } + + LLVolume::face_list_t remainder; + std::vector<LLModel*> ready_models; + LLModel* current_model = pModel; + + do + { + current_model->trimVolumeFacesToSize(LL_SCULPT_MESH_MAX_FACES, &remainder); + + volume_faces = static_cast<U32>(remainder.size()); + + // Don't add to scene yet because weights and materials aren't ready. + // Just save it + ready_models.push_back(current_model); + + // If we have left-over volume faces, create another model + // to absorb them. + if (volume_faces) + { + LLModel* next = new LLModel(volume_params, 0.f); + next->ClearFacesAndMaterials(); + next->mSubmodelID = ++submodelID; + + std::string instance_name = model_name; + if (next->mSubmodelID > 0) + { + instance_name += (char)((int)'a' + next->mSubmodelID); + } + // Check for duplicates and add copy suffix if needed + int duplicate_count = 0; + for (const auto& inst : mScene[transformation]) + { + if (inst.mLabel == instance_name) + { + ++duplicate_count; + } + } + if (duplicate_count > 0) { + instance_name += "_copy_" + std::to_string(duplicate_count); + } + next->mLabel = instance_name; + + next->getVolumeFaces() = remainder; + next->mNormalizedScale = current_model->mNormalizedScale; + next->mNormalizedTranslation = current_model->mNormalizedTranslation; + next->mSkinWeights = current_model->mSkinWeights; + next->mPosition = current_model->mPosition; + + const LLMeshSkinInfo& current_skin_info = current_model->mSkinInfo; + LLMeshSkinInfo& next_skin_info = next->mSkinInfo; + next_skin_info.mJointNames = current_skin_info.mJointNames; + next_skin_info.mJointNums = current_skin_info.mJointNums; + next_skin_info.mBindShapeMatrix = current_skin_info.mBindShapeMatrix; + next_skin_info.mInvBindMatrix = current_skin_info.mInvBindMatrix; + next_skin_info.mAlternateBindMatrix = current_skin_info.mAlternateBindMatrix; + next_skin_info.mPelvisOffset = current_skin_info.mPelvisOffset; + + + if (current_model->mMaterialList.size() > LL_SCULPT_MESH_MAX_FACES) + { + next->mMaterialList.assign(current_model->mMaterialList.begin() + LL_SCULPT_MESH_MAX_FACES, current_model->mMaterialList.end()); + current_model->mMaterialList.resize(LL_SCULPT_MESH_MAX_FACES); + } + + current_model = next; + } + + remainder.clear(); + + } while (volume_faces); + + for (auto model : ready_models) + { + // remove unused/redundant vertices + model->remapVolumeFaces(); + + mModelList.push_back(model); + + std::map<std::string, LLImportMaterial> materials; + for (U32 i = 0; i < (U32)model->mMaterialList.size(); ++i) + { + material_map::const_iterator found = mats.find(model->mMaterialList[i]); + if (found != mats.end()) + { + materials[model->mMaterialList[i]] = found->second; + } + else + { + materials[model->mMaterialList[i]] = LLImportMaterial(); + } + } + // Keep base name for scene instance. + std::string instance_name = model->mLabel; + // Add suffix. Suffix is nessesary for model matching logic + // because sometimes higher lod can be used as a lower one, so models + // need unique names not just in scope of one lod, but across lods. + model->mLabel += lod_suffix[mLod]; + mScene[transformation].push_back(LLModelInstance(model, instance_name, transformation, materials)); + stretch_extents(model, transformation); + } +} + +bool LLGLTFLoader::parseMeshes() +{ + if (!mGltfLoaded) return false; + + // 2022-04 DJH Volume params from dae example. TODO understand PCODE + LLVolumeParams volume_params; + volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE); + + mTransform.setIdentity(); + + for (auto& node : mGLTFAsset.mNodes) + { + // Make node matrix valid for correct transformation + node.makeMatrixValid(); + } + + if (mGLTFAsset.mSkins.size() > 0) + { + checkForXYrotation(mGLTFAsset.mSkins[0]); + populateJointGroups(); + } + + // Populate the joints from skins first. + // Multiple meshes can share the same skin, so preparing skins beforehand. + for (S32 i = 0; i < mGLTFAsset.mSkins.size(); i++) + { + populateJointsFromSkin(i); + } + + // Track how many times each mesh name has been used + std::map<std::string, S32> mesh_name_counts; + + // For now use mesh count, but might be better to do 'mNodes.size() - joints count'. + U32 submodel_limit = mGLTFAsset.mMeshes.size() > 0 ? mGeneratedModelLimit / (U32)mGLTFAsset.mMeshes.size() : 0; + + // Check if we have scenes defined + if (!mGLTFAsset.mScenes.empty()) + { + // Process the default scene (or first scene if no default) + S32 scene_idx = mGLTFAsset.mScene >= 0 ? mGLTFAsset.mScene : 0; + + if (scene_idx < mGLTFAsset.mScenes.size()) + { + const LL::GLTF::Scene& scene = mGLTFAsset.mScenes[scene_idx]; + + LL_INFOS("GLTF_IMPORT") << "Processing scene " << scene_idx << " with " << scene.mNodes.size() << " root nodes" << LL_ENDL; + + // Process all root nodes defined in the scene + for (S32 root_idx : scene.mNodes) + { + if (root_idx >= 0 && root_idx < static_cast<S32>(mGLTFAsset.mNodes.size())) + { + processNodeHierarchy(root_idx, mesh_name_counts, submodel_limit, volume_params); + } + } + } + } + else + { + LL_WARNS("GLTF_IMPORT") << "No scenes defined in GLTF file" << LL_ENDL; + + LLSD args; + args["Message"] = "NoScenesFound"; + mWarningsArray.append(args); + return false; + } + + checkGlobalJointUsage(); + + return true; +} + +void LLGLTFLoader::processNodeHierarchy(S32 node_idx, std::map<std::string, S32>& mesh_name_counts, U32 submodel_limit, const LLVolumeParams& volume_params) +{ + if (node_idx < 0 || node_idx >= static_cast<S32>(mGLTFAsset.mNodes.size())) + return; + + const LL::GLTF::Node& node = mGLTFAsset.mNodes[node_idx]; + + LL_DEBUGS("GLTF_IMPORT") << "Processing node " << node_idx << " (" << node.mName << ")" + << " - has mesh: " << (node.mMesh >= 0 ? "yes" : "no") + << " - children: " << node.mChildren.size() << LL_ENDL; + + // Process this node's mesh if it has one + if (node.mMesh >= 0 && node.mMesh < mGLTFAsset.mMeshes.size()) + { + // Get base node name and track usage + // Potentially multiple nodes can reuse the same mesh and Collada used + // node name instead of mesh name, so for consistency use node name if + // avaliable, node index otherwise. + std::string base_name = getLodlessLabel(node); + if (base_name.empty()) + { + base_name = "node_" + std::to_string(node_idx); + } + + S32 instance_count = mesh_name_counts[base_name]++; + + // make name unique + if (instance_count > 0) + { + base_name = base_name + "_copy_" + std::to_string(instance_count); + } + + LLMatrix4 transformation; + material_map mats; + + LLModel* pModel = new LLModel(volume_params, 0.f); + const LL::GLTF::Mesh& mesh = mGLTFAsset.mMeshes[node.mMesh]; + + if (populateModelFromMesh(pModel, base_name, mesh, node, mats) && + (LLModel::NO_ERRORS == pModel->getStatus()) && + validate_model(pModel)) + { + mTransform.setIdentity(); + transformation = mTransform; + + // adjust the transformation to compensate for mesh normalization + LLVector3 mesh_scale_vector; + LLVector3 mesh_translation_vector; + pModel->getNormalizedScaleTranslation(mesh_scale_vector, mesh_translation_vector); + + LLMatrix4 mesh_translation; + mesh_translation.setTranslation(mesh_translation_vector); + mesh_translation *= transformation; + transformation = mesh_translation; + + LLMatrix4 mesh_scale; + mesh_scale.initScale(mesh_scale_vector); + mesh_scale *= transformation; + transformation = mesh_scale; + + if (node.mSkin >= 0) + { + // "Bind Shape Matrix" is supposed to transform the geometry of the skinned mesh + // into the coordinate space of the joints. + // In GLTF, this matrix is omitted, and it is assumed that this transform is either + // premultiplied with the mesh data, or postmultiplied to the inverse bind matrices. + // + // TODO: There appears to be missing rotation when joints rotate the model + // or inverted bind matrices are missing inherited rotation + // (based of values the 'bento shoes' mesh might be missing 90 degrees horizontaly + // prior to skinning) + + pModel->mSkinInfo.mBindShapeMatrix.loadu(mesh_scale); + LL_INFOS("GLTF_DEBUG") << "Model: " << pModel->mLabel << " mBindShapeMatrix: " << pModel->mSkinInfo.mBindShapeMatrix << LL_ENDL; + } + + if (transformation.determinant() < 0) + { // negative scales are not supported + LL_INFOS("GLTF_IMPORT") << "Negative scale detected, unsupported post-normalization transform. domInstance_geometry: " + << pModel->mLabel << LL_ENDL; + LLSD args; + args["Message"] = "NegativeScaleNormTrans"; + args["LABEL"] = pModel->mLabel; + mWarningsArray.append(args); + } + + addModelToScene(pModel, base_name, submodel_limit, transformation, volume_params, mats); + mats.clear(); + } + else + { + setLoadState(ERROR_MODEL + pModel->getStatus()); + delete pModel; + return; + } + } + else if (node.mMesh >= 0) + { + // Log invalid mesh reference + LL_WARNS("GLTF_IMPORT") << "Node " << node_idx << " (" << node.mName + << ") references invalid mesh " << node.mMesh + << " (total meshes: " << mGLTFAsset.mMeshes.size() << ")" << LL_ENDL; + + LLSD args; + args["Message"] = "InvalidMeshReference"; + args["NODE_NAME"] = node.mName; + args["MESH_INDEX"] = node.mMesh; + args["TOTAL_MESHES"] = static_cast<S32>(mGLTFAsset.mMeshes.size()); + mWarningsArray.append(args); + } + + // Process all children recursively + for (S32 child_idx : node.mChildren) + { + processNodeHierarchy(child_idx, mesh_name_counts, submodel_limit, volume_params); + } +} + +void LLGLTFLoader::computeCombinedNodeTransform(const LL::GLTF::Asset& asset, S32 node_index, glm::mat4& combined_transform) const +{ + if (node_index < 0 || node_index >= static_cast<S32>(asset.mNodes.size())) + { + combined_transform = glm::mat4(1.0f); + return; + } + + const auto& node = asset.mNodes[node_index]; + + // Ensure the node's matrix is valid + const_cast<LL::GLTF::Node&>(node).makeMatrixValid(); + + // Start with this node's transform + combined_transform = node.mMatrix; + + // Find and apply parent transform if it exists + for (size_t i = 0; i < asset.mNodes.size(); ++i) + { + const auto& potential_parent = asset.mNodes[i]; + auto it = std::find(potential_parent.mChildren.begin(), potential_parent.mChildren.end(), node_index); + + if (it != potential_parent.mChildren.end()) + { + // Found parent - recursively get its combined transform and apply it + glm::mat4 parent_transform; + computeCombinedNodeTransform(asset, static_cast<S32>(i), parent_transform); + combined_transform = parent_transform * combined_transform; + return; // Early exit - a node can only have one parent + } + } +} + +bool LLGLTFLoader::addJointToModelSkin(LLMeshSkinInfo& skin_info, S32 gltf_skin_idx, size_t gltf_joint_idx) +{ + const std::string& legal_name = mJointNames[gltf_skin_idx][gltf_joint_idx]; + if (legal_name.empty()) + { + llassert(false); // should have been stopped by gltf_joint_index_use[i] == -1 + return false; + } + skin_info.mJointNames.push_back(legal_name); + skin_info.mJointNums.push_back(-1); + + // In scope of same skin multiple meshes reuse same bind matrices + skin_info.mInvBindMatrix.push_back(mInverseBindMatrices[gltf_skin_idx][gltf_joint_idx]); + skin_info.mAlternateBindMatrix.push_back(mAlternateBindMatrices[gltf_skin_idx][gltf_joint_idx]); + + // Track joint usage for this skin, for the sake of unused joints detection + mJointUsage[gltf_skin_idx][gltf_joint_idx]++; + + return true; +} + +LLGLTFLoader::LLGLTFImportMaterial LLGLTFLoader::processMaterial(S32 material_index, S32 fallback_index) +{ + // Check cache first + auto cached = mMaterialCache.find(material_index); + if (cached != mMaterialCache.end()) + { + return cached->second; + } + + LLImportMaterial impMat; + impMat.mDiffuseColor = LLColor4::white; // Default color + + // Generate material name + std::string materialName = generateMaterialName(material_index, fallback_index); + + // Process material if available + if (material_index >= 0 && material_index < mGLTFAsset.mMaterials.size()) + { + LL::GLTF::Material* material = &mGLTFAsset.mMaterials[material_index]; + + // Set diffuse color from base color factor + impMat.mDiffuseColor = LLColor4( + material->mPbrMetallicRoughness.mBaseColorFactor[0], + material->mPbrMetallicRoughness.mBaseColorFactor[1], + material->mPbrMetallicRoughness.mBaseColorFactor[2], + material->mPbrMetallicRoughness.mBaseColorFactor[3] + ); + + // Process base color texture if it exists + if (material->mPbrMetallicRoughness.mBaseColorTexture.mIndex >= 0) + { + S32 texIndex = material->mPbrMetallicRoughness.mBaseColorTexture.mIndex; + std::string full_path; + std::string filename = processTexture(full_path, texIndex, "base_color", material->mName); + + if (!filename.empty()) + { + impMat.mDiffuseMapFilename = full_path; + impMat.mDiffuseMapLabel = material->mName.empty() ? filename : material->mName; + + // Check if the texture is already loaded + S32 sourceIndex; + if (validateTextureIndex(texIndex, sourceIndex)) + { + LL::GLTF::Image& image = mGLTFAsset.mImages[sourceIndex]; + if (image.mTexture.notNull()) + { + mTexturesNeedScaling |= image.mHeight > LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT || image.mWidth > LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT; + impMat.setDiffuseMap(image.mTexture->getID()); + LL_INFOS("GLTF_IMPORT") << "Using existing texture ID: " << image.mTexture->getID().asString() << LL_ENDL; + } + else + { + LL_INFOS("GLTF_IMPORT") << "Texture needs loading: " << impMat.mDiffuseMapFilename << LL_ENDL; + } + } + } + } + } + + // Create cached material with both material and name + LLGLTFImportMaterial cachedMat(impMat, materialName); + + // Cache the processed material + mMaterialCache[material_index] = cachedMat; + return cachedMat; +} + +std::string LLGLTFLoader::processTexture(std::string& full_path_out, S32 texture_index, const std::string& texture_type, const std::string& material_name) +{ + S32 sourceIndex; + if (!validateTextureIndex(texture_index, sourceIndex)) + return ""; + + LL::GLTF::Image& image = mGLTFAsset.mImages[sourceIndex]; + + // Process URI-based textures + if (!image.mUri.empty()) + { + std::string filename = image.mUri; + size_t pos = filename.find_last_of("/\\"); + if (pos != std::string::npos) + { + filename = filename.substr(pos + 1); + } + + std::string dir = gDirUtilp->getDirName(mFilename); + std::string full_path = dir + gDirUtilp->getDirDelimiter() + filename; + if (!gDirUtilp->fileExists(full_path) && filename.find("data:") == std::string::npos) + { + // Uri might be escaped + filename = LLURI::unescape(filename); + full_path = dir + gDirUtilp->getDirDelimiter() + filename; + } + + if (gDirUtilp->fileExists(full_path)) + { + full_path_out = full_path; + } + + LL_INFOS("GLTF_IMPORT") << "Found texture: " << filename << " for material: " << material_name << LL_ENDL; + + LLSD args; + args["Message"] = "TextureFound"; + args["TEXTURE_NAME"] = filename; + args["MATERIAL_NAME"] = material_name; + mWarningsArray.append(args); + + return filename; + } + + // Process embedded textures + if (image.mBufferView >= 0) + { + return extractTextureToTempFile(texture_index, texture_type); + } + + return ""; +} + +bool LLGLTFLoader::validateTextureIndex(S32 texture_index, S32& source_index) +{ + if (texture_index < 0 || texture_index >= mGLTFAsset.mTextures.size()) + return false; + + source_index = mGLTFAsset.mTextures[texture_index].mSource; + if (source_index < 0 || source_index >= mGLTFAsset.mImages.size()) + return false; + + return true; +} + +std::string LLGLTFLoader::generateMaterialName(S32 material_index, S32 fallback_index) +{ + if (material_index >= 0 && material_index < mGLTFAsset.mMaterials.size()) + { + LL::GLTF::Material* material = &mGLTFAsset.mMaterials[material_index]; + std::string materialName = material->mName; + + if (materialName.empty()) + { + materialName = "mat" + std::to_string(material_index); + } + return materialName; + } + else + { + return fallback_index >= 0 ? "mat_default" + std::to_string(fallback_index) : "mat_default"; + } +} + +bool LLGLTFLoader::populateModelFromMesh(LLModel* pModel, const std::string& base_name, const LL::GLTF::Mesh& mesh, const LL::GLTF::Node& nodeno, material_map& mats) +{ + // Set the requested label for the floater display and uploading + pModel->mRequestedLabel = gDirUtilp->getBaseFileName(mFilename, true); + // Set only name, suffix will be added later + pModel->mLabel = base_name; + + LL_DEBUGS("GLTF_DEBUG") << "Processing model " << pModel->mLabel << LL_ENDL; + + pModel->ClearFacesAndMaterials(); + + S32 skinIdx = nodeno.mSkin; + + // Compute final combined transform matrix (hierarchy + coordinate rotation) + S32 node_index = static_cast<S32>(&nodeno - &mGLTFAsset.mNodes[0]); + glm::mat4 hierarchy_transform; + computeCombinedNodeTransform(mGLTFAsset, node_index, hierarchy_transform); + + // Combine transforms: coordinate rotation applied to hierarchy transform + glm::mat4 final_transform = coord_system_rotation * hierarchy_transform; + if (mApplyXYRotation) + { + final_transform = coord_system_rotationxy * final_transform; + } + + // Check if we have a negative scale (flipped coordinate system) + bool hasNegativeScale = glm::determinant(final_transform) < 0.0f; + + // Pre-compute normal transform matrix (transpose of inverse of upper-left 3x3) + const glm::mat3 normal_transform = glm::transpose(glm::inverse(glm::mat3(final_transform))); + + // Mark unsuported joints with '-1' so that they won't get added into weights + // GLTF maps all joints onto all meshes. Gather use count per mesh to cut unused ones. + std::vector<S32> gltf_joint_index_use; + if (skinIdx >= 0 && mGLTFAsset.mSkins.size() > skinIdx) + { + LL::GLTF::Skin& gltf_skin = mGLTFAsset.mSkins[skinIdx]; + + size_t jointCnt = gltf_skin.mJoints.size(); + gltf_joint_index_use.resize(jointCnt, 0); + + for (size_t i = 0; i < jointCnt; ++i) + { + if (mJointNames[skinIdx][i].empty()) + { + // This might need to hold a substitute index + gltf_joint_index_use[i] = -1; // mark as unsupported + } + } + } + + for (size_t prim_idx = 0; prim_idx < mesh.mPrimitives.size(); ++prim_idx) + { + const LL::GLTF::Primitive& prim = mesh.mPrimitives[prim_idx]; + + // So primitives already have all of the data we need for a given face in SL land. + // Primitives may only ever have a single material assigned to them - as the relation is 1:1 in terms of intended draw call + // count. Just go ahead and populate faces direct from the GLTF primitives here. -Geenz 2025-04-07 + LLVolumeFace face; + std::vector<GLTFVertex> vertices; + + // Use cached material processing + LLGLTFImportMaterial cachedMat = processMaterial(prim.mMaterial, pModel->getNumVolumeFaces() - 1); + LLImportMaterial impMat = cachedMat; + std::string materialName = cachedMat.name; + mats[materialName] = impMat; + + if (prim.getIndexCount() % 3 != 0) + { + LL_WARNS("GLTF_IMPORT") << "Mesh '" << mesh.mName << "' primitive " << prim_idx + << ": Invalid index count " << prim.getIndexCount() + << " (not divisible by 3). GLTF files must contain triangulated geometry." << LL_ENDL; + + LLSD args; + args["Message"] = "InvalidGeometryNonTriangulated"; + args["MESH_NAME"] = mesh.mName; + args["PRIMITIVE_INDEX"] = static_cast<S32>(prim_idx); + args["INDEX_COUNT"] = static_cast<S32>(prim.getIndexCount()); + mWarningsArray.append(args); + return false; // Skip this primitive + } + + // Apply the global scale and center offset to all vertices + for (U32 i = 0; i < prim.getVertexCount(); i++) + { + // Use pre-computed final_transform + glm::vec4 pos(prim.mPositions[i][0], prim.mPositions[i][1], prim.mPositions[i][2], 1.0f); + glm::vec4 transformed_pos = final_transform * pos; + + GLTFVertex vert; + vert.position = glm::vec3(transformed_pos); + + if (!prim.mNormals.empty()) + { + // Use pre-computed normal_transform + glm::vec3 normal_vec(prim.mNormals[i][0], prim.mNormals[i][1], prim.mNormals[i][2]); + vert.normal = glm::normalize(normal_transform * normal_vec); + } + else + { + // Use default normal (pointing up in model space) + vert.normal = glm::normalize(normal_transform * glm::vec3(0.0f, 0.0f, 1.0f)); + LL_DEBUGS("GLTF_IMPORT") << "No normals found for primitive, using default normal." << LL_ENDL; + } + + vert.uv0 = glm::vec2(prim.mTexCoords0[i][0], -prim.mTexCoords0[i][1]); + + if (skinIdx >= 0) + { + vert.weights = glm::vec4(prim.mWeights[i]); + + auto accessorIdx = prim.mAttributes.at("JOINTS_0"); + LL::GLTF::Accessor::ComponentType componentType = LL::GLTF::Accessor::ComponentType::UNSIGNED_BYTE; + if (accessorIdx >= 0) + { + auto accessor = mGLTFAsset.mAccessors[accessorIdx]; + componentType = accessor.mComponentType; + } + + // The GLTF spec allows for either an unsigned byte for joint indices, or an unsigned short. + // Detect and unpack accordingly. + if (componentType == LL::GLTF::Accessor::ComponentType::UNSIGNED_BYTE) + { + auto ujoint = glm::unpackUint4x8((U32)(prim.mJoints[i] & 0xFFFFFFFF)); + vert.joints = glm::u16vec4(ujoint.x, ujoint.y, ujoint.z, ujoint.w); + } + else if (componentType == LL::GLTF::Accessor::ComponentType::UNSIGNED_SHORT) + { + vert.joints = glm::unpackUint4x16(prim.mJoints[i]); + } + else + { + vert.joints = glm::zero<glm::u16vec4>(); + vert.weights = glm::zero<glm::vec4>(); + } + } + vertices.push_back(vert); + } + + // Check for empty vertex array before processing + if (vertices.empty()) + { + LL_WARNS("GLTF_IMPORT") << "Empty vertex array for primitive " << prim_idx << " in model " << mesh.mName << LL_ENDL; + LLSD args; + args["Message"] = "EmptyVertexArray"; + args["MESH_NAME"] = mesh.mName; + args["PRIMITIVE_INDEX"] = static_cast<S32>(prim_idx); + args["INDEX_COUNT"] = static_cast<S32>(prim.getIndexCount()); + mWarningsArray.append(args); + return false; // Skip this primitive + } + + std::vector<LLVolumeFace::VertexData> faceVertices; + glm::vec3 min = glm::vec3(FLT_MAX); + glm::vec3 max = glm::vec3(-FLT_MAX); + + for (U32 i = 0; i < vertices.size(); i++) + { + LLVolumeFace::VertexData vert; + + // Update min/max bounds + if (i == 0) + { + min = max = vertices[i].position; + } + else + { + min.x = std::min(min.x, vertices[i].position.x); + min.y = std::min(min.y, vertices[i].position.y); + min.z = std::min(min.z, vertices[i].position.z); + max.x = std::max(max.x, vertices[i].position.x); + max.y = std::max(max.y, vertices[i].position.y); + max.z = std::max(max.z, vertices[i].position.z); + } + + LLVector4a position = LLVector4a(vertices[i].position.x, vertices[i].position.y, vertices[i].position.z); + LLVector4a normal = LLVector4a(vertices[i].normal.x, vertices[i].normal.y, vertices[i].normal.z); + vert.setPosition(position); + vert.setNormal(normal); + vert.mTexCoord = LLVector2(vertices[i].uv0.x, vertices[i].uv0.y); + faceVertices.push_back(vert); + + if (skinIdx >= 0) + { + // create list of weights that influence this vertex + LLModel::weight_list weight_list; + + // Drop joints that viewer doesn't support (negative in gltf_joint_index_use_count) + // don't reindex them yet, more indexes will be removed + // Also drop joints that have no weight. GLTF stores 4 per vertex, so there might be + // 'empty' ones + if (gltf_joint_index_use[vertices[i].joints.x] >= 0 + && vertices[i].weights.x > 0.f) + { + weight_list.push_back(LLModel::JointWeight(vertices[i].joints.x, vertices[i].weights.x)); + gltf_joint_index_use[vertices[i].joints.x]++; + } + if (gltf_joint_index_use[vertices[i].joints.y] >= 0 + && vertices[i].weights.y > 0.f) + { + weight_list.push_back(LLModel::JointWeight(vertices[i].joints.y, vertices[i].weights.y)); + gltf_joint_index_use[vertices[i].joints.y]++; + } + if (gltf_joint_index_use[vertices[i].joints.z] >= 0 + && vertices[i].weights.z > 0.f) + { + weight_list.push_back(LLModel::JointWeight(vertices[i].joints.z, vertices[i].weights.z)); + gltf_joint_index_use[vertices[i].joints.z]++; + } + if (gltf_joint_index_use[vertices[i].joints.w] >= 0 + && vertices[i].weights.w > 0.f) + { + weight_list.push_back(LLModel::JointWeight(vertices[i].joints.w, vertices[i].weights.w)); + gltf_joint_index_use[vertices[i].joints.w]++; + } + + std::sort(weight_list.begin(), weight_list.end(), LLModel::CompareWeightGreater()); + + std::vector<LLModel::JointWeight> wght; + F32 total = 0.f; + + for (U32 j = 0; j < llmin((U32)4, (U32)weight_list.size()); ++j) + { + // take up to 4 most significant weights + // Ported from the DAE loader - however, GLTF right now only supports up to four weights per vertex. + wght.push_back(weight_list[j]); + total += weight_list[j].mWeight; + } + + if (total != 0.f) + { + F32 scale = 1.f / total; + if (scale != 1.f) + { // normalize weights + for (U32 j = 0; j < wght.size(); ++j) + { + wght[j].mWeight *= scale; + } + } + } + + if (wght.size() > 0) + { + pModel->mSkinWeights[LLVector3(vertices[i].position)] = wght; + } + } + } + + // Indices handling + if (faceVertices.size() >= VERTEX_LIMIT) + { + // Will have to remap 32 bit indices into 16 bit indices + // For the sake of simplicity build vector of 32 bit indices first + std::vector<U32> indices_32; + for (U32 i = 0; i < prim.getIndexCount(); i += 3) + { + // When processing indices, flip winding order if needed + if (hasNegativeScale) + { + // Flip winding order for negative scale + indices_32.push_back(prim.mIndexArray[i]); + indices_32.push_back(prim.mIndexArray[i + 2]); // Swap these two + indices_32.push_back(prim.mIndexArray[i + 1]); + } + else + { + indices_32.push_back(prim.mIndexArray[i]); + indices_32.push_back(prim.mIndexArray[i + 1]); + indices_32.push_back(prim.mIndexArray[i + 2]); + } + } + + // Generates a vertex remap table with no gaps in the resulting sequence + std::vector<U32> remap(faceVertices.size()); + size_t vertex_count = meshopt_generateVertexRemap(&remap[0], &indices_32[0], indices_32.size(), &faceVertices[0], faceVertices.size(), sizeof(LLVolumeFace::VertexData)); + + // Manually remap vertices + std::vector<LLVolumeFace::VertexData> optimized_vertices(vertex_count); + for (size_t i = 0; i < vertex_count; ++i) + { + optimized_vertices[i] = faceVertices[remap[i]]; + } + + std::vector<U32> optimized_indices(indices_32.size()); + meshopt_remapIndexBuffer(&optimized_indices[0], &indices_32[0], indices_32.size(), &remap[0]); + + // Sort indices to improve mesh splits (reducing amount of duplicated indices) + meshopt_optimizeVertexCache(&optimized_indices[0], &optimized_indices[0], indices_32.size(), vertex_count); + + std::vector<U16> indices_16; + std::vector<S64> vertices_remap; + vertices_remap.resize(vertex_count, -1); + S32 created_faces = 0; + std::vector<LLVolumeFace::VertexData> face_verts; + min = glm::vec3(FLT_MAX); + max = glm::vec3(-FLT_MAX); + + for (size_t idx = 0; idx < optimized_indices.size(); idx++) + { + size_t vert_index = optimized_indices[idx]; + if (vertices_remap[vert_index] == -1) + { + // First encounter, add it + size_t new_vert_idx = face_verts.size(); + vertices_remap[vert_index] = (S64)new_vert_idx; + face_verts.push_back(optimized_vertices[vert_index]); + vert_index = new_vert_idx; + + // Update min/max bounds + const LLVector4a& vec = face_verts[new_vert_idx].getPosition(); + if (new_vert_idx == 0) + { + min.x = vec[0]; + min.y = vec[1]; + min.z = vec[2]; + max = min; + } + else + { + min.x = std::min(min.x, vec[0]); + min.y = std::min(min.y, vec[1]); + min.z = std::min(min.z, vec[2]); + max.x = std::max(max.x, vec[0]); + max.y = std::max(max.y, vec[1]); + max.z = std::max(max.z, vec[2]); + } + } + else + { + // already in vector, get position + vert_index = (size_t)vertices_remap[vert_index]; + } + indices_16.push_back((U16)vert_index); + + if (indices_16.size() % 3 == 0 && face_verts.size() >= VERTEX_LIMIT) + { + LLVolumeFace face; + face.fillFromLegacyData(face_verts, indices_16); + face.mExtents[0] = LLVector4a(min.x, min.y, min.z, 0); + face.mExtents[1] = LLVector4a(max.x, max.y, max.z, 0); + pModel->getVolumeFaces().push_back(face); + pModel->getMaterialList().push_back(materialName); + created_faces++; + + std::fill(vertices_remap.begin(), vertices_remap.end(), -1); + indices_16.clear(); + face_verts.clear(); + + min = glm::vec3(FLT_MAX); + max = glm::vec3(-FLT_MAX); + } + } + if (indices_16.size() > 0 && face_verts.size() > 0) + { + LLVolumeFace face; + face.fillFromLegacyData(face_verts, indices_16); + face.mExtents[0] = LLVector4a(min.x, min.y, min.z, 0); + face.mExtents[1] = LLVector4a(max.x, max.y, max.z, 0); + pModel->getVolumeFaces().push_back(face); + pModel->getMaterialList().push_back(materialName); + created_faces++; + } + + LL_INFOS("GLTF_IMPORT") << "Primitive " << (S32)prim_idx << " from model " << pModel->mLabel + << " is over vertices limit, it was split into " << created_faces + << " faces" << LL_ENDL; + LLSD args; + args["Message"] = "ModelSplitPrimitive"; + args["MODEL_NAME"] = pModel->mLabel; + args["FACE_COUNT"] = created_faces; + mWarningsArray.append(args); + } + else + { + // can use indices directly + std::vector<U16> indices; + for (U32 i = 0; i < prim.getIndexCount(); i += 3) + { + // When processing indices, flip winding order if needed + if (hasNegativeScale) + { + // Flip winding order for negative scale + indices.push_back(prim.mIndexArray[i]); + indices.push_back(prim.mIndexArray[i + 2]); // Swap these two + indices.push_back(prim.mIndexArray[i + 1]); + } + else + { + indices.push_back(prim.mIndexArray[i]); + indices.push_back(prim.mIndexArray[i + 1]); + indices.push_back(prim.mIndexArray[i + 2]); + } + } + + face.fillFromLegacyData(faceVertices, indices); + face.mExtents[0] = LLVector4a(min.x, min.y, min.z, 0); + face.mExtents[1] = LLVector4a(max.x, max.y, max.z, 0); + + pModel->getVolumeFaces().push_back(face); + pModel->getMaterialList().push_back(materialName); + } + } + + // Call normalizeVolumeFacesAndWeights to compute proper extents + pModel->normalizeVolumeFacesAndWeights(); + + // Fill joint names, bind matrices and remap weight indices + if (skinIdx >= 0) + { + LL::GLTF::Skin& gltf_skin = mGLTFAsset.mSkins[skinIdx]; + LLMeshSkinInfo& skin_info = pModel->mSkinInfo; + S32 valid_joints_count = mValidJointsCount[skinIdx]; + + S32 replacement_index = 0; + std::vector<S32> gltfindex_to_joitindex_map; + size_t jointCnt = gltf_skin.mJoints.size(); + gltfindex_to_joitindex_map.resize(jointCnt, -1); + + if (valid_joints_count > (S32)mMaxJointsPerMesh) + { + std::map<std::string, S32> goup_use_count; + + for (const auto& elem : mJointGroups) + { + goup_use_count[elem.second.mGroup] = 0; + goup_use_count[elem.second.mParentGroup] = 0; + } + + // Assume that 'Torso' group is always in use since that's what everything else is attached to + goup_use_count["Torso"] = 1; + // Note that Collisions and Extra groups are all over the place, might want to include them from the start + // or add individual when parents are added + + // Check which groups are in use + for (size_t i = 0; i < jointCnt; ++i) + { + std::string& joint_name = mJointNames[skinIdx][i]; + if (!joint_name.empty()) + { + if (gltf_joint_index_use[i] > 0) + { + const JointGroups &group = mJointGroups[joint_name]; + // Joint in use, increment it's groups + goup_use_count[group.mGroup]++; + goup_use_count[group.mParentGroup]++; + } + } + } + + // 1. add joints that are in use directly + for (size_t i = 0; i < jointCnt; ++i) + { + // Process joint name and idnex + S32 joint = gltf_skin.mJoints[i]; + if (gltf_joint_index_use[i] <= 0) + { + // unsupported (-1) joint, drop it + // unused (0) joint, drop it + continue; + } + + if (addJointToModelSkin(skin_info, skinIdx, i)) + { + gltfindex_to_joitindex_map[i] = replacement_index++; + } + } + + // 2. add joints from groups that this model's joints belong to + // It's perfectly valid to have more joints than is in use + // Ex: sandals that make your legs digitigrade despite not skining to + // knees or the like. + // Todo: sort and add by usecount + for (size_t i = 0; i < jointCnt; ++i) + { + S32 joint = gltf_skin.mJoints[i]; + if (gltf_joint_index_use[i] != 0) + { + // this step needs only joints that have zero uses + continue; + } + if (skin_info.mInvBindMatrix.size() > mMaxJointsPerMesh) + { + break; + } + const std::string& legal_name = mJointNames[skinIdx][i]; + std::string group_name = mJointGroups[legal_name].mGroup; + if (goup_use_count[group_name] > 0) + { + if (addJointToModelSkin(skin_info, skinIdx, i)) + { + gltfindex_to_joitindex_map[i] = replacement_index++; + } + } + } + } + else + { + // Less than 110, just add every valid joint + for (size_t i = 0; i < jointCnt; ++i) + { + // Process joint name and idnex + S32 joint = gltf_skin.mJoints[i]; + if (gltf_joint_index_use[i] < 0) + { + // unsupported (-1) joint, drop it + continue; + } + + if (addJointToModelSkin(skin_info, skinIdx, i)) + { + gltfindex_to_joitindex_map[i] = replacement_index++; + } + } + } + + if (skin_info.mInvBindMatrix.size() > mMaxJointsPerMesh) + { + // mMaxJointsPerMesh ususlly is equal to LL_MAX_JOINTS_PER_MESH_OBJECT + // and is 110. + LL_WARNS("GLTF_IMPORT") << "Too many jonts in " << pModel->mLabel + << " Count: " << (S32)skin_info.mInvBindMatrix.size() + << " Limit:" << (S32)mMaxJointsPerMesh << LL_ENDL; + LLSD args; + args["Message"] = "ModelTooManyJoints"; + args["MODEL_NAME"] = pModel->mLabel; + args["JOINT_COUNT"] = (S32)skin_info.mInvBindMatrix.size(); + args["MAX"] = (S32)mMaxJointsPerMesh; + mWarningsArray.append(args); + } + + // Remap indices for pModel->mSkinWeights + for (auto& weights : pModel->mSkinWeights) + { + for (auto& weight : weights.second) + { + weight.mJointIdx = gltfindex_to_joitindex_map[weight.mJointIdx]; + } + } + } + + return true; +} + +void LLGLTFLoader::populateJointsFromSkin(S32 skin_idx) +{ + const LL::GLTF::Skin& skin = mGLTFAsset.mSkins[skin_idx]; + + LL_INFOS("GLTF_DEBUG") << "populateJointFromSkin: Processing skin " << skin_idx << " with " << skin.mJoints.size() << " joints" << LL_ENDL; + + if (skin.mInverseBindMatrices > 0 && skin.mJoints.size() != skin.mInverseBindMatricesData.size()) + { + LL_INFOS("GLTF_IMPORT") << "Bind matrices count mismatch joints count" << LL_ENDL; + LLSD args; + args["Message"] = "InvBindCountMismatch"; + mWarningsArray.append(args); + } + + S32 joint_count = (S32)skin.mJoints.size(); + S32 inverse_count = (S32)skin.mInverseBindMatricesData.size(); + if (mInverseBindMatrices.size() <= skin_idx) + { + mInverseBindMatrices.resize(skin_idx + 1); + mAlternateBindMatrices.resize(skin_idx + 1); + mJointNames.resize(skin_idx + 1); + mJointUsage.resize(skin_idx + 1); + mValidJointsCount.resize(skin_idx + 1, 0); + } + + // fill up joints related data + joints_data_map_t joints_data; + joints_name_to_node_map_t names_to_nodes; + for (S32 i = 0; i < joint_count; i++) + { + S32 joint = skin.mJoints[i]; + const LL::GLTF::Node &jointNode = mGLTFAsset.mNodes[joint]; + JointNodeData& data = joints_data[joint]; + data.mNodeIdx = joint; + data.mJointListIdx = i; + data.mGltfRestMatrix = buildGltfRestMatrix(joint, skin); + data.mGltfMatrix = jointNode.mMatrix; + data.mOverrideMatrix = glm::mat4(1.f); + + if (mJointMap.find(jointNode.mName) != mJointMap.end()) + { + data.mName = mJointMap[jointNode.mName]; + data.mIsValidViewerJoint = true; + mValidJointsCount[skin_idx]++; + } + else + { + data.mName = jointNode.mName; + data.mIsValidViewerJoint = false; + } + names_to_nodes[data.mName] = joint; + + for (S32 child : jointNode.mChildren) + { + JointNodeData& child_data = joints_data[child]; + child_data.mParentNodeIdx = joint; + child_data.mIsParentValidViewerJoint = data.mIsValidViewerJoint; + } + } + + // Go over viewer joints and build overrides + // This is needed because gltf skeleton doesn't necessarily match viewer's skeleton. + glm::mat4 ident(1.0); + for (auto &viewer_data : mViewerJointData) + { + buildOverrideMatrix(viewer_data, joints_data, names_to_nodes, ident, ident); + } + + for (S32 i = 0; i < joint_count; i++) + { + S32 joint = skin.mJoints[i]; + const LL::GLTF::Node &jointNode = mGLTFAsset.mNodes[joint]; + std::string legal_name(jointNode.mName); + + // Viewer supports a limited set of joints, mark them as legal + bool legal_joint = false; + if (mJointMap.find(legal_name) != mJointMap.end()) + { + legal_name = mJointMap[legal_name]; + legal_joint = true; + mJointNames[skin_idx].push_back(legal_name); + } + else + { + mJointNames[skin_idx].emplace_back(); + } + mJointUsage[skin_idx].push_back(0); + + // Compute bind matrices + + if (!legal_joint) + { + // Add placeholder to not break index. + // Not going to be used by viewer, will be stripped from skin_info. + LLMatrix4 gltf_transform; + gltf_transform.setIdentity(); + mInverseBindMatrices[skin_idx].push_back(LLMatrix4a(gltf_transform)); + } + else if (inverse_count > i) + { + // Transalte existing bind matrix to viewer's overriden skeleton + glm::mat4 original_bind_matrix = glm::inverse(skin.mInverseBindMatricesData[i]); + glm::mat4 rotated_original = coord_system_rotation * original_bind_matrix; + glm::mat4 skeleton_transform = computeGltfToViewerSkeletonTransform(joints_data, joint, legal_name); + glm::mat4 tranlated_original = skeleton_transform * rotated_original; + glm::mat4 final_inverse_bind_matrix = glm::inverse(tranlated_original); + + LLMatrix4 gltf_transform = LLMatrix4(glm::value_ptr(final_inverse_bind_matrix)); + LL_DEBUGS("GLTF_DEBUG") << "mInvBindMatrix name: " << legal_name << " Translated val: " << gltf_transform << LL_ENDL; + mInverseBindMatrices[skin_idx].push_back(LLMatrix4a(gltf_transform)); + } + else + { + // If bind matrices aren't present (they are optional in gltf), + // assume an identy matrix + // todo: find a model with this, might need to use YZ rotated matrix + glm::mat4 inv_bind(1.0f); + glm::mat4 skeleton_transform = computeGltfToViewerSkeletonTransform(joints_data, joint, legal_name); + inv_bind = glm::inverse(skeleton_transform * inv_bind); + + LLMatrix4 gltf_transform = LLMatrix4(glm::value_ptr(inv_bind)); + LL_DEBUGS("GLTF_DEBUG") << "mInvBindMatrix name: " << legal_name << " Generated val: " << gltf_transform << LL_ENDL; + mInverseBindMatrices[skin_idx].push_back(LLMatrix4a(gltf_transform)); + } + + // Compute Alternative matrices also known as overrides + LLMatrix4 original_joint_transform(glm::value_ptr(joints_data[joint].mOverrideMatrix)); + + // Viewer seems to care only about translation part, + // but for parity with collada taking original value + LLMatrix4 newInverse = LLMatrix4(mInverseBindMatrices[skin_idx].back().getF32ptr()); + newInverse.setTranslation(original_joint_transform.getTranslation()); + + LL_DEBUGS("GLTF_DEBUG") << "mAlternateBindMatrix name: " << legal_name << " val: " << newInverse << LL_ENDL; + mAlternateBindMatrices[skin_idx].push_back(LLMatrix4a(newInverse)); + + if (legal_joint) + { + // Might be needed for uploader UI to correctly identify overriden joints + // but going to be incorrect if multiple skins are present + mJointList[legal_name] = newInverse; + mJointsFromNode.push_front(legal_name); + } + } + + S32 valid_joints = mValidJointsCount[skin_idx]; + if (valid_joints < joint_count) + { + LL_INFOS("GLTF_IMPORT") << "Skin " << skin_idx + << " defines " << joint_count + << " joints, but only " << valid_joints + << " were recognized and are compatible." << LL_ENDL; + LLSD args; + args["Message"] = "SkinUsupportedJoints"; + args["SKIN_INDEX"] = skin_idx; + args["JOINT_COUNT"] = joint_count; + args["LEGAL_COUNT"] = valid_joints; + mWarningsArray.append(args); + } +} + +void LLGLTFLoader::populateJointGroups() +{ + std::string parent; + for (auto& viewer_data : mViewerJointData) + { + buildJointGroup(viewer_data, parent); + } +} + +void LLGLTFLoader::buildJointGroup(LLJointData& viewer_data, const std::string &parent_group) +{ + JointGroups& jount_group_data = mJointGroups[viewer_data.mName]; + jount_group_data.mGroup = viewer_data.mGroup; + jount_group_data.mParentGroup = parent_group; + + for (LLJointData& child_data : viewer_data.mChildren) + { + buildJointGroup(child_data, viewer_data.mGroup); + } +} + +void LLGLTFLoader::buildOverrideMatrix(LLJointData& viewer_data, joints_data_map_t &gltf_nodes, joints_name_to_node_map_t &names_to_nodes, glm::mat4& parent_rest, glm::mat4& parent_support_rest) const +{ + glm::mat4 rest(1.f); + joints_name_to_node_map_t::iterator found_node = names_to_nodes.find(viewer_data.mName); + if (found_node != names_to_nodes.end()) + { + S32 gltf_node_idx = found_node->second; + JointNodeData& node = gltf_nodes[gltf_node_idx]; + node.mIsOverrideValid = true; + node.mViewerRestMatrix = viewer_data.mRestMatrix; + + glm::mat4 gltf_joint_rest_pose = coord_system_rotation * node.mGltfRestMatrix; + if (mApplyXYRotation) + { + gltf_joint_rest_pose = coord_system_rotationxy * gltf_joint_rest_pose; + } + + glm::mat4 translated_joint; + // Example: + // Viewer has pelvis->spine1->spine2->torso. + // gltf example model has pelvis->torso + // By doing glm::inverse(transalted_rest_spine2) * gltf_rest_torso + // We get what torso would have looked like if gltf had a spine2 + if (viewer_data.mIsJoint) + { + translated_joint = glm::inverse(parent_rest) * gltf_joint_rest_pose; + } + else + { + translated_joint = glm::inverse(parent_support_rest) * gltf_joint_rest_pose; + } + + glm::vec3 translation_override; + glm::vec3 skew; + glm::vec3 scale; + glm::vec4 perspective; + glm::quat rotation; + glm::decompose(translated_joint, scale, rotation, translation_override, skew, perspective); + + // Viewer allows overrides, which are base joint with applied translation override. + // fortunately normal bones use only translation, without rotation or scale + node.mOverrideMatrix = glm::recompose(glm::vec3(1, 1, 1), glm::identity<glm::quat>(), translation_override, glm::vec3(0, 0, 0), glm::vec4(0, 0, 0, 1)); + + glm::mat4 overriden_joint = node.mOverrideMatrix; + + // todo: if gltf bone had rotation or scale, they probably should be saved here + // then applied to bind matrix + rest = parent_rest * overriden_joint; + if (viewer_data.mIsJoint) + { + node.mOverrideRestMatrix = rest; + } + else + { + // This is likely incomplete or even wrong. + // Viewer Collision bones specify rotation and scale. + // Importer should apply rotation and scale to this matrix and save as needed + // then subsctruct them from bind matrix + // Todo: get models that use collision bones, made by different programs + + overriden_joint = glm::scale(overriden_joint, viewer_data.mScale); + node.mOverrideRestMatrix = parent_support_rest * overriden_joint; + } + } + else + { + // No override for this joint + rest = parent_rest * viewer_data.mJointMatrix; + } + + glm::mat4 support_rest(1.f); + if (viewer_data.mSupport == LLJointData::SUPPORT_BASE) + { + support_rest = rest; + } + else + { + support_rest = parent_support_rest; + } + + for (LLJointData& child_data : viewer_data.mChildren) + { + buildOverrideMatrix(child_data, gltf_nodes, names_to_nodes, rest, support_rest); + } +} + +glm::mat4 LLGLTFLoader::buildGltfRestMatrix(S32 joint_node_index, const LL::GLTF::Skin& gltf_skin) const +{ + // This is inefficient since we are recalculating some joints multiple times over + // Todo: cache it? + + if (joint_node_index < 0 || joint_node_index >= static_cast<S32>(mGLTFAsset.mNodes.size())) + { + return glm::mat4(1.0f); + } + + const auto& node = mGLTFAsset.mNodes[joint_node_index]; + + // Find and apply parent transform if it exists + for (size_t i = 0; i < mGLTFAsset.mNodes.size(); ++i) + { + const auto& potential_parent = mGLTFAsset.mNodes[i]; + auto it = std::find(potential_parent.mChildren.begin(), potential_parent.mChildren.end(), joint_node_index); + + if (it != potential_parent.mChildren.end()) + { + // Found parent + if (std::find(gltf_skin.mJoints.begin(), gltf_skin.mJoints.end(), joint_node_index) != gltf_skin.mJoints.end()) + { + // parent is a joint - recursively combine transform + // assumes that matrix is already valid + return buildGltfRestMatrix(static_cast<S32>(i), gltf_skin) * node.mMatrix; + } + } + } + // Should we return armature or stop earlier? + return node.mMatrix; +} + +glm::mat4 LLGLTFLoader::buildGltfRestMatrix(S32 joint_node_index, const joints_data_map_t& joint_data) const +{ + // This is inefficient since we are recalculating some joints multiple times over + // Todo: cache it? + + if (joint_node_index < 0 || joint_node_index >= static_cast<S32>(mGLTFAsset.mNodes.size())) + { + return glm::mat4(1.0f); + } + + auto& data = joint_data.at(joint_node_index); + + if (data.mParentNodeIdx >=0) + { + return buildGltfRestMatrix(data.mParentNodeIdx, joint_data) * data.mGltfMatrix; + } + // Should we return armature or stop earlier? + return data.mGltfMatrix; +} + +// This function computes the transformation matrix needed to convert from GLTF skeleton space +// to viewer skeleton space for a specific joint + +glm::mat4 LLGLTFLoader::computeGltfToViewerSkeletonTransform(const joints_data_map_t& joints_data_map, S32 gltf_node_index, const std::string& joint_name) const +{ + const JointNodeData& node_data = joints_data_map.at(gltf_node_index); + if (!node_data.mIsOverrideValid) + { + // For now assume they are identical and return an identity (for ease of debuging) + return glm::mat4(1.0f); + } + + // Get the GLTF joint's rest pose (in GLTF coordinate system) + const glm::mat4 &gltf_joint_rest_pose = node_data.mGltfRestMatrix; + glm::mat4 rest_pose = coord_system_rotation * gltf_joint_rest_pose; + + LL_INFOS("GLTF_DEBUG") << "rest matrix for joint " << joint_name << ": "; + + LLMatrix4 transform(glm::value_ptr(rest_pose)); + + LL_CONT << transform << LL_ENDL; + + // Compute transformation from GLTF space to viewer space + // This assumes both skeletons are in rest pose initially + return node_data.mOverrideRestMatrix * glm::inverse(rest_pose); +} + +bool LLGLTFLoader::checkForXYrotation(const LL::GLTF::Skin& gltf_skin, S32 joint_idx, S32 bind_indx) +{ + glm::mat4 gltf_joint_rest = buildGltfRestMatrix(joint_idx, gltf_skin); + glm::mat4 test_mat = glm::inverse(gltf_joint_rest) * gltf_skin.mInverseBindMatricesData[bind_indx]; + // Normally for shoulders it should be something close to + // {1,0,0,0;0,-1,0,0;0,0,-1,0;0,0,0,1} + // rotated one will look like + // {0,0,0,-1;1,0,0,0;0,-1,0,0;0,0,0,1} + // Todo: This is a cheap hack, + // figure out how rotation is supposed to work + return abs(test_mat[0][0]) < 0.5 && abs(test_mat[1][1]) < 0.5 && abs(test_mat[2][2]) < 0.5; +} + +void LLGLTFLoader::checkForXYrotation(const LL::GLTF::Skin& gltf_skin) +{ + // HACK: figure out model's rotation from shoulders' matrix. + // This is wrong on many levels: + // Too limited (only models that have shoulders), + // Will not work well with things that emulate 3 hands in some manner + // Only supports xy 90 degree rotation + // Todo: figure out how to find skeleton's orientation Correctly + // when model is rotated at a triangle level + constexpr char right_shoulder_str[] = "mShoulderRight"; + constexpr char left_shoulder_str[] = "mShoulderLeft"; + + S32 size = (S32)gltf_skin.mJoints.size(); + S32 joints_found = 0; + for (S32 i= 0; i < size; i++) + { + S32 joint = gltf_skin.mJoints[i]; + const LL::GLTF::Node &joint_node = mGLTFAsset.mNodes[joint]; + + // todo: we are doing this search thing everywhere, + // just pre-translate every joint + JointMap::iterator found = mJointMap.find(joint_node.mName); + if (found == mJointMap.end()) + { + // unsupported joint + continue; + } + if (found->second == right_shoulder_str || found->second == left_shoulder_str) + { + if (checkForXYrotation(gltf_skin, joint, i)) + { + joints_found++; + } + else + { + return; + } + } + } + + if (joints_found == 2) + { + // Both joints in a weird position/rotation, assume rotated model + mApplyXYRotation = true; + } +} + +void LLGLTFLoader::checkGlobalJointUsage() +{ + // Check if some joints remained unused + for (S32 skin_idx = 0; skin_idx < (S32)mGLTFAsset.mSkins.size(); ++skin_idx) + { + const LL::GLTF::Skin& gltf_skin = mGLTFAsset.mSkins[skin_idx]; + S32 joint_count = (S32)gltf_skin.mJoints.size(); + S32 used_joints = 0; + for (S32 i = 0; i < joint_count; ++i) + { + S32 joint = gltf_skin.mJoints[i]; + if (mJointUsage[skin_idx][i] == 0) + { + // Joint is unused, log it + LL_INFOS("GLTF_DEBUG") << "Joint " << mJointNames[skin_idx][i] + << " in skin " << skin_idx << " is unused." << LL_ENDL; + } + else + { + used_joints++; + } + } + + S32 valid_joints = mValidJointsCount[skin_idx]; + if (valid_joints > used_joints) + { + S32 unsed_joints = valid_joints - used_joints; + LL_INFOS("GLTF_IMPORT") << "Skin " << skin_idx + << " declares " << valid_joints + << " valid joints, of them " << unsed_joints + << " remained unused" << LL_ENDL; + LLSD args; + args["Message"] = "SkinUnusedJoints"; + args["SKIN_INDEX"] = (S32)skin_idx; + args["JOINT_COUNT"] = valid_joints; + args["USED_COUNT"] = used_joints; + mWarningsArray.append(args); + } + } +} + +std::string LLGLTFLoader::extractTextureToTempFile(S32 textureIndex, const std::string& texture_type) +{ + if (textureIndex < 0 || textureIndex >= mGLTFAsset.mTextures.size()) + return ""; + + S32 sourceIndex = mGLTFAsset.mTextures[textureIndex].mSource; + if (sourceIndex < 0 || sourceIndex >= mGLTFAsset.mImages.size()) + return ""; + + LL::GLTF::Image& image = mGLTFAsset.mImages[sourceIndex]; + + // Handle URI-based textures + if (!image.mUri.empty()) + { + return image.mUri; // Return URI directly + } + + // Handle embedded textures + if (image.mBufferView >= 0) + { + if (image.mBufferView < mGLTFAsset.mBufferViews.size()) + { + const LL::GLTF::BufferView& buffer_view = mGLTFAsset.mBufferViews[image.mBufferView]; + if (buffer_view.mBuffer < mGLTFAsset.mBuffers.size()) + { + const LL::GLTF::Buffer& buffer = mGLTFAsset.mBuffers[buffer_view.mBuffer]; + + if (buffer_view.mByteOffset + buffer_view.mByteLength <= buffer.mData.size()) + { + // Extract image data + const U8* data_ptr = &buffer.mData[buffer_view.mByteOffset]; + U32 data_size = buffer_view.mByteLength; + + // Determine the file extension + std::string extension = ".png"; // Default + if (!image.mMimeType.empty()) + { + if (image.mMimeType == "image/jpeg") + extension = ".jpg"; + else if (image.mMimeType == "image/png") + extension = ".png"; + } + else if (data_size >= 4) + { + if (data_ptr[0] == 0xFF && data_ptr[1] == 0xD8) + extension = ".jpg"; // JPEG magic bytes + else if (data_ptr[0] == 0x89 && data_ptr[1] == 0x50 && data_ptr[2] == 0x4E && data_ptr[3] == 0x47) + extension = ".png"; // PNG magic bytes + } + + // Create a temporary file + std::string temp_dir = gDirUtilp->getTempDir(); + std::string temp_filename = temp_dir + gDirUtilp->getDirDelimiter() + + "gltf_embedded_" + texture_type + "_" + std::to_string(sourceIndex) + extension; + + // Write the image data to the temporary file + std::ofstream temp_file(temp_filename, std::ios::binary); + if (temp_file.is_open()) + { + temp_file.write(reinterpret_cast<const char*>(data_ptr), data_size); + temp_file.close(); + + LL_INFOS("GLTF_IMPORT") << "Extracted embedded " << texture_type << " texture to: " << temp_filename << LL_ENDL; + return temp_filename; + } + else + { + LL_WARNS("GLTF_IMPORT") << "Failed to create temporary file for " << texture_type << " texture: " << temp_filename << LL_ENDL; + + LLSD args; + args["Message"] = "FailedToCreateTempFile"; + args["TEXTURE_INDEX"] = sourceIndex; + args["TEXTURE_TYPE"] = texture_type; + args["TEMP_FILE"] = temp_filename; + mWarningsArray.append(args); + } + } + } + } + } + + return ""; +} + +void LLGLTFLoader::notifyUnsupportedExtension(bool unsupported) +{ + std::vector<std::string> extensions = unsupported ? mGLTFAsset.mUnsupportedExtensions : mGLTFAsset.mIgnoredExtensions; + if (extensions.size() > 0) + { + LLSD args; + args["Message"] = unsupported ? "UnsupportedExtension" : "IgnoredExtension"; + std::string del; + std::string ext; + for (auto& extension : extensions) + { + ext += del; + ext += extension; + del = ","; + } + args["EXT"] = ext; + mWarningsArray.append(args); + + LL_WARNS("GLTF_IMPORT") << "Model uses unsupported extension: " << ext << LL_ENDL; + } +} + +size_t LLGLTFLoader::getSuffixPosition(const std::string &label) +{ + if ((label.find("_LOD") != -1) || (label.find("_PHYS") != -1)) + { + return label.rfind('_'); + } + return -1; +} + +std::string LLGLTFLoader::getLodlessLabel(const LL::GLTF::Node& node) +{ + size_t ext_pos = getSuffixPosition(node.mName); + if (ext_pos != -1) + { + return node.mName.substr(0, ext_pos); + } + return node.mName; +} + diff --git a/indra/newview/gltf/llgltfloader.h b/indra/newview/gltf/llgltfloader.h new file mode 100644 index 0000000000..a847e567a6 --- /dev/null +++ b/indra/newview/gltf/llgltfloader.h @@ -0,0 +1,216 @@ +/** + * @file LLGLTFLoader.h + * @brief LLGLTFLoader class definition + * + * $LicenseInfo:firstyear=2022&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2022, 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_LLGLTFLoader_H +#define LL_LLGLTFLoader_H + +#include "tinygltf/tiny_gltf.h" + +#include "asset.h" + +#include "llglheaders.h" +#include "lljointdata.h" +#include "llmodelloader.h" + +class LLGLTFLoader : public LLModelLoader +{ + public: + typedef std::map<std::string, LLImportMaterial> material_map; + typedef std::map<std::string, std::string> joint_viewer_parent_map_t; + typedef std::map<std::string, glm::mat4> joint_viewer_rest_map_t; + typedef std::map<S32, glm::mat4> joint_node_mat4_map_t; + + struct JointNodeData + { + JointNodeData() + : mJointListIdx(-1) + , mNodeIdx(-1) + , mParentNodeIdx(-1) + , mIsValidViewerJoint(false) + , mIsParentValidViewerJoint(false) + , mIsOverrideValid(false) + { + + } + S32 mJointListIdx; + S32 mNodeIdx; + S32 mParentNodeIdx; + glm::mat4 mGltfRestMatrix; + glm::mat4 mViewerRestMatrix; + glm::mat4 mOverrideRestMatrix; + glm::mat4 mGltfMatrix; + glm::mat4 mOverrideMatrix; + std::string mName; + bool mIsValidViewerJoint; + bool mIsParentValidViewerJoint; + bool mIsOverrideValid; + }; + typedef std::map <S32, JointNodeData> joints_data_map_t; + typedef std::map <std::string, S32> joints_name_to_node_map_t; + + class LLGLTFImportMaterial : public LLImportMaterial + { + public: + std::string name; + LLGLTFImportMaterial() = default; + LLGLTFImportMaterial(const LLImportMaterial& mat, const std::string& n) : LLImportMaterial(mat), name(n) {} + }; + + LLGLTFLoader(std::string filename, + S32 lod, + LLModelLoader::load_callback_t load_cb, + LLModelLoader::joint_lookup_func_t joint_lookup_func, + LLModelLoader::texture_load_func_t texture_load_func, + LLModelLoader::state_callback_t state_cb, + void * opaque_userdata, + JointTransformMap & jointTransformMap, + JointNameSet & jointsFromNodes, + std::map<std::string, std::string, std::less<>> & jointAliasMap, + U32 maxJointsPerMesh, + U32 modelLimit, + U32 debugMode, + std::vector<LLJointData> viewer_skeleton); //, + //bool preprocess ); + virtual ~LLGLTFLoader(); + + virtual bool OpenFile(const std::string &filename); + + struct GLTFVertex + { + glm::vec3 position; + glm::vec3 normal; + glm::vec2 uv0; + glm::u16vec4 joints; + glm::vec4 weights; + }; + +protected: + LL::GLTF::Asset mGLTFAsset; + tinygltf::Model mGltfModel; + bool mGltfLoaded = false; + bool mApplyXYRotation = false; + + // GLTF isn't aware of viewer's skeleton and uses it's own, + // so need to take viewer's joints and use them to + // recalculate iverse bind matrices + std::vector<LLJointData> mViewerJointData; + + // vector of vectors because of a posibility of having more than one skin + typedef std::vector<LLMeshSkinInfo::matrix_list_t> bind_matrices_t; + typedef std::vector<std::vector<std::string> > joint_names_t; + bind_matrices_t mInverseBindMatrices; + bind_matrices_t mAlternateBindMatrices; + joint_names_t mJointNames; // empty string when no legal name for a given idx + std::vector<std::vector<S32>> mJointUsage; // detect and warn about unsed joints + + // what group a joint belongs to. + // For purpose of stripping unused groups when joints are over limit. + struct JointGroups + { + std::string mGroup; + std::string mParentGroup; + }; + typedef std::map<std::string, JointGroups, std::less<> > joint_to_group_map_t; + joint_to_group_map_t mJointGroups; + + // per skin joint count, needs to be tracked for the sake of limits check. + std::vector<S32> mValidJointsCount; + + // Cached material information + typedef std::map<S32, LLGLTFImportMaterial> MaterialCache; + MaterialCache mMaterialCache; + +private: + bool parseMeshes(); + void computeCombinedNodeTransform(const LL::GLTF::Asset& asset, S32 node_index, glm::mat4& combined_transform) const; + void processNodeHierarchy(S32 node_idx, std::map<std::string, S32>& mesh_name_counts, U32 submodel_limit, const LLVolumeParams& volume_params); + bool addJointToModelSkin(LLMeshSkinInfo& skin_info, S32 gltf_skin_idx, size_t gltf_joint_idx); + LLGLTFImportMaterial processMaterial(S32 material_index, S32 fallback_index); + std::string processTexture(std::string& full_path_out, S32 texture_index, const std::string& texture_type, const std::string& material_name); + bool validateTextureIndex(S32 texture_index, S32& source_index); + std::string generateMaterialName(S32 material_index, S32 fallback_index = -1); + bool populateModelFromMesh(LLModel* pModel, const std::string& base_name, const LL::GLTF::Mesh &mesh, const LL::GLTF::Node &node, material_map& mats); + void populateJointsFromSkin(S32 skin_idx); + void populateJointGroups(); + void addModelToScene(LLModel* pModel, const std::string& model_name, U32 submodel_limit, const LLMatrix4& transformation, const LLVolumeParams& volume_params, const material_map& mats); + void buildJointGroup(LLJointData& viewer_data, const std::string& parent_group); + void buildOverrideMatrix(LLJointData& data, joints_data_map_t &gltf_nodes, joints_name_to_node_map_t &names_to_nodes, glm::mat4& parent_rest, glm::mat4& support_rest) const; + glm::mat4 buildGltfRestMatrix(S32 joint_node_index, const LL::GLTF::Skin& gltf_skin) const; + glm::mat4 buildGltfRestMatrix(S32 joint_node_index, const joints_data_map_t& joint_data) const; + glm::mat4 computeGltfToViewerSkeletonTransform(const joints_data_map_t& joints_data_map, S32 gltf_node_index, const std::string& joint_name) const; + bool checkForXYrotation(const LL::GLTF::Skin& gltf_skin, S32 joint_idx, S32 bind_indx); + void checkForXYrotation(const LL::GLTF::Skin& gltf_skin); + void checkGlobalJointUsage(); + + std::string extractTextureToTempFile(S32 textureIndex, const std::string& texture_type); + + void notifyUnsupportedExtension(bool unsupported); + + static size_t getSuffixPosition(const std::string& label); + static std::string getLodlessLabel(const LL::GLTF::Node& mesh); + + // bool mPreprocessGLTF; + + /* Below inherited from dae loader - unknown if/how useful here + + void processElement(gltfElement *element, bool &badElement, GLTF *gltf); + void processGltfModel(LLModel *model, GLTF *gltf, gltfElement *pRoot, gltfMesh *mesh, gltfSkin *skin); + + material_map getMaterials(LLModel *model, gltfInstance_geometry *instance_geo, GLTF *gltf); + LLImportMaterial profileToMaterial(gltfProfile_COMMON *material, GLTF *gltf); + LLColor4 getGltfColor(gltfElement *element); + + gltfElement *getChildFromElement(gltfElement *pElement, std::string const &name); + + bool isNodeAJoint(gltfNode *pNode); + void processJointNode(gltfNode *pNode, std::map<std::string, LLMatrix4> &jointTransforms); + void extractTranslation(gltfTranslate *pTranslate, LLMatrix4 &transform); + void extractTranslationViaElement(gltfElement *pTranslateElement, LLMatrix4 &transform); + void extractTranslationViaSID(gltfElement *pElement, LLMatrix4 &transform); + void buildJointToNodeMappingFromScene(gltfElement *pRoot); + void processJointToNodeMapping(gltfNode *pNode); + void processChildJoints(gltfNode *pParentNode); + + bool verifyCount(int expected, int result); + + // Verify that a controller matches vertex counts + bool verifyController(gltfController *pController); + + static bool addVolumeFacesFromGltfMesh(LLModel *model, gltfMesh *mesh, LLSD &log_msg); + static bool createVolumeFacesFromGltfMesh(LLModel *model, gltfMesh *mesh); + + static LLModel *loadModelFromGltfMesh(gltfMesh *mesh); + + // Loads a mesh breaking it into one or more models as necessary + // to get around volume face limitations while retaining >8 materials + // + bool loadModelsFromGltfMesh(gltfMesh *mesh, std::vector<LLModel *> &models_out, U32 submodel_limit); + + static std::string preprocessGLTF(std::string filename); + */ + +}; +#endif // LL_LLGLTFLLOADER_H diff --git a/indra/newview/gltf/primitive.cpp b/indra/newview/gltf/primitive.cpp index 5de45119fc..388a6eee01 100644 --- a/indra/newview/gltf/primitive.cpp +++ b/indra/newview/gltf/primitive.cpp @@ -32,11 +32,7 @@ #include "mikktspace/mikktspace.hh" -#if LL_USESYSTEMLIBS #include <meshoptimizer.h> -#else -#include "meshoptimizer/meshoptimizer.h" -#endif using namespace LL::GLTF; diff --git a/indra/newview/gltfscenemanager.cpp b/indra/newview/gltfscenemanager.cpp index 43e8fa3e3c..6a5dfd445e 100644 --- a/indra/newview/gltfscenemanager.cpp +++ b/indra/newview/gltfscenemanager.cpp @@ -69,9 +69,16 @@ void GLTFSceneManager::load() { return; } - if (filenames.size() > 0) + try + { + if (filenames.size() > 0) + { + GLTFSceneManager::instance().load(filenames[0]); + } + } + catch (std::bad_alloc&) { - GLTFSceneManager::instance().load(filenames[0]); + LLNotificationsUtil::add("CannotOpenFileTooBig"); } }, LLFilePicker::FFLOAD_GLTF, @@ -213,6 +220,7 @@ void GLTFSceneManager::uploadSelection() LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"), expected_upload_cost, + LLUUID::null, false, finish, failure)); @@ -276,6 +284,7 @@ void GLTFSceneManager::uploadSelection() LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"), expected_upload_cost, + LLUUID::null, false, finish, failure)); @@ -310,7 +319,7 @@ void GLTFSceneManager::load(const std::string& filename) { std::shared_ptr<Asset> asset = std::make_shared<Asset>(); - if (asset->load(filename)) + if (asset->load(filename, true)) { gDebugProgram.bind(); // bind a shader to satisfy LLVertexBuffer assertions asset->updateTransforms(); @@ -552,6 +561,7 @@ void GLTFSceneManager::update() LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"), expected_upload_cost, + LLUUID::null, false, finish, failure)); @@ -636,6 +646,12 @@ void GLTFSceneManager::render(Asset& asset, U8 variant) return; } + if (gGLTFPBRMetallicRoughnessProgram.mGLTFVariants.size() <= variant) + { + llassert(false); // mGLTFVariants should have been initialized + return; + } + for (U32 ds = 0; ds < 2; ++ds) { RenderData& rd = asset.mRenderData[ds]; diff --git a/indra/newview/groupchatlistener.cpp b/indra/newview/groupchatlistener.cpp index 43507f13e9..ed9e34d1bf 100644 --- a/indra/newview/groupchatlistener.cpp +++ b/indra/newview/groupchatlistener.cpp @@ -2,11 +2,11 @@ * @file groupchatlistener.cpp * @author Nat Goodspeed * @date 2011-04-11 - * @brief Implementation for groupchatlistener. + * @brief Implementation for LLGroupChatListener. * - * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2011, Linden Research, Inc. + * Copyright (C) 2024, 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 @@ -34,43 +34,69 @@ // std headers // external library headers // other Linden headers +#include "llchat.h" #include "llgroupactions.h" #include "llimview.h" +LLGroupChatListener::LLGroupChatListener(): + LLEventAPI("GroupChat", + "API to enter, leave, send and intercept group chat messages") +{ + add("startGroupChat", + "Enter a group chat in group with UUID [\"group_id\"]\n" + "Assumes the logged-in agent is already a member of this group.", + &LLGroupChatListener::startGroupChat, + llsd::map("group_id", LLSD())); + add("leaveGroupChat", + "Leave a group chat in group with UUID [\"group_id\"]\n" + "Assumes a prior successful startIM request.", + &LLGroupChatListener::leaveGroupChat, + llsd::map("group_id", LLSD())); + add("sendGroupIM", + "send a [\"message\"] to group with UUID [\"group_id\"]", + &LLGroupChatListener::sendGroupIM, + llsd::map("message", LLSD(), "group_id", LLSD())); +} -namespace { - void startIm_wrapper(LLSD const & event) +bool is_in_group(LLEventAPI::Response &response, const LLSD &data) +{ + if (!LLGroupActions::isInGroup(data["group_id"])) { - LLUUID session_id = LLGroupActions::startIM(event["id"].asUUID()); - sendReply(LLSDMap("session_id", LLSD(session_id)), event); + response.error(stringize("You are not the member of the group:", std::quoted(data["group_id"].asString()))); + return false; } + return true; +} - void send_message_wrapper(const std::string& text, const LLUUID& session_id, const LLUUID& group_id) +void LLGroupChatListener::startGroupChat(LLSD const &data) +{ + Response response(LLSD(), data); + if (!is_in_group(response, data)) + { + return; + } + if (LLGroupActions::startIM(data["group_id"]).isNull()) { - LLIMModel::sendMessage(text, session_id, group_id, IM_SESSION_GROUP_START); + return response.error(stringize("Failed to start group chat session ", std::quoted(data["group_id"].asString()))); } } +void LLGroupChatListener::leaveGroupChat(LLSD const &data) +{ + Response response(LLSD(), data); + if (is_in_group(response, data)) + { + LLGroupActions::endIM(data["group_id"].asUUID()); + } +} -GroupChatListener::GroupChatListener(): - LLEventAPI("GroupChat", - "API to enter, leave, send and intercept group chat messages") +void LLGroupChatListener::sendGroupIM(LLSD const &data) { - 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, - llsd::array("id")); - add("sendIM", - "send a groupchat IM", - &send_message_wrapper, - llsd::array("text", "session_id", "group_id")); + Response response(LLSD(), data); + if (!is_in_group(response, data)) + { + return; + } + LLUUID group_id(data["group_id"]); + LLIMModel::sendMessage(data["message"], gIMMgr->computeSessionID(IM_SESSION_GROUP_START, group_id), group_id, IM_SESSION_SEND); } -/* - 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 index 3819ac59b7..14cd7266a3 100644 --- a/indra/newview/groupchatlistener.h +++ b/indra/newview/groupchatlistener.h @@ -26,15 +26,20 @@ * $/LicenseInfo$ */ -#if ! defined(LL_GROUPCHATLISTENER_H) -#define LL_GROUPCHATLISTENER_H +#if ! defined(LL_LLGROUPCHATLISTENER_H) +#define LL_LLGROUPCHATLISTENER_H #include "lleventapi.h" -class GroupChatListener: public LLEventAPI +class LLGroupChatListener: public LLEventAPI { public: - GroupChatListener(); + LLGroupChatListener(); + +private: + void startGroupChat(LLSD const &data); + void leaveGroupChat(LLSD const &data); + void sendGroupIM(LLSD const &data); }; -#endif /* ! defined(LL_GROUPCHATLISTENER_H) */ +#endif /* ! defined(LL_LLGROUPCHATLISTENER_H) */ diff --git a/indra/newview/icons/release/secondlife.icns b/indra/newview/icons/release/secondlife.icns Binary files differindex a30b51b67a..00d9867814 100644 --- a/indra/newview/icons/release/secondlife.icns +++ b/indra/newview/icons/release/secondlife.icns diff --git a/indra/newview/icons/release/secondlife.iconset/icon_128x128.png b/indra/newview/icons/release/secondlife.iconset/icon_128x128.png Binary files differnew file mode 100644 index 0000000000..4c519db265 --- /dev/null +++ b/indra/newview/icons/release/secondlife.iconset/icon_128x128.png diff --git a/indra/newview/icons/release/secondlife.iconset/icon_128x128@2x.png b/indra/newview/icons/release/secondlife.iconset/icon_128x128@2x.png Binary files differnew file mode 100644 index 0000000000..2a3a0092b2 --- /dev/null +++ b/indra/newview/icons/release/secondlife.iconset/icon_128x128@2x.png diff --git a/indra/newview/icons/release/secondlife.iconset/icon_16x16.png b/indra/newview/icons/release/secondlife.iconset/icon_16x16.png Binary files differnew file mode 100644 index 0000000000..fda2f276ee --- /dev/null +++ b/indra/newview/icons/release/secondlife.iconset/icon_16x16.png diff --git a/indra/newview/icons/release/secondlife.iconset/icon_16x16@2x.png b/indra/newview/icons/release/secondlife.iconset/icon_16x16@2x.png Binary files differnew file mode 100644 index 0000000000..aa4a74f204 --- /dev/null +++ b/indra/newview/icons/release/secondlife.iconset/icon_16x16@2x.png diff --git a/indra/newview/icons/release/secondlife.iconset/icon_256x256.png b/indra/newview/icons/release/secondlife.iconset/icon_256x256.png Binary files differnew file mode 100644 index 0000000000..2a3a0092b2 --- /dev/null +++ b/indra/newview/icons/release/secondlife.iconset/icon_256x256.png diff --git a/indra/newview/icons/release/secondlife.iconset/icon_256x256@2x.png b/indra/newview/icons/release/secondlife.iconset/icon_256x256@2x.png Binary files differnew file mode 100644 index 0000000000..4c28add76c --- /dev/null +++ b/indra/newview/icons/release/secondlife.iconset/icon_256x256@2x.png diff --git a/indra/newview/icons/release/secondlife.iconset/icon_32x32.png b/indra/newview/icons/release/secondlife.iconset/icon_32x32.png Binary files differnew file mode 100644 index 0000000000..aa4a74f204 --- /dev/null +++ b/indra/newview/icons/release/secondlife.iconset/icon_32x32.png diff --git a/indra/newview/icons/release/secondlife.iconset/icon_32x32@2x.png b/indra/newview/icons/release/secondlife.iconset/icon_32x32@2x.png Binary files differnew file mode 100644 index 0000000000..23a36f66cb --- /dev/null +++ b/indra/newview/icons/release/secondlife.iconset/icon_32x32@2x.png diff --git a/indra/newview/icons/release/secondlife.iconset/icon_512x512.png b/indra/newview/icons/release/secondlife.iconset/icon_512x512.png Binary files differnew file mode 100644 index 0000000000..4c28add76c --- /dev/null +++ b/indra/newview/icons/release/secondlife.iconset/icon_512x512.png diff --git a/indra/newview/icons/release/secondlife.iconset/icon_512x512@2x.png b/indra/newview/icons/release/secondlife.iconset/icon_512x512@2x.png Binary files differnew file mode 100644 index 0000000000..a53a6697f1 --- /dev/null +++ b/indra/newview/icons/release/secondlife.iconset/icon_512x512@2x.png diff --git a/indra/newview/icons/release/secondlife_1024.png b/indra/newview/icons/release/secondlife_1024.png Binary files differnew file mode 100644 index 0000000000..a53a6697f1 --- /dev/null +++ b/indra/newview/icons/release/secondlife_1024.png diff --git a/indra/newview/icons/release/secondlife_128.png b/indra/newview/icons/release/secondlife_128.png Binary files differdeleted file mode 100644 index 2f21c1c7fc..0000000000 --- a/indra/newview/icons/release/secondlife_128.png +++ /dev/null diff --git a/indra/newview/icons/release/secondlife_16.png b/indra/newview/icons/release/secondlife_16.png Binary files differdeleted file mode 100644 index 68f1427309..0000000000 --- a/indra/newview/icons/release/secondlife_16.png +++ /dev/null diff --git a/indra/newview/icons/release/secondlife_256.png b/indra/newview/icons/release/secondlife_256.png Binary files differdeleted file mode 100644 index 8f324910e7..0000000000 --- a/indra/newview/icons/release/secondlife_256.png +++ /dev/null diff --git a/indra/newview/icons/release/secondlife_32.png b/indra/newview/icons/release/secondlife_32.png Binary files differdeleted file mode 100644 index 2b7cdef03d..0000000000 --- a/indra/newview/icons/release/secondlife_32.png +++ /dev/null diff --git a/indra/newview/icons/release/secondlife_48.png b/indra/newview/icons/release/secondlife_48.png Binary files differdeleted file mode 100644 index c2ef372dd7..0000000000 --- a/indra/newview/icons/release/secondlife_48.png +++ /dev/null diff --git a/indra/newview/icons/test/secondlife.ico b/indra/newview/icons/test/secondlife.ico Binary files differindex ceb8e8e6eb..c8430a6bd3 100644 --- a/indra/newview/icons/test/secondlife.ico +++ b/indra/newview/icons/test/secondlife.ico diff --git a/indra/newview/icons/test/secondlife_256.BMP b/indra/newview/icons/test/secondlife_256.BMP Binary files differindex e23fcfdbe9..829db82c52 100644 --- a/indra/newview/icons/test/secondlife_256.BMP +++ b/indra/newview/icons/test/secondlife_256.BMP diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index 77f24ac6a6..0e36698018 100644 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -164,6 +164,74 @@ Var DO_UNINSTALL_V2 # If non-null, path to a previous Viewer 2 installation !include "x64.nsh" # for 64bit detection
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Substring function
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+!define StrStr "!insertmacro StrStr"
+
+!macro StrStr ResultVar String SubString
+ Push `${String}`
+ Push `${SubString}`
+ Call StrStr
+ Pop `${ResultVar}`
+!macroend
+
+Function StrStr
+
+# After this point:
+# ------------------------------------------
+# $R0 = SubString (input)
+# $R1 = String (input)
+# $R2 = SubStringLen (temp)
+# $R3 = StrLen (temp)
+# $R4 = StartCharPos (temp)
+# $R5 = TempStr (temp)
+# function from nsis.sourceforge.io/StrStr
+
+ ;Get input from user
+ Exch $R0
+ Exch
+ Exch $R1
+ Push $R2
+ Push $R3
+ Push $R4
+ Push $R5
+
+ ;Get "String" and "SubString" length
+ StrLen $R2 $R0
+ StrLen $R3 $R1
+ ;Start "StartCharPos" counter
+ StrCpy $R4 0
+
+ ;Loop until "SubString" is found or "String" reaches its end
+ ${Do}
+ ;Remove everything before and after the searched part ("TempStr")
+ StrCpy $R5 $R1 $R2 $R4
+
+ ;Compare "TempStr" with "SubString"
+ ${IfThen} $R5 == $R0 ${|} ${ExitDo} ${|}
+ ;If not "SubString", this could be "String"'s end
+ ${IfThen} $R4 >= $R3 ${|} ${ExitDo} ${|}
+ ;If not, continue the loop
+ IntOp $R4 $R4 + 1
+ ${Loop}
+
+# After this point:
+# ------------------------------------------
+# $R0 = ResultVar (output)
+
+ ;Remove part before "SubString" on "String" (if there has one)
+ StrCpy $R0 $R1 `` $R4
+
+ ;Return output to user
+ Pop $R5
+ Pop $R4
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Exch $R0
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Pre-directory page callback
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Function dirPre
@@ -190,15 +258,31 @@ Function .onInit # However, SL-10506 complains about the resulting behavior, so the logic below
# is adapted from before we introduced MultiUser.nsh.
+# Check if user specified /D= on the command line
+System::Call 'kernel32::GetCommandLine()t .r0'
+Push $0
+Push " /D="
+Call StrStr
+Pop $1
+${If} $1 != ""
+ # /D= was specified, extract the path
+ # spaces are allowed in path after /D=, it's expected to be the last parameter
+ StrLen $2 $1
+ StrCpy $INSTDIR $1 $2 4 # Skip over " /D="
+ Goto after_instdir
+${EndIf}
+
# if $0 is empty, this is the first time for this viewer name
ReadRegStr $0 SHELL_CONTEXT "${INSTNAME_KEY}" ""
# viewer with this name was installed before
${If} $0 != ""
- # use the value we got from registry as install location
+ # use the value we got from registry as install location
StrCpy $INSTDIR $0
${EndIf}
+after_instdir:
+
Call CheckCPUFlags # Make sure we have SSE2 support
Call CheckWindowsVersion # Don't install On unsupported systems
Push $0
diff --git a/indra/newview/licenses-linux.txt b/indra/newview/licenses-linux.txt index 23dace4de0..e83989b4a7 100644 --- a/indra/newview/licenses-linux.txt +++ b/indra/newview/licenses-linux.txt @@ -51,6 +51,7 @@ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + =========== CEF License =========== @@ -405,6 +406,32 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +======== +sse2neon +======== +/* + * sse2neon is freely redistributable under the MIT License. + * + * Copyright (c) 2015-2026 SSE2NEON Contributors. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ ============ tinygltf @@ -431,3 +458,35 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +====== +V-HACD +====== +BSD 3-Clause License + +Copyright (c) 2011, Khaled Mamou (kmamou at gmail dot com) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/indra/newview/licenses-mac.txt b/indra/newview/licenses-mac.txt index a3792f0b6b..b1336f1bc4 100644 --- a/indra/newview/licenses-mac.txt +++ b/indra/newview/licenses-mac.txt @@ -48,7 +48,6 @@ Base32 License * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - =========== CEF License =========== @@ -83,7 +82,6 @@ CEF License // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ============ cURL License ============ @@ -135,7 +133,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ============= expat License ============= @@ -336,30 +333,6 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -=========== -SDL License -=========== - -SDL - Simple DirectMedia Layer -Copyright (C) 1997-2024 Sam Lantinga <slouken@libsdl.org> - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - - =============== OpenSSL License =============== @@ -477,21 +450,6 @@ copied and put under another distribution licence [including the GNU Public Licence.] -================== -xmlrpc-epi License -================== - -Copyright 2000 Epinions, Inc. - -Subject to the following 3 conditions, Epinions, Inc. permits you, free of charge, to (a) use, copy, distribute, modify, perform and display this software and associated documentation files (the "Software"), and (b) permit others to whom the Software is furnished to do so as well. - -1) The above copyright notice and this permission notice shall be included without modification in all copies or substantial portions of the Software. - -2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. - -3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH DAMAGES. - - ============ zlib License ============ @@ -687,6 +645,32 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +======== +sse2neon +======== +/* + * sse2neon is freely redistributable under the MIT License. + * + * Copyright (c) 2015-2026 SSE2NEON Contributors. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ ============ tinygltf @@ -738,47 +722,35 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -======== -sse2neon -======== -/* - * sse2neon is freely redistributable under the MIT License. - * - * Copyright (c) 2015-2024 SSE2NEON Contributors. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ +====== +V-HACD +====== +BSD 3-Clause License -=============================== -libwebrtc binaries (unofficial) -=============================== +Copyright (c) 2011, Khaled Mamou (kmamou at gmail dot com) +All rights reserved. -Copyright 2019 Zenichi Amano +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. - http://www.apache.org/licenses/LICENSE-2.0 +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/indra/newview/licenses-win32.txt b/indra/newview/licenses-win32.txt index eddc9a4475..946743f789 100644 --- a/indra/newview/licenses-win32.txt +++ b/indra/newview/licenses-win32.txt @@ -239,32 +239,48 @@ JPEG Library 6b License This software is based in part on the work of the Independent JPEG Group ================ -JPEG2000 License +OpenJPEG License ================ -Copyright 2001, David Taubman, The University of New South Wales (UNSW) -The copyright owner is Unisearch Ltd, Australia (commercial arm of UNSW) -Neither this copyright statement, nor the licensing details below -may be removed from this file or dissociated from its contents. - -Licensee: Linden Research, Inc. -License number: 00024 -The licensee has been granted a COMMERCIAL license to the contents of -this source file. A brief summary of this license appears below. This -summary is not to be relied upon in preference to the full text of the -license agreement, accepted at purchase of the license. -1. The Licensee has the right to Commercial Use of the Kakadu software, - including distribution of one or more Applications built using the - software. -2. The Licensee has the right to Internal Use of the Kakadu software, - including use by employees of the Licensee or an Affiliate for the - purpose of performing services on behalf of the Licensee or Affiliate, - or in the performance of services for Third Parties who engage Licensee - or an Affiliate for such services. -3. The Licensee has the right to distribute Reusable Code (including - source code and dynamically or statically linked libraries) to a Third - Party, provided the Third Party possesses a license to use the Kakadu - software. +/* + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third + * party and contributor rights, including patent rights, and no such rights + * are granted under this license. + * + * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2014, Professor Benoit Macq + * Copyright (c) 2003-2014, Antonin Descampe + * Copyright (c) 2003-2009, Francois-Olivier Devaux + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France + * Copyright (c) 2012, CS Systemes d'Information, France + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ ================== ogg/vorbis License @@ -418,21 +434,6 @@ copied and put under another distribution licence [including the GNU Public Licence.] -================== -xmlrpc-epi License -================== - -Copyright 2000 Epinions, Inc. - -Subject to the following 3 conditions, Epinions, Inc. permits you, free of charge, to (a) use, copy, distribute, modify, perform and display this software and associated documentation files (the "Software"), and (b) permit others to whom the Software is furnished to do so as well. - -1) The above copyright notice and this permission notice shall be included without modification in all copies or substantial portions of the Software. - -2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. - -3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH DAMAGES. - - ============ zlib License ============ @@ -558,218 +559,6 @@ supporting the PNG file format in commercial products. If you use this source code in a product, acknowledgment is not required but would be appreciated. -================= -Vivox SDK License -================= - -RSA Data Security, Inc. MD5 Message-Digest Algorithm - -Audio coding: Polycom(R) Siren14TM (ITU-T Rec. G.722.1 Annex C) - -Open Source Software Licensing -Each open source software component utilized by this product is subject to its own copyright and licensing terms, as listed below. - - -************************************************************* -************************************************************* - -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2000 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -************************************************************* -************************************************************* -RTP code under Lesser General Public License - -/* - The oRTP library is an RTP (Realtime Transport Protocol - rfc3550) stack. - Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org - - 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. - - 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -************************************************************ -************************************************************* - -/* - * The Vovida Software License, Version 1.0 - * - * Copyright (c) 2000 Vovida Networks, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The names "VOCAL", "Vovida Open Communication Application Library", - * and "Vovida Open Communication Application Library (VOCAL)" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact vocal@vovida.org. - * - * 4. Products derived from this software may not be called "VOCAL", nor - * may "VOCAL" appear in their name, without prior written - * permission of Vovida Networks, Inc. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND - * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA - * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES - * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE - * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * - * This software consists of voluntary contributions made by Vovida - * Networks, Inc. and many individuals on behalf of Vovida Networks, - * Inc. For more information on Vovida Networks, Inc., please see - * - * - */ -************************************************************* -************************************************************* - -Internet Software Consortium code - -/* This is from the BIND 4.9.4 release, modified to compile by itself */ -/* Copyright (c) 1996 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS - * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE - * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -************************************************************* - -************************************************************* - -************************************************************ - -http://tinyxpath.sourceforge.net/ - -TinyXPath is covered by the zlib license : - - www.sourceforge.net/projects/tinyxpath - Copyright (c) 2002-2006 Yves Berquin (yvesb@users.sourceforge.net) - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any - damages arising from the use of this software. - - Permission is granted to anyone to use this software for any - purpose, including commercial applications, and to alter it and - redistribute it freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product documentation - would be appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and - must not be misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source distribution. - - -************************************************************ -************************************************************ - -THE FREE SOFTWARE FOUNDATION - -Any customer may request the source code for all open source portions of this product which are covered by the Free Software Foundation's General Public License (GPL), for a period of three years from purchase. Please contact the vendor from whom you obtained this product for instructions. A fee equivalent to the cost of making the code available may be charged. Alternatively, customers may choose to download desired GPL components directly from their original vendors. Specifically, this product contains the following GPL-licensed components: - - -From Vivox: - - Assorted software components. To request source, contact Vivox at: - Vivox, Inc. - Attn: customer support - 40 Speen Street Suite 402 - Framingham, MA 01701 - - -======================== -google-perftools license -======================== - -Copyright (c) 2005, Google Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ============= meshoptimizer ============= @@ -795,6 +584,32 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +======== +sse2neon +======== +/* + * sse2neon is freely redistributable under the MIT License. + * + * Copyright (c) 2015-2026 SSE2NEON Contributors. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ ============ tinygltf @@ -821,6 +636,39 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +====== +V-HACD +====== +BSD 3-Clause License + +Copyright (c) 2011, Khaled Mamou (kmamou at gmail dot com) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ============== Vulkan GLTF ============== diff --git a/indra/newview/linux_tools/launch_url.sh b/indra/newview/linux_tools/launch_url.sh index 7c4ebf2291..404ea36f26 100755 --- a/indra/newview/linux_tools/launch_url.sh +++ b/indra/newview/linux_tools/launch_url.sh @@ -61,7 +61,6 @@ fi # will be tried first, which is a debian alternative. BROWSER_COMMANDS=" \ x-www-browser \ - chrome \ firefox \ mozilla-firefox \ iceweasel \ diff --git a/indra/newview/linux_tools/megapahit.desktop b/indra/newview/linux_tools/megapahit.desktop index 05e5d0175a..091df71e11 100755 --- a/indra/newview/linux_tools/megapahit.desktop +++ b/indra/newview/linux_tools/megapahit.desktop @@ -5,6 +5,6 @@ Exec=megapahit Icon=megapahit Terminal=false Type=Application -Categories=Application;Network; +Categories=Network; StartupNotify=true X-Desktop-File-Install-Version=3.0" diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh index a027aaf6d1..3019e844d2 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh @@ -4,16 +4,9 @@ ## These options are for self-assisted troubleshooting during this beta ## testing phase; you should not usually need to touch them. -## - Avoids using any FMOD STUDIO audio driver. -#export LL_BAD_FMODSTUDIO_DRIVER=x ## - Avoids using any OpenAL audio driver. #export LL_BAD_OPENAL_DRIVER=x -## - Avoids using the FMOD Studio or FMOD Ex PulseAudio audio driver. -#export LL_BAD_FMOD_PULSEAUDIO=x -## - Avoids using the FMOD Studio or FMOD Ex ALSA audio driver. -#export LL_BAD_FMOD_ALSA=x - ## - Avoids the optional OpenGL extensions which have proven most problematic ## on some hardware. Disabling this option may cause BETTER PERFORMANCE but ## may also cause CRASHES and hangs on some unstable combinations of drivers @@ -34,16 +27,10 @@ ## LL_GL_BLACKLIST which solves your problems. #export LL_GL_BLACKLIST=abcdefghijklmno -## - Some ATI/Radeon users report random X server crashes when the mouse -## cursor changes shape. If you suspect that you are a victim of this -## driver bug, try enabling this option and report whether it helps: -#export LL_ATI_MOUSE_CURSOR_BUG=x - if [ "`uname -m`" = "x86_64" ]; then echo '64-bit Linux detected.' fi - ## Everything below this line is just for advanced troubleshooters. ##------------------------------------------------------------------- @@ -55,9 +42,6 @@ fi #export LL_WRAPPER='gdb --args' #export LL_WRAPPER='valgrind --smc-check=all --error-limit=no --log-file=secondlife.vg --leak-check=full --suppressions=/usr/lib/valgrind/glibc-2.5.supp --suppressions=secondlife-i686.supp' -## - Avoids an often-buggy X feature that doesn't really benefit us anyway. -export SDL_VIDEO_X11_DGAMOUSE=0 - ## - The 'scim' GTK IM module widely crashes the viewer. Avoid it. if [ "$GTK_IM_MODULE" = "scim" ]; then export GTK_IM_MODULE=xim @@ -67,13 +51,6 @@ if [ "$XMODIFIERS" = "" ]; then export XMODIFIERS="@im=fcitx" fi -## - Automatically work around the ATI mouse cursor crash bug: -## (this workaround is disabled as most fglrx users do not see the bug) -#if lsmod | grep fglrx &>/dev/null ; then -# export LL_ATI_MOUSE_CURSOR_BUG=x -#fi - - ## Nothing worth editing below this line. ##------------------------------------------------------------------- diff --git a/indra/newview/llaccountingcostmanager.cpp b/indra/newview/llaccountingcostmanager.cpp index 54d8ceb85a..b30fe16c58 100644 --- a/indra/newview/llaccountingcostmanager.cpp +++ b/indra/newview/llaccountingcostmanager.cpp @@ -53,8 +53,8 @@ void LLAccountingCostManager::accountingCostCoro(std::string url, LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("AccountingCost", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("accountingCostCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); try { diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index dde4555770..aa620625ea 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -121,8 +121,8 @@ const F32 MIN_FIDGET_TIME = 8.f; // seconds const F32 MAX_FIDGET_TIME = 20.f; // seconds const S32 UI_FEATURE_VERSION = 1; -// For version 1: 1 - inventory, 2 - gltf -const S32 UI_FEATURE_FLAGS = 3; +// For version 1, flag holds: 1 - inventory thumbnails, 2 - gltf, 4 - inventory favorites +const S32 UI_FEATURE_FLAGS = 7; // The agent instance. LLAgent gAgent; @@ -167,7 +167,7 @@ std::map<S32, std::string> LLTeleportRequest::sTeleportStatusName = { { kPending class LLTeleportRequestViaLandmark : public LLTeleportRequest { public: - LLTeleportRequestViaLandmark(const LLUUID &pLandmarkId); + LLTeleportRequestViaLandmark(const LLUUID &pLandmarkId, bool log = true); virtual ~LLTeleportRequestViaLandmark(); virtual void toOstream(std::ostream& os) const; @@ -179,6 +179,7 @@ public: protected: inline const LLUUID &getLandmarkId() const {return mLandmarkId;}; + bool mLogOnDestruction = true; private: LLUUID mLandmarkId; @@ -223,7 +224,6 @@ private: LLVector3d mPosGlobal; }; - class LLTeleportRequestViaLocationLookAt : public LLTeleportRequestViaLocation { public: @@ -386,6 +386,10 @@ LLAgent::LLAgent() : mbRunning(false), mbTeleportKeepsLookAt(false), + mAllowedToStand(true), + mAllowedToSit(true), + mSitObjectID(LLUUID::null), + mAgentAccess(new LLAgentAccess(gSavedSettings)), mGodLevelChangeSignal(), mCanEditParcel(false), @@ -437,8 +441,8 @@ LLAgent::LLAgent() : mAutoPilotTargetDist(0.f), mAutoPilotNoProgressFrameCount(0), mAutoPilotRotationThreshold(0.f), - mAutoPilotFinishedCallback(NULL), - mAutoPilotCallbackData(NULL), + mAutoPilotFinishedCallback(nullptr), + mAutoPilotCallbackData(nullptr), mMovementKeysLocked(false), @@ -455,8 +459,8 @@ LLAgent::LLAgent() : mVoiceConnected(false), - mMouselookModeInSignal(NULL), - mMouselookModeOutSignal(NULL) + mMouselookModeInSignal(nullptr), + mMouselookModeOutSignal(nullptr) { for (U32 i = 0; i < TOTAL_CONTROLS; i++) { @@ -464,7 +468,7 @@ LLAgent::LLAgent() : mControlsTakenPassedOnCount[i] = 0; } - mListener.reset(new LLAgentListener(*this)); + mListener = std::make_shared<LLAgentListener>(*this); addParcelChangedCallback(&setCanEditParcel); @@ -604,7 +608,7 @@ void LLAgent::getFeatureVersionAndFlags(S32& version, S32& flags) if (feature_version.isInteger()) { version = feature_version.asInteger(); - flags = 1; // inventory flag + flags = 3; // show 'favorites' notification } else if (feature_version.isMap()) { @@ -630,13 +634,8 @@ void LLAgent::showLatestFeatureNotification(const std::string key) if (key == "inventory") { - // Notify user about new thumbnail support - flag = 1; - } - - if (key == "gltf") - { - flag = 2; + // Notify user about new favorites support + flag = 4; } if ((flags & flag) == 0) @@ -843,7 +842,6 @@ void LLAgent::movePitch(F32 mag) } } - // Does this parcel allow you to fly? bool LLAgent::canFly() { @@ -923,7 +921,6 @@ void LLAgent::setFlying(bool fly, bool fail_sound) LLFloaterMove::setFlyingMode(fly); } - // UI based mechanism of setting fly state //----------------------------------------------------------------------------- // toggleFlying() @@ -969,7 +966,11 @@ bool LLAgent::isSitting() void LLAgent::standUp() { - setControlFlags(AGENT_CONTROL_STAND_UP); + if (mAllowedToStand) + { + setControlFlags(AGENT_CONTROL_STAND_UP); + mSitObjectID = LLUUID::null; + } } void LLAgent::changeParcels() @@ -1002,7 +1003,6 @@ void LLAgent::capabilityReceivedCallback(const LLUUID ®ion_id, LLViewerRegion } } - //----------------------------------------------------------------------------- // setRegion() //----------------------------------------------------------------------------- @@ -1108,7 +1108,6 @@ void LLAgent::setRegion(LLViewerRegion *regionp) mRegionChangedSignal(); } - //----------------------------------------------------------------------------- // getRegion() //----------------------------------------------------------------------------- @@ -1117,7 +1116,6 @@ LLViewerRegion *LLAgent::getRegion() const return mRegionp; } - LLHost LLAgent::getRegionHost() const { if (mRegionp) @@ -1148,7 +1146,6 @@ bool LLAgent::inPrelude() return mRegionp && mRegionp->isPrelude(); } - std::string LLAgent::getRegionCapability(const std::string &name) { if (!mRegionp) @@ -1157,7 +1154,6 @@ std::string LLAgent::getRegionCapability(const std::string &name) return mRegionp->getCapability(name); } - //----------------------------------------------------------------------------- // canManageEstate() //----------------------------------------------------------------------------- @@ -1185,7 +1181,6 @@ void LLAgent::sendMessage() gMessageSystem->sendMessage(mRegionp->getHost()); } - //----------------------------------------------------------------------------- // sendReliableMessage() //----------------------------------------------------------------------------- @@ -1219,7 +1214,6 @@ LLVector3 LLAgent::getVelocity() const } } - //----------------------------------------------------------------------------- // setPositionAgent() //----------------------------------------------------------------------------- @@ -1293,16 +1287,20 @@ const LLVector3 &LLAgent::getPositionAgent() } } - return mFrameAgent.getOrigin(); } +void LLAgent::setAvatarsPositions(const std::map<LLUUID, LLVector3d>& avatarsPositions) +{ + mAvatarsPositions.clear(); + mAvatarsPositions = avatarsPositions; +} + boost::signals2::connection LLAgent::whenPositionChanged(position_signal_t::slot_type fn) { return mOnPositionChanged.connect(fn); } - //----------------------------------------------------------------------------- // getRegionsVisited() //----------------------------------------------------------------------------- @@ -1319,7 +1317,6 @@ F64 LLAgent::getDistanceTraveled() const return mDistanceTraveled; } - //----------------------------------------------------------------------------- // getPosAgentFromGlobal() //----------------------------------------------------------------------------- @@ -1330,7 +1327,6 @@ LLVector3 LLAgent::getPosAgentFromGlobal(const LLVector3d &pos_global) const return pos_agent; } - //----------------------------------------------------------------------------- // getPosGlobalFromAgent() //----------------------------------------------------------------------------- @@ -1343,10 +1339,9 @@ LLVector3d LLAgent::getPosGlobalFromAgent(const LLVector3 &pos_agent) const void LLAgent::sitDown() { - setControlFlags(AGENT_CONTROL_SIT_ON_GROUND); + if (mAllowedToSit) setControlFlags(AGENT_CONTROL_SIT_ON_GROUND); } - //----------------------------------------------------------------------------- // resetAxes() //----------------------------------------------------------------------------- @@ -1355,7 +1350,6 @@ void LLAgent::resetAxes() mFrameAgent.resetAxes(); } - // Copied from LLCamera::setOriginAndLookAt // Look_at must be unit vector //----------------------------------------------------------------------------- @@ -1384,7 +1378,6 @@ void LLAgent::resetAxes(const LLVector3 &look_at) mFrameAgent.setAxes(look_at, left, up); } - //----------------------------------------------------------------------------- // rotate() //----------------------------------------------------------------------------- @@ -1393,7 +1386,6 @@ void LLAgent::rotate(F32 angle, const LLVector3 &axis) mFrameAgent.rotate(angle, axis); } - //----------------------------------------------------------------------------- // rotate() //----------------------------------------------------------------------------- @@ -1402,7 +1394,6 @@ void LLAgent::rotate(F32 angle, F32 x, F32 y, F32 z) mFrameAgent.rotate(angle, x, y, z); } - //----------------------------------------------------------------------------- // rotate() //----------------------------------------------------------------------------- @@ -1411,7 +1402,6 @@ void LLAgent::rotate(const LLMatrix3 &matrix) mFrameAgent.rotate(matrix); } - //----------------------------------------------------------------------------- // rotate() //----------------------------------------------------------------------------- @@ -1420,7 +1410,6 @@ void LLAgent::rotate(const LLQuaternion &quaternion) mFrameAgent.rotate(quaternion); } - //----------------------------------------------------------------------------- // getReferenceUpVector() //----------------------------------------------------------------------------- @@ -1449,7 +1438,6 @@ LLVector3 LLAgent::getReferenceUpVector() return up_vector; } - // Radians, positive is forward into ground //----------------------------------------------------------------------------- // pitch() @@ -1493,7 +1481,6 @@ void LLAgent::pitch(F32 angle) } } - //----------------------------------------------------------------------------- // roll() //----------------------------------------------------------------------------- @@ -1502,7 +1489,6 @@ void LLAgent::roll(F32 angle) mFrameAgent.roll(angle); } - //----------------------------------------------------------------------------- // yaw() //----------------------------------------------------------------------------- @@ -1514,7 +1500,6 @@ void LLAgent::yaw(F32 angle) } } - // Returns a quat that represents the rotation of the agent in the absolute frame //----------------------------------------------------------------------------- // getQuat() @@ -1540,7 +1525,6 @@ void LLAgent::setControlFlags(U32 mask) mControlFlags |= mask; } - //----------------------------------------------------------------------------- // clearControlFlags() //----------------------------------------------------------------------------- @@ -1628,7 +1612,6 @@ bool LLAgent::isDoNotDisturb() const return mIsDoNotDisturb; } - //----------------------------------------------------------------------------- // startAutoPilotGlobal() //----------------------------------------------------------------------------- @@ -1734,7 +1717,6 @@ void LLAgent::startAutoPilotGlobal( mAutoPilotNoProgressFrameCount = 0; } - //----------------------------------------------------------------------------- // setAutoPilotTargetGlobal //----------------------------------------------------------------------------- @@ -1788,7 +1770,6 @@ void LLAgent::startFollowPilot(const LLUUID &leader_id, bool allow_flying, F32 s allow_flying); } - //----------------------------------------------------------------------------- // stopAutoPilot() //----------------------------------------------------------------------------- @@ -1830,7 +1811,6 @@ void LLAgent::stopAutoPilot(bool user_cancel) } } - // Returns necessary agent pitch and yaw changes, radians. //----------------------------------------------------------------------------- // autoPilot() @@ -2019,7 +1999,6 @@ void LLAgent::autoPilot(F32 *delta_yaw) } } - //----------------------------------------------------------------------------- // propagate() //----------------------------------------------------------------------------- @@ -2040,18 +2019,19 @@ void LLAgent::propagate(const F32 dt) } // handle rotation based on keyboard levels - constexpr F32 YAW_RATE = 90.f * DEG_TO_RAD; // radians per second - F32 angle = YAW_RATE * gAgentCamera.getYawKey() * dt; - if (fabs(angle) > 0.0f) + if (fabs(dt) > 1e-6) { - yaw(angle); - } + if (fabs(gAgentCamera.getYawKey()) > 1e-6) + { + static const F32 YAW_RATE = 90.f * DEG_TO_RAD; // radians per second + yaw(YAW_RATE * gAgentCamera.getYawKey() * dt); + } - constexpr F32 PITCH_RATE = 90.f * DEG_TO_RAD; // radians per second - angle = PITCH_RATE * gAgentCamera.getPitchKey() * dt; - if (fabs(angle) > 0.0f) - { - pitch(angle); + if (fabs(gAgentCamera.getPitchKey()) > 1e-6) + { + static const F32 PITCH_RATE = 90.f * DEG_TO_RAD; // radians per second + pitch(PITCH_RATE * gAgentCamera.getPitchKey() * dt); + } } // handle auto-land behavior @@ -2213,7 +2193,6 @@ void LLAgent::clearRenderState(U8 clearstate) mRenderState &= ~clearstate; } - //----------------------------------------------------------------------------- // getRenderState() //----------------------------------------------------------------------------- @@ -2255,6 +2234,7 @@ void LLAgent::endAnimationUpdateUI() { return; } + if (gAgentCamera.getCameraMode() == gAgentCamera.getLastCameraMode()) { // We're already done endAnimationUpdateUI for this transition. @@ -2320,7 +2300,6 @@ void LLAgent::endAnimationUpdateUI() mViewsPushed = false; } - gAgentCamera.setLookAt(LOOKAT_TARGET_CLEAR); if( gMorphView ) { @@ -2502,7 +2481,10 @@ void LLAgent::endAnimationUpdateUI() gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode()); } - gFloaterTools->dirty(); + if (gFloaterTools) + { + gFloaterTools->dirty(); + } // Don't let this be called more than once if the camera // mode hasn't changed. --JC @@ -2949,7 +2931,6 @@ void LLAgent::sendMaturityPreferenceToServer(U8 pPreferredMaturity) } } - void LLAgent::processMaturityPreferenceFromServer(const LLSD &result, U8 perferredMaturity) { U8 maturity = SIM_ACCESS_MIN; @@ -3019,7 +3000,6 @@ void LLAgent::changeInterestListMode(const std::string &new_mode) } } - bool LLAgent::requestPostCapability(const std::string &capName, LLSD &postData, httpCallback_t cbSuccess, httpCallback_t cbFailure) { if (getRegion()) @@ -3346,7 +3326,6 @@ void LLAgent::sendAnimationStateReset() sendReliableMessage(); } - // Send a message to the region to revoke sepecified permissions on ALL scripts in the region // If the target is an object in the region, permissions in scripts on that object are cleared. // If it is the region ID, all scripts clear the permissions for this agent @@ -4276,7 +4255,6 @@ void LLAgent::onCapabilitiesReceivedAfterTeleport() check_merchant_status(); } - void LLAgent::teleportRequest( const U64& region_handle, const LLVector3& pos_local, @@ -4318,9 +4296,14 @@ void LLAgent::teleportViaLandmark(const LLUUID& landmark_asset_id) void LLAgent::doTeleportViaLandmark(const LLUUID& landmark_asset_id) { - bool is_local(false); - LLViewerRegion* regionp = getRegion(); + LLViewerRegion* regionp = getRegion(); + if (!regionp) + { + LL_WARNS("Teleport") << "called when agent region is null" << LL_ENDL; + return; + } + bool is_local(false); if (LLLandmark* landmark = gLandmarkList.getAsset(landmark_asset_id, NULL)) { LLVector3d pos_global; @@ -4385,7 +4368,6 @@ void LLAgent::doTeleportViaLure(const LLUUID& lure_id, bool godlike) } } - // James Cook, July 28, 2005 void LLAgent::teleportCancel() { @@ -4510,7 +4492,6 @@ LLAgent::ETeleportState LLAgent::getTeleportState() const TELEPORT_NONE : mTeleportState; } - void LLAgent::setTeleportState(ETeleportState state) { if (mTeleportRequest && (state != TELEPORT_NONE) && (mTeleportRequest->getStatus() == LLTeleportRequest::kFailed)) @@ -4555,7 +4536,6 @@ void LLAgent::setTeleportState(ETeleportState state) } } - void LLAgent::stopCurrentAnimations() { LL_DEBUGS("Avatar") << "Stopping current animations" << LL_ENDL; @@ -4670,7 +4650,6 @@ void LLAgent::stopFidget() gAgent.sendAnimationRequests(anims, ANIM_REQUEST_STOP); } - void LLAgent::requestEnterGodMode() { LLMessageSystem* msg = gMessageSystem; @@ -4735,9 +4714,9 @@ void LLAgent::requestAgentUserInfoCoro(std::string capurl) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("requestAgentUserInfoCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("requestAgentUserInfoCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); LLCore::HttpHeaders::ptr_t httpHeaders; httpOpts->setFollowRedirects(true); @@ -4791,14 +4770,13 @@ void LLAgent::sendAgentUpdateUserInfo(const std::string& directory_visibility) } } - void LLAgent::updateAgentUserInfoCoro(std::string capurl, std::string directory_visibility) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("requestAgentUserInfoCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("requestAgentUserInfoCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); LLCore::HttpHeaders::ptr_t httpHeaders; httpOpts->setFollowRedirects(true); @@ -5045,16 +5023,25 @@ void LLTeleportRequest::toOstream(std::ostream& os) const //----------------------------------------------------------------------------- // LLTeleportRequestViaLandmark //----------------------------------------------------------------------------- -LLTeleportRequestViaLandmark::LLTeleportRequestViaLandmark(const LLUUID &pLandmarkId) - : LLTeleportRequest(), - mLandmarkId(pLandmarkId) +LLTeleportRequestViaLandmark::LLTeleportRequestViaLandmark(const LLUUID &pLandmarkId, bool log) + : LLTeleportRequest() + , mLandmarkId(pLandmarkId) + , mLogOnDestruction(true) { - LL_INFOS("Teleport") << "LLTeleportRequestViaLandmark created, " << *this << LL_ENDL; + if (log) + { + // Workaround to not log twice for LLTeleportRequestViaLure, besides this wouldn't have logged fully. + LL_INFOS("Teleport") << "LLTeleportRequestViaLandmark created, " << *this << LL_ENDL; + } } LLTeleportRequestViaLandmark::~LLTeleportRequestViaLandmark() { - LL_INFOS("Teleport") << "~LLTeleportRequestViaLandmark, " << *this << LL_ENDL; + if (mLogOnDestruction) + { + // Workaround to not crash on toOstream for derived classes and to not log twice. + LL_INFOS("Teleport") << "~LLTeleportRequestViaLandmark, " << *this << LL_ENDL; + } } void LLTeleportRequestViaLandmark::toOstream(std::ostream& os) const @@ -5084,16 +5071,20 @@ void LLTeleportRequestViaLandmark::restartTeleport() // LLTeleportRequestViaLure //----------------------------------------------------------------------------- -LLTeleportRequestViaLure::LLTeleportRequestViaLure(const LLUUID &pLureId, bool pIsLureGodLike) - : LLTeleportRequestViaLandmark(pLureId), +LLTeleportRequestViaLure::LLTeleportRequestViaLure(const LLUUID& pLureId, bool pIsLureGodLike) + : LLTeleportRequestViaLandmark(pLureId, false), mIsLureGodLike(pIsLureGodLike) { - LL_INFOS("Teleport") << "LLTeleportRequestViaLure created" << LL_ENDL; + LL_INFOS("Teleport") << "LLTeleportRequestViaLure created: " << *this << LL_ENDL; } LLTeleportRequestViaLure::~LLTeleportRequestViaLure() { - LL_INFOS("Teleport") << "~LLTeleportRequestViaLure" << LL_ENDL; + if (mLogOnDestruction) + { + LL_INFOS("Teleport") << "~LLTeleportRequestViaLure: " << *this << LL_ENDL; + mLogOnDestruction = false; + } } void LLTeleportRequestViaLure::toOstream(std::ostream& os) const diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index c1d3c6c14b..f5d928a1be 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -39,9 +39,10 @@ #include "httprequest.h" #include "llcorehttputil.h" -#include <boost/function.hpp> #include <boost/signals2.hpp> +#include <functional> + extern const bool ANIMATE; extern const U8 AGENT_STATE_TYPING; // Typing indication extern const U8 AGENT_STATE_EDITING; // Set when agent has objects selected @@ -195,6 +196,8 @@ public: // Call once per frame to update position, angles (radians). void updateAgentPosition(const F32 dt, const F32 yaw, const S32 mouse_x, const S32 mouse_y); void setPositionAgent(const LLVector3 ¢er); + void setAvatarsPositions(const std::map<LLUUID, LLVector3d>& avatarsPositions); + const std::map<LLUUID, LLVector3d>& getAvatarsPositions() const { return mAvatarsPositions;} boost::signals2::connection whenPositionChanged(position_signal_t::slot_type fn); @@ -205,6 +208,7 @@ private: position_signal_t mOnPositionChanged; LLVector3d mLastTestGlobal; + std::map<LLUUID, LLVector3d> mAvatarsPositions; //-------------------------------------------------------------------- // Velocity @@ -254,7 +258,7 @@ public: void changeParcels(); // called by LLViewerParcelMgr when we cross a parcel boundary // Register a boost callback to be called when the agent changes parcels - typedef boost::function<void()> parcel_changed_callback_t; + typedef std::function<void()> parcel_changed_callback_t; boost::signals2::connection addParcelChangedCallback(parcel_changed_callback_t); private: @@ -446,6 +450,16 @@ public: void standUp(); /// @brief ground-sit at agent's current position void sitDown(); + bool isAllowedToStand() const { return mAllowedToStand; } + void setAllowedToStand(bool allow) { mAllowedToStand = allow; } + bool isAllowedToSit() const { return mAllowedToSit; } + void setAllowedToSit(bool allow) { mAllowedToSit = allow; } + const LLUUID& getSitObjectID() const { return mSitObjectID; } + void setSitObjectID(const LLUUID& objectID) { mSitObjectID = objectID; } +private: + bool mAllowedToStand; + bool mAllowedToSit; + LLUUID mSitObjectID; //-------------------------------------------------------------------- // Do Not Disturb @@ -756,7 +770,7 @@ public: void requestEnterGodMode(); void requestLeaveGodMode(); - typedef boost::function<void (U8)> god_level_change_callback_t; + typedef std::function<void(U8)> god_level_change_callback_t; typedef boost::signals2::signal<void (U8)> god_level_change_signal_t; typedef boost::signals2::connection god_level_change_slot_t; @@ -964,8 +978,8 @@ public: /// Utilities for allowing the the agent sub managers to post and get via /// HTTP using the agent's policy settings and headers. - bool requestPostCapability(const std::string &capName, LLSD &postData, httpCallback_t cbSuccess = NULL, httpCallback_t cbFailure = NULL); - bool requestGetCapability(const std::string &capName, httpCallback_t cbSuccess = NULL, httpCallback_t cbFailure = NULL); + bool requestPostCapability(const std::string &capName, LLSD &postData, httpCallback_t cbSuccess = nullptr, httpCallback_t cbFailure = nullptr); + bool requestGetCapability(const std::string& capName, httpCallback_t cbSuccess = nullptr, httpCallback_t cbFailure = nullptr); LLCore::HttpRequest::policy_t getAgentPolicy() const { return mHttpPolicy; } diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 40cb6f6265..b6d31c0cae 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -1462,13 +1462,12 @@ void LLAgentCamera::updateCamera() // LL_INFOS() << "Current FOV Zoom: " << mCameraCurrentFOVZoomFactor << " Target FOV Zoom: " << mCameraFOVZoomFactor << " Object penetration: " << mFocusObjectDist << LL_ENDL; LLVector3 focus_agent = gAgent.getPosAgentFromGlobal(mFocusGlobal); + LLVector3 position_agent = gAgent.getPosAgentFromGlobal(camera_pos_global); - mCameraPositionAgent = gAgent.getPosAgentFromGlobal(camera_pos_global); + // Try to move the camera - // Move the camera - - LLViewerCamera::getInstance()->updateCameraLocation(mCameraPositionAgent, mCameraUpVector, focus_agent); - //LLViewerCamera::getInstance()->updateCameraLocation(mCameraPositionAgent, camera_skyward, focus_agent); + if (!LLViewerCamera::getInstance()->updateCameraLocation(position_agent, mCameraUpVector, focus_agent)) + return; // Change FOV LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / (1.f + mCameraCurrentFOVZoomFactor)); @@ -1476,7 +1475,7 @@ void LLAgentCamera::updateCamera() // follow camera when in customize mode if (cameraCustomizeAvatar()) { - setLookAt(LOOKAT_TARGET_FOCUS, NULL, mCameraPositionAgent); + setLookAt(LOOKAT_TARGET_FOCUS, NULL, position_agent); } // update the travel distance stat @@ -1495,8 +1494,8 @@ void LLAgentCamera::updateCamera() LLVector3 head_pos = gAgentAvatarp->mHeadp->getWorldPosition() + LLVector3(0.08f, 0.f, 0.05f) * gAgentAvatarp->mHeadp->getWorldRotation() + LLVector3(0.1f, 0.f, 0.f) * gAgentAvatarp->mPelvisp->getWorldRotation(); - LLVector3 diff = mCameraPositionAgent - head_pos; - diff = diff * ~gAgentAvatarp->mRoot->getWorldRotation(); + LLVector3 diff = position_agent - head_pos; + diff *= ~gAgentAvatarp->mRoot->getWorldRotation(); LLJoint* torso_joint = gAgentAvatarp->mTorsop; LLJoint* chest_joint = gAgentAvatarp->mChestp; @@ -1504,6 +1503,7 @@ void LLAgentCamera::updateCamera() LLVector3 chest_scale = chest_joint->getScale(); // shorten avatar skeleton to avoid foot interpenetration +#if 0 // This offsets mouselook attachments, is disabled in other TPVs if (!gAgentAvatarp->mInAir) { LLVector3 chest_offset = LLVector3(0.f, 0.f, chest_joint->getPosition().mV[VZ]) * torso_joint->getWorldRotation(); @@ -1517,6 +1517,7 @@ void LLAgentCamera::updateCamera() chest_joint->setScale(LLVector3(1.f, 1.f, scale_factor)); diff.mV[VZ] = 0.f; } +#endif // SL-315 gAgentAvatarp->mPelvisp->setPosition(gAgentAvatarp->mPelvisp->getPosition() + diff); @@ -1753,7 +1754,6 @@ F32 LLAgentCamera::calcCameraFOVZoomFactor() LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(bool *hit_limit) { // Compute base camera position and look-at points. - F32 camera_land_height; LLVector3d frame_center_global = !isAgentAvatarValid() ? gAgent.getPositionGlobal() : gAgent.getPosGlobalFromAgent(getAvatarRootPosition()); @@ -1988,22 +1988,13 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(bool *hit_limit) isConstrained = true; } } - -// JC - Could constrain camera based on parcel stuff here. -// LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromPosGlobal(camera_position_global); -// -// if (regionp && !regionp->mParcelOverlay->isBuildCameraAllowed(regionp->getPosRegionFromGlobal(camera_position_global))) -// { -// camera_position_global = last_position_global; -// -// isConstrained = true; -// } } - // Don't let camera go underground - F32 camera_min_off_ground = getCameraMinOffGround(); - camera_land_height = LLWorld::getInstance()->resolveLandHeightGlobal(camera_position_global); - F32 minZ = llmax(F_ALMOST_ZERO, camera_land_height + camera_min_off_ground); + // Don't let camera go underground if constrained + // If not constrained, permit going 1000m below 0, use case: retrieving objects + F32 camera_min_off_ground = getCameraMinOffGround(); // checks isDisableCameraConstraints + F32 camera_land_height = LLWorld::getInstance()->resolveLandHeightGlobal(camera_position_global); + F32 minZ = camera_land_height + camera_min_off_ground; if (camera_position_global.mdV[VZ] < minZ) { camera_position_global.mdV[VZ] = minZ; @@ -2266,7 +2257,8 @@ void LLAgentCamera::changeCameraToFollow(bool animate) mCameraMode = CAMERA_MODE_FOLLOW; // bang-in the current focus, position, and up vector of the follow cam - mFollowCam.reset(mCameraPositionAgent, LLViewerCamera::getInstance()->getPointOfInterest(), LLVector3::z_axis); + const LLViewerCamera& camera = LLViewerCamera::instance(); + mFollowCam.reset(camera.getOrigin(), camera.getPointOfInterest(), LLVector3::z_axis); if (gBasicToolset) { @@ -2658,7 +2650,7 @@ void LLAgentCamera::setCameraPosAndFocusGlobal(const LLVector3d& camera_pos, con if (mCameraAnimating) { - const F64 ANIM_METERS_PER_SECOND = 15.0; + const F64 ANIM_METERS_PER_SECOND = 20.0; const F64 MIN_ANIM_SECONDS = 0.5; const F64 MAX_ANIM_SECONDS = 3.0; F64 anim_duration = llmax( MIN_ANIM_SECONDS, sqrt(focus_delta_squared) / ANIM_METERS_PER_SECOND ); diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h index 52571f3c55..d277fd6158 100644 --- a/indra/newview/llagentcamera.h +++ b/indra/newview/llagentcamera.h @@ -112,6 +112,7 @@ private: //-------------------------------------------------------------------- public: void switchCameraPreset(ECameraPreset preset); + ECameraPreset getCameraPreset() const { return mCameraPreset; } /** Determines default camera offset depending on the current camera preset */ LLVector3 getCameraOffsetInitial(); /** Determines default focus offset depending on the current camera preset */ @@ -138,13 +139,14 @@ private: //-------------------------------------------------------------------- public: LLVector3d getCameraPositionGlobal() const; - const LLVector3 &getCameraPositionAgent() const; + const LLVector3& getCameraPositionAgent() const; LLVector3d calcCameraPositionTargetGlobal(bool *hit_limit = NULL); // Calculate the camera position target F32 getCameraMinOffGround(); // Minimum height off ground for this mode, meters void setCameraCollidePlane(const LLVector4 &plane) { mCameraCollidePlane = plane; } bool calcCameraMinDistance(F32 &obj_min_distance); - F32 getCurrentCameraBuildOffset() { return (F32)mCameraFocusOffset.length(); } + F32 getCurrentCameraBuildOffset() const { return (F32)mCameraFocusOffset.length(); } void clearCameraLag() { mCameraLag.clearVec(); } + const LLVector3& getCameraUpVector() const { return mCameraUpVector; } private: LLVector3 getAvatarRootPosition(); @@ -154,7 +156,6 @@ private: F32 mCameraCurrentFOVZoomFactor; // Interpolated fov zoom LLVector4 mCameraCollidePlane; // Colliding plane for camera F32 mCameraZoomFraction; // Mousewheel driven fraction of zoom - LLVector3 mCameraPositionAgent; // Camera position in agent coordinates LLVector3 mCameraVirtualPositionAgent; // Camera virtual position (target) before performing FOV zoom LLVector3d mCameraSmoothingLastPositionGlobal; LLVector3d mCameraSmoothingLastPositionAgent; @@ -278,7 +279,7 @@ public: F32 getAgentHUDTargetZoom(); void resetCameraZoomFraction(); - F32 getCurrentCameraZoomFraction() { return mCameraZoomFraction; } + F32 getCurrentCameraZoomFraction() const { return mCameraZoomFraction; } //-------------------------------------------------------------------- // Pan diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp index 0c120ae01d..5ddb87558a 100644 --- a/indra/newview/llagentlistener.cpp +++ b/indra/newview/llagentlistener.cpp @@ -31,19 +31,25 @@ #include "llagentlistener.h" #include "llagent.h" +#include "llagentcamera.h" +#include "llavatarname.h" +#include "llavatarnamecache.h" #include "llvoavatar.h" #include "llcommandhandler.h" +#include "llinventorymodel.h" #include "llslurl.h" #include "llurldispatcher.h" +#include "llviewercontrol.h" #include "llviewernetwork.h" #include "llviewerobject.h" #include "llviewerobjectlist.h" #include "llviewerregion.h" +#include "llvoavatarself.h" #include "llsdutil.h" #include "llsdutil_math.h" #include "lltoolgrab.h" #include "llhudeffectlookat.h" -#include "llagentcamera.h" +#include "llviewercamera.h" LLAgentListener::LLAgentListener(LLAgent &agent) : LLEventAPI("LLAgent", @@ -69,13 +75,6 @@ LLAgentListener::LLAgentListener(LLAgent &agent) add("resetAxes", "Set the agent to a fixed orientation (optionally specify [\"lookat\"] = array of [x, y, z])", &LLAgentListener::resetAxes); - add("getAxes", - "Obsolete - use getPosition instead\n" - "Send information about the agent's orientation on [\"reply\"]:\n" - "[\"euler\"]: map of {roll, pitch, yaw}\n" - "[\"quat\"]: array of [x, y, z, w] quaternion values", - &LLAgentListener::getAxes, - LLSDMap("reply", LLSD())); add("getPosition", "Send information about the agent's position and orientation on [\"reply\"]:\n" "[\"region\"]: array of region {x, y, z} position\n" @@ -87,33 +86,34 @@ LLAgentListener::LLAgentListener(LLAgent &agent) add("startAutoPilot", "Start the autopilot system using the following parameters:\n" "[\"target_global\"]: array of target global {x, y, z} position\n" - "[\"stop_distance\"]: target maxiumum distance from target [default: autopilot guess]\n" + "[\"stop_distance\"]: maximum stop distance from target [default: autopilot guess]\n" "[\"target_rotation\"]: array of [x, y, z, w] quaternion values [default: no target]\n" "[\"rotation_threshold\"]: target maximum angle from target facing rotation [default: 0.03 radians]\n" - "[\"behavior_name\"]: name of the autopilot behavior [default: \"\"]" - "[\"allow_flying\"]: allow flying during autopilot [default: True]", - //"[\"callback_pump\"]: pump to send success/failure and callback data to [default: none]\n" - //"[\"callback_data\"]: data to send back during a callback [default: none]", - &LLAgentListener::startAutoPilot); + "[\"behavior_name\"]: name of the autopilot behavior [default: \"\"]\n" + "[\"allow_flying\"]: allow flying during autopilot [default: True]\n" + "event with [\"success\"] flag is sent to 'LLAutopilot' event pump, when auto pilot is terminated", + &LLAgentListener::startAutoPilot, + llsd::map("target_global", LLSD())); add("getAutoPilot", "Send information about current state of the autopilot system to [\"reply\"]:\n" "[\"enabled\"]: boolean indicating whether or not autopilot is enabled\n" "[\"target_global\"]: array of target global {x, y, z} position\n" "[\"leader_id\"]: uuid of target autopilot is following\n" - "[\"stop_distance\"]: target maximum distance from target\n" + "[\"stop_distance\"]: maximum stop distance from target\n" "[\"target_distance\"]: last known distance from target\n" "[\"use_rotation\"]: boolean indicating if autopilot has a target facing rotation\n" "[\"target_facing\"]: array of {x, y} target direction to face\n" "[\"rotation_threshold\"]: target maximum angle from target facing rotation\n" "[\"behavior_name\"]: name of the autopilot behavior", &LLAgentListener::getAutoPilot, - LLSDMap("reply", LLSD())); + llsd::map("reply", LLSD())); add("startFollowPilot", "[\"leader_id\"]: uuid of target to follow using the autopilot system (optional with avatar_name)\n" "[\"avatar_name\"]: avatar name to follow using the autopilot system (optional with leader_id)\n" "[\"allow_flying\"]: allow flying during autopilot [default: True]\n" - "[\"stop_distance\"]: target maxiumum distance from target [default: autopilot guess]", - &LLAgentListener::startFollowPilot); + "[\"stop_distance\"]: maximum stop distance from target [default: autopilot guess]", + &LLAgentListener::startFollowPilot, + llsd::map("reply", LLSD())); add("setAutoPilotTarget", "Update target for currently running autopilot:\n" "[\"target_global\"]: array of target global {x, y, z} position", @@ -138,6 +138,69 @@ LLAgentListener::LLAgentListener(LLAgent &agent) "[\"contrib\"]: user's land contribution to this group\n", &LLAgentListener::getGroups, LLSDMap("reply", LLSD())); + //camera params are similar to LSL, see https://wiki.secondlife.com/wiki/LlSetCameraParams + add("setCameraParams", + "Set Follow camera params, and then activate it:\n" + "[\"camera_pos\"]: vector3, camera position in region coordinates\n" + "[\"focus_pos\"]: vector3, what the camera is aimed at (in region coordinates)\n" + "[\"focus_offset\"]: vector3, adjusts the camera focus position relative to the target, default is (1, 0, 0)\n" + "[\"distance\"]: float (meters), distance the camera wants to be from its target, default is 3\n" + "[\"focus_threshold\"]: float (meters), sets the radius of a sphere around the camera's target position within which its focus is not affected by target motion, default is 1\n" + "[\"camera_threshold\"]: float (meters), sets the radius of a sphere around the camera's ideal position within which it is not affected by target motion, default is 1\n" + "[\"focus_lag\"]: float (seconds), how much the camera lags as it tries to aim towards the target, default is 0.1\n" + "[\"camera_lag\"]: float (seconds), how much the camera lags as it tries to move towards its 'ideal' position, default is 0.1\n" + "[\"camera_pitch\"]: float (degrees), adjusts the angular amount that the camera aims straight ahead vs. straight down, maintaining the same distance, default is 0\n" + "[\"behindness_angle\"]: float (degrees), sets the angle in degrees within which the camera is not constrained by changes in target rotation, default is 10\n" + "[\"behindness_lag\"]: float (seconds), sets how strongly the camera is forced to stay behind the target if outside of behindness angle, default is 0\n" + "[\"camera_locked\"]: bool, locks the camera position so it will not move\n" + "[\"focus_locked\"]: bool, locks the camera focus so it will not move", + &LLAgentListener::setFollowCamParams); + add("setFollowCamActive", + "Turns on or off scripted control of the camera using boolean [\"active\"]", + &LLAgentListener::setFollowCamActive, + llsd::map("active", LLSD())); + add("removeCameraParams", + "Reset Follow camera params", + &LLAgentListener::removeFollowCamParams); + + add("playAnimation", + "Play [\"item_id\"] animation locally (by default) or [\"inworld\"] (when set to true)", + &LLAgentListener::playAnimation, + llsd::map("item_id", LLSD(), "reply", LLSD())); + add("stopAnimation", + "Stop playing [\"item_id\"] animation", + &LLAgentListener::stopAnimation, + llsd::map("item_id", LLSD(), "reply", LLSD())); + add("getAnimationInfo", + "Return information about [\"item_id\"] animation", + &LLAgentListener::getAnimationInfo, + llsd::map("item_id", LLSD(), "reply", LLSD())); + + add("getID", + "Return your own avatar ID", + &LLAgentListener::getID, + llsd::map("reply", LLSD())); + + add("getNearbyAvatarsList", + "Return result set key [\"result\"] for nearby avatars in a range of [\"dist\"]\n" + "if [\"dist\"] is not specified, 'RenderFarClip' setting is used\n" + "reply contains \"result\" table with \"id\", \"name\", \"global_pos\", \"region_pos\", \"region_id\" fields", + &LLAgentListener::getNearbyAvatarsList, + llsd::map("reply", LLSD())); + + add("getNearbyObjectsList", + "Return result set key [\"result\"] for nearby objects in a range of [\"dist\"]\n" + "if [\"dist\"] is not specified, 'RenderFarClip' setting is used\n" + "reply contains \"result\" table with \"id\", \"global_pos\", \"region_pos\", \"region_id\" fields", + &LLAgentListener::getNearbyObjectsList, + llsd::map("reply", LLSD())); + + add("getAgentScreenPos", + "Return screen position of the [\"avatar_id\"] avatar or own avatar if not specified\n" + "reply contains \"x\", \"y\" coordinates and \"onscreen\" flag to indicate if it's actually in within the current window\n" + "avatar render position is used as the point", + &LLAgentListener::getAgentScreenPos, + llsd::map("reply", LLSD())); } void LLAgentListener::requestTeleport(LLSD const & event_data) const @@ -168,7 +231,7 @@ void LLAgentListener::requestSit(LLSD const & event_data) const //mAgent.getAvatarObject()->sitOnObject(); // shamelessly ripped from llviewermenu.cpp:handle_sit_or_stand() // *TODO - find a permanent place to share this code properly. - + Response response(LLSD(), event_data); LLViewerObject *object = NULL; if (event_data.has("obj_uuid")) { @@ -177,7 +240,13 @@ void LLAgentListener::requestSit(LLSD const & event_data) const else if (event_data.has("position")) { LLVector3 target_position = ll_vector3_from_sd(event_data["position"]); - object = findObjectClosestTo(target_position); + object = findObjectClosestTo(target_position, true); + } + else + { + //just sit on the ground + mAgent.setControlFlags(AGENT_CONTROL_SIT_ON_GROUND); + return; } if (object && object->getPCode() == LL_PCODE_VOLUME) @@ -194,8 +263,7 @@ void LLAgentListener::requestSit(LLSD const & event_data) const } else { - LL_WARNS() << "LLAgent requestSit could not find the sit target: " - << event_data << LL_ENDL; + response.error("requestSit could not find the sit target"); } } @@ -205,7 +273,7 @@ void LLAgentListener::requestStand(LLSD const & event_data) const } -LLViewerObject * LLAgentListener::findObjectClosestTo( const LLVector3 & position ) const +LLViewerObject * LLAgentListener::findObjectClosestTo(const LLVector3 & position, bool sit_target) const { LLViewerObject *object = NULL; @@ -216,8 +284,13 @@ LLViewerObject * LLAgentListener::findObjectClosestTo( const LLVector3 & positio while (cur_index < num_objects) { LLViewerObject * cur_object = gObjectList.getObject(cur_index++); - if (cur_object) - { // Calculate distance from the target position + if (cur_object && !cur_object->isAttachment()) + { + if(sit_target && (cur_object->getPCode() != LL_PCODE_VOLUME)) + { + continue; + } + // Calculate distance from the target position LLVector3 target_diff = cur_object->getPositionRegion() - position; F32 distance_to_target = target_diff.length(); if (distance_to_target < min_distance) @@ -296,22 +369,6 @@ void LLAgentListener::resetAxes(const LLSD& event_data) const } } -void LLAgentListener::getAxes(const LLSD& event_data) const -{ - LLQuaternion quat(mAgent.getQuat()); - F32 roll, pitch, yaw; - quat.getEulerAngles(&roll, &pitch, &yaw); - // The official query API for LLQuaternion's [x, y, z, w] values is its - // public member mQ... - LLSD reply = LLSD::emptyMap(); - reply["quat"] = llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ)); - reply["euler"] = LLSD::emptyMap(); - reply["euler"]["roll"] = roll; - reply["euler"]["pitch"] = pitch; - reply["euler"]["yaw"] = yaw; - sendReply(reply, event_data); -} - void LLAgentListener::getPosition(const LLSD& event_data) const { F32 roll, pitch, yaw; @@ -333,14 +390,13 @@ void LLAgentListener::getPosition(const LLSD& event_data) const void LLAgentListener::startAutoPilot(LLSD const & event_data) { - LLQuaternion target_rotation_value; LLQuaternion* target_rotation = NULL; if (event_data.has("target_rotation")) { - target_rotation_value = ll_quaternion_from_sd(event_data["target_rotation"]); + LLQuaternion target_rotation_value = ll_quaternion_from_sd(event_data["target_rotation"]); target_rotation = &target_rotation_value; } - // *TODO: Use callback_pump and callback_data + F32 rotation_threshold = 0.03f; if (event_data.has("rotation_threshold")) { @@ -360,13 +416,24 @@ void LLAgentListener::startAutoPilot(LLSD const & event_data) stop_distance = (F32)event_data["stop_distance"].asReal(); } + std::string behavior_name = LLCoros::getName(); + if (event_data.has("behavior_name")) + { + behavior_name = event_data["behavior_name"].asString(); + } + // Clear follow target, this is doing a path mFollowTarget.setNull(); + auto finish_cb = [](bool success, void*) + { + LLEventPumps::instance().obtain("LLAutopilot").post(llsd::map("success", success)); + }; + mAgent.startAutoPilotGlobal(ll_vector3d_from_sd(event_data["target_global"]), - event_data["behavior_name"], + behavior_name, target_rotation, - NULL, NULL, + finish_cb, NULL, stop_distance, rotation_threshold, allow_flying); @@ -374,7 +441,7 @@ void LLAgentListener::startAutoPilot(LLSD const & event_data) void LLAgentListener::getAutoPilot(const LLSD& event_data) const { - LLSD reply = LLSD::emptyMap(); + Response reply(LLSD(), event_data); LLSD::Boolean enabled = mAgent.getAutoPilot(); reply["enabled"] = enabled; @@ -403,12 +470,11 @@ void LLAgentListener::getAutoPilot(const LLSD& event_data) const reply["rotation_threshold"] = mAgent.getAutoPilotRotationThreshold(); reply["behavior_name"] = mAgent.getAutoPilotBehaviorName(); reply["fly"] = (LLSD::Boolean) mAgent.getFlying(); - - sendReply(reply, event_data); } void LLAgentListener::startFollowPilot(LLSD const & event_data) { + Response response(LLSD(), event_data); LLUUID target_id; bool allow_flying = true; @@ -442,6 +508,10 @@ void LLAgentListener::startFollowPilot(LLSD const & event_data) } } } + else + { + return response.error("'leader_id' or 'avatar_name' should be specified"); + } F32 stop_distance = 0.f; if (event_data.has("stop_distance")) @@ -449,13 +519,16 @@ void LLAgentListener::startFollowPilot(LLSD const & event_data) stop_distance = (F32)event_data["stop_distance"].asReal(); } - if (target_id.notNull()) + if (!gObjectList.findObject(target_id)) { - mAgent.setFlying(allow_flying); - mFollowTarget = target_id; // Save follow target so we can report distance later - - mAgent.startFollowPilot(target_id, allow_flying, stop_distance); + std::string target_info = event_data.has("leader_id") ? event_data["leader_id"] : event_data["avatar_name"]; + return response.error(stringize("Target ", std::quoted(target_info), " was not found")); } + + mAgent.setFlying(allow_flying); + mFollowTarget = target_id; // Save follow target so we can report distance later + + mAgent.startFollowPilot(target_id, allow_flying, stop_distance); } void LLAgentListener::setAutoPilotTarget(LLSD const & event_data) const @@ -519,3 +592,209 @@ void LLAgentListener::getGroups(const LLSD& event) const } sendReply(LLSDMap("groups", reply), event); } + +/*----------------------------- camera control -----------------------------*/ +// specialize LLSDParam to support (const LLVector3&) arguments -- this +// wouldn't even be necessary except that the relevant LLVector3 constructor +// is explicitly explicit +template <> +class LLSDParam<const LLVector3&>: public LLSDParamBase +{ +public: + LLSDParam(const LLSD& value): value(LLVector3(value)) {} + + operator const LLVector3&() const { return value; } + +private: + LLVector3 value; +}; + +// accept any of a number of similar LLFollowCamMgr methods with different +// argument types, and return a wrapper lambda that accepts LLSD and converts +// to the target argument type +template <typename T> +auto wrap(void (LLFollowCamMgr::*method)(const LLUUID& source, T arg)) +{ + return [method](LLFollowCamMgr& followcam, const LLUUID& source, const LLSD& arg) + { (followcam.*method)(source, LLSDParam<T>(arg)); }; +} + +// table of supported LLFollowCamMgr methods, +// with the corresponding setFollowCamParams() argument keys +static std::pair<std::string, std::function<void(LLFollowCamMgr&, const LLUUID&, const LLSD&)>> +cam_params[] = +{ + { "camera_pos", wrap(&LLFollowCamMgr::setPosition) }, + { "focus_pos", wrap(&LLFollowCamMgr::setFocus) }, + { "focus_offset", wrap(&LLFollowCamMgr::setFocusOffset) }, + { "camera_locked", wrap(&LLFollowCamMgr::setPositionLocked) }, + { "focus_locked", wrap(&LLFollowCamMgr::setFocusLocked) }, + { "distance", wrap(&LLFollowCamMgr::setDistance) }, + { "focus_threshold", wrap(&LLFollowCamMgr::setFocusThreshold) }, + { "camera_threshold", wrap(&LLFollowCamMgr::setPositionThreshold) }, + { "focus_lag", wrap(&LLFollowCamMgr::setFocusLag) }, + { "camera_lag", wrap(&LLFollowCamMgr::setPositionLag) }, + { "camera_pitch", wrap(&LLFollowCamMgr::setPitch) }, + { "behindness_lag", wrap(&LLFollowCamMgr::setBehindnessLag) }, + { "behindness_angle", wrap(&LLFollowCamMgr::setBehindnessAngle) }, +}; + +void LLAgentListener::setFollowCamParams(const LLSD& event) const +{ + auto& followcam{ LLFollowCamMgr::instance() }; + for (const auto& pair : cam_params) + { + if (event.has(pair.first)) + { + pair.second(followcam, gAgentID, event[pair.first]); + } + } + followcam.setCameraActive(gAgentID, true); +} + +void LLAgentListener::setFollowCamActive(LLSD const & event) const +{ + LLFollowCamMgr::getInstance()->setCameraActive(gAgentID, event["active"]); +} + +void LLAgentListener::removeFollowCamParams(LLSD const & event) const +{ + LLFollowCamMgr::getInstance()->removeFollowCamParams(gAgentID); +} + +LLViewerInventoryItem* get_anim_item(LLEventAPI::Response &response, const LLSD &event_data) +{ + LLViewerInventoryItem* item = gInventory.getItem(event_data["item_id"].asUUID()); + if (!item || (item->getInventoryType() != LLInventoryType::IT_ANIMATION)) + { + response.error(stringize("Animation item ", std::quoted(event_data["item_id"].asString()), " was not found")); + return NULL; + } + return item; +} + +void LLAgentListener::playAnimation(LLSD const &event_data) +{ + Response response(LLSD(), event_data); + if (LLViewerInventoryItem* item = get_anim_item(response, event_data)) + { + if (event_data["inworld"].asBoolean()) + { + mAgent.sendAnimationRequest(item->getAssetUUID(), ANIM_REQUEST_START); + } + else + { + gAgentAvatarp->startMotion(item->getAssetUUID()); + } + } +} + +void LLAgentListener::stopAnimation(LLSD const &event_data) +{ + Response response(LLSD(), event_data); + if (LLViewerInventoryItem* item = get_anim_item(response, event_data)) + { + gAgentAvatarp->stopMotion(item->getAssetUUID()); + mAgent.sendAnimationRequest(item->getAssetUUID(), ANIM_REQUEST_STOP); + } +} + +void LLAgentListener::getAnimationInfo(LLSD const &event_data) +{ + Response response(LLSD(), event_data); + if (LLViewerInventoryItem* item = get_anim_item(response, event_data)) + { + // if motion exists, will return existing one + LLMotion* motion = gAgentAvatarp->createMotion(item->getAssetUUID()); + response["anim_info"] = llsd::map("duration", motion->getDuration(), + "is_loop", motion->getLoop(), + "num_joints", motion->getNumJointMotions(), + "asset_id", item->getAssetUUID(), + "priority", motion->getPriority()); + } +} + +void LLAgentListener::getID(LLSD const& event_data) +{ + Response response(llsd::map("id", gAgentID), event_data); +} + +F32 get_search_radius(LLSD const& event_data) +{ + static LLCachedControl<F32> render_far_clip(gSavedSettings, "RenderFarClip", 64); + F32 dist = render_far_clip; + if (event_data.has("dist")) + { + dist = llclamp((F32)event_data["dist"].asReal(), 1, 512); + } + return dist * dist; +} + +void LLAgentListener::getNearbyAvatarsList(LLSD const& event_data) +{ + Response response(LLSD(), event_data); + F32 radius = get_search_radius(event_data); + LLVector3d agent_pos = gAgent.getPositionGlobal(); + for (LLCharacter* character : LLCharacter::sInstances) + { + LLVOAvatar* avatar = (LLVOAvatar*)character; + if (avatar && !avatar->isDead() && !avatar->isControlAvatar() && !avatar->isSelf()) + { + if ((dist_vec_squared(avatar->getPositionGlobal(), agent_pos) <= radius)) + { + LLAvatarName av_name; + LLAvatarNameCache::get(avatar->getID(), &av_name); + LLVector3 region_pos = avatar->getCharacterPosition(); + response["result"].append(llsd::map("id", avatar->getID(), "global_pos", ll_sd_from_vector3d(avatar->getPosGlobalFromAgent(region_pos)), + "region_pos", ll_sd_from_vector3(region_pos), "name", av_name.getUserName(), "region_id", avatar->getRegion()->getRegionID())); + } + } + } +} + +void LLAgentListener::getNearbyObjectsList(LLSD const& event_data) +{ + Response response(LLSD(), event_data); + F32 radius = get_search_radius(event_data); + S32 num_objects = gObjectList.getNumObjects(); + LLVector3d agent_pos = gAgent.getPositionGlobal(); + for (S32 i = 0; i < num_objects; ++i) + { + LLViewerObject* object = gObjectList.getObject(i); + if (object && object->getVolume() && !object->isAttachment()) + { + if ((dist_vec_squared(object->getPositionGlobal(), agent_pos) <= radius)) + { + response["result"].append(llsd::map("id", object->getID(), "global_pos", ll_sd_from_vector3d(object->getPositionGlobal()), "region_pos", + ll_sd_from_vector3(object->getPositionRegion()), "region_id", object->getRegion()->getRegionID())); + } + } + } +} + +void LLAgentListener::getAgentScreenPos(LLSD const& event_data) +{ + Response response(LLSD(), event_data); + LLVector3 render_pos; + if (event_data.has("avatar_id") && (event_data["avatar_id"].asUUID() != gAgentID)) + { + LLUUID avatar_id(event_data["avatar_id"]); + for (LLCharacter* character : LLCharacter::sInstances) + { + LLVOAvatar* avatar = (LLVOAvatar*)character; + if (!avatar->isDead() && (avatar->getID() == avatar_id)) + { + render_pos = avatar->getRenderPosition(); + break; + } + } + } + else if (gAgentAvatarp.notNull() && gAgentAvatarp->isValid()) + { + render_pos = gAgentAvatarp->getRenderPosition(); + } + LLCoordGL screen_pos; + response["onscreen"] = LLViewerCamera::getInstance()->projectPosAgentToScreen(render_pos, screen_pos, false); + response["x"] = screen_pos.mX; + response["y"] = screen_pos.mY; +} diff --git a/indra/newview/llagentlistener.h b/indra/newview/llagentlistener.h index c544d089ce..b5bea8c0bd 100644 --- a/indra/newview/llagentlistener.h +++ b/indra/newview/llagentlistener.h @@ -48,7 +48,6 @@ private: void requestStand(LLSD const & event_data) const; void requestTouch(LLSD const & event_data) const; void resetAxes(const LLSD& event_data) const; - void getAxes(const LLSD& event_data) const; void getGroups(const LLSD& event) const; void getPosition(const LLSD& event_data) const; void startAutoPilot(const LLSD& event_data); @@ -58,7 +57,20 @@ private: void stopAutoPilot(const LLSD& event_data) const; void lookAt(LLSD const & event_data) const; - LLViewerObject * findObjectClosestTo( const LLVector3 & position ) const; + void setFollowCamParams(LLSD const & event_data) const; + void setFollowCamActive(LLSD const & event_data) const; + void removeFollowCamParams(LLSD const & event_data) const; + + void playAnimation(LLSD const &event_data); + void stopAnimation(LLSD const &event_data); + void getAnimationInfo(LLSD const &event_data); + + void getID(LLSD const& event_data); + void getNearbyAvatarsList(LLSD const& event_data); + void getNearbyObjectsList(LLSD const& event_data); + void getAgentScreenPos(LLSD const& event_data); + + LLViewerObject * findObjectClosestTo( const LLVector3 & position, bool sit_target = false ) const; private: LLAgent & mAgent; diff --git a/indra/newview/llagentpicksinfo.cpp b/indra/newview/llagentpicksinfo.cpp index 265e4060ff..4a5c037f1f 100644 --- a/indra/newview/llagentpicksinfo.cpp +++ b/indra/newview/llagentpicksinfo.cpp @@ -53,7 +53,7 @@ public: LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesRequest(gAgent.getID()); } - typedef boost::function<void(LLAvatarData*)> server_respond_callback_t; + typedef std::function<void(LLAvatarData*)> server_respond_callback_t; void setServerRespondCallback(const server_respond_callback_t& cb) { diff --git a/indra/newview/llagentpilot.cpp b/indra/newview/llagentpilot.cpp index 0b5198bbd3..8b18b7d5a2 100644 --- a/indra/newview/llagentpilot.cpp +++ b/indra/newview/llagentpilot.cpp @@ -322,9 +322,7 @@ void LLAgentPilot::moveCamera() LLViewerCamera::getInstance()->setView(view); LLViewerCamera::getInstance()->setOrigin(origin); - LLViewerCamera::getInstance()->mXAxis = LLVector3(mat.mMatrix[0]); - LLViewerCamera::getInstance()->mYAxis = LLVector3(mat.mMatrix[1]); - LLViewerCamera::getInstance()->mZAxis = LLVector3(mat.mMatrix[2]); + LLViewerCamera::getInstance()->setAxes(mat); } } diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index cd4222dddf..5801ba1eb8 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -538,6 +538,27 @@ LLInventoryItem* LLAgentWearables::getWearableInventoryItem(LLWearableType::ETyp return item; } +const S32 LLAgentWearables::getWearableIdxFromItem(const LLViewerInventoryItem* item) const +{ + if (!item) return -1; + if (!item->isWearableType()) return -1; + + LLWearableType::EType type = item->getWearableType(); + U32 wearable_count = getWearableCount(type); + if (0 == wearable_count) return -1; + + const LLUUID& asset_id = item->getAssetUUID(); + + for (U32 i = 0; i < wearable_count; ++i) + { + const LLViewerWearable* wearable = getViewerWearable(type, i); + if (!wearable) continue; + if (wearable->getAssetID() != asset_id) continue; + return i; + } + + return -1; +} const LLViewerWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id) const { const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id); @@ -1094,12 +1115,12 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it { gAgentAvatarp->setCompositeUpdatesEnabled(true); - // If we have not yet declouded, we may want to use + // If we have not yet loaded core parts, we may want to use // baked texture UUIDs sent from the first objectUpdate message - // don't overwrite these. If we have already declouded, we've saved - // these ids as the last known good textures and can invalidate without - // re-clouding. - if (!gAgentAvatarp->getIsCloud()) + // don't overwrite these. If we have parts already, we've saved + // these texture ids as the last known good textures and can + // invalidate without having to recloud avatar. + if (!gAgentAvatarp->getHasMissingParts()) { gAgentAvatarp->invalidateAll(); } @@ -1304,7 +1325,7 @@ void LLAgentWearables::findAttachmentsAddRemoveInfo(LLInventoryModel::item_array LLUUID object_item_id = objectp->getAttachmentItemID(); bool remove_attachment = true; - if (requested_item_ids.find(object_item_id) != requested_item_ids.end()) + if (requested_item_ids.find(object_item_id) != requested_item_ids.end() || objectp->isLocked()) { // Object currently worn, was requested to keep it // Flag as currently worn so we won't have to add it again. remove_attachment = false; @@ -1471,7 +1492,7 @@ bool LLAgentWearables::moveWearable(const LLViewerInventoryItem* item, bool clos LLWearableType::EType type = item->getWearableType(); U32 wearable_count = getWearableCount(type); - if (0 == wearable_count) return false; + if (wearable_count < 2) return false; const LLUUID& asset_id = item->getAssetUUID(); diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index 3b8ff93c76..70da86805c 100644 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -87,6 +87,7 @@ public: public: const LLUUID getWearableItemID(LLWearableType::EType type, U32 index /*= 0*/) const; const LLUUID getWearableAssetID(LLWearableType::EType type, U32 index /*= 0*/) const; + const S32 getWearableIdxFromItem(const LLViewerInventoryItem* item) const; const LLViewerWearable* getWearableFromItemID(const LLUUID& item_id) const; LLViewerWearable* getWearableFromItemID(const LLUUID& item_id); LLViewerWearable* getWearableFromAssetID(const LLUUID& asset_id); @@ -188,11 +189,11 @@ public: // Signals //-------------------------------------------------------------------- public: - typedef boost::function<void()> loading_started_callback_t; + typedef std::function<void()> loading_started_callback_t; typedef boost::signals2::signal<void()> loading_started_signal_t; boost::signals2::connection addLoadingStartedCallback(loading_started_callback_t cb); - typedef boost::function<void()> loaded_callback_t; + typedef std::function<void()> loaded_callback_t; typedef boost::signals2::signal<void()> loaded_signal_t; boost::signals2::connection addLoadedCallback(loaded_callback_t cb); diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp index 11c5ffecb6..9c76f56ef3 100644 --- a/indra/newview/llaisapi.cpp +++ b/indra/newview/llaisapi.cpp @@ -839,7 +839,7 @@ void AISAPI::onUpdateReceived(const LLSD& update, COMMAND_TYPE type, const LLSD& if ( (type == UPDATECATEGORY || type == UPDATEITEM) && gSavedSettings.getBOOL("DebugAvatarAppearanceMessage")) { - dump_sequential_xml(gAgentAvatarp->getFullname() + "_ais_update", update); + dump_sequential_xml(gAgentAvatarp->getDebugName() + "_ais_update", update); } AISUpdate ais_update(update, type, request_body); @@ -861,8 +861,8 @@ void AISAPI::InvokeAISCommandCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t ht return; } - LLCore::HttpOptions::ptr_t httpOptions(new LLCore::HttpOptions); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest()); + LLCore::HttpOptions::ptr_t httpOptions = std::make_shared<LLCore::HttpOptions>(); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLCore::HttpHeaders::ptr_t httpHeaders; httpOptions->setTimeout(HTTP_TIMEOUT); @@ -950,7 +950,7 @@ void AISAPI::InvokeAISCommandCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t ht LL_DEBUGS("Inventory", "AIS3") << "Result: " << result << LL_ENDL; onUpdateReceived(result, type, body); - if (callback && !callback.empty()) + if (callback != nullptr) { bool needs_callback = true; LLUUID id(LLUUID::null); @@ -1060,7 +1060,12 @@ void AISUpdate::checkTimeout() { if (mTimer.hasExpired()) { - llcoro::suspend(); + // If we are taking too long, don't starve other tasks, + // yield to mainloop. + // If we use normal suspend(), there will be a chance of + // waking up from other suspends, before main coro had + // a chance, so wait for a frame tick instead. + llcoro::suspendUntilNextFrame(); LLCoros::checkStop(); mTimer.setTimerExpirySec(AIS_EXPIRY_SECONDS); } diff --git a/indra/newview/llaisapi.h b/indra/newview/llaisapi.h index dd490c8268..cfc286da2e 100644 --- a/indra/newview/llaisapi.h +++ b/indra/newview/llaisapi.h @@ -44,7 +44,7 @@ public: LIBRARY } ITEM_TYPE; - typedef boost::function<void(const LLUUID &invItem)> completion_t; + typedef std::function<void(const LLUUID& invItem)> completion_t; static bool isAvailable(); static void getCapNames(LLSD& capNames); @@ -89,7 +89,7 @@ private: static const std::string INVENTORY_CAP_NAME; static const std::string LIBRARY_CAP_NAME; - typedef boost::function < LLSD (LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t, LLCore::HttpRequest::ptr_t, + typedef std::function<LLSD(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t, LLCore::HttpRequest::ptr_t, const std::string, LLSD, LLCore::HttpOptions::ptr_t, LLCore::HttpHeaders::ptr_t) > invokationFn_t; static void EnqueueAISCommand(const std::string &procName, LLCoprocedureManager::CoProcedure_t proc); diff --git a/indra/newview/llappcorehttp.cpp b/indra/newview/llappcorehttp.cpp index f4f19906f1..f3265afebd 100644 --- a/indra/newview/llappcorehttp.cpp +++ b/indra/newview/llappcorehttp.cpp @@ -145,8 +145,8 @@ LLAppCoreHttp::~LLAppCoreHttp() void LLAppCoreHttp::init() { LLCoreHttpUtil::setPropertyMethods( - boost::bind(&LLControlGroup::getBOOL, boost::ref(gSavedSettings), _1), - boost::bind(&LLControlGroup::declareBOOL, boost::ref(gSavedSettings), _1, _2, _3, LLControlVariable::PERSIST_NONDFT)); + std::bind(&LLControlGroup::getBOOL, std::ref(gSavedSettings), std::placeholders::_1), + std::bind(&LLControlGroup::declareBOOL, std::ref(gSavedSettings), std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, LLControlVariable::PERSIST_NONDFT)); LLCore::LLHttp::initialize(); diff --git a/indra/newview/llappdelegate-objc.mm b/indra/newview/llappdelegate-objc.mm index 1090888c1c..0b3d0355a2 100644 --- a/indra/newview/llappdelegate-objc.mm +++ b/indra/newview/llappdelegate-objc.mm @@ -28,9 +28,11 @@ #if defined(LL_BUGSPLAT) #include <boost/filesystem.hpp> #include <vector> -@import BugsplatMac; +@import CrashReporter; +@import HockeySDK; +@import BugSplatMac; // derived from BugsplatMac's BugsplatTester/AppDelegate.m -@interface LLAppDelegate () <BugsplatStartupManagerDelegate> +@interface LLAppDelegate () <BugSplatDelegate> @end #endif #include "llwindowmacosx-objc.h" @@ -57,42 +59,51 @@ - (void) applicationDidFinishLaunching:(NSNotification *)notification { - // Call constructViewer() first so our logging subsystem is in place. This - // risks missing crashes in the LLAppViewerMacOSX constructor, but for - // present purposes it's more important to get the startup sequence - // properly logged. - // Someday I would like to modify the logging system so that calls before - // it's initialized are cached in a std::ostringstream and then, once it's - // initialized, "played back" into whatever handlers have been set up. - constructViewer(); + // Call constructViewer() first so our logging subsystem is in place. This + // risks missing crashes in the LLAppViewerMacOSX constructor, but for + // present purposes it's more important to get the startup sequence + // properly logged. + // Someday I would like to modify the logging system so that calls before + // it's initialized are cached in a std::ostringstream and then, once it's + // initialized, "played back" into whatever handlers have been set up. + constructViewer(); #if defined(LL_BUGSPLAT) infos("bugsplat setup"); - // Engage BugsplatStartupManager *before* calling initViewer() to handle - // any crashes during initialization. - // https://www.bugsplat.com/docs/platforms/os-x#initialization - [BugsplatStartupManager sharedManager].autoSubmitCrashReport = YES; - [BugsplatStartupManager sharedManager].askUserDetails = NO; - [BugsplatStartupManager sharedManager].delegate = self; - [[BugsplatStartupManager sharedManager] start]; + // Engage BugSplat *before* calling initViewer() to handle + // any crashes during initialization. + // https://www.bugsplat.com/docs/platforms/os-x#initialization + + // Initialize BugSplat + [[BugSplat shared] setDelegate:self]; + [[BugSplat shared] setAutoSubmitCrashReport:YES]; + [[BugSplat shared] setPersistUserDetails:NO]; + [[BugSplat shared] setAskUserDetails:NO]; + [BugSplat shared].expirationTimeInterval = 0; + [[BugSplat shared] start]; + + // Optionally, add some attributes to your crash reports. + // Attributes are artibrary key/value pairs that are searchable in the BugSplat dashboard. + // [[BugSplat shared] setValue:@"Value of Plain Attribute" forAttribute:@"PlainAttribute"]; + #endif infos("post-bugsplat setup"); - frameTimer = nil; + frameTimer = nil; - [self languageUpdated]; + [self languageUpdated]; - if (initViewer()) - { - // Set up recurring calls to oneFrame (repeating timer with timeout 0) - // until applicationShouldTerminate. - frameTimer = [NSTimer scheduledTimerWithTimeInterval:0.0 target:self - selector:@selector(oneFrame) userInfo:nil repeats:YES]; - } else { - exit(0); - } + if (initViewer()) + { + // Set up recurring calls to oneFrame (repeating timer with timeout 0) + // until applicationShouldTerminate. + frameTimer = [NSTimer scheduledTimerWithTimeInterval:0.0 target:self + selector:@selector(oneFrame) userInfo:nil repeats:YES]; + } else { + exit(0); + } - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(languageUpdated) name:@"NSTextInputContextKeyboardSelectionDidChangeNotification" object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(languageUpdated) name:@"NSTextInputContextKeyboardSelectionDidChangeNotification" object:nil]; // [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL]; } @@ -110,74 +121,74 @@ - (void) applicationDidBecomeActive:(NSNotification *)notification { - callWindowFocus(); + callWindowFocus(); } - (void) applicationDidResignActive:(NSNotification *)notification { - callWindowUnfocus(); + callWindowUnfocus(); } - (void) applicationDidHide:(NSNotification *)notification { - callWindowHide(); + callWindowHide(); } - (void) applicationDidUnhide:(NSNotification *)notification { - callWindowUnhide(); + callWindowUnhide(); } - (NSApplicationTerminateReply) applicationShouldTerminate:(NSApplication *)sender { - // run one frame to assess state - if (!pumpMainLoop()) - { - // pumpMainLoop() returns true when done, false if it wants to be - // called again. Since it returned false, do not yet cancel - // frameTimer. - handleQuit(); - [[NSApplication sharedApplication] stopModal]; - return NSTerminateCancel; - } else { - // pumpMainLoop() returned true: it's done. Okay, done with frameTimer. - [frameTimer release]; - cleanupViewer(); - return NSTerminateNow; - } + // run one frame to assess state + if (!pumpMainLoop()) + { + // pumpMainLoop() returns true when done, false if it wants to be + // called again. Since it returned false, do not yet cancel + // frameTimer. + handleQuit(); + [[NSApplication sharedApplication] stopModal]; + return NSTerminateCancel; + } else { + // pumpMainLoop() returned true: it's done. Okay, done with frameTimer. + [frameTimer release]; + cleanupViewer(); + return NSTerminateNow; + } } - (void) oneFrame { - bool appExiting = pumpMainLoop(); - if (appExiting) - { - // Once pumpMainLoop() reports that we're done, cancel frameTimer: - // stop the repetitive calls. - [frameTimer release]; - [[NSApplication sharedApplication] terminate:self]; - } + bool appExiting = pumpMainLoop(); + if (appExiting) + { + // Once pumpMainLoop() reports that we're done, cancel frameTimer: + // stop the repetitive calls. + [frameTimer release]; + [[NSApplication sharedApplication] terminate:self]; + } } - (void) showInputWindow:(bool)show withEvent:(NSEvent*)textEvent { - if (![self romanScript]) - { - if (show) - { - NSLog(@"Showing input window."); - [inputWindow makeKeyAndOrderFront:inputWindow]; + if (![self romanScript]) + { + if (show) + { + NSLog(@"Showing input window."); + [inputWindow makeKeyAndOrderFront:inputWindow]; if (textEvent != nil) { [[inputView inputContext] discardMarkedText]; [[inputView inputContext] handleEvent:textEvent]; } - } else { - NSLog(@"Hiding input window."); - [inputWindow orderOut:inputWindow]; - [window makeKeyAndOrderFront:window]; - } - } + } else { + NSLog(@"Hiding input window."); + [inputWindow orderOut:inputWindow]; + [window makeKeyAndOrderFront:window]; + } + } } // This will get called multiple times by NSNotificationCenter. @@ -187,15 +198,15 @@ - (void) languageUpdated { - TISInputSourceRef currentInput = TISCopyCurrentKeyboardInputSource(); - CFArrayRef languages = (CFArrayRef)TISGetInputSourceProperty(currentInput, kTISPropertyInputSourceLanguages); - + TISInputSourceRef currentInput = TISCopyCurrentKeyboardInputSource(); + CFArrayRef languages = (CFArrayRef)TISGetInputSourceProperty(currentInput, kTISPropertyInputSourceLanguages); + #if 0 // In the event of ever needing to add new language sources, change this to 1 and watch the terminal for "languages:" - NSLog(@"languages: %@", TISGetInputSourceProperty(currentInput, kTISPropertyInputSourceLanguages)); + NSLog(@"languages: %@", TISGetInputSourceProperty(currentInput, kTISPropertyInputSourceLanguages)); #endif - - // Typically the language we want is going to be the very first result in the array. - currentInputLanguage = (NSString*)CFArrayGetValueAtIndex(languages, 0); + + // Typically the language we want is going to be the very first result in the array. + currentInputLanguage = (NSString*)CFArrayGetValueAtIndex(languages, 0); } - (bool) romanScript @@ -209,13 +220,58 @@ return false; } } - + return true; } +- (void) setBugsplatValue:(nullable NSString *)value forAttribute:(NSString *)attribute +{ +#if defined(LL_BUGSPLAT) + //[[BugSplat shared] setValue:@"Value of not so plain <value> Attribute" forAttribute:@"NotSoPlainAttribute"]; + [[BugSplat shared] setValue:value forAttribute:attribute]; +#endif // LL_BUGSPLAT +} + #if defined(LL_BUGSPLAT) -- (NSString *)applicationLogForBugsplatStartupManager:(BugsplatStartupManager *)bugsplatStartupManager +- (void)bugSplatWillSendCrashReport:(BugSplat *)bugSplat +{ + infos("bugSplatWillSendCrashReport"); +} + +- (void)bugSplatWillSendCrashReportsAlways:(BugSplat *)bugSplat +{ + infos("bugSplatWillSendCrashReportsAlways"); +} + +- (void)bugSplatDidFinishSendingCrashReport:(BugSplat *)bugSplat +{ + infos("bugSplatDidFinishSendingCrashReport"); + + if(!secondLogPath.empty()) + { + boost::filesystem::remove(secondLogPath); + } + clearDumpLogsDir(); +} + +- (void)bugSplatWillCancelSendingCrashReport:(BugSplat *)bugSplat +{ + infos("bugSplatWillCancelSendingCrashReport"); +} + +- (void)bugSplatWillShowSubmitCrashReportAlert:(BugSplat *)bugSplat +{ + infos("bugSplatWillShowSubmitCrashReportAlert"); +} + +- (void)bugSplat:(BugSplat *)bugSplat didFailWithError:(NSError *)error +{ + std::string error_str([[error localizedDescription] UTF8String]); + infos("bugSplat:didFailWithError: " + error_str); +} + +- (NSString *)applicationLogForBugSplat:(BugSplat *)bugSplat; { CrashMetadata& meta(CrashMetadata_instance()); // As of BugsplatMac 1.0.6, userName and userEmail properties are now @@ -226,16 +282,21 @@ // report we are about to send. infos("applicationLogForBugsplatStartupManager setting userName = '" + meta.agentFullname + '"'); - bugsplatStartupManager.userName = + bugSplat.userName = [NSString stringWithCString:meta.agentFullname.c_str() encoding:NSUTF8StringEncoding]; // Use the email field for OS version, just as we do on Windows, until // BugSplat provides more metadata fields. infos("applicationLogForBugsplatStartupManager setting userEmail = '" + meta.OSInfo + '"'); - bugsplatStartupManager.userEmail = + bugSplat.userEmail = [NSString stringWithCString:meta.OSInfo.c_str() encoding:NSUTF8StringEncoding]; + + //bugSplat.userID = + // [NSString stringWithCString:meta.regionName.c_str() + // encoding:NSUTF8StringEncoding]; + // This strangely-named override method's return value contributes the // User Description metadata field. infos("applicationLogForBugsplatStartupManager -> '" + meta.fatalMessage + "'"); @@ -243,7 +304,8 @@ encoding:NSUTF8StringEncoding]; } -- (NSString *)applicationKeyForBugsplatStartupManager:(BugsplatStartupManager *)bugsplatStartupManager signal:(NSString *)signal exceptionName:(NSString *)exceptionName exceptionReason:(NSString *)exceptionReason { +- (NSString *)applicationKeyForBugSplat:(BugSplat *)bugSplat signal:(NSString *)signal exceptionName:(NSString *)exceptionName exceptionReason:(NSString *)exceptionReason +{ // TODO: exceptionName, exceptionReason // Windows sends location within region as well, but that's because @@ -258,27 +320,6 @@ encoding:NSUTF8StringEncoding]; } -- (NSString *)defaultUserNameForBugsplatStartupManager:(BugsplatStartupManager *)bugsplatStartupManager { - std::string agentFullname(CrashMetadata_instance().agentFullname); - infos("defaultUserNameForBugsplatStartupManager -> '" + agentFullname + "'"); - return [NSString stringWithCString:agentFullname.c_str() - encoding:NSUTF8StringEncoding]; -} - -- (NSString *)defaultUserEmailForBugsplatStartupManager:(BugsplatStartupManager *)bugsplatStartupManager { - // Use the email field for OS version, just as we do on Windows, until - // BugSplat provides more metadata fields. - std::string OSInfo(CrashMetadata_instance().OSInfo); - infos("defaultUserEmailForBugsplatStartupManager -> '" + OSInfo + "'"); - return [NSString stringWithCString:OSInfo.c_str() - encoding:NSUTF8StringEncoding]; -} - -- (void)bugsplatStartupManagerWillSendCrashReport:(BugsplatStartupManager *)bugsplatStartupManager -{ - infos("bugsplatStartupManagerWillSendCrashReport"); -} - struct AttachmentInfo { AttachmentInfo(const std::string& path, const std::string& type): @@ -290,7 +331,7 @@ struct AttachmentInfo std::string pathname, basename, mimetype; }; -- (NSArray<BugsplatAttachment *> *)attachmentsForBugsplatStartupManager:(BugsplatStartupManager *)bugsplatStartupManager +- (NSArray<BugSplatAttachment *> *)attachmentsForBugSplat:(BugSplat *)bugSplat { const CrashMetadata& metadata(CrashMetadata_instance()); @@ -301,7 +342,8 @@ struct AttachmentInfo AttachmentInfo(metadata.logFilePathname, "text/plain"), AttachmentInfo(metadata.userSettingsPathname, "text/xml"), AttachmentInfo(metadata.accountSettingsPathname, "text/xml"), - AttachmentInfo(metadata.staticDebugPathname, "text/xml") + AttachmentInfo(metadata.staticDebugPathname, "text/xml"), + AttachmentInfo(metadata.attributesPathname, "text/xml") }; secondLogPath = metadata.secondLogFilePathname; @@ -310,13 +352,13 @@ struct AttachmentInfo info.push_back(AttachmentInfo(secondLogPath, "text/xml")); } - // We "happen to know" that info[0].basename is "SecondLife.old" -- due to + // We "happen to know" that info[0].basename is "SecondLife.crash" -- due to // the fact that BugsplatMac only notices a crash during the viewer run - // following the crash. + // following the crash. // The Bugsplat service doesn't respect the MIME type above when returning // the log data to a browser, so take this opportunity to rename the file - // from <base>.old to <base>_log.txt - info[0].basename = + // from <base>.crash to <base>_log.txt + info[0].basename = boost::filesystem::path(info[0].pathname).stem().string() + "_log.txt"; infos("attachmentsForBugsplatStartupManager attaching log " + info[0].basename); @@ -333,8 +375,8 @@ struct AttachmentInfo encoding:NSUTF8StringEncoding]; NSData *nsdata = [NSData dataWithContentsOfFile:nspathname]; - BugsplatAttachment *attachment = - [[BugsplatAttachment alloc] initWithFilename:nsbasename + BugSplatAttachment *attachment = + [[BugSplatAttachment alloc] initWithFilename:nsbasename attachmentData:nsdata contentType:nsmimetype]; @@ -345,23 +387,6 @@ struct AttachmentInfo return attachments; } -- (void)bugsplatStartupManagerDidFinishSendingCrashReport:(BugsplatStartupManager *)bugsplatStartupManager -{ - infos("Sent crash report to BugSplat"); - - if(!secondLogPath.empty()) - { - boost::filesystem::remove(secondLogPath); - } - clearDumpLogsDir(); -} - -- (void)bugsplatStartupManager:(BugsplatStartupManager *)bugsplatStartupManager didFailWithError:(NSError *)error -{ - // TODO: message string from NSError - infos("Could not send crash report to BugSplat"); -} - #endif // LL_BUGSPLAT @end @@ -371,8 +396,8 @@ struct AttachmentInfo - (void)sendEvent:(NSEvent *)event { [super sendEvent:event]; - if ([event type] == NSKeyUp && ([event modifierFlags] & NSCommandKeyMask)) - { + if ([event type] == NSEventTypeKeyUp && ([event modifierFlags] & NSEventModifierFlagCommand)) + { [[self keyWindow] sendEvent:event]; } } diff --git a/indra/newview/llappearancelistener.cpp b/indra/newview/llappearancelistener.cpp new file mode 100644 index 0000000000..dc7bbc3236 --- /dev/null +++ b/indra/newview/llappearancelistener.cpp @@ -0,0 +1,158 @@ +/** + * @file llappearancelistener.cpp + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, 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 "llappearancelistener.h" + +#include "llappearancemgr.h" +#include "llinventoryfunctions.h" +#include "lltransutil.h" +#include "llwearableitemslist.h" +#include "stringize.h" + +LLAppearanceListener::LLAppearanceListener() + : LLEventAPI("LLAppearance", + "API to wear a specified outfit and wear/remove individual items") +{ + add("wearOutfit", + "Wear outfit by folder id: [\"folder_id\"] OR by folder name: [\"folder_name\"]\n" + "When [\"append\"] is true, outfit will be added to COF\n" + "otherwise it will replace current oufit", + &LLAppearanceListener::wearOutfit); + + add("wearItems", + "Wear items by id: [items_id]", + &LLAppearanceListener::wearItems, + llsd::map("items_id", LLSD(), "replace", LLSD())); + + add("detachItems", + "Detach items by id: [items_id]", + &LLAppearanceListener::detachItems, + llsd::map("items_id", LLSD())); + + add("getOutfitsList", + "Return the table with Outfits info(id and name)", + &LLAppearanceListener::getOutfitsList); + + add("getOutfitItems", + "Return the table of items with info(id : name, wearable_type, is_worn) inside specified outfit folder", + &LLAppearanceListener::getOutfitItems); +} + + +void LLAppearanceListener::wearOutfit(LLSD const &data) +{ + Response response(LLSD(), data); + if (!data.has("folder_id") && !data.has("folder_name")) + { + return response.error("Either [folder_id] or [folder_name] is required"); + } + + bool append = data.has("append") ? data["append"].asBoolean() : false; + if (!LLAppearanceMgr::instance().wearOutfit(data, append)) + { + response.error("Failed to wear outfit"); + } +} + +void LLAppearanceListener::wearItems(LLSD const &data) +{ + const LLSD& items_id{ data["items_id"] }; + uuid_vec_t ids; + if (!items_id.isArray()) + { + ids.push_back(items_id.asUUID()); + } + else // array + { + for (const auto& id : llsd::inArray(items_id)) + { + ids.push_back(id); + } + } + LLAppearanceMgr::instance().wearItemsOnAvatar(ids, true, data["replace"].asBoolean()); +} + +void LLAppearanceListener::detachItems(LLSD const &data) +{ + const LLSD& items_id{ data["items_id"] }; + uuid_vec_t ids; + if (!items_id.isArray()) + { + ids.push_back(items_id.asUUID()); + } + else // array + { + for (const auto& id : llsd::inArray(items_id)) + { + ids.push_back(id); + } + } + LLAppearanceMgr::instance().removeItemsFromAvatar(ids); +} + +void LLAppearanceListener::getOutfitsList(LLSD const &data) +{ + Response response(LLSD(), data); + const LLUUID outfits_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + + LLIsFolderType is_category(LLFolderType::FT_OUTFIT); + gInventory.collectDescendentsIf(outfits_id, cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH, is_category); + + response["outfits"] = llsd::toMap(cat_array, + [](const LLPointer<LLViewerInventoryCategory> &cat) + { return std::make_pair(cat->getUUID().asString(), cat->getName()); }); +} + +void LLAppearanceListener::getOutfitItems(LLSD const &data) +{ + Response response(LLSD(), data); + LLUUID outfit_id(data["outfit_id"].asUUID()); + LLViewerInventoryCategory *cat = gInventory.getCategory(outfit_id); + if (!cat || cat->getPreferredType() != LLFolderType::FT_OUTFIT) + { + return response.error(stringize("Couldn't find outfit ", outfit_id.asString())); + } + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + + LLFindOutfitItems collector = LLFindOutfitItems(); + gInventory.collectDescendentsIf(outfit_id, cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH, collector); + + response["items"] = llsd::toMap(item_array, + [](const LLPointer<LLViewerInventoryItem> &it) + { + return std::make_pair( + it->getUUID().asString(), + llsd::map( + "name", it->getName(), + "wearable_type", LLWearableType::getInstance()->getTypeName(it->isWearableType() ? it->getWearableType() : LLWearableType::WT_NONE), + "is_worn", get_is_item_worn(it))); + }); +} diff --git a/indra/newview/llappearancelistener.h b/indra/newview/llappearancelistener.h new file mode 100644 index 0000000000..04c5eac2eb --- /dev/null +++ b/indra/newview/llappearancelistener.h @@ -0,0 +1,46 @@ +/** + * @file llappearancelistener.h + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, 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_LLAPPEARANCELISTENER_H +#define LL_LLAPPEARANCELISTENER_H + +#include "lleventapi.h" + +class LLAppearanceListener : public LLEventAPI +{ +public: + LLAppearanceListener(); + +private: + void wearOutfit(LLSD const &data); + void wearItems(LLSD const &data); + void detachItems(LLSD const &data); + void getOutfitsList(LLSD const &data); + void getOutfitItems(LLSD const &data); +}; + +#endif // LL_LLAPPEARANCELISTENER_H + diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 4e0c5d7df0..614d9fdeb1 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -31,6 +31,7 @@ #include "llagent.h" #include "llagentcamera.h" #include "llagentwearables.h" +#include "llappearancelistener.h" #include "llappearancemgr.h" #include "llattachmentsmgr.h" #include "llcommandhandler.h" @@ -66,6 +67,8 @@ #include "llavatarpropertiesprocessor.h" +LLAppearanceListener sAppearanceListener; + namespace { const S32 BAKE_RETRY_MAX_COUNT = 5; @@ -853,7 +856,7 @@ void LLWearableHoldingPattern::checkMissingWearables() // was requested but none was found, create a default asset as a replacement. // In all other cases, don't do anything. // For critical types (shape/hair/skin/eyes), this will keep the avatar as a cloud - // due to logic in LLVOAvatarSelf::getIsCloud(). + // due to logic in LLVOAvatarSelf::getHasMissingParts(). // For non-critical types (tatoo, socks, etc.) the wearable will just be missing. (requested_by_type[type] > 0) && ((type == LLWearableType::WT_PANTS) || (type == LLWearableType::WT_SHIRT) || (type == LLWearableType::WT_SKIRT))) @@ -1497,6 +1500,27 @@ void wear_on_avatar_cb(const LLUUID& inv_item, bool do_replace = false) } } +bool needs_to_replace(LLViewerInventoryItem* item_to_wear, bool & first_for_object, std::vector<bool>& first_for_type, bool replace) +{ + bool res = false; + LLAssetType::EType type = item_to_wear->getType(); + if (type == LLAssetType::AT_OBJECT) + { + res = first_for_object && replace; + first_for_object = false; + } + else if (type == LLAssetType::AT_CLOTHING) + { + LLWearableType::EType wtype = item_to_wear->getWearableType(); + if (wtype >= 0 && wtype < LLWearableType::WT_COUNT) + { + res = first_for_type[wtype] && replace; + first_for_type[wtype] = false; + } + } + return res; +} + void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear, bool do_update, bool replace, @@ -1505,7 +1529,8 @@ void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear, LL_DEBUGS("UIUsage") << "wearItemsOnAvatar" << LL_ENDL; LLUIUsage::instance().logCommand("Avatar.WearItem"); - bool first = true; + bool first_for_object = true; + std::vector<bool> first_for_type(LLWearableType::WT_COUNT, true); LLInventoryObject::const_object_list_t items_to_link; @@ -1513,9 +1538,6 @@ void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear, it != item_ids_to_wear.end(); ++it) { - replace = first && replace; - first = false; - const LLUUID& item_id_to_wear = *it; if (item_id_to_wear.isNull()) @@ -1534,8 +1556,9 @@ void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear, if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getLibraryRootFolderID())) { LL_DEBUGS("Avatar") << "inventory item in library, will copy and wear " - << item_to_wear->getName() << " id " << item_id_to_wear << LL_ENDL; - LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(wear_on_avatar_cb,_1,replace)); + << item_to_wear->getName() << " id " << item_id_to_wear << LL_ENDL; + bool replace_item = needs_to_replace(item_to_wear, first_for_object, first_for_type, replace); + LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(wear_on_avatar_cb, _1, replace_item)); copy_inventory_item(gAgent.getID(), item_to_wear->getPermissions().getOwner(), item_to_wear->getUUID(), LLUUID::null, std::string(), cb); continue; @@ -1573,7 +1596,8 @@ void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear, } LLWearableType::EType type = item_to_wear->getWearableType(); S32 wearable_count = gAgentWearables.getWearableCount(type); - if ((replace && wearable_count != 0) || !gAgentWearables.canAddWearable(type)) + bool replace_item = needs_to_replace(item_to_wear, first_for_object, first_for_type, replace); + if ((replace_item && wearable_count != 0) || !gAgentWearables.canAddWearable(type)) { LLUUID item_id = gAgentWearables.getWearableItemID(item_to_wear->getWearableType(), wearable_count-1); @@ -1602,7 +1626,13 @@ void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear, case LLAssetType::AT_OBJECT: { - rez_attachment(item_to_wear, NULL, replace); + // Note that this will replace only first attachment regardless of attachment point, + // so if user is wearing two items over other two on different attachment points, + // only one will be replaced. + // Unfortunately we have no way to determine attachment point from inventory item. + // We might want to forbid wearing multiple objects with replace option in future. + bool replace_item = needs_to_replace(item_to_wear, first_for_object, first_for_type, replace); + rez_attachment(item_to_wear, NULL, replace_item); } break; @@ -2042,7 +2072,7 @@ bool LLAppearanceMgr::getCanReplaceCOF(const LLUUID& outfit_cat_id) } // Moved from LLWearableList::ContextMenu for wider utility. -bool LLAppearanceMgr::canAddWearables(const uuid_vec_t& item_ids) const +bool LLAppearanceMgr::canAddWearables(const uuid_vec_t& item_ids, bool warn_on_type_mismatch) const { // TODO: investigate wearables may not be loaded at this point EXT-8231 @@ -2072,7 +2102,10 @@ bool LLAppearanceMgr::canAddWearables(const uuid_vec_t& item_ids) const } else { + if (warn_on_type_mismatch) + { LL_WARNS() << "Unexpected wearable type" << LL_ENDL; + } return false; } } @@ -2263,7 +2296,7 @@ void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append) } if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage")) { - dump_sequential_xml(gAgentAvatarp->getFullname() + "_slam_request", contents); + dump_sequential_xml(gAgentAvatarp->getDebugName() + "_slam_request", contents); } slam_inventory_folder(getCOF(), contents, link_waiter); @@ -3875,7 +3908,7 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd LL_DEBUGS("Avatar") << "Will send request for cof_version " << cofVersion << LL_ENDL; bRetry = false; - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest()); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); if (gSavedSettings.getBOOL("DebugForceAppearanceRequestFailure")) { @@ -3956,7 +3989,7 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd LL_DEBUGS("Avatar") << "succeeded" << LL_ENDL; if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage")) { - dump_sequential_xml(gAgentAvatarp->getFullname() + "_appearance_request_ok", result); + dump_sequential_xml(gAgentAvatarp->getDebugName() + "_appearance_request_ok", result); } } while (bRetry); @@ -3965,7 +3998,7 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd /*static*/ void LLAppearanceMgr::debugAppearanceUpdateCOF(const LLSD& content) { - dump_sequential_xml(gAgentAvatarp->getFullname() + "_appearance_request_error", content); + dump_sequential_xml(gAgentAvatarp->getDebugName() + "_appearance_request_error", content); LL_INFOS("Avatar") << "AIS COF, version received: " << content["expected"].asInteger() << " ================================= " << LL_ENDL; @@ -4157,6 +4190,8 @@ void LLAppearanceMgr::removeItemsFromAvatar(const uuid_vec_t& ids_to_remove, nul for (uuid_vec_t::const_iterator it = ids_to_remove.begin(); it != ids_to_remove.end(); ++it) { const LLUUID& id_to_remove = *it; + auto attachment = gAgentAvatarp->getWornAttachment(id_to_remove); + if (attachment && attachment->isLocked()) continue; const LLUUID& linked_item_id = gInventory.getLinkedItemID(id_to_remove); LLViewerInventoryItem *item = gInventory.getItem(linked_item_id); if (item && item->getType() == LLAssetType::AT_OBJECT) @@ -4212,37 +4247,54 @@ bool LLAppearanceMgr::moveWearable(LLViewerInventoryItem* item, bool closer_to_b if (item->getType() != LLAssetType::AT_CLOTHING) return false; if (!gInventory.isObjectDescendentOf(item->getUUID(), getCOF())) return false; + S32 pos = gAgentWearables.getWearableIdxFromItem(item); + if (pos < 0) return false; // Not found + + U32 count = gAgentWearables.getWearableCount(item->getWearableType()); + if (count < 2) return false; // Nothing to swap with + if (closer_to_body) + { + if (pos == 0) return false; // already first + } + else + { + if (pos == count - 1) return false; // already last + } + + U32 old_pos = (U32)pos; + U32 swap_with = closer_to_body ? old_pos - 1 : old_pos + 1; + LLUUID swap_item_id = gAgentWearables.getWearableItemID(item->getWearableType(), swap_with); + + // Find link item from item id. LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; LLFindWearablesOfType filter_wearables_of_type(item->getWearableType()); gInventory.collectDescendentsIf(getCOF(), cats, items, true, filter_wearables_of_type); if (items.empty()) return false; - // We assume that the items have valid descriptions. - std::sort(items.begin(), items.end(), WearablesOrderComparator(item->getWearableType())); - - if (closer_to_body && items.front() == item) return false; - if (!closer_to_body && items.back() == item) return false; - - LLInventoryModel::item_array_t::iterator it = std::find(items.begin(), items.end(), item); - if (items.end() == it) return false; - - - //swapping descriptions - closer_to_body ? --it : ++it; - LLViewerInventoryItem* swap_item = *it; - if (!swap_item) return false; - std::string tmp = swap_item->getActualDescription(); - swap_item->setDescription(item->getActualDescription()); - item->setDescription(tmp); + LLViewerInventoryItem* swap_item = nullptr; + for (auto iter : items) + { + if (iter->getLinkedUUID() == swap_item_id) + { + swap_item = iter.get(); + break; + } + } + if (!swap_item) + { + return false; + } - // LL_DEBUGS("Inventory") << "swap, item " - // << ll_pretty_print_sd(item->asLLSD()) - // << " swap_item " - // << ll_pretty_print_sd(swap_item->asLLSD()) << LL_ENDL; + // Description is supposed to hold sort index, but user could have changed + // order rapidly and there might be a state mismatch between description + // and gAgentWearables, trust gAgentWearables over description. + // Generate new description. + std::string new_desc = build_order_string(item->getWearableType(), old_pos); + swap_item->setDescription(new_desc); + new_desc = build_order_string(item->getWearableType(), swap_with); + item->setDescription(new_desc); - // FIXME switch to use AISv3 where supported. - //items need to be updated on a dataserver item->setComplete(true); item->updateServer(false); gInventory.updateItem(item); @@ -4329,8 +4381,8 @@ LLAppearanceMgr::LLAppearanceMgr(): outfit_observer.addCOFSavedCallback(boost::bind( &LLAppearanceMgr::setOutfitLocked, this, false)); - mUnlockOutfitTimer.reset(new LLOutfitUnLockTimer((F32)gSavedSettings.getS32( - "OutfitOperationsTimeout"))); + mUnlockOutfitTimer = std::make_unique<LLOutfitUnLockTimer>((F32)gSavedSettings.getS32( + "OutfitOperationsTimeout")); gIdleCallbacks.addFunction(&LLAttachmentsMgr::onIdle, NULL); gIdleCallbacks.addFunction(&LLAppearanceMgr::onIdle, NULL); //sheduling appearance update requests @@ -4722,48 +4774,69 @@ void wear_multiple(const uuid_vec_t& ids, bool replace) LLAppearanceMgr::instance().wearItemsOnAvatar(ids, true, replace, cb); } -// SLapp for easy-wearing of a stock (library) avatar -// +bool wear_category(const LLSD& query_map, bool append) +{ + LLUUID folder_uuid; + + if (query_map.has("folder_name")) + { + std::string outfit_folder_name = query_map["folder_name"]; + folder_uuid = findDescendentCategoryIDByName(gInventory.getLibraryRootFolderID(), outfit_folder_name); + if (folder_uuid.isNull()) + LL_WARNS() << "Couldn't find " << std::quoted(outfit_folder_name) << " in the Library" << LL_ENDL; + } + if (folder_uuid.isNull() && query_map.has("folder_id")) + { + folder_uuid = query_map["folder_id"].asUUID(); + } + + if (folder_uuid.notNull()) + { + if (LLViewerInventoryCategory* cat = gInventory.getCategory(folder_uuid)) + { + if (bool is_library = gInventory.isObjectDescendentOf(folder_uuid, gInventory.getRootFolderID())) + { + LLPointer<LLInventoryCategory> new_category = new LLInventoryCategory(folder_uuid, LLUUID::null, LLFolderType::FT_CLOTHING, "Quick Appearance"); + LLAppearanceMgr::getInstance()->wearInventoryCategory(new_category, true, append); + } + else + { + LLAppearanceMgr::getInstance()->wearInventoryCategory(cat, true, append); + } + return true; + } + else + { + LL_WARNS() << "Couldn't find folder id" << folder_uuid << " in Inventory" << LL_ENDL; + } + } + + return false; +} + +bool LLAppearanceMgr::wearOutfit(const LLSD& query_map, bool append) +{ + return wear_category(query_map, append); +} + class LLWearFolderHandler : public LLCommandHandler { public: // not allowed from outside the app - LLWearFolderHandler() : LLCommandHandler("wear_folder", UNTRUSTED_BLOCK) { } + LLWearFolderHandler() : LLCommandHandler("wear_folder", UNTRUSTED_BLOCK) {} bool handle(const LLSD& tokens, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web) { - LLSD::UUID folder_uuid; - - if (folder_uuid.isNull() && query_map.has("folder_name")) - { - std::string outfit_folder_name = query_map["folder_name"]; - folder_uuid = findDescendentCategoryIDByName( - gInventory.getLibraryRootFolderID(), - outfit_folder_name); - } - if (folder_uuid.isNull() && query_map.has("folder_id")) - { - folder_uuid = query_map["folder_id"].asUUID(); - } - - if (folder_uuid.notNull()) + if (wear_category(query_map, false)) { - LLPointer<LLInventoryCategory> category = new LLInventoryCategory(folder_uuid, - LLUUID::null, - LLFolderType::FT_CLOTHING, - "Quick Appearance"); - if ( gInventory.getCategory( folder_uuid ) != NULL ) - { - // Assume this is coming from the predefined avatars web floater - LLUIUsage::instance().logCommand("Avatar.WearPredefinedAppearance"); - LLAppearanceMgr::getInstance()->wearInventoryCategory(category, true, false); + // Assume this is coming from the predefined avatars web floater + LLUIUsage::instance().logCommand("Avatar.WearPredefinedAppearance"); - // *TODOw: This may not be necessary if initial outfit is chosen already -- josh - gAgent.setOutfitChosen(true); - } + // *TODOw: This may not be necessary if initial outfit is chosen already -- josh + gAgent.setOutfitChosen(true); } // release avatar picker keyboard focus @@ -4773,4 +4846,46 @@ public: } }; +class LLAddFolderHandler : public LLCommandHandler +{ +public: + // not allowed from outside the app + LLAddFolderHandler() : LLCommandHandler("add_folder", UNTRUSTED_BLOCK) {} + + bool handle(const LLSD& tokens, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web) + { + wear_category(query_map, true); + + return true; + } +}; + +class LLRemoveFolderHandler : public LLCommandHandler +{ +public: + LLRemoveFolderHandler() : LLCommandHandler("remove_folder", UNTRUSTED_BLOCK) {} + + bool handle(const LLSD& tokens, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web) + { + if (query_map.has("folder_id")) + { + LLUUID folder_id = query_map["folder_id"].asUUID(); + if (folder_id.notNull()) + { + if (LLViewerInventoryCategory* cat = gInventory.getCategory(folder_id)) + { + LLAppearanceMgr::instance().takeOffOutfit(cat->getLinkedUUID()); + } + else + { + LL_WARNS() << "Couldn't find folder id" << folder_id << " in Inventory" << LL_ENDL; + } + } + } + return true; + } +}; + LLWearFolderHandler gWearFolderHandler; +LLAddFolderHandler gAddFolderHandler; +LLRemoveFolderHandler gRemoveFolderHandler; diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 6c45a32856..131b6817ed 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -60,6 +60,7 @@ public: void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append); void wearCategoryFinal(const LLUUID& cat_id, bool copy_items, bool append); void wearOutfitByName(const std::string& name); + bool wearOutfit(const LLSD& query_map, bool append = false); void changeOutfit(bool proceed, const LLUUID& category, bool append); void replaceCurrentOutfit(const LLUUID& new_outfit); void renameOutfit(const LLUUID& outfit_id); @@ -102,7 +103,7 @@ public: bool getCanReplaceCOF(const LLUUID& outfit_cat_id); // Can we add all referenced items to the avatar? - bool canAddWearables(const uuid_vec_t& item_ids) const; + bool canAddWearables(const uuid_vec_t& item_ids, bool warn_on_type_mismatch = true) const; // Copy all items in a category. void shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id, @@ -234,7 +235,7 @@ public: void setAppearanceServiceURL(const std::string& url) { mAppearanceServiceURL = url; } std::string getAppearanceServiceURL() const; - typedef boost::function<void ()> attachments_changed_callback_t; + typedef std::function<void()> attachments_changed_callback_t; typedef boost::signals2::signal<void ()> attachments_changed_signal_t; boost::signals2::connection setAttachmentsChangedCallback(attachments_changed_callback_t cb); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 2c203869c7..05be94b488 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -131,10 +131,10 @@ #include "stringize.h" #include "llcoros.h" #include "llexception.h" -#if LL_DARWIN || LL_LINUX || __FreeBSD__ +#if !_M_ARM64 // !LL_LINUX #include "cef/dullahan_version.h" -#endif #include "vlc/libvlc_version.h" +#endif // LL_LINUX #if LL_DARWIN #if LL_SDL @@ -220,7 +220,6 @@ #include "llfloatersimplesnapshot.h" #include "llfloatersnapshot.h" #include "llsidepanelinventory.h" -#include "llatmosphere.h" // includes for idle() idleShutdown() #include "llviewercontrol.h" @@ -255,6 +254,9 @@ using namespace LL; #include "llviewereventrecorder.h" #include <chrono> +#include "rlvactions.h" +#include "rlvcommon.h" +#include "rlvhandler.h" // *FIX: These extern globals should be cleaned up. // The globals either represent state/config/resource-storage of either @@ -275,6 +277,16 @@ using namespace LL; #pragma warning (disable:4702) #endif +#ifdef LL_DISCORD +#define DISCORDPP_IMPLEMENTATION +#include <discordpp.h> +static std::shared_ptr<discordpp::Client> gDiscordClient; +static uint64_t gDiscordTimestampsStart; +static std::string gDiscordActivityDetails; +static int32_t gDiscordPartyCurrentSize; +static int32_t gDiscordPartyMaxSize; +#endif + static LLAppViewerListener sAppViewerListener(LLAppViewer::instance); ////// Windows-specific includes to the bottom - nasty defines in these pollute the preprocessor @@ -292,6 +304,7 @@ extern bool gDebugGL; #if LL_DARWIN extern bool gHiDPISupport; +extern bool gHDRDisplaySupport; #endif //////////////////////////////////////////////////////////// @@ -358,10 +371,6 @@ std::string gLastVersionChannel; LLVector3 gWindVec(3.0, 3.0, 0.0); LLVector3 gRelativeWindVec(0.0, 0.0, 0.0); -U32 gPacketsIn = 0; - -bool gPrintMessagesThisFrame = false; - bool gRandomizeFramerate = false; bool gPeriodicSlowFrame = false; @@ -370,6 +379,7 @@ bool gLLErrorActivated = false; bool gLogoutInProgress = false; bool gSimulateMemLeak = false; +bool gDoDisconnect = false; // We don't want anyone, especially threads working on the graphics pipeline, // to have to block due to this WorkQueue being full. @@ -383,7 +393,6 @@ const std::string MARKER_FILE_NAME("SecondLife.exec_marker"); const std::string START_MARKER_FILE_NAME("SecondLife.start_marker"); const std::string ERROR_MARKER_FILE_NAME("SecondLife.error_marker"); const std::string LOGOUT_MARKER_FILE_NAME("SecondLife.logout_marker"); -static bool gDoDisconnect = false; static std::string gLaunchFileOnQuit; // Used on Win32 for other apps to identify our window (eg, win_setup) @@ -457,13 +466,28 @@ static bool app_metrics_qa_mode = false; void idle_afk_check() { + // Don't check AFK status during startup states + if (LLStartUp::getStartupState() < STATE_STARTED) + { + return; + } + // check idle timers F32 current_idle = gAwayTriggerTimer.getElapsedTimeF32(); - F32 afk_timeout = (F32)gSavedSettings.getS32("AFKTimeout"); - if (afk_timeout && (current_idle > afk_timeout) && ! gAgent.getAFK()) + static LLCachedControl<S32> afk_timeout(gSavedSettings, "AFKTimeout", 300); + if (afk_timeout() && (current_idle > afk_timeout())) { - LL_INFOS("IdleAway") << "Idle more than " << afk_timeout << " seconds: automatically changing to Away status" << LL_ENDL; - gAgent.setAFK(); + if (!gAgent.getAFK()) + { + LL_INFOS("IdleAway") << "Idle more than " << afk_timeout << " seconds: automatically changing to Away status" << LL_ENDL; + gAgent.setAFK(); + } + else + { + // Refresh timer so that random one click or hover won't clear the status. + // But expanding the window still should lift afk status + gAwayTimer.reset(); + } } } @@ -489,7 +513,7 @@ static void deferred_ui_audio_callback(const LLUUID& uuid) bool create_text_segment_icon_from_url_match(LLUrlMatch* match,LLTextBase* base) { - if(!match || !base || base->getPlainText()) + if (!match || match->getSkipProfileIcon() || !base || base->getPlainText()) return false; LLUUID match_id = match->getID(); @@ -572,6 +596,7 @@ static void settings_to_globals() LLWindowMacOSX::sUseMultGL = gSavedSettings.getBOOL("RenderAppleUseMultGL"); #endif // LL_SDL gHiDPISupport = gSavedSettings.getBOOL("RenderHiDPI"); + gHDRDisplaySupport = gSavedSettings.getBOOL("MPHDRDisplay"); #endif } @@ -583,6 +608,8 @@ static void settings_modify() LLVOSurfacePatch::sLODFactor = gSavedSettings.getF32("RenderTerrainLODFactor"); LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; //square lod factor to get exponential range of [1,4] gDebugGL = gDebugGLSession || gDebugSession; + bool noGLDebug = gSavedSettings.getBOOL("MPNoGLDebug"); + if(noGLDebug) gDebugGL = false; gDebugPipeline = gSavedSettings.getBOOL("RenderDebugPipeline"); } @@ -988,7 +1015,7 @@ bool LLAppViewer::init() return false; } -#if defined(__i386__) || defined(__x86_64__) || defined(__amd64__) +#if defined(__i386__) || defined(__x86_64__) || defined(__amd64__) || _M_X64 // Without SSE2 support we will crash almost immediately, warn here. if (!gSysCPU.hasSSE2()) { @@ -1227,15 +1254,15 @@ bool LLAppViewer::init() /// Tell the Coprocedure manager how to discover and store the pool sizes // what I wanted LLCoprocedureManager::getInstance()->setPropertyMethods( - boost::bind(&LLControlGroup::getU32, boost::ref(gSavedSettings), _1), - boost::bind(&LLControlGroup::declareU32, boost::ref(gSavedSettings), _1, _2, _3, LLControlVariable::PERSIST_ALWAYS)); + std::bind(&LLControlGroup::getU32, std::ref(gSavedSettings), std::placeholders::_1), + std::bind(&LLControlGroup::declareU32, std::ref(gSavedSettings), std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, LLControlVariable::PERSIST_ALWAYS)); // TODO: consider moving proxy initialization here or LLCopocedureManager after proxy initialization, may be implement // some other protection to make sure we don't use network before initializng proxy /*----------------------------------------------------------------------*/ // nat 2016-06-29 moved the following here from the former mainLoop(). - mMainloopTimeout = new LLWatchdogTimeout(); + mMainloopTimeout = new LLWatchdogTimeout("mainloop"); // Create IO Pump to use for HTTP Requests. gServicePump = new LLPumpIO(gAPRPoolp); @@ -1260,6 +1287,7 @@ bool LLAppViewer::init() LLViewerCamera::createInstance(); LL::GLTFSceneManager::createInstance(); + gSavedSettings.setU32("DebugQualityPerformance", gSavedSettings.getU32("RenderQualityPerformance")); #if LL_WINDOWS if (!mSecondInstance) @@ -1286,11 +1314,15 @@ void LLAppViewer::initMaxHeapSize() //------------------------------------------------------------------------------------------ //currently SL is built under 32-bit setting, we set its max heap size no more than 1.6 GB. - #ifndef LL_X86_64 +/* +#ifndef LL_X86_64 F32Gigabytes max_heap_size_gb = (F32Gigabytes)gSavedSettings.getF32("MaxHeapSize") ; #else +*/ F32Gigabytes max_heap_size_gb = (F32Gigabytes)gSavedSettings.getF32("MaxHeapSize64"); +/* #endif +*/ LLMemory::initMaxHeapSizeGB(max_heap_size_gb); } @@ -1341,15 +1373,24 @@ bool LLAppViewer::frame() bool LLAppViewer::doFrame() { + resumeMainloopTimeout("Main:doFrameStart"); + U32 fpsLimitMaxFps = (U32)gSavedSettings.getU32("MaxFPS"); - if(fpsLimitMaxFps>120) fpsLimitMaxFps=0; + if(fpsLimitMaxFps > 120) fpsLimitMaxFps = 0; using TimePoint = std::chrono::steady_clock::time_point; + U64 additionalSleepTime = 0; + TimePoint frameStartTime = std::chrono::steady_clock::now(); - U64 fpsLimitSleepFor = 0; - TimePoint fpsLimitFrameStartTime = std::chrono::steady_clock::now(); +#ifdef LL_DISCORD + { + LL_PROFILE_ZONE_NAMED("discord_callbacks"); + discordpp::RunCallbacks(); + } +#endif LL_RECORD_BLOCK_TIME(FTM_FRAME); + LL_PROFILE_GPU_ZONE("Frame"); { // and now adjust the visuals from previous frame. if(LLPerfStats::tunables.userAutoTuneEnabled && LLPerfStats::tunables.tuningFlag != LLPerfStats::Tunables::Nothing) @@ -1424,12 +1465,14 @@ bool LLAppViewer::doFrame() { LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df mainloop"); + pingMainloopTimeout("df mainloop"); // canonical per-frame event mainloop.post(newFrame); } { LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df suspend"); + pingMainloopTimeout("df suspend"); // give listeners a chance to run llcoro::suspend(); // if one of our coroutines threw an uncaught exception, rethrow it now @@ -1439,30 +1482,33 @@ bool LLAppViewer::doFrame() if (!LLApp::isExiting()) { - LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df JoystickKeyboard"); - pingMainloopTimeout("Main:JoystickKeyboard"); - - // Scan keyboard for movement keys. Command keys and typing - // are handled by windows callbacks. Don't do this until we're - // done initializing. JC - if (gViewerWindow - && (gHeadlessClient || gViewerWindow->getWindow()->getVisible()) - && gViewerWindow->getActive() - && !gViewerWindow->getWindow()->getMinimized() - && LLStartUp::getStartupState() == STATE_STARTED - && (gHeadlessClient || !gViewerWindow->getShowProgress()) - && !gFocusMgr.focusLocked()) { - LLPerfStats::RecordSceneTime T (LLPerfStats::StatType_t::RENDER_IDLE); - joystick->scanJoystick(); - gKeyboard->scanKeyboard(); - gViewerInput.scanMouse(); + LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df JoystickKeyboard"); + pingMainloopTimeout("Main:JoystickKeyboard"); + + // Scan keyboard for movement keys. Command keys and typing + // are handled by windows callbacks. Don't do this until we're + // done initializing. JC + if (gViewerWindow + && (gHeadlessClient || gViewerWindow->getWindow()->getVisible()) + && gViewerWindow->getActive() + && !gViewerWindow->getWindow()->getMinimized() + && LLStartUp::getStartupState() == STATE_STARTED + && (gHeadlessClient || !gViewerWindow->getShowProgress()) + && !gFocusMgr.focusLocked()) + { + LLPerfStats::RecordSceneTime T(LLPerfStats::StatType_t::RENDER_IDLE); + joystick->scanJoystick(); + gKeyboard->scanKeyboard(); + gViewerInput.scanMouse(); + } } // Update state based on messages, user input, object idle. { { LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df pauseMainloopTimeout"); + pingMainloopTimeout("df idle"); // So that it will be aware of last state. pauseMainloopTimeout(); // *TODO: Remove. Messages shouldn't be stalling for 20+ seconds! } @@ -1474,7 +1520,7 @@ bool LLAppViewer::doFrame() { LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df resumeMainloopTimeout"); - resumeMainloopTimeout(); + resumeMainloopTimeout("df idle"); } } @@ -1489,7 +1535,7 @@ bool LLAppViewer::doFrame() } disconnectViewer(); - resumeMainloopTimeout(); + resumeMainloopTimeout("df snapshot n disconnect"); } // Render scene. @@ -1519,23 +1565,11 @@ bool LLAppViewer::doFrame() } } - if(fpsLimitMaxFps > 0) - { - auto elapsed = std::chrono::steady_clock::now() - fpsLimitFrameStartTime; - - long long fpsLimitFrameTime = std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count(); - U64 desired_time_us = (U32)(1000000.f / fpsLimitMaxFps); - if((fpsLimitFrameTime+1000) < desired_time_us) - { - fpsLimitSleepFor = (desired_time_us - fpsLimitFrameTime - 1000) * 1.0; - } - } - { LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df pauseMainloopTimeout"); - pingMainloopTimeout("Main:Sleep"); + pingMainloopTimeout("Main:Sleep"); - pauseMainloopTimeout(); + pauseMainloopTimeout(); } // Sleep and run background threads @@ -1543,9 +1577,25 @@ bool LLAppViewer::doFrame() //LL_RECORD_BLOCK_TIME(SLEEP2); LL_PROFILE_ZONE_WARN("Sleep2"); - if(fpsLimitSleepFor) + auto elapsed = std::chrono::steady_clock::now() - frameStartTime; + long long frameTime = std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count(); + + if(fpsLimitMaxFps > 0) + { + U64 desired_time_us = (U32)(1000000.f / fpsLimitMaxFps); + if((frameTime+1000) < desired_time_us) + { + additionalSleepTime = 0.92 * (F64)(desired_time_us - frameTime); + if(additionalSleepTime < 200) + { + additionalSleepTime = 0; + } + } + } + + if(additionalSleepTime > 0) { - usleep(fpsLimitSleepFor); + std::this_thread::sleep_for(std::chrono::microseconds(additionalSleepTime)); } // yield some time to the os based on command line option @@ -1641,23 +1691,29 @@ bool LLAppViewer::doFrame() LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df resumeMainloopTimeout"); resumeMainloopTimeout(); } + + //swap(); + pingMainloopTimeout("Main:End"); } } if (LLApp::isExiting()) { + pingMainloopTimeout("Main:qSnapshot"); // Save snapshot for next time, if we made it through initialization if (STATE_STARTED == LLStartUp::getStartupState()) { saveFinalSnapshot(); } + pingMainloopTimeout("Main:TerminateVoice"); if (LLVoiceClient::instanceExists()) { LLVoiceClient::getInstance()->terminate(); } + pingMainloopTimeout("Main:TerminatePump"); delete gServicePump; gServicePump = NULL; @@ -1666,6 +1722,11 @@ bool LLAppViewer::doFrame() LL_INFOS() << "Exiting main_loop" << LL_ENDL; } }LLPerfStats::StatsRecorder::endFrame(); + + // Not viewer's fault if something outside frame + // pauses viewer (ex: macOS doesn't call oneFrame), + // so stop tracking on exit. + pauseMainloopTimeout(); LL_PROFILER_FRAME_END; return ! LLApp::isRunning(); @@ -1709,11 +1770,12 @@ void LLAppViewer::flushLFSIO() bool LLAppViewer::cleanup() { - LLAtmosphere::cleanupClass(); - //ditch LLVOAvatarSelf instance gAgentAvatarp = NULL; + // Sanity check to catch cases where someone forgot to do an RlvActions::isRlvEnabled() check + LL_ERRS_IF(!RlvHandler::isEnabled() && RlvHandler::instanceExists()) << "RLV handler instance exists even though RLVa is disabled" << LL_ENDL; + LLNotifications::instance().clear(); // workaround for DEV-35406 crash on shutdown @@ -1882,36 +1944,6 @@ bool LLAppViewer::cleanup() // Clean up before GL is shut down because we might be holding on to objects with texture references LLSelectMgr::cleanupGlobals(); - LL_INFOS() << "Shutting down OpenGL" << LL_ENDL; - - // Shut down OpenGL - if( gViewerWindow) - { - gViewerWindow->shutdownGL(); - - // Destroy window, and make sure we're not fullscreen - // This may generate window reshape and activation events. - // Therefore must do this before destroying the message system. - delete gViewerWindow; - gViewerWindow = NULL; - LL_INFOS() << "ViewerWindow deleted" << LL_ENDL; - } - - LLSplashScreen::show(); - LLSplashScreen::update(LLTrans::getString("ShuttingDown")); - - LL_INFOS() << "Cleaning up Keyboard & Joystick" << LL_ENDL; - - // viewer UI relies on keyboard so keep it aound until viewer UI isa gone - delete gKeyboard; - gKeyboard = NULL; - - if (LLViewerJoystick::instanceExists()) - { - // Turn off Space Navigator and similar devices - LLViewerJoystick::getInstance()->terminate(); - } - LL_INFOS() << "Cleaning up Objects" << LL_ENDL; LLViewerObject::cleanupVOClasses(); @@ -2072,6 +2104,36 @@ bool LLAppViewer::cleanup() sTextureFetch->shutDownTextureCacheThread() ; LLLFSThread::sLocal->shutdown(); + LL_INFOS() << "Shutting down OpenGL" << LL_ENDL; + + // Shut down OpenGL + if (gViewerWindow) + { + gViewerWindow->shutdownGL(); + + // Destroy window, and make sure we're not fullscreen + // This may generate window reshape and activation events. + // Therefore must do this before destroying the message system. + delete gViewerWindow; + gViewerWindow = NULL; + LL_INFOS() << "ViewerWindow deleted" << LL_ENDL; + } + + LLSplashScreen::show(); + LLSplashScreen::update(LLTrans::getString("ShuttingDown")); + + LL_INFOS() << "Cleaning up Keyboard & Joystick" << LL_ENDL; + + // viewer UI relies on keyboard so keep it aound until viewer UI isa gone + delete gKeyboard; + gKeyboard = NULL; + + if (LLViewerJoystick::instanceExists()) + { + // Turn off Space Navigator and similar devices + LLViewerJoystick::getInstance()->terminate(); + } + LL_INFOS() << "Shutting down message system" << LL_ENDL; end_messaging_system(); @@ -2292,10 +2354,7 @@ void errorCallback(LLError::ELevel level, const std::string &error_string) // Callback for LLError::LLUserWarningMsg void errorHandler(const std::string& title_string, const std::string& message_string, S32 code) { - if (!message_string.empty()) - { - OSMessageBox(message_string, title_string.empty() ? LLTrans::getString("MBFatalError") : title_string, OSMB_OK); - } + // message is going to hang viewer, create marker first switch (code) { case LLError::LLUserWarningMsg::ERROR_OTHER: @@ -2303,6 +2362,10 @@ void errorHandler(const std::string& title_string, const std::string& message_st break; case LLError::LLUserWarningMsg::ERROR_BAD_ALLOC: LLAppViewer::instance()->createErrorMarker(LAST_EXEC_BAD_ALLOC); + // When system run out of memory and errorHandler gets called from a thread, + // main thread might keep going while OSMessageBox freezes the caller. + // Todo: handle it better, but for now disconnect to avoid making things worse + gDisconnected = true; break; case LLError::LLUserWarningMsg::ERROR_MISSING_FILES: LLAppViewer::instance()->createErrorMarker(LAST_EXEC_MISSING_FILES); @@ -2310,6 +2373,25 @@ void errorHandler(const std::string& title_string, const std::string& message_st default: break; } + if (!message_string.empty()) + { + if (on_main_thread()) + { + // Prevent watchdog from killing us while dialog is up. + // Can't do pauseMainloopTimeout, since this may be called + // from threads and we are not going to need watchdog now. + LLAppViewer::instance()->pauseMainloopTimeout(); + + // todo: might want to have non-crashing timeout for OOM cases + // and needs a way to pause main loop. + OSMessageBox(message_string, title_string.empty() ? LLTrans::getString("MBFatalError") : title_string, OSMB_OK); + LLAppViewer::instance()->resumeMainloopTimeout(); + } + else + { + OSMessageBox(message_string, title_string.empty() ? LLTrans::getString("MBFatalError") : title_string, OSMB_OK); + } + } } void LLAppViewer::initLoggingAndGetLastDuration() @@ -2402,7 +2484,6 @@ void LLAppViewer::initLoggingAndGetLastDuration() if (gDirUtilp->fileExists(user_data_path_cef_log)) { std::string user_data_path_cef_old = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "cef.old"); - LLFile::remove(user_data_path_cef_old, ENOENT); LLFile::rename(user_data_path_cef_log, user_data_path_cef_old); } } @@ -3135,7 +3216,15 @@ bool LLAppViewer::initWindow() .height(gSavedSettings.getU32("WindowHeight")) .min_width(gSavedSettings.getU32("MinWindowWidth")) .min_height(gSavedSettings.getU32("MinWindowHeight")) +#ifdef LL_DARWIN + // Setting it to true causes black screen with no UI displayed. + // Given that it's a DEBUG settings and application goes fullscreen + // on mac simply by expanding it, it was decided to not support/use + // this setting on mac. + .fullscreen(false) +#else // LL_DARWIN .fullscreen(gSavedSettings.getBOOL("FullScreen")) +#endif .ignore_pixel_depth(ignorePixelDepth) .first_run(mIsFirstRun); @@ -3145,7 +3234,7 @@ bool LLAppViewer::initWindow() // Need to load feature table before cheking to start watchdog. bool use_watchdog = false; - int watchdog_enabled_setting = gSavedSettings.getS32("WatchdogEnabled"); + S32 watchdog_enabled_setting = gSavedSettings.getS32("WatchdogEnabled"); if (watchdog_enabled_setting == -1) { use_watchdog = !LLFeatureManager::getInstance()->isFeatureAvailable("WatchdogDisabled"); @@ -3164,22 +3253,22 @@ bool LLAppViewer::initWindow() if (use_watchdog) { - LLWatchdog::getInstance()->init(); + LLWatchdog::getInstance()->init([]() + { + LLAppViewer* app = LLAppViewer::instance(); + if (app->logoutRequestSent()) + { + app->createErrorMarker(LAST_EXEC_LOGOUT_FROZE); + } + else + { + app->createErrorMarker(LAST_EXEC_FROZE); + } + }); } LLNotificationsUI::LLNotificationManager::getInstance(); - -#ifdef LL_DARWIN - //Satisfy both MAINT-3135 (OSX 10.6 and earlier) MAINT-3288 (OSX 10.7 and later) - LLOSInfo& os_info = LLOSInfo::instance(); - if (os_info.mMajorVer == 10 && os_info.mMinorVer < 7) - { - if ( os_info.mMinorVer == 6 && os_info.mBuild < 8 ) - gViewerWindow->getWindow()->setOldResize(true); - } -#endif - if (gSavedSettings.getBOOL("WindowMaximized")) { gViewerWindow->getWindow()->maximize(); @@ -3294,6 +3383,11 @@ LLSD LLAppViewer::getViewerInfo() const info["VIEWER_VERSION_STR"] = versionInfo.getVersion(); info["CHANNEL"] = versionInfo.getChannel(); info["ADDRESS_SIZE"] = ADDRESS_SIZE; +#if LL_ARM64 + info["ARCHITECTURE"] = "ARM"; +#else + info["ARCHITECTURE"] = "x86"; +#endif std::string build_config = versionInfo.getBuildConfig(); if (build_config != "Release") { @@ -3375,6 +3469,7 @@ LLSD LLAppViewer::getViewerInfo() const } #endif + info["RLV_VERSION"] = RlvActions::isRlvEnabled() ? Rlv::Strings::getVersionAbout() : "(disabled)"; info["OPENGL_VERSION"] = ll_safe_string((const char*)(glGetString(GL_VERSION))); // Settings @@ -3385,7 +3480,7 @@ LLSD LLAppViewer::getViewerInfo() const info["FONT_SIZE_ADJUSTMENT"] = gSavedSettings.getF32("FontScreenDPI"); info["UI_SCALE"] = gSavedSettings.getF32("UIScaleFactor"); info["DRAW_DISTANCE"] = gSavedSettings.getF32("RenderFarClip"); - info["NET_BANDWITH"] = gSavedSettings.getF32("ThrottleBandwidthKBPS"); + info["NET_BANDWITH"] = LLViewerThrottle::getMaxBandwidthKbps(); info["LOD_FACTOR"] = gSavedSettings.getF32("RenderVolumeLODFactor"); info["RENDER_QUALITY"] = (F32)gSavedSettings.getU32("RenderQualityPerformance"); info["TEXTURE_MEMORY"] = LLSD::Integer(gGLManager.mVRAM); @@ -3420,7 +3515,7 @@ LLSD LLAppViewer::getViewerInfo() const info["VOICE_VERSION"] = LLTrans::getString("NotConnected"); } -#if LL_DARWIN || LL_LINUX || __FreeBSD__ +#if !_M_ARM64 // !LL_LINUX std::ostringstream cef_ver_codec; cef_ver_codec << "Dullahan: "; cef_ver_codec << DULLAHAN_VERSION_MAJOR; @@ -3450,7 +3545,7 @@ LLSD LLAppViewer::getViewerInfo() const info["LIBCEF_VERSION"] = "Undefined"; #endif -//#if !LL_LINUX +#if !_M_ARM64 // !LL_LINUX std::ostringstream vlc_ver_codec; vlc_ver_codec << LIBVLC_VERSION_MAJOR; vlc_ver_codec << "."; @@ -3458,11 +3553,9 @@ LLSD LLAppViewer::getViewerInfo() const vlc_ver_codec << "."; vlc_ver_codec << LIBVLC_VERSION_REVISION; info["LIBVLC_VERSION"] = vlc_ver_codec.str(); -/* #else info["LIBVLC_VERSION"] = "Undefined"; #endif -*/ S32 packets_in = (S32)LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_IN); if (packets_in > 0) @@ -3627,10 +3720,15 @@ void LLAppViewer::writeSystemInfo() if (! gDebugInfo.has("Dynamic") ) gDebugInfo["Dynamic"] = LLSD::emptyMap(); -#if LL_WINDOWS && !LL_BUGSPLAT +#if LL_DARWIN + // crash processing in CrashMetadataSingleton reads SLLog + gDebugInfo["SLLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.crash"); +#elif LL_WINDOWS && !LL_BUGSPLAT gDebugInfo["SLLog"] = gDirUtilp->getExpandedFilename(LL_PATH_DUMP,"SecondLife.log"); #else - //Not ideal but sufficient for good reporting. + // Far from ideal, especially when multiple instances get involved. + // Note that attachmentsForBugSplat expects .old extendion. + // Todo: improve. gDebugInfo["SLLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.old"); //LLError::logFileName(); #endif @@ -3949,8 +4047,15 @@ void LLAppViewer::processMarkerFiles() else if (marker_is_same_version) { // the file existed, is ours, and matched our version, so we can report on what it says - LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found; last exec crashed" << LL_ENDL; + LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found; last exec crashed or froze" << LL_ENDL; +#if LL_WINDOWS && LL_BUGSPLAT + // bugsplat will set correct state in bugsplatSendLog + // Might be more accurate to rename this one into 'unknown' + gLastExecEvent = LAST_EXEC_UNKNOWN; +#else gLastExecEvent = LAST_EXEC_OTHER_CRASH; +#endif // LL_WINDOWS + } else { @@ -3992,7 +4097,8 @@ void LLAppViewer::processMarkerFiles() { if (markerIsSameVersion(logout_marker_file)) { - gLastExecEvent = LAST_EXEC_LOGOUT_FROZE; + // Either froze, got killed or somehow crash was not caught + gLastExecEvent = LAST_EXEC_LOGOUT_UNKNOWN; LL_INFOS("MarkerFile") << "Logout crash marker '"<< logout_marker_file << "', changing LastExecEvent to LOGOUT_FROZE" << LL_ENDL; } else @@ -4030,6 +4136,22 @@ void LLAppViewer::processMarkerFiles() } LLAPRFile::remove(error_marker_file); } + +#if LL_DARWIN + if (!mSecondInstance && gLastExecEvent != LAST_EXEC_NORMAL) + { + // While windows reports crashes immediately, mac reports next run and + // may take a while to trigger crash report so it has a special file. + // Remove .crash file if exists + std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, + "SecondLife.old"); + std::string crash_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, + "SecondLife.crash"); + LLFile::remove(crash_log_file); + // Rename ".old" log file to ".crash" + LLFile::rename(old_log_file, crash_log_file); + } +#endif } void LLAppViewer::removeMarkerFiles() @@ -4123,6 +4245,7 @@ void LLAppViewer::requestQuit() return; } + pingMainloopTimeout("Main:qMetrics"); // Try to send metrics back to the grid metricsSend(!gDisconnected); @@ -4138,6 +4261,7 @@ void LLAppViewer::requestQuit() LLHUDManager::getInstance()->sendEffects(); effectp->markDead() ;//remove it. + pingMainloopTimeout("Main:qFloaters"); // Attempt to close all floaters that might be // editing things. if (gFloaterView) @@ -4146,6 +4270,7 @@ void LLAppViewer::requestQuit() gFloaterView->closeAllChildren(true); mClosingFloaters = true; } + pingMainloopTimeout("Main:qStats"); // Send preferences once, when exiting bool include_preferences = true; @@ -4153,6 +4278,7 @@ void LLAppViewer::requestQuit() gLogoutTimer.reset(); mQuitRequested = true; + pingMainloopTimeout("Main:LoggingOut"); } static bool finish_quit(const LLSD& notification, const LLSD& response) @@ -4199,7 +4325,7 @@ void LLAppViewer::earlyExit(const std::string& name, const LLSD& substitutions) // case where we need the viewer to exit without any need for notifications void LLAppViewer::earlyExitNoNotify() { - LL_WARNS() << "app_early_exit with no notification: " << LL_ENDL; + LL_WARNS() << "app_early_exit with no notification." << LL_ENDL; gDoDisconnect = true; finish_early_exit( LLSD(), LLSD() ); } @@ -4297,7 +4423,7 @@ U32 LLAppViewer::getTextureCacheVersion() U32 LLAppViewer::getDiskCacheVersion() { // Viewer disk cache version intorduced in Simple Cache Viewer, change if the cache format changes. - const U32 DISK_CACHE_VERSION = 1; + const U32 DISK_CACHE_VERSION = 3; return DISK_CACHE_VERSION ; } @@ -4323,8 +4449,8 @@ bool LLAppViewer::initCache() const std::string cache_dir_name = gSavedSettings.getString("DiskCacheDirName"); const U32 MB = 1024 * 1024; - const uintmax_t MIN_CACHE_SIZE = 256 * MB; - const uintmax_t MAX_CACHE_SIZE = 9984ll * MB; + const uintmax_t MIN_CACHE_SIZE = 896 * MB; + const uintmax_t MAX_CACHE_SIZE = 32768ll * MB; const uintmax_t setting_cache_total_size = uintmax_t(gSavedSettings.getU32("CacheSize")) * MB; const uintmax_t cache_total_size = llclamp(setting_cache_total_size, MIN_CACHE_SIZE, MAX_CACHE_SIZE); const F64 disk_cache_percent = gSavedSettings.getF32("DiskCachePercentOfTotal"); @@ -4384,6 +4510,8 @@ bool LLAppViewer::initCache() LL_WARNS("AppCache") << "Unable to set cache location" << LL_ENDL; gSavedSettings.setString("CacheLocation", ""); gSavedSettings.setString("CacheLocationTopFolder", ""); + gSavedSettings.setString("NewCacheLocation", ""); + gSavedSettings.setString("NewCacheLocationTopFolder", ""); } const std::string cache_dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, cache_dir_name); @@ -4430,10 +4558,13 @@ bool LLAppViewer::initCache() const U32 CACHE_NUMBER_OF_REGIONS_FOR_OBJECTS = 128; LLVOCache::getInstance()->initCache(LL_PATH_CACHE, CACHE_NUMBER_OF_REGIONS_FOR_OBJECTS, getObjectCacheVersion()); + // Remove old, stale CEF cache folders + purgeCefStaleCaches(); + return true; } -void LLAppViewer::addOnIdleCallback(const boost::function<void()>& cb) +void LLAppViewer::addOnIdleCallback(const std::function<void()>& cb) { gMainloopWork.post(cb); } @@ -4454,18 +4585,28 @@ void LLAppViewer::loadKeyBindings() LLUrlRegistry::instance().setKeybindingHandler(&gViewerInput); } +// As per GHI #4498, remove old, stale CEF cache folders from previous sessions +void LLAppViewer::purgeCefStaleCaches() +{ + // TODO: we really shouldn't use a hard coded name for the cache folder here... + const std::string browser_parent_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "cef_cache"); + if (LLFile::isdir(browser_parent_cache)) + { + // This is a sledgehammer approach - nukes the cef_cache dir entirely + // which is then recreated the first time a CEF instance creates an + // individual cache folder. If we ever decide to retain some folders + // e.g. Search UI cache - then we will need a more granular approach. + gDirUtilp->deleteDirAndContents(browser_parent_cache); + } +} + void LLAppViewer::purgeCache() { LL_INFOS("AppCache") << "Purging Cache and Texture Cache..." << LL_ENDL; LLAppViewer::getTextureCache()->purgeCache(LL_PATH_CACHE); LLVOCache::getInstance()->removeCache(LL_PATH_CACHE); LLViewerShaderMgr::instance()->clearShaderCache(); - std::string browser_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "cef_cache"); - if (LLFile::isdir(browser_cache)) - { - // cef does not support clear_cache and clear_cookies, so clear what we can manually. - gDirUtilp->deleteDirAndContents(browser_cache); - } + purgeCefStaleCaches(); gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""), "*"); } @@ -4534,6 +4675,7 @@ void LLAppViewer::forceDisconnect(const std::string& mesg) } else { + sendSimpleLogoutRequest(); args["MESSAGE"] = big_reason; LLNotificationsUtil::add("YouHaveBeenLoggedOut", args, LLSD(), &finish_disconnect ); } @@ -4589,6 +4731,7 @@ void LLAppViewer::saveFinalSnapshot() false, gSavedSettings.getBOOL("RenderHUDInSnapshot"), true, + false, LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::SNAPSHOT_FORMAT_PNG); mSavedFinalSnapshot = true; @@ -4616,11 +4759,32 @@ void LLAppViewer::saveFinalSnapshot() } } +static const char PRODUCTION_CACHE_FORMAT_STRING[] = "%s.%s"; +static const char GRID_CACHE_FORMAT_STRING[] = "%s.%s.%s"; +std::string get_name_cache_filename(const std::string &base_file, const std::string& extention) +{ + std::string filename; + std::string path(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, base_file)); + if (LLGridManager::getInstance()->isInProductionGrid()) + { + filename = llformat(PRODUCTION_CACHE_FORMAT_STRING, path.c_str(), extention.c_str()); + } + else + { + // NOTE: The inventory cache filenames now include the grid name. + // Add controls against directory traversal or problematic pathname lengths + // if your viewer uses grid names from an untrusted source. + const std::string& grid_id_str = LLGridManager::getInstance()->getGridId(); + const std::string& grid_id_lower = utf8str_tolower(grid_id_str); + filename = llformat(GRID_CACHE_FORMAT_STRING, path.c_str(), grid_id_lower.c_str(), extention.c_str()); + } + return filename; +} + void LLAppViewer::loadNameCache() { // display names cache - std::string filename = - gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "avatar_name_cache.xml"); + std::string filename = get_name_cache_filename("avatar_name_cache", "xml"); LL_INFOS("AvNameCache") << filename << LL_ENDL; llifstream name_cache_stream(filename.c_str()); if(name_cache_stream.is_open()) @@ -4635,8 +4799,8 @@ void LLAppViewer::loadNameCache() if (!gCacheName) return; - std::string name_cache; - name_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "name.cache"); + // is there a reason for the "cache" extention? + std::string name_cache = get_name_cache_filename("name", "cache"); llifstream cache_file(name_cache.c_str()); if(cache_file.is_open()) { @@ -4647,8 +4811,7 @@ void LLAppViewer::loadNameCache() void LLAppViewer::saveNameCache() { // display names cache - std::string filename = - gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "avatar_name_cache.xml"); + std::string filename = get_name_cache_filename("avatar_name_cache", "xml"); llofstream name_cache_stream(filename.c_str()); if(name_cache_stream.is_open()) { @@ -4658,8 +4821,7 @@ void LLAppViewer::saveNameCache() // real names cache if (gCacheName) { - std::string name_cache; - name_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "name.cache"); + std::string name_cache = get_name_cache_filename("name", "cache"); llofstream cache_file(name_cache.c_str()); if(cache_file.is_open()) { @@ -4937,6 +5099,20 @@ void LLAppViewer::idle() if (gTeleportDisplay) { + if (gAgent.getTeleportState() == LLAgent::TELEPORT_ARRIVING) + { + // Teleported, but waiting for things to load, start processing surface data + { + LL_RECORD_BLOCK_TIME(FTM_NETWORK); + gVLManager.unpackData(); + } + { + LL_RECORD_BLOCK_TIME(FTM_REGION_UPDATE); + const F32 max_region_update_time = .001f; // 1ms + LLWorld::getInstance()->updateRegions(max_region_update_time); + } + } + return; } @@ -5232,15 +5408,28 @@ void LLAppViewer::sendLogoutRequest() gLogoutInProgress = true; if (!mSecondInstance) { - mLogoutMarkerFileName = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,LOGOUT_MARKER_FILE_NAME); - - mLogoutMarkerFile.open(mLogoutMarkerFileName, LL_APR_WB); - if (mLogoutMarkerFile.getFileHandle()) + mLogoutMarkerFileName = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, LOGOUT_MARKER_FILE_NAME); + try { - LL_INFOS("MarkerFile") << "Created logout marker file '"<< mLogoutMarkerFileName << "' " << LL_ENDL; - recordMarkerVersion(mLogoutMarkerFile); + if (!mLogoutMarkerFile.getFileHandle()) + { + mLogoutMarkerFile.open(mLogoutMarkerFileName, LL_APR_WB); + if (mLogoutMarkerFile.getFileHandle()) + { + LL_INFOS("MarkerFile") << "Created logout marker file '" << mLogoutMarkerFileName << "' " << LL_ENDL; + recordMarkerVersion(mLogoutMarkerFile); + } + else + { + LL_WARNS("MarkerFile") << "Cannot create logout marker file " << mLogoutMarkerFileName << LL_ENDL; + } + } + else + { + LL_WARNS("MarkerFile") << "Atempted to reopen file '" << mLogoutMarkerFileName << "' " << LL_ENDL; + } } - else + catch (...) { LL_WARNS("MarkerFile") << "Cannot create logout marker file " << mLogoutMarkerFileName << LL_ENDL; } @@ -5257,6 +5446,8 @@ void LLAppViewer::sendLogoutRequest() msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); gAgent.sendReliableMessage(); + LL_INFOS("Agent") << "Logging out as agent: " << gAgent.getID() << " Session: " << gAgent.getSessionID() << LL_ENDL; + gLogoutTimer.reset(); gLogoutMaxTime = LOGOUT_REQUEST_TIME; mLogoutRequestSent = true; @@ -5265,6 +5456,27 @@ void LLAppViewer::sendLogoutRequest() } } +void LLAppViewer::sendSimpleLogoutRequest() +{ + if (!mLogoutRequestSent && gMessageSystem) + { + gLogoutInProgress = true; + + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_LogoutRequest); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gAgent.sendReliableMessage(); + + LL_INFOS("Agent") << "Logging out as agent: " << gAgent.getID() << " Session: " << gAgent.getSessionID() << LL_ENDL; + + gLogoutTimer.reset(); + gLogoutMaxTime = LOGOUT_REQUEST_TIME; + mLogoutRequestSent = true; + } +} + void LLAppViewer::updateNameLookupUrl(const LLViewerRegion * regionp) { if (!regionp || !regionp->capabilitiesReceived()) @@ -5329,6 +5541,12 @@ void LLAppViewer::createErrorMarker(eLastExecEvent error_code) const } } +bool LLAppViewer::errorMarkerExists() const +{ + std::string error_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ERROR_MARKER_FILE_NAME); + return LLAPRFile::isExist(error_marker_file, NULL, LL_APR_RB); +} + void LLAppViewer::outOfMemorySoftQuit() { if (!mQuitRequested) @@ -5341,6 +5559,7 @@ void LLAppViewer::outOfMemorySoftQuit() LLLFSThread::sLocal->pause(); gLogoutTimer.reset(); mQuitRequested = true; + destroyMainloopTimeout(); LLError::LLUserWarningMsg::showOutOfMemory(); } @@ -5373,12 +5592,9 @@ void LLAppViewer::idleNameCache() // Handle messages, and all message related stuff // -#define TIME_THROTTLE_MESSAGES -#ifdef TIME_THROTTLE_MESSAGES -#define CHECK_MESSAGES_DEFAULT_MAX_TIME .020f // 50 ms = 50 fps (just for messages!) +constexpr F32 CHECK_MESSAGES_DEFAULT_MAX_TIME = 0.020f; // 50 ms = 50 fps (just for messages!) static F32 CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME; -#endif static LLTrace::BlockTimerStatHandle FTM_IDLE_NETWORK("Idle Network"); static LLTrace::BlockTimerStatHandle FTM_MESSAGE_ACKS("Message Acks"); @@ -5395,7 +5611,8 @@ void LLAppViewer::idleNetwork() gObjectList.mNumNewObjects = 0; S32 total_decoded = 0; - if (!gSavedSettings.getBOOL("SpeedTest")) + static LLCachedControl<bool> speed_test(gSavedSettings, "SpeedTest", false); + if (!speed_test()) { LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK("idle network"); //LL_RECORD_BLOCK_TIME(FTM_IDLE_NETWORK); // decode @@ -5405,6 +5622,7 @@ void LLAppViewer::idleNetwork() F32 total_time = 0.0f; { + bool needs_drain = false; LockMessageChecker lmc(gMessageSystem); while (lmc.checkAllMessages(frame_count, gServicePump)) { @@ -5417,60 +5635,56 @@ void LLAppViewer::idleNetwork() } total_decoded++; - gPacketsIn++; if (total_decoded > MESSAGE_MAX_PER_FRAME) { + needs_drain = true; break; } -#ifdef TIME_THROTTLE_MESSAGES // Prevent slow packets from completely destroying the frame rate. // This usually happens due to clumps of avatars taking huge amount // of network processing time (which needs to be fixed, but this is // a good limit anyway). total_time = check_message_timer.getElapsedTimeF32(); if (total_time >= CheckMessagesMaxTime) + { + needs_drain = true; break; -#endif + } + } + if (needs_drain || gMessageSystem->mPacketRing.getNumBufferedPackets() > 0) + { + // Rather than allow packets to silently backup on the socket + // we drain them into our own buffer so we know how many exist. + S32 num_buffered_packets = gMessageSystem->drainUdpSocket(); + if (num_buffered_packets > 0) + { + // Increase CheckMessagesMaxTime so that we will eventually catch up + CheckMessagesMaxTime *= 1.035f; // 3.5% ~= 2x in 20 frames, ~8x in 60 frames + } + } + else + { + // Reset CheckMessagesMaxTime to default value + CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME; } // Handle per-frame message system processing. - lmc.processAcks(gSavedSettings.getF32("AckCollectTime")); - } -#ifdef TIME_THROTTLE_MESSAGES - if (total_time >= CheckMessagesMaxTime) - { - // Increase CheckMessagesMaxTime so that we will eventually catch up - CheckMessagesMaxTime *= 1.035f; // 3.5% ~= x2 in 20 frames, ~8x in 60 frames - } - else - { - // Reset CheckMessagesMaxTime to default value - CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME; - } -#endif - - // Decode enqueued messages... - S32 remaining_possible_decodes = MESSAGE_MAX_PER_FRAME - total_decoded; - - if( remaining_possible_decodes <= 0 ) - { - LL_INFOS() << "Maxed out number of messages per frame at " << MESSAGE_MAX_PER_FRAME << LL_ENDL; - } - - if (gPrintMessagesThisFrame) - { - LL_INFOS() << "Decoded " << total_decoded << " msgs this frame!" << LL_ENDL; - gPrintMessagesThisFrame = false; + static LLCachedControl<F32> ack_collection_time(gSavedSettings, "AckCollectTime", 0.1f); + lmc.processAcks(ack_collection_time()); } } add(LLStatViewer::NUM_NEW_OBJECTS, gObjectList.mNumNewObjects); // Retransmit unacknowledged packets. - gXferManager->retransmitUnackedPackets(); + if (gXferManager) + { + gXferManager->retransmitUnackedPackets(); + } gAssetStorage->checkForTimeouts(); + gViewerThrottle.setBufferLoadRate(gMessageSystem->getBufferLoadRate()); gViewerThrottle.updateDynamicThrottle(); // Check that the circuit between the viewer and the agent's current @@ -5589,6 +5803,8 @@ void LLAppViewer::forceErrorBreakpoint() DebugBreak(); #elif __i386__ || __x86_64__ asm ("int $3"); +#else + __builtin_trap(); #endif return; } @@ -5645,6 +5861,27 @@ void LLAppViewer::forceErrorCoroutineCrash() LLCoros::instance().launch("LLAppViewer::crashyCoro", [] {throw LLException("A deliberate crash from LLCoros"); }); } +void LLAppViewer::forceErrorCoroprocedureCrash() +{ + LL_WARNS() << "Forcing a crash in LLCoprocedureManager" << LL_ENDL; + LLCoprocedureManager::instance().enqueueCoprocedure("Upload", "DeliberateCrash", + [](LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t&, const LLUUID&) + { + LL_WARNS() << "Forcing a deliberate bad memory access from LLCoprocedureManager" << LL_ENDL; + S32* crash = NULL; + *crash = 0xDEADBEEF; + }); +} + +void LLAppViewer::forceErrorWorkQueueCrash() +{ + LL::WorkQueue::ptr_t workqueue = LL::WorkQueue::getInstance("General"); + if (workqueue) + { + workqueue->post([]() { throw LLException("This is a deliberate crash from General Queue"); }); + } +} + void LLAppViewer::forceErrorThreadCrash() { class LLCrashTestThread : public LLThread @@ -5666,68 +5903,105 @@ void LLAppViewer::forceErrorThreadCrash() thread->start(); } -void LLAppViewer::initMainloopTimeout(const std::string& state, F32 secs) +void LLAppViewer::forceExceptionThreadCrash() +{ + class LLCrashTestThread : public LLThread + { + public: + + LLCrashTestThread() : LLThread("Crash logging test thread") + { + } + + void run() + { + const std::string exception_text = "This is a deliberate exception in a thread"; + throw std::runtime_error(exception_text); + } + }; + + LL_WARNS() << "This is a deliberate exception in a thread" << LL_ENDL; + LLCrashTestThread* thread = new LLCrashTestThread(); + thread->start(); +} + +void LLAppViewer::initMainloopTimeout(std::string_view state) { - if(!mMainloopTimeout) + if (!mMainloopTimeout) { - mMainloopTimeout = new LLWatchdogTimeout(); - resumeMainloopTimeout(state, secs); + mMainloopTimeout = new LLWatchdogTimeout("mainloop"); + resumeMainloopTimeout(state); } } void LLAppViewer::destroyMainloopTimeout() { - if(mMainloopTimeout) + if (mMainloopTimeout) { delete mMainloopTimeout; - mMainloopTimeout = NULL; + mMainloopTimeout = nullptr; } } -void LLAppViewer::resumeMainloopTimeout(const std::string& state, F32 secs) +void LLAppViewer::resumeMainloopTimeout(std::string_view state) { - if(mMainloopTimeout) + if (mMainloopTimeout) { - if(secs < 0.0f) - { - static LLCachedControl<F32> mainloop_timeout(gSavedSettings, "MainloopTimeoutDefault", 60); - secs = mainloop_timeout; - } - - mMainloopTimeout->setTimeout(secs); + mMainloopTimeout->setTimeout(getMainloopTimeoutSec()); mMainloopTimeout->start(state); } } void LLAppViewer::pauseMainloopTimeout() { - if(mMainloopTimeout) + if (mMainloopTimeout) { mMainloopTimeout->stop(); } } -void LLAppViewer::pingMainloopTimeout(const std::string& state, F32 secs) +void LLAppViewer::pingMainloopTimeout(std::string_view state) { LL_PROFILE_ZONE_SCOPED_CATEGORY_APP; - if(mMainloopTimeout) + if (mMainloopTimeout) { - if(secs < 0.0f) - { - static LLCachedControl<F32> mainloop_timeout(gSavedSettings, "MainloopTimeoutDefault", 60); - secs = mainloop_timeout; - } - - mMainloopTimeout->setTimeout(secs); + mMainloopTimeout->setTimeout(getMainloopTimeoutSec()); mMainloopTimeout->ping(state); } } + +F32 LLAppViewer::getMainloopTimeoutSec() const +{ + if (isQuitting() || mQuitRequested) + { + constexpr F32 QUITTING_SECONDS = 240.f; + return QUITTING_SECONDS; + } + if (LLStartUp::getStartupState() == STATE_STARTED + && gAgent.getTeleportState() == LLAgent::TELEPORT_NONE) + { + // consider making this value match 'disconnected' timout. + static LLCachedControl<F32> mainloop_started(gSavedSettings, "MainloopTimeoutStarted", 60.f); + return mainloop_started(); + } + else + { + static LLCachedControl<F32> mainloop_default(gSavedSettings, "MainloopTimeoutDefault", 120.f); + return mainloop_default(); + } +} + void LLAppViewer::handleLoginComplete() { gLoggedInTime.start(); initMainloopTimeout("Mainloop Init"); + LLWindow* viewer_window = gViewerWindow->getWindow(); + if (viewer_window) // in case of a headless client + { + viewer_window->initWatchdog(); + } // Store some data to DebugInfo in case of a freeze. gDebugInfo["ClientInfo"]["Name"] = LLVersionInfo::instance().getChannel(); @@ -5840,3 +6114,104 @@ void LLAppViewer::metricsSend(bool enable_reporting) // resolution in time. gViewerAssetStats->restart(); } + +#ifdef LL_DISCORD + +void LLAppViewer::initDiscordSocial() +{ + gDiscordPartyCurrentSize = 1; + gDiscordPartyMaxSize = 0; + gDiscordTimestampsStart = time(nullptr); + gDiscordClient = std::make_shared<discordpp::Client>(); + gDiscordClient->SetApplicationId(1393451183741599796); + updateDiscordActivity(); +} + +void LLAppViewer::updateDiscordActivity() +{ + LL_PROFILE_ZONE_SCOPED; + + static LLCachedControl<bool> integration_enabled(gSavedSettings, "EnableDiscord", true); + if (!integration_enabled) + { + gDiscordClient->ClearRichPresence(); + return; + } + + discordpp::Activity activity; + activity.SetType(discordpp::ActivityTypes::Playing); + discordpp::ActivityTimestamps timestamps; + timestamps.SetStart(gDiscordTimestampsStart); + activity.SetTimestamps(timestamps); + + if (gAgent.getID() == LLUUID::null) + { + gDiscordClient->UpdateRichPresence(activity, [](discordpp::ClientResult) {}); + return; + } + + static LLCachedControl<bool> show_details(gSavedSettings, "ShowDiscordActivityDetails", false); + if (show_details) + { + if (gDiscordActivityDetails.empty()) + { + LLAvatarName av_name; + LLAvatarNameCache::get(gAgent.getID(), &av_name); + gDiscordActivityDetails = av_name.getUserName(); + auto displayName = av_name.getDisplayName(); + if (gDiscordActivityDetails != displayName) + gDiscordActivityDetails = displayName + " (" + gDiscordActivityDetails + ")"; + } + activity.SetDetails(gDiscordActivityDetails); + } + + auto agent_pos_region = gAgent.getPositionAgent(); + S32 pos_x = S32(agent_pos_region.mV[VX] + 0.5f); + S32 pos_y = S32(agent_pos_region.mV[VY] + 0.5f); + S32 pos_z = S32(agent_pos_region.mV[VZ] + 0.5f); + F32 velocity_mag_sq = gAgent.getVelocity().magVecSquared(); + const F32 FLY_CUTOFF = 6.f; + const F32 FLY_CUTOFF_SQ = FLY_CUTOFF * FLY_CUTOFF; + const F32 WALK_CUTOFF = 1.5f; + const F32 WALK_CUTOFF_SQ = WALK_CUTOFF * WALK_CUTOFF; + if (velocity_mag_sq > FLY_CUTOFF_SQ) + { + pos_x -= pos_x % 4; + pos_y -= pos_y % 4; + } + else if (velocity_mag_sq > WALK_CUTOFF_SQ) + { + pos_x -= pos_x % 2; + pos_y -= pos_y % 2; + } + + std::string location = "Hidden Region"; + static LLCachedControl<bool> show_state(gSavedSettings, "ShowDiscordActivityState", false); + if (show_state) + { + location = llformat("%s (%d, %d, %d)", gAgent.getRegion()->getName().c_str(), pos_x, pos_y, pos_z); + } + activity.SetState(location); + + discordpp::ActivityParty party; + party.SetId(location); + party.SetCurrentSize(gDiscordPartyCurrentSize); + party.SetMaxSize(gDiscordPartyMaxSize); + activity.SetParty(party); + + gDiscordClient->UpdateRichPresence(activity, [](discordpp::ClientResult) {}); +} + +void LLAppViewer::updateDiscordPartyCurrentSize(int32_t size) +{ + gDiscordPartyCurrentSize = size; + updateDiscordActivity(); +} + +void LLAppViewer::updateDiscordPartyMaxSize(int32_t size) +{ + gDiscordPartyMaxSize = size; + updateDiscordActivity(); +} + +#endif diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index b4756eecd6..6b0d3e0b27 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -77,6 +77,8 @@ typedef enum LAST_EXEC_BAD_ALLOC, LAST_EXEC_MISSING_FILES, LAST_EXEC_GRAPHICS_INIT, + LAST_EXEC_UNKNOWN, + LAST_EXEC_LOGOUT_UNKNOWN, LAST_EXEC_COUNT } eLastExecEvent; @@ -149,6 +151,12 @@ public: std::string getWindowTitle() const; // The window display name. void forceDisconnect(const std::string& msg); // Force disconnection, with a message to the user. + + // sendSimpleLogoutRequest does not create a marker file. + // Meant for lost network case, and for forced shutdowns, + // to at least attempt to remove the ghost from the world. + void sendSimpleLogoutRequest(); + void badNetworkHandler(); // Cause a crash state due to bad network packet. bool hasSavedFinalSnapshot() { return mSavedFinalSnapshot; } @@ -157,9 +165,6 @@ public: void loadNameCache(); void saveNameCache(); - void loadExperienceCache(); - void saveExperienceCache(); - void removeMarkerFiles(); void recordSessionToMarker(); @@ -175,7 +180,10 @@ public: virtual void forceErrorOSSpecificException(); virtual void forceErrorDriverCrash(); virtual void forceErrorCoroutineCrash(); + virtual void forceErrorCoroprocedureCrash(); + virtual void forceErrorWorkQueueCrash(); virtual void forceErrorThreadCrash(); + virtual void forceExceptionThreadCrash(); // The list is found in app_settings/settings_files.xml // but since they are used explicitly in code, @@ -198,11 +206,13 @@ public: // For thread debugging. // llstartup needs to control init. // llworld, send_agent_pause() also controls pause/resume. - void initMainloopTimeout(const std::string& state, F32 secs = -1.0f); + void initMainloopTimeout(std::string_view state); void destroyMainloopTimeout(); void pauseMainloopTimeout(); - void resumeMainloopTimeout(const std::string& state = "", F32 secs = -1.0f); - void pingMainloopTimeout(const std::string& state, F32 secs = -1.0f); + void resumeMainloopTimeout(std::string_view state = ""); + void pingMainloopTimeout(std::string_view state); + + F32 getMainloopTimeoutSec() const; // Handle the 'login completed' event. // *NOTE:Mani Fix this for login abstraction!! @@ -216,10 +226,11 @@ public: return mOnLoginCompleted.connect(cb); } - void addOnIdleCallback(const boost::function<void()>& cb); // add a callback to fire (once) when idle + void addOnIdleCallback(const std::function<void()>& cb); // add a callback to fire (once) when idle void initGeneralThread(); void purgeUserDataOnExit() { mPurgeUserDataOnExit = true; } + void purgeCefStaleCaches(); // Remove old, stale CEF cache folders void purgeCache(); // Clear the local cache. void purgeCacheImmediate(); //clear local cache immediately. S32 updateTextureThreads(F32 max_time); @@ -244,6 +255,7 @@ public: // Writes an error code into the error_marker file for use on next startup. void createErrorMarker(eLastExecEvent error_code) const; + bool errorMarkerExists() const; // Attempt a 'soft' quit with disconnect and saving of settings/cache. // Intended to be thread safe. @@ -251,6 +263,13 @@ public: // Note: mQuitRequested can be aborted by user. void outOfMemorySoftQuit(); +#ifdef LL_DISCORD + static void initDiscordSocial(); + static void updateDiscordActivity(); + static void updateDiscordPartyCurrentSize(int32_t size); + static void updateDiscordPartyMaxSize(int32_t size); +#endif + protected: virtual bool initWindow(); // Initialize the viewer's window. virtual void initLoggingAndGetLastDuration(); // Initialize log files, logging system @@ -411,11 +430,10 @@ extern std::string gLastVersionChannel; extern LLVector3 gWindVec; extern LLVector3 gRelativeWindVec; -extern U32 gPacketsIn; -extern bool gPrintMessagesThisFrame; extern bool gRandomizeFramerate; extern bool gPeriodicSlowFrame; +extern bool gDoDisconnect; extern bool gSimulateMemLeak; diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index c1e8f38c51..5bbaed750c 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -118,6 +118,11 @@ static void exceptionTerminateHandler() int main( int argc, char **argv ) { + // Call Tracy first thing to have it allocate memory + // https://github.com/wolfpld/tracy/issues/196 + LL_PROFILER_FRAME_END; + LL_PROFILER_SET_THREAD_NAME("App"); + gArgC = argc; gArgV = argv; @@ -126,7 +131,16 @@ int main( int argc, char **argv ) // install unexpected exception handler gOldTerminateHandler = std::set_terminate(exceptionTerminateHandler); - unsetenv( "LD_PRELOAD" ); // <FS:ND/> Get rid of any preloading, we do not want this to happen during startup of plugins. +#ifdef __aarch64__ + setenv("LD_PRELOAD", APP_PLUGIN_DIR"/libcef.so", 1); +#else +# if LL_LINUX + setenv("LD_PRELOAD", "libpthread.so.0 libGL.so.1", 1); +# else + setenv("LD_PRELOAD", "libpthread.so libGL.so.1", 1); +# endif + setenv("__GL_THREADED_OPTIMIZATIONS", "1", 0); +#endif bool ok = viewer_app_ptr->init(); if(!ok) diff --git a/indra/newview/llappviewerlistener.h b/indra/newview/llappviewerlistener.h index 5ade3d3e04..8686d6522e 100644 --- a/indra/newview/llappviewerlistener.h +++ b/indra/newview/llappviewerlistener.h @@ -30,7 +30,7 @@ #define LL_LLAPPVIEWERLISTENER_H #include "lleventapi.h" -#include <boost/function.hpp> +#include <functional> class LLAppViewer; class LLSD; @@ -39,7 +39,7 @@ class LLSD; class LLAppViewerListener: public LLEventAPI { public: - typedef boost::function<LLAppViewer*(void)> LLAppViewerGetter; + typedef std::function<LLAppViewer*(void)> LLAppViewerGetter; /// Bind the LLAppViewer instance to use (e.g. LLAppViewer::instance()). LLAppViewerListener(const LLAppViewerGetter& getter); diff --git a/indra/newview/llappviewermacosx-for-objc.h b/indra/newview/llappviewermacosx-for-objc.h index 5a69cd93fc..c3f1e35872 100644 --- a/indra/newview/llappviewermacosx-for-objc.h +++ b/indra/newview/llappviewermacosx-for-objc.h @@ -41,6 +41,7 @@ void clearDumpLogsDir(); struct CrashMetadata { std::string logFilePathname; + std::string attributesPathname; std::string userSettingsPathname; std::string accountSettingsPathname; std::string staticDebugPathname; diff --git a/indra/newview/llappviewermacosx-objc.h b/indra/newview/llappviewermacosx-objc.h index d0ae0a7fc2..3fbf4202f1 100644 --- a/indra/newview/llappviewermacosx-objc.h +++ b/indra/newview/llappviewermacosx-objc.h @@ -30,9 +30,6 @@ #include <string> #include <vector> -//Why? Because BOOL -void launchApplication(const std::string* app_name, const std::vector<std::string>* args); - void force_ns_sxeption(); #endif // LL_LLAPPVIEWERMACOSX_OBJC_H diff --git a/indra/newview/llappviewermacosx-objc.mm b/indra/newview/llappviewermacosx-objc.mm index 9b6bfe621b..96a6bc6edc 100644 --- a/indra/newview/llappviewermacosx-objc.mm +++ b/indra/newview/llappviewermacosx-objc.mm @@ -5,27 +5,27 @@ * $LicenseInfo:firstyear=2007&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$ - */ + */ #if !defined LL_DARWIN - #error "Use only with macOS" + #error "Use only with macOS" #endif #import <Cocoa/Cocoa.h> @@ -33,45 +33,6 @@ #include "llappviewermacosx-objc.h" -void launchApplication(const std::string* app_name, const std::vector<std::string>* args) -{ - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - if (app_name->empty()) return; - - NSMutableString* app_name_ns = [NSMutableString stringWithString:[[NSBundle mainBundle] resourcePath]]; //Path to resource dir - [app_name_ns appendFormat:@"/%@", [NSString stringWithCString:app_name->c_str() - encoding:[NSString defaultCStringEncoding]]]; - - NSMutableArray *args_ns = nil; - args_ns = [[NSMutableArray alloc] init]; - - for (int i=0; i < args->size(); ++i) - { - NSLog(@"Adding string %s", (*args)[i].c_str()); - [args_ns addObject: - [NSString stringWithCString:(*args)[i].c_str() - encoding:[NSString defaultCStringEncoding]]]; - } - - NSTask *task = [[NSTask alloc] init]; - NSBundle *bundle = [NSBundle bundleWithPath:[[NSWorkspace sharedWorkspace] fullPathForApplication:app_name_ns]]; - [task setLaunchPath:[bundle executablePath]]; - [task setArguments:args_ns]; - [task launch]; - -// NSWorkspace *workspace = [NSWorkspace sharedWorkspace]; -// NSURL *url = [NSURL fileURLWithPath:[workspace fullPathForApplication:app_name_ns]]; -// -// NSError *error = nil; -// [workspace launchApplicationAtURL:url options:0 configuration:[NSDictionary dictionaryWithObject:args_ns forKey:NSWorkspaceLaunchConfigurationArguments] error:&error]; - //TODO Handle error - - [pool release]; - return; -} - void force_ns_sxeption() { NSException *exception = [NSException exceptionWithName:@"Forced NSException" reason:nullptr userInfo:nullptr]; diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 4162c0479a..b074c40c17 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -172,6 +172,8 @@ CrashMetadataSingleton::CrashMetadataSingleton() // Note: we depend on being able to read the static_debug_info.log file // from the *previous* run before we overwrite it with the new one for // *this* run. LLAppViewer initialization must happen in the Right Order. + + // Todo: consider converting static file into bugspalt attributes file staticDebugPathname = *gViewerAppPtr->getStaticDebugFile(); std::ifstream static_file(staticDebugPathname); LLSD info; @@ -215,7 +217,32 @@ CrashMetadataSingleton::CrashMetadataSingleton() } } } + + // Populate bugsplat attributes + LLXMLNodePtr out_node = new LLXMLNode("XmlCrashContext", false); + + out_node->createChild("OS", false)->setValue(OSInfo); + out_node->createChild("AppState", false)->setValue(info["StartupState"].asString()); + out_node->createChild("GraphicsCard", false)->setValue(info["GraphicsCard"].asString()); + out_node->createChild("GLVersion", false)->setValue(info["GLInfo"]["GLVersion"].asString()); + out_node->createChild("GLRenderer", false)->setValue(info["GLInfo"]["GLRenderer"].asString()); + out_node->createChild("RAM", false)->setValue(info["RAMInfo"]["Physical"].asString()); + + if (!out_node->isNull()) + { + attributesPathname = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "CrashContext.xml"); + LLFILE* fp = LLFile::fopen(attributesPathname, "w"); + + if (fp != NULL) + { + LLXMLNode::writeHeaderToFile(fp); + out_node->writeToFile(fp); + + fclose(fp); + } + } } + // else Todo: consider fillig at least some values, like OS } // Avoid having to compile all of our LLSingleton machinery in Objective-C++. @@ -231,6 +258,11 @@ void infos(const std::string& message) int main( int argc, char **argv ) { + // Call Tracy first thing to have it allocate memory + // https://github.com/wolfpld/tracy/issues/196 + LL_PROFILER_FRAME_END; + LL_PROFILER_SET_THREAD_NAME("App"); + // Store off the command line args for use later. gArgC = argc; gArgV = argv; diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 4d2c58bdab..5288dce69c 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -31,7 +31,9 @@ #endif #include "llwin32headers.h" +#if !LL_SDL #include "llwindowwin32.h" // *FIX: for setting gIconResource. +#endif #include "llappviewerwin32.h" @@ -47,8 +49,10 @@ #include "llviewercontrol.h" #include "lldxhardware.h" +#if !_M_ARM64 #include "nvapi/nvapi.h" #include "nvapi/NvApiDriverSettings.h" +#endif #include <stdlib.h> @@ -155,10 +159,10 @@ namespace sBugSplatSender->setAttribute(WCSTR(L"OS"), WCSTR(LLOSInfo::instance().getOSStringSimple())); // In case we ever stop using email for this sBugSplatSender->setAttribute(WCSTR(L"AppState"), WCSTR(LLStartUp::getStartupStateString())); - sBugSplatSender->setAttribute(WCSTR(L"GL Vendor"), WCSTR(gGLManager.mGLVendor)); - sBugSplatSender->setAttribute(WCSTR(L"GL Version"), WCSTR(gGLManager.mGLVersionString)); - sBugSplatSender->setAttribute(WCSTR(L"GPU Version"), WCSTR(gGLManager.mDriverVersionVendorString)); - sBugSplatSender->setAttribute(WCSTR(L"GL Renderer"), WCSTR(gGLManager.mGLRenderer)); + sBugSplatSender->setAttribute(WCSTR(L"GLVendor"), WCSTR(gGLManager.mGLVendor)); + sBugSplatSender->setAttribute(WCSTR(L"GLVersion"), WCSTR(gGLManager.mGLVersionString)); + sBugSplatSender->setAttribute(WCSTR(L"GPUVersion"), WCSTR(gGLManager.mDriverVersionVendorString)); + sBugSplatSender->setAttribute(WCSTR(L"GLRenderer"), WCSTR(gGLManager.mGLRenderer)); sBugSplatSender->setAttribute(WCSTR(L"VRAM"), WCSTR(STRINGIZE(gGLManager.mVRAM))); sBugSplatSender->setAttribute(WCSTR(L"RAM"), WCSTR(STRINGIZE(gSysMemory.getPhysicalMemoryKB().value()))); @@ -172,6 +176,22 @@ namespace << '/' << loc.mV[1] << '/' << loc.mV[2]))); } + + LLAppViewer* app = LLAppViewer::instance(); + if (!app->isSecondInstance() && !app->errorMarkerExists()) + { + // If marker doesn't exist, create a marker with 'other' or 'logout' code for next launch + // otherwise don't override existing file + // Any unmarked crashes will be considered as freezes + if (app->logoutRequestSent()) + { + app->createErrorMarker(LAST_EXEC_LOGOUT_CRASH); + } + else + { + app->createErrorMarker(LAST_EXEC_OTHER_CRASH); + } + } } // MDSCB_EXCEPTIONCODE return false; @@ -206,6 +226,7 @@ LONG WINAPI catchallCrashHandler(EXCEPTION_POINTERS * /*ExceptionInfo*/) const std::string LLAppViewerWin32::sWindowClass = "Second Life"; +#if !_M_ARM64 /* This function is used to print to the command line a text message describing the nvapi error and quits @@ -219,6 +240,7 @@ void nvapi_error(NvAPI_Status status) //should always trigger when asserts are enabled //llassert(status == NVAPI_OK); } +#endif // Create app mutex creates a unique global windows object. // If the object can be created it returns true, otherwise @@ -241,6 +263,7 @@ bool create_app_mutex() return result; } +#if !_M_ARM64 void ll_nvapi_init(NvDRSSessionHandle hSession) { // (2) load all the system settings into the session @@ -253,8 +276,8 @@ void ll_nvapi_init(NvDRSSessionHandle hSession) NvAPI_UnicodeString profile_name; std::string app_name = LLTrans::getString("APP_NAME"); - llutf16string w_app_name = utf8str_to_utf16str(app_name); - wsprintf(profile_name, L"%s", w_app_name.c_str()); + std::wstring w_app_name = ll_convert<std::wstring>(app_name); + wsprintf(reinterpret_cast<wchar_t*>(profile_name), L"%s", w_app_name.c_str()); NvDRSProfileHandle hProfile = 0; // (3) Check if we already have an application profile for the viewer status = NvAPI_DRS_FindProfileByName(hSession, profile_name, &hProfile); @@ -271,7 +294,7 @@ void ll_nvapi_init(NvDRSSessionHandle hSession) NVDRS_PROFILE profileInfo; profileInfo.version = NVDRS_PROFILE_VER; profileInfo.isPredefined = 0; - wsprintf(profileInfo.profileName, L"%s", w_app_name.c_str()); + wsprintf(reinterpret_cast<wchar_t*>(profileInfo.profileName), L"%s", w_app_name.c_str()); status = NvAPI_DRS_CreateProfile(hSession, &profileInfo, &hProfile); if (status != NVAPI_OK) @@ -286,9 +309,9 @@ void ll_nvapi_init(NvDRSSessionHandle hSession) NVDRS_APPLICATION profile_application; profile_application.version = NVDRS_APPLICATION_VER; - llutf16string w_exe_name = utf8str_to_utf16str(exe_name); + std::wstring w_exe_name = ll_convert<std::wstring>(exe_name); NvAPI_UnicodeString profile_app_name; - wsprintf(profile_app_name, L"%s", w_exe_name.c_str()); + wsprintf(reinterpret_cast<wchar_t*>(profile_app_name), L"%s", w_exe_name.c_str()); status = NvAPI_DRS_GetApplicationInfo(hSession, hProfile, profile_app_name, &profile_application); if (status != NVAPI_OK && status != NVAPI_EXECUTABLE_NOT_FOUND) @@ -304,10 +327,10 @@ void ll_nvapi_init(NvDRSSessionHandle hSession) NVDRS_APPLICATION application; application.version = NVDRS_APPLICATION_VER; application.isPredefined = 0; - wsprintf(application.appName, L"%s", w_exe_name.c_str()); - wsprintf(application.userFriendlyName, L"%s", w_exe_name.c_str()); - wsprintf(application.launcher, L"%s", w_exe_name.c_str()); - wsprintf(application.fileInFolder, L"%s", ""); + wsprintf(reinterpret_cast<wchar_t*>(application.appName), L"%s", w_exe_name.c_str()); + wsprintf(reinterpret_cast<wchar_t*>(application.userFriendlyName), L"%s", w_exe_name.c_str()); + wsprintf(reinterpret_cast<wchar_t*>(application.launcher), L"%s", w_exe_name.c_str()); + wsprintf(reinterpret_cast<wchar_t*>(application.fileInFolder), L"%s", ""); status = NvAPI_DRS_CreateApplication(hSession, hProfile, &application); if (status != NVAPI_OK) @@ -395,11 +418,19 @@ void ll_nvapi_init(NvDRSSessionHandle hSession) return; } } +#endif -int APIENTRY wWinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - PWSTR pCmdLine, - int nCmdShow) +//#define DEBUGGING_SEH_FILTER 1 +#if DEBUGGING_SEH_FILTER +# define WINMAIN DebuggingWinMain +#else +# define WINMAIN wWinMain +#endif + +int APIENTRY WINMAIN(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + PWSTR pCmdLine, + int nCmdShow) { // Call Tracy first thing to have it allocate memory // https://github.com/wolfpld/tracy/issues/196 @@ -410,7 +441,9 @@ int APIENTRY wWinMain(HINSTANCE hInstance, DWORD heap_enable_lfh_error[MAX_HEAPS]; S32 num_heaps = 0; +#if !LL_SDL LLWindowWin32::setDPIAwareness(); +#endif #if WINDOWS_CRT_MEM_CHECKS && !INCLUDE_VLD _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); // dump memory leaks on exit @@ -439,8 +472,11 @@ int APIENTRY wWinMain(HINSTANCE hInstance, #endif #endif +#if !LL_SDL // *FIX: global gIconResource = MAKEINTRESOURCE(IDI_LL_ICON); +#endif + gIconSmallResource = MAKEINTRESOURCE(IDI_LL_ICON_SMALL); LLAppViewerWin32* viewer_app_ptr = new LLAppViewerWin32(ll_convert_wide_to_string(pCmdLine).c_str()); @@ -457,6 +493,7 @@ int APIENTRY wWinMain(HINSTANCE hInstance, return -1; } +#if !_M_ARM64 NvDRSSessionHandle hSession = 0; static LLCachedControl<bool> use_nv_api(gSavedSettings, "NvAPICreateApplicationProfile", true); if (use_nv_api) @@ -481,6 +518,7 @@ int APIENTRY wWinMain(HINSTANCE hInstance, } } } +#endif // Have to wait until after logging is initialized to display LFH info if (num_heaps > 0) @@ -538,21 +576,44 @@ int APIENTRY wWinMain(HINSTANCE hInstance, delete viewer_app_ptr; viewer_app_ptr = NULL; +#if !_M_ARM64 // (NVAPI) (6) We clean up. This is analogous to doing a free() if (hSession) { NvAPI_DRS_DestroySession(hSession); hSession = 0; } +#endif return 0; } +#if DEBUGGING_SEH_FILTER +// The compiler doesn't like it when you use __try/__except blocks +// in a method that uses object destructors. Go figure. +// This winmain just calls the real winmain inside __try. +// The __except calls our exception filter function. For debugging purposes. +int APIENTRY wWinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + PWSTR lpCmdLine, + int nCmdShow) +{ + __try + { + WINMAIN(hInstance, hPrevInstance, lpCmdLine, nCmdShow); + } + __except( viewer_windows_exception_handler( GetExceptionInformation() ) ) + { + _tprintf( _T("Exception handled.\n") ); + } +} +#endif + void LLAppViewerWin32::disableWinErrorReporting() { std::string executable_name = gDirUtilp->getExecutableFilename(); - if( S_OK == WerAddExcludedApplication( utf8str_to_utf16str(executable_name).c_str(), FALSE ) ) + if( S_OK == WerAddExcludedApplication(ll_convert<std::wstring>(executable_name).c_str(), FALSE ) ) { LL_INFOS() << "WerAddExcludedApplication() succeeded for " << executable_name << LL_ENDL; } @@ -776,14 +837,39 @@ bool LLAppViewerWin32::cleanup() return result; } -void LLAppViewerWin32::reportCrashToBugsplat(void* pExcepInfo) +bool LLAppViewerWin32::reportCrashToBugsplat(void* pExcepInfo) { #if defined(LL_BUGSPLAT) if (sBugSplatSender) { sBugSplatSender->createReport((EXCEPTION_POINTERS*)pExcepInfo); + return true; } #endif // LL_BUGSPLAT + return false; +} + +bool LLAppViewerWin32::initWindow() +{ + // This is a workaround/hotfix for a change in Windows 11 24H2 (and possibly later) + // Where the window width and height need to correctly reflect an available FullScreen size + if (gSavedSettings.getBOOL("FullScreen")) + { + DEVMODE dev_mode; + ::ZeroMemory(&dev_mode, sizeof(DEVMODE)); + dev_mode.dmSize = sizeof(DEVMODE); + if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dev_mode)) + { + gSavedSettings.setU32("WindowWidth", dev_mode.dmPelsWidth); + gSavedSettings.setU32("WindowHeight", dev_mode.dmPelsHeight); + } + else + { + LL_WARNS("AppInit") << "Unable to set WindowWidth and WindowHeight for FullScreen mode" << LL_ENDL; + } + } + + return LLAppViewer::initWindow(); } void LLAppViewerWin32::initLoggingAndGetLastDuration() @@ -812,69 +898,11 @@ void write_debug_dx(const std::string& str) bool LLAppViewerWin32::initHardwareTest() { - // - // Do driver verification and initialization based on DirectX - // hardware polling and driver versions - // - if (true == gSavedSettings.getBOOL("ProbeHardwareOnStartup") && false == gSavedSettings.getBOOL("NoHardwareProbe")) - { - // per DEV-11631 - disable hardware probing for everything - // but vram. - bool vram_only = true; - - LLSplashScreen::update(LLTrans::getString("StartupDetectingHardware")); - - LL_DEBUGS("AppInit") << "Attempting to poll DirectX for hardware info" << LL_ENDL; - gDXHardware.setWriteDebugFunc(write_debug_dx); - bool probe_ok = gDXHardware.getInfo(vram_only); - - if (!probe_ok - && gWarningSettings.getBOOL("AboutDirectX9")) - { - LL_WARNS("AppInit") << "DirectX probe failed, alerting user." << LL_ENDL; - - // Warn them that runnin without DirectX 9 will - // not allow us to tell them about driver issues - std::ostringstream msg; - msg << LLTrans::getString ("MBNoDirectX"); - S32 button = OSMessageBox( - msg.str(), - LLTrans::getString("MBWarning"), - OSMB_YESNO); - if (OSBTN_NO== button) - { - LL_INFOS("AppInit") << "User quitting after failed DirectX 9 detection" << LL_ENDL; - LLWeb::loadURLExternal("http://secondlife.com/support/", false); - return false; - } - gWarningSettings.setBOOL("AboutDirectX9", false); - } - LL_DEBUGS("AppInit") << "Done polling DirectX for hardware info" << LL_ENDL; - - // Only probe once after installation - gSavedSettings.setBOOL("ProbeHardwareOnStartup", false); - - // Disable so debugger can work - std::string splash_msg; - LLStringUtil::format_map_t args; - args["[APP_NAME]"] = LLAppViewer::instance()->getSecondLifeTitle(); - splash_msg = LLTrans::getString("StartupLoading", args); - - LLSplashScreen::update(splash_msg); - } - if (!restoreErrorTrap()) { - LL_WARNS("AppInit") << " Someone took over my exception handler (post hardware probe)!" << LL_ENDL; + LL_WARNS("AppInit") << " Someone took over my exception handler!" << LL_ENDL; } - if (gGLManager.mVRAM == 0) - { - gGLManager.mVRAM = gDXHardware.getVRAM(); - } - - LL_INFOS("AppInit") << "Detected VRAM: " << gGLManager.mVRAM << LL_ENDL; - return true; } diff --git a/indra/newview/llappviewerwin32.h b/indra/newview/llappviewerwin32.h index 2242c95b06..3fad53ec72 100644 --- a/indra/newview/llappviewerwin32.h +++ b/indra/newview/llappviewerwin32.h @@ -43,9 +43,10 @@ public: bool init() override; // Override to do application initialization bool cleanup() override; - void reportCrashToBugsplat(void* pExcepInfo) override; + bool reportCrashToBugsplat(void* pExcepInfo) override; protected: + bool initWindow() override; // Override to initialize the viewer's window. void initLoggingAndGetLastDuration() override; // Override to clean stack_trace info. void initConsole() override; // Initialize OS level debugging console. bool initHardwareTest() override; // Win32 uses DX9 to test hardware. diff --git a/indra/newview/llautoreplace.cpp b/indra/newview/llautoreplace.cpp index f200ca8e31..1ea2899ba4 100644 --- a/indra/newview/llautoreplace.cpp +++ b/indra/newview/llautoreplace.cpp @@ -536,11 +536,12 @@ LLAutoReplaceSettings::AddListResult LLAutoReplaceSettings::replaceList(const LL S32 search_index; LLSD targetList; // The following is working around the fact that LLSD arrays containing maps also seem to have undefined entries... see LLSD-30 - for ( search_index = 0, targetList = mLists[0]; + for ( search_index = 0; !listFound && search_index < mLists.size(); - search_index += 1, targetList = mLists[search_index] + search_index += 1 ) { + targetList = mLists[search_index]; if ( targetList.isMap() ) { if ( listNameMatches( targetList, listName) ) diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 52cd86951d..e29be0c757 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -48,12 +48,11 @@ #include "llvoiceclient.h" #include "llviewercontrol.h" // for gSavedSettings #include "lltooldraganddrop.h" -#include "llworld.h" static LLDefaultChildRegistry::Register<LLAvatarList> r("avatar_list"); // Last interaction time update period. -static const F32 LIT_UPDATE_PERIOD = 1; +static const F32 LIT_UPDATE_PERIOD = 5; // Maximum number of avatars that can be added to a list in one pass. // Used to limit time spent for avatar list update per frame. @@ -147,6 +146,7 @@ LLAvatarList::LLAvatarList(const Params& p) , mShowSpeakingIndicator(p.show_speaking_indicator) , mShowPermissions(p.show_permissions_granted) , mShowCompleteName(false) +, mForceCompleteName(false) { setCommitOnSelectionChange(true); @@ -183,7 +183,7 @@ void LLAvatarList::setShowIcons(std::string param_name) std::string LLAvatarList::getAvatarName(LLAvatarName av_name) { - return mShowCompleteName? av_name.getCompleteName(false) : av_name.getDisplayName(); + return mShowCompleteName? av_name.getCompleteName(false, mForceCompleteName) : av_name.getDisplayName(); } // virtual @@ -204,13 +204,25 @@ void LLAvatarList::draw() if ((mShowLastInteractionTime || mAvatarDistance || mAvatarArrivalTime) && mLITUpdateTimer->hasExpired()) { - if (mAvatarArrivalTime) + if (mAvatarArrivalTime || mAvatarDistance) { - updateAvatarArrivalTime(); - } - if (mAvatarDistance) - { - updateAvatarDistance(); + std::vector<LLPanel*> items; + getItems(items); + for (auto it = items.begin(); it != items.end(); it++) + { + auto item = static_cast<LLAvatarListItem*>(*it); + if (mAvatarArrivalTime) + { + auto secs_since = LLDate::now().secondsSinceEpoch() - LLRecentPeople::instance().getArrivalTimeByID(item->getAvatarId()); + if (secs_since >= 0) + item->setAvatarArrivalTime(secs_since); + } + if (mAvatarDistance) + { + auto avatarsPositions = gAgent.getAvatarsPositions(); + item->setAvatarDistance(dist_vec(avatarsPositions[item->getAvatarId()], gAgent.getPositionGlobal())); + } + } } if (mShowLastInteractionTime) { @@ -381,7 +393,7 @@ void LLAvatarList::updateAvatarNames() for( std::vector<LLPanel*>::const_iterator it = items.begin(); it != items.end(); it++) { LLAvatarListItem* item = static_cast<LLAvatarListItem*>(*it); - item->setShowCompleteName(mShowCompleteName); + item->setShowCompleteName(mShowCompleteName, mForceCompleteName); item->updateAvatarName(); } mNeedUpdateNames = false; @@ -421,6 +433,11 @@ boost::signals2::connection LLAvatarList::setItemDoubleClickCallback(const mouse return mItemDoubleClickSignal.connect(cb); } +boost::signals2::connection LLAvatarList::setItemClickedCallback(const mouse_signal_t::slot_type& cb) +{ + return mItemClickedSignal.connect(cb); +} + //virtual S32 LLAvatarList::notifyParent(const LLSD& info) { @@ -435,7 +452,7 @@ S32 LLAvatarList::notifyParent(const LLSD& info) void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, bool is_online, EAddPosition pos) { LLAvatarListItem* item = new LLAvatarListItem(); - item->setShowCompleteName(mShowCompleteName); + item->setShowCompleteName(mShowCompleteName, mForceCompleteName); // This sets the name as a side effect item->setAvatarId(id, mSessionID, mIgnoreOnlineStatus); item->setOnline(mIgnoreOnlineStatus ? true : is_online); @@ -451,6 +468,7 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, bool is item->setDoubleClickCallback(boost::bind(&LLAvatarList::onItemDoubleClicked, this, _1, _2, _3, _4)); + item->setMouseDownCallback(boost::bind(&LLAvatarList::onItemClicked, this, _1, _2, _3, _4)); addItem(item, id, pos); } @@ -547,46 +565,6 @@ void LLAvatarList::computeDifference( LLCommonUtils::computeDifference(vnew_unsorted, vcur, vadded, vremoved); } -void LLAvatarList::updateAvatarArrivalTime() -{ - std::vector<LLPanel*> items; - getItems(items); - auto uuids = getIDs(); - std::vector<LLVector3d> positions; - auto me_pos = gAgent.getPositionGlobal(); - LLWorld::getInstance()->getAvatars(&uuids, &positions, me_pos, gSavedSettings.getF32("MPVNearMeRange")); - LLRecentPeople::instance().updateAvatarsArrivalTime(uuids); - for (auto it = items.begin(); it != items.end(); it++) - { - auto item = static_cast<LLAvatarListItem*>(*it); - auto secs_since = LLDate::now().secondsSinceEpoch() - LLRecentPeople::instance().getArrivalTimeByID(item->getAvatarId()); - if (secs_since >= 0) - item->setAvatarArrivalTime(secs_since); - } -} - - void LLAvatarList::updateAvatarDistance() -{ - std::vector<LLPanel*> items; - getItems(items); - auto uuids = getIDs(); - std::vector<LLVector3d> positions; - auto me_pos = gAgent.getPositionGlobal(); - LLWorld::getInstance()->getAvatars(&uuids, &positions, me_pos, gSavedSettings.getF32("MPVNearMeRange")); - std::map <LLUUID, LLVector3d> avatarsPositions; - auto pos_it = positions.begin(); - auto id_it = uuids.begin(); - for (;pos_it != positions.end() && id_it != uuids.end(); ++pos_it, ++id_it) - { - avatarsPositions[*id_it] = *pos_it; - } - for (auto it = items.begin(); it != items.end(); it++) - { - auto item = static_cast<LLAvatarListItem*>(*it); - item->setAvatarDistance(dist_vec(avatarsPositions[item->getAvatarId()], me_pos)); - } -} - // Refresh shown time of our last interaction with all listed avatars. void LLAvatarList::updateLastInteractionTimes() { @@ -609,6 +587,11 @@ void LLAvatarList::onItemDoubleClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask) mItemDoubleClickSignal(ctrl, x, y, mask); } +void LLAvatarList::onItemClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask) +{ + mItemClickedSignal(ctrl, x, y, mask); +} + bool LLAvatarItemComparator::compare(const LLPanel* item1, const LLPanel* item2) const { const LLAvatarListItem* avatar_item1 = dynamic_cast<const LLAvatarListItem*>(item1); diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index 37ad578a20..e6e0728a3f 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -98,11 +98,13 @@ public: boost::signals2::connection setItemDoubleClickCallback(const mouse_signal_t::slot_type& cb); + boost::signals2::connection setItemClickedCallback(const mouse_signal_t::slot_type& cb); + virtual S32 notifyParent(const LLSD& info); void handleDisplayNamesOptionChanged(); - void setShowCompleteName(bool show) { mShowCompleteName = show;}; + void setShowCompleteName(bool show, bool force = false) { mShowCompleteName = show; mForceCompleteName = force; }; protected: void refresh(); @@ -112,11 +114,10 @@ protected: const uuid_vec_t& vnew, uuid_vec_t& vadded, uuid_vec_t& vremoved); - void updateAvatarArrivalTime(); - void updateAvatarDistance(); void updateLastInteractionTimes(); void rebuildNames(); void onItemDoubleClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask); + void onItemClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask); void updateAvatarNames(); private: @@ -133,6 +134,7 @@ private: bool mShowSpeakingIndicator; bool mShowPermissions; bool mShowCompleteName; + bool mForceCompleteName; LLTimer* mLITUpdateTimer; // last interaction time update timer std::string mIconParamName; @@ -144,6 +146,7 @@ private: commit_signal_t mRefreshCompleteSignal; mouse_signal_t mItemDoubleClickSignal; + mouse_signal_t mItemClickedSignal; }; /** Abstract comparator for avatar items */ diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index 7be4f4eeb8..f6bc59c748 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -80,6 +80,7 @@ LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/) mShowProfileBtn(true), mShowPermissions(false), mShowCompleteName(false), + mForceCompleteName(false), mHovered(false), mAvatarNameCacheConnection(), mGreyOutUsername("") @@ -350,13 +351,12 @@ void LLAvatarListItem::setShowProfileBtn(bool show) void LLAvatarListItem::showSpeakingIndicator(bool visible) { - // Already done? Then do nothing. - if (mSpeakingIndicator->getVisible() == (bool)visible) - return; -// Disabled to not contradict with SpeakingIndicatorManager functionality. EXT-3976 -// probably this method should be totally removed. -// mSpeakingIndicator->setVisible(visible); -// updateChildren(); + // used only to hide indicator to not contradict with SpeakingIndicatorManager functionality + if (mSpeakingIndicator && !visible) + { + mSpeakingIndicator->setIsActiveChannel(visible); + mSpeakingIndicator->setShowParticipantsSpeaking(visible); + } } void LLAvatarListItem::setAvatarIconVisible(bool visible) @@ -443,8 +443,8 @@ void LLAvatarListItem::onAvatarNameCache(const LLAvatarName& av_name) mAvatarNameCacheConnection.disconnect(); mGreyOutUsername = ""; - std::string name_string = mShowCompleteName? av_name.getCompleteName(false) : av_name.getDisplayName(); - if(av_name.getCompleteName() != av_name.getUserName()) + std::string name_string = mShowCompleteName? av_name.getCompleteName(false, mForceCompleteName) : av_name.getDisplayName(); + if(av_name.getCompleteName(false, mForceCompleteName) != av_name.getUserName()) { mGreyOutUsername = "[ " + av_name.getUserName(true) + " ]"; LLStringUtil::toLower(mGreyOutUsername); diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h index 630a7ec751..f9381f95e3 100644 --- a/indra/newview/llavatarlistitem.h +++ b/indra/newview/llavatarlistitem.h @@ -110,7 +110,7 @@ public: void showAvatarDistance(bool show); void showLastInteractionTime(bool show); void setAvatarIconVisible(bool visible); - void setShowCompleteName(bool show) { mShowCompleteName = show;}; + void setShowCompleteName(bool show, bool force = false) { mShowCompleteName = show; mForceCompleteName = force;}; const LLUUID& getAvatarId() const; std::string getAvatarName() const; @@ -228,6 +228,7 @@ private: bool mHovered; bool mShowCompleteName; + bool mForceCompleteName; std::string mGreyOutUsername; void fetchAvatarName(); diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp index b14d1d7d26..9d9948731f 100644 --- a/indra/newview/llavatarpropertiesprocessor.cpp +++ b/indra/newview/llavatarpropertiesprocessor.cpp @@ -269,11 +269,11 @@ void LLAvatarPropertiesProcessor::requestAvatarPropertiesCoro(std::string cap_ur LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("requestAvatarPropertiesCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("requestAvatarPropertiesCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLCore::HttpHeaders::ptr_t httpHeaders; - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); httpOpts->setFollowRedirects(true); std::string finalUrl = cap_url + "/" + avatar_id.asString(); @@ -473,8 +473,6 @@ void LLAvatarPropertiesProcessor::processClassifiedInfoReply(LLMessageSystem* ms // Request processed, no longer pending self->removePendingRequest(c_info.creator_id, APT_CLASSIFIED_INFO); self->notifyObservers(c_info.creator_id, &c_info, APT_CLASSIFIED_INFO); - self->removePendingRequest(c_info.classified_id, APT_CLASSIFIED_INFO); - self->notifyObservers(c_info.classified_id, &c_info, APT_CLASSIFIED_INFO); } @@ -671,6 +669,7 @@ void LLAvatarPropertiesProcessor::sendClassifiedInfoUpdate(const LLAvatarClassif void LLAvatarPropertiesProcessor::sendPickInfoRequest(const LLUUID& creator_id, const LLUUID& pick_id) { + LL_DEBUGS("PickInfo") << " Requiesting pick info for " << pick_id << LL_ENDL; // Must ask for a pick based on the creator id because // the pick database is distributed to the inventory cluster. JC std::vector<std::string> request_params{ creator_id.asString(), pick_id.asString() }; diff --git a/indra/newview/llavatarpropertiesprocessor.h b/indra/newview/llavatarpropertiesprocessor.h index a490f3da10..1592629fca 100644 --- a/indra/newview/llavatarpropertiesprocessor.h +++ b/indra/newview/llavatarpropertiesprocessor.h @@ -52,9 +52,6 @@ enum EAvatarProcessorType { APT_PROPERTIES_LEGACY, // APT_PROPERTIES via udp request (Truncates data!!!) APT_PROPERTIES, // APT_PROPERTIES via http request - APT_NOTES, - APT_GROUPS, - APT_PICKS, APT_PICK_INFO, APT_TEXTURES, APT_CLASSIFIEDS, @@ -108,24 +105,6 @@ struct LLAvatarData typedef std::pair<LLUUID, std::string> pick_data_t; typedef std::list< pick_data_t> picks_list_t; picks_list_t picks_list; - BOOL allow_publish; - LLAvatarData() = default; - LLAvatarData(const LLAvatarLegacyData& legacy_data) - { - agent_id = legacy_data.agent_id; - avatar_id = legacy_data.avatar_id; - image_id = legacy_data.image_id; - fl_image_id = legacy_data.fl_image_id; - partner_id = legacy_data.partner_id; - about_text = legacy_data.about_text; - fl_about_text = legacy_data.fl_about_text; - born_on = legacy_data.born_on; - profile_url = legacy_data.profile_url; - caption_index = legacy_data.caption_index; - caption_text = legacy_data.caption_text; - customer_type = legacy_data.customer_type; - flags = legacy_data.flags; - } }; struct LLAvatarData::LLGroupData @@ -161,45 +140,6 @@ struct LLPickData LLUUID session_id; }; -struct LLAvatarPicks -{ - LLUUID agent_id; - LLUUID target_id; //target id - - typedef std::pair<LLUUID,std::string> pick_data_t; - typedef std::list< pick_data_t> picks_list_t; - picks_list_t picks_list; -}; - -struct LLAvatarNotes -{ - LLUUID agent_id; - LLUUID target_id; //target id - std::string notes; -}; - -struct LLAvatarGroups -{ - LLUUID agent_id; - LLUUID avatar_id; //target id - BOOL list_in_profile; - - struct LLGroupData; - typedef std::list<LLGroupData> group_list_t; - - group_list_t group_list; - - struct LLGroupData - { - U64 group_powers; - BOOL accept_notices; - std::string group_title; - LLUUID group_id; - std::string group_name; - LLUUID group_insignia_id; - }; -}; - struct LLAvatarClassifieds { LLUUID agent_id; diff --git a/indra/newview/llavatarrenderinfoaccountant.cpp b/indra/newview/llavatarrenderinfoaccountant.cpp index 44f35981b0..309bed6f8b 100644 --- a/indra/newview/llavatarrenderinfoaccountant.cpp +++ b/indra/newview/llavatarrenderinfoaccountant.cpp @@ -77,9 +77,9 @@ void LLAvatarRenderInfoAccountant::avatarRenderInfoGetCoro(std::string url, U64 { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("AvatarRenderInfoAccountant", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("AvatarRenderInfoAccountant", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); // Going to request each 15 seconds either way, so don't wait // too long and don't repeat @@ -194,9 +194,9 @@ void LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro(std::string url, U { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("AvatarRenderInfoAccountant", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("AvatarRenderInfoAccountant", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); // Going to request each 60+ seconds, timeout is 30s. // Don't repeat too often, will be sending newer data soon diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp index 8e9ab8f87f..76e308a966 100644 --- a/indra/newview/llcallingcard.cpp +++ b/indra/newview/llcallingcard.cpp @@ -42,6 +42,7 @@ #include "llinventorymodel.h" #include "llnotifications.h" #include "llslurl.h" +#include "llstartup.h" #include "llimview.h" #include "lltrans.h" #include "llviewercontrol.h" @@ -271,6 +272,22 @@ S32 LLAvatarTracker::addBuddyList(const LLAvatarTracker::buddy_map_t& buds) << "]" << LL_ENDL; } } + + // It's possible that the buddy list getting propagated from the inventory may have happened after we actually got the buddy list. + // Any buddies that we got prior will reside in a special queue that we must process and update statuses accordingly with. + // Do that here. + // -Geenz 2025-03-12 + while (!mBuddyStatusQueue.empty()) + { + auto buddyStatus = mBuddyStatusQueue.front(); + mBuddyStatusQueue.pop(); + + if (mBuddyInfo.find(buddyStatus.first) != mBuddyInfo.end()) + { + setBuddyOnline(buddyStatus.first, buddyStatus.second); + } + } + // do not notify observers here - list can be large so let it be done on idle. return new_buddy_count; @@ -335,6 +352,8 @@ void LLAvatarTracker::setBuddyOnline(const LLUUID& id, bool is_online) { LL_WARNS() << "!! No buddy info found for " << id << ", setting to " << (is_online ? "Online" : "Offline") << LL_ENDL; + LL_WARNS() << "Did we receive a buddy status update before the buddy info?" << LL_ENDL; + mBuddyStatusQueue.push(std::make_pair(id, is_online)); } } @@ -485,7 +504,7 @@ void LLAvatarTracker::idleNotifyObservers() void LLAvatarTracker::notifyObservers() { - if (mIsNotifyObservers) + if (mIsNotifyObservers || (LLStartUp::getStartupState() <= STATE_INVENTORY_CALLBACKS)) { // Don't allow multiple calls. // new masks and ids will be processed later from idle. @@ -706,6 +725,8 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online) { LL_WARNS() << "Received online notification for unknown buddy: " << agent_id << " is " << (online ? "ONLINE" : "OFFLINE") << LL_ENDL; + LL_WARNS() << "Adding buddy to buddy queue." << LL_ENDL; + mBuddyStatusQueue.push(std::make_pair(agent_id, true)); } if(tracking_id == agent_id) @@ -723,7 +744,11 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online) mModifyMask |= LLFriendObserver::ONLINE; instance().notifyObservers(); - gInventory.notifyObservers(); + // Skip if we had received the friends list before the inventory callbacks were properly initialized + if (LLStartUp::getStartupState() > STATE_INVENTORY_CALLBACKS) + { + gInventory.notifyObservers(); + } } } diff --git a/indra/newview/llcallingcard.h b/indra/newview/llcallingcard.h index 48b93fdf9d..156ea90e0a 100644 --- a/indra/newview/llcallingcard.h +++ b/indra/newview/llcallingcard.h @@ -30,6 +30,7 @@ #include <map> #include <set> #include <string> +#include <queue> #include <vector> #include "lluserrelations.h" #include "lluuid.h" @@ -109,6 +110,7 @@ public: // add or remove agents from buddy list. Each method takes a set // of buddies and returns how many were actually added or removed. typedef std::map<LLUUID, LLRelationship*> buddy_map_t; + typedef std::queue<std::pair<LLUUID, bool>> buddy_status_queue_t; S32 addBuddyList(const buddy_map_t& buddies); //S32 removeBuddyList(const buddy_list_t& exes); @@ -194,6 +196,7 @@ protected: //LLInventoryObserver* mInventoryObserver; buddy_map_t mBuddyInfo; + buddy_status_queue_t mBuddyStatusQueue; typedef std::set<LLUUID> changed_buddy_t; changed_buddy_t mChangedBuddyIDs; diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 305b5be194..8617183840 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -189,7 +189,14 @@ public: std::string url = "secondlife://" + mObjectData["slurl"].asString(); LLUrlAction::teleportToLocation(url); } - + else if (level == "obj_zoom_in") + { + LLUUID obj_id = mObjectData["object_id"]; + if (obj_id.notNull()) + { + handle_zoom_to_object(obj_id); + } + } } bool onObjectIconContextMenuItemVisible(const LLSD& userdata) @@ -203,6 +210,16 @@ public: { return !LLMuteList::getInstance()->isMuted(getAvatarId(), mFrom, LLMute::flagTextChat); } + else if (level == "obj_zoom_in") + { + LLUUID obj_id = mObjectData["object_id"]; + if (obj_id.notNull()) + { + LLViewerObject* object = gObjectList.findObject(obj_id); + return object && object->isReachable(); + } + return false; + } return false; } @@ -425,6 +442,7 @@ public: time_t current_time = time_corrected(); time_t message_time = (time_t)(current_time - LLFrameTimer::getElapsedSeconds() + mTime); + // Report abuse shouldn't use AM/PM, use 24-hour time time_string = "[" + LLTrans::getString("TimeMonth") + "]/[" + LLTrans::getString("TimeDay") + "]/[" + LLTrans::getString("TimeYear") + "] [" @@ -936,7 +954,7 @@ protected: menu->setItemEnabled("Voice Call", false); menu->setItemEnabled("Chat History", false); menu->setItemEnabled("Invite Group", false); - menu->setItemEnabled("Zoom In", false); + menu->setItemEnabled("Zoom In", true); menu->setItemEnabled("Share", false); menu->setItemEnabled("Pay", false); menu->setItemEnabled("Block Unblock", false); @@ -1101,7 +1119,11 @@ LLChatHistory::LLChatHistory(const LLChatHistory::Params& p) mEditor = LLUICtrlFactory::create<LLTextEditor>(editor_params, this); mEditor->setIsFriendCallback(LLAvatarActions::isFriend); mEditor->setIsObjectBlockedCallback(boost::bind(&LLMuteList::isMuted, LLMuteList::getInstance(), _1, _2, 0)); - + mEditor->setIsObjectReachableCallback([](const LLUUID& obj_id) + { + LLViewerObject* object = gObjectList.findObject(obj_id); + return object && object->isReachable(); + }); } LLSD LLChatHistory::getValue() const diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index 550dfeb802..5ac4ce0d52 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -37,6 +37,8 @@ #include "lllocalcliprect.h" #include "lltrans.h" #include "llfloaterimnearbychat.h" +#include "llfloaterworldmap.h" +#include "llviewermenu.h" #include "llviewercontrol.h" #include "llagentdata.h" @@ -75,6 +77,23 @@ public: return true; } + if (verb == "zoomin") + { + if (!handle_zoom_to_object(object_id) && params.size() > 2) + { + // zoom faled, show location + // secondlife:///app/object/object_id/zoomin/{LOCATION}/{COORDS} SLapp + const std::string region_name = LLURI::unescape(params[0].asString()); + S32 x = (params.size() > 1) ? params[1].asInteger() : 128; + S32 y = (params.size() > 2) ? params[2].asInteger() : 128; + S32 z = (params.size() > 3) ? params[3].asInteger() : 0; + + LLFloaterWorldMap::getInstance()->trackURL(region_name, x, y, z); + LLFloaterReg::showInstance("world_map", "center"); + } + return true; + } + return false; } }; diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index e8a069dfdb..0cad51137c 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -240,10 +240,11 @@ void LLNotificationChiclet::setCounter(S32 counter) bool LLNotificationChiclet::ChicletNotificationChannel::filterNotification( LLNotificationPtr notification ) { bool displayNotification; + LLFloaterNotificationsTabbed* floater = LLFloaterNotificationsTabbed::getInstance(); if ( (notification->getName() == "ScriptDialog") // special case for scripts // if there is no toast window for the notification, filter it //|| (!LLNotificationWellWindow::getInstance()->findItemByID(notification->getID())) - || (!LLFloaterNotificationsTabbed::getInstance()->findItemByID(notification->getID(), notification->getName())) + || (floater && !floater->findItemByID(notification->getID(), notification->getName())) ) { displayNotification = false; diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index 5114c97beb..c19f7dc1c1 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -187,7 +187,7 @@ public: /*virtual*/ boost::signals2::connection setLeftButtonClickCallback( const commit_callback_t& cb); - typedef boost::function<void (LLChiclet* ctrl, const LLSD& param)> + typedef std::function<void(LLChiclet* ctrl, const LLSD& param)> chiclet_size_changed_callback_t; /** diff --git a/indra/newview/llcofwearables.h b/indra/newview/llcofwearables.h index 6f0e97a98b..b349f35921 100644 --- a/indra/newview/llcofwearables.h +++ b/indra/newview/llcofwearables.h @@ -54,7 +54,7 @@ public: LLCOFCallbacks() {}; virtual ~LLCOFCallbacks() {}; - typedef boost::function<void ()> cof_callback_t; + typedef std::function<void()> cof_callback_t; cof_callback_t mAddWearable; cof_callback_t mMoveWearableCloser; diff --git a/indra/newview/llcommandlineparser.cpp b/indra/newview/llcommandlineparser.cpp index f21bae9805..0734b12531 100644 --- a/indra/newview/llcommandlineparser.cpp +++ b/indra/newview/llcommandlineparser.cpp @@ -32,7 +32,6 @@ #include <boost/lexical_cast.hpp> #include <boost/bind.hpp> #include <boost/tokenizer.hpp> -#include <boost/assign/list_of.hpp> #include "llsdserialize.h" #include "llerror.h" @@ -61,14 +60,7 @@ namespace // List of command-line switches that can't map-to settings variables. // Going forward, we want every new command-line switch to map-to some // settings variable. This list is used to validate that. - const std::set<std::string> unmapped_options = boost::assign::list_of - ("help") - ("set") - ("setdefault") - ("settings") - ("sessionsettings") - ("usersessionsettings") - ; + const std::set<std::string> unmapped_options = { "help", "set", "setdefault", "settings", "sessionsettings", "usersessionsettings" }; po::options_description gOptionsDesc; po::positional_options_description gPositionalOptions; @@ -101,7 +93,7 @@ class LLCLPValue : public po::value_semantic_codecvt_helper<char> unsigned mMinTokens; unsigned mMaxTokens; bool mIsComposing; - typedef boost::function1<void, const LLCommandLineParser::token_vector_t&> notify_callback_t; + typedef std::function<void(const LLCommandLineParser::token_vector_t&)> notify_callback_t; notify_callback_t mNotifyCallback; bool mLastOption; @@ -226,7 +218,7 @@ protected: // LLCommandLineParser defintions //---------------------------------------------------------------------------- void LLCommandLineParser::addOptionDesc(const std::string& option_name, - boost::function1<void, const token_vector_t&> notify_callback, + std::function<void(const token_vector_t&)> notify_callback, unsigned int token_count, const std::string& description, const std::string& short_name, @@ -255,7 +247,7 @@ void LLCommandLineParser::addOptionDesc(const std::string& option_name, value_desc, description.c_str())); - if(!notify_callback.empty()) + if(notify_callback) { value_desc->setNotifyCallback(notify_callback); } @@ -693,7 +685,7 @@ void LLControlGroupCLP::configure(const std::string& config_filename, LLControlG last_option = option_params["last_option"].asBoolean(); } - boost::function1<void, const token_vector_t&> callback; + std::function<void(const token_vector_t&)> callback; if (! option_params.has("map-to")) { // If this option isn't mapped to a settings variable, is it diff --git a/indra/newview/llcommandlineparser.h b/indra/newview/llcommandlineparser.h index 5279d02c0a..984bcfbad0 100644 --- a/indra/newview/llcommandlineparser.h +++ b/indra/newview/llcommandlineparser.h @@ -27,7 +27,7 @@ #ifndef LL_LLCOMMANDLINEPARSER_H #define LL_LLCOMMANDLINEPARSER_H -#include <boost/function/function1.hpp> +#include <functional> // *NOTE:Mani The following is a forward decl of // boost::program_options::command_line_parser @@ -58,7 +58,7 @@ public: */ void addOptionDesc( const std::string& option_name, - boost::function1<void, const token_vector_t&> notify_callback = 0, + std::function<void(const token_vector_t&)> notify_callback = nullptr, unsigned int num_tokens = 0, const std::string& description = LLStringUtil::null, const std::string& short_name = LLStringUtil::null, @@ -121,7 +121,7 @@ public: * The parser_func takes an input string, and should return a * name/value pair as the result. */ - typedef boost::function1<std::pair<std::string, std::string>, const std::string&> parser_func; + typedef std::function<std::pair<std::string, std::string>(const std::string&)> parser_func; void setCustomParser(parser_func f) { mExtraParser = f; } private: diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp index 552ea75559..e0236ca618 100644 --- a/indra/newview/llcompilequeue.cpp +++ b/indra/newview/llcompilequeue.cpp @@ -467,7 +467,7 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloat std::string url = object->getRegion()->getCapability("UpdateScriptTask"); { - LLResourceUploadInfo::ptr_t uploadInfo(new LLQueuedScriptAssetUpload(object->getID(), + LLResourceUploadInfo::ptr_t uploadInfo = std::make_shared<LLQueuedScriptAssetUpload>(object->getID(), inventory->getUUID(), assetId, monocompile ? LLScriptAssetUpload::MONO : LLScriptAssetUpload::LSL2, @@ -475,7 +475,7 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloat inventory->getName(), LLUUID(), experienceId, - boost::bind(&LLFloaterCompileQueue::handleHTTPResponse, pump.getName(), _4))); + boost::bind(&LLFloaterCompileQueue::handleHTTPResponse, pump.getName(), _4)); LLViewerAssetUpload::EnqueueInventoryUpload(url, uploadInfo); } diff --git a/indra/newview/llcompilequeue.h b/indra/newview/llcompilequeue.h index 951d4800e8..bcbb166c58 100644 --- a/indra/newview/llcompilequeue.h +++ b/indra/newview/llcompilequeue.h @@ -98,7 +98,7 @@ protected: std::string mStartString; bool mMono; - typedef boost::function<bool(const LLPointer<LLViewerObject> &, LLInventoryObject*, LLEventPump &)> fnQueueAction_t; + typedef std::function<bool(const LLPointer<LLViewerObject> &, LLInventoryObject*, LLEventPump &)> fnQueueAction_t; static void objectScriptProcessingQueueCoro(std::string action, LLHandle<LLFloaterScriptQueue> hfloater, object_data_list_t objectList, fnQueueAction_t func); }; diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp index 9201241856..660fb1b41a 100644 --- a/indra/newview/llcontrolavatar.cpp +++ b/indra/newview/llcontrolavatar.cpp @@ -129,14 +129,14 @@ void LLControlAvatar::getNewConstraintFixups(LLVector3& new_pos_fixup, F32& new_ { LLVector3 pos_box_offset = point_to_box_offset(vol_pos, unshift_extents); F32 offset_dist = pos_box_offset.length(); - if (offset_dist > MAX_LEGAL_OFFSET && offset_dist > 0.f) + if (offset_dist > max_legal_offset && offset_dist > 0.f) { - F32 target_dist = (offset_dist - MAX_LEGAL_OFFSET); + F32 target_dist = (offset_dist - max_legal_offset); new_pos_fixup = (target_dist/offset_dist)*pos_box_offset; } if (new_pos_fixup != mPositionConstraintFixup) { - LL_DEBUGS("ConstraintFix") << getFullname() << " pos fix, offset_dist " << offset_dist << " pos fixup " + LL_DEBUGS("ConstraintFix") << getDebugName() << " pos fix, offset_dist " << offset_dist << " pos fixup " << new_pos_fixup << " was " << mPositionConstraintFixup << LL_ENDL; LL_DEBUGS("ConstraintFix") << "vol_pos " << vol_pos << LL_ENDL; LL_DEBUGS("ConstraintFix") << "extents " << extents[0] << " " << extents[1] << LL_ENDL; @@ -144,11 +144,11 @@ void LLControlAvatar::getNewConstraintFixups(LLVector3& new_pos_fixup, F32& new_ } } - if (box_size/mScaleConstraintFixup > MAX_LEGAL_SIZE) + if (box_size/mScaleConstraintFixup > max_legal_size) { - new_scale_fixup = mScaleConstraintFixup* MAX_LEGAL_SIZE /box_size; - LL_DEBUGS("ConstraintFix") << getFullname() << " scale fix, box_size " << box_size << " fixup " - << mScaleConstraintFixup << " max legal " << MAX_LEGAL_SIZE + new_scale_fixup = mScaleConstraintFixup*max_legal_size/box_size; + LL_DEBUGS("ConstraintFix") << getDebugName() << " scale fix, box_size " << box_size << " fixup " + << mScaleConstraintFixup << " max legal " << max_legal_size << " -> new scale " << new_scale_fixup << LL_ENDL; } } @@ -231,7 +231,7 @@ void LLControlAvatar::matchVolumeTransform() const LLMeshSkinInfo* skin_info = mRootVolp->getSkinInfo(); if (skin_info) { - LL_DEBUGS("BindShape") << getFullname() << " bind shape " << skin_info->mBindShapeMatrix << LL_ENDL; + LL_DEBUGS("BindShape") << getDebugName() << " bind shape " << skin_info->mBindShapeMatrix << LL_ENDL; bind_rot = LLSkinningUtil::getUnscaledQuaternion(LLMatrix4(skin_info->mBindShapeMatrix)); } #endif diff --git a/indra/newview/llconversationlog.cpp b/indra/newview/llconversationlog.cpp index e6a720e734..4a4985d8ac 100644 --- a/indra/newview/llconversationlog.cpp +++ b/indra/newview/llconversationlog.cpp @@ -118,11 +118,21 @@ const std::string LLConversation::createTimestamp(const U64Seconds& utc_time) LLSD substitution; substitution["datetime"] = (S32)utc_time.value(); - timeStr = "["+LLTrans::getString ("TimeMonth")+"]/[" - +LLTrans::getString ("TimeDay")+"]/[" - +LLTrans::getString ("TimeYear")+"] [" - +LLTrans::getString ("TimeHour")+"]:[" - +LLTrans::getString ("TimeMin")+"]"; + static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); + timeStr = "[" + LLTrans::getString("TimeMonth") + "]/[" + + LLTrans::getString("TimeDay") + "]/[" + + LLTrans::getString("TimeYear") + "] ["; + if (use_24h) + { + timeStr += LLTrans::getString("TimeHour") + "]:[" + + LLTrans::getString("TimeMin") + "]"; + } + else + { + timeStr += LLTrans::getString("TimeHour12") + "]:[" + + LLTrans::getString("TimeMin") + "] [" + + LLTrans::getString("TimeAMPM") + "]"; + } LLStringUtil::format (timeStr, substitution); @@ -147,7 +157,10 @@ void LLConversation::setListenIMFloaterOpened() // if floater is already opened or this conversation doesn't have unread offline messages if (mHasOfflineIMs && !offline_ims_visible) { - mIMFloaterShowedConnection = LLFloaterIMSession::setIMFloaterShowedCallback(boost::bind(&LLConversation::onIMFloaterShown, this, _1)); + mIMFloaterShowedConnection = LLFloaterIMSession::setIMFloaterShowedCallback([this](const LLUUID& session_id) + { + onIMFloaterShown(session_id); + }); } else { @@ -663,7 +676,7 @@ void LLConversationLog::onClearLogResponse(const LLSD& notification, const LLSD& { mConversations.clear(); notifyObservers(); - cache(); + saveToFile(getFileName()); deleteBackupLogs(); } } diff --git a/indra/newview/llconversationloglistitem.cpp b/indra/newview/llconversationloglistitem.cpp index 20d5b0175b..e21a772f67 100644 --- a/indra/newview/llconversationloglistitem.cpp +++ b/indra/newview/llconversationloglistitem.cpp @@ -53,7 +53,10 @@ LLConversationLogListItem::LLConversationLogListItem(const LLConversation* conve if (mConversation->hasOfflineMessages() && !ims_are_read) { - mIMFloaterShowedConnection = LLFloaterIMSession::setIMFloaterShowedCallback(boost::bind(&LLConversationLogListItem::onIMFloaterShown, this, _1)); + mIMFloaterShowedConnection = LLFloaterIMSession::setIMFloaterShowedCallback([this](const LLUUID& session_id) + { + onIMFloaterShown(session_id); + }); } } diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp index af5a46742c..774e8fd4c5 100644 --- a/indra/newview/llconversationmodel.cpp +++ b/indra/newview/llconversationmodel.cpp @@ -300,7 +300,7 @@ void LLConversationItemSession::updateName(LLConversationItemParticipant* partic for (auto itemp : mChildren) { - LLConversationItem* current_participant = dynamic_cast<LLConversationItem*>(itemp); + LLConversationItem* current_participant = dynamic_cast<LLConversationItem*>(itemp.get()); // Add the avatar uuid to the list (except if it's the own agent uuid) if (current_participant->getUUID() != gAgentID) { @@ -329,6 +329,7 @@ void LLConversationItemSession::updateName(LLConversationItemParticipant* partic void LLConversationItemSession::removeParticipant(LLConversationItemParticipant* participant) { + LLPointer<LLFolderViewModelItem> holder(participant); removeChild(participant); mNeedsRefresh = true; updateName(participant); @@ -360,15 +361,10 @@ void LLConversationItemSession::clearAndDeparentModels() for (child_list_t::iterator it = mChildren.begin(); it != mChildren.end();) { LLFolderViewModelItem* child = *it; - if (child->getNumRefs() == 0) + // Note that model might still be assigned to some view/widget + // and have a different parent + if (child->getParent() == this) { - // LLConversationItemParticipant can be created but not assigned to any view, - // it was waiting for an "add_participant" event to be processed - delete child; - } - else - { - // Model is still assigned to some view/widget child->setParent(NULL); } it = mChildren.erase(it); @@ -383,7 +379,7 @@ LLConversationItemParticipant* LLConversationItemSession::findParticipant(const child_list_t::iterator iter; for (iter = mChildren.begin(); iter != mChildren.end(); iter++) { - participant = dynamic_cast<LLConversationItemParticipant*>(*iter); + participant = dynamic_cast<LLConversationItemParticipant*>((*iter).get()); if (participant && participant->hasSameValue(participant_id)) { break; @@ -493,7 +489,7 @@ const bool LLConversationItemSession::getTime(F64& time) const child_list_t::const_iterator iter; for (iter = mChildren.begin(); iter != mChildren.end(); iter++) { - participant = dynamic_cast<LLConversationItemParticipant*>(*iter); + participant = dynamic_cast<LLConversationItemParticipant*>((*iter).get()); F64 participant_time; if (participant && participant->getTime(participant_time)) { @@ -517,7 +513,7 @@ void LLConversationItemSession::dumpDebugData(bool dump_children) { for (child_list_t::iterator iter = mChildren.begin(); iter != mChildren.end(); iter++) { - LLConversationItemParticipant* participant = dynamic_cast<LLConversationItemParticipant*>(*iter); + LLConversationItemParticipant* participant = dynamic_cast<LLConversationItemParticipant*>((*iter).get()); if (participant) { participant->dumpDebugData(); diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h index c1e48c63a9..d5486b9f4a 100644 --- a/indra/newview/llconversationmodel.h +++ b/indra/newview/llconversationmodel.h @@ -79,6 +79,9 @@ public: virtual LLPointer<LLUIImage> getOpenIcon() const { return getIcon(); } virtual LLFontGL::StyleFlags getLabelStyle() const { return LLFontGL::NORMAL; } virtual std::string getLabelSuffix() const { return LLStringUtil::null; } + virtual bool isFavorite() const { return false; } + virtual bool isAgentInventory() const { return false; } + virtual bool isAgentInventoryRoot() const { return false; } virtual bool isItemRenameable() const { return true; } virtual bool renameItem(const std::string& new_name) { mName = new_name; mNeedsRefresh = true; return true; } virtual bool isItemMovable( void ) const { return false; } diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index a1f627c8cc..99d770b6e2 100644 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -86,7 +86,8 @@ LLConversationViewSession::LLConversationViewSession(const LLConversationViewSes mHasArrow(true), mIsInActiveVoiceChannel(false), mFlashStateOn(false), - mFlashStarted(false) + mFlashStarted(false), + mIsAltFlashColor(false) { mFlashTimer = new LLFlashTimer(); mAreChildrenInited = true; // inventory only @@ -157,7 +158,7 @@ void LLConversationViewSession::destroyView() LLFolderViewFolder::destroyView(); } -void LLConversationViewSession::setFlashState(bool flash_state) +void LLConversationViewSession::setFlashState(bool flash_state, bool alternate_color) { if (flash_state && !mFlashStateOn) { @@ -170,6 +171,7 @@ void LLConversationViewSession::setFlashState(bool flash_state) mFlashStateOn = flash_state; mFlashStarted = false; + mIsAltFlashColor = mFlashStateOn && (alternate_color || mIsAltFlashColor); mFlashTimer->stopFlashing(); } @@ -288,7 +290,8 @@ void LLConversationViewSession::draw() startFlashing(); // draw highlight for selected items - drawHighlight(show_context, true, sHighlightBgColor, sFlashBgColor, sFocusOutlineColor, sMouseOverColor); + static LLUIColor alt_color = LLUIColorTable::instance().getColor("MentionFlashBgColor", DEFAULT_WHITE); + drawHighlight(show_context, true, sHighlightBgColor, mIsAltFlashColor ? alt_color : sFlashBgColor, sFocusOutlineColor, sMouseOverColor); // Draw children if root folder, or any other folder that is open. Do not draw children when animating to closed state or you get rendering overlap. bool draw_children = getRoot() == static_cast<LLFolderViewFolder*>(this) || isOpen(); @@ -540,7 +543,7 @@ void LLConversationViewSession::onCurrentVoiceSessionChanged(const LLUUID& sessi { bool old_value = mIsInActiveVoiceChannel; mIsInActiveVoiceChannel = vmi->getUUID() == session_id; - mCallIconLayoutPanel->setVisible(mIsInActiveVoiceChannel); + mCallIconLayoutPanel->setVisible(mIsInActiveVoiceChannel && !LLVoiceChannel::isSuspended()); if (old_value != mIsInActiveVoiceChannel) { refresh(); diff --git a/indra/newview/llconversationview.h b/indra/newview/llconversationview.h index 8eb6392121..a6d240ed84 100644 --- a/indra/newview/llconversationview.h +++ b/indra/newview/llconversationview.h @@ -90,7 +90,7 @@ public: virtual void refresh(); - /*virtual*/ void setFlashState(bool flash_state); + /*virtual*/ void setFlashState(bool flash_state, bool alternate_color = false); void setHighlightState(bool hihglight_state); LLFloater* getSessionFloater(); @@ -111,6 +111,7 @@ private: LLFlashTimer* mFlashTimer; bool mFlashStateOn; bool mFlashStarted; + bool mIsAltFlashColor; bool mCollapsedMode; bool mHasArrow; diff --git a/indra/newview/lldirpicker.cpp b/indra/newview/lldirpicker.cpp index 1425aab947..fa8acac2ce 100644 --- a/indra/newview/lldirpicker.cpp +++ b/indra/newview/lldirpicker.cpp @@ -272,6 +272,7 @@ bool LLDirPicker::getDir(std::string* filename, bool blocking) } return !mDir.empty(); #endif + return false; } std::string LLDirPicker::getDirName() diff --git a/indra/newview/lldndbutton.h b/indra/newview/lldndbutton.h index 277c2aad69..d503b367e1 100644 --- a/indra/newview/lldndbutton.h +++ b/indra/newview/lldndbutton.h @@ -47,7 +47,7 @@ public: LLDragAndDropButton(const Params& params); - typedef boost::function<bool ( + typedef std::function<bool ( S32 /*x*/, S32 /*y*/, MASK /*mask*/, bool /*drop*/, EDragAndDropType /*cargo_type*/, void* /*cargo_data*/, diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index 70ae4ee13f..322ee90541 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -33,6 +33,7 @@ // viewer includes #include "llagent.h" +#include "llagentcamera.h" #include "llcriticaldamp.h" #include "llface.h" #include "lllightconstants.h" @@ -252,7 +253,15 @@ void LLDrawable::cleanupReferences() std::for_each(mFaces.begin(), mFaces.end(), DeletePointer()); mFaces.clear(); - gPipeline.unlinkDrawable(this); + if (gPipeline.mInitialized) + { + gPipeline.unlinkDrawable(this); + } + else if (getSpatialGroup()) + { + // Not supposed to happen? + getSpatialGroup()->getSpatialPartition()->remove(this, getSpatialGroup()); + } removeFromOctree(); @@ -778,6 +787,14 @@ bool LLDrawable::updateMove() makeActive(); + // #3256 force undampened movement for attached objects in mouselook + // to prevent animation bork for linkset with animated parts + if (!isRoot() && gAgentCamera.cameraMouselook() && + !mVObjp->isRiggedMesh() && mVObjp->getAvatar() && mVObjp->getAvatar()->isSelf()) + { + return updateMoveUndamped(); + } + return isState(MOVE_UNDAMPED) ? updateMoveUndamped() : updateMoveDamped(); } @@ -908,7 +925,10 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update) LLVector3 cam_pos_from_agent = LLViewerCamera::getInstance()->getOrigin(); LLVector3 cam_to_box_offset = point_to_box_offset(cam_pos_from_agent, av_box); mDistanceWRTCamera = llmax(0.01f, ll_round(cam_to_box_offset.magVec(), 0.01f)); - mVObjp->updateLOD(); + if (mVObjp) + { + mVObjp->updateLOD(); + } return; } } @@ -919,7 +939,10 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update) pos -= camera.getOrigin(); mDistanceWRTCamera = ll_round(pos.magVec(), 0.01f); - mVObjp->updateLOD(); + if (mVObjp) + { + mVObjp->updateLOD(); + } } } @@ -931,6 +954,11 @@ void LLDrawable::updateTexture() return; } + if (!mVObjp) + { + return; + } + if (getNumFaces() != mVObjp->getNumTEs()) { //drawable is transitioning its face count return; diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h index a7ac9da618..6f6faf9909 100644 --- a/indra/newview/lldrawable.h +++ b/indra/newview/lldrawable.h @@ -67,17 +67,8 @@ class LLDrawable public: typedef std::vector<LLFace*> face_list_t; - LLDrawable(const LLDrawable& rhs) - : LLViewerOctreeEntryData(rhs) - { - *this = rhs; - } - - const LLDrawable& operator=(const LLDrawable& rhs) - { - LL_ERRS() << "Illegal operation!" << LL_ENDL; - return *this; - } + LLDrawable(const LLDrawable& rhs) = delete; + const LLDrawable& operator=(const LLDrawable& rhs) = delete; static void initClass(); diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h index 1c8864a9df..46696fc4a4 100644 --- a/indra/newview/lldrawpool.h +++ b/indra/newview/lldrawpool.h @@ -204,7 +204,7 @@ public: NUM_RENDER_TYPES, }; - #ifdef LL_PROFILER_ENABLE_RENDER_DOC + #if LL_PROFILER_ENABLE_RENDER_DOC static inline const char* lookupPassName(U32 pass) { switch (pass) @@ -340,7 +340,7 @@ public: } } #else - static inline const char* lookupPass(U32 pass) { return ""; } + static inline const char* lookupPassName(U32 pass) { return ""; } #endif LLRenderPass(const U32 type); diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 87b6ce6cb3..bc45734e66 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -278,7 +278,7 @@ void LLDrawPoolAlpha::forwardRender(bool rigged) void LLDrawPoolAlpha::renderDebugAlpha() { - if (sShowDebugAlpha) + if (sShowDebugAlpha && !gCubeSnapshot) { gHighlightProgram.bind(); gGL.diffuseColor4f(1, 0, 0, 1); diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 95f96e85d6..f0f589e7f4 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -491,7 +491,6 @@ void LLDrawPoolAvatar::beginImpostor() if (!LLPipeline::sReflectionRender) { - LLVOAvatar::sRenderDistance = llclamp(LLVOAvatar::sRenderDistance, 16.f, 256.f); LLVOAvatar::sNumVisibleAvatars = 0; } @@ -547,7 +546,6 @@ void LLDrawPoolAvatar::beginDeferredImpostor() if (!LLPipeline::sReflectionRender) { - LLVOAvatar::sRenderDistance = llclamp(LLVOAvatar::sRenderDistance, 16.f, 256.f); LLVOAvatar::sNumVisibleAvatars = 0; } @@ -796,7 +794,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) return; } - if ((sShaderLevel >= SHADER_LEVEL_CLOTH)) + if (LLPipeline::RenderAvatarCloth) { LLMatrix4 rot_mat; LLViewerCamera::getInstance()->getMatrixToLocal(rot_mat); diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h index 1a53861a03..87a87e225e 100644 --- a/indra/newview/lldrawpoolavatar.h +++ b/indra/newview/lldrawpoolavatar.h @@ -46,12 +46,6 @@ class LLDrawPoolAvatar : public LLFacePool public: enum { - SHADER_LEVEL_BUMP = 2, - SHADER_LEVEL_CLOTH = 3 - }; - - enum - { VERTEX_DATA_MASK = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0 | diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index bf593bff07..1affef18db 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -55,8 +55,6 @@ // static LLStandardBumpmap gStandardBumpmapList[TEM_BUMPMAP_COUNT]; -LL::WorkQueue::weak_t LLBumpImageList::sMainQueue; -LL::WorkQueue::weak_t LLBumpImageList::sTexUpdateQueue; LLRenderTarget LLBumpImageList::sRenderTarget; // static @@ -629,8 +627,6 @@ void LLBumpImageList::init() llassert( mDarknessEntries.size() == 0 ); LLStandardBumpmap::restoreGL(); - sMainQueue = LL::WorkQueue::getInstance("mainloop"); - sTexUpdateQueue = LL::WorkQueue::getInstance("LLImageGL"); // Share work queue with tex loader. } void LLBumpImageList::clear() @@ -802,7 +798,10 @@ void LLBumpImageList::onSourceStandardLoaded( bool success, LLViewerFetchedTextu } src_vi->setExplicitFormat(GL_RGBA, GL_RGBA); { - src_vi->createGLTexture(src_vi->getDiscardLevel(), nrm_image); + if (!src_vi->createGLTexture(src_vi->getDiscardLevel(), nrm_image)) + { + LL_WARNS() << "Failed to create bump image texture for image " << src_vi->getID() << LL_ENDL; + } } } } @@ -896,7 +895,10 @@ void LLBumpImageList::onSourceUpdated(LLViewerTexture* src, EBumpEffect bump_cod LLImageGL* src_img = src->getGLTexture(); LLImageGL* dst_img = bump->getGLTexture(); - dst_img->setSize(src->getWidth(), src->getHeight(), 4, 0); + if (!dst_img->setSize(src->getWidth(), src->getHeight(), 4, 0)) + { + LL_WARNS() << "Failed to setSize for image " << bump->getID() << LL_ENDL; + } dst_img->setUseMipMaps(true); dst_img->setDiscardLevel(0); dst_img->createGLTexture(); @@ -911,7 +913,8 @@ void LLBumpImageList::onSourceUpdated(LLViewerTexture* src, EBumpEffect bump_cod // generate normal map in empty texture { - sRenderTarget.bindTarget(); + sRenderTarget.bindTarget("", 1); + //sRenderTarget.clear(); LLGLDepthTest depth(GL_FALSE); LLGLDisable cull(GL_CULL_FACE); diff --git a/indra/newview/lldrawpoolbump.h b/indra/newview/lldrawpoolbump.h index 15976884ca..e1a468cd18 100644 --- a/indra/newview/lldrawpoolbump.h +++ b/indra/newview/lldrawpoolbump.h @@ -152,8 +152,6 @@ private: typedef std::unordered_map<LLUUID, LLPointer<LLViewerTexture> > bump_image_map_t; bump_image_map_t mBrightnessEntries; bump_image_map_t mDarknessEntries; - static LL::WorkQueue::weak_t sMainQueue; - static LL::WorkQueue::weak_t sTexUpdateQueue; static LLRenderTarget sRenderTarget; }; diff --git a/indra/newview/lldrawpoolterrain.h b/indra/newview/lldrawpoolterrain.h index 5380463d01..23cf253b6a 100644 --- a/indra/newview/lldrawpoolterrain.h +++ b/indra/newview/lldrawpoolterrain.h @@ -38,6 +38,7 @@ public: VERTEX_DATA_MASK = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TANGENT | // Only PBR terrain uses this currently + LLVertexBuffer::MAP_TEXCOORD0 | // Ownership overlay LLVertexBuffer::MAP_TEXCOORD1 }; diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp index 6efd503574..26ef190fbb 100644 --- a/indra/newview/lldrawpooltree.cpp +++ b/indra/newview/lldrawpooltree.cpp @@ -108,8 +108,9 @@ void LLDrawPoolTree::beginShadowPass(S32 pass) { LL_PROFILE_ZONE_SCOPED; - glPolygonOffset(gSavedSettings.getF32("RenderDeferredTreeShadowOffset"), - gSavedSettings.getF32("RenderDeferredTreeShadowBias")); + static LLCachedControl<F32> shadow_offset(gSavedSettings, "RenderDeferredTreeShadowOffset"); + static LLCachedControl<F32> shadow_bias(gSavedSettings, "RenderDeferredTreeShadowBias"); + glPolygonOffset(shadow_offset(), shadow_bias()); LLEnvironment& environment = LLEnvironment::instance(); diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp index 7d58511d41..7a974fe857 100644 --- a/indra/newview/lldrawpoolwater.cpp +++ b/indra/newview/lldrawpoolwater.cpp @@ -119,7 +119,8 @@ void LLDrawPoolWater::beginPostDeferredPass(S32 pass) LLRenderTarget& depth_src = gPipeline.mRT->deferredScreen; LLRenderTarget& dst = gPipeline.mWaterDis; - dst.bindTarget(); + dst.bindTarget("", 1); + //dst.clear(); gCopyDepthProgram.bind(); S32 diff_map = gCopyDepthProgram.getTextureChannel(LLShaderMgr::DIFFUSE_MAP); @@ -143,7 +144,6 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass) gGL.setColorMask(true, true); LLColor3 light_diffuse(0, 0, 0); - F32 light_exp = 0.0f; LLEnvironment& environment = LLEnvironment::instance(); LLSettingsWater::ptr_t pwater = environment.getCurrentWater(); @@ -170,7 +170,6 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass) // Apply magic numbers translating light direction into intensities light_dir.normalize(); F32 ground_proj_sq = light_dir.mV[0] * light_dir.mV[0] + light_dir.mV[1] * light_dir.mV[1]; - light_exp = llmax(32.f, 256.f * powf(ground_proj_sq, 16.0f)); if (0.f < light_diffuse.normalize()) // Normalizing a color? Puzzling... { light_diffuse *= (1.5f + (6.f * ground_proj_sq)); diff --git a/indra/newview/lldrawpoolwaterexclusion.cpp b/indra/newview/lldrawpoolwaterexclusion.cpp index d796bf39bf..5d8fa9b7a1 100644 --- a/indra/newview/lldrawpoolwaterexclusion.cpp +++ b/indra/newview/lldrawpoolwaterexclusion.cpp @@ -61,7 +61,7 @@ void LLDrawPoolWaterExclusion::render(S32 pass) pwaterpool->pushWaterPlanes(0); // Take care of the edge water tiles. - pwaterpool->pushWaterPlanes(1); + //pwaterpool->pushWaterPlanes(1); } gDrawColorProgram.uniform4f(LLShaderMgr::DIFFUSE_COLOR, 0, 0, 0, 1); diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp index 305215f541..e6d0b036e0 100644 --- a/indra/newview/lldrawpoolwlsky.cpp +++ b/indra/newview/lldrawpoolwlsky.cpp @@ -32,7 +32,6 @@ #include "llface.h" #include "llimage.h" #include "llrender.h" -#include "llatmosphere.h" #include "llenvironment.h" #include "llglslshader.h" #include "llgl.h" diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp index 33325e352f..984f8ee25e 100644 --- a/indra/newview/lldynamictexture.cpp +++ b/indra/newview/lldynamictexture.cpp @@ -204,7 +204,7 @@ bool LLViewerDynamicTexture::updateAllInstances() llassert(bake_target.getHeight() >= (U32) LLAvatarAppearanceDefines::SCRATCH_TEX_HEIGHT); preview_target.bindTarget(); - preview_target.clear(); + //preview_target.clear(); LLGLSLShader::unbind(); LLVertexBuffer::unbind(); @@ -249,7 +249,7 @@ bool LLViewerDynamicTexture::updateAllInstances() // ORDER_LAST is baked skin preview, ORDER_RESET resets appearance parameters and does not render. bake_target.bindTarget(); - bake_target.clear(); + //bake_target.clear(); result = false; ret = false; diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp index 0017a724ea..d942715fff 100644 --- a/indra/newview/llenvironment.cpp +++ b/indra/newview/llenvironment.cpp @@ -54,7 +54,6 @@ #include "llregioninfomodel.h" -#include "llatmosphere.h" #include "llagent.h" #include "roles_constants.h" #include "llestateinfomodel.h" @@ -965,54 +964,6 @@ LLSettingsWater::ptr_t LLEnvironment::getCurrentWater() const return pwater; } -void LayerConfigToDensityLayer(const LLSD& layerConfig, DensityLayer& layerOut) -{ - layerOut.constant_term = (F32)layerConfig[LLSettingsSky::SETTING_DENSITY_PROFILE_CONSTANT_TERM].asReal(); - layerOut.exp_scale = (F32)layerConfig[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_SCALE_FACTOR].asReal(); - layerOut.exp_term = (F32)layerConfig[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_TERM].asReal(); - layerOut.linear_term = (F32)layerConfig[LLSettingsSky::SETTING_DENSITY_PROFILE_LINEAR_TERM].asReal(); - layerOut.width = (F32)layerConfig[LLSettingsSky::SETTING_DENSITY_PROFILE_WIDTH].asReal(); -} - -void LLEnvironment::getAtmosphericModelSettings(AtmosphericModelSettings& settingsOut, const LLSettingsSky::ptr_t &psky) -{ - settingsOut.m_skyBottomRadius = psky->getSkyBottomRadius(); - settingsOut.m_skyTopRadius = psky->getSkyTopRadius(); - settingsOut.m_sunArcRadians = psky->getSunArcRadians(); - settingsOut.m_mieAnisotropy = psky->getMieAnisotropy(); - - LLSD rayleigh = psky->getRayleighConfigs(); - settingsOut.m_rayleighProfile.clear(); - for (LLSD::array_iterator itf = rayleigh.beginArray(); itf != rayleigh.endArray(); ++itf) - { - DensityLayer layer; - LLSD& layerConfig = (*itf); - LayerConfigToDensityLayer(layerConfig, layer); - settingsOut.m_rayleighProfile.push_back(layer); - } - - LLSD mie = psky->getMieConfigs(); - settingsOut.m_mieProfile.clear(); - for (LLSD::array_iterator itf = mie.beginArray(); itf != mie.endArray(); ++itf) - { - DensityLayer layer; - LLSD& layerConfig = (*itf); - LayerConfigToDensityLayer(layerConfig, layer); - settingsOut.m_mieProfile.push_back(layer); - } - settingsOut.m_mieAnisotropy = psky->getMieAnisotropy(); - - LLSD absorption = psky->getAbsorptionConfigs(); - settingsOut.m_absorptionProfile.clear(); - for (LLSD::array_iterator itf = absorption.beginArray(); itf != absorption.endArray(); ++itf) - { - DensityLayer layer; - LLSD& layerConfig = (*itf); - LayerConfigToDensityLayer(layerConfig, layer); - settingsOut.m_absorptionProfile.push_back(layer); - } -} - bool LLEnvironment::canAgentUpdateParcelEnvironment() const { LLParcel *parcel(LLViewerParcelMgr::instance().getAgentOrSelectedParcel()); @@ -2022,8 +1973,8 @@ void LLEnvironment::coroRequestEnvironment(S32 parcel_id, LLEnvironment::environ { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("ResetEnvironment", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("ResetEnvironment", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); std::string url = gAgent.getRegionCapability("ExtEnvironment"); if (url.empty()) @@ -2070,8 +2021,8 @@ void LLEnvironment::coroUpdateEnvironment(S32 parcel_id, S32 track_no, UpdateInf { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("ResetEnvironment", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("ResetEnvironment", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); std::string url = gAgent.getRegionCapability("ExtEnvironment"); if (url.empty()) @@ -2186,8 +2137,8 @@ void LLEnvironment::coroResetEnvironment(S32 parcel_id, S32 track_no, environmen { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("ResetEnvironment", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("ResetEnvironment", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); std::string url = gAgent.getRegionCapability("ExtEnvironment"); if (url.empty()) @@ -2563,7 +2514,6 @@ void LLEnvironment::setSharedEnvironment() { clearEnvironment(LLEnvironment::ENV_LOCAL); setSelectedEnvironment(LLEnvironment::ENV_LOCAL); - updateEnvironment(); } void LLEnvironment::setExperienceEnvironment(LLUUID experience_id, LLUUID asset_id, F32 transition_time) @@ -2744,13 +2694,6 @@ bool LLEnvironment::DayInstance::setSky(const LLSettingsSky::ptr_t &psky) mSky->update(); mBlenderSky.reset(); - if (gAtmosphere) - { - AtmosphericModelSettings settings; - LLEnvironment::getAtmosphericModelSettings(settings, psky); - gAtmosphere->configureAtmosphericModel(settings); - } - return changed; } @@ -3419,8 +3362,8 @@ namespace { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("testExperiencesOnParcelCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("testExperiencesOnParcelCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); std::string url = gAgent.getRegionCapability("ExperienceQuery"); if (url.empty()) diff --git a/indra/newview/llenvironment.h b/indra/newview/llenvironment.h index e56548d618..559a34bc47 100644 --- a/indra/newview/llenvironment.h +++ b/indra/newview/llenvironment.h @@ -38,8 +38,6 @@ #include "llsettingswater.h" #include "llsettingsdaycycle.h" -#include "llatmosphere.h" - #include "llglslshader.h" #include <boost/signals2.hpp> @@ -133,8 +131,6 @@ public: LLSettingsSky::ptr_t getCurrentSky() const; LLSettingsWater::ptr_t getCurrentWater() const; - static void getAtmosphericModelSettings(AtmosphericModelSettings& settingsOut, const LLSettingsSky::ptr_t &psky); - void update(const LLViewerCamera * cam); static void updateGLVariablesForSettings(LLShaderUniforms* uniforms, const LLSettingsBase::ptr_t &psetting); diff --git a/indra/newview/llestateinfomodel.cpp b/indra/newview/llestateinfomodel.cpp index a7d18d85ce..54be045c3d 100644 --- a/indra/newview/llestateinfomodel.cpp +++ b/indra/newview/llestateinfomodel.cpp @@ -138,8 +138,8 @@ void LLEstateInfoModel::commitEstateInfoCapsCoro(std::string url) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("EstateChangeInfo", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("EstateChangeInfo", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD body; body["estate_name"] = getName(); diff --git a/indra/newview/lleventnotifier.cpp b/indra/newview/lleventnotifier.cpp index 16897e9ebd..66a922e288 100644 --- a/indra/newview/lleventnotifier.cpp +++ b/indra/newview/lleventnotifier.cpp @@ -166,28 +166,19 @@ bool LLEventNotifier::handleResponse(U32 eventId, const LLSD& notification, cons return true; } -bool LLEventNotifier::add(U32 eventId, F64 eventEpoch, const std::string& eventDateStr, const std::string &eventName) +bool LLEventNotifier::add(LLEventInfo event) { - LLEventNotification *new_enp = new LLEventNotification(eventId, eventEpoch, eventDateStr, eventName); - - LL_INFOS() << "Add event " << eventName << " id " << eventId << " date " << eventDateStr << LL_ENDL; - if(!new_enp->isValid()) - { - delete new_enp; + if (mEventInfoSignal(event)) return false; - } - - mEventNotifications[new_enp->getEventID()] = new_enp; - return true; + return add(event.mID, event.mUnixTime, event.mTimeStr, event.mName); } -bool LLEventNotifier::add(const LLEventStruct& event) +bool LLEventNotifier::add(U32 eventId, F64 eventEpoch, const std::string& eventDateStr, const std::string &eventName) { - if (mNewEventSignal(event)) return false; - LLEventNotification *new_enp = new LLEventNotification(event.eventId, event.eventEpoch, event.eventDateStr, event.eventName); + LLEventNotification *new_enp = new LLEventNotification(eventId, eventEpoch, eventDateStr, eventName); - LL_INFOS() << "Add event " << event.eventName << " id " << event.eventId << " date " << event.eventDateStr << LL_ENDL; + LL_INFOS() << "Add event " << eventName << " id " << eventId << " date " << eventDateStr << LL_ENDL; if(!new_enp->isValid()) { delete new_enp; @@ -215,34 +206,9 @@ void LLEventNotifier::add(U32 eventId) //static void LLEventNotifier::processEventInfoReply(LLMessageSystem *msg, void **) { - // extract the agent id - LLUUID agent_id; - U32 event_id; - std::string event_name; - std::string eventd_date; - U32 event_time_utc; - - msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); - msg->getU32("EventData", "EventID", event_id); - msg->getString("EventData", "Name", event_name); - msg->getString("EventData", "Date", eventd_date); - msg->getU32("EventData", "DateUTC", event_time_utc); - - //gEventNotifier.add(event_id, (F64)event_time_utc, eventd_date, event_name); - - LLEventStruct event(event_id, (F64)event_time_utc, eventd_date, event_name); - msg->getString("EventData", "Creator", event.creator); - msg->getString("EventData", "Category", event.category); - msg->getString("EventData", "Desc", event.desc); - msg->getU32("EventData", "Duration", event.duration); - msg->getU32("EventData", "Cover", event.cover); - msg->getU32("EventData", "Amount", event.amount); - msg->getString("EventData", "SimName", event.simName); - msg->getVector3d("EventData", "GlobalPos", event.globalPos); - msg->getU32("EventData", "EventFlags", event.flags); - - gEventNotifier.add(event); - + LLEventInfo info; + info.unpack(msg); + gEventNotifier.add(info); } @@ -280,15 +246,11 @@ void LLEventNotifier::load(const LLSD& event_options) substitution["datetime"] = date; LLStringUtil::format(dateStr, substitution); - //add(response["event_id"].asInteger(), response["event_date_ut"], dateStr, response["event_name"].asString()); - LLEventStruct event(response["event_id"].asInteger(), response["event_date_ut"], dateStr, response["event_name"].asString()); - add(event); + add(response["event_id"].asInteger(), response["event_date_ut"], dateStr, response["event_name"].asString()); } else { - //add(response["event_id"].asInteger(), response["event_date_ut"], response["event_date"].asString(), response["event_name"].asString()); - LLEventStruct event(response["event_id"].asInteger(), response["event_date_ut"], response["event_date"].asString(), response["event_name"].asString()); - add(event); + add(response["event_id"].asInteger(), response["event_date_ut"], response["event_date"].asString(), response["event_name"].asString()); } } } @@ -322,21 +284,67 @@ void LLEventNotifier::remove(const U32 event_id) void LLEventNotifier::serverPushRequest(U32 event_id, bool add) { // Push up a message to tell the server we have this notification. - gMessageSystem->newMessageFast(add ? _PREHASH_EventNotificationAddRequest : _PREHASH_EventNotificationRemoveRequest); + gMessageSystem->newMessage(add?"EventNotificationAddRequest":"EventNotificationRemoveRequest"); gMessageSystem->nextBlockFast(_PREHASH_AgentData); gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - gMessageSystem->nextBlockFast(_PREHASH_EventData); - gMessageSystem->addU32Fast(_PREHASH_EventID, event_id); + gMessageSystem->nextBlock("EventData"); + gMessageSystem->addU32("EventID", event_id); gAgent.sendReliableMessage(); } +void LLEventInfo::unpack(LLMessageSystem* msg) +{ + U32 event_id; + msg->getU32("EventData", "EventID", event_id); + mID = event_id; + + msg->getString("EventData", "Name", mName); + + msg->getString("EventData", "Category", mCategoryStr); + + msg->getString("EventData", "Date", mTimeStr); + + U32 duration; + msg->getU32("EventData", "Duration", duration); + mDuration = duration; + + U32 date; + msg->getU32("EventData", "DateUTC", date); + mUnixTime = date; + + msg->getString("EventData", "Desc", mDesc); + + std::string buffer; + msg->getString("EventData", "Creator", buffer); + mRunByID = LLUUID(buffer); + + U32 foo; + msg->getU32("EventData", "Cover", foo); + + mHasCover = foo ? true : false; + if (mHasCover) + { + U32 cover; + msg->getU32("EventData", "Amount", cover); + mCover = cover; + } + + msg->getString("EventData", "SimName", mSimName); + + msg->getVector3d("EventData", "GlobalPos", mPosGlobal); + + // Mature content + U32 event_flags; + msg->getU32("EventData", "EventFlags", event_flags); + mEventFlags = event_flags; +} -LLEventNotification::LLEventNotification(U32 eventId, F64 eventEpoch, std::string eventDateStr, std::string eventName) : +LLEventNotification::LLEventNotification(U32 eventId, F64 eventEpoch, const std::string& eventDateStr, const std::string &eventName) : mEventID(eventId), - mEventName(std::move(eventName)), + mEventName(eventName), mEventDateEpoch(eventEpoch), - mEventDateStr(std::move(eventDateStr)) + mEventDateStr(eventDateStr) { } diff --git a/indra/newview/lleventnotifier.h b/indra/newview/lleventnotifier.h index f013f6d02e..2a9295129d 100644 --- a/indra/newview/lleventnotifier.h +++ b/indra/newview/lleventnotifier.h @@ -27,31 +27,30 @@ #ifndef LL_LLEVENTNOTIFIER_H #define LL_LLEVENTNOTIFIER_H -#include <utility> #include "llframetimer.h" #include "v3dmath.h" class LLEventNotification; class LLMessageSystem; -typedef struct event_st{ - U32 eventId = 0; - F64 eventEpoch = 0.0; - std::string eventDateStr; - std::string eventName; - std::string creator; - std::string category; - std::string desc; - U32 duration = 0; - U32 cover = 0; - U32 amount = 0; - std::string simName; - LLVector3d globalPos; - U32 flags = 0; - event_st(U32 id, F64 epoch, std::string date_str, std::string name) - : eventId(id), eventEpoch(epoch), eventDateStr(std::move(date_str)), eventName(std::move(name)){} - event_st() = default; -} LLEventStruct; +struct LLEventInfo +{ + void unpack(LLMessageSystem* msg); + + std::string mName; + U32 mID; + std::string mDesc; + std::string mCategoryStr; + U32 mDuration; + std::string mTimeStr; + LLUUID mRunByID; + std::string mSimName; + LLVector3d mPosGlobal; + F64 mUnixTime; // seconds from 1970 + BOOL mHasCover; + U32 mCover; + U32 mEventFlags; +}; class LLEventNotifier { @@ -60,8 +59,8 @@ public: virtual ~LLEventNotifier(); void update(); // Notify the user of the event if it's coming up - bool add(const LLEventStruct& event); bool add(U32 eventId, F64 eventEpoch, const std::string& eventDateStr, const std::string &eventName); + bool add(LLEventInfo event); void add(U32 eventId); @@ -76,23 +75,20 @@ public: static void processEventInfoReply(LLMessageSystem *msg, void **); - typedef boost::signals2::signal<bool(LLEventStruct event)> new_event_signal_t; - new_event_signal_t mNewEventSignal; - boost::signals2::connection setNewEventCallback(const new_event_signal_t::slot_type& cb) - { - return mNewEventSignal.connect(cb); - }; + typedef boost::signals2::signal<bool(LLEventInfo event)> info_received_signal_t; + boost::signals2::connection setEventInfoCallback(const info_received_signal_t::slot_type& cb) { return mEventInfoSignal.connect(cb); }; protected: en_map mEventNotifications; - LLFrameTimer mNotificationTimer; + LLFrameTimer mNotificationTimer; + info_received_signal_t mEventInfoSignal; }; class LLEventNotification { public: - LLEventNotification(U32 eventId, F64 eventEpoch, std::string eventDateStr, std::string eventName); + LLEventNotification(U32 eventId, F64 eventEpoch, const std::string& eventDateStr, const std::string &eventName); U32 getEventID() const { return mEventID; } diff --git a/indra/newview/lleventpoll.cpp b/indra/newview/lleventpoll.cpp index c05a7fef44..f1b46f0533 100644 --- a/indra/newview/lleventpoll.cpp +++ b/indra/newview/lleventpoll.cpp @@ -54,15 +54,9 @@ namespace Details void stop(); private: - // We will wait RETRY_SECONDS + (errorCount * RETRY_SECONDS_INC) before retrying after an error. - // This means we attempt to recover relatively quickly but back off giving more time to recover - // until we finally give up after MAX_EVENT_POLL_HTTP_ERRORS attempts. - static const F32 EVENT_POLL_ERROR_RETRY_SECONDS; - static const F32 EVENT_POLL_ERROR_RETRY_SECONDS_INC; - static const S32 MAX_EVENT_POLL_HTTP_ERRORS; - void eventPollCoro(std::string url); + void handleMessage(const std::string& msg_name, const LLSD& body); void handleMessage(const LLSD &content); bool mDone; @@ -76,9 +70,13 @@ namespace Details }; - const F32 LLEventPollImpl::EVENT_POLL_ERROR_RETRY_SECONDS = 15.f; // ~ half of a normal timeout. - const F32 LLEventPollImpl::EVENT_POLL_ERROR_RETRY_SECONDS_INC = 5.f; // ~ half of a normal timeout. - const S32 LLEventPollImpl::MAX_EVENT_POLL_HTTP_ERRORS = 10; // ~5 minutes, by the above rules. + // We will wait RETRY_SECONDS + (errorCount * RETRY_SECONDS_INC) before retrying after an error. + // This means we attempt to recover relatively quickly but back off giving more time to recover + // until we finally give up after MAX_EVENT_POLL_HTTP_ERRORS attempts. + constexpr F32 EVENT_POLL_ERROR_RETRY_SECONDS = 15.f; // ~ half of a normal timeout. + constexpr F32 EVENT_POLL_ERROR_RETRY_SECONDS_INC = 5.f; // ~ half of a normal timeout. + constexpr S32 MAX_EVENT_POLL_HTTP_ERRORS = 10; // ~5 minutes, by the above rules. + constexpr F64 MIN_SECONDS_PASSED = 10.0; // Minimum time we expect the server to hold the request. int LLEventPollImpl::sNextCounter = 1; @@ -93,15 +91,25 @@ namespace Details { LLAppCoreHttp & app_core_http(LLAppViewer::instance()->getAppCoreHttp()); - mHttpRequest = LLCore::HttpRequest::ptr_t(new LLCore::HttpRequest); + mHttpRequest = std::make_shared<LLCore::HttpRequest>(); mHttpPolicy = app_core_http.getPolicy(LLAppCoreHttp::AP_LONG_POLL); mSenderIp = sender.getIPandPort(); } + void LLEventPollImpl::handleMessage(const std::string &msg_name, const LLSD &body) + { + LL_PROFILE_ZONE_SCOPED_CATEGORY_APP; + LLSD message; + message["sender"] = mSenderIp; + message["body"] = body; + + LLMessageSystem::dispatch(msg_name, message); + } + void LLEventPollImpl::handleMessage(const LLSD& content) { LL_PROFILE_ZONE_SCOPED_CATEGORY_APP; - std::string msg_name = content["message"]; + std::string msg_name = content["message"].asString(); LLSD message; message["sender"] = mSenderIp; message["body"] = content["body"]; @@ -139,15 +147,21 @@ namespace Details void LLEventPollImpl::eventPollCoro(std::string url) { - LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("EventPoller", mHttpPolicy)); + LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("EventPoller", mHttpPolicy); LLSD acknowledge; int errorCount = 0; int counter = mCounter; // saved on the stack for logging. + LLTimer message_time; LL_DEBUGS("LLEventPollImpl") << " <" << counter << "> entering coroutine." << LL_ENDL; mAdapter = httpAdapter; + // This is a loop with its own waitToRetry implementation, + // so disable retries. + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); + httpOpts->setRetries(0); + LL::WorkQueue::ptr_t main_queue = nullptr; // HACK -- grab the mainloop workqueue to move execution of the handler @@ -164,11 +178,13 @@ namespace Details request["ack"] = acknowledge; request["done"] = mDone; + message_time.reset(); + // LL_DEBUGS("LLEventPollImpl::eventPollCoro") << "<" << counter << "> request = " // << LLSDXMLStreamer(request) << LL_ENDL; LL_DEBUGS("LLEventPollImpl") << " <" << counter << "> posting and yielding." << LL_ENDL; - LLSD result = httpAdapter->postAndSuspend(mHttpRequest, url, request); + LLSD result = httpAdapter->postAndSuspend(mHttpRequest, url, request, httpOpts); // LL_DEBUGS("LLEventPollImpl::eventPollCoro") << "<" << counter << "> result = " // << LLSDXMLStreamer(result) << LL_ENDL; @@ -181,16 +197,35 @@ namespace Details break; } - LLSD httpResults = result["http_result"]; + LLSD &httpResults = result["http_result"]; LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); if (!status) { - if (status == LLCore::HttpStatus(LLCore::HttpStatus::EXT_CURL_EASY, CURLE_OPERATION_TIMEDOUT)) - { // A standard timeout response we get this when there are no events. - LL_DEBUGS("LLEventPollImpl") << "All is very quiet on target server. It may have gone idle?" << LL_ENDL; - errorCount = 0; - continue; + if (status == LLCore::HttpStatus(LLCore::HttpStatus::EXT_CURL_EASY, CURLE_OPERATION_TIMEDOUT) // A standard timeout, no events. + || status == LLCore::HttpStatus(HTTP_BAD_GATEWAY) // An expected 'No events' case. + || status == LLCore::HttpStatus(HTTP_INTERNAL_ERROR) + || status == LLCore::HttpStatus(HTTP_SERVICE_UNAVAILABLE) + || status == LLCore::HttpStatus(HTTP_GATEWAY_TIME_OUT)) + { + if (message_time.getElapsedSeconds() < MIN_SECONDS_PASSED) + { + // Server is supposed to hold request for 20 to 30 seconds. + // If it didn't hold the request at least for 10s, treat as an error. + LL_WARNS("LLEventPollImpl") << "Response arrived too early, status: " << status.toTerseString() + << ", time passed: " << message_time.getElapsedSeconds() << LL_ENDL; + } + else + { + // Timeout, expected and means 'no events'. Request is to be re-issued immediately. + // Current definition of a timeout is any of : + // - libcurl easy 28 status code + // - Linden 499 special http status code + // - RFC - standard 502 - 504 http status codes + LL_DEBUGS("LLEventPollImpl") << "No events, from: " << mSenderIp <<" status: " << (S32)status.getStatus() << LL_ENDL; + errorCount = 0; + continue; + } } else if ((status == LLCore::HttpStatus(LLCore::HttpStatus::LLCORE, LLCore::HE_OP_CANCELED)) || (status == LLCore::HttpStatus(HTTP_NOT_FOUND))) @@ -198,13 +233,13 @@ namespace Details // some cases the server gets ahead of the viewer and will // return a 404 error (Not Found) before the cancel event // comes back in the queue - LL_WARNS("LLEventPollImpl") << "Canceling coroutine" << LL_ENDL; + LL_WARNS("LLEventPollImpl") << "<" << counter << "> Canceling coroutine, status: " << status.toTerseString() << LL_ENDL; break; } else if (!status.isHttpStatus()) { /// Some LLCore or LIBCurl error was returned. This is unlikely to be recoverable - LL_WARNS("LLEventPollImpl") << "Critical error from poll request returned from libraries. Canceling coroutine." << LL_ENDL; + LL_WARNS("LLEventPollImpl") << "<" << counter << "> Critical error from poll request returned from libraries. Canceling coroutine." << LL_ENDL; break; } LL_WARNS("LLEventPollImpl") << "<" << counter << "> Error result from LLCoreHttpUtil::HttpCoroHandler. Code " @@ -247,6 +282,10 @@ namespace Details LL_WARNS("LLEventPollImpl") << "< " << counter << "> Forcing disconnect due to stalled main region event poll." << LL_ENDL; LLAppViewer::instance()->forceDisconnect(LLTrans::getString("AgentLostConnection")); } + else + { + LL_WARNS("LLEventPollImpl") << "< " << counter << "> Stopping event poll for " << mSenderIp << " due to failures." << LL_ENDL; + } break; } } @@ -263,7 +302,7 @@ namespace Details } acknowledge = result["id"]; - LLSD events = result["events"]; + LLSD &events = result["events"]; if (acknowledge.isUndefined()) { @@ -274,20 +313,37 @@ namespace Details LL_DEBUGS("LLEventPollImpl") << " <" << counter << "> " << events.size() << "events (id " << acknowledge << ")" << LL_ENDL; - LLSD::array_const_iterator i = events.beginArray(); - LLSD::array_const_iterator end = events.endArray(); + LLSD::array_iterator i = events.beginArray(); + LLSD::array_iterator end = events.endArray(); for (; i != end; ++i) { if (i->has("message")) { if (main_queue) - { // shuttle to a sensible spot in the main thread instead + { + // Shuttle copy to a sensible spot in the main thread instead // of wherever this coroutine happens to be executing - const LLSD& msg = *i; - main_queue->post([this, msg]() + + LL::WorkQueue::Work work; + { + // LLSD is too smart for it's own good and may act like a smart + // pointer for the content of (*i), so instead of passing (*i) + // pass a prepared name and move ownership of "body", + // as we are not going to need "body" anywhere else. + std::string msg_name = (*i)["message"].asString(); + + // WARNING: This is a shallow copy! + // If something still retains the data (like in httpAdapter?) this might still + // result in a crash, if it does appear to be the case, make a deep copy or + // convert data to string and pass that string. + const LLSD body = (*i)["body"]; + (*i)["body"].clear(); + work = [this, msg_name, body]() { - handleMessage(msg); - }); + handleMessage(msg_name, body); + }; + } + main_queue->post(work); } else { diff --git a/indra/newview/lleventpoll.h b/indra/newview/lleventpoll.h index bb407b3799..ea186aa803 100644 --- a/indra/newview/lleventpoll.h +++ b/indra/newview/lleventpoll.h @@ -40,7 +40,30 @@ namespace Details class LLEventPoll - ///< implements the viewer side of server-to-viewer pushed events. + ///< Implements the viewer side of server-to-viewer pushed events. + /// + /// This class implements the sole consumer of the EventQueueGet capability + /// and delivers data, including llsd-encoded llmessage payloads, from + /// simulator to viewer. + /// + /// https://wiki.secondlife.com/wiki/EventQueueGet + /// The wiki page is neither complete nor entirely correct. Request timeouts + /// became the de facto method of returning an empty event set to the viewer. + /// But the timeout behavior was never defined. It was simply whatever + /// behavior a given grid implementation implemented. + /// + /// In SL's case, the path may include reverse proxies, http caches, http and + /// socks proxies, transparent hijacking, and other horrors. A pitfall for + /// implementors. + /// + /// Current definition of a timeout is any of : + /// - libcurl easy 28 status code + /// - Linden 499 special http status code + /// - RFC - standard 502 - 504 http status codes + /// If requests are failing too quickly with the above errors, they are treated + /// as actual errors and not an empty payload. These will count towards a final + /// error declaration and can lead to disconnection from a simulator or the + /// entire grid. { public: LLEventPoll(const std::string& pollURL, const LLHost& sender); diff --git a/indra/newview/llexperiencelog.cpp b/indra/newview/llexperiencelog.cpp index ce10fba2ca..b86474c5ca 100644 --- a/indra/newview/llexperiencelog.cpp +++ b/indra/newview/llexperiencelog.cpp @@ -279,6 +279,6 @@ void LLExperienceLog::setNotifyNewEvent( bool val ) } else if( val && !mNotifyConnection.connected()) { - mNotifyConnection = addUpdateSignal(boost::function<void(LLSD&)>(LLExperienceLog::notify)); + mNotifyConnection = addUpdateSignal(std::function<void(LLSD&)>(LLExperienceLog::notify)); } } diff --git a/indra/newview/llexternaleditor.cpp b/indra/newview/llexternaleditor.cpp index 3decd15bbd..cc4e8973c4 100644 --- a/indra/newview/llexternaleditor.cpp +++ b/indra/newview/llexternaleditor.cpp @@ -44,8 +44,26 @@ LLExternalEditor::EErrorCode LLExternalEditor::setCommand(const std::string& env std::string cmd = findCommand(env_var, override); if (cmd.empty()) { - LL_WARNS() << "Editor command is empty or not set" << LL_ENDL; - return EC_NOT_SPECIFIED; + LL_INFOS() << "Editor command is empty or not set, falling back to OS open handler" << LL_ENDL; +#if LL_WINDOWS + std::string os_cmd = LLStringUtil::getenv("SystemRoot", ""); + if (!os_cmd.empty()) + { + os_cmd.append("\\explorer.exe \"%s\""); + } +#elif LL_DARWIN + static const std::string os_cmd = "/usr/bin/open -t \"%s\""; +#elif LL_LINUX + static const std::string os_cmd = "/usr/bin/xdg-open \"%s\""; +#elif __FreeBSD__ + static const std::string os_cmd = "/usr/local/bin/xdg-open \"%s\""; +#endif + cmd = findCommand("", os_cmd); + if (cmd.empty()) + { + LL_WARNS() << "Failed to find OS open handler \"" << cmd << "\"" << LL_ENDL; + return EC_NOT_SPECIFIED; + } } string_vec_t tokens; diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 85f902db8d..d2b862eb58 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -648,7 +648,7 @@ void LLFace::renderOneWireframe(const LLColor4 &color, F32 fogCfx, bool wirefram LLGLEnable offset(GL_POLYGON_OFFSET_LINE); #endif glPolygonOffset(3.f, 3.f); - glLineWidth(5.f); + //glLineWidth(5.f); #if GL_VERSION_1_1 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); #endif @@ -771,9 +771,6 @@ static void xform4a(LLVector4a &tex_coord, const LLVector4a& trans, const LLVect // Texture transforms are done about the center of the face. st.setAdd(tex_coord, trans); - // Handle rotation - LLVector4a rot_st; - // <s0 * cosAng, s0*-sinAng, s1*cosAng, s1*-sinAng> LLVector4a s0; s0.splat(st, 0); @@ -2221,7 +2218,7 @@ bool LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) { LL_PROFILE_ZONE_NAMED_CATEGORY_FACE("calcPixelArea - rigged"); //override with joint volume face joint bounding boxes - LLVOAvatar* avatar = mVObjp->getAvatar(); + LLVOAvatar* avatar = mVObjp.notNull() ? mVObjp->getAvatar() : nullptr; bool hasRiggedExtents = false; if (avatar && avatar->mDrawable) @@ -2258,8 +2255,6 @@ bool LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) if (joint) { - LLVector4a jointPos; - LLMatrix4a worldMat; worldMat.loadu((F32*)&joint->getWorldMatrix().mMatrix[0][0]); diff --git a/indra/newview/llface.h b/indra/newview/llface.h index 65637fbf85..df31e9ea90 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -58,16 +58,8 @@ class alignas(16) LLFace { LL_ALIGN_NEW public: - LLFace(const LLFace& rhs) - { - *this = rhs; - } - - const LLFace& operator=(const LLFace& rhs) - { - LL_ERRS() << "Illegal operation!" << LL_ENDL; - return *this; - } + LLFace(const LLFace& rhs) = delete; + const LLFace& operator=(const LLFace& rhs) = delete; enum EMasks { @@ -127,7 +119,7 @@ public: void setIndexInTex(U32 ch, S32 index) { llassert(ch < LLRender::NUM_TEXTURE_CHANNELS); mIndexInTex[ch] = index; } void setWorldMatrix(const LLMatrix4& mat); - const LLTextureEntry* getTextureEntry() const { return mVObjp->getTE(mTEOffset); } + const LLTextureEntry* getTextureEntry() const { return mVObjp ? mVObjp->getTE(mTEOffset) : nullptr; } LLFacePool* getPool() const { return mDrawPoolp; } U32 getPoolType() const { return mPoolType; } diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index aa2578fec6..ac052d35e4 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -518,7 +518,8 @@ void LLFastTimerView::exportCharts(const std::string& base, const std::string& t //render charts gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - buffer.bindTarget(); + buffer.bindTarget("", 1); + buffer.clear(); for (std::set<std::string>::iterator iter = chart_names.begin(); iter != chart_names.end(); ++iter) { @@ -1057,8 +1058,7 @@ void LLFastTimerView::drawLineGraph() //fatten highlighted timer if (mHoverID == idp) { - gGL.flush(); - glLineWidth(3); + LLRender2D::setLineWidth(3.0); } llassert(idp->getIndex() < sTimerColors.size()); @@ -1118,8 +1118,7 @@ void LLFastTimerView::drawLineGraph() if (mHoverID == idp) { - gGL.flush(); - glLineWidth(1); + LLRender2D::setLineWidth(1.f); } if (idp->getTreeNode().mCollapsed) diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 377710c170..98b3ca820b 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -1395,6 +1395,19 @@ bool LLFavoritesBarCtrl::enableSelected(const LLSD& userdata) { return !LLAgentPicksInfo::getInstance()->isPickLimitReached(); } + else if (param == "copy_slurl" + || param == "show_on_map") + { + LLViewerInventoryItem* item = gInventory.getItem(mSelectedItemID); + if (nullptr == item) + return false; // shouldn't happen as it is selected from existing items + + const LLUUID& asset_id = item->getAssetUUID(); + + // Favorites are supposed to be loaded first, it should be here already + LLLandmark* landmark = gLandmarkList.getAsset(asset_id, NULL /*callback*/); + return nullptr != landmark; + } return false; } @@ -1425,10 +1438,17 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata) LLVector3d posGlobal; LLLandmarkActions::getLandmarkGlobalPos(mSelectedItemID, posGlobal); + // inventory item and asset exist, otherwise + // enableSelected wouldn't have let it get here, + // only need to check location validity if (!posGlobal.isExactlyZero()) { LLLandmarkActions::getSLURLfromPosGlobal(posGlobal, copy_slurl_to_clipboard_cb); } + else + { + LLNotificationsUtil::add("LandmarkLocationUnknown"); + } } else if (action == "show_on_map") { @@ -1437,10 +1457,20 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata) LLVector3d posGlobal; LLLandmarkActions::getLandmarkGlobalPos(mSelectedItemID, posGlobal); - if (!posGlobal.isExactlyZero() && worldmap_instance) + if (worldmap_instance) { - worldmap_instance->trackLocation(posGlobal); - LLFloaterReg::showInstance("world_map", "center"); + // inventory item and asset exist, otherwise + // enableSelected wouldn't have let it get here, + // only need to check location validity + if (!posGlobal.isExactlyZero()) + { + worldmap_instance->trackLocation(posGlobal); + LLFloaterReg::showInstance("world_map", "center"); + } + else + { + LLNotificationsUtil::add("LandmarkLocationUnknown"); + } } } else if (action == "create_pick") diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index 2bbe5e90c6..68443dfc5b 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -30,7 +30,6 @@ #include <fstream> #include <boost/regex.hpp> -#include <boost/assign/list_of.hpp> #include "llfeaturemanager.h" #include "lldir.h" @@ -184,15 +183,15 @@ void LLFeatureList::dump() } } -static const std::vector<std::string> sGraphicsLevelNames = boost::assign::list_of - ("Low") - ("LowMid") - ("Mid") - ("MidHigh") - ("High") - ("HighUltra") - ("Ultra") -; +static const std::vector<std::string> sGraphicsLevelNames = { + "Low", + "LowMid", + "Mid", + "MidHigh", + "High", + "HighUltra", + "Ultra" +}; U32 LLFeatureManager::getMaxGraphicsLevel() const { @@ -404,8 +403,53 @@ F32 logExceptionBenchmark() } #endif +bool checkRDNA35() +{ + // This checks if we're running on an RDNA3.5 GPU. You're only going to see these on AMD's APUs. + // As of driver version 25, we're seeing stalls in some of our queries. + // This appears to be a driver bug, and appears to be specific RDNA3.5 APUs. + // There's multiples of these guys, so we just use this function to check if that GPU is on the list of known RDNA3.5 APUs. + // - Geenz 11/12/2025 + std::array<std::string, 7> rdna35GPUs = { + "8060S", + "8050S", + "8040S", + "860M", + "840M", + "890M", + "880M" + }; + + for (const auto& gpu_name : rdna35GPUs) + { + if (gGLManager.getRawGLString().find(gpu_name) != std::string::npos) + { + LL_WARNS("RenderInit") << "Detected AMD RDNA3.5 GPU (" << gpu_name << ")." << LL_ENDL; + return true; + } + } + + return false; +} + bool LLFeatureManager::loadGPUClass() { + // This is a hack for certain AMD GPUs in newer driver versions on certain APUs. + // These GPUs will show inconsistent freezes when attempting to run shader profiles against them. + // This is extremely problematic as it can lead to: + // - Login freezes + // - Inability to start the client + // - Completely random avatars triggering a freeze + // As a result, we filter out these GPUs for shader profiling. + // - Geenz 11/11/2025 + + if (gGLManager.getRawGLString().find("Radeon") != std::string::npos && checkRDNA35() && gGLManager.mDriverVersionVendorString.find("25.") != std::string::npos) + { + LL_WARNS("RenderInit") << "Detected AMD RDNA3.5 GPU on a known bad driver; disabling benchmark and occlusion culling to prevent freezes." << LL_ENDL; + gSavedSettings.setBOOL("SkipBenchmark", true); + gSavedSettings.setBOOL("UseOcclusion", false); + } + if (!gSavedSettings.getBOOL("SkipBenchmark")) { F32 class1_gbps = gSavedSettings.getF32("RenderClass1MemoryBandwidth"); @@ -451,7 +495,9 @@ bool LLFeatureManager::loadGPUClass() { mGPUClass = GPU_CLASS_2; } - else if (gbps <= class1_gbps*4.f) + else if ((gbps <= class1_gbps*4.f) + // Cap silicon's GPUs at med+ as they have high throughput, low capability + || gGLManager.mIsApple) { mGPUClass = GPU_CLASS_3; } @@ -465,7 +511,7 @@ bool LLFeatureManager::loadGPUClass() } #if LL_WINDOWS - const F32Gigabytes MIN_PHYSICAL_MEMORY(2); + const F32Gigabytes MIN_PHYSICAL_MEMORY(8); LLMemory::updateMemoryInfo(); F32Gigabytes physical_mem = LLMemory::getMaxMemKB(); diff --git a/indra/newview/llfeaturemanager.h b/indra/newview/llfeaturemanager.h index 22de6afbae..d04b89cb60 100644 --- a/indra/newview/llfeaturemanager.h +++ b/indra/newview/llfeaturemanager.h @@ -123,6 +123,7 @@ public: S32 getVersion() const { return mTableVersion; } void setSafe(const bool safe) { mSafe = safe; } bool isSafe() const { return mSafe; } + bool skipProfiling() const { return mSkipProfiling; } LLFeatureList *findMask(const std::string& name); bool maskFeatures(const std::string& name); @@ -170,6 +171,7 @@ protected: F32 mExpectedGLVersion; //expected GL version according to gpu table std::string mGPUString; bool mGPUSupported; + bool mSkipProfiling = false; }; inline diff --git a/indra/newview/llfetchedgltfmaterial.cpp b/indra/newview/llfetchedgltfmaterial.cpp index c2821d56d6..a05f725673 100644 --- a/indra/newview/llfetchedgltfmaterial.cpp +++ b/indra/newview/llfetchedgltfmaterial.cpp @@ -199,6 +199,7 @@ bool LLFetchedGLTFMaterial::replaceLocalTexture(const LLUUID& tracking_id, const { mTrackingIdToLocalTexture.erase(tracking_id); } + updateLocalTexDataDigest(); return res; } @@ -221,6 +222,14 @@ void LLFetchedGLTFMaterial::updateTextureTracking() } } +void LLFetchedGLTFMaterial::clearFetchedTextures() +{ + mBaseColorTexture = nullptr; + mNormalTexture = nullptr; + mMetallicRoughnessTexture = nullptr; + mEmissiveTexture = nullptr; +} + void LLFetchedGLTFMaterial::materialBegin() { llassert(!mFetching); diff --git a/indra/newview/llfetchedgltfmaterial.h b/indra/newview/llfetchedgltfmaterial.h index 4a33b9f05f..074e3fef41 100644 --- a/indra/newview/llfetchedgltfmaterial.h +++ b/indra/newview/llfetchedgltfmaterial.h @@ -67,6 +67,7 @@ public: LLPointer<LLViewerFetchedTexture> mNormalTexture; LLPointer<LLViewerFetchedTexture> mMetallicRoughnessTexture; LLPointer<LLViewerFetchedTexture> mEmissiveTexture; + void clearFetchedTextures(); std::set<LLTextureEntry*> mTextureEntires; diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index 2516bece8d..d26a3784a2 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -64,7 +64,7 @@ LLFilePicker LLFilePicker::sInstance; #define XML_FILTER L"XML files (*.xml)\0*.xml\0" #define SLOBJECT_FILTER L"Objects (*.slobject)\0*.slobject\0" #define RAW_FILTER L"RAW files (*.raw)\0*.raw\0" -#define MODEL_FILTER L"Model files (*.dae)\0*.dae\0" +#define MODEL_FILTER L"Model files (*.dae, *.gltf, *.glb)\0*.dae;*.gltf;*.glb\0" #define MATERIAL_FILTER L"GLTF Files (*.gltf; *.glb)\0*.gltf;*.glb\0" #define HDRI_FILTER L"HDRI Files (*.exr)\0*.exr\0" #define MATERIAL_TEXTURES_FILTER L"GLTF Import (*.gltf; *.glb; *.tga; *.bmp; *.jpg; *.jpeg; *.png)\0*.gltf;*.glb;*.tga;*.bmp;*.jpg;*.jpeg;*.png\0" @@ -222,6 +222,8 @@ bool LLFilePicker::setupFilter(ELoadFilter filter) break; case FFLOAD_MODEL: mOFN.lpstrFilter = MODEL_FILTER \ + COLLADA_FILTER \ + MATERIAL_FILTER \ L"\0"; break; case FFLOAD_MATERIAL: @@ -290,7 +292,7 @@ bool LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking) success = GetOpenFileName(&mOFN); if (success) { - std::string filename = utf16str_to_utf8str(llutf16string(mFilesW)); + std::string filename = ll_convert<std::string>(std::wstring(mFilesW)); mFiles.push_back(filename); } @@ -356,7 +358,7 @@ bool LLFilePicker::getMultipleOpenFiles(ELoadFilter filter, bool blocking) // lengths. if( wcslen(mOFN.lpstrFile) > mOFN.nFileOffset ) /*Flawfinder: ignore*/ { - std::string filename = utf16str_to_utf8str(llutf16string(mFilesW)); + std::string filename = ll_convert<std::string>(std::wstring(mFilesW)); mFiles.push_back(filename); } else @@ -370,7 +372,7 @@ bool LLFilePicker::getMultipleOpenFiles(ELoadFilter filter, bool blocking) break; if (*tptrw == 0) tptrw++; // shouldn't happen? - std::string filename = utf16str_to_utf8str(llutf16string(tptrw)); + std::string filename = ll_convert<std::string>(std::wstring(tptrw)); if (dirname.empty()) dirname = filename + "\\"; else @@ -416,7 +418,7 @@ bool LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename, mOFN.lpstrFile = mFilesW; if (!filename.empty()) { - llutf16string tstring = utf8str_to_utf16str(filename); + std::wstring tstring = ll_convert<std::wstring>(filename); wcsncpy(mFilesW, tstring.c_str(), FILENAME_BUFFER_SIZE); } /*Flawfinder: ignore*/ else { @@ -598,7 +600,7 @@ bool LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename, success = GetSaveFileName(&mOFN); if (success) { - std::string filename = utf16str_to_utf8str(llutf16string(mFilesW)); + std::string filename = ll_convert<std::string>(std::wstring(mFilesW)); mFiles.push_back(filename); } } @@ -676,6 +678,8 @@ std::unique_ptr<std::vector<std::string>> LLFilePicker::navOpenFilterProc(ELoadF case FFLOAD_HDRI: allowedv->push_back("exr"); case FFLOAD_MODEL: + allowedv->push_back("gltf"); + allowedv->push_back("glb"); case FFLOAD_COLLADA: allowedv->push_back("dae"); break; diff --git a/indra/newview/llfilepicker_mac.h b/indra/newview/llfilepicker_mac.h index 77cc8540bc..d0374c5a08 100644 --- a/indra/newview/llfilepicker_mac.h +++ b/indra/newview/llfilepicker_mac.h @@ -42,6 +42,9 @@ std::unique_ptr<std::vector<std::string>> doLoadDialog(const std::vector<std::string>* allowed_types, unsigned int flags); +// doLoadDialogModeless if window does not exists creates a modeless +// window, if it does exist, creates a 'sheet' that does not block +// thread but blocks window interractions void doLoadDialogModeless(const std::vector<std::string>* allowed_types, unsigned int flags, void (*callback)(bool, std::vector<std::string>&, void*), diff --git a/indra/newview/llfilepicker_mac.mm b/indra/newview/llfilepicker_mac.mm index b21bc724fb..6921cd6101 100644 --- a/indra/newview/llfilepicker_mac.mm +++ b/indra/newview/llfilepicker_mac.mm @@ -1,25 +1,25 @@ -/** +/** * @file llfilepicker_mac.cpp * @brief OS-specific file picker * * $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$ */ @@ -32,15 +32,15 @@ NSOpenPanel *init_panel(const std::vector<std::string>* allowed_types, unsigned int flags) { int i; - + NSOpenPanel *panel = [NSOpenPanel openPanel]; NSMutableArray *fileTypes = nil; - - + + if ( allowed_types && !allowed_types->empty()) { fileTypes = [[NSMutableArray alloc] init]; - + for (i=0;i<allowed_types->size();++i) { [fileTypes addObject: @@ -48,7 +48,7 @@ NSOpenPanel *init_panel(const std::vector<std::string>* allowed_types, unsigned encoding:[NSString defaultCStringEncoding]]]; } } - + //[panel setMessage:@"Import one or more files or directories."]; [panel setAllowsMultipleSelection: ( (flags & F_MULTIPLE)?true:false ) ]; [panel setCanChooseDirectories: ( (flags & F_DIRECTORY)?true:false ) ]; @@ -56,7 +56,7 @@ NSOpenPanel *init_panel(const std::vector<std::string>* allowed_types, unsigned [panel setResolvesAliases: true]; [panel setCanChooseFiles: ( (flags & F_FILE)?true:false )]; [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ]; - + if (fileTypes) { [panel setAllowedFileTypes:fileTypes]; @@ -77,7 +77,7 @@ std::unique_ptr<std::vector<std::string>> doLoadDialog(const std::vector<std::st std::unique_ptr<std::vector<std::string>> outfiles; @autoreleasepool - { + { int result; //Aura TODO: We could init a small window and release it at the end of this routine //for a modeless interface. @@ -85,17 +85,17 @@ std::unique_ptr<std::vector<std::string>> doLoadDialog(const std::vector<std::st NSOpenPanel *panel = init_panel(allowed_types,flags); result = [panel runModal]; - - if (result == NSOKButton) + + if (result == NSModalResponseOK) { NSArray *filesToOpen = [panel URLs]; int i, count = [filesToOpen count]; - + if (count > 0) { outfiles.reset(new std::vector<std::string>); } - + for (i=0; i<count; i++) { NSString *aFile = [[filesToOpen objectAtIndex:i] path]; std::string afilestr = std::string([aFile UTF8String]); @@ -113,43 +113,78 @@ void doLoadDialogModeless(const std::vector<std::string>* allowed_types, { @autoreleasepool - { - // Note: might need to return and save this panel - // so that it does not close immediately + { NSOpenPanel *panel = init_panel(allowed_types,flags); - - [panel beginWithCompletionHandler:^(NSModalResponse result) + NSWindow *mainWindow = [NSApp mainWindow]; + + if (mainWindow) { - std::vector<std::string> outfiles; - if (result == NSModalResponseOK) + [panel beginSheetModalForWindow:mainWindow + completionHandler:^(NSModalResponse result) { - NSArray *filesToOpen = [panel URLs]; - int i, count = [filesToOpen count]; - - if (count > 0) + std::vector<std::string> outfiles; + if (result == NSModalResponseOK) { - - for (i=0; i<count; i++) { - NSString *aFile = [[filesToOpen objectAtIndex:i] path]; - std::string *afilestr = new std::string([aFile UTF8String]); - outfiles.push_back(*afilestr); + NSArray *filesToOpen = [panel URLs]; + int i, count = [filesToOpen count]; + + if (count > 0) + { + + for (i=0; i<count; i++) { + NSString *aFile = [[filesToOpen objectAtIndex:i] path]; + std::string *afilestr = new std::string([aFile UTF8String]); + outfiles.push_back(*afilestr); + } + callback(true, outfiles, userdata); + } + else // no valid result + { + callback(false, outfiles, userdata); } - callback(true, outfiles, userdata); } - else // no valid result + else // cancel { callback(false, outfiles, userdata); } - } - else // cancel + }]; + } + else + { + //present as modeless window + [panel beginWithCompletionHandler:^(NSModalResponse result) { - callback(false, outfiles, userdata); - } - }]; + std::vector<std::string> outfiles; + if (result == NSModalResponseOK) + { + NSArray *filesToOpen = [panel URLs]; + int i, count = [filesToOpen count]; + + if (count > 0) + { + + for (i=0; i<count; i++) { + NSString *aFile = [[filesToOpen objectAtIndex:i] path]; + std::string *afilestr = new std::string([aFile UTF8String]); + outfiles.push_back(*afilestr); + } + callback(true, outfiles, userdata); + } + else // no valid result + { + callback(false, outfiles, userdata); + } + } + else // cancel + { + callback(false, outfiles, userdata); + } + }]; + } } } -std::unique_ptr<std::string> doSaveDialog(const std::string* file, +std::unique_ptr<std::string> doSaveDialog(const std::string* file, const std::string* type, const std::string* creator, const std::string* extension, @@ -157,23 +192,23 @@ std::unique_ptr<std::string> doSaveDialog(const std::string* file, { std::unique_ptr<std::string> outfile; @autoreleasepool - { + { NSSavePanel *panel = [NSSavePanel savePanel]; - + NSString *extensionns = [NSString stringWithCString:extension->c_str() encoding:[NSString defaultCStringEncoding]]; NSArray *fileType = [extensionns componentsSeparatedByString:@","]; - + //[panel setMessage:@"Save Image File"]; [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ]; [panel setCanSelectHiddenExtension:true]; [panel setAllowedFileTypes:fileType]; NSString *fileName = [NSString stringWithCString:file->c_str() encoding:[NSString defaultCStringEncoding]]; - + NSURL* url = [NSURL fileURLWithPath:fileName]; [panel setNameFieldStringValue: fileName]; [panel setDirectoryURL: url]; if([panel runModal] == - NSFileHandlingPanelOKButton) + NSModalResponseOK) { NSURL* url = [panel URL]; NSString* p = [url path]; @@ -193,39 +228,39 @@ void doSaveDialogModeless(const std::string* file, void *userdata) { @autoreleasepool { - NSSavePanel *panel = [NSSavePanel savePanel]; - - NSString *extensionns = [NSString stringWithCString:extension->c_str() encoding:[NSString defaultCStringEncoding]]; - NSArray *fileType = [extensionns componentsSeparatedByString:@","]; - - //[panel setMessage:@"Save Image File"]; - [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ]; - [panel setCanSelectHiddenExtension:true]; - [panel setAllowedFileTypes:fileType]; - NSString *fileName = [NSString stringWithCString:file->c_str() encoding:[NSString defaultCStringEncoding]]; - - NSURL* url = [NSURL fileURLWithPath:fileName]; - [panel setNameFieldStringValue: fileName]; - [panel setDirectoryURL: url]; - - - [panel beginWithCompletionHandler:^(NSModalResponse result) - { - if (result == NSOKButton) - { - NSURL* url = [panel URL]; - NSString* p = [url path]; - std::string outfile([p UTF8String]); - - callback(true, outfile, userdata); - } - else // cancel - { - std::string outfile; - callback(false, outfile, userdata); - } - }]; - } + NSSavePanel *panel = [NSSavePanel savePanel]; + + NSString *extensionns = [NSString stringWithCString:extension->c_str() encoding:[NSString defaultCStringEncoding]]; + NSArray *fileType = [extensionns componentsSeparatedByString:@","]; + + //[panel setMessage:@"Save Image File"]; + [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ]; + [panel setCanSelectHiddenExtension:true]; + [panel setAllowedFileTypes:fileType]; + NSString *fileName = [NSString stringWithCString:file->c_str() encoding:[NSString defaultCStringEncoding]]; + + NSURL* url = [NSURL fileURLWithPath:fileName]; + [panel setNameFieldStringValue: fileName]; + [panel setDirectoryURL: url]; + + + [panel beginWithCompletionHandler:^(NSModalResponse result) + { + if (result == NSModalResponseOK) + { + NSURL* url = [panel URL]; + NSString* p = [url path]; + std::string outfile([p UTF8String]); + + callback(true, outfile, userdata); + } + else // cancel + { + std::string outfile; + callback(false, outfile, userdata); + } + }]; + } } #endif diff --git a/indra/newview/llfloater360capture.cpp b/indra/newview/llfloater360capture.cpp index ff30c83f51..95e7b9af41 100644 --- a/indra/newview/llfloater360capture.cpp +++ b/indra/newview/llfloater360capture.cpp @@ -33,6 +33,7 @@ #include "llagentui.h" #include "llbase64.h" #include "llcallbacklist.h" +#include "lldate.h" #include "llenvironment.h" #include "llimagejpeg.h" #include "llmediactrl.h" @@ -692,7 +693,15 @@ void LLFloater360Capture::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent ); // execute the command on the page - mWebBrowser->getMediaPlugin()->executeJavaScript(cmd); + LLPluginClassMedia* plugin = mWebBrowser->getMediaPlugin(); + if (plugin) + { + plugin->executeJavaScript(cmd); + } + else + { + LL_WARNS("360Capture") << "No media plugin found" << LL_ENDL; + } } } break; @@ -707,7 +716,7 @@ void LLFloater360Capture::onSaveLocalBtn() { // region name and URL std::string region_name; // no sensible default - std::string region_url("http://secondlife.com"); + std::string region_url("https://secondlife.com"); LLViewerRegion* region = gAgent.getRegion(); if (region) { @@ -773,7 +782,15 @@ void LLFloater360Capture::onSaveLocalBtn() // send it to the browser instance, triggering the equirectangular capture // process and complimentary offer to save the image - mWebBrowser->getMediaPlugin()->executeJavaScript(cmd); + LLPluginClassMedia* plugin = mWebBrowser->getMediaPlugin(); + if (plugin) + { + plugin->executeJavaScript(cmd); + } + else + { + LL_WARNS("360Capture") << "No media plugin found" << LL_ENDL; + } } // We capture all 6 images sequentially and if parts of the world are moving @@ -863,15 +880,7 @@ const std::string LLFloater360Capture::generate_proposed_filename() filename << "_"; // add in the current HH-MM-SS (with leading 0's) so users can easily save many shots in same folder - std::time_t cur_epoch = std::time(nullptr); - std::tm* tm_time = std::localtime(&cur_epoch); - filename << std::setfill('0') << std::setw(4) << (tm_time->tm_year + 1900); - filename << std::setfill('0') << std::setw(2) << (tm_time->tm_mon + 1); - filename << std::setfill('0') << std::setw(2) << tm_time->tm_mday; - filename << "_"; - filename << std::setfill('0') << std::setw(2) << tm_time->tm_hour; - filename << std::setfill('0') << std::setw(2) << tm_time->tm_min; - filename << std::setfill('0') << std::setw(2) << tm_time->tm_sec; + filename << LLDate::now().toLocalDateString("%Y%m%d_%H%M%S"); // the unusual way we save the output image (originates in the // embedded browser and not the C++ code) means that the system diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index a6419f5ad4..05f6c4a867 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -105,7 +105,7 @@ private: static const std::string sCheckUpdateListenerName; static void startFetchServerReleaseNotes(); - static void fetchServerReleaseNotesCoro(const std::string& cap_url); + static void fetchServerReleaseNotesCoro(const std::string cap_url); static void handleServerReleaseNotes(LLSD results); }; @@ -227,12 +227,12 @@ void LLFloaterAbout::startFetchServerReleaseNotes() } /*static*/ -void LLFloaterAbout::fetchServerReleaseNotesCoro(const std::string& cap_url) +void LLFloaterAbout::fetchServerReleaseNotesCoro(const std::string cap_url) { LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("fetchServerReleaseNotesCoro", LLCore::HttpRequest::DEFAULT_POLICY_ID)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("fetchServerReleaseNotesCoro", LLCore::HttpRequest::DEFAULT_POLICY_ID); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); httpOpts->setWantHeaders(true); httpOpts->setFollowRedirects(false); diff --git a/indra/newview/llfloaterautoreplacesettings.cpp b/indra/newview/llfloaterautoreplacesettings.cpp index 99f24e161e..d93bd624f5 100644 --- a/indra/newview/llfloaterautoreplacesettings.cpp +++ b/indra/newview/llfloaterautoreplacesettings.cpp @@ -422,7 +422,13 @@ bool LLFloaterAutoReplaceSettings::callbackNewListName(const LLSD& notification, LLSD newList = notification["payload"]["list"]; - if ( response.has("listname") && response["listname"].isString() ) + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if (option != 1) // Must also match RenameAutoReplaceList + { + // user cancelled + return false; + } + else if (response.has("listname") && response["listname"].isString() ) { std::string newName = response["listname"].asString(); LLAutoReplaceSettings::setListName(newList, newName); @@ -508,12 +514,53 @@ bool LLFloaterAutoReplaceSettings::callbackListNameConflict(const LLSD& notifica return false; } +bool LLFloaterAutoReplaceSettings::callbackRemoveList(const LLSD& notification, const LLSD& response) +{ + std::string listName = notification["payload"]["list"]; + + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + switch (option) + { + case 1: + if (mSettings.removeReplacementList(listName)) + { + LL_INFOS("AutoReplace") << "deleted list '" << listName << "'" << LL_ENDL; + mReplacementsList->deleteSelectedItems(); // remove from the scrolling list + mSelectedListName.clear(); + updateListNames(); + updateListNamesControls(); + updateReplacementsList(); + } + break; + case 0: + break; + + default: + LL_ERRS("AutoReplace") << "invalid selected option " << option << LL_ENDL; + } + + return false; +} + void LLFloaterAutoReplaceSettings::onDeleteList() { std::string listName = mListNames->getSelectedValue().asString(); if ( ! listName.empty() ) { - if ( mSettings.removeReplacementList(listName) ) + const LLSD* mappings = mSettings.getListEntries(mSelectedListName); + if (mappings->size() > 0) + { + LLSD payload; + payload["list"] = listName; + + LLSD args; + args["MAP_SIZE"] = llformat("%d",mappings->size()); + args["LIST_NAME"] = listName; + + LLNotificationsUtil::add("RemoveAutoReplaceList", args, payload, + boost::bind(&LLFloaterAutoReplaceSettings::callbackRemoveList, this, _1, _2)); + } + else if ( mSettings.removeReplacementList(listName) ) { LL_INFOS("AutoReplace")<<"deleted list '"<<listName<<"'"<<LL_ENDL; mReplacementsList->deleteSelectedItems(); // remove from the scrolling list diff --git a/indra/newview/llfloaterautoreplacesettings.h b/indra/newview/llfloaterautoreplacesettings.h index 94a7c00c15..1a8068ab7c 100644 --- a/indra/newview/llfloaterautoreplacesettings.h +++ b/indra/newview/llfloaterautoreplacesettings.h @@ -105,6 +105,8 @@ private: bool callbackNewListName(const LLSD& notification, const LLSD& response); /// called from the RenameAutoReplaceList notification dialog bool callbackListNameConflict(const LLSD& notification, const LLSD& response); + /// called from the RemoveAutoReplaceList notification dialog + bool callbackRemoveList(const LLSD& notification, const LLSD& response); bool selectedListIsFirst(); bool selectedListIsLast(); diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index 08a54b7369..c7851013c7 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -34,6 +34,7 @@ #include "llfloaterreg.h" #include "llimview.h" // for gIMMgr #include "lltooldraganddrop.h" // for LLToolDragAndDrop +#include "lltrans.h" #include "llviewercontrol.h" #include "llviewerregion.h" // getCapability() #include "llworld.h" @@ -405,15 +406,50 @@ bool LLFloaterAvatarPicker::visibleItemsSelected() const } /*static*/ -void LLFloaterAvatarPicker::findCoro(std::string url, LLUUID queryID, std::string name) +void LLFloaterAvatarPicker::findByIdCoro(std::string url, LLUUID query_id, LLUUID agent_id, std::string floater_key) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("genericPostCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("findByIdCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); - LL_INFOS("HttpCoroutineAdapter", "genericPostCoro") << "Generic POST for " << url << LL_ENDL; + httpOpts->setTimeout(AVATAR_PICKER_SEARCH_TIMEOUT); + + LLSD result = httpAdapter->getAndSuspend(httpRequest, url, httpOpts); + + LL_DEBUGS("Agent") << result << LL_ENDL; + + LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; + LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); + + if (status || (status == LLCore::HttpStatus(HTTP_BAD_REQUEST))) + { + result.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS); + } + else + { + result["failure_reason"] = status.toString(); + } + + LLFloaterAvatarPicker* floater = + LLFloaterReg::findTypedInstance<LLFloaterAvatarPicker>("avatar_picker", floater_key); + if (floater) + { + floater->processResponse(query_id, result); + } +} + +/*static*/ +void LLFloaterAvatarPicker::findByNameCoro(std::string url, LLUUID queryID, std::string name) +{ + LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); + LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("findByNameCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); + + LL_INFOS("HttpCoroutineAdapter", "genericPostCoro", "Agent") << "Generic POST for " << url << LL_ENDL; httpOpts->setTimeout(AVATAR_PICKER_SEARCH_TIMEOUT); @@ -447,6 +483,7 @@ void LLFloaterAvatarPicker::find() std::string text = getChild<LLUICtrl>("Edit")->getValue().asString(); + LLUUID agent_id; size_t separator_index = text.find_first_of(" ._"); if (separator_index != text.npos) { @@ -458,51 +495,92 @@ void LLFloaterAvatarPicker::find() text = first; } } + else if (!text.empty()) + { + agent_id.set(text); + } mQueryID.generate(); + mNumResultsReturned = 0; - std::string url; - url.reserve(128); // avoid a memory allocation or two + getChild<LLScrollListCtrl>("SearchResults")->deleteAllItems(); + getChild<LLScrollListCtrl>("SearchResults")->setCommentText(getString("searching")); + getChildView("ok_btn")->setEnabled(false); - LLViewerRegion* region = gAgent.getRegion(); - if(region) + if (agent_id.notNull()) { - url = region->getCapability("AvatarPickerSearch"); - // Prefer use of capabilities to search on both SLID and display name - if (!url.empty()) + // Search by uuid + // While cache could have been nicer, it neither has a failure callback, nor + // can cleanup in case of an invalid uuid. So we go directly to the capability. + LLViewerRegion* region = gAgent.getRegion(); + if (region) { - // capability urls don't end in '/', but we need one to parse - // query parameters correctly - if (url.size() > 0 && url[url.size()-1] != '/') + std::string url; + url.reserve(128); + url = region->getCapability("GetDisplayNames"); + if (!url.empty()) { - url += "/"; - } - url += "?page_size=100&names="; - std::replace(text.begin(), text.end(), '.', ' '); - url += LLURI::escape(text); - LL_INFOS() << "avatar picker " << url << LL_ENDL; + // capability urls don't end in '/', but we need one to parse + // query parameters correctly + if (url[url.size() - 1] != '/') + { + url += "/"; + } + url += "?ids="; + url += agent_id.asString(); + LL_DEBUGS("Agent") << "avatar picker " << url << LL_ENDL; - LLCoros::instance().launch("LLFloaterAvatarPicker::findCoro", - boost::bind(&LLFloaterAvatarPicker::findCoro, url, mQueryID, getKey().asString())); + LLCoros::instance().launch("LLFloaterAvatarPicker::findCoro", + boost::bind(&LLFloaterAvatarPicker::findByIdCoro, url, mQueryID, agent_id, getKey().asString())); + } + else + { + LLSD content; + content["failure_reason"] = LLTrans::getString("ServerUnavailable"); + processResponse(mQueryID, content); + } } - else + } + else + { + std::string url; + url.reserve(128); // avoid a memory allocation or two + + LLViewerRegion* region = gAgent.getRegion(); + if (region) { - LLMessageSystem* msg = gMessageSystem; - msg->newMessage("AvatarPickerRequest"); - msg->nextBlock("AgentData"); - msg->addUUID("AgentID", gAgent.getID()); - msg->addUUID("SessionID", gAgent.getSessionID()); - msg->addUUID("QueryID", mQueryID); // not used right now - msg->nextBlock("Data"); - msg->addString("Name", text); - gAgent.sendReliableMessage(); + url = region->getCapability("AvatarPickerSearch"); + // Prefer use of capabilities to search on both SLID and display name + if (!url.empty()) + { + // capability urls don't end in '/', but we need one to parse + // query parameters correctly + if (url.size() > 0 && url[url.size() - 1] != '/') + { + url += "/"; + } + url += "?page_size=100&names="; + std::replace(text.begin(), text.end(), '.', ' '); + url += LLURI::escape(text); + LL_DEBUGS("Agent") << "avatar picker " << url << LL_ENDL; + + LLCoros::instance().launch("LLFloaterAvatarPicker::findCoro", + boost::bind(&LLFloaterAvatarPicker::findByNameCoro, url, mQueryID, getKey().asString())); + } + else + { + LLMessageSystem* msg = gMessageSystem; + msg->newMessage("AvatarPickerRequest"); + msg->nextBlock("AgentData"); + msg->addUUID("AgentID", gAgent.getID()); + msg->addUUID("SessionID", gAgent.getSessionID()); + msg->addUUID("QueryID", mQueryID); // not used right now + msg->nextBlock("Data"); + msg->addString("Name", text); + gAgent.sendReliableMessage(); + } } } - getChild<LLScrollListCtrl>("SearchResults")->deleteAllItems(); - getChild<LLScrollListCtrl>("SearchResults")->setCommentText(getString("searching")); - - getChildView("ok_btn")->setEnabled(false); - mNumResultsReturned = 0; } void LLFloaterAvatarPicker::setAllowMultiple(bool allow_multiple) diff --git a/indra/newview/llfloateravatarpicker.h b/indra/newview/llfloateravatarpicker.h index 330f1a1226..1761497f83 100644 --- a/indra/newview/llfloateravatarpicker.h +++ b/indra/newview/llfloateravatarpicker.h @@ -43,7 +43,7 @@ public: typedef validate_signal_t::slot_type validate_callback_t; // The callback function will be called with an avatar name and UUID. - typedef boost::function<void (const uuid_vec_t&, const std::vector<LLAvatarName>&)> select_callback_t; + typedef std::function<void(const uuid_vec_t&, const std::vector<LLAvatarName>&)> select_callback_t; // Call this to select an avatar. static LLFloaterAvatarPicker* show(select_callback_t callback, bool allow_multiple = false, @@ -86,7 +86,8 @@ private: void populateFriend(); bool visibleItemsSelected() const; // Returns true if any items in the current tab are selected. - static void findCoro(std::string url, LLUUID mQueryID, std::string mName); + static void findByIdCoro(std::string url, LLUUID query_id, LLUUID agent_id, std::string floater_key); + static void findByNameCoro(std::string url, LLUUID mQueryID, std::string mName); void find(); void setAllowMultiple(bool allow_multiple); LLScrollListCtrl* getActiveList(); diff --git a/indra/newview/llfloateravatar.cpp b/indra/newview/llfloateravatarwelcomepack.cpp index 404316275d..be384bf4d1 100644 --- a/indra/newview/llfloateravatar.cpp +++ b/indra/newview/llfloateravatarwelcomepack.cpp @@ -1,7 +1,7 @@ /** - * @file llfloateravatar.h - * @author Leyla Farazha - * @brief floater for the avatar changer + * @file llfloateravatarwelcomepack.cpp + * @author Callum Prentice (callum@lindenlab.com) + * @brief Floater container for the Avatar Welcome Pack we app * * $LicenseInfo:firstyear=2011&license=viewerlgpl$ * Second Life Viewer Source Code @@ -27,17 +27,18 @@ #include "llviewerprecompiledheaders.h" -#include "llfloateravatar.h" -#include "lluictrlfactory.h" +#include "llfloateravatarwelcomepack.h" #include "llmediactrl.h" +#include "lluictrlfactory.h" +#include "llviewercontrol.h" +#include "llweb.h" - -LLFloaterAvatar::LLFloaterAvatar(const LLSD& key) +LLFloaterAvatarWelcomePack::LLFloaterAvatarWelcomePack(const LLSD& key) : LLFloater(key) { } -LLFloaterAvatar::~LLFloaterAvatar() +LLFloaterAvatarWelcomePack::~LLFloaterAvatarWelcomePack() { if (mAvatarPicker) { @@ -47,15 +48,17 @@ LLFloaterAvatar::~LLFloaterAvatar() } } -bool LLFloaterAvatar::postBuild() +bool LLFloaterAvatarWelcomePack::postBuild() { mAvatarPicker = findChild<LLMediaCtrl>("avatar_picker_contents"); if (mAvatarPicker) { mAvatarPicker->clearCache(); + mAvatarPicker->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL")); + std::string url = gSavedSettings.getString("AvatarWelcomePack"); + url = LLWeb::expandURLSubstitutions(url, LLSD()); + mAvatarPicker->navigateTo(url, HTTP_CONTENT_TEXT_HTML); } - enableResizeCtrls(true, true, false); + return true; } - - diff --git a/indra/newview/llfloateravatarwelcomepack.h b/indra/newview/llfloateravatarwelcomepack.h new file mode 100644 index 0000000000..a332d46708 --- /dev/null +++ b/indra/newview/llfloateravatarwelcomepack.h @@ -0,0 +1,45 @@ +/** + * @file llfloateravatarwelcomepack.h + * @author Callum Prentice (callum@lindenlab.com) + * @brief Floater container for the Avatar Welcome Pack we app + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#pragma once + +#include "llfloater.h" + +class LLMediaCtrl; + +class LLFloaterAvatarWelcomePack: + public LLFloater +{ + friend class LLFloaterReg; + + private: + LLFloaterAvatarWelcomePack(const LLSD& key); + ~LLFloaterAvatarWelcomePack(); + bool postBuild() override; + + LLMediaCtrl* mAvatarPicker; +}; diff --git a/indra/newview/llfloaterbanduration.h b/indra/newview/llfloaterbanduration.h index 4793b524f7..0f8944a56a 100644 --- a/indra/newview/llfloaterbanduration.h +++ b/indra/newview/llfloaterbanduration.h @@ -31,7 +31,7 @@ class LLFloaterBanDuration : public LLFloater { - typedef boost::function<void(const uuid_vec_t&, const S32 duration)> select_callback_t; + typedef std::function<void(const uuid_vec_t&, const S32 duration)> select_callback_t; public: LLFloaterBanDuration(const LLSD& target); diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp index c09c02d32b..74c5079268 100644 --- a/indra/newview/llfloaterbulkpermission.cpp +++ b/indra/newview/llfloaterbulkpermission.cpp @@ -89,9 +89,17 @@ bool LLFloaterBulkPermission::postBuild() { mBulkChangeNextOwnerTransfer = true; } + + mQueueOutputList = getChild<LLScrollListCtrl>("queue output"); return true; } +void LLFloaterBulkPermission::onClose(bool app_quitting) +{ + removeVOInventoryListener(); + LLFloater::onClose(app_quitting); +} + void LLFloaterBulkPermission::doApply() { // Inspects a stream of selected object contents and adds modifiable ones to the given array. @@ -216,7 +224,7 @@ void LLFloaterBulkPermission::onCommitCopy() bool LLFloaterBulkPermission::start() { // note: number of top-level objects to modify is mObjectIDs.size(). - getChild<LLScrollListCtrl>("queue output")->setCommentText(getString("start_text")); + mQueueOutputList->setCommentText(getString("start_text")); return nextObject(); } @@ -239,7 +247,7 @@ bool LLFloaterBulkPermission::nextObject() if(isDone() && !mDone) { - getChild<LLScrollListCtrl>("queue output")->setCommentText(getString("done_text")); + mQueueOutputList->setCommentText(getString("done_text")); mDone = true; } return successful_start; @@ -294,8 +302,6 @@ void LLFloaterBulkPermission::doCheckUncheckAll(bool check) void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, LLInventoryObject::object_list_t* inv) { - LLScrollListCtrl* list = getChild<LLScrollListCtrl>("queue output"); - LLInventoryObject::object_list_t::const_iterator it = inv->begin(); LLInventoryObject::object_list_t::const_iterator end = inv->end(); for ( ; it != end; ++it) @@ -362,7 +368,7 @@ void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, LLInve status_text.setArg("[STATUS]", ""); } - list->setCommentText(status_text.getString()); + mQueueOutputList->setCommentText(status_text.getString()); //TODO if we are an object inside an object we should check a recuse flag and if set //open the inventory of the object and recurse - Michelle2 Zenovka diff --git a/indra/newview/llfloaterbulkpermission.h b/indra/newview/llfloaterbulkpermission.h index 23ca45b611..0b61022e0c 100644 --- a/indra/newview/llfloaterbulkpermission.h +++ b/indra/newview/llfloaterbulkpermission.h @@ -41,7 +41,8 @@ class LLFloaterBulkPermission : public LLFloater, public LLVOInventoryListener friend class LLFloaterReg; public: - bool postBuild(); + bool postBuild() override; + void onClose(bool app_quitting) override; private: @@ -57,7 +58,7 @@ private: /*virtual*/ void inventoryChanged(LLViewerObject* obj, LLInventoryObject::object_list_t* inv, S32 serial_num, - void* queue); + void* queue) override; // This is called by inventoryChanged void handleInventory(LLViewerObject* viewer_obj, @@ -85,7 +86,7 @@ private: private: // UI - LLScrollListCtrl* mMessages; + LLScrollListCtrl* mQueueOutputList = nullptr; LLButton* mCloseBtn; // Object Queue diff --git a/indra/newview/llfloaterbulkupload.cpp b/indra/newview/llfloaterbulkupload.cpp index b898cb28b6..d11e9949f6 100644 --- a/indra/newview/llfloaterbulkupload.cpp +++ b/indra/newview/llfloaterbulkupload.cpp @@ -41,6 +41,7 @@ LLFloaterBulkUpload::LLFloaterBulkUpload(const LLSD& key) mUploadCost = key["upload_cost"].asInteger(); mUploadCount = key["upload_count"].asInteger(); mHas2kTextures = key["has_2k_textures"].asBoolean(); + mDestinationFolderId = key["dest"]; if (key["files"].isArray()) { const LLSD& files = key["files"]; @@ -125,7 +126,7 @@ void LLFloaterBulkUpload::onUpload2KCheckBox() void LLFloaterBulkUpload::onClickUpload() { - do_bulk_upload(mFiles, mAllow2kTextures); + do_bulk_upload(mFiles, mAllow2kTextures, mDestinationFolderId); closeFloater(); } diff --git a/indra/newview/llfloaterbulkupload.h b/indra/newview/llfloaterbulkupload.h index d07dc8eabe..3d3004d84d 100644 --- a/indra/newview/llfloaterbulkupload.h +++ b/indra/newview/llfloaterbulkupload.h @@ -59,6 +59,7 @@ private: std::vector<std::string> mFiles; bool mAllow2kTextures = true; bool mHas2kTextures = false; + LLUUID mDestinationFolderId; S32 mUploadCost = 0; S32 mUploadCount = 0; }; diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp index b94c31ec04..3acf28044c 100644 --- a/indra/newview/llfloaterbvhpreview.cpp +++ b/indra/newview/llfloaterbvhpreview.cpp @@ -118,8 +118,8 @@ std::string STATUS[] = //----------------------------------------------------------------------------- // LLFloaterBvhPreview() //----------------------------------------------------------------------------- -LLFloaterBvhPreview::LLFloaterBvhPreview(const std::string& filename) : - LLFloaterNameDesc(filename) +LLFloaterBvhPreview::LLFloaterBvhPreview(const LLSD& args) : + LLFloaterNameDesc(args) { mLastMouseX = 0; mLastMouseY = 0; @@ -179,7 +179,7 @@ void LLFloaterBvhPreview::setAnimCallbacks() getChild<LLUICtrl>("ease_out_time")->setValidateBeforeCommit( boost::bind(&LLFloaterBvhPreview::validateEaseOut, this, _1)); } -std::map <std::string, std::string> LLFloaterBvhPreview::getJointAliases() +std::map<std::string, std::string, std::less<>> LLFloaterBvhPreview::getJointAliases() { LLPointer<LLVOAvatar> av = (LLVOAvatar*)mAnimPreview->getDummyAvatar(); return av->getJointAliases(); @@ -252,7 +252,7 @@ bool LLFloaterBvhPreview::postBuild() ELoadStatus load_status = E_ST_OK; S32 line_number = 0; - std::map<std::string, std::string> joint_alias_map = getJointAliases(); + auto joint_alias_map = getJointAliases(); loaderp = new LLBVHLoader(file_buffer, load_status, line_number, joint_alias_map); std::string status = getString(STATUS[load_status]); @@ -1021,14 +1021,15 @@ void LLFloaterBvhPreview::onBtnOK(void* userdata) std::string desc = floaterp->getChild<LLUICtrl>("description_form")->getValue().asString(); S32 expected_upload_cost = LLAgentBenefitsMgr::current().getAnimationUploadCost(); - LLResourceUploadInfo::ptr_t assetUploadInfo(new LLResourceUploadInfo( + LLResourceUploadInfo::ptr_t assetUploadInfo = std::make_shared<LLResourceUploadInfo>( floaterp->mTransactionID, LLAssetType::AT_ANIMATION, name, desc, 0, LLFolderType::FT_NONE, LLInventoryType::IT_ANIMATION, LLFloaterPerms::getNextOwnerPerms("Uploads"), LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"), - expected_upload_cost)); + expected_upload_cost, + floaterp->mDestinationFolderId); upload_new_resource(assetUploadInfo); } diff --git a/indra/newview/llfloaterbvhpreview.h b/indra/newview/llfloaterbvhpreview.h index ae64521492..1eb7f686fd 100644 --- a/indra/newview/llfloaterbvhpreview.h +++ b/indra/newview/llfloaterbvhpreview.h @@ -70,7 +70,7 @@ protected: class LLFloaterBvhPreview : public LLFloaterNameDesc { public: - LLFloaterBvhPreview(const std::string& filename); + LLFloaterBvhPreview(const LLSD& args); virtual ~LLFloaterBvhPreview(); bool postBuild(); @@ -108,7 +108,7 @@ public: S32 status, LLExtStat ext_status); private: void setAnimCallbacks() ; - std::map <std::string, std::string> getJointAliases(); + std::map<std::string, std::string, std::less<>> getJointAliases(); protected: diff --git a/indra/newview/llfloaterchatmentionpicker.cpp b/indra/newview/llfloaterchatmentionpicker.cpp new file mode 100644 index 0000000000..a3eb286375 --- /dev/null +++ b/indra/newview/llfloaterchatmentionpicker.cpp @@ -0,0 +1,184 @@ +/** + * @file llfloaterchatmentionpicker.cpp + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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 "llfloaterchatmentionpicker.h" + +#include "llavatarlist.h" +#include "llfloaterimcontainer.h" +#include "llchatmentionhelper.h" +#include "llparticipantlist.h" + +LLUUID LLFloaterChatMentionPicker::sSessionID(LLUUID::null); + +LLFloaterChatMentionPicker::LLFloaterChatMentionPicker(const LLSD& key) +: LLFloater(key), mAvatarList(NULL) +{ + // This floater should hover on top of our dependent (with the dependent having the focus) + setFocusStealsFrontmost(false); + setBackgroundVisible(false); + setAutoFocus(false); +} + +bool LLFloaterChatMentionPicker::postBuild() +{ + mAvatarList = getChild<LLAvatarList>("avatar_list"); + mAvatarList->setShowCompleteName(true, true); + mAvatarList->setFocusOnItemClicked(false); + mAvatarList->setItemClickedCallback([this](LLUICtrl* ctrl, S32 x, S32 y, MASK mask) + { + if (LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(ctrl)) + { + selectResident(item->getAvatarId()); + } + }); + mAvatarList->setRefreshCompleteCallback([this](LLUICtrl* ctrl, const LLSD& param) + { + if (mAvatarList->numSelected() == 0) + { + mAvatarList->selectFirstItem(); + } + }); + + return LLFloater::postBuild(); +} + +void LLFloaterChatMentionPicker::onOpen(const LLSD& key) +{ + buildAvatarList(); + mAvatarList->setNameFilter(key.has("av_name") ? key["av_name"].asString() : ""); + + gFloaterView->adjustToFitScreen(this, false); +} + +uuid_vec_t LLFloaterChatMentionPicker::getParticipantIds() +{ + LLParticipantList* item = dynamic_cast<LLParticipantList*>(LLFloaterIMContainer::getInstance()->getSessionModel(sSessionID)); + if (!item) + { + LL_WARNS() << "Participant list is missing" << LL_ENDL; + return {}; + } + + uuid_vec_t avatar_ids; + LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = item->getChildrenBegin(); + LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = item->getChildrenEnd(); + while (current_participant_model != end_participant_model) + { + LLConversationItem* participant_model = dynamic_cast<LLConversationItem*>((*current_participant_model).get()); + if (participant_model) + { + avatar_ids.push_back(participant_model->getUUID()); + } + current_participant_model++; + } + return avatar_ids; +} + +void LLFloaterChatMentionPicker::buildAvatarList() +{ + uuid_vec_t& avatar_ids = mAvatarList->getIDs(); + avatar_ids = getParticipantIds(); + updateAvatarList(avatar_ids); + mAvatarList->setDirty(); +} + +void LLFloaterChatMentionPicker::selectResident(const LLUUID& id) +{ + if (id.isNull()) + return; + + setValue(stringize("secondlife:///app/agent/", id.asString(), "/mention ")); + onCommit(); + LLChatMentionHelper::instance().hideHelper(); +} + +void LLFloaterChatMentionPicker::onClose(bool app_quitting) +{ + if (!app_quitting) + { + LLChatMentionHelper::instance().hideHelper(); + } +} + +bool LLFloaterChatMentionPicker::handleKey(KEY key, MASK mask, bool called_from_parent) +{ + if (mask == MASK_NONE) + { + switch (key) + { + case KEY_UP: + case KEY_DOWN: + return mAvatarList->handleKey(key, mask, called_from_parent); + case KEY_RETURN: + case KEY_TAB: + selectResident(mAvatarList->getSelectedUUID()); + return true; + case KEY_ESCAPE: + LLChatMentionHelper::instance().hideHelper(); + return true; + case KEY_LEFT: + case KEY_RIGHT: + return true; + default: + break; + } + } + return LLFloater::handleKey(key, mask, called_from_parent); +} + +void LLFloaterChatMentionPicker::goneFromFront() +{ + LLChatMentionHelper::instance().hideHelper(); +} + +void LLFloaterChatMentionPicker::updateSessionID(LLUUID session_id) +{ + sSessionID = session_id; + + LLParticipantList* item = dynamic_cast<LLParticipantList*>(LLFloaterIMContainer::getInstance()->getSessionModel(sSessionID)); + if (!item) + { + LL_WARNS() << "Participant list is missing" << LL_ENDL; + return; + } + + uuid_vec_t avatar_ids = getParticipantIds(); + updateAvatarList(avatar_ids); +} + +void LLFloaterChatMentionPicker::updateAvatarList(uuid_vec_t& avatar_ids) +{ + std::vector<std::string> av_names; + for (auto& id : avatar_ids) + { + LLAvatarName av_name; + LLAvatarNameCache::get(id, &av_name); + av_names.push_back(utf8str_tolower(av_name.getAccountName())); + av_names.push_back(utf8str_tolower(av_name.getDisplayName())); + } + LLChatMentionHelper::instance().updateAvatarList(av_names); +} diff --git a/indra/newview/llfloaterchatmentionpicker.h b/indra/newview/llfloaterchatmentionpicker.h new file mode 100644 index 0000000000..8d221d7a89 --- /dev/null +++ b/indra/newview/llfloaterchatmentionpicker.h @@ -0,0 +1,58 @@ +/** + * @file llfloaterchatmentionpicker.h + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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 LLFLOATERCHATMENTIONPICKER_H +#define LLFLOATERCHATMENTIONPICKER_H + +#include "llfloater.h" + +class LLAvatarList; + +class LLFloaterChatMentionPicker : public LLFloater +{ +public: + LLFloaterChatMentionPicker(const LLSD& key); + + virtual bool postBuild() override; + virtual void goneFromFront() override; + + void buildAvatarList(); + + static uuid_vec_t getParticipantIds(); + static void updateSessionID(LLUUID session_id); + static void updateAvatarList(uuid_vec_t& avatar_ids); + +private: + + void onOpen(const LLSD& key) override; + void onClose(bool app_quitting) override; + virtual bool handleKey(KEY key, MASK mask, bool called_from_parent) override; + void selectResident(const LLUUID& id); + + static LLUUID sSessionID; + LLAvatarList* mAvatarList; +}; + +#endif diff --git a/indra/newview/llfloaterdestinations.cpp b/indra/newview/llfloaterdestinations.cpp index fad9693e8f..84fc4afcdd 100644 --- a/indra/newview/llfloaterdestinations.cpp +++ b/indra/newview/llfloaterdestinations.cpp @@ -28,7 +28,10 @@ #include "llviewerprecompiledheaders.h" #include "llfloaterdestinations.h" +#include "llmediactrl.h" #include "lluictrlfactory.h" +#include "llviewercontrol.h" +#include "llweb.h" LLFloaterDestinations::LLFloaterDestinations(const LLSD& key) @@ -43,6 +46,15 @@ LLFloaterDestinations::~LLFloaterDestinations() bool LLFloaterDestinations::postBuild() { enableResizeCtrls(true, true, false); + LLMediaCtrl* destinations = getChild<LLMediaCtrl>("destination_guide_contents"); + destinations->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL")); + std::string url = gSavedSettings.getString("DestinationGuideURL"); + url = LLWeb::expandURLSubstitutions(url, LLSD()); + destinations->navigateTo(url, HTTP_CONTENT_TEXT_HTML); + + // If cookie is there, will set it now. Otherwise will have to wait for login completion + // which will also update destinations instance if it already exists. + LLViewerMedia::getInstance()->getOpenIDCookie(destinations); return true; } diff --git a/indra/newview/llfloaterdirectory.cpp b/indra/newview/llfloaterdirectory.cpp new file mode 100644 index 0000000000..e062ca7ac6 --- /dev/null +++ b/indra/newview/llfloaterdirectory.cpp @@ -0,0 +1,100 @@ +/** + * @file llfloaterdirectory.cpp + * @brief The legacy "Search" floater + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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 "llfloaterdirectory.h" + +#include "llpaneldirevents.h" +#include "llpaneleventinfo.h" +#include "llpaneldirland.h" +#include "llpaneldirpeople.h" +#include "llpaneldirgroups.h" +#include "llpaneldirplaces.h" +#include "llpaneldirclassified.h" +#include "llpaneldirweb.h" +#include "llscrollbar.h" +#include "llviewercontrol.h" +#include "llpanelavatar.h" +#include "llpanelclassified.h" +#include "llpanelgroup.h" +#include "llpanelplaces.h" +#include "llpanelprofile.h" + +LLFloaterDirectory::LLFloaterDirectory(const std::string& name) +: LLFloater(name), + mPanelAvatarp(nullptr), + mPanelGroupp(nullptr), + mPanelPlacep(nullptr), + mPanelClassifiedp(nullptr), + mPanelEventp(nullptr) +{ +} + +LLFloaterDirectory::~LLFloaterDirectory() +{ +} + +bool LLFloaterDirectory::postBuild() +{ + const std::vector<std::string> panel_names = { + "panel_dir_classified", + "panel_dir_events", + "panel_dir_places", + "panel_dir_land", + "panel_dir_people", + "panel_dir_groups" }; + + for (const std::string& panel_name : panel_names) + { + if (LLPanelDirBrowser* panel_tab = findChild<LLPanelDirBrowser>(panel_name)) + { + panel_tab->setFloaterDirectory(this); + } + } + findChild<LLPanelDirWeb>("panel_dir_web")->setFloaterDirectory(this); + + mPanelAvatarp = findChild<LLPanelProfileSecondLife>("panel_profile_secondlife"); + mPanelAvatarp->setAllowEdit(false); + mPanelGroupp = findChild<LLPanelGroup>("panel_group_info_sidetray"); + mPanelGroupp->hideBackBtn(); + mPanelPlacep = findChild<LLPanelPlaces>("panel_places"); + mPanelPlacep->hideBackBtn(); + mPanelClassifiedp = findChild<LLPanelClassifiedInfo>("panel_classified_info"); + mPanelClassifiedp->setBackgroundVisible(false); + mPanelEventp = findChild<LLPanelEventInfo>("panel_event_info"); + + return true; +} + +void LLFloaterDirectory::hideAllDetailPanels() +{ + if (mPanelAvatarp) mPanelAvatarp->setVisible(false); + if (mPanelGroupp) mPanelGroupp->setVisible(false); + if (mPanelPlacep) mPanelPlacep->setVisible(false); + if (mPanelClassifiedp) mPanelClassifiedp->setVisible(false); + if (mPanelEventp) mPanelEventp->setVisible(false); +} diff --git a/indra/newview/llfloaterdirectory.h b/indra/newview/llfloaterdirectory.h new file mode 100644 index 0000000000..de788443be --- /dev/null +++ b/indra/newview/llfloaterdirectory.h @@ -0,0 +1,81 @@ +/** + * @file llfloaterdirectory.h + * @brief The legacy "Search" floater + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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_LLFLOATERDIRECTORY_H +#define LL_LLFLOATERDIRECTORY_H + +#include "llfloater.h" +#include "lltabcontainer.h" + +#include "llpaneldirevents.h" +#include "llpaneldirland.h" +#include "llpaneldirpeople.h" +#include "llpaneldirgroups.h" +#include "llpaneldirplaces.h" +#include "llpaneldirclassified.h" + +class LLDirectoryCore; +class LLPanelDirBrowser; + +class LLPanelDirAdvanced; +class LLPanelDirClassified; +class LLPanelDirEvents; +class LLPanelDirGroups; +class LLPanelDirLand; +class LLPanelDirPeople; +class LLPanelDirPlaces; + +class LLPanelProfileSecondLife; +class LLPanelEventInfo; +class LLPanelGroup; +class LLPanelPlaces; +class LLPanelClassifiedInfo; + +// Floater to find people, places, things +class LLFloaterDirectory : public LLFloater +{ +public: + LLFloaterDirectory(const std::string& name); + /*virtual*/ ~LLFloaterDirectory(); + + void hideAllDetailPanels(); + + bool postBuild() override; + +public: + LLPanelProfileSecondLife* mPanelAvatarp; + LLPanelEventInfo* mPanelEventp; + LLPanelGroup* mPanelGroupp; + LLPanelPlaces* mPanelPlacep; + LLPanelClassifiedInfo* mPanelClassifiedp; + +private: + static LLFloaterDirectory *sInstance; +}; + +//extern BOOL gDisplayEventHack; + +#endif // LL_LLDIRECTORYFLOATER_H diff --git a/indra/newview/llfloaterdisplayname.cpp b/indra/newview/llfloaterdisplayname.cpp index 236aadfbc1..4843a48e66 100644 --- a/indra/newview/llfloaterdisplayname.cpp +++ b/indra/newview/llfloaterdisplayname.cpp @@ -56,6 +56,7 @@ private: void onCacheSetName(bool success, const std::string& reason, const LLSD& content); + bool mIsLockedOut = false; }; LLFloaterDisplayName::LLFloaterDisplayName(const LLSD& key) : @@ -72,8 +73,8 @@ void LLFloaterDisplayName::onOpen(const LLSD& key) LLAvatarNameCache::get(gAgent.getID(), &av_name); F64 now_secs = LLDate::now().secondsSinceEpoch(); - - if (now_secs < av_name.mNextUpdate) + mIsLockedOut = now_secs < av_name.mNextUpdate; + if (mIsLockedOut) { // ...can't update until some time in the future F64 next_update_local_secs = @@ -167,18 +168,19 @@ void LLFloaterDisplayName::onReset() } getChild<LLUICtrl>("display_name_editor")->setValue(av_name.getUserName()); - if (getChild<LLUICtrl>("display_name_editor")->getEnabled()) + if (mIsLockedOut) { - // UI is enabled, fill the first field - getChild<LLUICtrl>("display_name_confirm")->clear(); - getChild<LLUICtrl>("display_name_confirm")->setFocus(true); + // UI is disabled. + // We should allow resetting even if user already + // set a display name, enable save button + getChild<LLUICtrl>("display_name_confirm")->setValue(av_name.getUserName()); + getChild<LLUICtrl>("save_btn")->setEnabled(true); } else { - // UI is disabled, looks like we should allow resetting - // even if user already set a display name, enable save button - getChild<LLUICtrl>("display_name_confirm")->setValue(av_name.getUserName()); - getChild<LLUICtrl>("save_btn")->setEnabled(true); + // UI is enabled, focus on the confirm field + getChild<LLUICtrl>("display_name_confirm")->clear(); + getChild<LLUICtrl>("display_name_confirm")->setFocus(true); } } diff --git a/indra/newview/llfloatereditenvironmentbase.h b/indra/newview/llfloatereditenvironmentbase.h index 37fda5d33e..41192f3d30 100644 --- a/indra/newview/llfloatereditenvironmentbase.h +++ b/indra/newview/llfloatereditenvironmentbase.h @@ -133,7 +133,8 @@ protected: LLSettingsEditPanel() : LLPanel(), mIsDirty(false), - mOnDirtyChanged() + mOnDirtyChanged(), + mCanEdit(false) {} private: diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp index 42307dd3f8..0a8b8d321d 100644 --- a/indra/newview/llfloatereditextdaycycle.cpp +++ b/indra/newview/llfloatereditextdaycycle.cpp @@ -495,7 +495,6 @@ void LLFloaterEditExtDayCycle::setEditDayCycle(const LLSettingsDay::ptr_t &pday) updateEditEnvironment(); LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_EDIT, LLEnvironment::TRANSITION_INSTANT); - LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_INSTANT); synchronizeTabs(); updateTabs(); refresh(); @@ -824,7 +823,6 @@ void LLFloaterEditExtDayCycle::onClearTrack() updateEditEnvironment(); LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_EDIT, LLEnvironment::TRANSITION_INSTANT); - LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_INSTANT); synchronizeTabs(); updateTabs(); refresh(); diff --git a/indra/newview/llfloateremojipicker.cpp b/indra/newview/llfloateremojipicker.cpp index ffbda0265d..b7f4df874c 100644 --- a/indra/newview/llfloateremojipicker.cpp +++ b/indra/newview/llfloateremojipicker.cpp @@ -377,6 +377,9 @@ void LLFloaterEmojiPicker::initialize() { if (!mHint.empty()) { + // Hack: Trying to open floater, search for a match, + // and hide floater immediately if no match found, + // instead of checking prior to opening hideFloater(); return; } @@ -406,6 +409,12 @@ void LLFloaterEmojiPicker::initialize() return; } + if (!mHint.empty() && getSoundFlags() == LLView::SILENT) + { + // Sounds were supressed + make_ui_sound("UISndWindowOpen"); + } + mGroups->setVisible(true); mPreview->setIcon(nullptr); showPreview(true); @@ -1285,7 +1294,7 @@ void LLFloaterEmojiPicker::saveState() if (!recentlyUsed.empty()) recentlyUsed += ","; char buffer[32]; - sprintf(buffer, "%u", (U32)emoji); + snprintf(buffer, sizeof(buffer), "%u", (U32)emoji); recentlyUsed += buffer; if (!--maxCount) break; @@ -1302,7 +1311,7 @@ void LLFloaterEmojiPicker::saveState() if (!frequentlyUsed.empty()) frequentlyUsed += ","; char buffer[32]; - sprintf(buffer, "%u:%u", (U32)it.first, (U32)it.second); + snprintf(buffer, sizeof(buffer), "%u:%u", (U32)it.first, (U32)it.second); frequentlyUsed += buffer; if (!--maxCount) break; diff --git a/indra/newview/llfloateremojipicker.h b/indra/newview/llfloateremojipicker.h index b807adb67d..88d288b141 100644 --- a/indra/newview/llfloateremojipicker.h +++ b/indra/newview/llfloateremojipicker.h @@ -40,8 +40,8 @@ class LLFloaterEmojiPicker : public LLFloater public: // The callback function will be called with an emoji char. - typedef boost::function<void (llwchar)> pick_callback_t; - typedef boost::function<void ()> close_callback_t; + typedef std::function<void(llwchar)> pick_callback_t; + typedef std::function<void ()> close_callback_t; LLFloaterEmojiPicker(const LLSD& key); diff --git a/indra/newview/llfloaterenvironmentadjust.cpp b/indra/newview/llfloaterenvironmentadjust.cpp index 35f8340997..4825cbf7fb 100644 --- a/indra/newview/llfloaterenvironmentadjust.cpp +++ b/indra/newview/llfloaterenvironmentadjust.cpp @@ -242,9 +242,7 @@ void LLFloaterEnvironmentAdjust::captureCurrentEnvironment() environment.setEnvironment(LLEnvironment::ENV_LOCAL, mLiveSky, FLOATER_ENVIRONMENT_UPDATE); environment.setEnvironment(LLEnvironment::ENV_LOCAL, mLiveWater, FLOATER_ENVIRONMENT_UPDATE); } - environment.setSelectedEnvironment(LLEnvironment::ENV_LOCAL); - environment.updateEnvironment(LLEnvironment::TRANSITION_INSTANT); - + environment.setSelectedEnvironment(LLEnvironment::ENV_LOCAL, LLEnvironment::TRANSITION_INSTANT); } void LLFloaterEnvironmentAdjust::onButtonReset() @@ -258,7 +256,6 @@ void LLFloaterEnvironmentAdjust::onButtonReset() this->closeFloater(); LLEnvironment::instance().clearEnvironment(LLEnvironment::ENV_LOCAL); LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL); - LLEnvironment::instance().updateEnvironment(); } }); @@ -455,9 +452,29 @@ void LLFloaterEnvironmentAdjust::onMoonAzimElevChanged() void LLFloaterEnvironmentAdjust::onCloudMapChanged() { if (!mLiveSky) + { return; - mLiveSky->setCloudNoiseTextureId(getChild<LLTextureCtrl>(FIELD_SKY_CLOUD_MAP)->getValue().asUUID()); - mLiveSky->update(); + } + + LLTextureCtrl* picker_ctrl = getChild<LLTextureCtrl>(FIELD_SKY_CLOUD_MAP); + + LLUUID new_texture_id = picker_ctrl->getValue().asUUID(); + + LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL); + + LLSettingsSky::ptr_t sky_to_set = mLiveSky->buildClone(); + if (!sky_to_set) + { + return; + } + + sky_to_set->setCloudNoiseTextureId(new_texture_id); + + LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, sky_to_set); + + LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_INSTANT, true); + + picker_ctrl->setValue(new_texture_id); } void LLFloaterEnvironmentAdjust::onWaterMapChanged() diff --git a/indra/newview/llfloaterexperiencepicker.h b/indra/newview/llfloaterexperiencepicker.h index 0a001478f1..d0fb611bd4 100644 --- a/indra/newview/llfloaterexperiencepicker.h +++ b/indra/newview/llfloaterexperiencepicker.h @@ -38,9 +38,9 @@ class LLFloaterExperiencePicker : public LLFloater { public: - typedef boost::function<void (const uuid_vec_t&)> select_callback_t; + typedef std::function<void(const uuid_vec_t&)> select_callback_t; // filter function for experiences, return true if the experience should be hidden. - typedef boost::function<bool (const LLSD&)> filter_function; + typedef std::function<bool(const LLSD&)> filter_function; typedef std::vector<filter_function> filter_list; static LLFloaterExperiencePicker* show( select_callback_t callback, const LLUUID& key, bool allow_multiple, bool close_on_select, filter_list filters, LLView * frustumOrigin); diff --git a/indra/newview/llfloaterexperiences.cpp b/indra/newview/llfloaterexperiences.cpp index e79055fdae..999a473a49 100644 --- a/indra/newview/llfloaterexperiences.cpp +++ b/indra/newview/llfloaterexperiences.cpp @@ -171,7 +171,7 @@ void LLFloaterExperiences::onOpen( const LLSD& key ) refreshContents(); return; } - region->setCapabilitiesReceivedCallback(boost::bind(&LLFloaterExperiences::refreshContents, this)); + mCapsReceivedConnection = region->setCapabilitiesReceivedCallback(boost::bind(&LLFloaterExperiences::refreshContents, this)); return; } } @@ -231,6 +231,7 @@ bool LLFloaterExperiences::updatePermissions( const LLSD& permission ) void LLFloaterExperiences::onClose( bool app_quitting ) { + mCapsReceivedConnection.disconnect(); LLEventPumps::instance().obtain("experience_permission").stopListening("LLFloaterExperiences"); LLFloater::onClose(app_quitting); } @@ -365,10 +366,10 @@ void LLFloaterExperiences::retrieveExperienceListCoro(std::string url, { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("retrieveExperienceListCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOptions(new LLCore::HttpOptions); - LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("retrieveExperienceListCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOptions = std::make_shared<LLCore::HttpOptions>(); + LLCore::HttpHeaders::ptr_t httpHeaders = std::make_shared<LLCore::HttpHeaders>(); if (url.empty()) @@ -406,7 +407,7 @@ void LLFloaterExperiences::retrieveExperienceListCoro(std::string url, { const LLSD& ids = result[it->first]; tab->setExperienceList(ids); - if (!cback.empty()) + if (cback != nullptr) { cback(tab, result); } diff --git a/indra/newview/llfloaterexperiences.h b/indra/newview/llfloaterexperiences.h index 5e657767d2..ec5f52d2f7 100644 --- a/indra/newview/llfloaterexperiences.h +++ b/indra/newview/llfloaterexperiences.h @@ -43,7 +43,7 @@ public: static LLFloaterExperiences* findInstance(); protected: typedef std::map<std::string, std::string> NameMap_t; - typedef boost::function<void(LLPanelExperiences*, const LLSD&)> Callback_t; + typedef std::function<void(LLPanelExperiences*, const LLSD&)> Callback_t; void clearFromRecent(const LLSD& ids); void resizeToTabs(); @@ -65,12 +65,13 @@ protected: const std::string &errorNotify, Callback_t cback); private: - typedef boost::function < LLSD(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t, LLCore::HttpRequest::ptr_t, + typedef std::function<LLSD(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t, LLCore::HttpRequest::ptr_t, const std::string, LLCore::HttpOptions::ptr_t, LLCore::HttpHeaders::ptr_t) > invokationFn_t; static void retrieveExperienceListCoro(std::string url, LLHandle<LLFloaterExperiences> hparent, NameMap_t tabMapping, std::string errorNotify, Callback_t cback, invokationFn_t invoker); std::vector<LLUUID> mPrepurchaseIds; + boost::signals2::scoped_connection mCapsReceivedConnection; }; #endif //LL_LLFLOATEREXPERIENCES_H diff --git a/indra/newview/llfloaterfixedenvironment.cpp b/indra/newview/llfloaterfixedenvironment.cpp index d28c987414..1825797159 100644 --- a/indra/newview/llfloaterfixedenvironment.cpp +++ b/indra/newview/llfloaterfixedenvironment.cpp @@ -134,12 +134,15 @@ void LLFloaterFixedEnvironment::onClose(bool app_quitting) { doCloseInventoryFloater(app_quitting); - LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL); - LLEnvironment::instance().setCurrentEnvironmentSelection(LLEnvironment::ENV_LOCAL); - LLEnvironment::instance().clearEnvironment(LLEnvironment::ENV_EDIT); + if (!app_quitting) + { + LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL); + LLEnvironment::instance().setCurrentEnvironmentSelection(LLEnvironment::ENV_LOCAL); + LLEnvironment::instance().clearEnvironment(LLEnvironment::ENV_EDIT); - mSettings.reset(); - syncronizeTabs(); + mSettings.reset(); + syncronizeTabs(); + } } void LLFloaterFixedEnvironment::refresh() diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index 936096d8fe..21ae98d380 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -320,15 +320,29 @@ void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gestur if (gesture) { + element["columns"][0]["column"] = "active"; + element["columns"][0]["type"] = "icon"; if (gesture->mPlaying) { font_style = "BOLD"; + element["columns"][0]["value"] = "Activate_Checkmark"; } + + // Only add "playing" if we've got the name, less confusing. JC item_name = gesture->mName; - element["columns"][0]["column"] = "trigger"; - element["columns"][0]["value"] = gesture->mTrigger; - element["columns"][0]["font"]["name"] = "SANSSERIF"; - element["columns"][0]["font"]["style"] = font_style; + if (item && gesture->mPlaying) + { + item_name += " " + getString("playing"); + } + element["columns"][1]["column"] = "name"; + element["columns"][1]["value"] = item_name; + element["columns"][1]["font"]["name"] = "SANSSERIF"; + element["columns"][1]["font"]["style"] = font_style; + + element["columns"][2]["column"] = "trigger"; + element["columns"][2]["value"] = gesture->mTrigger; + element["columns"][2]["font"]["name"] = "SANSSERIF"; + element["columns"][2]["font"]["style"] = font_style; std::string key_string; std::string buffer; @@ -345,45 +359,38 @@ void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gestur gesture->mKey); } - element["columns"][1]["column"] = "shortcut"; - element["columns"][1]["value"] = buffer; - element["columns"][1]["font"]["name"] = "SANSSERIF"; - element["columns"][1]["font"]["style"] = font_style; - // hidden column for sorting - element["columns"][2]["column"] = "key"; - element["columns"][2]["value"] = key_string; - element["columns"][2]["font"]["name"] = "SANSSERIF"; - element["columns"][2]["font"]["style"] = font_style; - - // Only add "playing" if we've got the name, less confusing. JC - if (item && gesture->mPlaying) - { - item_name += " " + getString("playing"); - } - element["columns"][3]["column"] = "name"; - element["columns"][3]["value"] = item_name; + element["columns"][3]["column"] = "key"; + element["columns"][3]["value"] = key_string; element["columns"][3]["font"]["name"] = "SANSSERIF"; element["columns"][3]["font"]["style"] = font_style; + + element["columns"][4]["column"] = "shortcut"; + element["columns"][4]["value"] = buffer; + element["columns"][4]["font"]["name"] = "SANSSERIF"; + element["columns"][4]["font"]["style"] = font_style; } else { - element["columns"][0]["column"] = "trigger"; + element["columns"][0]["column"] = "active"; + element["columns"][0]["type"] = "icon"; element["columns"][0]["value"] = ""; - element["columns"][0]["font"]["name"] = "SANSSERIF"; - element["columns"][0]["font"]["style"] = font_style; - element["columns"][1]["column"] = "shortcut"; - element["columns"][1]["value"] = "---"; + element["columns"][1]["column"] = "name"; + element["columns"][1]["value"] = item_name; element["columns"][1]["font"]["name"] = "SANSSERIF"; element["columns"][1]["font"]["style"] = font_style; - element["columns"][2]["column"] = "key"; - element["columns"][2]["value"] = "~~~"; + element["columns"][2]["column"] = "trigger"; + element["columns"][2]["value"] = ""; element["columns"][2]["font"]["name"] = "SANSSERIF"; element["columns"][2]["font"]["style"] = font_style; - element["columns"][3]["column"] = "name"; - element["columns"][3]["value"] = item_name; + element["columns"][3]["column"] = "key"; + element["columns"][3]["value"] = "~~~"; element["columns"][3]["font"]["name"] = "SANSSERIF"; element["columns"][3]["font"]["style"] = font_style; + element["columns"][4]["column"] = "shortcut"; + element["columns"][4]["value"] = "---"; + element["columns"][4]["font"]["name"] = "SANSSERIF"; + element["columns"][4]["font"]["style"] = font_style; } LL_DEBUGS("Gesture") << "Added gesture [" << item_name << "]" << LL_ENDL; @@ -391,9 +398,18 @@ void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gestur LLScrollListItem* sl_item = list->addElement(element, ADD_BOTTOM); if(sl_item) { - LLFontGL::StyleFlags style = LLGestureMgr::getInstance()->isGestureActive(item_id) ? LLFontGL::BOLD : LLFontGL::NORMAL; - // *TODO find out why ["font"]["style"] does not affect font style - ((LLScrollListText*)sl_item->getColumn(0))->setFontStyle(style); + if (LLGestureMgr::getInstance()->isGestureActive(item_id)) + { + // If gesture was not yet loaded, will have to set active state here + ((LLScrollListIcon*)sl_item->getColumn(0))->setValue("Activate_Checkmark"); + ((LLScrollListIcon*)sl_item->getColumn(0))->setIconSize(10); + ((LLScrollListText*)sl_item->getColumn(1))->setFontStyle(LLFontGL::BOLD); + } + else + { + ((LLScrollListIcon*)sl_item->getColumn(0))->setValue(""); + ((LLScrollListText*)sl_item->getColumn(1))->setFontStyle(LLFontGL::NORMAL); + } } } diff --git a/indra/newview/llfloatergridstatus.cpp b/indra/newview/llfloatergridstatus.cpp index b6b844b307..e8e36b5c93 100644 --- a/indra/newview/llfloatergridstatus.cpp +++ b/indra/newview/llfloatergridstatus.cpp @@ -90,10 +90,10 @@ void LLFloaterGridStatus::getGridStatusRSSCoro() LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getGridStatusRSSCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); - LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("getGridStatusRSSCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); + LLCore::HttpHeaders::ptr_t httpHeaders = std::make_shared<LLCore::HttpHeaders>(); httpOpts->setSSLVerifyPeer(false); // We want this data even if SSL fails httpHeaders->append(HTTP_OUT_HEADER_CONTENT_TYPE, HTTP_CONTENT_TEXT_XML); diff --git a/indra/newview/llfloatergroups.h b/indra/newview/llfloatergroups.h index be6ced40bf..93a6deb0a3 100644 --- a/indra/newview/llfloatergroups.h +++ b/indra/newview/llfloatergroups.h @@ -40,8 +40,9 @@ #include "lluuid.h" #include "llfloater.h" +#include "llevent.h" + #include <map> -#include <boost/function.hpp> #include <boost/signals2.hpp> class LLUICtrl; diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp index 989e1d8d04..bbff3e4c86 100644 --- a/indra/newview/llfloaterimagepreview.cpp +++ b/indra/newview/llfloaterimagepreview.cpp @@ -32,6 +32,7 @@ #include "llimagetga.h" #include "llimagejpeg.h" #include "llimagepng.h" +#include "llimagej2c.h" #include "llagent.h" #include "llagentbenefits.h" @@ -43,6 +44,10 @@ #include "llrender.h" #include "llface.h" #include "llfocusmgr.h" +#include "llfilesystem.h" +#include "llfloaterperms.h" +#include "llnotificationsutil.h" +#include "llstatusbar.h" // can_afford_transaction() #include "lltextbox.h" #include "lltoolmgr.h" #include "llui.h" @@ -52,6 +57,7 @@ #include "llvoavatar.h" #include "pipeline.h" #include "lluictrlfactory.h" +#include "llviewermenufile.h" // upload_new_resource() #include "llviewershadermgr.h" #include "llviewertexturelist.h" #include "llstring.h" @@ -72,8 +78,8 @@ const S32 PREVIEW_TEXTURE_HEIGHT = 320; //----------------------------------------------------------------------------- // LLFloaterImagePreview() //----------------------------------------------------------------------------- -LLFloaterImagePreview::LLFloaterImagePreview(const std::string& filename) : - LLFloaterNameDesc(filename), +LLFloaterImagePreview::LLFloaterImagePreview(const LLSD& args) : + LLFloaterNameDesc(args), mAvatarPreview(NULL), mSculptedPreview(NULL), @@ -140,7 +146,7 @@ bool LLFloaterImagePreview::postBuild() } } - getChild<LLUICtrl>("ok_btn")->setCommitCallback(boost::bind(&LLFloaterNameDesc::onBtnOK, this)); + getChild<LLUICtrl>("ok_btn")->setCommitCallback(boost::bind(&LLFloaterImagePreview::onBtnOK, this)); return true; } @@ -244,6 +250,70 @@ void LLFloaterImagePreview::clearAllPreviewTextures() } //----------------------------------------------------------------------------- +// onBtnOK() +//----------------------------------------------------------------------------- +void LLFloaterImagePreview::onBtnOK() +{ + getChildView("ok_btn")->setEnabled(false); // don't allow inadvertent extra uploads + + S32 expected_upload_cost = getExpectedUploadCost(); + if (can_afford_transaction(expected_upload_cost)) + { + LL_INFOS() << "saving texture: " << mRawImagep->getWidth() << "x" << mRawImagep->getHeight() << LL_ENDL; + // gen a new uuid for this asset + LLTransactionID tid; + tid.generate(); + LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); + + LLPointer<LLImageJ2C> formatted = new LLImageJ2C; + + if (mRawImagep->getWidth() * mRawImagep->getHeight() <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF) + { + if (gSavedSettings.getBOOL("LosslessJ2CUpload")) + { + formatted->setReversible(true); + } + } + + if (formatted->encode(mRawImagep, 0.0f)) + { + LLFileSystem fmt_file(new_asset_id, LLAssetType::AT_TEXTURE, LLFileSystem::WRITE); + fmt_file.write(formatted->getData(), formatted->getDataSize()); + + LLResourceUploadInfo::ptr_t assetUploadInfo = std::make_shared<LLResourceUploadInfo>( + tid, LLAssetType::AT_TEXTURE, + getChild<LLUICtrl>("name_form")->getValue().asString(), + getChild<LLUICtrl>("description_form")->getValue().asString(), + 0, + LLFolderType::FT_NONE, LLInventoryType::IT_NONE, + LLFloaterPerms::getNextOwnerPerms("Uploads"), + LLFloaterPerms::getGroupPerms("Uploads"), + LLFloaterPerms::getEveryonePerms("Uploads"), + expected_upload_cost, + mDestinationFolderId + ); + + upload_new_resource(assetUploadInfo); + } + else + { + LLSD args; + args["REASON"] = LLImage::getLastThreadError(); + LLNotificationsUtil::add("ErrorEncodingImage", args); + LL_WARNS() << "Error encoding image" << LL_ENDL; + } + } + else + { + LLSD args; + args["COST"] = llformat("%d", expected_upload_cost); + LLNotificationsUtil::add("ErrorCannotAffordUpload", args); + } + + closeFloater(false); +} + +//----------------------------------------------------------------------------- // draw() //----------------------------------------------------------------------------- void LLFloaterImagePreview::draw() @@ -364,16 +434,15 @@ bool LLFloaterImagePreview::loadImage(const std::string& src_filename) return false; } - S32 max_width = gSavedSettings.getS32("max_texture_dimension_X"); - S32 max_height = gSavedSettings.getS32("max_texture_dimension_Y"); + // raw image is limited to 256MB so need at least some upper limit that fits into that + constexpr S32 MAX_IMAGE_AREA = 8096 * 8096; - if ((image_info.getWidth() > max_width) || (image_info.getHeight() > max_height)) + if (image_info.getWidth() * image_info.getHeight() > MAX_IMAGE_AREA) { LLStringUtil::format_map_t args; - args["WIDTH"] = llformat("%d", max_width); - args["HEIGHT"] = llformat("%d", max_height); + args["PIXELS"] = llformat("%dM", (S32)(MAX_IMAGE_AREA / 1000000)); - mImageLoadError = LLTrans::getString("texture_load_dimensions_error", args); + mImageLoadError = LLTrans::getString("texture_load_area_error", args); return false; } @@ -399,6 +468,46 @@ bool LLFloaterImagePreview::loadImage(const std::string& src_filename) image->setLastError("Image files with less than 3 or more than 4 components are not supported."); return false; } + // Downscale images to fit the max_texture_dimensions_* + S32 max_width = gSavedSettings.getS32("max_texture_dimension_X"); + S32 max_height = gSavedSettings.getS32("max_texture_dimension_Y"); + + S32 orig_width = raw_image->getWidth(); + S32 orig_height = raw_image->getHeight(); + + if (orig_width > max_width || orig_height > max_height) + { + // Calculate scale factors + F32 width_scale = (F32)max_width / (F32)orig_width; + F32 height_scale = (F32)max_height / (F32)orig_height; + F32 scale = llmin(width_scale, height_scale); + + // Calculate new dimensions, preserving aspect ratio + S32 new_width = LLImageRaw::contractDimToPowerOfTwo( + llclamp((S32)llroundf(orig_width * scale), 4, max_width) + ); + S32 new_height = LLImageRaw::contractDimToPowerOfTwo( + llclamp((S32)llroundf(orig_height * scale), 4, max_height) + ); + + if (!raw_image->scale(new_width, new_height)) + { + LL_WARNS() << "Failed to scale image from " + << orig_width << "x" << orig_height + << " to " << new_width << "x" << new_height << LL_ENDL; + return false; + } + + // Inform the resident about the resized image + LLSD subs; + subs["[ORIGINAL_WIDTH]"] = orig_width; + subs["[ORIGINAL_HEIGHT]"] = orig_height; + subs["[NEW_WIDTH]"] = new_width; + subs["[NEW_HEIGHT]"] = new_height; + subs["[MAX_WIDTH]"] = max_width; + subs["[MAX_HEIGHT]"] = max_height; + LLNotificationsUtil::add("ImageUploadResized", subs); + } raw_image->biasedScaleToPowerOfTwo(LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT); mRawImagep = raw_image; diff --git a/indra/newview/llfloaterimagepreview.h b/indra/newview/llfloaterimagepreview.h index ed395722de..5e5f4932c2 100644 --- a/indra/newview/llfloaterimagepreview.h +++ b/indra/newview/llfloaterimagepreview.h @@ -110,7 +110,7 @@ protected: class LLFloaterImagePreview : public LLFloaterNameDesc { public: - LLFloaterImagePreview(const std::string& filename); + LLFloaterImagePreview(const LLSD& args); virtual ~LLFloaterImagePreview(); bool postBuild() override; @@ -126,6 +126,8 @@ public: void clearAllPreviewTextures(); + void onBtnOK(); + protected: static void onPreviewTypeCommit(LLUICtrl*,void*); void draw() override; diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index 920f2b1698..143781a225 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -460,7 +460,7 @@ void LLFloaterIMContainer::processParticipantsStyleUpdate() LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = session_model->getChildrenEnd(); while (current_participant_model != end_participant_model) { - LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model); + LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>((*current_participant_model).get()); if (participant_model) { // Get the avatar name for this participant id from the cache and update the model @@ -511,7 +511,7 @@ void LLFloaterIMContainer::idleUpdate() bool can_ban = haveAbilityToBan(); while (current_participant_model != end_participant_model) { - LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model); + LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>((*current_participant_model).get()); if (participant_model) { participant_model->setModeratorOptionsVisible(is_moderator); @@ -1548,6 +1548,10 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v // Beyond that point, if only the user agent is selected, everything is disabled if (is_single_select && (single_id == gAgentID)) { + if ("can_zoom_in" == item) + { + return true; + } if (is_moderator_option) { return enableModerateContextMenuItem(item, true); @@ -1702,6 +1706,11 @@ void LLFloaterIMContainer::showConversation(const LLUUID& session_id) if (session_floater) { session_floater->restoreFloater(); + if (session_floater->isTornOff() && session_floater->isMinimized()) + { + session_floater->setMinimized(false); + session_floater->setFocus(true); + } } } @@ -1882,7 +1891,7 @@ LLConversationItem* LLFloaterIMContainer::addConversationListItem(const LLUUID& LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = item->getChildrenEnd(); while (current_participant_model != end_participant_model) { - LLConversationItem* participant_model = dynamic_cast<LLConversationItem*>(*current_participant_model); + LLConversationItem* participant_model = dynamic_cast<LLConversationItem*>((*current_participant_model).get()); LLConversationViewParticipant* participant_view = createConversationViewParticipant(participant_model); participant_view->addToFolder(widget); current_participant_model++; @@ -1947,7 +1956,7 @@ bool LLFloaterIMContainer::removeConversationListItem(const LLUUID& uuid, bool c mConversationEventQueue.erase(uuid); // Don't let the focus fall IW, select and refocus on the first conversation in the list - if (change_focus) + if (change_focus && isInVisibleChain()) { setFocus(true); if (new_selection) @@ -1967,6 +1976,10 @@ bool LLFloaterIMContainer::removeConversationListItem(const LLUUID& uuid, bool c } } } + else + { + LL_INFOS() << "Conversation widgets: " << (S32)mConversationsWidgets.size() << LL_ENDL; + } return is_widget_selected; } @@ -2306,14 +2319,14 @@ bool LLFloaterIMContainer::isConversationLoggingAllowed() return gSavedPerAccountSettings.getS32("KeepConversationLogTranscripts") > 0; } -void LLFloaterIMContainer::flashConversationItemWidget(const LLUUID& session_id, bool is_flashes) +void LLFloaterIMContainer::flashConversationItemWidget(const LLUUID& session_id, bool is_flashes, bool alternate_color) { //Finds the conversation line item to flash using the session_id LLConversationViewSession * widget = dynamic_cast<LLConversationViewSession *>(get_ptr_in_map(mConversationsWidgets,session_id)); if (widget) { - widget->setFlashState(is_flashes); + widget->setFlashState(is_flashes, alternate_color); } } diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h index e5486e67da..30eed8be36 100644 --- a/indra/newview/llfloaterimcontainer.h +++ b/indra/newview/llfloaterimcontainer.h @@ -208,7 +208,7 @@ public: void reSelectConversation(); void updateSpeakBtnState(); static bool isConversationLoggingAllowed(); - void flashConversationItemWidget(const LLUUID& session_id, bool is_flashes); + void flashConversationItemWidget(const LLUUID& session_id, bool is_flashes, bool alternate_color = false); void highlightConversationItemWidget(const LLUUID& session_id, bool is_highlighted); bool isScrolledOutOfSight(LLConversationViewSession* conversation_item_widget); boost::signals2::connection mMicroChangedSignal; diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp index 28c651f0cd..f0d696361a 100644 --- a/indra/newview/llfloaterimnearbychat.cpp +++ b/indra/newview/llfloaterimnearbychat.cpp @@ -52,6 +52,7 @@ #include "llfirstuse.h" #include "llfloaterimnearbychat.h" +#include "llfloaterimnearbychatlistener.h" #include "llagent.h" // gAgent #include "llgesturemgr.h" #include "llmultigesture.h" @@ -71,6 +72,8 @@ S32 LLFloaterIMNearbyChat::sLastSpecialChatChannel = 0; +static LLFloaterIMNearbyChatListener sChatListener; + constexpr S32 EXPANDED_HEIGHT = 266; constexpr S32 COLLAPSED_HEIGHT = 60; constexpr S32 EXPANDED_MIN_HEIGHT = 150; @@ -583,7 +586,7 @@ void LLFloaterIMNearbyChat::sendChat( EChatType type ) { if (mInputEditor) { - LLWString text = mInputEditor->getWText(); + LLWString text = mInputEditor->getConvertedText(); LLWStringUtil::trim(text); LLWStringUtil::replaceChar(text,182,'\n'); // Convert paragraph symbols back into newlines. if (!text.empty()) @@ -904,7 +907,7 @@ class LLChatCommandHandler : public LLCommandHandler { public: // not allowed from outside the app - LLChatCommandHandler() : LLCommandHandler("chat", UNTRUSTED_BLOCK) { } + LLChatCommandHandler() : LLCommandHandler("chat", UNTRUSTED_CLICK_ONLY) { } // Your code here bool handle(const LLSD& tokens, diff --git a/indra/newview/llfloaterimnearbychathandler.cpp b/indra/newview/llfloaterimnearbychathandler.cpp index c920a3c898..ec9458ea9b 100644 --- a/indra/newview/llfloaterimnearbychathandler.cpp +++ b/indra/newview/llfloaterimnearbychathandler.cpp @@ -87,7 +87,7 @@ public: void addChat (LLSD& chat); void arrangeToasts (); - typedef boost::function<LLFloaterIMNearbyChatToastPanel* (void )> create_toast_panel_callback_t; + typedef std::function<LLFloaterIMNearbyChatToastPanel*(void)> create_toast_panel_callback_t; void setCreatePanelCallback(create_toast_panel_callback_t value) { m_create_toast_panel_callback_t = value;} void onToastDestroyed (LLToast* toast, bool app_quitting); diff --git a/indra/newview/llfloaterimnearbychatlistener.cpp b/indra/newview/llfloaterimnearbychatlistener.cpp index 43173d3680..b15a32ce40 100644 --- a/indra/newview/llfloaterimnearbychatlistener.cpp +++ b/indra/newview/llfloaterimnearbychatlistener.cpp @@ -34,12 +34,12 @@ #include "llagent.h" #include "llchat.h" #include "llviewercontrol.h" +#include "stringize.h" +static const F32 CHAT_THROTTLE_PERIOD = 1.f; -LLFloaterIMNearbyChatListener::LLFloaterIMNearbyChatListener(LLFloaterIMNearbyChat & chatbar) - : LLEventAPI("LLChatBar", - "LLChatBar listener to (e.g.) sendChat, etc."), - mChatbar(chatbar) +LLFloaterIMNearbyChatListener::LLFloaterIMNearbyChatListener() : + LLEventAPI("LLChatBar", "LLChatBar listener to (e.g.) sendChat, etc.") { add("sendChat", "Send chat to the simulator:\n" @@ -49,10 +49,18 @@ LLFloaterIMNearbyChatListener::LLFloaterIMNearbyChatListener(LLFloaterIMNearbyCh &LLFloaterIMNearbyChatListener::sendChat); } - // "sendChat" command -void LLFloaterIMNearbyChatListener::sendChat(LLSD const & chat_data) const +void LLFloaterIMNearbyChatListener::sendChat(LLSD const& chat_data) { + F64 cur_time = LLTimer::getElapsedSeconds(); + + if (cur_time < mLastThrottleTime + CHAT_THROTTLE_PERIOD) + { + LL_WARNS("LLFloaterIMNearbyChatListener") << "'sendChat' was throttled" << LL_ENDL; + return; + } + mLastThrottleTime = cur_time; + // Extract the data std::string chat_text = chat_data["message"].asString(); @@ -81,20 +89,12 @@ void LLFloaterIMNearbyChatListener::sendChat(LLSD const & chat_data) const } // Have to prepend /42 style channel numbers - std::string chat_to_send; - if (channel == 0) - { - chat_to_send = chat_text; - } - else + if (channel) { - chat_to_send += "/"; - chat_to_send += chat_data["channel"].asString(); - chat_to_send += " "; - chat_to_send += chat_text; + chat_text = stringize("/", chat_data["channel"].asString(), " ", chat_text); } // Send it as if it was typed in - mChatbar.sendChatFromViewer(chat_to_send, type_o_chat, ((bool)(channel == 0)) && gSavedSettings.getBOOL("PlayChatAnim")); + LLFloaterIMNearbyChat::sendChatFromViewer(chat_text, type_o_chat, (channel == 0) && gSavedSettings.getBOOL("PlayChatAnim")); } diff --git a/indra/newview/llfloaterimnearbychatlistener.h b/indra/newview/llfloaterimnearbychatlistener.h index 96184d95b3..71eba53a9a 100644 --- a/indra/newview/llfloaterimnearbychatlistener.h +++ b/indra/newview/llfloaterimnearbychatlistener.h @@ -38,12 +38,12 @@ class LLFloaterIMNearbyChat; class LLFloaterIMNearbyChatListener : public LLEventAPI { public: - LLFloaterIMNearbyChatListener(LLFloaterIMNearbyChat & chatbar); + LLFloaterIMNearbyChatListener(); private: - void sendChat(LLSD const & chat_data) const; + void sendChat(LLSD const & chat_data); - LLFloaterIMNearbyChat & mChatbar; + F64 mLastThrottleTime{0}; }; #endif // LL_LLFLOATERIMNEARBYCHATLISTENER_H diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp index 185274981b..84a9fad708 100644 --- a/indra/newview/llfloaterimsession.cpp +++ b/indra/newview/llfloaterimsession.cpp @@ -251,7 +251,7 @@ void LLFloaterIMSession::sendMsgFromInputEditor() { if (mInputEditor) { - LLWString text = mInputEditor->getWText(); + LLWString text = mInputEditor->getConvertedText(); LLWStringUtil::trim(text); LLWStringUtil::replaceChar(text,182,'\n'); // Convert paragraph symbols back into newlines. if(!text.empty()) diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index 335aba2cc9..48360f30d4 100644 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -35,10 +35,12 @@ #include "llavatariconctrl.h" #include "llchatentry.h" #include "llchathistory.h" +#include "llfloaterchatmentionpicker.h" #include "llchiclet.h" #include "llchicletbar.h" #include "lldraghandle.h" #include "llemojidictionary.h" +#include "llemojihelper.h" #include "llfloaterreg.h" #include "llfloateremojipicker.h" #include "llfloaterimsession.h" @@ -104,26 +106,7 @@ LLFloaterIMSessionTab::~LLFloaterIMSessionTab() { delete mRefreshTimer; LLIMMgr::instance().removeSessionObserver(this); - - LLFloaterIMContainer* im_container = LLFloaterIMContainer::findInstance(); - if (im_container) - { - LLParticipantList* session = dynamic_cast<LLParticipantList*>(im_container->getSessionModel(mSessionID)); - if (session) - { - for (const conversations_widgets_map::value_type& widget_pair : mConversationsWidgets) - { - LLFolderViewItem* widget = widget_pair.second; - LLFolderViewModelItem* item_vmi = widget->getViewModelItem(); - if (item_vmi && item_vmi->getNumRefs() == 1) - { - // This is the last pointer, remove participant from session - // before participant gets deleted on destroyView. - session->removeChild(item_vmi); - } - } - } - } + mEmojiCloseConn.disconnect(); } // static @@ -300,6 +283,8 @@ bool LLFloaterIMSessionTab::postBuild() mEmojiPickerShowBtn = getChild<LLButton>("emoji_picker_show_btn"); mEmojiPickerShowBtn->setClickedCallback([this](LLUICtrl*, const LLSD&) { onEmojiPickerShowBtnClicked(); }); + mEmojiPickerShowBtn->setMouseDownCallback([this](LLUICtrl*, const LLSD&) { onEmojiPickerShowBtnDown(); }); + mEmojiCloseConn = LLEmojiHelper::instance().setCloseCallback([this](LLUICtrl*, const LLSD&) { onEmojiPickerClosed(); }); mGearBtn = getChild<LLButton>("gear_btn"); mAddBtn = getChild<LLButton>("add_btn"); @@ -482,6 +467,7 @@ void LLFloaterIMSessionTab::onFocusReceived() LLIMModel::instance().sendNoUnreadMessages(mSessionID); } + LLFloaterChatMentionPicker::updateSessionID(mSessionID); super::onFocusReceived(); } @@ -532,8 +518,43 @@ void LLFloaterIMSessionTab::onEmojiRecentPanelToggleBtnClicked() void LLFloaterIMSessionTab::onEmojiPickerShowBtnClicked() { - mInputEditor->setFocus(true); - mInputEditor->showEmojiHelper(); + if (!mEmojiPickerShowBtn->getToggleState()) + { + mInputEditor->hideEmojiHelper(); + mInputEditor->setFocus(true); + mInputEditor->showEmojiHelper(); + mEmojiPickerShowBtn->setToggleState(true); // in case hideEmojiHelper closed a visible instance + } + else + { + mInputEditor->hideEmojiHelper(); + mEmojiPickerShowBtn->setToggleState(false); + } +} + +void LLFloaterIMSessionTab::onEmojiPickerShowBtnDown() +{ + if (mEmojiHelperLastCallbackFrame == LLFrameTimer::getFrameCount()) + { + // Helper gets closed by focus lost event on Down before before onEmojiPickerShowBtnDown + // triggers. + // If this condition is true, user pressed button and it was 'toggled' during press, + // restore 'toggled' state so that button will not reopen helper. + mEmojiPickerShowBtn->setToggleState(true); + } +} + +void LLFloaterIMSessionTab::onEmojiPickerClosed() +{ + if (mEmojiPickerShowBtn->getToggleState()) + { + mEmojiPickerShowBtn->setToggleState(false); + // Helper gets closed by focus lost event on Down before onEmojiPickerShowBtnDown + // triggers. If mEmojiHelperLastCallbackFrame is set and matches Down, means close + // was triggered by user's press. + // A bit hacky, but I can't think of a better way to handle this without rewriting helper. + mEmojiHelperLastCallbackFrame = LLFrameTimer::getFrameCount(); + } } void LLFloaterIMSessionTab::initEmojiRecentPanel() @@ -597,9 +618,21 @@ void LLFloaterIMSessionTab::deleteAllChildren() std::string LLFloaterIMSessionTab::appendTime() { - std::string timeStr = "[" + LLTrans::getString("TimeHour") + "]:" - "[" + LLTrans::getString("TimeMin") + "]:" - "[" + LLTrans::getString("TimeSec") + "]"; + std::string timeStr; + static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); + if (use_24h) + { + timeStr = "[" + LLTrans::getString("TimeHour") + "]:" + "[" + LLTrans::getString("TimeMin") + "]:" + "[" + LLTrans::getString("TimeSec") + "]"; + } + else + { + timeStr = "[" + LLTrans::getString("TimeHour12") + "]:" + "[" + LLTrans::getString("TimeMin") + "]:" + "[" + LLTrans::getString("TimeSec") + "] [" + + LLTrans::getString("TimeAMPM") + "]"; + } LLSD substitution; substitution["datetime"] = (S32)time_corrected(); @@ -690,7 +723,7 @@ void LLFloaterIMSessionTab::buildConversationViewParticipant() LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = item->getChildrenEnd(); while (current_participant_model != end_participant_model) { - LLConversationItem* participant_model = dynamic_cast<LLConversationItem*>(*current_participant_model); + LLConversationItem* participant_model = dynamic_cast<LLConversationItem*>((*current_participant_model).get()); if (participant_model) { addConversationViewParticipant(participant_model); @@ -734,27 +767,6 @@ void LLFloaterIMSessionTab::removeConversationViewParticipant(const LLUUID& part LLFolderViewItem* widget = get_ptr_in_map(mConversationsWidgets,participant_id); if (widget) { - LLFolderViewModelItem* item_vmi = widget->getViewModelItem(); - if (item_vmi && item_vmi->getNumRefs() == 1) - { - // This is the last pointer, remove participant from session - // before participant gets deleted on destroyView. - // - // Floater (widget) and participant's view can simultaneously - // co-own the model, in which case view is responsible for - // the deletion and floater is free to clear and recreate - // the list, yet there are cases where only widget owns - // the pointer so it should do the cleanup. - // See "add_participant". - // - // Todo: If it keeps causing issues turn participants - // into LLPointers in the session - LLParticipantList* session = getParticipantList(); - if (session) - { - session->removeChild(item_vmi); - } - } widget->destroyView(); } mConversationsWidgets.erase(participant_id); @@ -820,7 +832,7 @@ void LLFloaterIMSessionTab::refreshConversation() LLIMSpeakerMgr *speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID); while (current_participant_model != end_participant_model) { - LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model); + LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>((*current_participant_model).get()); if (speaker_mgr && participant_model) { LLSpeaker *participant_speaker = speaker_mgr->findSpeaker(participant_model->getUUID()); diff --git a/indra/newview/llfloaterimsessiontab.h b/indra/newview/llfloaterimsessiontab.h index 367d988f26..6d04d622e1 100644 --- a/indra/newview/llfloaterimsessiontab.h +++ b/indra/newview/llfloaterimsessiontab.h @@ -235,6 +235,8 @@ private: void onEmojiRecentPanelToggleBtnClicked(); void onEmojiPickerShowBtnClicked(); + void onEmojiPickerShowBtnDown(); + void onEmojiPickerClosed(); void initEmojiRecentPanel(); void onEmojiRecentPanelFocusReceived(); void onEmojiRecentPanelFocusLost(); @@ -249,6 +251,9 @@ private: S32 mInputEditorPad; S32 mChatLayoutPanelHeight; S32 mFloaterHeight; + + boost::signals2::connection mEmojiCloseConn; + U32 mEmojiHelperLastCallbackFrame = { 0 }; }; diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp index 4f993ca0e1..c0fe7ad896 100644 --- a/indra/newview/llfloaterinspect.cpp +++ b/indra/newview/llfloaterinspect.cpp @@ -220,7 +220,8 @@ void LLFloaterInspect::refresh() } time_t timestamp = (time_t) (obj->mCreationDate/1000000); - std::string timeStr = getString("timeStamp"); + static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); + std::string timeStr = use_24h ? getString("timeStamp") : getString("timeStampAMPM"); LLSD substitution; substitution["datetime"] = (S32) timestamp; LLStringUtil::format (timeStr, substitution); diff --git a/indra/newview/llfloaterinventorysettings.cpp b/indra/newview/llfloaterinventorysettings.cpp index e5ee69f240..aab632bcb8 100644 --- a/indra/newview/llfloaterinventorysettings.cpp +++ b/indra/newview/llfloaterinventorysettings.cpp @@ -28,9 +28,14 @@ #include "llfloaterinventorysettings.h" +#include "llcolorswatch.h" +#include "llviewercontrol.h" + LLFloaterInventorySettings::LLFloaterInventorySettings(const LLSD& key) : LLFloater(key) { + mCommitCallbackRegistrar.add("ScriptPref.applyUIColor", boost::bind(&LLFloaterInventorySettings::applyUIColor, this, _1, _2)); + mCommitCallbackRegistrar.add("ScriptPref.getUIColor", boost::bind(&LLFloaterInventorySettings::getUIColor, this, _1, _2)); } LLFloaterInventorySettings::~LLFloaterInventorySettings() @@ -39,6 +44,29 @@ LLFloaterInventorySettings::~LLFloaterInventorySettings() bool LLFloaterInventorySettings::postBuild() { getChild<LLButton>("ok_btn")->setCommitCallback(boost::bind(&LLFloater::closeFloater, this, false)); + + getChild<LLUICtrl>("favorites_color")->setCommitCallback(boost::bind(&LLFloaterInventorySettings::updateColorSwatch, this)); + + bool enable_color = gSavedSettings.getBOOL("InventoryFavoritesColorText"); + getChild<LLUICtrl>("favorites_swatch")->setEnabled(enable_color); + return true; } +void LLFloaterInventorySettings::updateColorSwatch() +{ + bool val = getChild<LLUICtrl>("favorites_color")->getValue(); + getChild<LLUICtrl>("favorites_swatch")->setEnabled(val); +} + +void LLFloaterInventorySettings::applyUIColor(LLUICtrl* ctrl, const LLSD& param) +{ + LLUIColorTable::instance().setColor(param.asString(), LLColor4(ctrl->getValue())); +} + +void LLFloaterInventorySettings::getUIColor(LLUICtrl* ctrl, const LLSD& param) +{ + LLColorSwatchCtrl* color_swatch = (LLColorSwatchCtrl*)ctrl; + color_swatch->setOriginal(LLUIColorTable::instance().getColor(param.asString())); +} + diff --git a/indra/newview/llfloaterinventorysettings.h b/indra/newview/llfloaterinventorysettings.h index 3fe3a001b9..c27d5d2e1b 100644 --- a/indra/newview/llfloaterinventorysettings.h +++ b/indra/newview/llfloaterinventorysettings.h @@ -40,6 +40,11 @@ public: private: LLFloaterInventorySettings(const LLSD& key); ~LLFloaterInventorySettings(); + + void updateColorSwatch(); + + void applyUIColor(LLUICtrl* ctrl, const LLSD& param); + void getUIColor(LLUICtrl* ctrl, const LLSD& param); }; #endif diff --git a/indra/newview/llfloaterjoystick.cpp b/indra/newview/llfloaterjoystick.cpp index 68b11ec92b..871f924316 100644 --- a/indra/newview/llfloaterjoystick.cpp +++ b/indra/newview/llfloaterjoystick.cpp @@ -78,7 +78,7 @@ BOOL CALLBACK di8_list_devices_callback(LPCDIDEVICEINSTANCE device_instance_ptr, // Capable of detecting devices like Oculus Rift if (device_instance_ptr && pvRef) { - std::string product_name = utf16str_to_utf8str(llutf16string(device_instance_ptr->tszProductName)); + std::string product_name = ll_convert<std::string>(std::wstring(device_instance_ptr->tszProductName)); S32 size = sizeof(GUID); LLSD::Binary data; //just an std::vector data.resize(size); diff --git a/indra/newview/llfloaterlagmeter.cpp b/indra/newview/llfloaterlagmeter.cpp index 28fa8dea9a..1377526f69 100644 --- a/indra/newview/llfloaterlagmeter.cpp +++ b/indra/newview/llfloaterlagmeter.cpp @@ -200,6 +200,7 @@ void LLFloaterLagMeter::determineNetwork() // the network handlers are de-synched from the rendering. F32Milliseconds client_frame_time = frame_recording.getPeriodMean(LLStatViewer::FRAME_STACKTIME); + // Todo: account for LLPacketRing dropped packets? viewer drops those when it can't keep up if(packet_loss >= mNetworkPacketLossCritical) { mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_CRITICAL_IMAGE_NAME)); diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 52a3e78d04..5c5219bcdd 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -733,7 +733,8 @@ void LLPanelLandGeneral::refresh() // Display claim date time_t claim_date = parcel->getClaimDate(); - std::string claim_date_str = getString("time_stamp_template"); + static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); + std::string claim_date_str = use_24h ? getString("time_stamp_template") : getString("time_stamp_template_ampm"); LLSD substitution; substitution["datetime"] = (S32) claim_date; LLStringUtil::format (claim_date_str, substitution); diff --git a/indra/newview/llfloatermarketplace.cpp b/indra/newview/llfloatermarketplace.cpp new file mode 100644 index 0000000000..7316d7617d --- /dev/null +++ b/indra/newview/llfloatermarketplace.cpp @@ -0,0 +1,70 @@ +/** + * @file llfloatermarketplace.cpp + * @brief floater for the Marketplace web site + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloatermarketplace.h" +#include "llviewercontrol.h" +#include "lluictrlfactory.h" + +LLFloaterMarketplace::LLFloaterMarketplace(const LLSD& key) + : LLFloaterWebContent(key) +{ +} + +LLFloaterMarketplace::~LLFloaterMarketplace() +{ +} + +// just to override LLFloaterWebContent +void LLFloaterMarketplace::onClose(bool app_quitting) +{ +} + +bool LLFloaterMarketplace::postBuild() +{ + if (!LLFloaterWebContent::postBuild()) + return false; + + mWebBrowser->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL")); + std::string url = gSavedSettings.getString("MarketplaceURL"); + mWebBrowser->navigateTo(url, HTTP_CONTENT_TEXT_HTML); + + // If cookie is there, will set it now, Otherwise will have to wait for login completion + // which will also update marketplace instance if it already exists. + LLViewerMedia::getInstance()->getOpenIDCookie(mWebBrowser); + + return true; +} + +void LLFloaterMarketplace::openMarketplace() +{ + std::string url = gSavedSettings.getString("MarketplaceURL"); + if (mCurrentURL != url) + { + mWebBrowser->navigateTo(url, HTTP_CONTENT_TEXT_HTML); + } +} diff --git a/indra/newview/llfloateravatar.h b/indra/newview/llfloatermarketplace.h index fb591c8306..9524c94eee 100644 --- a/indra/newview/llfloateravatar.h +++ b/indra/newview/llfloatermarketplace.h @@ -1,7 +1,6 @@ /** - * @file llfloateravatar.h - * @author Leyla Farazha - * @brief floater for the avatar changer + * @file llfloatermarketplace.h + * @brief floater for the Marketplace web site * * $LicenseInfo:firstyear=2011&license=viewerlgpl$ * Second Life Viewer Source Code @@ -25,22 +24,23 @@ * $/LicenseInfo$ */ -#ifndef LL_FLOATER_AVATAR_H -#define LL_FLOATER_AVATAR_H +#pragma once #include "llfloater.h" -class LLMediaCtrl; +#include "llfloaterwebcontent.h" -class LLFloaterAvatar: - public LLFloater +class LLFloaterMarketplace: + public LLFloaterWebContent { friend class LLFloaterReg; + +public: + void openMarketplace(); + private: - LLFloaterAvatar(const LLSD& key); - ~LLFloaterAvatar(); + LLFloaterMarketplace(const LLSD& key); + ~LLFloaterMarketplace(); bool postBuild() override; - - LLMediaCtrl* mAvatarPicker; + void onClose(bool app_quitting) override; }; -#endif diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp index 2496887c9d..81eab52e6c 100644 --- a/indra/newview/llfloatermediasettings.cpp +++ b/indra/newview/llfloatermediasettings.cpp @@ -180,8 +180,15 @@ void LLFloaterMediaSettings::onClose(bool app_quitting) //////////////////////////////////////////////////////////////////////////////// //static -void LLFloaterMediaSettings::initValues( const LLSD& media_settings, bool editable ) +void LLFloaterMediaSettings::initValues( const LLSD& media_settings, bool editable, bool has_media_info, bool multiple_media, bool multiple_valid_media) { + if (!sInstance) + { + return; + } + sInstance->mIdenticalHasMediaInfo = has_media_info; + sInstance->mMultipleMedia = multiple_media; + sInstance->mMultipleValidMedia = multiple_valid_media; if (sInstance->hasFocus()) return; // Clear values diff --git a/indra/newview/llfloatermediasettings.h b/indra/newview/llfloatermediasettings.h index 38730ddc98..7ed7ab246f 100644 --- a/indra/newview/llfloatermediasettings.h +++ b/indra/newview/llfloatermediasettings.h @@ -48,7 +48,7 @@ public: static LLFloaterMediaSettings* getInstance(); static bool instanceExists(); static void apply(); - static void initValues( const LLSD& media_settings , bool editable); + static void initValues( const LLSD& media_settings , bool editable, bool has_media_info, bool multiple_media, bool multiple_valid_media); static void clearValues( bool editable); LLPanelMediaSettingsSecurity* getPanelSecurity(){return mPanelMediaSettingsSecurity;}; diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 8332a430e6..ef29be8200 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -64,6 +64,7 @@ #include "llcallbacklist.h" #include "llviewertexteditor.h" #include "llviewernetwork.h" +#include "llmaterialeditor.h" //static @@ -349,14 +350,14 @@ void LLFloaterModelPreview::initModelPreview() } //static -bool LLFloaterModelPreview::showModelPreview() +void LLFloaterModelPreview::showModelPreview(const LLUUID& dest_folder) { LLFloaterModelPreview* fmp = (LLFloaterModelPreview*)LLFloaterReg::getInstance("upload_model"); if (fmp && !fmp->isModelLoading()) { + fmp->setUploadDestination(dest_folder); fmp->loadHighLodModel(); } - return true; } void LLFloaterModelPreview::onUploadOptionChecked(LLUICtrl* ctrl) @@ -502,10 +503,13 @@ void LLFloaterModelPreview::onClickCalculateBtn() mUploadModelUrl.clear(); mModelPhysicsFee.clear(); - gMeshRepo.uploadModel(mModelPreview->mUploadData, mModelPreview->mPreviewScale, + lod_sources_map_t lod_sources; + fillLODSourceStatistics(lod_sources); + + gMeshRepo.uploadModel(mModelPreview->mUploadData, lod_sources, mModelPreview->mPreviewScale, childGetValue("upload_textures").asBoolean(), upload_skinweights, upload_joint_positions, lock_scale_if_joint_position, - mUploadModelUrl, false, + mUploadModelUrl, mDestinationFolderId, false, getWholeModelFeeObserverHandle()); toggleCalculateButton(false); @@ -619,11 +623,9 @@ void LLFloaterModelPreview::onJointListSelection() LLPanel *panel = mTabContainer->getPanelByName("rigging_panel"); LLScrollListCtrl *joints_list = panel->getChild<LLScrollListCtrl>("joints_list"); LLScrollListCtrl *joints_pos = panel->getChild<LLScrollListCtrl>("pos_overrides_list"); - LLScrollListCtrl *joints_scale = panel->getChild<LLScrollListCtrl>("scale_overrides_list"); LLTextBox *joint_pos_descr = panel->getChild<LLTextBox>("pos_overrides_descr"); joints_pos->deleteAllItems(); - joints_scale->deleteAllItems(); LLScrollListItem *selected = joints_list->getFirstSelected(); if (selected) @@ -1033,8 +1035,13 @@ void LLFloaterModelPreview::onPhysicsStageExecute(LLUICtrl* ctrl, void* data) gMeshRepo.mDecompThread->submitRequest(request); } } - - if (stage == "Decompose") + if (stage == "Analyze") + { + sInstance->setStatusMessage(sInstance->getString("decomposing")); + sInstance->childSetVisible("Analyze", false); + sInstance->childSetVisible("analyze_cancel", true); + } + else if (stage == "Decompose") { sInstance->setStatusMessage(sInstance->getString("decomposing")); sInstance->childSetVisible("Decompose", false); @@ -1088,9 +1095,7 @@ void LLFloaterModelPreview::onPhysicsUseLOD(LLUICtrl* ctrl, void* userdata) } else if (which_mode == cube_mode) { - std::string path = gDirUtilp->getAppRODataDir(); - gDirUtilp->append(path, "cube.dae"); - sInstance->loadModel(LLModel::LOD_PHYSICS, path); + sInstance->loadModel(LLModel::LOD_PHYSICS, getBoundingBoxCubePath()); } LLModelPreview *model_preview = sInstance->mModelPreview; @@ -1137,6 +1142,7 @@ void LLFloaterModelPreview::initDecompControls() childSetCommitCallback("simplify_cancel", onPhysicsStageCancel, NULL); childSetCommitCallback("decompose_cancel", onPhysicsStageCancel, NULL); + childSetCommitCallback("analyze_cancel", onPhysicsStageCancel, NULL); childSetCommitCallback("physics_lod_combo", onPhysicsUseLOD, NULL); childSetCommitCallback("physics_browse", onPhysicsBrowse, NULL); @@ -1318,8 +1324,91 @@ void LLFloaterModelPreview::createSmoothComboBox(LLComboBox* combo_box, float mi std::string label = (++ilabel == SMOOTH_VALUES_NUMBER) ? "10 (max)" : llformat("%.1d", ilabel); combo_box->add(label, value, ADD_BOTTOM, true); } +} +std::string get_source_file_format(const std::string& filename) +{ + const std::string extension = gDirUtilp->getExtension(filename); + if (extension == "gltf" + || extension == "glb") + { + return "gltf"; + } + else if (extension == "dae") + { + return "dae"; + } + else if (extension == "slm") + { + return "slm"; + } + else + { + return "unknown file"; + } +} +std::string LLFloaterModelPreview::getBoundingBoxCubePath() +{ + std::string path = gDirUtilp->getAppRODataDir(); + gDirUtilp->append(path, "cube.dae"); + return path; +} + +void LLFloaterModelPreview::fillLODSourceStatistics(LLFloaterModelPreview::lod_sources_map_t& lod_sources) const +{ + lod_sources.clear(); + + // This doesn't nessesarily reflect the actual source of meshes, just user choices, + // some meshes could have been matched from different lods, but should be good + // enough for statistics. + for (S32 lod = 0; lod <= LLModel::LOD_HIGH; ++lod) + { + const std::string &lod_string = lod_name[lod]; + if (mLODMode[lod] == LLModelPreview::USE_LOD_ABOVE) + { + lod_sources[lod_string] = "lod above"; + } + else if (mLODMode[lod] == LLModelPreview::MESH_OPTIMIZER_AUTO + || mLODMode[lod] == LLModelPreview::MESH_OPTIMIZER_PRECISE + || mLODMode[lod] == LLModelPreview::MESH_OPTIMIZER_SLOPPY) + { + lod_sources[lod_string] = "generated"; + } + else if (mLODMode[lod] == LLModelPreview::LOD_FROM_FILE) + { + const std::string& file = mModelPreview->mLODFile[lod]; + lod_sources[lod_string] = get_source_file_format(file); + } + else + { + lod_sources[lod_string] = "unknown source"; + } + } + if (mModelPreview->mLODFile[LLModel::LOD_PHYSICS].empty()) + { + if (mModelPreview->mPhysicsSearchLOD >= 0 && mModelPreview->mPhysicsSearchLOD <= 3) + { + lod_sources["physics"] = lod_name[mModelPreview->mPhysicsSearchLOD]; + } + else + { + lod_sources["physics"] = "none"; + } + } + else + { + const std::string& file = mModelPreview->mLODFile[LLModel::LOD_PHYSICS]; + const std::string cube = getBoundingBoxCubePath(); + if (cube != file) // check for "cube.dae" + { + lod_sources["physics"] = get_source_file_format(file); + } + else + { + lod_sources["physics"] = "bounding box"; + } + } } //----------------------------------------------------------------------------- @@ -1341,26 +1430,26 @@ void LLFloaterModelPreview::addStringToLog(const std::string& message, const LLS { std::string str; switch (lod) -{ + { case LLModel::LOD_IMPOSTOR: str = "LOD0 "; break; case LLModel::LOD_LOW: str = "LOD1 "; break; case LLModel::LOD_MEDIUM: str = "LOD2 "; break; case LLModel::LOD_PHYSICS: str = "PHYS "; break; case LLModel::LOD_HIGH: str = "LOD3 "; break; default: break; -} + } LLStringUtil::format_map_t args_msg; LLSD::map_const_iterator iter = args.beginMap(); LLSD::map_const_iterator end = args.endMap(); for (; iter != end; ++iter) -{ + { args_msg[iter->first] = iter->second.asString(); } str += sInstance->getString(message, args_msg); sInstance->addStringToLogTab(str, flash); } - } +} // static void LLFloaterModelPreview::addStringToLog(const std::string& str, bool flash) @@ -1488,7 +1577,7 @@ void LLFloaterModelPreview::updateAvatarTab(bool highlight_overrides) { // Populate table - std::map<std::string, std::string> joint_alias_map; + std::map<std::string, std::string, std::less<>> joint_alias_map; mModelPreview->getJointAliases(joint_alias_map); S32 conflicts = 0; @@ -1657,10 +1746,13 @@ void LLFloaterModelPreview::onUpload(void* user_data) mp->mModelPreview->saveUploadData(upload_skinweights, upload_joint_positions, lock_scale_if_joint_position); } - gMeshRepo.uploadModel(mp->mModelPreview->mUploadData, mp->mModelPreview->mPreviewScale, + lod_sources_map_t lod_sources; + mp->fillLODSourceStatistics(lod_sources); + + gMeshRepo.uploadModel(mp->mModelPreview->mUploadData, lod_sources, mp->mModelPreview->mPreviewScale, mp->childGetValue("upload_textures").asBoolean(), upload_skinweights, upload_joint_positions, lock_scale_if_joint_position, - mp->mUploadModelUrl, + mp->mUploadModelUrl, mp->mDestinationFolderId, true, LLHandle<LLWholeModelFeeObserver>(), mp->getWholeModelUploadObserverHandle()); } @@ -1770,9 +1862,15 @@ void LLFloaterModelPreview::onLoDSourceCommit(S32 lod) if (index == LLModelPreview::MESH_OPTIMIZER_AUTO || index == LLModelPreview::MESH_OPTIMIZER_SLOPPY || index == LLModelPreview::MESH_OPTIMIZER_PRECISE) - { //rebuild LoD to update triangle counts + { + // rebuild LoD to update triangle counts onLODParamCommit(lod, true); } + if (index == LLModelPreview::USE_LOD_ABOVE) + { + // refresh to pick triangle counts + mModelPreview->mDirty = true; + } } void LLFloaterModelPreview::resetDisplayOptions() @@ -1926,7 +2024,7 @@ void LLFloaterModelPreview::DecompRequest::completed() { //called from the main thread if (mContinue) { - mModel->setConvexHullDecomposition(mHull); + mModel->setConvexHullDecomposition(mHull, mHullMesh); if (sInstance) { diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 6adc084fe8..20e5b2666a 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -73,7 +73,8 @@ public: /*virtual*/ void reshape(S32 width, S32 height, bool called_from_parent = true); void initModelPreview(); - static bool showModelPreview(); + void setUploadDestination(const LLUUID& dest_folder) { mDestinationFolderId = dest_folder; } + static void showModelPreview(const LLUUID& dest_folder = LLUUID::null); bool handleMouseDown(S32 x, S32 y, MASK mask); bool handleMouseUp(S32 x, S32 y, MASK mask); @@ -164,9 +165,6 @@ protected: static void onPhysicsBrowse(LLUICtrl* ctrl, void* userdata); static void onPhysicsUseLOD(LLUICtrl* ctrl, void* userdata); - static void onPhysicsOptimize(LLUICtrl* ctrl, void* userdata); - static void onPhysicsDecomposeBack(LLUICtrl* ctrl, void* userdata); - static void onPhysicsSimplifyBack(LLUICtrl* ctrl, void* userdata); void draw(); @@ -225,6 +223,11 @@ private: void createSmoothComboBox(LLComboBox* combo_box, float min, float max); + static std::string getBoundingBoxCubePath(); + typedef std::map<std::string, std::string> lod_sources_map_t; + void fillLODSourceStatistics(lod_sources_map_t& lod_sources) const; + + LLUUID mDestinationFolderId; LLButton* mUploadBtn; LLButton* mCalculateBtn; LLViewerTextEditor* mUploadLogText; diff --git a/indra/newview/llfloatermodeluploadbase.cpp b/indra/newview/llfloatermodeluploadbase.cpp index ec4f7593ca..dd53d0ffcf 100644 --- a/indra/newview/llfloatermodeluploadbase.cpp +++ b/indra/newview/llfloatermodeluploadbase.cpp @@ -66,8 +66,8 @@ void LLFloaterModelUploadBase::requestAgentUploadPermissionsCoro(std::string url { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("MeshUploadFlag", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("MeshUploadFlag", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD result = httpAdapter->getAndSuspend(httpRequest, url); diff --git a/indra/newview/llfloatermyenvironment.cpp b/indra/newview/llfloatermyenvironment.cpp index 891e16a8ef..c0405c106e 100644 --- a/indra/newview/llfloatermyenvironment.cpp +++ b/indra/newview/llfloatermyenvironment.cpp @@ -38,7 +38,9 @@ #include "llcheckboxctrl.h" #include "llviewerinventory.h" #include "llenvironment.h" +#include "llnotificationsutil.h" #include "llparcel.h" +#include "lltrans.h" #include "llviewerparcelmgr.h" //========================================================================= @@ -223,16 +225,13 @@ void LLFloaterMyEnvironment::onFilterEdit(const std::string& search_string) mInventoryList->setFilterSubString(search_string); } -void LLFloaterMyEnvironment::onDeleteSelected() +void LLFloaterMyEnvironment::onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, uuid_vec_t item_ids) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if (option == 0) { - uuid_vec_t selected; - - getSelectedIds(selected); - if (selected.empty()) - return; - const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); - for (const LLUUID& itemid: selected) + for (const LLUUID& itemid : item_ids) { LLInventoryItem* inv_item = gInventory.getItem(itemid); @@ -253,6 +252,27 @@ void LLFloaterMyEnvironment::onDeleteSelected() } gInventory.notifyObservers(); } +} + +void LLFloaterMyEnvironment::onDeleteSelected() +{ + uuid_vec_t selected; + + getSelectedIds(selected); + if (selected.empty()) + return; + + LLSD args; + args["QUESTION"] = LLTrans::getString(selected.size() > 1 ? "DeleteItems" : "DeleteItem"); + LLNotificationsUtil::add( + "DeleteItems", + args, + LLSD(), + [this, selected](const LLSD& notification, const LLSD& response) + { + onItemsRemovalConfirmation(notification, response, selected); + }); +} void LLFloaterMyEnvironment::onDoCreate(const LLSD &data) @@ -318,13 +338,13 @@ bool LLFloaterMyEnvironment::canAction(const std::string &context) if (context == PARAMETER_EDIT) { - return (selected.size() == 1) && isSettingSelected(selected.front()); + return (selected.size() == 1) && isSettingId(selected.front()); } else if (context == PARAMETER_COPY) { for (std::vector<LLUUID>::iterator it = selected.begin(); it != selected.end(); it++) { - if(!isSettingSelected(*it)) + if(!isSettingId(*it)) { return false; } @@ -342,7 +362,7 @@ bool LLFloaterMyEnvironment::canAction(const std::string &context) LLClipboard::instance().pasteFromClipboard(ids); for (std::vector<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++) { - if (!isSettingSelected(*it)) + if (!isSettingId(*it)) { return false; } @@ -351,7 +371,7 @@ bool LLFloaterMyEnvironment::canAction(const std::string &context) } else if (context == PARAMETER_COPYUUID) { - return (selected.size() == 1) && isSettingSelected(selected.front()); + return (selected.size() == 1) && isSettingId(selected.front()); } return false; @@ -367,16 +387,42 @@ bool LLFloaterMyEnvironment::canApply(const std::string &context) if (context == PARAMETER_REGION) { - return LLEnvironment::instance().canAgentUpdateRegionEnvironment(); + return isSettingId(selected.front()) && LLEnvironment::instance().canAgentUpdateRegionEnvironment(); } else if (context == PARAMETER_PARCEL) { - return LLEnvironment::instance().canAgentUpdateParcelEnvironment(); + return isSettingId(selected.front()) && LLEnvironment::instance().canAgentUpdateParcelEnvironment(); } - else + else if (context == PARAMETER_LOCAL) { - return (context == PARAMETER_LOCAL); + return isSettingId(selected.front()); } + + return false; +} + +bool can_delete(const LLUUID& id) +{ + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); + if (id == trash_id || gInventory.isObjectDescendentOf(id, trash_id)) + { + return false; + } + + LLViewerInventoryCategory* cat = gInventory.getCategory(id); + if (cat) + { + if (!get_is_category_removable(&gInventory, id)) + { + return false; + } + } + else if (!get_is_item_removable(&gInventory, id, false)) + { + return false; + } + + return true; } //------------------------------------------------------------------------- @@ -389,7 +435,14 @@ void LLFloaterMyEnvironment::refreshButtonStates() getChild<LLUICtrl>(BUTTON_GEAR)->setEnabled(settings_ok); getChild<LLUICtrl>(BUTTON_NEWSETTINGS)->setEnabled(true); - getChild<LLUICtrl>(BUTTON_DELETE)->setEnabled(settings_ok && !selected.empty()); + + bool enable_delete = false; + if(settings_ok && !selected.empty()) + { + enable_delete = can_delete(selected.front()); + } + + getChild<LLUICtrl>(BUTTON_DELETE)->setEnabled(enable_delete); } //------------------------------------------------------------------------- @@ -438,7 +491,7 @@ LLUUID LLFloaterMyEnvironment::findItemByAssetId(LLUUID asset_id, bool copyable_ return LLUUID::null; } -bool LLFloaterMyEnvironment::isSettingSelected(LLUUID item_id) +bool LLFloaterMyEnvironment::isSettingId(const LLUUID& item_id) { LLInventoryItem* itemp = gInventory.getItem(item_id); diff --git a/indra/newview/llfloatermyenvironment.h b/indra/newview/llfloatermyenvironment.h index 8e81b8e5e2..c5d521d207 100644 --- a/indra/newview/llfloatermyenvironment.h +++ b/indra/newview/llfloatermyenvironment.h @@ -60,6 +60,7 @@ private: void onFilterCheckChange(); void onFilterEdit(const std::string& search_string); void onSelectionChange(); + void onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, uuid_vec_t item_ids); void onDeleteSelected(); void onDoCreate(const LLSD &data); void onDoApply(const std::string &context); @@ -69,7 +70,7 @@ private: void getSelectedIds(uuid_vec_t& ids) const; void refreshButtonStates(); - bool isSettingSelected(LLUUID item_id); + static bool isSettingId(const LLUUID &item_id); static LLUUID findItemByAssetId(LLUUID asset_id, bool copyable_only, bool ignore_library); }; diff --git a/indra/newview/llfloatermyscripts.cpp b/indra/newview/llfloatermyscripts.cpp index 0283855f15..8685243867 100644 --- a/indra/newview/llfloatermyscripts.cpp +++ b/indra/newview/llfloatermyscripts.cpp @@ -93,8 +93,8 @@ void LLFloaterMyScripts::getAttachmentLimitsCoro(std::string url) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getAttachmentLimitsCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("getAttachmentLimitsCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD result = httpAdapter->getAndSuspend(httpRequest, url); diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp index 01c50d89c5..569b41cfa9 100644 --- a/indra/newview/llfloaternamedesc.cpp +++ b/indra/newview/llfloaternamedesc.cpp @@ -62,11 +62,20 @@ const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE; //----------------------------------------------------------------------------- // LLFloaterNameDesc() //----------------------------------------------------------------------------- -LLFloaterNameDesc::LLFloaterNameDesc(const LLSD& filename ) - : LLFloater(filename), - mIsAudio(false) +LLFloaterNameDesc::LLFloaterNameDesc(const LLSD& args) + : LLFloater(args) + , mIsAudio(false) + , mIsText(false) { - mFilenameAndPath = filename.asString(); + if (args.isString()) + { + mFilenameAndPath = args.asString(); + } + else + { + mFilenameAndPath = args["filename"].asString(); + mDestinationFolderId = args["dest"].asUUID(); + } mFilename = gDirUtilp->getBaseFileName(mFilenameAndPath, false); } @@ -203,7 +212,8 @@ void LLFloaterNameDesc::onBtnOK( ) LLFloaterPerms::getNextOwnerPerms("Uploads"), LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"), - expected_upload_cost)); + expected_upload_cost, + mDestinationFolderId)); upload_new_resource(uploadInfo, callback, nruserdata); } @@ -230,8 +240,8 @@ void LLFloaterNameDesc::onBtnCancel() // LLFloaterSoundPreview() //----------------------------------------------------------------------------- -LLFloaterSoundPreview::LLFloaterSoundPreview(const LLSD& filename ) - : LLFloaterNameDesc(filename) +LLFloaterSoundPreview::LLFloaterSoundPreview(const LLSD& args ) + : LLFloaterNameDesc(args) { mIsAudio = true; } @@ -251,8 +261,8 @@ bool LLFloaterSoundPreview::postBuild() // LLFloaterAnimPreview() //----------------------------------------------------------------------------- -LLFloaterAnimPreview::LLFloaterAnimPreview(const LLSD& filename ) - : LLFloaterNameDesc(filename) +LLFloaterAnimPreview::LLFloaterAnimPreview(const LLSD& args ) + : LLFloaterNameDesc(args) { } @@ -270,8 +280,8 @@ bool LLFloaterAnimPreview::postBuild() // LLFloaterScriptPreview() //----------------------------------------------------------------------------- -LLFloaterScriptPreview::LLFloaterScriptPreview(const LLSD& filename ) - : LLFloaterNameDesc(filename) +LLFloaterScriptPreview::LLFloaterScriptPreview(const LLSD& args ) + : LLFloaterNameDesc(args) { mIsText = true; } diff --git a/indra/newview/llfloaternamedesc.h b/indra/newview/llfloaternamedesc.h index aa5571ccc0..8c8ec49a8e 100644 --- a/indra/newview/llfloaternamedesc.h +++ b/indra/newview/llfloaternamedesc.h @@ -39,7 +39,7 @@ class LLRadioGroup; class LLFloaterNameDesc : public LLFloater { public: - LLFloaterNameDesc(const LLSD& filename); + LLFloaterNameDesc(const LLSD& args); virtual ~LLFloaterNameDesc(); bool postBuild() override; @@ -58,6 +58,7 @@ protected: std::string mFilenameAndPath; std::string mFilename; + LLUUID mDestinationFolderId; }; class LLFloaterSoundPreview : public LLFloaterNameDesc diff --git a/indra/newview/llfloaternewfeaturenotification.cpp b/indra/newview/llfloaternewfeaturenotification.cpp index 369727ff1e..1badcdd3d9 100644 --- a/indra/newview/llfloaternewfeaturenotification.cpp +++ b/indra/newview/llfloaternewfeaturenotification.cpp @@ -43,12 +43,28 @@ bool LLFloaterNewFeatureNotification::postBuild() setCanDrag(false); getChild<LLButton>("close_btn")->setCommitCallback(boost::bind(&LLFloaterNewFeatureNotification::onCloseBtn, this)); - const std::string title_txt = "title_txt"; - const std::string dsc_txt = "description_txt"; - std::string feature = "_" + getKey().asString(); + if (getKey().isString()) + { + const std::string title_txt = "title_txt"; + const std::string dsc_txt = "description_txt"; - getChild<LLUICtrl>(title_txt)->setValue(getString(title_txt + feature)); - getChild<LLUICtrl>(dsc_txt)->setValue(getString(dsc_txt + feature)); + std::string feature = "_" + getKey().asString(); + if (hasString(title_txt + feature)) + { + getChild<LLUICtrl>(title_txt)->setValue(getString(title_txt + feature)); + getChild<LLUICtrl>(dsc_txt)->setValue(getString(dsc_txt + feature)); + } + else + { + // Show blank + LL_WARNS() << "Feature \"" << getKey().asString() << "\" not found for feature notification" << LL_ENDL; + } + } + else + { + // Show blank + LL_WARNS() << "Feature notification without a feature" << LL_ENDL; + } if (getKey().asString() == "gltf") { diff --git a/indra/newview/llfloaterobjectweights.cpp b/indra/newview/llfloaterobjectweights.cpp index 26b7304b9a..fa491a4b27 100644 --- a/indra/newview/llfloaterobjectweights.cpp +++ b/indra/newview/llfloaterobjectweights.cpp @@ -36,6 +36,14 @@ #include "llviewerparcelmgr.h" #include "llviewerregion.h" +static const std::string lod_strings[4] = +{ + "lowest_lod", + "low_lod", + "medium_lod", + "high_lod", +}; + // virtual bool LLCrossParcelFunctor::apply(LLViewerObject* obj) { @@ -75,7 +83,10 @@ LLFloaterObjectWeights::LLFloaterObjectWeights(const LLSD& key) mSelectedOnLand(NULL), mRezzedOnLand(NULL), mRemainingCapacity(NULL), - mTotalCapacity(NULL) + mTotalCapacity(NULL), + mLodLevel(nullptr), + mTrianglesShown(nullptr), + mPixelArea(nullptr) { } @@ -99,6 +110,10 @@ bool LLFloaterObjectWeights::postBuild() mRemainingCapacity = getChild<LLTextBox>("remaining_capacity"); mTotalCapacity = getChild<LLTextBox>("total_capacity"); + mLodLevel = getChild<LLTextBox>("lod_level"); + mTrianglesShown = getChild<LLTextBox>("triangles_shown"); + mPixelArea = getChild<LLTextBox>("pixel_area"); + return true; } @@ -135,6 +150,69 @@ void LLFloaterObjectWeights::setErrorStatus(S32 status, const std::string& reaso toggleWeightsLoadingIndicators(false); } +void LLFloaterObjectWeights::draw() +{ + // Normally it's a bad idea to set text and visibility inside draw + // since it can cause rect updates go to different, already drawn elements, + // but floater is very simple and these elements are supposed to be isolated + LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); + if (selection->isEmpty()) + { + const std::string text = getString("nothing_selected"); + mLodLevel->setText(text); + mTrianglesShown->setText(text); + mPixelArea->setText(text); + + toggleRenderLoadingIndicators(false); + } + else + { + S32 object_lod = -1; + bool multiple_lods = false; + S32 total_tris = 0; + F32 pixel_area = 0; + for (LLObjectSelection::valid_root_iterator iter = selection->valid_root_begin(); + iter != selection->valid_root_end(); ++iter) + { + LLViewerObject* object = (*iter)->getObject(); + S32 lod = object->getLOD(); + if (object_lod < 0) + { + object_lod = lod; + } + else if (object_lod != lod) + { + multiple_lods = true; + } + + if (object->isRootEdit()) + { + total_tris += object->recursiveGetTriangleCount(); + pixel_area += object->getPixelArea(); + } + } + + if (multiple_lods) + { + mLodLevel->setText(getString("multiple_lods")); + toggleRenderLoadingIndicators(false); + } + else if (object_lod < 0) + { + // nodes are waiting for data + toggleRenderLoadingIndicators(true); + } + else + { + mLodLevel->setText(getString(lod_strings[object_lod])); + toggleRenderLoadingIndicators(false); + } + mTrianglesShown->setText(llformat("%d", total_tris)); + mPixelArea->setText(llformat("%d", pixel_area)); + } + LLFloater::draw(); +} + void LLFloaterObjectWeights::updateLandImpacts(const LLParcel* parcel) { if (!parcel || LLSelectMgr::getInstance()->getSelection()->isEmpty()) @@ -252,6 +330,17 @@ void LLFloaterObjectWeights::toggleLandImpactsLoadingIndicators(bool visible) mTotalCapacity->setVisible(!visible); } +void LLFloaterObjectWeights::toggleRenderLoadingIndicators(bool visible) +{ + childSetVisible("lod_level_loading_indicator", visible); + childSetVisible("triangles_shown_loading_indicator", visible); + childSetVisible("pixel_area_loading_indicator", visible); + + mLodLevel->setVisible(!visible); + mTrianglesShown->setVisible(!visible); + mPixelArea->setVisible(!visible); +} + void LLFloaterObjectWeights::updateIfNothingSelected() { const std::string text = getString("nothing_selected"); @@ -269,6 +358,11 @@ void LLFloaterObjectWeights::updateIfNothingSelected() mRemainingCapacity->setText(text); mTotalCapacity->setText(text); + mLodLevel->setText(text); + mTrianglesShown->setText(text); + mPixelArea->setText(text); + toggleWeightsLoadingIndicators(false); toggleLandImpactsLoadingIndicators(false); + toggleRenderLoadingIndicators(false); } diff --git a/indra/newview/llfloaterobjectweights.h b/indra/newview/llfloaterobjectweights.h index 3b999f6b9b..bda625564b 100644 --- a/indra/newview/llfloaterobjectweights.h +++ b/indra/newview/llfloaterobjectweights.h @@ -58,21 +58,24 @@ public: LLFloaterObjectWeights(const LLSD& key); ~LLFloaterObjectWeights(); - /*virtual*/ bool postBuild(); + bool postBuild() override; - /*virtual*/ void onOpen(const LLSD& key); + void onOpen(const LLSD& key) override; - /*virtual*/ void onWeightsUpdate(const SelectionCost& selection_cost); - /*virtual*/ void setErrorStatus(S32 status, const std::string& reason); + void onWeightsUpdate(const SelectionCost& selection_cost) override; + void setErrorStatus(S32 status, const std::string& reason) override; + + void draw() override; void updateLandImpacts(const LLParcel* parcel); - void refresh(); + void refresh() override; private: - /*virtual*/ void generateTransactionID(); + void generateTransactionID() override; void toggleWeightsLoadingIndicators(bool visible); void toggleLandImpactsLoadingIndicators(bool visible); + void toggleRenderLoadingIndicators(bool visible); void updateIfNothingSelected(); @@ -88,6 +91,10 @@ private: LLTextBox *mRezzedOnLand; LLTextBox *mRemainingCapacity; LLTextBox *mTotalCapacity; + + LLTextBox *mLodLevel; + LLTextBox *mTrianglesShown; + LLTextBox *mPixelArea; }; #endif //LL_LLFLOATEROBJECTWEIGHTS_H diff --git a/indra/newview/llfloaterpay.cpp b/indra/newview/llfloaterpay.cpp index e4e7c4ee39..d5e45c09e3 100644 --- a/indra/newview/llfloaterpay.cpp +++ b/indra/newview/llfloaterpay.cpp @@ -127,8 +127,8 @@ const S32 PAY_AMOUNT_NOTIFICATION = 200; LLFloaterPay::LLFloaterPay(const LLSD& key) : LLFloater(key), mCallbackData(), - mCallback(NULL), - mObjectNameText(NULL), + mCallback(nullptr), + mObjectNameText(nullptr), mTargetUUID(key.asUUID()), mTargetIsGroup(false), mHaveName(false) @@ -154,7 +154,7 @@ bool LLFloaterPay::postBuild() { S32 i = 0; - give_money_ptr info = give_money_ptr(new LLGiveMoneyInfo(this, PAY_BUTTON_DEFAULT_0)); + give_money_ptr info = std::make_shared<LLGiveMoneyInfo>(this, PAY_BUTTON_DEFAULT_0); mCallbackData.push_back(info); childSetAction("fastpay 1", boost::bind(LLFloaterPay::onGive, info)); @@ -164,7 +164,7 @@ bool LLFloaterPay::postBuild() mQuickPayInfo[i] = info; ++i; - info = give_money_ptr(new LLGiveMoneyInfo(this, PAY_BUTTON_DEFAULT_1)); + info = std::make_shared<LLGiveMoneyInfo>(this, PAY_BUTTON_DEFAULT_1); mCallbackData.push_back(info); childSetAction("fastpay 5", boost::bind(LLFloaterPay::onGive, info)); @@ -174,7 +174,7 @@ bool LLFloaterPay::postBuild() mQuickPayInfo[i] = info; ++i; - info = give_money_ptr(new LLGiveMoneyInfo(this, PAY_BUTTON_DEFAULT_2)); + info = std::make_shared<LLGiveMoneyInfo>(this, PAY_BUTTON_DEFAULT_2); mCallbackData.push_back(info); childSetAction("fastpay 10", boost::bind(LLFloaterPay::onGive, info)); @@ -184,7 +184,7 @@ bool LLFloaterPay::postBuild() mQuickPayInfo[i] = info; ++i; - info = give_money_ptr(new LLGiveMoneyInfo(this, PAY_BUTTON_DEFAULT_3)); + info = std::make_shared<LLGiveMoneyInfo>(this, PAY_BUTTON_DEFAULT_3); mCallbackData.push_back(info); childSetAction("fastpay 20", boost::bind(LLFloaterPay::onGive, info)); diff --git a/indra/newview/llfloaterperformance.h b/indra/newview/llfloaterperformance.h index 6cca85a009..48e7f4913f 100644 --- a/indra/newview/llfloaterperformance.h +++ b/indra/newview/llfloaterperformance.h @@ -33,6 +33,7 @@ class LLCharacter; class LLCheckBoxCtrl; class LLNameListCtrl; class LLTextBox; +class LLSliderCtrl; class LLFloaterPerformance : public LLFloater { diff --git a/indra/newview/llfloaterperms.cpp b/indra/newview/llfloaterperms.cpp index 7311f0deb6..4c3578119e 100644 --- a/indra/newview/llfloaterperms.cpp +++ b/indra/newview/llfloaterperms.cpp @@ -209,8 +209,8 @@ void LLFloaterPermsDefault::updateCapCoro(std::string url) std::string previousReason; LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("genericPostCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("updateCapCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD postData = LLSD::emptyMap(); postData["default_object_perm_masks"]["Group"] = diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index ce1072a968..eb1b758332 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -366,6 +366,11 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) mCommitCallbackRegistrar.add("Pref.ClearLog", boost::bind(&LLConversationLog::onClearLog, &LLConversationLog::instance())); mCommitCallbackRegistrar.add("Pref.DeleteTranscripts", boost::bind(&LLFloaterPreference::onDeleteTranscripts, this)); mCommitCallbackRegistrar.add("UpdateFilter", boost::bind(&LLFloaterPreference::onUpdateFilterTerm, this, false)); // <FS:ND/> Hook up for filtering +#ifdef LL_DISCORD + gSavedSettings.getControl("EnableDiscord")->getCommitSignal()->connect(boost::bind(&LLAppViewer::updateDiscordActivity)); + gSavedSettings.getControl("ShowDiscordActivityDetails")->getCommitSignal()->connect(boost::bind(&LLAppViewer::updateDiscordActivity)); + gSavedSettings.getControl("ShowDiscordActivityState")->getCommitSignal()->connect(boost::bind(&LLAppViewer::updateDiscordActivity)); +#endif } void LLFloaterPreference::processProperties( void* pData, EAvatarProcessorType type ) @@ -405,11 +410,11 @@ void LLFloaterPreference::saveAvatarPropertiesCoro(const std::string cap_url, bo { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("put_avatar_properties_coro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("put_avatar_properties_coro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLCore::HttpHeaders::ptr_t httpHeaders; - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); httpOpts->setFollowRedirects(true); std::string finalUrl = cap_url + "/" + gAgentID.asString(); @@ -470,6 +475,8 @@ bool LLFloaterPreference::postBuild() getChild<LLUICtrl>("log_path_string")->setEnabled(false); // make it read-only but selectable getChild<LLComboBox>("language_combobox")->setCommitCallback(boost::bind(&LLFloaterPreference::onLanguageChange, this)); + mTimeFormatCombobox = getChild<LLComboBox>("time_format_combobox"); + mTimeFormatCombobox->setCommitCallback(boost::bind(&LLFloaterPreference::onTimeFormatChange, this)); getChild<LLComboBox>("FriendIMOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"FriendIMOptions")); getChild<LLComboBox>("NonFriendIMOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"NonFriendIMOptions")); @@ -523,6 +530,11 @@ bool LLFloaterPreference::postBuild() getChild<LLComboBox>("language_combobox")->add("System default", LLSD("default"), ADD_TOP, true); } +#ifndef LL_DISCORD + LLPanel* panel = getChild<LLPanel>("privacy_preferences_discord"); + getChild<LLTabContainer>("privacy_tab_container")->removeTabPanel(panel); +#endif + return true; } @@ -544,6 +556,10 @@ void LLFloaterPreference::onDoNotDisturbResponseChanged() LLFloaterPreference::~LLFloaterPreference() { LLConversationLog::instance().removeObserver(this); + if (LLAvatarPropertiesProcessor::instanceExists()) + { + LLAvatarPropertiesProcessor::getInstance()->removeObserver(gAgent.getID(), this); + } mComplexityChangedSignal.disconnect(); mImpostorsChangedSignal.disconnect(); } @@ -744,6 +760,7 @@ void LLFloaterPreference::onOpen(const LLSD& key) // Forget previous language changes. mLanguageChanged = false; + mLastQualityLevel = gSavedSettings.getU32("RenderQualityPerformance"); // Display selected maturity icons. onChangeMaturity(); @@ -757,6 +774,17 @@ void LLFloaterPreference::onOpen(const LLSD& key) // Load (double-)click to walk/teleport settings. updateClickActionViews(); +#if LL_LINUX + // Lixux doesn't support automatic mode + LLComboBox* combo = getChild<LLComboBox>("double_click_action_combo"); + S32 mode = gSavedSettings.getS32("MouseWarpMode"); + if (mode == 0) + { + combo->setValue("1"); + } + combo->setEnabledByValue("0", false); +#endif + // Enabled/disabled popups, might have been changed by user actions // while preferences floater was closed. buildPopupLists(); @@ -1088,6 +1116,13 @@ void LLFloaterPreference::onLanguageChange() } } +void LLFloaterPreference::onTimeFormatChange() +{ + std::string val = mTimeFormatCombobox->getValue(); + gSavedSettings.setBOOL("Use24HourClock", val == "1"); + onLanguageChange(); +} + void LLFloaterPreference::onNotificationsChange(const std::string& OptionName) { mNotificationOptions[OptionName] = getChild<LLComboBox>(OptionName)->getSelectedItemLabel(); @@ -1303,6 +1338,8 @@ void LLFloaterPreference::refresh() advanced->refresh(); } updateClickActionViews(); + + mTimeFormatCombobox->selectByValue(gSavedSettings.getBOOL("Use24HourClock") ? "1" : "0"); } void LLFloaterPreference::onCommitWindowedMode() @@ -1313,7 +1350,35 @@ void LLFloaterPreference::onCommitWindowedMode() void LLFloaterPreference::onChangeQuality(const LLSD& data) { U32 level = (U32)(data.asReal()); + constexpr U32 LVL_HIGH = 4; + if (level >= LVL_HIGH && mLastQualityLevel < level) + { + constexpr U32 LOW_MEM_THRESHOLD = 4097; + U32 total_mem = (U32Megabytes)LLMemory::getMaxMemKB(); + if (total_mem < LOW_MEM_THRESHOLD) + { + LLSD args; + args["TOTAL_MEM"] = LLSD::Integer(total_mem); + LLNotificationsUtil::add("PreferenceQualityWithLowMemory", args, LLSD(), [this](const LLSD& notification, const LLSD& response) + { + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + // If cancel pressed + if (option == 1) + { + constexpr U32 LVL_MED_PLUS = 3; + gSavedSettings.setU32("RenderQualityPerformance", LVL_MED_PLUS); + mLastQualityLevel = LVL_MED_PLUS; + LLFeatureManager::getInstance()->setGraphicsLevel(LVL_MED_PLUS, true); + refreshEnabledGraphics(); + refresh(); + } + } + ); + } + } + mLastQualityLevel = level; LLFeatureManager::getInstance()->setGraphicsLevel(level, true); + gSavedSettings.setU32("DebugQualityPerformance", level); refreshEnabledGraphics(); refresh(); } @@ -1670,6 +1735,22 @@ void LLFloaterPreference::onChangeMaturity() || sim_access == SIM_ACCESS_ADULT); getChild<LLIconCtrl>("rating_icon_adult")->setVisible(sim_access == SIM_ACCESS_ADULT); + + // Update Legacy Search maturity settings + bool can_access_mature = gAgent.canAccessMature(); + bool can_access_adult = gAgent.canAccessAdult(); + if (!can_access_mature) + { + gSavedSettings.setBOOL("ShowMatureSims", false); + gSavedSettings.setBOOL("ShowMatureLand", false); + gSavedSettings.setBOOL("ShowMatureClassifieds", false); + } + if (!can_access_adult) + { + gSavedSettings.setBOOL("ShowAdultSims", false); + gSavedSettings.setBOOL("ShowAdultLand", false); + gSavedSettings.setBOOL("ShowAdultClassifieds", false); + } } void LLFloaterPreference::onChangeComplexityMode(const LLSD& newvalue) @@ -1964,7 +2045,21 @@ void LLFloaterPreference::selectChatPanel() void LLFloaterPreference::changed() { + if (LLConversationLog::instance().getIsLoggingEnabled()) + { getChild<LLButton>("clear_log")->setEnabled(LLConversationLog::instance().getConversations().size() > 0); + } + else + { + // onClearLog clears list, then notifies changed() and only then clears file, + // so check presence of conversations before checking file, file will cleared later. + llstat st; + bool has_logs = LLConversationLog::instance().getConversations().size() > 0 + && LLFile::stat(LLConversationLog::instance().getFileName(), &st) == 0 + && S_ISREG(st.st_mode) + && st.st_size > 0; + getChild<LLButton>("clear_log")->setEnabled(has_logs); + } // set 'enable' property for 'Delete transcripts...' button updateDeleteTranscriptsButton(); @@ -1989,7 +2084,7 @@ class LLPanelPreference::Updater : public LLEventTimer public: - typedef boost::function<bool(const LLSD&)> callback_t; + typedef std::function<bool(const LLSD&)> callback_t; Updater(callback_t cb, F32 period) :LLEventTimer(period), @@ -2350,6 +2445,7 @@ private: }; static LLPanelInjector<LLPanelPreferenceGraphics> t_pref_graph("panel_preference_graphics"); +static LLPanelInjector<LLPanelPreferenceGraphics3> t_pref_graph3("panel_preference_graphics3"); static LLPanelInjector<LLPanelPreferencePrivacy> t_pref_privacy("panel_preference_privacy"); bool LLPanelPreferenceGraphics::postBuild() @@ -2519,6 +2615,174 @@ void LLPanelPreferenceGraphics::setHardwareDefaults() resetDirtyChilds(); } +// LLPanelPreferenceGraphics3 (Visuals Effects) + +bool LLPanelPreferenceGraphics3::postBuild() +{ + getChild<LLButton>("MPBalancedButton")->setCommitCallback(boost::bind(&LLPanelPreferenceGraphics3::onMPRecommanded, this)); + return LLPanelPreference::postBuild(); +} + +void LLPanelPreferenceGraphics3::draw() +{ + LLPanelPreference::draw(); +} + +bool LLPanelPreferenceGraphics3::hasDirtyChilds() +{ + LLFloater* advanced = LLFloaterReg::findTypedInstance<LLFloater>("prefs_graphics_advanced"); + std::list<LLView*> view_stack; + view_stack.push_back(this); + if (advanced) + { + view_stack.push_back(advanced); + } + while(!view_stack.empty()) + { + // Process view on top of the stack + LLView* curview = view_stack.front(); + view_stack.pop_front(); + + LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview); + if (ctrl) + { + if (ctrl->isDirty()) + { + LLControlVariable* control = ctrl->getControlVariable(); + if (control) + { + std::string control_name = control->getName(); + if (!control_name.empty()) + { + return true; + } + } + } + } + // Push children onto the end of the work stack + for (child_list_t::const_iterator iter = curview->getChildList()->begin(); + iter != curview->getChildList()->end(); ++iter) + { + view_stack.push_back(*iter); + } + } + + return false; +} + +void LLPanelPreferenceGraphics3::resetDirtyChilds() +{ + LLFloater* advanced = LLFloaterReg::findTypedInstance<LLFloater>("prefs_graphics_advanced"); + std::list<LLView*> view_stack; + view_stack.push_back(this); + if (advanced) + { + view_stack.push_back(advanced); + } + while(!view_stack.empty()) + { + // Process view on top of the stack + LLView* curview = view_stack.front(); + view_stack.pop_front(); + + LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview); + if (ctrl) + { + ctrl->resetDirty(); + } + // Push children onto the end of the work stack + for (child_list_t::const_iterator iter = curview->getChildList()->begin(); + iter != curview->getChildList()->end(); ++iter) + { + view_stack.push_back(*iter); + } + } +} + +void LLPanelPreferenceGraphics3::cancel(const std::vector<std::string> settings_to_skip) +{ + LLPanelPreference::cancel(settings_to_skip); +} +void LLPanelPreferenceGraphics3::saveSettings() +{ + resetDirtyChilds(); + std::string preset_graphic_active = gSavedSettings.getString("PresetGraphicActive"); + if (preset_graphic_active.empty()) + { + LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); + if (instance) + { + //don't restore previous preset after closing Preferences + instance->saveGraphicsPreset(preset_graphic_active); + } + } + LLPanelPreference::saveSettings(); +} + +void LLPanelPreferenceGraphics3::onMPRecommanded() +{ + //LL_WARNS() << "onClickMPRecommanded()" << LL_ENDL; + + // LOD + + gSavedSettings.setF32("RenderVolumeLODFactor", 3.5); + gSavedSettings.setF32("RenderAvatarPhysicsLODFactor", 1.0); + + // AA + + gSavedSettings.setU32("RenderFSAAType", 2); + gSavedSettings.setU32("RenderFSAASamples", 2); + + gSavedSettings.setBOOL("RenderAnisotropic", false); + + // Shadows + + gSavedSettings.setS32("RenderShadowDetail", 0); + gSavedSettings.setF32("MPRenderShadowMaxDist", 40.0); + gSavedSettings.setF32("RenderShadowResolutionScale", 2.0); + gSavedSettings.setF32("RenderShadowBlurSize", 0.2); + gSavedSettings.setBOOL("RenderDeferredSSAO", 0); + + // Bloom + + gSavedSettings.setU32("MPRenderBloom", 0); + gSavedSettings.setF32("MPBloomBlurRadius", 1.2); + gSavedSettings.setF32("MPBloomBlurRadiusAdd", 1.2); + gSavedSettings.setF32("MPBloomExtractBrightness", 0.1); + gSavedSettings.setF32("MPBloomStrength", 1.0); + + gSavedSettings.setF32("MPBloomExtractMetal", 0.4); + gSavedSettings.setF32("MPBloomExtractNonMetal", 0.0); + + // Probes + + gSavedSettings.setS32("RenderReflectionProbeDetail", 0); + gSavedSettings.setS32("RenderReflectionProbeLevel", 1); + gSavedSettings.setU32("RenderReflectionProbeCount", 32); + gSavedSettings.setU32("RenderReflectionProbeResolution", 128); + gSavedSettings.setF32("RenderReflectionProbeDrawDistance", 24.0); + gSavedSettings.setF32("RenderDefaultProbeUpdatePeriod", 20.0); + gSavedSettings.setF32("MPRenderProbeUpdatePeriod", 30.0); + gSavedSettings.setF32("MPRenderProbeSlowDown", 0.02); + + // Misc + + gSavedSettings.setBOOL("RenderDisableVintageMode", true); + gSavedSettings.setBOOL("RenderTransparentWater", true); + gSavedSettings.setU32("MPColorPrecision", 0); + + gSavedSettings.setU32("RenderResolutionDivisor", 1.0); + + gSavedSettings.setBOOL("RenderGLMultiThreadedTextures", false); + gSavedSettings.setBOOL("RenderAppleUseMultGL", false); + gSavedSettings.setBOOL("MPNoGLDebug", true); + + gSavedSettings.setBOOL("MPHDRDisplay", false); + gSavedSettings.setF32("MPHDRBoost", 1.0); + gSavedSettings.setF32("MPHDRUIBoost", 1.0); + gSavedSettings.setF32("MPHDRGamma", 2.4); +} + //------------------------LLPanelPreferenceControls-------------------------------- static LLPanelInjector<LLPanelPreferenceControls> t_pref_contrls("panel_preference_controls"); @@ -3432,7 +3696,7 @@ void LLFloaterPreference::collectSearchableItems() LLTabContainer *pRoot = getChild< LLTabContainer >( "pref core" ); if( mFilterEdit && pRoot ) { - mSearchData.reset(new ll::prefs::SearchData() ); + mSearchData = std::make_unique<ll::prefs::SearchData>(); ll::prefs::TabContainerDataPtr pRootTabcontainer = ll::prefs::TabContainerDataPtr( new ll::prefs::TabContainerData ); pRootTabcontainer->mTabContainer = pRoot; diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 40806c22fc..8d3f1ed6b0 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -117,6 +117,7 @@ protected: void onClickClearCache(); // Clear viewer texture cache, file cache on next startup void onClickBrowserClearCache(); // Clear web history and caches as well as viewer caches above void onLanguageChange(); + void onTimeFormatChange(); void onNotificationsChange(const std::string& OptionName); void onNameTagOpacityChange(const LLSD& newvalue); @@ -218,6 +219,7 @@ private: bool mGotPersonalInfo; bool mLanguageChanged; bool mAvatarDataInitialized; + U32 mLastQualityLevel = 0; std::string mPriorInstantMessageLogPath; bool mOriginalHideOnlineStatus; @@ -234,6 +236,7 @@ private: LLButton* mDeleteTranscriptsBtn = nullptr; LLButton* mEnablePopupBtn = nullptr; LLButton* mDisablePopupBtn = nullptr; + LLComboBox* mTimeFormatCombobox = nullptr; std::unique_ptr< ll::prefs::SearchData > mSearchData; bool mSearchDataDirty; @@ -313,6 +316,26 @@ private: LOG_CLASS(LLPanelPreferenceGraphics); }; +class LLPanelPreferenceGraphics3 : public LLPanelPreference +{ +public: + bool postBuild(); + void draw(); + void cancel(const std::vector<std::string> settings_to_skip = {}); + void saveSettings(); + void resetDirtyChilds(); + void onMPRecommanded(); + +protected: + bool hasDirtyChilds(); + + +private: + + + LOG_CLASS(LLPanelPreferenceGraphics3); +}; + class LLPanelPreferenceControls : public LLPanelPreference, public LLKeyBindResponderInterface { LOG_CLASS(LLPanelPreferenceControls); diff --git a/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp b/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp index 5e53e00e0a..a8a1e507a8 100644 --- a/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp +++ b/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp @@ -51,6 +51,8 @@ LLFloaterPreferenceGraphicsAdvanced::LLFloaterPreferenceGraphicsAdvanced(const L mCommitCallbackRegistrar.add("Pref.Cancel", boost::bind(&LLFloaterPreferenceGraphicsAdvanced::onBtnCancel, this, _2)); mCommitCallbackRegistrar.add("Pref.OK", boost::bind(&LLFloaterPreferenceGraphicsAdvanced::onBtnOK, this, _2)); + + mImpostorsChangedSignal = gSavedSettings.getControl("RenderAvatarMaxNonImpostors")->getSignal()->connect(boost::bind(&LLFloaterPreferenceGraphicsAdvanced::updateIndirectMaxNonImpostors, this, _2)); } LLFloaterPreferenceGraphicsAdvanced::~LLFloaterPreferenceGraphicsAdvanced() @@ -58,7 +60,6 @@ LLFloaterPreferenceGraphicsAdvanced::~LLFloaterPreferenceGraphicsAdvanced() mComplexityChangedSignal.disconnect(); mComplexityModeChangedSignal.disconnect(); mLODFactorChangedSignal.disconnect(); - mNumImpostorsChangedSignal.disconnect(); } bool LLFloaterPreferenceGraphicsAdvanced::postBuild() diff --git a/indra/newview/llfloaterpreferencesgraphicsadvanced.h b/indra/newview/llfloaterpreferencesgraphicsadvanced.h index 61203be068..6f793c1379 100644 --- a/indra/newview/llfloaterpreferencesgraphicsadvanced.h +++ b/indra/newview/llfloaterpreferencesgraphicsadvanced.h @@ -61,6 +61,7 @@ protected: void onBtnOK(const LLSD& userdata); void onBtnCancel(const LLSD& userdata); + boost::signals2::connection mImpostorsChangedSignal; boost::signals2::connection mComplexityChangedSignal; boost::signals2::connection mComplexityModeChangedSignal; boost::signals2::connection mLODFactorChangedSignal; diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 6bbd27478c..2be5953ecd 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -94,7 +94,6 @@ #include "llmeshrepository.h" #include "llfloaterregionrestarting.h" #include "llpanelexperiencelisteditor.h" -#include <boost/function.hpp> #include "llpanelexperiencepicker.h" #include "llexperiencecache.h" #include "llpanelexperiences.h" @@ -270,10 +269,12 @@ bool LLFloaterRegionInfo::postBuild() static LLCachedControl<bool> feature_pbr_terrain_transforms_enabled(gSavedSettings, "RenderTerrainPBRTransformsEnabled", false); if (!feature_pbr_terrain_transforms_enabled() || !feature_pbr_terrain_enabled()) { + LL_INFOS("Terrain") << "Building region terrain panel from panel_region_terrain.xml" << LL_ENDL; panel->buildFromFile("panel_region_terrain.xml"); } else { + LL_INFOS("Terrain") << "Building region terrain panel from panel_region_terrain_texture_transform.xml" << LL_ENDL; panel->buildFromFile("panel_region_terrain_texture_transform.xml"); } mTab->addTabPanel(panel); @@ -851,6 +852,13 @@ void LLPanelRegionInfo::initCtrl(const std::string& name) getChild<LLUICtrl>(name)->setCommitCallback(boost::bind(&LLPanelRegionInfo::onChangeAnything, this)); } +void LLPanelRegionInfo::initAndSetTexCtrl(LLTextureCtrl*& ctrl, const std::string& name) +{ + ctrl = findChild<LLTextureCtrl>(name); + if (ctrl) + ctrl->setOnSelectCallback([this](LLUICtrl* ctrl, const LLSD& param){ onChangeAnything(); }); +} + template<typename CTRL> void LLPanelRegionInfo::initAndSetCtrl(CTRL*& ctrl, const std::string& name) { @@ -1483,6 +1491,11 @@ bool LLPanelRegionTerrainInfo::validateMaterials() const LLUUID& material_asset_id = material_ctrl->getImageAssetID(); llassert(material_asset_id.notNull()); if (material_asset_id.isNull()) { return false; } + if (material_asset_id == BLANK_MATERIAL_ASSET_ID) + { + // Default/Blank material is valid by default + continue; + } const LLFetchedGLTFMaterial* material = gGLTFMaterialList.getMaterial(material_asset_id); if (!material->isLoaded()) { @@ -1580,7 +1593,7 @@ bool LLPanelRegionTerrainInfo::postBuild() for(S32 i = 0; i < LLTerrainMaterials::ASSET_COUNT; ++i) { - initAndSetCtrl(mTextureDetailCtrl[i], llformat("texture_detail_%d", i)); + initAndSetTexCtrl(mTextureDetailCtrl[i], llformat("texture_detail_%d", i)); if (mTextureDetailCtrl[i]) { mTextureDetailCtrl[i]->setBakeTextureEnabled(false); @@ -1992,18 +2005,7 @@ void LLPanelRegionTerrainInfo::initMaterialCtrl(LLTextureCtrl*& ctrl, const std: ctrl->setCommitCallback( [this, index](LLUICtrl* ctrl, const LLSD& param) { - if (!mMaterialScaleUCtrl[index] - || !mMaterialScaleVCtrl[index] - || !mMaterialRotationCtrl[index] - || !mMaterialOffsetUCtrl[index] - || !mMaterialOffsetVCtrl[index]) return; - - mMaterialScaleUCtrl[index]->setValue(1.f); - mMaterialScaleVCtrl[index]->setValue(1.f); - mMaterialRotationCtrl[index]->setValue(0.f); - mMaterialOffsetUCtrl[index]->setValue(0.f); - mMaterialOffsetVCtrl[index]->setValue(0.f); - onChangeAnything(); + callbackMaterialCommit(index); }); } @@ -2091,6 +2093,25 @@ bool LLPanelRegionTerrainInfo::callbackBakeTerrain(const LLSD& notification, con return false; } +void LLPanelRegionTerrainInfo::callbackMaterialCommit(S32 index) +{ + // These can be null if 'transforms' panel was not inited + if (mMaterialScaleUCtrl[index] + && mMaterialScaleVCtrl[index] + && mMaterialRotationCtrl[index] + && mMaterialOffsetUCtrl[index] + && mMaterialOffsetVCtrl[index]) + { + mMaterialScaleUCtrl[index]->setValue(1.f); + mMaterialScaleVCtrl[index]->setValue(1.f); + mMaterialRotationCtrl[index]->setValue(0.f); + mMaterialOffsetUCtrl[index]->setValue(0.f); + mMaterialOffsetVCtrl[index]->setValue(0.f); + } + + onChangeAnything(); +} + ///////////////////////////////////////////////////////////////////////////// // LLPanelEstateInfo // @@ -4026,8 +4047,8 @@ void LLPanelEstateAccess::updateLists() void LLPanelEstateAccess::requestEstateGetAccessCoro(std::string url) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); - LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("requestEstateGetAccessoCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("requestEstateGetAccessoCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD result = httpAdapter->getAndSuspend(httpRequest, url); diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index 201d8b0a68..0036df9c3d 100644 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -159,6 +159,7 @@ public: protected: void initCtrl(const std::string& name); template<typename CTRL> void initAndSetCtrl(CTRL*& ctrl, const std::string& name); + void initAndSetTexCtrl(LLTextureCtrl*& ctrl, const std::string& name); // Returns true if update sent and apply button should be // disabled. @@ -271,6 +272,7 @@ public: static void onClickBakeTerrain(void*); bool callbackBakeTerrain(const LLSD& notification, const LLSD& response); bool callbackTextureHeights(const LLSD& notification, const LLSD& response); + void callbackMaterialCommit(S32 index); protected: bool sendUpdate() override; diff --git a/indra/newview/llfloaterregionrestartschedule.cpp b/indra/newview/llfloaterregionrestartschedule.cpp index 59bcb22dce..cd699efd5b 100644 --- a/indra/newview/llfloaterregionrestartschedule.cpp +++ b/indra/newview/llfloaterregionrestartschedule.cpp @@ -272,9 +272,9 @@ void LLFloaterRegionRestartSchedule::requestRegionShcheduleCoro(std::string url, { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("RegionShcheduleRequest", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("RegionShcheduleRequest", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); httpOpts->setWantHeaders(true); @@ -367,9 +367,9 @@ void LLFloaterRegionRestartSchedule::setRegionShcheduleCoro(std::string url, LLS { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("RegionShcheduleSetter", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("RegionShcheduleSetter", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); httpOpts->setWantHeaders(true); diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index e2c6305f4f..7e7eb91636 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -417,8 +417,8 @@ void LLFloaterReporter::requestAbuseCategoriesCoro(std::string url, LLHandle<LLF { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("requestAbuseCategoriesCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("requestAbuseCategoriesCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD result = httpAdapter->getAndSuspend(httpRequest, url); @@ -860,7 +860,7 @@ void LLFloaterReporter::sendReportViaCaps(std::string url, std::string sshot_url if(!sshot_url.empty()) { // try to upload screenshot - LLResourceUploadInfo::ptr_t uploadInfo(new LLARScreenShotUploader(report, mResourceDatap->mAssetInfo.mUuid, mResourceDatap->mAssetInfo.mType)); + LLResourceUploadInfo::ptr_t uploadInfo = std::make_shared<LLARScreenShotUploader>(report, mResourceDatap->mAssetInfo.mUuid, mResourceDatap->mAssetInfo.mType); LLViewerAssetUpload::EnqueueInventoryUpload(sshot_url, uploadInfo); } else diff --git a/indra/newview/llfloaterscriptlimits.cpp b/indra/newview/llfloaterscriptlimits.cpp index b3452a25c5..58d624a7d0 100644 --- a/indra/newview/llfloaterscriptlimits.cpp +++ b/indra/newview/llfloaterscriptlimits.cpp @@ -178,8 +178,8 @@ void LLPanelScriptLimitsRegionMemory::getLandScriptResourcesCoro(std::string url { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getLandScriptResourcesCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("getLandScriptResourcesCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD postData; @@ -222,8 +222,8 @@ void LLPanelScriptLimitsRegionMemory::getLandScriptSummaryCoro(std::string url) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getLandScriptSummaryCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("getLandScriptSummaryCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD result = httpAdapter->getAndSuspend(httpRequest, url); @@ -274,8 +274,8 @@ void LLPanelScriptLimitsRegionMemory::getLandScriptDetailsCoro(std::string url) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getLandScriptDetailsCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("getLandScriptDetailsCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD result = httpAdapter->getAndSuspend(httpRequest, url); @@ -487,13 +487,13 @@ void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content) names_requested.push_back(owner_id); if (is_group_owned) { - gCacheName->getGroup(owner_id, + mGroupNameCacheConnection = gCacheName->getGroup(owner_id, boost::bind(&LLPanelScriptLimitsRegionMemory::onNameCache, this, _1, _2)); } else { - LLAvatarNameCache::get(owner_id, + mAvatarNameCacheConnection = LLAvatarNameCache::get(owner_id, boost::bind(&LLPanelScriptLimitsRegionMemory::onAvatarNameCache, this, _1, _2)); } diff --git a/indra/newview/llfloaterscriptlimits.h b/indra/newview/llfloaterscriptlimits.h index e1eb8cb079..fe96bfbf3a 100644 --- a/indra/newview/llfloaterscriptlimits.h +++ b/indra/newview/llfloaterscriptlimits.h @@ -136,6 +136,9 @@ private: std::vector<LLSD> mObjectListItems; + boost::signals2::scoped_connection mAvatarNameCacheConnection; + boost::signals2::scoped_connection mGroupNameCacheConnection; + void getLandScriptResourcesCoro(std::string url); void getLandScriptSummaryCoro(std::string url); void getLandScriptDetailsCoro(std::string url); diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index d3c8bf3451..9b7a4e5134 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -1,11 +1,10 @@ /** * @file llfloatersearch.cpp - * @author Martin Reddy - * @brief Search floater - uses an embedded web browser control + * @brief Floater for Search (update 2025, preload) * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2011, Linden Research, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -27,68 +26,48 @@ #include "llviewerprecompiledheaders.h" +#include "llfloatersearch.h" + +#include "llagent.h" #include "llcommandhandler.h" #include "llfloaterreg.h" -#include "llfloatersearch.h" -#include "llhttpconstants.h" #include "llmediactrl.h" -#include "llnotificationsutil.h" -#include "lllogininstance.h" -#include "lluri.h" -#include "llagent.h" -#include "llui.h" +#include "lluictrlfactory.h" #include "llviewercontrol.h" #include "llweb.h" // support secondlife:///app/search/{CATEGORY}/{QUERY} SLapps -class LLSearchHandler : public LLCommandHandler -{ -public: - // requires trusted browser to trigger - LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_CLICK_ONLY) { } - bool handle(const LLSD& tokens, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web) - { - const size_t parts = tokens.size(); - - // get the (optional) category for the search - std::string collection; - if (parts > 0) - { - collection = tokens[0].asString(); - } +class LLSearchHandler : public LLCommandHandler { + public: + // requires trusted browser to trigger + LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_CLICK_ONLY) { } + bool handle(const LLSD& tokens, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web) { + const size_t parts = tokens.size(); - // get the (optional) search string - std::string search_text; - if (parts > 1) - { - search_text = tokens[1].asString(); - } + // get the (optional) category for the search + std::string collection; + if (parts > 0) + { + collection = tokens[0].asString(); + } - // create the LLSD arguments for the search floater - LLFloaterSearch::Params p; - p.search.collection = collection; - p.search.query = LLURI::unescape(search_text); + // get the (optional) search string + std::string search_text; + if (parts > 1) + { + search_text = tokens[1].asString(); + } - // open the search floater and perform the requested search - LLFloaterReg::showInstance("search", p); - return true; - } + // open the search floater and perform the requested search + LLFloaterReg::showInstance("search", llsd::map("collection", collection,"query", search_text)); + return true; + } }; LLSearchHandler gSearchHandler; -LLFloaterSearch::SearchQuery::SearchQuery() -: category("category", ""), - collection("collection", ""), - query("query") -{} - -LLFloaterSearch::LLFloaterSearch(const Params& key) : - LLFloaterWebContent(key), - mSearchGodLevel(0) +LLFloaterSearch::LLFloaterSearch(const LLSD& key) + : LLFloaterWebContent(key) { - // declare a map that transforms a category name into - // the URL suffix that is used to search that category - mSearchType.insert("standard"); mSearchType.insert("land"); mSearchType.insert("classified"); @@ -100,76 +79,53 @@ LLFloaterSearch::LLFloaterSearch(const Params& key) : mCollectionType.insert("people"); } -bool LLFloaterSearch::postBuild() +LLFloaterSearch::~LLFloaterSearch() { - LLFloaterWebContent::postBuild(); - mWebBrowser->addObserver(this); - - return true; } -void LLFloaterSearch::onOpen(const LLSD& key) +void LLFloaterSearch::onOpen(const LLSD& tokens) { - Params p(key); - p.trusted_content = true; - p.allow_address_entry = false; - - LLFloaterWebContent::onOpen(p); + initiateSearch(tokens); mWebBrowser->setFocus(true); - search(p.search); } +// just to override LLFloaterWebContent void LLFloaterSearch::onClose(bool app_quitting) { - LLFloaterWebContent::onClose(app_quitting); - // tear down the web view so we don't show the previous search - // result when the floater is opened next time - destroy(); } -void LLFloaterSearch::godLevelChanged(U8 godlevel) +void LLFloaterSearch::initiateSearch(const LLSD& tokens) { - // search results can change based upon god level - if the user - // changes god level, then give them a warning (we don't refresh - // the search as this might undo any page navigation or - // AJAX-driven changes since the last search). + std::string url = gSavedSettings.getString("SearchURL"); - //FIXME: set status bar text + LLSD subs; - //getChildView("refresh_search")->setVisible( (godlevel != mSearchGodLevel)); -} + // Setting this substitution here results in a full set of collections being + // substituted into the final URL using the logic from the original search. + subs["TYPE"] = "standard"; -void LLFloaterSearch::search(const SearchQuery &p) -{ - if (! mWebBrowser || !p.validateBlock()) - { - return; - } + std::string collection = tokens.has("collection") ? tokens["collection"].asString() : ""; - // reset the god level warning as we're sending the latest state - getChildView("refresh_search")->setVisible(false); - mSearchGodLevel = gAgent.getGodLevel(); + std::string search_text = tokens.has("query") ? tokens["query"].asString() : ""; - // work out the subdir to use based on the requested category - LLSD subs; - if (mSearchType.find(p.category) != mSearchType.end()) + std::string category = tokens.has("category") ? tokens["category"].asString() : ""; + if (mSearchType.find(category) != mSearchType.end()) { - subs["TYPE"] = p.category; + subs["TYPE"] = category; } else { subs["TYPE"] = "standard"; } - // add the search query string - subs["QUERY"] = LLURI::escape(p.query); + subs["QUERY"] = LLURI::escape(search_text); subs["COLLECTION"] = ""; if (subs["TYPE"] == "standard") { - if (mCollectionType.find(p.collection) != mCollectionType.end()) + if (mCollectionType.find(collection) != mCollectionType.end()) { - subs["COLLECTION"] = "&collection_chosen=" + std::string(p.collection); + subs["COLLECTION"] = "&collection_chosen=" + std::string(collection); } else { @@ -182,30 +138,50 @@ void LLFloaterSearch::search(const SearchQuery &p) } } - // add the user's preferred maturity (can be changed via prefs) - std::string maturity; + // Default to PG + std::string maturity = "g"; if (gAgent.prefersAdult()) { - maturity = "gma"; // PG,Mature,Adult + // PG,Mature,Adult + maturity = "gma"; } else if (gAgent.prefersMature()) { - maturity = "gm"; // PG,Mature - } - else - { - maturity = "g"; // PG + // PG,Mature + maturity = "gm"; } subs["MATURITY"] = maturity; - // add the user's god status + // God status subs["GODLIKE"] = gAgent.isGodlike() ? "1" : "0"; - // get the search URL and expand all of the substitutions - // (also adds things like [LANGUAGE], [VERSION], [OS], etc.) - std::string url = gSavedSettings.getString("SearchURL"); + // This call expands a set of generic substitutions like language, viewer version + // etc. and then also does the same with the list of subs passed in. url = LLWeb::expandURLSubstitutions(url, subs); - // and load the URL in the web view + // Naviation to the calculated URL - we know it's HTML so we can + // tell the media system not to bother with the MIME type check. mWebBrowser->navigateTo(url, HTTP_CONTENT_TEXT_HTML); } + +bool LLFloaterSearch::postBuild() +{ + if (!LLFloaterWebContent::postBuild()) + return false; + + mWebBrowser->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL")); + + // If cookie is there, will set it now, Otherwise will have to wait for login completion + // which will also update search instance if it already exists. + LLViewerMedia::getInstance()->getOpenIDCookie(mWebBrowser); + + getChildView("address")->setEnabled(false); + getChildView("popexternal")->setEnabled(false); + + // This call is actioned by the preload code in llViewerWindow + // that creates the search floater during the login process + // using a generic search with no query + initiateSearch(LLSD()); + + return true; +} diff --git a/indra/newview/llfloatersearch.h b/indra/newview/llfloatersearch.h index beaac2ad2f..6d93474f4a 100644 --- a/indra/newview/llfloatersearch.h +++ b/indra/newview/llfloatersearch.h @@ -1,11 +1,10 @@ /** * @file llfloatersearch.h - * @author Martin Reddy - * @brief Search floater - uses an embedded web browser control + * @brief Floater for Search (update 2025, preload) * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2011, Linden Research, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -25,70 +24,25 @@ * $/LicenseInfo$ */ -#ifndef LL_LLFLOATERSEARCH_H -#define LL_LLFLOATERSEARCH_H +#pragma once +#include "llfloater.h" #include "llfloaterwebcontent.h" -#include "llviewermediaobserver.h" -#include <string> +class LLFloaterSearch: + public LLFloaterWebContent { + friend class LLFloaterReg; -class LLMediaCtrl; + public: + void onOpen(const LLSD& key) override; + void onClose(bool app_quitting) override; -/// -/// The search floater allows users to perform all search operations. -/// All search functionality is now implemented via web services and -/// so this floater simply embeds a web view and displays the search -/// web page. The browser control is explicitly marked as "trusted" -/// so that the user can click on teleport links in search results. -/// -class LLFloaterSearch : - public LLFloaterWebContent -{ -public: - struct SearchQuery : public LLInitParam::Block<SearchQuery> - { - Optional<std::string> category; - Optional<std::string> collection; - Optional<std::string> query; + private: + LLFloaterSearch(const LLSD& key); + ~LLFloaterSearch(); + void initiateSearch(const LLSD& tokens); + bool postBuild() override; - SearchQuery(); - }; - - struct _Params : public LLInitParam::Block<_Params, LLFloaterWebContent::Params> - { - Optional<SearchQuery> search; - }; - - typedef LLSDParamAdapter<_Params> Params; - - LLFloaterSearch(const Params& key); - - /// show the search floater with a new search - /// see search() for details on the key parameter. - /*virtual*/ void onOpen(const LLSD& key); - - /*virtual*/ void onClose(bool app_quitting); - - /// perform a search with the specific search term. - /// The key should be a map that can contain the following keys: - /// - "id": specifies the text phrase to search for - /// - "category": one of "all" (default), "people", "places", - /// "events", "groups", "wiki", "destinations", "classifieds" - void search(const SearchQuery &query); - - /// changing godmode can affect the search results that are - /// returned by the search website - use this method to tell the - /// search floater that the user has changed god level. - void godLevelChanged(U8 godlevel); - -private: - /*virtual*/ bool postBuild(); - - std::set<std::string> mSearchType; - std::set<std::string> mCollectionType; - U8 mSearchGodLevel; + std::set<std::string> mSearchType; + std::set<std::string> mCollectionType; }; - -#endif // LL_LLFLOATERSEARCH_H - diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp index 8cc01f6dc6..01108b5cfa 100644 --- a/indra/newview/llfloatersettingsdebug.cpp +++ b/indra/newview/llfloatersettingsdebug.cpp @@ -207,14 +207,14 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp) mSettingNameText->setToolTip(controlp->getName()); mComment->setVisible(true); - std::string old_text = mComment->getText(); std::string new_text = controlp->getComment(); // Don't setText if not nessesary, it will reset scroll // This is a debug UI that reads from xml, there might // be use cases where comment changes, but not the name - if (old_text != new_text) + if (mOldText != new_text) { mComment->setText(controlp->getComment()); + mOldText = new_text; } mValSpinner1->setMaxValue(F32_MAX); @@ -467,6 +467,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp) } default: mComment->setText(std::string("unknown")); + mOldText = "unknown"; break; } } diff --git a/indra/newview/llfloatersettingsdebug.h b/indra/newview/llfloatersettingsdebug.h index b813cf4a74..8781cd3b67 100644 --- a/indra/newview/llfloatersettingsdebug.h +++ b/indra/newview/llfloatersettingsdebug.h @@ -82,6 +82,7 @@ protected: LLColorSwatchCtrl* mColorSwatch = nullptr; std::string mSearchFilter; + std::string mOldText; }; #endif //LLFLOATERDEBUGSETTINGS_H diff --git a/indra/newview/llfloatersimplesnapshot.cpp b/indra/newview/llfloatersimplesnapshot.cpp index c0de8ab811..55b39d9193 100644 --- a/indra/newview/llfloatersimplesnapshot.cpp +++ b/indra/newview/llfloatersimplesnapshot.cpp @@ -54,11 +54,11 @@ void post_thumbnail_image_coro(std::string cap_url, std::string path_to_image, L { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("post_profile_image_coro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("post_profile_image_coro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLCore::HttpHeaders::ptr_t httpHeaders; - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); httpOpts->setFollowRedirects(true); LLSD result = httpAdapter->postAndSuspend(httpRequest, cap_url, first_data, httpOpts, httpHeaders); @@ -87,9 +87,9 @@ void post_thumbnail_image_coro(std::string cap_url, std::string path_to_image, L // Upload the image - LLCore::HttpRequest::ptr_t uploaderhttpRequest(new LLCore::HttpRequest); - LLCore::HttpHeaders::ptr_t uploaderhttpHeaders(new LLCore::HttpHeaders); - LLCore::HttpOptions::ptr_t uploaderhttpOpts(new LLCore::HttpOptions); + LLCore::HttpRequest::ptr_t uploaderhttpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpHeaders::ptr_t uploaderhttpHeaders = std::make_shared<LLCore::HttpHeaders>(); + LLCore::HttpOptions::ptr_t uploaderhttpOpts = std::make_shared<LLCore::HttpOptions>(); S64 length; { diff --git a/indra/newview/llfloatersimplesnapshot.h b/indra/newview/llfloatersimplesnapshot.h index 487e77469c..5620a15d87 100644 --- a/indra/newview/llfloatersimplesnapshot.h +++ b/indra/newview/llfloatersimplesnapshot.h @@ -63,7 +63,7 @@ public: void postSave(); - typedef boost::function<void(const LLUUID& asset_id)> completion_t; + typedef std::function<void(const LLUUID& asset_id)> completion_t; void setComplectionCallback(completion_t callback) { mUploadCompletionCallback = callback; } static void uploadThumbnail(const std::string &file_path, const LLUUID &inventory_id, diff --git a/indra/newview/llfloaterslapptest.cpp b/indra/newview/llfloaterslapptest.cpp new file mode 100644 index 0000000000..0075379529 --- /dev/null +++ b/indra/newview/llfloaterslapptest.cpp @@ -0,0 +1,51 @@ +/** + * @file llfloaterslapptest.cpp + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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 "llfloaterslapptest.h" +#include "lluictrlfactory.h" + +#include "lllineeditor.h" +#include "lltextbox.h" + +LLFloaterSLappTest::LLFloaterSLappTest(const LLSD& key) + : LLFloater("floater_test_slapp") +{ +} + +LLFloaterSLappTest::~LLFloaterSLappTest() +{} + +bool LLFloaterSLappTest::postBuild() +{ + getChild<LLLineEditor>("remove_folder_id")->setKeystrokeCallback([this](LLLineEditor* editor, void*) + { + std::string slapp(getString("remove_folder_slapp")); + getChild<LLTextBox>("remove_folder_txt")->setValue(slapp + editor->getValue().asString()); + }, NULL); + + return true; +} diff --git a/indra/newview/llfloaterslapptest.h b/indra/newview/llfloaterslapptest.h new file mode 100644 index 0000000000..ec727cb629 --- /dev/null +++ b/indra/newview/llfloaterslapptest.h @@ -0,0 +1,42 @@ +/** + * @file llfloaterslapptest.h + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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_LLFLOATERSLAPPTEST_H +#define LL_LLFLOATERSLAPPTEST_H + +#include "llfloater.h" + +class LLFloaterSLappTest: + public LLFloater +{ + friend class LLFloaterReg; + virtual bool postBuild() override; + +private: + LLFloaterSLappTest(const LLSD& key); + ~LLFloaterSLappTest(); +}; + +#endif diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 68b9e758a1..faf7ed0d8c 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -60,12 +60,13 @@ LLPanelSnapshot* LLFloaterSnapshot::Impl::getActivePanel(LLFloaterSnapshotBase* { LLSideTrayPanelContainer* panel_container = floater->getChild<LLSideTrayPanelContainer>("panel_container"); LLPanelSnapshot* active_panel = dynamic_cast<LLPanelSnapshot*>(panel_container->getCurrentPanel()); - if (!active_panel) - { - LL_WARNS() << "No snapshot active panel, current panel index: " << panel_container->getCurrentPanelIndex() << LL_ENDL; - } + if (!ok_if_not_found) { + if (!active_panel) + { + LL_WARNS() << "No snapshot active panel, current panel index: " << panel_container->getCurrentPanelIndex() << LL_ENDL; + } llassert_always(active_panel != NULL); } return active_panel; @@ -516,34 +517,13 @@ void LLFloaterSnapshotBase::ImplBase::onClickFilter(LLUICtrl *ctrl, void* data) } // static -void LLFloaterSnapshotBase::ImplBase::onClickUICheck(LLUICtrl *ctrl, void* data) +void LLFloaterSnapshotBase::ImplBase::onClickDisplaySetting(LLUICtrl* ctrl, void* data) { - LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl; - gSavedSettings.setBOOL( "RenderUIInSnapshot", check->get() ); - - LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; + LLFloaterSnapshot* view = (LLFloaterSnapshot*)data; if (view) { LLSnapshotLivePreview* previewp = view->getPreviewView(); - if(previewp) - { - previewp->updateSnapshot(true, true); - } - view->impl->updateControls(view); - } -} - -// static -void LLFloaterSnapshotBase::ImplBase::onClickHUDCheck(LLUICtrl *ctrl, void* data) -{ - LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl; - gSavedSettings.setBOOL( "RenderHUDInSnapshot", check->get() ); - - LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; - if (view) - { - LLSnapshotLivePreview* previewp = view->getPreviewView(); - if(previewp) + if (previewp) { previewp->updateSnapshot(true, true); } @@ -1002,11 +982,9 @@ bool LLFloaterSnapshot::postBuild() mSucceessLblPanel = getChild<LLUICtrl>("succeeded_panel"); mFailureLblPanel = getChild<LLUICtrl>("failed_panel"); - childSetCommitCallback("ui_check", ImplBase::onClickUICheck, this); - getChild<LLUICtrl>("ui_check")->setValue(gSavedSettings.getBOOL("RenderUIInSnapshot")); - - childSetCommitCallback("hud_check", ImplBase::onClickHUDCheck, this); - getChild<LLUICtrl>("hud_check")->setValue(gSavedSettings.getBOOL("RenderHUDInSnapshot")); + childSetCommitCallback("ui_check", ImplBase::onClickDisplaySetting, this); + childSetCommitCallback("balance_check", ImplBase::onClickDisplaySetting, this); + childSetCommitCallback("hud_check", ImplBase::onClickDisplaySetting, this); ((Impl*)impl)->setAspectRatioCheckboxValue(this, gSavedSettings.getBOOL("KeepAspectForSnapshot")); diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h index 6df851b839..186d9c41cf 100644 --- a/indra/newview/llfloatersnapshot.h +++ b/indra/newview/llfloatersnapshot.h @@ -103,8 +103,7 @@ public: static void onClickAutoSnap(LLUICtrl *ctrl, void* data); static void onClickNoPost(LLUICtrl *ctrl, void* data); static void onClickFilter(LLUICtrl *ctrl, void* data); - static void onClickUICheck(LLUICtrl *ctrl, void* data); - static void onClickHUDCheck(LLUICtrl *ctrl, void* data); + static void onClickDisplaySetting(LLUICtrl *ctrl, void* data); static void onCommitFreezeFrame(LLUICtrl* ctrl, void* data); virtual LLPanelSnapshot* getActivePanel(LLFloaterSnapshotBase* floater, bool ok_if_not_found = true) = 0; diff --git a/indra/newview/llfloatertos.cpp b/indra/newview/llfloatertos.cpp index 63ba51e559..1ccb25f5df 100644 --- a/indra/newview/llfloatertos.cpp +++ b/indra/newview/llfloatertos.cpp @@ -250,9 +250,9 @@ void LLFloaterTOS::testSiteIsAliveCoro(LLHandle<LLFloater> handle, std::string u { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("genericPostCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("testSiteIsAliveCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); httpOpts->setWantHeaders(true); httpOpts->setHeadersOnly(true); diff --git a/indra/newview/llfloatertos.h b/indra/newview/llfloatertos.h index 3bec4da58d..82a8c8ac5a 100644 --- a/indra/newview/llfloatertos.h +++ b/indra/newview/llfloatertos.h @@ -30,7 +30,6 @@ #include "llmodaldialog.h" #include "llassetstorage.h" #include "llmediactrl.h" -#include <boost/function.hpp> #include "lleventcoro.h" #include "llcoros.h" diff --git a/indra/newview/llfloatertoybox.cpp b/indra/newview/llfloatertoybox.cpp index f6257dbd3d..5e3ec366d5 100644 --- a/indra/newview/llfloatertoybox.cpp +++ b/indra/newview/llfloatertoybox.cpp @@ -63,7 +63,7 @@ bool LLFloaterToybox::postBuild() mToolBar->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3)); mToolBar->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4)); - mToolBar->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4)); + mToolBar->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4,_5)); mToolBar->setButtonEnterCallback(boost::bind(&LLFloaterToybox::onToolBarButtonEnter,this,_1)); // diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index 9bc075d03f..af58c6316d 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -1043,7 +1043,9 @@ void LLFloaterUIPreview::getExecutablePath(const std::vector<std::string>& filen { CFStringRef executable_cfstr = (CFStringRef)CFDictionaryGetValue(bundleInfoDict, CFSTR("CFBundleExecutable")); // get the name of the actual executable (e.g. TextEdit or firefox-bin) int max_file_length = 256; // (max file name length is 255 in OSX) - char executable_buf[max_file_length]; + + // Xcode 26: VLAs are a clang extension. Just create the buffer and delete it after. + char *executable_buf = new char [max_file_length]; if(CFStringGetCString(executable_cfstr, executable_buf, max_file_length, kCFStringEncodingMacRoman)) // convert CFStringRef to char* { executable_path += std::string("/Contents/MacOS/") + std::string(executable_buf); // append path to executable directory and then executable name to exec path @@ -1053,6 +1055,7 @@ void LLFloaterUIPreview::getExecutablePath(const std::vector<std::string>& filen std::string warning = "Unable to get CString from CFString for executable path"; popupAndPrintWarning(warning); } + delete [] executable_buf; } else { diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp index 7651b2528f..9696c3d3f8 100644 --- a/indra/newview/llfloaterurlentry.cpp +++ b/indra/newview/llfloaterurlentry.cpp @@ -201,10 +201,10 @@ void LLFloaterURLEntry::getMediaTypeCoro(std::string url, LLHandle<LLFloater> pa { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getMediaTypeCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders); - LLCore::HttpOptions::ptr_t httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("getMediaTypeCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpHeaders::ptr_t httpHeaders = std::make_shared<LLCore::HttpHeaders>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); httpOpts->setFollowRedirects(true); httpOpts->setHeadersOnly(true); @@ -242,6 +242,16 @@ void LLFloaterURLEntry::getMediaTypeCoro(std::string url, LLHandle<LLFloater> pa resolvedMimeType = mimeType; } } + else if (resultHeaders.has(HTTP_IN_HEADER_X_CONTENT_TYPE_OPTIONS)) + { + const std::string& val = resultHeaders[HTTP_IN_HEADER_X_CONTENT_TYPE_OPTIONS]; + if (val == HTTP_NOSNIFF) + { + // Doesn't permit 'sniffing' mime type, default to either html or plain + // If this doesn't work user will have to choose something manually. + resolvedMimeType = HTTP_CONTENT_TEXT_HTML; + } + } floaterUrlEntry->headerFetchComplete(status.getType(), resolvedMimeType); diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp index e1b6df6072..3ff84ac9b7 100644 --- a/indra/newview/llfloaterwebcontent.cpp +++ b/indra/newview/llfloaterwebcontent.cpp @@ -130,7 +130,7 @@ void LLFloaterWebContent::initializeURLHistory() for(; iter_history != end_history; ++iter_history) { std::string url = (*iter_history).asString(); - if(! url.empty()) + if(! url.empty() && url_list) url_list->addSimpleElement(url); } } diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 30ed723db6..03979edbc1 100755 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -169,6 +169,52 @@ public: }; LLWorldMapHandler gWorldMapHandler; +// handle secondlife:///app/worldmap_global/{GLOBAL_COORDS} URLs +class LLWorldMapGlobalHandler : public LLCommandHandler +{ +public: + LLWorldMapGlobalHandler() : LLCommandHandler("worldmap_global", UNTRUSTED_THROTTLE) + {} + + virtual bool canHandleUntrusted( + const LLSD& params, + const LLSD& query_map, + LLMediaCtrl* web, + const std::string& nav_type) + { + if (nav_type == NAV_TYPE_CLICKED + || nav_type == NAV_TYPE_EXTERNAL) + { + // NAV_TYPE_EXTERNAL will be throttled + return true; + } + + return false; + } + + bool handle(const LLSD& params, + const LLSD& query_map, + const std::string& grid, + LLMediaCtrl* web) + { + if (params.size() < 3) + { + LL_WARNS() << "Correct global coordinates are not provided." << LL_ENDL; + return true; + } + + LLVector3d parcel_global_pos = LLVector3d(params[0].asInteger(), params[1].asInteger(), params[2].asInteger()); + LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); + if (!parcel_global_pos.isExactlyZero() && worldmap_instance) + { + worldmap_instance->trackLocation(parcel_global_pos); + LLFloaterReg::showInstance("world_map", "center"); + } + return true; + } +}; +LLWorldMapGlobalHandler gWorldMapGlobalHandler; + // SocialMap handler secondlife:///app/maptrackavatar/id class LLMapTrackAvatarHandler : public LLCommandHandler { @@ -325,11 +371,9 @@ LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key) mWaitingForTracker(false), mIsClosing(false), mSetToUserPosition(true), + mProcessingSearchUpdate(false), mTrackedLocation(0.0,0.0,0.0), mTrackedStatus(LLTracker::TRACKING_NOTHING), - mListFriendCombo(nullptr), - mListLandmarkCombo(nullptr), - mListSearchResults(nullptr), mParcelInfoObserver(nullptr), mShowParcelInfo(false) { @@ -341,7 +385,7 @@ LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key) mCommitCallbackRegistrar.add("WMap.Location", boost::bind(&LLFloaterWorldMap::onLocationCommit, this)); mCommitCallbackRegistrar.add("WMap.AvatarCombo", boost::bind(&LLFloaterWorldMap::onAvatarComboCommit, this)); mCommitCallbackRegistrar.add("WMap.Landmark", boost::bind(&LLFloaterWorldMap::onLandmarkComboCommit, this)); - mCommitCallbackRegistrar.add("WMap.SearchResult", boost::bind(&LLFloaterWorldMap::onCommitSearchResult, this)); + mCommitCallbackRegistrar.add("WMap.SearchResult", [this](LLUICtrl* ctrl, const LLSD& data) { LLFloaterWorldMap::onCommitSearchResult(false); }); mCommitCallbackRegistrar.add("WMap.GoHome", boost::bind(&LLFloaterWorldMap::onGoHome, this)); mCommitCallbackRegistrar.add("WMap.Teleport", boost::bind(&LLFloaterWorldMap::onClickTeleportBtn, this)); mCommitCallbackRegistrar.add("WMap.ShowTarget", boost::bind(&LLFloaterWorldMap::onShowTargetBtn, this)); @@ -383,32 +427,33 @@ bool LLFloaterWorldMap::postBuild() mTeleportCoordSpinY = getChild<LLUICtrl>("teleport_coordinate_y"); mTeleportCoordSpinZ = getChild<LLUICtrl>("teleport_coordinate_z"); - LLComboBox *avatar_combo = getChild<LLComboBox>("friend combo"); - avatar_combo->selectFirstItem(); - avatar_combo->setPrearrangeCallback( boost::bind(&LLFloaterWorldMap::onAvatarComboPrearrange, this) ); - avatar_combo->setTextChangedCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) ); - mListFriendCombo = dynamic_cast<LLCtrlListInterface *>(avatar_combo); + mFriendCombo = getChild<LLComboBox>("friend combo"); + mFriendCombo->selectFirstItem(); + mFriendCombo->setPrearrangeCallback(boost::bind(&LLFloaterWorldMap::onAvatarComboPrearrange, this)); + mFriendCombo->setTextChangedCallback(boost::bind(&LLFloaterWorldMap::onComboTextEntry, this)); mLocationEditor = getChild<LLSearchEditor>("location"); mLocationEditor->setFocusChangedCallback(boost::bind(&LLFloaterWorldMap::onLocationFocusChanged, this, _1)); - mLocationEditor->setTextChangedCallback( boost::bind(&LLFloaterWorldMap::onSearchTextEntry, this)); + mLocationEditor->setTextChangedCallback(boost::bind(&LLFloaterWorldMap::onSearchTextEntry, this)); - getChild<LLScrollListCtrl>("search_results")->setDoubleClickCallback( boost::bind(&LLFloaterWorldMap::onClickTeleportBtn, this)); - mListSearchResults = childGetListInterface("search_results"); + mSearchResults = getChild<LLScrollListCtrl>("search_results"); + mSearchResults->setDoubleClickCallback(boost::bind(&LLFloaterWorldMap::onClickTeleportBtn, this)); - LLComboBox *landmark_combo = getChild<LLComboBox>( "landmark combo"); - landmark_combo->selectFirstItem(); - landmark_combo->setPrearrangeCallback( boost::bind(&LLFloaterWorldMap::onLandmarkComboPrearrange, this) ); - landmark_combo->setTextChangedCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) ); - mListLandmarkCombo = dynamic_cast<LLCtrlListInterface *>(landmark_combo); + mLandmarkCombo = getChild<LLComboBox>("landmark combo"); + mLandmarkCombo->selectFirstItem(); + mLandmarkCombo->setPrearrangeCallback(boost::bind(&LLFloaterWorldMap::onLandmarkComboPrearrange, this)); + mLandmarkCombo->setTextChangedCallback(boost::bind(&LLFloaterWorldMap::onComboTextEntry, this)); mZoomSlider = getChild<LLSliderCtrl>("zoom slider"); F32 slider_zoom = mMapView->getZoom(); mZoomSlider->setValue(slider_zoom); + mTrackCtrlsPanel = getChild<LLPanel>("layout_panel_4"); + mSearchButton = getChild<LLButton>("DoSearch"); + getChild<LLPanel>("expand_btn_panel")->setMouseDownCallback(boost::bind(&LLFloaterWorldMap::onExpandCollapseBtn, this)); - setDefaultBtn(NULL); + mTrackCtrlsPanel->setDefaultBtn(nullptr); onChangeMaturity(); @@ -486,8 +531,11 @@ void LLFloaterWorldMap::onOpen(const LLSD& key) const LLUUID landmark_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); LLInventoryModelBackgroundFetch::instance().start(landmark_folder_id); - mLocationEditor->setFocus( true); - gFocusMgr.triggerFocusFlash(); + if (hasFocus()) + { + mLocationEditor->setFocus( true); + gFocusMgr.triggerFocusFlash(); + } buildAvatarIDList(); buildLandmarkIDLists(); @@ -605,7 +653,6 @@ void LLFloaterWorldMap::draw() } mTeleportButton->setEnabled((bool)tracking_status); - // getChildView("Clear")->setEnabled((bool)tracking_status); mShowDestinationButton->setEnabled((bool)tracking_status || LLWorldMap::getInstance()->isTracking()); mCopySlurlButton->setEnabled((mSLURL.isValid()) ); @@ -697,26 +744,24 @@ void LLFloaterWorldMap::requestParcelInfo(const LLVector3d& pos_global, const LL } } -void LLFloaterWorldMap::trackAvatar( const LLUUID& avatar_id, const std::string& name ) +void LLFloaterWorldMap::trackAvatar(const LLUUID& avatar_id, const std::string& name) { mShowParcelInfo = false; - LLCtrlSelectionInterface *iface = childGetSelectionInterface("friend combo"); - if (!iface) return; buildAvatarIDList(); - if(iface->setCurrentByID(avatar_id) || gAgent.isGodlike()) + if (mFriendCombo->setCurrentByID(avatar_id) || gAgent.isGodlike()) { // *HACK: Adjust Z values automatically for liaisons & gods so // they swoop down when they click on the map. Requested // convenience. - if(gAgent.isGodlike()) + if (gAgent.isGodlike()) { mTeleportCoordSpinZ->setValue(LLSD(200.f)); } // Don't re-request info if we already have it or we won't have it in time to teleport if (mTrackedStatus != LLTracker::TRACKING_AVATAR || avatar_id != mTrackedAvatarID) { - mTrackedStatus = LLTracker::TRACKING_AVATAR; + mTrackedStatus = LLTracker::TRACKING_AVATAR; mTrackedAvatarID = avatar_id; LLTracker::trackAvatar(avatar_id, name); } @@ -725,52 +770,45 @@ void LLFloaterWorldMap::trackAvatar( const LLUUID& avatar_id, const std::string& { LLTracker::stopTracking(false); } - setDefaultBtn("Teleport"); + mTrackCtrlsPanel->setDefaultBtn(mTeleportButton); } -void LLFloaterWorldMap::trackLandmark( const LLUUID& landmark_item_id ) +void LLFloaterWorldMap::trackLandmark(const LLUUID& landmark_item_id) { mShowParcelInfo = false; - LLCtrlSelectionInterface *iface = childGetSelectionInterface("landmark combo"); - if (!iface) return; buildLandmarkIDLists(); bool found = false; - S32 idx; + S32 idx; for (idx = 0; idx < mLandmarkItemIDList.size(); idx++) { - if ( mLandmarkItemIDList.at(idx) == landmark_item_id) + if (mLandmarkItemIDList.at(idx) == landmark_item_id) { found = true; break; } } - if (found && iface->setCurrentByID( landmark_item_id ) ) + if (found && mLandmarkCombo->setCurrentByID(landmark_item_id)) { - LLUUID asset_id = mLandmarkAssetIDList.at( idx ); - std::string name; - LLComboBox* combo = getChild<LLComboBox>( "landmark combo"); - if (combo) name = combo->getSimple(); - mTrackedStatus = LLTracker::TRACKING_LANDMARK; - LLTracker::trackLandmark(mLandmarkAssetIDList.at( idx ), // assetID - mLandmarkItemIDList.at( idx ), // itemID - name); // name + LLUUID asset_id = mLandmarkAssetIDList.at(idx); + std::string name = mLandmarkCombo->getSimple(); + mTrackedStatus = LLTracker::TRACKING_LANDMARK; + LLTracker::trackLandmark(mLandmarkAssetIDList.at(idx), // assetID + mLandmarkItemIDList.at(idx), // itemID + name); // name - if( asset_id != sHomeID ) + if (asset_id != sHomeID) { // start the download process - gLandmarkList.getAsset( asset_id); + gLandmarkList.getAsset(asset_id); } - - // We have to download both region info and landmark data, so set busy. JC - // getWindow()->incBusyCount(); } else { LLTracker::stopTracking(false); } - setDefaultBtn("Teleport"); + mTrackCtrlsPanel->setDefaultBtn(mTeleportButton); } @@ -779,7 +817,7 @@ void LLFloaterWorldMap::trackEvent(const LLItemInfo &event_info) mShowParcelInfo = false; mTrackedStatus = LLTracker::TRACKING_LOCATION; LLTracker::trackLocation(event_info.getGlobalPosition(), event_info.getName(), event_info.getToolTip(), LLTracker::LOCATION_EVENT); - setDefaultBtn("Teleport"); + mTrackCtrlsPanel->setDefaultBtn(mTeleportButton); } void LLFloaterWorldMap::trackGenericItem(const LLItemInfo &item) @@ -787,11 +825,12 @@ void LLFloaterWorldMap::trackGenericItem(const LLItemInfo &item) mShowParcelInfo = false; mTrackedStatus = LLTracker::TRACKING_LOCATION; LLTracker::trackLocation(item.getGlobalPosition(), item.getName(), item.getToolTip(), LLTracker::LOCATION_ITEM); - setDefaultBtn("Teleport"); + mTrackCtrlsPanel->setDefaultBtn(mTeleportButton); } void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global) { + mProcessingSearchUpdate = false; LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global); if (!sim_info) { @@ -801,7 +840,7 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global) S32 world_x = S32(pos_global.mdV[0] / 256); S32 world_y = S32(pos_global.mdV[1] / 256); LLWorldMapMessage::getInstance()->sendMapBlockRequest(world_x, world_y, world_x, world_y, true); - setDefaultBtn(""); + mTrackCtrlsPanel->setDefaultBtn(nullptr); // clicked on a non-region - turn off coord display enableTeleportCoordsDisplay( false ); @@ -815,7 +854,7 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global) LLTracker::stopTracking(false); LLWorldMap::getInstance()->setTracking(pos_global); LLWorldMap::getInstance()->setTrackingInvalid(); - setDefaultBtn(""); + mTrackCtrlsPanel->setDefaultBtn(nullptr); // clicked on a down region - turn off coord display enableTeleportCoordsDisplay( false ); @@ -846,7 +885,7 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global) // we have a valid region - turn on coord display enableTeleportCoordsDisplay( true ); - setDefaultBtn("Teleport"); + mTrackCtrlsPanel->setDefaultBtn(mTeleportButton); } // enable/disable teleport destination coordinates @@ -931,7 +970,10 @@ void LLFloaterWorldMap::updateLocation() } } - mLocationEditor->setValue(sim_name); + if (!mProcessingSearchUpdate) + { + mLocationEditor->setValue(sim_name); + } // refresh coordinate display to reflect where user clicked. LLVector3d coord_pos = LLTracker::getTrackedPositionGlobal(); @@ -961,7 +1003,7 @@ void LLFloaterWorldMap::trackURL(const std::string& region_name, S32 x_coord, S3 local_pos.mV[VZ] = (F32)z_coord; LLVector3d global_pos = sim_info->getGlobalPos(local_pos); trackLocation(global_pos); - setDefaultBtn("Teleport"); + mTrackCtrlsPanel->setDefaultBtn(mTeleportButton); } else { @@ -1022,17 +1064,14 @@ void LLFloaterWorldMap::observeFriends() void LLFloaterWorldMap::friendsChanged() { - LLAvatarTracker& t = LLAvatarTracker::instance(); - const LLUUID& avatar_id = t.getAvatarID(); + LLAvatarTracker& t = LLAvatarTracker::instance(); + const LLUUID& avatar_id = t.getAvatarID(); buildAvatarIDList(); - if(avatar_id.notNull()) + if (avatar_id.notNull()) { - LLCtrlSelectionInterface *iface = childGetSelectionInterface("friend combo"); const LLRelationship* buddy_info = t.getBuddyInfo(avatar_id); - if(!iface || - !iface->setCurrentByID(avatar_id) || - (buddy_info && !buddy_info->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION)) || - gAgent.isGodlike()) + if (!mFriendCombo->setCurrentByID(avatar_id) || + (buddy_info && !buddy_info->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION)) || gAgent.isGodlike()) { LLTracker::stopTracking(false); } @@ -1042,15 +1081,12 @@ void LLFloaterWorldMap::friendsChanged() // No longer really builds a list. Instead, just updates mAvatarCombo. void LLFloaterWorldMap::buildAvatarIDList() { - LLCtrlListInterface *list = mListFriendCombo; - if (!list) return; - // Delete all but the "None" entry - S32 list_size = list->getItemCount(); + S32 list_size = mFriendCombo->getItemCount(); if (list_size > 1) { - list->selectItemRange(1, -1); - list->operateOnSelection(LLCtrlListInterface::OP_DELETE); + mFriendCombo->selectItemRange(1, -1); + mFriendCombo->operateOnSelection(LLCtrlListInterface::OP_DELETE); } // Get all of the calling cards for avatar that are currently online @@ -1058,29 +1094,26 @@ void LLFloaterWorldMap::buildAvatarIDList() LLAvatarTracker::instance().applyFunctor(collector); LLCollectMappableBuddies::buddy_map_t::iterator it; LLCollectMappableBuddies::buddy_map_t::iterator end; - it = collector.mMappable.begin(); + it = collector.mMappable.begin(); end = collector.mMappable.end(); - for( ; it != end; ++it) + for (; it != end; ++it) { - list->addSimpleElement((*it).second, ADD_BOTTOM, (*it).first); + mFriendCombo->addSimpleElement((*it).second, ADD_BOTTOM, (*it).first); } - list->setCurrentByID( LLAvatarTracker::instance().getAvatarID() ); - list->selectFirstItem(); + mFriendCombo->setCurrentByID(LLAvatarTracker::instance().getAvatarID()); + mFriendCombo->selectFirstItem(); } void LLFloaterWorldMap::buildLandmarkIDLists() { - LLCtrlListInterface *list = mListLandmarkCombo; - if (!list) return; - // Delete all but the "None" entry - S32 list_size = list->getItemCount(); + S32 list_size = mLandmarkCombo->getItemCount(); if (list_size > 1) { - list->selectItemRange(1, -1); - list->operateOnSelection(LLCtrlListInterface::OP_DELETE); + mLandmarkCombo->selectItemRange(1, -1); + mLandmarkCombo->operateOnSelection(LLCtrlListInterface::OP_DELETE); } mLandmarkItemIDList.clear(); @@ -1112,13 +1145,13 @@ void LLFloaterWorldMap::buildLandmarkIDLists() { LLInventoryItem* item = items.at(i); - list->addSimpleElement(item->getName(), ADD_BOTTOM, item->getUUID()); + mLandmarkCombo->addSimpleElement(item->getName(), ADD_BOTTOM, item->getUUID()); mLandmarkAssetIDList.push_back( item->getAssetUUID() ); mLandmarkItemIDList.push_back( item->getUUID() ); } - list->selectFirstItem(); + mLandmarkCombo->selectFirstItem(); } @@ -1136,10 +1169,9 @@ F32 LLFloaterWorldMap::getDistanceToDestination(const LLVector3d &destination, void LLFloaterWorldMap::clearLocationSelection(bool clear_ui, bool dest_reached) { - LLCtrlListInterface *list = mListSearchResults; - if (list && (!dest_reached || (list->getItemCount() == 1))) + if (!dest_reached || (mSearchResults->getItemCount() == 1)) { - list->operateOnAll(LLCtrlListInterface::OP_DELETE); + mSearchResults->operateOnAll(LLCtrlListInterface::OP_DELETE); } LLWorldMap::getInstance()->cancelTracking(); mCompletingRegionName = ""; @@ -1150,11 +1182,7 @@ void LLFloaterWorldMap::clearLandmarkSelection(bool clear_ui) { if (clear_ui || !childHasKeyboardFocus("landmark combo")) { - LLCtrlListInterface *list = mListLandmarkCombo; - if (list) - { - list->selectByValue( "None" ); - } + mLandmarkCombo->selectByValue("None"); } } @@ -1164,10 +1192,9 @@ void LLFloaterWorldMap::clearAvatarSelection(bool clear_ui) if (clear_ui || !childHasKeyboardFocus("friend combo")) { mTrackedStatus = LLTracker::TRACKING_NOTHING; - LLCtrlListInterface *list = mListFriendCombo; - if (list && list->getSelectedValue().asString() != "None") + if (mFriendCombo->getSelectedValue().asString() != "None") { - list->selectByValue( "None" ); + mFriendCombo->selectByValue("None"); } } } @@ -1220,28 +1247,25 @@ void LLFloaterWorldMap::onGoHome() { gAgent.teleportHome(); closeFloater(); + mProcessingSearchUpdate = false; } -void LLFloaterWorldMap::onLandmarkComboPrearrange( ) +void LLFloaterWorldMap::onLandmarkComboPrearrange() { - if( mIsClosing ) + if (mIsClosing) { return; } - LLCtrlListInterface *list = mListLandmarkCombo; - if (!list) return; - - LLUUID current_choice = list->getCurrentID(); + LLUUID current_choice = mLandmarkCombo->getCurrentID(); buildLandmarkIDLists(); - if( current_choice.isNull() || !list->setCurrentByID( current_choice ) ) + if (current_choice.isNull() || !mLandmarkCombo->setCurrentByID(current_choice)) { LLTracker::stopTracking(false); } - } void LLFloaterWorldMap::onComboTextEntry() @@ -1261,33 +1285,28 @@ void LLFloaterWorldMap::onSearchTextEntry( ) void LLFloaterWorldMap::onLandmarkComboCommit() { - if( mIsClosing ) + if (mIsClosing) { return; } - LLCtrlListInterface *list = mListLandmarkCombo; - if (!list) return; - LLUUID asset_id; - LLUUID item_id = list->getCurrentID(); + LLUUID item_id = mLandmarkCombo->getCurrentID(); LLTracker::stopTracking(false); - //RN: stopTracking() clears current combobox selection, need to reassert it here - list->setCurrentByID(item_id); + // RN: stopTracking() clears current combobox selection, need to reassert it here + mLandmarkCombo->setCurrentByID(item_id); - if( item_id.isNull() ) - { - } - else if( item_id == sHomeID ) + if (item_id.isNull()) {} + else if (item_id == sHomeID) { asset_id = sHomeID; } else { - LLInventoryItem* item = gInventory.getItem( item_id ); - if( item ) + LLInventoryItem* item = gInventory.getItem(item_id); + if (item) { asset_id = item->getAssetUUID(); } @@ -1298,34 +1317,31 @@ void LLFloaterWorldMap::onLandmarkComboCommit() } } - trackLandmark( item_id); + trackLandmark(item_id); onShowTargetBtn(); // Reset to user postion if nothing is tracked - mSetToUserPosition = ( LLTracker::getTrackingStatus() == LLTracker::TRACKING_NOTHING ); + mSetToUserPosition = (LLTracker::getTrackingStatus() == LLTracker::TRACKING_NOTHING); } // static -void LLFloaterWorldMap::onAvatarComboPrearrange( ) +void LLFloaterWorldMap::onAvatarComboPrearrange() { - if( mIsClosing ) + if (mIsClosing) { return; } - LLCtrlListInterface *list = mListFriendCombo; - if (!list) return; - LLUUID current_choice; - if( LLAvatarTracker::instance().haveTrackingInfo() ) + if (LLAvatarTracker::instance().haveTrackingInfo()) { current_choice = LLAvatarTracker::instance().getAvatarID(); } buildAvatarIDList(); - if( !list->setCurrentByID( current_choice ) || current_choice.isNull() ) + if (!mFriendCombo->setCurrentByID(current_choice) || current_choice.isNull()) { LLTracker::stopTracking(false); } @@ -1333,26 +1349,21 @@ void LLFloaterWorldMap::onAvatarComboPrearrange( ) void LLFloaterWorldMap::onAvatarComboCommit() { - if( mIsClosing ) + if (mIsClosing) { return; } - LLCtrlListInterface *list = mListFriendCombo; - if (!list) return; - - const LLUUID& new_avatar_id = list->getCurrentID(); + const LLUUID& new_avatar_id = mFriendCombo->getCurrentID(); if (new_avatar_id.notNull()) { - std::string name; - LLComboBox* combo = getChild<LLComboBox>("friend combo"); - if (combo) name = combo->getSimple(); + std::string name = mFriendCombo->getSimple(); trackAvatar(new_avatar_id, name); onShowTargetBtn(); } else - { // Reset to user postion if nothing is tracked - mSetToUserPosition = ( LLTracker::getTrackingStatus() == LLTracker::TRACKING_NOTHING ); + { // Reset to user postion if nothing is tracked + mSetToUserPosition = (LLTracker::getTrackingStatus() == LLTracker::TRACKING_NOTHING); } } @@ -1372,11 +1383,11 @@ void LLFloaterWorldMap::updateSearchEnabled() if (childHasKeyboardFocus("location") && mLocationEditor->getValue().asString().length() > 0) { - setDefaultBtn("DoSearch"); + mTrackCtrlsPanel->setDefaultBtn(mSearchButton); } else { - setDefaultBtn(NULL); + mTrackCtrlsPanel->setDefaultBtn(nullptr); } } @@ -1406,6 +1417,7 @@ void LLFloaterWorldMap::onLocationCommit() { return; } + mProcessingSearchUpdate = true; LLStringUtil::toLower(str); mCompletingRegionName = str; @@ -1427,6 +1439,7 @@ void LLFloaterWorldMap::onCoordinatesCommit() { return; } + mProcessingSearchUpdate = false; S32 x_coord = (S32)mTeleportCoordSpinX->getValue().asReal(); S32 y_coord = (S32)mTeleportCoordSpinY->getValue().asReal(); @@ -1440,6 +1453,7 @@ void LLFloaterWorldMap::onCoordinatesCommit() void LLFloaterWorldMap::onClearBtn() { mTrackedStatus = LLTracker::TRACKING_NOTHING; + mProcessingSearchUpdate = false; LLTracker::stopTracking(true); LLWorldMap::getInstance()->cancelTracking(); mSLURL = LLSLURL(); // Clear the SLURL since it's invalid @@ -1456,6 +1470,7 @@ void LLFloaterWorldMap::onShowAgentBtn() mMapView->setPanWithInterpTime(0, 0, false, 0.1f); // false == animate // Set flag so user's location will be displayed if not tracking anything else mSetToUserPosition = true; + mProcessingSearchUpdate = false; } void LLFloaterWorldMap::onClickTeleportBtn() @@ -1484,8 +1499,9 @@ void LLFloaterWorldMap::onExpandCollapseBtn() std::string image_name = getString(toggle_collapse ? "expand_icon" : "collapse_icon"); std::string tooltip = getString(toggle_collapse ? "expand_tooltip" : "collapse_tooltip"); - getChild<LLIconCtrl>("expand_collapse_icon")->setImage(LLUI::getUIImage(image_name)); - getChild<LLIconCtrl>("expand_collapse_icon")->setToolTip(tooltip); + LLIconCtrl* expandCollapseIcon = getChild<LLIconCtrl>("expand_collapse_icon"); + expandCollapseIcon->setImage(LLUI::getUIImage(image_name)); + expandCollapseIcon->setToolTip(tooltip); getChild<LLPanel>("expand_btn_panel")->setToolTip(tooltip); } @@ -1610,6 +1626,12 @@ void LLFloaterWorldMap::teleport() gAgent.teleportViaLocation( pos_global ); } } + + if (mProcessingSearchUpdate) + { + mProcessingSearchUpdate = false; + mTrackedSimName.clear(); + } } void LLFloaterWorldMap::flyToLandmark() @@ -1677,9 +1699,9 @@ void LLFloaterWorldMap::teleportToAvatar() void LLFloaterWorldMap::flyToAvatar() { - if( LLAvatarTracker::instance().haveTrackingInfo() ) + if (LLAvatarTracker::instance().haveTrackingInfo()) { - gAgent.startAutoPilotGlobal( LLAvatarTracker::instance().getGlobalPos() ); + gAgent.startAutoPilotGlobal(LLAvatarTracker::instance().getGlobalPos()); } } @@ -1690,8 +1712,7 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim) return; } - LLScrollListCtrl *list = getChild<LLScrollListCtrl>("search_results"); - list->operateOnAll(LLCtrlListInterface::OP_DELETE); + mSearchResults->operateOnAll(LLCtrlListInterface::OP_DELETE); auto name_length = mCompletingRegionName.length(); @@ -1719,7 +1740,7 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim) value["id"] = info->getName(); value["columns"][0]["column"] = "sim_name"; value["columns"][0]["value"] = info->getName(); - list->addElement(value); + mSearchResults->addElement(value); num_results++; } } @@ -1734,21 +1755,24 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim) // if match found, highlight it and go if (!match.isUndefined()) { - list->selectByValue(match); + mSearchResults->selectByValue(match); + mSearchResults->setFocus(true); + onCommitSearchResult(false /*fully commit the only option*/); } - // else select first found item + // else let user decide else { - list->selectFirstItem(); + mSearchResults->selectFirstItem(); + mSearchResults->setFocus(true); + onCommitSearchResult(true /*don't update text field*/); } - getChild<LLUICtrl>("search_results")->setFocus(true); - onCommitSearchResult(); } else { // if we found nothing, say "none" - list->setCommentText(LLTrans::getString("worldmap_results_none_found")); - list->operateOnAll(LLCtrlListInterface::OP_DESELECT); + mProcessingSearchUpdate = false; + mSearchResults->setCommentText(LLTrans::getString("worldmap_results_none_found")); + mSearchResults->operateOnAll(LLCtrlListInterface::OP_DESELECT); } } @@ -1760,13 +1784,9 @@ void LLFloaterWorldMap::onTeleportFinished() } } -void LLFloaterWorldMap::onCommitSearchResult() +void LLFloaterWorldMap::onCommitSearchResult(bool from_search) { - LLCtrlListInterface *list = mListSearchResults; - if (!list) return; - - LLSD selected_value = list->getSelectedValue(); - std::string sim_name = selected_value.asString(); + std::string sim_name = mSearchResults->getSelectedValue().asString(); if (sim_name.empty()) { return; @@ -1782,7 +1802,7 @@ void LLFloaterWorldMap::onCommitSearchResult() { LLVector3d pos_global = info->getGlobalOrigin(); - const F64 SIM_COORD_DEFAULT = 128.0; + constexpr F64 SIM_COORD_DEFAULT = 128.0; LLVector3 pos_local(SIM_COORD_DEFAULT, SIM_COORD_DEFAULT, 0.0f); // Did this value come from a trackURL() request? @@ -1795,9 +1815,15 @@ void LLFloaterWorldMap::onCommitSearchResult() pos_global.mdV[VY] += (F64)pos_local.mV[VY]; pos_global.mdV[VZ] = (F64)pos_local.mV[VZ]; - mLocationEditor->setValue(sim_name); + // Commiting search string automatically selects first item in the search list, + // in such case onCommitSearchResult shouldn't modify search string + if (!from_search) + { + mLocationEditor->setValue(sim_name); + } trackLocation(pos_global); - setDefaultBtn("Teleport"); + mProcessingSearchUpdate = from_search; + mTrackCtrlsPanel->setDefaultBtn(mTeleportButton); break; } } diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h index 2f2b2b7a0d..9558ca2615 100644 --- a/indra/newview/llfloaterworldmap.h +++ b/indra/newview/llfloaterworldmap.h @@ -51,6 +51,8 @@ class LLCheckBoxCtrl; class LLSliderCtrl; class LLSpinCtrl; class LLSearchEditor; +class LLComboBox; +class LLScrollListCtrl; class LLWorldMapParcelInfoObserver : public LLRemoteParcelInfoObserver { @@ -174,7 +176,7 @@ protected: void onLocationFocusChanged( LLFocusableElement* ctrl ); void onLocationCommit(); void onCoordinatesCommit(); - void onCommitSearchResult(); + void onCommitSearchResult(bool from_search); void onTeleportFinished(); @@ -211,6 +213,7 @@ private: bool mIsClosing; bool mSetToUserPosition; + bool mProcessingSearchUpdate; // Don't update search string from what user set it to LLVector3d mTrackedLocation; LLTracker::ETrackingStatus mTrackedStatus; @@ -218,14 +221,11 @@ private: LLUUID mTrackedAvatarID; LLSLURL mSLURL; - LLCtrlListInterface * mListFriendCombo; - LLCtrlListInterface * mListLandmarkCombo; - LLCtrlListInterface * mListSearchResults; - LLButton* mTeleportButton = nullptr; LLButton* mShowDestinationButton = nullptr; LLButton* mCopySlurlButton = nullptr; LLButton* mGoHomeButton = nullptr; + LLButton* mSearchButton = nullptr; LLCheckBoxCtrl* mPeopleCheck = nullptr; LLCheckBoxCtrl* mInfohubCheck = nullptr; @@ -245,6 +245,13 @@ private: LLSliderCtrl* mZoomSlider = nullptr; + LLComboBox* mLandmarkCombo = nullptr; + LLComboBox* mFriendCombo = nullptr; + + LLScrollListCtrl* mSearchResults = nullptr; + + LLPanel* mTrackCtrlsPanel = nullptr; + boost::signals2::connection mTeleportFinishConnection; }; diff --git a/indra/newview/llfolderviewmodelinventory.cpp b/indra/newview/llfolderviewmodelinventory.cpp index c668d414d3..a0621bb015 100644 --- a/indra/newview/llfolderviewmodelinventory.cpp +++ b/indra/newview/llfolderviewmodelinventory.cpp @@ -68,9 +68,10 @@ void LLFolderViewModelInventory::sort( LLFolderViewFolder* folder ) if (!folder->areChildrenInited() || !needsSort(folder->getViewModelItem())) return; - LLFolderViewModelItemInventory* modelp = static_cast<LLFolderViewModelItemInventory*>(folder->getViewModelItem()); - if (modelp->getUUID().isNull()) return; + LLFolderViewModelItemInventory* sort_modelp = static_cast<LLFolderViewModelItemInventory*>(folder->getViewModelItem()); + if (!sort_modelp->canSortContent()) return; + bool has_favorites = false; for (std::list<LLFolderViewFolder*>::iterator it = folder->getFoldersBegin(), end_it = folder->getFoldersEnd(); it != end_it; ++it) @@ -79,11 +80,14 @@ void LLFolderViewModelInventory::sort( LLFolderViewFolder* folder ) LLFolderViewFolder* child_folderp = *it; sort(child_folderp); + LLFolderViewModelItemInventory* modelp = static_cast<LLFolderViewModelItemInventory*>(child_folderp->getViewModelItem()); + has_favorites |= child_folderp->isFavorite() || child_folderp->hasFavorites(); + if (child_folderp->getFoldersCount() > 0) { - time_t most_recent_folder_time = - static_cast<LLFolderViewModelItemInventory*>((*child_folderp->getFoldersBegin())->getViewModelItem())->getCreationDate(); - LLFolderViewModelItemInventory* modelp = static_cast<LLFolderViewModelItemInventory*>(child_folderp->getViewModelItem()); + LLFolderViewModelItemInventory* folderp = static_cast<LLFolderViewModelItemInventory*>((*child_folderp->getFoldersBegin())->getViewModelItem()); + time_t most_recent_folder_time = folderp->getCreationDate(); + if (most_recent_folder_time > modelp->getCreationDate()) { modelp->setCreationDate(most_recent_folder_time); @@ -91,16 +95,26 @@ void LLFolderViewModelInventory::sort( LLFolderViewFolder* folder ) } if (child_folderp->getItemsCount() > 0) { - time_t most_recent_item_time = - static_cast<LLFolderViewModelItemInventory*>((*child_folderp->getItemsBegin())->getViewModelItem())->getCreationDate(); + LLFolderViewModelItemInventory* itemp = static_cast<LLFolderViewModelItemInventory*>((*child_folderp->getItemsBegin())->getViewModelItem()); + time_t most_recent_item_time = itemp->getCreationDate(); - LLFolderViewModelItemInventory* modelp = static_cast<LLFolderViewModelItemInventory*>(child_folderp->getViewModelItem()); if (most_recent_item_time > modelp->getCreationDate()) { modelp->setCreationDate(most_recent_item_time); } } } + for (std::list<LLFolderViewItem*>::const_iterator it = folder->getItemsBegin(), end_it = folder->getItemsEnd(); + it != end_it && !has_favorites; + ++it) + { + LLFolderViewItem* child_itemp = *it; + has_favorites |= child_itemp->isFavorite(); + } + if (has_favorites) + { + folder->updateHasFavorites(true); + } base_t::sort(folder); } diff --git a/indra/newview/llfolderviewmodelinventory.h b/indra/newview/llfolderviewmodelinventory.h index 48b4ee5fd9..74645a19e0 100644 --- a/indra/newview/llfolderviewmodelinventory.h +++ b/indra/newview/llfolderviewmodelinventory.h @@ -48,6 +48,7 @@ public: virtual bool isItemInTrash( void) const { return false; } // TODO: make into pure virtual. virtual bool isItemInOutfits() const { return false; } virtual bool isAgentInventory() const { return false; } + virtual bool isAgentInventoryRoot() const { return false; } virtual bool isUpToDate() const = 0; virtual void addChild(LLFolderViewModelItem* child); virtual bool hasChildren() const = 0; @@ -58,6 +59,7 @@ public: virtual EInventorySortGroup getSortGroup() const = 0; virtual LLInventoryObject* getInventoryObject() const = 0; virtual void requestSort(); + virtual bool canSortContent() const { return getUUID().notNull(); } virtual void setPassedFilter(bool filtered, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0); virtual bool filter( LLFolderViewFilter& filter); virtual bool filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter); diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp index 5300627cec..b9f19b5247 100644 --- a/indra/newview/llfriendcard.cpp +++ b/indra/newview/llfriendcard.cpp @@ -136,7 +136,7 @@ bool LLFindAgentCallingCard::operator()(LLInventoryCategory* cat, LLInventoryIte class LLInitialFriendCardsFetch : public LLInventoryFetchDescendentsObserver { public: - typedef boost::function<void()> callback_t; + typedef std::function<void()> callback_t; LLInitialFriendCardsFetch(const LLUUID& folder_id, callback_t cb) : diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h index e3bd25aae7..f6c0a991bc 100644 --- a/indra/newview/llfriendcard.h +++ b/indra/newview/llfriendcard.h @@ -96,7 +96,7 @@ public: void syncFriendCardsFolders(); private: - typedef boost::function<void()> callback_t; + typedef std::function<void()> callback_t; diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index 1bbeba43ec..550af7af53 100644 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -71,7 +71,7 @@ LLGestureMgr::LLGestureMgr() mLoadingCount(0) { gInventory.addObserver(this); - mListener.reset(new LLGestureListener()); + mListener = std::make_shared<LLGestureListener>(); } diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h index 8db36c6d89..e10bc8bbb4 100644 --- a/indra/newview/llgesturemgr.h +++ b/indra/newview/llgesturemgr.h @@ -54,7 +54,7 @@ class LLGestureMgr : public LLSingleton<LLGestureMgr>, public LLInventoryFetchIt ~LLGestureMgr(); public: - typedef boost::function<void (LLMultiGesture* loaded_gesture)> gesture_loaded_callback_t; + typedef std::function<void (LLMultiGesture* loaded_gesture)> gesture_loaded_callback_t; // Maps inventory item_id to gesture typedef std::map<LLUUID, LLMultiGesture*> item_map_t; typedef std::map<LLUUID, gesture_loaded_callback_t> callback_map_t; diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp index 1259b65ebe..57dd203f2f 100644 --- a/indra/newview/llgiveinventory.cpp +++ b/indra/newview/llgiveinventory.cpp @@ -414,7 +414,11 @@ void LLGiveInventory::commitGiveInventoryItem(const LLUUID& to_agent, effectp->setTargetObject(gObjectList.findObject(to_agent)); effectp->setDuration(LL_HUD_DUR_SHORT); effectp->setColor(LLColor4U(gAgent.getEffectColor())); - gFloaterTools->dirty(); + + if (gFloaterTools) + { + gFloaterTools->dirty(); + } LLMuteList::getInstance()->autoRemove(to_agent, LLMuteList::AR_INVENTORY); @@ -572,7 +576,11 @@ bool LLGiveInventory::commitGiveInventoryCategory(const LLUUID& to_agent, effectp->setTargetObject(gObjectList.findObject(to_agent)); effectp->setDuration(LL_HUD_DUR_SHORT); effectp->setColor(LLColor4U(gAgent.getEffectColor())); - gFloaterTools->dirty(); + + if (gFloaterTools) + { + gFloaterTools->dirty(); + } LLMuteList::getInstance()->autoRemove(to_agent, LLMuteList::AR_INVENTORY); diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 112008172e..807ba1b3ed 100644 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -728,8 +728,7 @@ void LLViewerObjectList::renderObjectBeacons() S32 line_width = debug_beacon.mLineWidth; if (line_width != last_line_width) { - gGL.flush(); - glLineWidth( (F32)line_width ); + LLRender2D::setLineWidth(line_width); last_line_width = line_width; } @@ -758,8 +757,7 @@ void LLViewerObjectList::renderObjectBeacons() S32 line_width = debug_beacon.mLineWidth; if (line_width != last_line_width) { - gGL.flush(); - glLineWidth( (F32)line_width ); + LLRender2D::setLineWidth(line_width); last_line_width = line_width; } @@ -772,8 +770,7 @@ void LLViewerObjectList::renderObjectBeacons() gGL.end(); } - gGL.flush(); - glLineWidth(1.f); + LLRender2D::setLineWidth(1.f); for (std::vector<LLDebugBeacon>::iterator iter = mDebugBeacons.begin(); iter != mDebugBeacons.end(); ++iter) { @@ -808,7 +805,9 @@ void LLSky::renderSunMoonBeacons(const LLVector3& pos_agent, const LLVector3& di { pos_end.mV[i] = pos_agent.mV[i] + (50 * direction.mV[i]); } - glLineWidth((GLfloat)LLPipeline::DebugBeaconLineWidth); + + LLRender2D::setLineWidth((GLfloat)LLPipeline::DebugBeaconLineWidth); + gGL.begin(LLRender::LINES); color.mV[3] *= 0.5f; gGL.color4fv(color.mV); @@ -818,9 +817,7 @@ void LLSky::renderSunMoonBeacons(const LLVector3& pos_agent, const LLVector3& di gGL.vertex3fv(pos_end.mV); gGL.end(); - gGL.flush(); - glLineWidth(1.f); - + LLRender2D::setLineWidth(1.f); } //----------------------------------------------------------------------------- @@ -903,6 +900,39 @@ private: }; +F32 shader_timer_benchmark(std::vector<LLRenderTarget> & dest, TextureHolder & texHolder, U32 textures_count, LLVertexBuffer * buff, F32 &seconds) +{ + // run GPU timer benchmark + + //number of samples to take + const S32 samples = 64; + + { + ShaderProfileHelper initProfile; + dest[0].bindTarget("benchmark", 1); + gBenchmarkProgram.bind(); + for (S32 c = 0; c < samples; ++c) + { + for (U32 i = 0; i < textures_count; ++i) + { + texHolder.bind(i); + buff->setBuffer(); + buff->drawArrays(LLRender::TRIANGLES, 0, 3); + } + } + gBenchmarkProgram.unbind(); + dest[0].flush(); + } + + F32 ms = gBenchmarkProgram.mTimeElapsed / 1000000.f; + seconds = ms / 1000.f; + + F64 samples_drawn = (F64)gBenchmarkProgram.mSamplesDrawn; + F64 gpixels_drawn = samples_drawn / 1000000000.0; + F32 samples_sec = (F32)(gpixels_drawn / seconds); + return samples_sec * 4; // 4 bytes per sample +} + //----------------------------------------------------------------------------- // gpu_benchmark() // returns measured memory bandwidth of GPU in gigabytes per second @@ -944,9 +974,6 @@ F32 gpu_benchmark() //number of textures const U32 count = 32; - //number of samples to take - const S32 samples = 64; - //time limit, allocation operations shouldn't take longer then 30 seconds, same for actual benchmark. const F32 time_limit = 30; @@ -977,7 +1004,7 @@ F32 gpu_benchmark() delete[] pixels; return -1.f; } - dest[i].bindTarget(); + dest[i].bindTarget("", 1); dest[i].clear(); dest[i].flush(); @@ -1036,33 +1063,15 @@ F32 gpu_benchmark() LLGLSLShader::unbind(); - // run GPU timer benchmark - { - ShaderProfileHelper initProfile; - dest[0].bindTarget(); - gBenchmarkProgram.bind(); - for (S32 c = 0; c < samples; ++c) - { - for (U32 i = 0; i < count; ++i) - { - texHolder.bind(i); - buff->setBuffer(); - buff->drawArrays(LLRender::TRIANGLES, 0, 3); - } - } - gBenchmarkProgram.unbind(); - dest[0].flush(); - } + // run GPU timer benchmark twice + F32 seconds = 0; + F32 gbps = shader_timer_benchmark(dest, texHolder, count, buff.get(), seconds); - F32 ms = gBenchmarkProgram.mTimeElapsed/1000000.f; - F32 seconds = ms/1000.f; + LL_INFOS("Benchmark") << "Memory bandwidth, 1st run is " << llformat("%.3f", gbps) << " GB/sec according to ARB_timer_query, total time " << seconds << " seconds" << LL_ENDL; - F64 samples_drawn = (F64)gBenchmarkProgram.mSamplesDrawn; - F64 gpixels_drawn = samples_drawn / 1000000000.0; - F32 samples_sec = (F32)(gpixels_drawn/seconds); - F32 gbps = samples_sec*4; // 4 bytes per sample + gbps = shader_timer_benchmark(dest, texHolder, count, buff.get(), seconds); - LL_INFOS("Benchmark") << "Memory bandwidth is " << llformat("%.3f", gbps) << " GB/sec according to ARB_timer_query, total time " << seconds << " seconds" << LL_ENDL; + LL_INFOS("Benchmark") << "Memory bandwidth, final run is " << llformat("%.3f", gbps) << " GB/sec according to ARB_timer_query, total time " << seconds << " seconds" << LL_ENDL; return gbps; } diff --git a/indra/newview/llgltffolderitem.h b/indra/newview/llgltffolderitem.h index 89d90c81cc..40a4c6fef1 100644 --- a/indra/newview/llgltffolderitem.h +++ b/indra/newview/llgltffolderitem.h @@ -114,6 +114,11 @@ public: EType getType() const { return mItemType; } S32 getItemId() const { return mItemId; } + bool isFavorite() const override { return false; } + bool isItemInTrash() const override { return false; } + bool isAgentInventory() const override { return false; } + bool isAgentInventoryRoot() const override { return false; } + private: LLUIImagePtr pIcon; std::string mName; diff --git a/indra/newview/llgltfmateriallist.cpp b/indra/newview/llgltfmateriallist.cpp index 25438eae5e..ac8477a615 100644 --- a/indra/newview/llgltfmateriallist.cpp +++ b/indra/newview/llgltfmateriallist.cpp @@ -45,7 +45,9 @@ #include "llworld.h" #include "tinygltf/tiny_gltf.h" -#include <strstream> + +#include <boost/iostreams/device/array.hpp> +#include <boost/iostreams/stream.hpp> #include <unordered_set> @@ -353,10 +355,24 @@ void LLGLTFMaterialList::queueApply(const LLViewerObject* obj, S32 side, const L } } +void LLGLTFMaterialList::queueApply(const LLViewerObject* obj, S32 side, const LLUUID& asset_id, const std::string &override_json) +{ + if (asset_id.isNull() || override_json.empty()) + { + // If there is no asset, there can't be an override + queueApply(obj, side, asset_id); + } + else + { + sApplyQueue.push_back({ obj->getID(), side, asset_id, nullptr, override_json }); + } +} + void LLGLTFMaterialList::queueApply(const LLViewerObject* obj, S32 side, const LLUUID& asset_id, const LLGLTFMaterial* material_override) { if (asset_id.isNull() || material_override == nullptr) { + // If there is no asset, there can't be an override queueApply(obj, side, asset_id); } else @@ -456,6 +472,10 @@ void LLGLTFMaterialList::flushUpdatesOnce(std::shared_ptr<CallbackHolder> callba { data[i]["gltf_json"] = e.override_data->asJSON(); } + else if (!e.override_json.empty()) + { + data[i]["gltf_json"] = e.override_json; + } else { // Clear all overrides @@ -539,8 +559,7 @@ void LLGLTFMaterialList::onAssetLoadComplete(const LLUUID& id, LLAssetType::ETyp LLSD asset; // read file into buffer - std::istrstream str(&buffer[0], static_cast<S32>(buffer.size())); - + boost::iostreams::stream<boost::iostreams::array_source> str(buffer.data(), buffer.size()); if (LLSDSerialize::deserialize(asset, str, buffer.size())) { if (asset.has("version") && LLGLTFMaterial::isAcceptedVersion(asset["version"].asString())) @@ -704,9 +723,9 @@ void LLGLTFMaterialList::modifyMaterialCoro(std::string cap_url, LLSD overrides, { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("modifyMaterialCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("modifyMaterialCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); LLCore::HttpHeaders::ptr_t httpHeaders; httpOpts->setFollowRedirects(true); diff --git a/indra/newview/llgltfmateriallist.h b/indra/newview/llgltfmateriallist.h index e79da3592a..97d173d3a7 100644 --- a/indra/newview/llgltfmateriallist.h +++ b/indra/newview/llgltfmateriallist.h @@ -67,6 +67,7 @@ public: // // NOTE: Implicitly clears most override data if present static void queueApply(const LLViewerObject* obj, S32 side, const LLUUID& asset_id); + static void queueApply(const LLViewerObject* obj, S32 side, const LLUUID& asset_id, const std::string& override_json); // Queue an application of a material asset we want to send to the simulator. // Call "flushUpdates" to flush pending updates immediately. @@ -160,6 +161,7 @@ protected: S32 side = -1; LLUUID asset_id; LLPointer<LLGLTFMaterial> override_data; + std::string override_json; }; typedef std::list<ApplyMaterialAssetData> apply_queue_t; diff --git a/indra/newview/llgltfmaterialpreviewmgr.cpp b/indra/newview/llgltfmaterialpreviewmgr.cpp index da1f1a466f..4712b5a5e0 100644 --- a/indra/newview/llgltfmaterialpreviewmgr.cpp +++ b/indra/newview/llgltfmaterialpreviewmgr.cpp @@ -425,6 +425,8 @@ bool LLGLTFPreviewTexture::render() if (!mShouldRender) { return false; } + LL_WARNS() << "LLGLTFPreviewTexture:render()" << LL_ENDL; + glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -462,7 +464,7 @@ bool LLGLTFPreviewTexture::render() // Set up camera and viewport const LLVector3 origin(0.0, 0.0, 0.0); camera.lookAt(origin, object_position); - camera.setAspect((F32)(mFullHeight / mFullWidth)); + camera.setAspect((F32)(mFullWidth / mFullHeight)); const LLRect texture_rect(0, mFullHeight, mFullWidth, 0); camera.setPerspective(NOT_FOR_SELECTION, texture_rect.mLeft, texture_rect.mBottom, texture_rect.getWidth(), texture_rect.getHeight(), false, camera.getNear(), MAX_FAR_CLIP*2.f); @@ -520,19 +522,50 @@ bool LLGLTFPreviewTexture::render() // *HACK: Hide mExposureMap from generateExposure gPipeline.mExposureMap.swapFBORefs(gPipeline.mLastExposure); + //bool hdr = gPipeline.has_hdr(); + bool hdr = true; + + if (hdr) + { gPipeline.copyScreenSpaceReflections(&screen, &gPipeline.mSceneMap); gPipeline.generateLuminance(&screen, &gPipeline.mLuminanceMap); gPipeline.generateExposure(&gPipeline.mLuminanceMap, &gPipeline.mExposureMap, /*use_history = */ false); - gPipeline.gammaCorrect(&screen, &gPipeline.mPostMap); +/* + gPipeline.gammaCorrect(&screen, &gPipeline.mPostPingMap); +*/ + } + + U16 activeRT = 0; + gPipeline.gammaCorrect(&screen, &gPipeline.mPostMaps[activeRT]); + LLVertexBuffer::unbind(); - gPipeline.generateGlow(&gPipeline.mPostMap); - gPipeline.combineGlow(&gPipeline.mPostMap, &screen); - gPipeline.renderDoF(&screen, &gPipeline.mPostMap); - gPipeline.applyFXAA(&gPipeline.mPostMap, &screen); +/* + gPipeline.generateGlow(&gPipeline.mPostPingMap); + gPipeline.combineGlow(&gPipeline.mPostPingMap, &screen); + gPipeline.renderDoF(&screen, &gPipeline.mPostPingMap); + gPipeline.applyFXAA(&gPipeline.mPostPingMap, &screen); +*/ + + gPipeline.generateGlow(&gPipeline.mPostMaps[activeRT]); + gPipeline.combineGlow(&gPipeline.mPostMaps[activeRT], &gPipeline.mPostMaps[1-activeRT]); + activeRT = 1-activeRT; + + if(gPipeline.renderDoF(&gPipeline.mPostMaps[activeRT], &gPipeline.mPostMaps[1-activeRT])) + { + activeRT = 1-activeRT; + } + + if(gPipeline.applyFXAA(&gPipeline.mPostMaps[activeRT], &gPipeline.mPostMaps[1-activeRT])) + { + activeRT = 1-activeRT; + } // *HACK: Restore mExposureMap (it will be consumed by generateExposure next frame) gPipeline.mExposureMap.swapFBORefs(gPipeline.mLastExposure); + gPipeline.copyRenderTarget(&gPipeline.mPostMaps[activeRT], &screen); + + // Final render gDeferredPostNoDoFProgram.bind(); diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index ba9c9fa13f..34d96aa024 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -46,7 +46,7 @@ // // Globals // -static GroupChatListener sGroupChatListener; +static LLGroupChatListener sGroupChatListener; class LLGroupHandler : public LLCommandHandler { diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index d53b36e59f..e0da762279 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -1975,8 +1975,8 @@ void LLGroupMgr::getGroupBanRequestCoro(std::string url, LLUUID group_id) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("groupMembersRequest", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("groupMembersRequest", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); std::string finalUrl = url + "?group_id=" + group_id.asString(); @@ -2004,10 +2004,10 @@ void LLGroupMgr::postGroupBanRequestCoro(std::string url, LLUUID group_id, { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("groupMembersRequest", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders); - LLCore::HttpOptions::ptr_t httpOptions(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("groupMembersRequest", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpHeaders::ptr_t httpHeaders = std::make_shared<LLCore::HttpHeaders>(); + LLCore::HttpOptions::ptr_t httpOptions = std::make_shared<LLCore::HttpOptions>(); httpOptions->setFollowRedirects(false); @@ -2141,9 +2141,9 @@ void LLGroupMgr::groupMembersRequestCoro(std::string url, LLUUID group_id, U32 p << ", sort_column: " << sort_column << ", sort_descending: " << sort_descending << LL_ENDL; LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("groupMembersRequest", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("groupMembersRequest", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); LLSD postData = LLSD::emptyMap(); postData["group_id"] = group_id; diff --git a/indra/newview/llheroprobemanager.cpp b/indra/newview/llheroprobemanager.cpp index 343bb01072..9efe70786d 100644 --- a/indra/newview/llheroprobemanager.cpp +++ b/indra/newview/llheroprobemanager.cpp @@ -92,6 +92,7 @@ void LLHeroProbeManager::update() } LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY; + LL_PROFILE_GPU_ZONE("hero manager update"); llassert(!gCubeSnapshot); // assert a snapshot is not in progress if (LLAppViewer::instance()->logoutRequestSent()) { @@ -293,6 +294,9 @@ void LLHeroProbeManager::renderProbes() // In effect this simulates single-bounce lighting. void LLHeroProbeManager::updateProbeFace(LLReflectionMap* probe, U32 face, bool is_dynamic, F32 near_clip) { + LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY; + LL_PROFILE_GPU_ZONE("hero probe update"); + // hacky hot-swap of camera specific render targets gPipeline.mRT = &gPipeline.mHeroProbeRT; @@ -363,7 +367,7 @@ void LLHeroProbeManager::updateProbeFace(LLReflectionMap* probe, U32 face, bool for (int i = 0; i < mMipChain.size(); ++i) { - LL_PROFILE_GPU_ZONE("probe mip"); + LL_PROFILE_GPU_ZONE("hero probe mip"); mMipChain[i].bindTarget(); if (i == 0) { @@ -390,7 +394,7 @@ void LLHeroProbeManager::updateProbeFace(LLReflectionMap* probe, U32 face, bool if (mip >= 0) { - LL_PROFILE_GPU_ZONE("probe mip copy"); + LL_PROFILE_GPU_ZONE("hero probe mip copy"); mTexture->bind(0); glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, mip, 0, 0, sourceIdx * 6 + face, 0, 0, res, res); @@ -440,7 +444,7 @@ void LLHeroProbeManager::generateRadiance(LLReflectionMap* probe) for (int i = 0; i < mMipChain.size() / 4; ++i) { - LL_PROFILE_GPU_ZONE("probe radiance gen"); + LL_PROFILE_GPU_ZONE("hero probe radiance gen"); static LLStaticHashedString sMipLevel("mipLevel"); static LLStaticHashedString sRoughness("roughness"); static LLStaticHashedString sWidth("u_width"); @@ -487,6 +491,7 @@ void LLHeroProbeManager::updateUniforms() } LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY; + LL_PROFILE_GPU_ZONE("hpmu - uniforms") LLMatrix4a modelview; modelview.loadu(gGLModelView); diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp index d0d2ee191a..776d2dd31e 100644 --- a/indra/newview/llhudeffectlookat.cpp +++ b/indra/newview/llhudeffectlookat.cpp @@ -37,6 +37,7 @@ #include "lldrawable.h" #include "llviewerobjectlist.h" #include "llviewercontrol.h" +#include "llvoavatarself.h" #include "llrendersphere.h" #include "llselectmgr.h" #include "llglheaders.h" @@ -397,6 +398,21 @@ bool LLHUDEffectLookAt::setLookAt(ELookAtType target_type, LLViewerObject *objec return false; } + static LLCachedControl<bool> enable_lookat_hints(gSavedSettings, "EnableLookAtTarget", true); + if (!enable_lookat_hints) + { + // Clear the effect so it doesn't linger around if it gets disabled + if (mTargetType != LOOKAT_TARGET_IDLE) + { + mTargetObject = gAgentAvatarp; + mTargetType = LOOKAT_TARGET_IDLE; + mTargetOffsetGlobal.set(2.f, 0.f, 0.f); + setDuration(3.f); + setNeedsSendToSim(true); + } + return false; + } + if (target_type >= LOOKAT_NUM_TARGETS) { LL_WARNS() << "Bad target_type " << (int)target_type << " - ignoring." << LL_ENDL; @@ -409,6 +425,29 @@ bool LLHUDEffectLookAt::setLookAt(ELookAtType target_type, LLViewerObject *objec return false; } + static LLCachedControl<bool> limit_lookat_hints(gSavedSettings, "LimitLookAtTarget", true); + // Don't affect the look at if object is gAgentAvatarp (cursor head follow) + if (limit_lookat_hints && object != gAgentAvatarp) + { + // If it is a object + if (object) + { + position += object->getRenderPosition(); + object = NULL; + } + + LLVector3 agentHeadPosition = gAgentAvatarp->mHeadp->getWorldPosition(); + float dist = (float)dist_vec(agentHeadPosition, position); + + static LLCachedControl<F32> limit_lookat_hints_distance(gSavedSettings, "LimitLookAtTargetDistance", 2.0f); + if (dist > limit_lookat_hints_distance) + { + LLVector3 headOffset = position - agentHeadPosition; + headOffset *= limit_lookat_hints_distance / dist; + position.setVec(agentHeadPosition + headOffset); + } + } + F32 current_time = mTimer.getElapsedTimeF32(); // type of lookat behavior or target object has changed diff --git a/indra/newview/llhudeffectpointat.cpp b/indra/newview/llhudeffectpointat.cpp index eeb38cd6aa..c600010f6b 100644 --- a/indra/newview/llhudeffectpointat.cpp +++ b/indra/newview/llhudeffectpointat.cpp @@ -34,6 +34,7 @@ #include "llagent.h" #include "llagentcamera.h" #include "lldrawable.h" +#include "llviewercontrol.h" #include "llviewerobjectlist.h" #include "llvoavatar.h" #include "message.h" @@ -226,6 +227,19 @@ bool LLHUDEffectPointAt::setPointAt(EPointAtType target_type, LLViewerObject *ob return false; } + static LLCachedControl<bool> enable_selection_hints(gSavedSettings, "EnableSelectionHints", true); + if (!enable_selection_hints) + { + // Clear the effect so it doesn't linger around if it gets disabled + if (mTargetType != POINTAT_TARGET_NONE) + { + clearPointAtTarget(); + setDuration(1.f); + setNeedsSendToSim(true); + } + return false; + } + if (target_type >= POINTAT_NUM_TARGETS) { LL_WARNS() << "Bad target_type " << (int)target_type << " - ignoring." << LL_ENDL; diff --git a/indra/newview/llhudeffectresetskeleton.cpp b/indra/newview/llhudeffectresetskeleton.cpp new file mode 100644 index 0000000000..2bb5696f59 --- /dev/null +++ b/indra/newview/llhudeffectresetskeleton.cpp @@ -0,0 +1,220 @@ +/** + * @file llhudeffectresetskeleton.cpp + * @brief LLHUDEffectResetSkeleton class implementation + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, 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 "llhudeffectresetskeleton.h" + +#include "llagent.h" +#include "llviewerobjectlist.h" +#include "llvoavatar.h" +#include "message.h" + +// packet layout +const S32 TARGET_OBJECT = 0; // This is to allow for targetting owned animesh +const S32 RESET_ANIMATIONS = 16; //This can also be a flags if needed +const S32 PKT_SIZE = 17; + +//----------------------------------------------------------------------------- +// LLHUDEffectResetSkeleton() +//----------------------------------------------------------------------------- +LLHUDEffectResetSkeleton::LLHUDEffectResetSkeleton(const U8 type) : + LLHUDEffect(type) +{ +} + +//----------------------------------------------------------------------------- +// ~LLHUDEffectResetSkeleton() +//----------------------------------------------------------------------------- +LLHUDEffectResetSkeleton::~LLHUDEffectResetSkeleton() +{ +} + +//----------------------------------------------------------------------------- +// packData() +//----------------------------------------------------------------------------- +void LLHUDEffectResetSkeleton::render() +{ + // HUDEffectResetSkeleton is a fake effect meant to reset skeleton only. + // Just wait for an update() call to do its work and then die. +} + +//----------------------------------------------------------------------------- +// packData() +//----------------------------------------------------------------------------- +void LLHUDEffectResetSkeleton::packData(LLMessageSystem *mesgsys) +{ + // Pack the default data + LLHUDEffect::packData(mesgsys); + + // Pack the type-specific data. Uses a fun packed binary format. Whee! + U8 packed_data[PKT_SIZE]; + memset(packed_data, 0, PKT_SIZE); + + // pack both target object and position + // position interpreted as offset if target object is non-null + if (mTargetObject) + { + htolememcpy(&(packed_data[TARGET_OBJECT]), mTargetObject->mID.mData, MVT_LLUUID, 16); + } + else + { + htolememcpy(&(packed_data[TARGET_OBJECT]), LLUUID::null.mData, MVT_LLUUID, 16); + } + + U8 resetAnimations = (U8)mResetAnimations; + htolememcpy(&(packed_data[RESET_ANIMATIONS]), &resetAnimations, MVT_U8, 1); + + mesgsys->addBinaryDataFast(_PREHASH_TypeData, packed_data, PKT_SIZE); +} + +//----------------------------------------------------------------------------- +// unpackData() +//----------------------------------------------------------------------------- +void LLHUDEffectResetSkeleton::unpackData(LLMessageSystem *mesgsys, S32 blocknum) +{ + LLVector3d new_target; + U8 packed_data[PKT_SIZE]; + + + LLHUDEffect::unpackData(mesgsys, blocknum); + + LLUUID source_id; + mesgsys->getUUIDFast(_PREHASH_Effect, _PREHASH_AgentID, source_id, blocknum); + + LLViewerObject *objp = gObjectList.findObject(source_id); + if (objp && objp->isAvatar()) + { + setSourceObject(objp); + } + else + { + //LL_WARNS() << "Could not find source avatar for ResetSkeleton effect" << LL_ENDL; + return; + } + + S32 size = mesgsys->getSizeFast(_PREHASH_Effect, blocknum, _PREHASH_TypeData); + if (size != PKT_SIZE) + { + LL_WARNS() << "ResetSkeleton effect with bad size " << size << LL_ENDL; + return; + } + + mesgsys->getBinaryDataFast(_PREHASH_Effect, _PREHASH_TypeData, packed_data, PKT_SIZE, blocknum); + + LLUUID target_id; + htolememcpy(target_id.mData, &(packed_data[TARGET_OBJECT]), MVT_LLUUID, 16); + + // The purpose for having a target ID is if we want to reset animesh, or + // other things in the future. + // I implemented this, but due to issues regarding various permission + // checks, I scrapped it for now. --Chaser Zaks + // See https://github.com/secondlife/viewer/pull/1212 for additional info + + if (target_id.isNull()) + { + target_id = source_id; + } + + objp = gObjectList.findObject(target_id); + + if (objp) + { + setTargetObject(objp); + } + + U8 resetAnimations = 0; + htolememcpy(&resetAnimations, &(packed_data[RESET_ANIMATIONS]), MVT_U8, 1); + + // Pre-emptively assume this is going to be flags in the future. + // It isn't needed now, but this will assure that only bit 1 is set + mResetAnimations = resetAnimations & 1; + + update(); +} + +//----------------------------------------------------------------------------- +// setTargetObjectAndOffset() +//----------------------------------------------------------------------------- +void LLHUDEffectResetSkeleton::setTargetObject(LLViewerObject *objp) +{ + mTargetObject = objp; +} + + +//----------------------------------------------------------------------------- +// markDead() +//----------------------------------------------------------------------------- +void LLHUDEffectResetSkeleton::markDead() +{ + LLHUDEffect::markDead(); +} + +void LLHUDEffectResetSkeleton::setSourceObject(LLViewerObject* objectp) +{ + // restrict source objects to avatars + if (objectp && objectp->isAvatar()) + { + LLHUDEffect::setSourceObject(objectp); + } +} + +//----------------------------------------------------------------------------- +// update() +//----------------------------------------------------------------------------- +void LLHUDEffectResetSkeleton::update() +{ + // If the target object is dead, set the target object to NULL + if (mTargetObject.isNull() || mTargetObject->isDead()) + { + markDead(); + return; + } + + if (mSourceObject.isNull() || mSourceObject->isDead()) + { + markDead(); + return; + } + + if (mTargetObject->isAvatar()) + { + // Only the owner of a avatar can reset their skeleton like this + // Also allow reset if we created the effect (Local resetting) + if (mSourceObject->getID() == mTargetObject->getID() || getOriginatedHere()) + { + LLVOAvatar* avatar = mTargetObject->asAvatar(); + avatar->resetSkeleton(mResetAnimations); + } + } + else + { + LL_WARNS() << mSourceObject->getID() << " attempted to reset skeleton on " + << mTargetObject->getID() << ", but it is not a avatar!" << LL_ENDL; + } + + markDead(); +} diff --git a/indra/newview/llhudeffectresetskeleton.h b/indra/newview/llhudeffectresetskeleton.h new file mode 100644 index 0000000000..c89516d7fc --- /dev/null +++ b/indra/newview/llhudeffectresetskeleton.h @@ -0,0 +1,60 @@ +/** + * @file llhudeffectresetskeleton.h + * @brief LLHUDEffectResetSkeleton class definition + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, 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_LLHUDEFFECTRESETSKELETON_H +#define LL_LLHUDEFFECTRESETSKELETON_H + +#include "llhudeffect.h" + +class LLViewerObject; +class LLVOAvatar; + + +class LLHUDEffectResetSkeleton final : public LLHUDEffect +{ +public: + friend class LLHUDObject; + + /*virtual*/ void markDead() override; + /*virtual*/ void setSourceObject(LLViewerObject* objectp) override; + + void setTargetObject(LLViewerObject *objp) override; + void setResetAnimations(bool enable){ mResetAnimations = enable; }; + +protected: + LLHUDEffectResetSkeleton(const U8 type); + ~LLHUDEffectResetSkeleton(); + + void render() override; + void packData(LLMessageSystem *mesgsys) override; + void unpackData(LLMessageSystem *mesgsys, S32 blocknum) override; + + void update() override; +private: + bool mResetAnimations; +}; + +#endif // LL_LLHUDEFFECTRESETSKELETON_H diff --git a/indra/newview/llhudobject.cpp b/indra/newview/llhudobject.cpp index e6fbfbfb38..04e9e2dff2 100644 --- a/indra/newview/llhudobject.cpp +++ b/indra/newview/llhudobject.cpp @@ -36,6 +36,7 @@ #include "llhudeffecttrail.h" #include "llhudeffectlookat.h" #include "llhudeffectpointat.h" +#include "llhudeffectresetskeleton.h" #include "llhudnametag.h" #include "llvoicevisualizer.h" @@ -241,6 +242,9 @@ LLHUDEffect *LLHUDObject::addHUDEffect(const U8 type) case LL_HUD_EFFECT_BLOB: hud_objectp = new LLHUDEffectBlob(type); break; + case LL_HUD_EFFECT_RESET_SKELETON: + hud_objectp = new LLHUDEffectResetSkeleton(type); + break; default: LL_WARNS() << "Unknown type of hud effect:" << (U32) type << LL_ENDL; } diff --git a/indra/newview/llhudobject.h b/indra/newview/llhudobject.h index 8c628e3f92..f683f21e96 100644 --- a/indra/newview/llhudobject.h +++ b/indra/newview/llhudobject.h @@ -96,7 +96,8 @@ public: LL_HUD_EFFECT_POINTAT, LL_HUD_EFFECT_VOICE_VISUALIZER, // Ventrella LL_HUD_NAME_TAG, - LL_HUD_EFFECT_BLOB + LL_HUD_EFFECT_BLOB, + LL_HUD_EFFECT_RESET_SKELETON }; protected: static void sortObjects(); diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp index fd0d8b696f..c092b4c91a 100644 --- a/indra/newview/llhudtext.cpp +++ b/indra/newview/llhudtext.cpp @@ -225,10 +225,6 @@ void LLHUDText::renderText() } text_color = segment_iter->mColor; - if (mOnHUDAttachment) - { - text_color = linearColor4(text_color); - } text_color.mV[VALPHA] *= alpha_factor; hud_render_text(segment_iter->getText(), render_position, *fontp, style, shadow, x_offset, y_offset, text_color, mOnHUDAttachment); diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp index 590cd09a31..779ed725ac 100644 --- a/indra/newview/llimprocessing.cpp +++ b/indra/newview/llimprocessing.cpp @@ -202,9 +202,19 @@ void inventory_offer_handler(LLOfferInfo* info) auto indx = msg.find(" ( http://slurl.com/secondlife/"); if (indx == std::string::npos) { - // try to find new slurl host + // https + indx = msg.find(" ( https://slurl.com/secondlife/"); + } + if (indx == std::string::npos) + { + // try to find new slurl http host indx = msg.find(" ( http://maps.secondlife.com/secondlife/"); } + if (indx == std::string::npos) + { + // try to find new slurl https host + indx = msg.find(" ( https://maps.secondlife.com/secondlife/"); + } if (indx >= 0) { LLStringUtil::truncate(msg, indx); @@ -422,6 +432,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, U8 *binary_bucket, S32 binary_bucket_size, LLHost &sender, + LLSD metadata, LLUUID aux_id) { LLChat chat; @@ -451,6 +462,28 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, bool is_linden = chat.mSourceType != CHAT_SOURCE_OBJECT && LLMuteList::isLinden(name); + /*** + * The simulator may have flagged this sender as a bot, if the viewer would like to display + * the chat text in a different color or font, the below code is how the viewer can + * tell if the sender is a bot. + *----------------------------------------------------- + bool is_bot = false; + if (metadata.has("sender")) + { // The server has identified this sender as a bot. + is_bot = metadata["sender"]["bot"].asBoolean(); + } + *----------------------------------------------------- + */ + + std::string notice_name; + LLSD notice_args; + if (metadata.has("notice")) + { // The server has injected a notice into the IM conversation. + // These will be things like bot notifications, etc. + notice_name = metadata["notice"]["id"].asString(); + notice_args = metadata["notice"]["data"]; + } + chat.mMuted = is_muted; chat.mFromID = from_id; chat.mFromName = name; @@ -544,7 +577,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, } else { - // standard message, not from system + // standard message, server may have injected a notice into the conversation. std::string saved; if (offline == IM_OFFLINE) { @@ -579,8 +612,17 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, region_message = true; } } - gIMMgr->addMessage( - session_id, + + std::string real_name; + + if (!notice_name.empty()) + { // The simulator has injected some sort of notice into the conversation. + // findString will only replace the contents of buffer if the notice_id is found. + LLTrans::findString(buffer, notice_name, notice_args); + real_name = SYSTEM_FROM; + } + + gIMMgr->addMessage(session_id, from_id, name, buffer, @@ -591,7 +633,9 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, region_id, position, region_message, - timestamp); + timestamp, + LLUUID::null, + real_name); } else { @@ -650,14 +694,6 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, asset_type = (LLAssetType::EType)(atoi((*(iter++)).c_str())); iter++; // wearable type if applicable, otherwise asset type item_name = std::string((*(iter++)).c_str()); - // Note There is more elements in 'tokens' ... - - - for (int i = 0; i < 6; i++) - { - LL_WARNS() << *(iter++) << LL_ENDL; - iter++; - } } } else @@ -1494,10 +1530,10 @@ void LLIMProcessing::requestOfflineMessages() if (!requested && gMessageSystem && !gDisconnected - && LLMuteList::getInstance()->isLoaded() && isAgentAvatarValid() && gAgent.getRegion() - && gAgent.getRegion()->capabilitiesReceived()) + && gAgent.getRegion()->capabilitiesReceived() + && (LLMuteList::getInstance()->isLoaded() || LLMuteList::getInstance()->getLoadFailed())) { std::string cap_url = gAgent.getRegionCapability("ReadOfflineMsgs"); @@ -1525,8 +1561,8 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("requestOfflineMessagesCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("requestOfflineMessagesCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD result = httpAdapter->getAndSuspend(httpRequest, url); @@ -1627,6 +1663,12 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url) from_group = message_data["from_group"].asString() == "Y"; } + LLSD metadata; + if (message_data.has("metadata")) + { + metadata = message_data["metadata"]; + } + EInstantMessage dialog = static_cast<EInstantMessage>(message_data["dialog"].asInteger()); LLUUID session_id = message_data["transaction-id"].asUUID(); if (session_id.isNull() && dialog == IM_FROM_TASK) @@ -1654,6 +1696,7 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url) local_bin_bucket.data(), S32(local_bin_bucket.size()), local_sender, + metadata, message_data["asset_id"].asUUID()); }); diff --git a/indra/newview/llimprocessing.h b/indra/newview/llimprocessing.h index 030d28b198..66ffc59ae0 100644 --- a/indra/newview/llimprocessing.h +++ b/indra/newview/llimprocessing.h @@ -48,6 +48,7 @@ public: U8 *binary_bucket, S32 binary_bucket_size, LLHost &sender, + LLSD metadata, LLUUID aux_id = LLUUID::null); // Either receives list of offline messages from 'ReadOfflineMsgs' capability diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 6e9232d6f4..f3cef660f6 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -73,6 +73,7 @@ #include "llviewerregion.h" #include "llcorehttputil.h" #include "lluiusage.h" +#include "llurlregistry.h" #include <array> @@ -199,6 +200,9 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(session_id); bool store_dnd_message = false; // flag storage of a dnd message bool is_session_focused = session_floater->isTornOff() && session_floater->hasFocus(); + bool contains_mention = LLUrlRegistry::getInstance()->containsAgentMention(msg["message"].asString()); + static LLCachedControl<bool> play_snd_mention_pref(gSavedSettings, "PlaySoundChatMention", false); + bool play_snd_mention = contains_mention && play_snd_mention_pref && (msg["source_type"].asInteger() != CHAT_SOURCE_OBJECT); if (!LLFloater::isVisible(im_box) || im_box->isMinimized()) { conversations_floater_status = CLOSED; @@ -232,7 +236,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) else { user_preferences = gSavedSettings.getString("NotificationNearbyChatOptions"); - if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNearbyChatIM"))) + if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNearbyChatIM")) && !play_snd_mention) { make_ui_sound("UISndNewIncomingIMSession"); } @@ -243,7 +247,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) if (LLAvatarTracker::instance().isBuddy(participant_id)) { user_preferences = gSavedSettings.getString("NotificationFriendIMOptions"); - if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundFriendIM"))) + if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundFriendIM")) && !play_snd_mention) { make_ui_sound("UISndNewIncomingIMSession"); } @@ -251,7 +255,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) else { user_preferences = gSavedSettings.getString("NotificationNonFriendIMOptions"); - if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNonFriendIM"))) + if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNonFriendIM")) && !play_snd_mention) { make_ui_sound("UISndNewIncomingIMSession"); } @@ -260,7 +264,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) else if (session->isAdHocSessionType()) { user_preferences = gSavedSettings.getString("NotificationConferenceIMOptions"); - if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundConferenceIM"))) + if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundConferenceIM")) && !play_snd_mention) { make_ui_sound("UISndNewIncomingIMSession"); } @@ -268,11 +272,18 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) else if(session->isGroupSessionType()) { user_preferences = gSavedSettings.getString("NotificationGroupChatOptions"); - if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundGroupChatIM"))) + if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundGroupChatIM")) && !play_snd_mention) { make_ui_sound("UISndNewIncomingIMSession"); } } + if (play_snd_mention) + { + if (!gAgent.isDoNotDisturb()) + { + make_ui_sound("UISndChatMention"); + } + } // actions: @@ -325,7 +336,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) if ("openconversations" == user_preferences || ON_TOP == conversations_floater_status || ("toast" == user_preferences && ON_TOP != conversations_floater_status) - || ("flash" == user_preferences && (CLOSED == conversations_floater_status + || (("flash" == user_preferences || contains_mention) && (CLOSED == conversations_floater_status || NOT_ON_TOP == conversations_floater_status)) || is_dnd_msg) { @@ -345,7 +356,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) } else { - im_box->flashConversationItemWidget(session_id, true); + im_box->flashConversationItemWidget(session_id, true, contains_mention); } } } @@ -420,8 +431,8 @@ void startConferenceCoro(std::string url, { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("ConferenceChatStart", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("ConferenceChatStart", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD postData; postData["method"] = "start conference"; @@ -469,8 +480,8 @@ void startConferenceCoro(std::string url, void startP2PVoiceCoro(std::string url, LLUUID sessionID, LLUUID creatorId, LLUUID otherParticipantId) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); - LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("StartP2PVoiceCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("StartP2PVoiceCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD postData; postData["method"] = "start p2p voice"; @@ -509,8 +520,8 @@ void chatterBoxInvitationCoro(std::string url, LLUUID sessionId, LLIMMgr::EInvit { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("ConferenceInviteStart", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("ConferenceInviteStart", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD postData; postData["method"] = "accept invitation"; @@ -627,8 +638,8 @@ void chatterBoxHistoryCoro(std::string url, LLUUID sessionId, std::string from, { // if parameters from, message and timestamp have values, they are a message that opened chat LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("ChatHistory", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("ChatHistory", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD postData; postData["method"] = "fetch history"; @@ -800,6 +811,10 @@ void LLIMModel::LLIMSession::initVoiceChannel(const LLSD& voiceChannelInfo) { if (mVoiceChannel) { + if (!voiceChannelInfo.isMap()) + { + LL_WARNS() << "initVoiceChannel called without voiceChannelInfo" << LL_ENDL; + } if (mVoiceChannel->isThisVoiceChannel(voiceChannelInfo)) { return; @@ -1691,6 +1706,8 @@ bool LLIMModel::logToFile(const std::string& file_name, const std::string& from, } else { + // will check KeepConversationLogTranscripts on its own + LLConversationLog::instance().cache(); return false; } } @@ -3144,9 +3161,16 @@ void LLIMMgr::addMessage( const LLUUID& region_id, const LLVector3& position, bool is_region_msg, - U32 timestamp) // May be zero + U32 timestamp, // May be zero + LLUUID display_id, + std::string_view display_name) { LLUUID other_participant_id = target_id; + std::string message_display_name = (display_name.empty()) ? from : std::string(display_name); + if (display_id.isNull() && (display_name.empty())) + { + display_id = other_participant_id; + } LLUUID new_session_id = session_id; if (new_session_id.isNull()) @@ -3243,9 +3267,13 @@ void LLIMMgr::addMessage( } //Play sound for new conversations - if (!skip_message & !gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation"))) + if (!skip_message && !gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation"))) { - make_ui_sound("UISndNewIncomingIMSession"); + static LLCachedControl<bool> play_snd_mention_pref(gSavedSettings, "PlaySoundChatMention", false); + if (!play_snd_mention_pref || !LLUrlRegistry::getInstance()->containsAgentMention(msg)) + { + make_ui_sound("UISndNewIncomingIMSession"); + } } } else @@ -3257,7 +3285,7 @@ void LLIMMgr::addMessage( if (!LLMuteList::getInstance()->isMuted(other_participant_id, LLMute::flagTextChat) && !skip_message) { - LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg, true, is_region_msg, timestamp); + LLIMModel::instance().addMessage(new_session_id, message_display_name, display_id, msg, true, is_region_msg, timestamp); } // Open conversation floater if offline messages are present @@ -3265,7 +3293,7 @@ void LLIMMgr::addMessage( { LLFloaterReg::showInstance("im_container"); LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container")-> - flashConversationItemWidget(new_session_id, true); + flashConversationItemWidget(new_session_id, true, LLUrlRegistry::getInstance()->containsAgentMention(msg)); } } @@ -3553,6 +3581,7 @@ void LLIMMgr::inviteToSession( && voice_invite && "VoiceInviteQuestionDefault" == question_type) { LL_INFOS("IMVIEW") << "Rejecting voice call from initiating muted resident " << caller_name << LL_ENDL; + payload["voice_channel_info"] = voice_channel_info; LLIncomingCallDialog::processCallResponse(1, payload); return; } @@ -3601,6 +3630,7 @@ void LLIMMgr::inviteToSession( send_do_not_disturb_message(gMessageSystem, caller_id, session_id); } // silently decline the call + payload["voice_channel_info"] = voice_channel_info; LLIncomingCallDialog::processCallResponse(1, payload); return; } diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 61776860e3..23f90ca795 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -368,7 +368,9 @@ public: const LLUUID& region_id = LLUUID::null, const LLVector3& position = LLVector3::zero, bool is_region_msg = false, - U32 timestamp = 0); + U32 timestamp = 0, + LLUUID display_id = LLUUID::null, + std::string_view display_name = ""); void addSystemMessage(const LLUUID& session_id, const std::string& message_name, const LLSD& args); diff --git a/indra/newview/llinspecttexture.cpp b/indra/newview/llinspecttexture.cpp index 24dbe61bad..9f0d236826 100644 --- a/indra/newview/llinspecttexture.cpp +++ b/indra/newview/llinspecttexture.cpp @@ -115,7 +115,6 @@ public: protected: LLPointer<LLViewerFetchedTexture> m_Image; - S32 mImageBoostLevel = LLGLTexture::BOOST_NONE; std::string mLoadingText; }; @@ -128,12 +127,8 @@ LLTexturePreviewView::LLTexturePreviewView(const LLView::Params& p) LLTexturePreviewView::~LLTexturePreviewView() { - if (m_Image) - { - m_Image->setBoostLevel(mImageBoostLevel); m_Image = nullptr; } -} void LLTexturePreviewView::draw() { @@ -153,18 +148,18 @@ void LLTexturePreviewView::draw() bool isLoading = (!m_Image->isFullyLoaded()) && (m_Image->getDiscardLevel() > 0); if (isLoading) LLFontGL::getFontSansSerif()->renderUTF8(mLoadingText, 0, rctClient.mLeft + 3, rctClient.mTop - 25, LLColor4::white, LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::DROP_SHADOW); - m_Image->addTextureStats((isLoading) ? MAX_IMAGE_AREA : (F32)(rctClient.getWidth() * rctClient.getHeight())); + + m_Image->setKnownDrawSize(MAX_IMAGE_SIZE, MAX_IMAGE_SIZE); } } void LLTexturePreviewView::setImageFromAssetId(const LLUUID& idAsset) { - m_Image = LLViewerTextureManager::getFetchedTexture(idAsset, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + m_Image = LLViewerTextureManager::getFetchedTexture(idAsset, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_THUMBNAIL); if (m_Image) { - mImageBoostLevel = m_Image->getBoostLevel(); - m_Image->setBoostLevel(LLGLTexture::BOOST_PREVIEW); m_Image->forceToSaveRawImage(0); + m_Image->setKnownDrawSize(MAX_IMAGE_SIZE, MAX_IMAGE_SIZE); if ( (!m_Image->isFullyLoaded()) && (!m_Image->hasFetcher()) ) { if (m_Image->isInFastCacheList()) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index c103d40a38..7d9fad5a54 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -104,7 +104,6 @@ static bool check_item(const LLUUID& item_id, LLInventoryFilter* filter); // Helper functions - bool isAddAction(const std::string& action) { return ("wear" == action || "attach" == action || "activate" == action); @@ -830,6 +829,8 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id, { const LLInventoryObject *obj = getInventoryObject(); bool single_folder_root = (mRoot == NULL); + bool is_cof = isCOFFolder(); + bool is_inbox = isInboxFolder(); if (obj) { @@ -844,7 +845,8 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id, disabled_items.push_back(std::string("Copy")); } - if (isAgentInventory() && !single_folder_root && !isMarketplaceListingsFolder()) + bool is_agent_inventory = isAgentInventory(); + if (is_agent_inventory && !single_folder_root && !is_cof && !is_inbox) { items.push_back(std::string("New folder from selected")); items.push_back(std::string("Subfolder Separator")); @@ -857,6 +859,19 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id, } } + if (isFavorite()) + { + items.push_back(std::string("Remove from Favorites")); + } + else if (is_agent_inventory && !gInventory.isObjectDescendentOf(mUUID, gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH))) + { + items.push_back(std::string("Add to Favorites")); + if (gInventory.getRootFolderID() == mUUID) + { + disabled_items.push_back(std::string("Add to Favorites")); + } + } + if (obj->getIsLinkType()) { items.push_back(std::string("Find Original")); @@ -869,6 +884,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id, if (!isItemMovable() || !canMenuCut()) { disabled_items.push_back(std::string("Cut")); + disabled_items.push_back(std::string("New folder from selected")); } } else @@ -878,7 +894,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id, items.push_back(std::string("Find Links")); } - if (!isInboxFolder() && !single_folder_root) + if (!is_inbox && !single_folder_root) { items.push_back(std::string("Rename")); if (!isItemRenameable() || ((flags & FIRST_SELECTED_ITEM) == 0)) @@ -918,6 +934,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id, if (!isItemMovable() || !canMenuCut()) { disabled_items.push_back(std::string("Cut")); + disabled_items.push_back(std::string("New folder from selected")); } if (canListOnMarketplace() && !isMarketplaceListingsFolder() && !isInboxFolder()) @@ -940,7 +957,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id, } // Don't allow items to be pasted directly into the COF or the inbox - if (!isCOFFolder() && !isInboxFolder()) + if (!is_cof && !is_inbox) { items.push_back(std::string("Paste")); } @@ -1334,6 +1351,13 @@ bool LLInvFVBridge::isAgentInventory() const return model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()); } +bool LLInvFVBridge::isAgentInventoryRoot() const +{ + const LLInventoryModel* model = getInventoryModel(); + if(!model) return false; + return gInventory.getRootFolderID() == mUUID; +} + bool LLInvFVBridge::isCOFFolder() const { return LLAppearanceMgr::instance().getIsInCOF(mUUID); @@ -1836,7 +1860,14 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action) { LLVector3d global_pos; landmark->getGlobalPos(global_pos); - LLLandmarkActions::getSLURLfromPosGlobal(global_pos, ©_slurl_to_clipboard_callback_inv, true); + if (!global_pos.isExactlyZero()) + { + LLLandmarkActions::getSLURLfromPosGlobal(global_pos, ©_slurl_to_clipboard_callback_inv, true); + } + else + { + LLNotificationsUtil::add("LandmarkLocationUnknown"); + } } } } @@ -2281,7 +2312,21 @@ const LLUUID& LLItemBridge::getThumbnailUUID() const return LLUUID::null; } -// virtual +bool LLItemBridge::isFavorite() const +{ + LLViewerInventoryItem* item = NULL; + LLInventoryModel* model = getInventoryModel(); + if (model) + { + item = model->getItem(mUUID); + } + if (item) + { + return get_is_favorite(item); + } + return false; +} + bool LLItemBridge::isItemPermissive() const { if (LLViewerInventoryItem* item = getItem()) @@ -2426,6 +2471,16 @@ const LLUUID& LLFolderBridge::getThumbnailUUID() const return LLUUID::null; } +bool LLFolderBridge::isFavorite() const +{ + LLViewerInventoryCategory* cat = getCategory(); + if (cat) + { + return cat->getIsFavorite(); + } + return false; +} + void LLFolderBridge::update() { // we know we have children but haven't fetched them (doesn't obey filter) @@ -2665,6 +2720,7 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, // bool is_movable = true; + bool create_outfit = false; if (is_movable && (marketplacelistings_id == cat_id)) { @@ -2697,14 +2753,24 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, U32 max_items_to_wear = gSavedSettings.getU32("WearFolderLimit"); if (is_movable && move_is_into_outfit) { - if (mUUID == my_outifts_id) + if ((inv_cat->getPreferredType() != LLFolderType::FT_NONE) && (inv_cat->getPreferredType() != LLFolderType::FT_OUTFIT)) + { + tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); + is_movable = false; + } + else if (mUUID == my_outifts_id) { if (source != LLToolDragAndDrop::SOURCE_AGENT || move_is_from_marketplacelistings) { tooltip_msg = LLTrans::getString("TooltipOutfitNotInInventory"); is_movable = false; } - else if (can_move_to_my_outfits(model, inv_cat, max_items_to_wear)) + else if (can_move_to_my_outfits_as_outfit(model, inv_cat, max_items_to_wear)) + { + is_movable = true; + create_outfit = true; + } + else if (can_move_to_my_outfits_as_subfolder(model, inv_cat)) { is_movable = true; } @@ -2714,13 +2780,44 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, is_movable = false; } } - else if(getCategory() && getCategory()->getPreferredType() == LLFolderType::FT_NONE) + else if (!getCategory()) { - is_movable = ((inv_cat->getPreferredType() == LLFolderType::FT_NONE) || (inv_cat->getPreferredType() == LLFolderType::FT_OUTFIT)); + is_movable = false; + tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); } else { - is_movable = false; + EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); + EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id); + if ((dest_res == MY_OUTFITS_OUTFIT || dest_res == MY_OUTFITS_SUBOUTFIT) && inv_res == MY_OUTFITS_OUTFIT) + { + is_movable = false; + tooltip_msg = LLTrans::getString("TooltipCantMoveOutfitIntoOutfit"); + } + else if (dest_res == MY_OUTFITS_OUTFIT || dest_res == MY_OUTFITS_SUBOUTFIT) + { + is_movable = false; + tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); + } + else if (dest_res == MY_OUTFITS_SUBFOLDER && inv_res == MY_OUTFITS_SUBOUTFIT) + { + is_movable = false; + tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); + } + else if (can_move_to_my_outfits_as_outfit(model, inv_cat, max_items_to_wear)) + { + is_movable = true; + create_outfit = true; + } + else if (can_move_to_my_outfits_as_subfolder(model, inv_cat)) + { + is_movable = true; + } + else + { + is_movable = false; + tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); + } } } if (is_movable && move_is_into_current_outfit && is_link) @@ -2912,9 +3009,81 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, if (mUUID == my_outifts_id) { - // Category can contains objects, - // create a new folder and populate it with links to original objects - dropToMyOutfits(inv_cat, cb); + EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id); + if (inv_res == MY_OUTFITS_SUBFOLDER || inv_res == MY_OUTFITS_OUTFIT || !create_outfit) + { + LLInvFVBridge::changeCategoryParent( + model, + (LLViewerInventoryCategory*)inv_cat, + mUUID, + false); + if (cb) cb->fire(inv_cat->getUUID()); + } + else + { + // Moving from inventory + // create a new folder and populate it with links to original objects + dropToMyOutfits(inv_cat, cb); + } + } + else if (move_is_into_my_outfits) + { + EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); + EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id); + switch (inv_res) + { + case MY_OUTFITS_NO: + // Moning from outside outfits into outfits + if (dest_res == MY_OUTFITS_SUBFOLDER && create_outfit) + { + // turn it into outfit + dropToMyOutfitsSubfolder(inv_cat, mUUID, cb); + } + else + { + LLInvFVBridge::changeCategoryParent( + model, + (LLViewerInventoryCategory*)inv_cat, + mUUID, + move_is_into_trash); + if (cb) cb->fire(inv_cat->getUUID()); + } + break; + case MY_OUTFITS_SUBFOLDER: + case MY_OUTFITS_OUTFIT: + // only permit moving subfodlers and outfits into other subfolders + if (dest_res == MY_OUTFITS_SUBFOLDER) + { + LLInvFVBridge::changeCategoryParent( + model, + (LLViewerInventoryCategory*)inv_cat, + mUUID, + false); + if (cb) cb->fire(inv_cat->getUUID()); + } + else + { + assert(false); // mot permitted, shouldn't have accepted + } + break; + case MY_OUTFITS_SUBOUTFIT: + if (dest_res == MY_OUTFITS_SUBOUTFIT || dest_res == MY_OUTFITS_OUTFIT) + { + LLInvFVBridge::changeCategoryParent( + model, + (LLViewerInventoryCategory*)inv_cat, + mUUID, + false); + if (cb) cb->fire(inv_cat->getUUID()); + } + else + { + assert(false); // mot permitted, shouldn't have accepted + } + break; + default: + break; + } } // if target is current outfit folder we use link else if (move_is_into_current_outfit && @@ -3154,7 +3323,7 @@ bool move_inv_category_world_to_agent(const LLUUID& object_id, if (drop && accept) { - std::shared_ptr<LLMoveInv> move_inv(new LLMoveInv); + std::shared_ptr<LLMoveInv> move_inv = std::make_shared<LLMoveInv>(); move_inv->mObjectID = object_id; move_inv->mCategoryID = category_id; move_inv->mCallback = callback; @@ -3599,6 +3768,13 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action) const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS); move_folder_to_marketplacelistings(cat, marketplacelistings_id, ("move_to_marketplace_listings" != action), (("copy_or_move_to_marketplace_listings" == action))); } + else if ("copy_folder_uuid" == action) + { + LLInventoryCategory* cat = gInventory.getCategory(mUUID); + if (!cat) return; + gViewerWindow->getWindow()->copyTextToClipboard(utf8str_to_wstring(mUUID.asString())); + return; + } } void LLFolderBridge::gatherMessage(std::string& message, S32 depth, LLError::ELevel log_level) @@ -3989,7 +4165,6 @@ void LLFolderBridge::perform_pasteFromClipboard() LLInventoryObject *obj = model->getObject(item_id); if (obj) { - if (move_is_into_lost_and_found) { if (LLAssetType::AT_CATEGORY == obj->getType()) @@ -3999,24 +4174,57 @@ void LLFolderBridge::perform_pasteFromClipboard() } if (move_is_into_outfit) { - if (!move_is_into_my_outfits && item && can_move_to_outfit(item, move_is_into_current_outfit)) + bool handled = false; + if (mUUID != my_outifts_id + && dest_folder->getPreferredType() == LLFolderType::FT_OUTFIT + && item + && can_move_to_outfit(item, move_is_into_current_outfit)) { dropToOutfit(item, move_is_into_current_outfit, cb); + handled = true; } else if (move_is_into_my_outfits && LLAssetType::AT_CATEGORY == obj->getType()) { - LLInventoryCategory* cat = model->getCategory(item_id); + LLViewerInventoryCategory* cat = model->getCategory(item_id); U32 max_items_to_wear = gSavedSettings.getU32("WearFolderLimit"); - if (cat && can_move_to_my_outfits(model, cat, max_items_to_wear)) + if (cat && can_move_to_my_outfits_as_outfit(model, cat, max_items_to_wear)) { - dropToMyOutfits(cat, cb); + if (mUUID == my_outifts_id) + { + dropToMyOutfits(cat, cb); + handled = true; + } + else + { + EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); + if (dest_res == MY_OUTFITS_SUBFOLDER) + { + // turn it into outfit + dropToMyOutfitsSubfolder(cat, mUUID, cb); + handled = true; + } + } } - else + if (!handled && cat && can_move_to_my_outfits_as_subfolder(model, cat)) { - LLNotificationsUtil::add("MyOutfitsPasteFailed"); + EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); + if (dest_res == MY_OUTFITS_SUBFOLDER || mUUID == my_outifts_id) + { + if (LLClipboard::instance().isCutMode()) + { + changeCategoryParent(model, cat, parent_id, false); + } + else + { + copy_inventory_category(model, cat, parent_id); + } + if (cb) cb->fire(item_id); + handled = true; + } } } - else + + if (!handled) { LLNotificationsUtil::add("MyOutfitsPasteFailed"); } @@ -4059,7 +4267,7 @@ void LLFolderBridge::perform_pasteFromClipboard() // move_inventory_item() is not enough, as we have to update inventory locally too if (LLAssetType::AT_CATEGORY == obj->getType()) { - LLViewerInventoryCategory* vicat = (LLViewerInventoryCategory *) model->getCategory(item_id); + LLViewerInventoryCategory* vicat = model->getCategory(item_id); llassert(vicat); if (vicat) { @@ -4189,6 +4397,32 @@ void LLFolderBridge::pasteLinkFromClipboard() std::vector<LLUUID> objects; LLClipboard::instance().pasteFromClipboard(objects); + if (objects.size() == 0) + { + LLClipboard::instance().setCutMode(false); + return; + } + + LLUUID& first_id = objects[0]; + LLInventoryItem* item = model->getItem(first_id); + if (item && item->getAssetUUID().isNull()) + { + if (item->getActualType() == LLAssetType::AT_NOTECARD) + { + // otehrwise AIS will return 'Cannot link to items with a NULL asset_id.' + LLNotificationsUtil::add("CantLinkNotecard"); + LLClipboard::instance().setCutMode(false); + return; + } + else if (item->getActualType() == LLAssetType::AT_MATERIAL) + { + LLNotificationsUtil::add("CantLinkMaterial"); + LLClipboard::instance().setCutMode(false); + return; + } + } + + LLPointer<LLInventoryCallback> cb = NULL; LLInventoryPanel* panel = mInventoryPanel.get(); if (panel->getRootFolder()->isSingleFolderMode()) @@ -4249,6 +4483,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items if (outfits_id == mUUID) { + items.push_back(std::string("New Outfit Folder")); items.push_back(std::string("New Outfit")); } @@ -4267,6 +4502,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items } disabled_items.push_back(std::string("New Folder")); + disabled_items.push_back(std::string("upload_options")); disabled_items.push_back(std::string("upload_def")); disabled_items.push_back(std::string("create_new")); } @@ -4292,6 +4528,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items { disabled_items.push_back(std::string("New Folder")); disabled_items.push_back(std::string("New Listing Folder")); + disabled_items.push_back(std::string("upload_options")); disabled_items.push_back(std::string("upload_def")); disabled_items.push_back(std::string("create_new")); } @@ -4342,68 +4579,94 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items else if(isAgentInventory()) // do not allow creating in library { LLViewerInventoryCategory *cat = getCategory(); - // BAP removed protected check to re-enable standard ops in untyped folders. - // Not sure what the right thing is to do here. - if (!isCOFFolder() && cat && (cat->getPreferredType() != LLFolderType::FT_OUTFIT)) - { - if (!isInboxFolder() // don't allow creation in inbox - && outfits_id != mUUID) - { - bool menu_items_added = false; - // Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694. - if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat)) - { - items.push_back(std::string("New Folder")); - menu_items_added = true; - } - if (!isMarketplaceListingsFolder()) - { - items.push_back(std::string("upload_def")); - items.push_back(std::string("create_new")); - items.push_back(std::string("New Script")); - items.push_back(std::string("New Note")); - items.push_back(std::string("New Gesture")); - items.push_back(std::string("New Material")); - items.push_back(std::string("New Clothes")); - items.push_back(std::string("New Body Parts")); - items.push_back(std::string("New Settings")); - if (!LLEnvironment::instance().isInventoryEnabled()) - { - disabled_items.push_back("New Settings"); - } - } - else - { - items.push_back(std::string("New Listing Folder")); - } - if (menu_items_added) - { - items.push_back(std::string("Create Separator")); - } - } - getClipboardEntries(false, items, disabled_items, flags); - } - else + + if (cat) { - // Want some but not all of the items from getClipboardEntries for outfits. - if (cat && (cat->getPreferredType() == LLFolderType::FT_OUTFIT)) + if (cat->getPreferredType() == LLFolderType::FT_OUTFIT) { + // Want some but not all of the items from getClipboardEntries for outfits. items.push_back(std::string("Rename")); items.push_back(std::string("thumbnail")); + addInventoryFavoritesMenuOptions(items); addDeleteContextMenuOptions(items, disabled_items); // EXT-4030: disallow deletion of currently worn outfit - const LLViewerInventoryItem *base_outfit_link = LLAppearanceMgr::instance().getBaseOutfitLink(); + const LLViewerInventoryItem* base_outfit_link = LLAppearanceMgr::instance().getBaseOutfitLink(); if (base_outfit_link && (cat == base_outfit_link->getLinkedCategory())) { disabled_items.push_back(std::string("Delete")); } } + else if (outfits_id == mUUID) + { + getClipboardEntries(false, items, disabled_items, flags); + } + else if (!isCOFFolder()) + { + EMyOutfitsSubfolderType in_my_outfits = myoutfit_object_subfolder_type(model, mUUID, outfits_id); + if (in_my_outfits != MY_OUTFITS_NO) + { + // Either an outfit or a subfolder inside MY_OUTFITS + if (in_my_outfits == MY_OUTFITS_SUBFOLDER) + { + // Not inside an outfit, but inside 'my outfits' + items.push_back(std::string("New Outfit")); + items.push_back(std::string("New Outfit Folder")); + } + items.push_back(std::string("Rename")); + items.push_back(std::string("thumbnail")); + + addInventoryFavoritesMenuOptions(items); + addDeleteContextMenuOptions(items, disabled_items); + } + else + { + if (!isInboxFolder() // don't allow creation in inbox + && outfits_id != mUUID) + { + bool menu_items_added = false; + // Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694. + if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat)) + { + items.push_back(std::string("New Folder")); + menu_items_added = true; + } + if (!isMarketplaceListingsFolder()) + { + items.push_back(std::string("upload_options")); + items.push_back(std::string("upload_def")); + items.push_back(std::string("create_new")); + items.push_back(std::string("New Script")); + items.push_back(std::string("New Note")); + items.push_back(std::string("New Gesture")); + items.push_back(std::string("New Material")); + items.push_back(std::string("New Clothes")); + items.push_back(std::string("New Body Parts")); + items.push_back(std::string("New Settings")); + if (!LLEnvironment::instance().isInventoryEnabled()) + { + disabled_items.push_back("New Settings"); + } + } + else + { + items.push_back(std::string("New Listing Folder")); + } + if (menu_items_added) + { + items.push_back(std::string("Create Separator")); + } + } + getClipboardEntries(false, items, disabled_items, flags); + } + } } if (model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT) == mUUID) { items.push_back(std::string("Copy outfit list to clipboard")); + addInventoryFavoritesMenuOptions(items); + addOpenFolderMenuOptions(flags, items); } @@ -4468,6 +4731,14 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items { disabled_items.push_back(std::string("Delete System Folder")); } + else + { + static LLCachedControl<bool> show_copy_id(gSavedSettings, "InventoryExposeFolderID", false); + if (show_copy_id()) + { + items.push_back(std::string("Copy UUID")); + } + } if (isAgentInventory() && !isMarketplaceListingsFolder()) { @@ -4545,7 +4816,11 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags, menuentry_vec_t& if (((flags & ITEM_IN_MULTI_SELECTION) == 0) && hasChildren() && (type != LLFolderType::FT_OUTFIT)) { - items.push_back(std::string("Ungroup folder items")); + const LLUUID my_outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + if (!gInventory.isObjectDescendentOf(mUUID, my_outfits)) + { + items.push_back(std::string("Ungroup folder items")); + } } } else @@ -4652,6 +4927,18 @@ void LLFolderBridge::addOpenFolderMenuOptions(U32 flags, menuentry_vec_t& items) } } +void LLFolderBridge::addInventoryFavoritesMenuOptions(menuentry_vec_t& items) +{ + if (isFavorite()) + { + items.push_back(std::string("Remove from Favorites")); + } + else + { + items.push_back(std::string("Add to Favorites")); + } +} + bool LLFolderBridge::hasChildren() const { LLInventoryModel* model = getInventoryModel(); @@ -5318,13 +5605,23 @@ void LLFolderBridge::dropToMyOutfits(LLInventoryCategory* inv_cat, LLPointer<LLI // Note: creation will take time, so passing folder id to callback is slightly unreliable, // but so is collecting and passing descendants' ids inventory_func_type func = boost::bind(outfitFolderCreatedCallback, inv_cat->getUUID(), _1, cb, mInventoryPanel); - gInventory.createNewCategory(dest_id, + getInventoryModel()->createNewCategory(dest_id, LLFolderType::FT_OUTFIT, inv_cat->getName(), func, inv_cat->getThumbnailUUID()); } +void LLFolderBridge::dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest_id, LLPointer<LLInventoryCallback> cb) +{ + inventory_func_type func = boost::bind(outfitFolderCreatedCallback, inv_cat->getUUID(), _1, cb, mInventoryPanel); + getInventoryModel()->createNewCategory(dest_id, + LLFolderType::FT_OUTFIT, + inv_cat->getName(), + func, + inv_cat->getThumbnailUUID()); +} + void LLFolderBridge::outfitFolderCreatedCallback(LLUUID cat_source_id, LLUUID cat_dest_id, LLPointer<LLInventoryCallback> cb, @@ -5498,7 +5795,9 @@ bool LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, } else if (user_confirm && (move_is_into_current_outfit || move_is_into_outfit)) { - accept = can_move_to_outfit(inv_item, move_is_into_current_outfit); + EMyOutfitsSubfolderType res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); + // don't allow items in my outfits' subfodlers, only in outfits and outfit's subfolders + accept = res != MY_OUTFITS_SUBFOLDER && can_move_to_outfit(inv_item, move_is_into_current_outfit); } else if (user_confirm && (move_is_into_favorites || move_is_into_landmarks)) { @@ -5699,7 +5998,7 @@ bool LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, if (accept && drop) { LLUUID item_id = inv_item->getUUID(); - std::shared_ptr<LLMoveInv> move_inv (new LLMoveInv()); + std::shared_ptr<LLMoveInv> move_inv = std::make_shared<LLMoveInv>(); move_inv->mObjectID = inv_item->getParentUUID(); two_uuids_t item_pair(mUUID, item_id); move_inv->mMoveList.push_back(item_pair); @@ -6894,12 +7193,13 @@ void LLObjectBridge::performAction(LLInventoryModel* model, std::string action) item = (LLViewerInventoryItem*)gInventory.getItem(object_id); if(item && gInventory.isObjectDescendentOf(object_id, gInventory.getRootFolderID())) { - rez_attachment(item, NULL, true); // Replace if "Wear"ing. + static LLCachedControl<bool> replace_item(gSavedSettings, "InventoryAddAttachmentBehavior", false); + rez_attachment(item, NULL, ("attach" == action) ? replace_item() : true); // Replace if "Wear"ing. } else if(item && item->isFinished()) { // must be in library. copy it to our inventory and put it on. - LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(rez_attachment_cb, _1, (LLViewerJointAttachment*)0)); + LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(rez_attachment_cb, _1, (LLViewerJointAttachment*)0, true)); copy_inventory_item( gAgent.getID(), item->getPermissions().getOwner(), @@ -7540,6 +7840,15 @@ void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { items.push_back(std::string("Properties")); addDeleteContextMenuOptions(items, disabled_items); + + if (isFavorite()) + { + items.push_back(std::string("Remove from Favorites")); + } + else if (isAgentInventory()) + { + items.push_back(std::string("Add to Favorites")); + } } addLinkReplaceMenuOption(items, disabled_items); hide_context_entries(menu, items, disabled_items); @@ -7766,6 +8075,15 @@ void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { items.push_back(std::string("Find Original")); addDeleteContextMenuOptions(items, disabled_items); + + if (isFavorite()) + { + items.push_back(std::string("Remove from Favorites")); + } + else if (isAgentInventory()) + { + items.push_back(std::string("Add to Favorites")); + } } hide_context_entries(menu, items, disabled_items); } @@ -8024,7 +8342,8 @@ void LLObjectBridgeAction::attachOrDetach() } else { - LLAppearanceMgr::instance().wearItemOnAvatar(mUUID, true, false); // Don't replace if adding. + static LLCachedControl<bool> inventory_linking(gSavedSettings, "InventoryAddAttachmentBehavior", false); + LLAppearanceMgr::instance().wearItemOnAvatar(mUUID, true, inventory_linking()); // Don't replace if adding. } } @@ -8215,6 +8534,7 @@ void LLRecentItemsFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) buildContextMenuOptions(flags, items, disabled_items); items.erase(std::remove(items.begin(), items.end(), std::string("New Folder")), items.end()); + items.erase(std::remove(items.begin(), items.end(), std::string("New folder from selected")), items.end()); hide_context_entries(menu, items, disabled_items); } @@ -8249,6 +8569,51 @@ LLInvFVBridge* LLRecentInventoryBridgeBuilder::createBridge( return new_listener; } +/************************************************************************/ +/* Favorites Inventory Panel related classes */ +/************************************************************************/ +void LLFavoritesFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + // todo: consider things that should be disabled + menuentry_vec_t disabled_items, items; + buildContextMenuOptions(flags, items, disabled_items); + + items.erase(std::remove(items.begin(), items.end(), std::string("New Folder")), items.end()); + items.erase(std::remove(items.begin(), items.end(), std::string("New folder from selected")), items.end()); + + hide_context_entries(menu, items, disabled_items); +} + +LLInvFVBridge* LLFavoritesInventoryBridgeBuilder::createBridge( + LLAssetType::EType asset_type, + LLAssetType::EType actual_asset_type, + LLInventoryType::EType inv_type, + LLInventoryPanel* inventory, + LLFolderViewModelInventory* view_model, + LLFolderView* root, + const LLUUID& uuid, + U32 flags /*= 0x00*/) const +{ + LLInvFVBridge* new_listener = NULL; + if (asset_type == LLAssetType::AT_CATEGORY + && actual_asset_type != LLAssetType::AT_LINK_FOLDER) + { + new_listener = new LLFavoritesFolderBridge(inv_type, inventory, root, uuid); + } + else + { + new_listener = LLInventoryFolderViewModelBuilder::createBridge(asset_type, + actual_asset_type, + inv_type, + inventory, + view_model, + root, + uuid, + flags); + } + return new_listener; +} + LLFolderViewGroupedItemBridge::LLFolderViewGroupedItemBridge() { } @@ -8259,7 +8624,7 @@ void LLFolderViewGroupedItemBridge::groupFilterContextMenu(folder_view_item_dequ menuentry_vec_t disabled_items; if (get_selection_item_uuids(selected_items, ids)) { - if (!LLAppearanceMgr::instance().canAddWearables(ids) && canWearSelected(ids)) + if (!LLAppearanceMgr::instance().canAddWearables(ids, false) && canWearSelected(ids)) { disabled_items.push_back(std::string("Wearable And Object Wear")); disabled_items.push_back(std::string("Wearable Add")); diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 3e7f74384b..decb2c0528 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -86,6 +86,7 @@ public: //-------------------------------------------------------------------- virtual const LLUUID& getUUID() const { return mUUID; } virtual const LLUUID& getThumbnailUUID() const { return LLUUID::null; } + virtual bool isFavorite() const { return false; } virtual void clearDisplayName() { mDisplayName.clear(); } virtual void restoreItem() {} virtual void restoreToWorld() {} @@ -175,6 +176,7 @@ protected: bool isLinkedObjectMissing() const; // Is this a linked obj whose baseobj is not in inventory? bool isAgentInventory() const; // false if lost or in the inventory library + bool isAgentInventoryRoot() const; // true if worn by agent bool isCOFFolder() const; // true if COF or descendant of bool isInboxFolder() const; // true if COF or descendant of marketplace inbox @@ -237,7 +239,7 @@ public: const LLUUID& uuid) : LLInvFVBridge(inventory, root, uuid) {} - typedef boost::function<void(std::string& slurl)> slurl_callback_t; + typedef std::function<void(std::string& slurl)> slurl_callback_t; virtual void performAction(LLInventoryModel* model, std::string action); virtual void selectItem(); @@ -259,6 +261,7 @@ public: LLViewerInventoryItem* getItem() const; virtual const LLUUID& getThumbnailUUID() const; + virtual bool isFavorite() const; protected: bool confirmRemoveItem(const LLSD& notification, const LLSD& response); @@ -301,6 +304,7 @@ public: virtual std::string getLabelSuffix() const; virtual LLFontGL::StyleFlags getLabelStyle() const; virtual const LLUUID& getThumbnailUUID() const; + virtual bool isFavorite() const; void setShowDescendantsCount(bool show_count) {mShowDescendantsCount = show_count;} @@ -341,6 +345,7 @@ protected: void buildContextMenuOptions(U32 flags, menuentry_vec_t& items, menuentry_vec_t& disabled_items); void buildContextMenuFolderOptions(U32 flags, menuentry_vec_t& items, menuentry_vec_t& disabled_items); void addOpenFolderMenuOptions(U32 flags, menuentry_vec_t& items); + void addInventoryFavoritesMenuOptions(menuentry_vec_t& items); // Inventory favorites, not toolbar favorites //-------------------------------------------------------------------- // Menu callbacks @@ -369,6 +374,7 @@ protected: void dropToFavorites(LLInventoryItem* inv_item, LLPointer<LLInventoryCallback> cb = NULL); void dropToOutfit(LLInventoryItem* inv_item, bool move_is_into_current_outfit, LLPointer<LLInventoryCallback> cb = NULL); void dropToMyOutfits(LLInventoryCategory* inv_cat, LLPointer<LLInventoryCallback> cb = NULL); + void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest, LLPointer<LLInventoryCallback> cb = NULL); //-------------------------------------------------------------------- // Messy hacks for handling folder options @@ -754,6 +760,46 @@ public: }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Favorites Inventory Panel related classes +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +// Overridden version of the Inventory-Folder-View-Bridge for Folders +class LLFavoritesFolderBridge : public LLFolderBridge +{ + friend class LLInvFVBridgeAction; +public: + // Creates context menu for Folders related to Recent Inventory Panel. + // Uses base logic and than removes from visible items "New..." menu items. + LLFavoritesFolderBridge(LLInventoryType::EType type, + LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid) : + LLFolderBridge(inventory, root, uuid) + { + mInvType = type; + } + /*virtual*/ void buildContextMenu(LLMenuGL& menu, U32 flags); + /*virtual*/ bool canSortContent() const { return true; } +}; + +// Bridge builder to create Inventory-Folder-View-Bridge for Recent Inventory Panel +class LLFavoritesInventoryBridgeBuilder : public LLInventoryFolderViewModelBuilder +{ +public: + LLFavoritesInventoryBridgeBuilder() {} + // Overrides FolderBridge for Recent Inventory Panel. + // It use base functionality for bridges other than FolderBridge. + virtual LLInvFVBridge* createBridge(LLAssetType::EType asset_type, + LLAssetType::EType actual_asset_type, + LLInventoryType::EType inv_type, + LLInventoryPanel* inventory, + LLFolderViewModelInventory* view_model, + LLFolderView* root, + const LLUUID& uuid, + U32 flags = 0x00) const; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Marketplace Inventory Panel related classes //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -780,14 +826,14 @@ private: void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attachment, - bool replace = false); + bool replace); // Move items from an in-world object's "Contents" folder to a specified // folder in agent inventory. bool move_inv_category_world_to_agent(const LLUUID& object_id, const LLUUID& category_id, bool drop, - std::function<void(S32, void*, const LLMoveInv *)> callback = NULL, + std::function<void(S32, void*, const LLMoveInv *)> callback = nullptr, void* user_data = NULL, LLInventoryFilter* filter = NULL); diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 5c0905af3c..99c2d6e410 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -64,6 +64,7 @@ LLInventoryFilter::FilterOps::FilterOps(const Params& p) mFilterUUID(p.uuid), mFilterLinks(p.links), mFilterThumbnails(p.thumbnails), + mFilterFavorites(p.favorites), mSearchVisibility(p.search_visibility) { } @@ -159,6 +160,7 @@ bool LLInventoryFilter::check(const LLFolderViewModelItem* item) passed = passed && checkAgainstCreator(listener); passed = passed && checkAgainstSearchVisibility(listener); + passed = passed && checkAgainstFilterFavorites(listener->getUUID()); passed = passed && checkAgainstFilterThumbnails(listener->getUUID()); return passed; @@ -221,6 +223,19 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const return false; } + const LLViewerInventoryCategory* cat = gInventory.getCategory(folder_id); + if (cat && cat->getIsFavorite()) + { + if (mFilterOps.mFilterFavorites == FILTER_ONLY_FAVORITES) + { + return true; + } + if (mFilterOps.mFilterFavorites == FILTER_EXCLUDE_FAVORITES) + { + return false; + } + } + // Marketplace folder filtering const U32 filterTypes = mFilterOps.mFilterTypes; const U32 marketplace_filter = FILTERTYPE_MARKETPLACE_ACTIVE | FILTERTYPE_MARKETPLACE_INACTIVE | @@ -273,6 +288,16 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const } } + if (filterTypes & FILTERTYPE_NO_TRASH_ITEMS) + { + const LLUUID trash_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); + // If not a descendant of the marketplace listings root, then the nesting depth is -1 by definition + if (gInventory.isObjectDescendentOf(folder_id, trash_uuid)) + { + return false; + } + } + // show folder links LLViewerInventoryItem* item = gInventory.getItem(folder_id); if (item && item->getActualType() == LLAssetType::AT_LINK_FOLDER) @@ -611,6 +636,24 @@ bool LLInventoryFilter::checkAgainstFilterThumbnails(const LLUUID& object_id) co return true; } +bool LLInventoryFilter::checkAgainstFilterFavorites(const LLUUID& object_id) const +{ + const LLInventoryObject* object = gInventory.getObject(object_id); + if (!object) return true; + + + if (mFilterOps.mFilterFavorites != FILTER_INCLUDE_FAVORITES) + { + bool is_favorite = get_is_favorite(object); + if (is_favorite && (mFilterOps.mFilterFavorites == FILTER_EXCLUDE_FAVORITES)) + return false; + if (!is_favorite && (mFilterOps.mFilterFavorites == FILTER_ONLY_FAVORITES)) + return false; + } + + return true; +} + bool LLInventoryFilter::checkAgainstCreator(const LLFolderViewModelItemInventory* listener) const { if (!listener) @@ -811,6 +854,32 @@ void LLInventoryFilter::setFilterThumbnails(U64 filter_thumbnails) mFilterOps.mFilterThumbnails = filter_thumbnails; } +void LLInventoryFilter::setFilterFavorites(U64 filter_favorites) +{ + if (mFilterOps.mFilterFavorites != filter_favorites) + { + if (mFilterOps.mFilterFavorites == FILTER_EXCLUDE_FAVORITES + && filter_favorites == FILTER_ONLY_FAVORITES) + { + setModified(FILTER_RESTART); + } + else if (mFilterOps.mFilterFavorites == FILTER_ONLY_FAVORITES + && filter_favorites == FILTER_EXCLUDE_FAVORITES) + { + setModified(FILTER_RESTART); + } + else if (mFilterOps.mFilterFavorites == FILTER_INCLUDE_FAVORITES) + { + setModified(FILTER_MORE_RESTRICTIVE); + } + else + { + setModified(FILTER_LESS_RESTRICTIVE); + } + } + mFilterOps.mFilterFavorites = filter_favorites; +} + void LLInventoryFilter::setFilterEmptySystemFolders() { mFilterOps.mFilterTypes |= FILTERTYPE_EMPTYFOLDERS; @@ -923,6 +992,11 @@ void LLInventoryFilter::toggleSearchVisibilityLibrary() } } +void LLInventoryFilter::setFilterNoTrashFolder() +{ + mFilterOps.mFilterTypes |= FILTERTYPE_NO_TRASH_ITEMS; +} + void LLInventoryFilter::setFilterNoMarketplaceFolder() { mFilterOps.mFilterTypes |= FILTERTYPE_NO_MARKETPLACE_ITEMS; @@ -959,7 +1033,7 @@ void LLInventoryFilter::setFilterSubString(const std::string& string) boost::char_separator<char> sep("+"); tokenizer tokens(filter_sub_string_new, sep); - for (auto token_iter : tokens) + for (const auto& token_iter : tokens) { mFilterTokens.push_back(token_iter); } @@ -1025,7 +1099,7 @@ void LLInventoryFilter::setFilterSubString(const std::string& string) } // Cancel out UUID once the search string is modified - if (mFilterOps.mFilterTypes == FILTERTYPE_UUID) + if (mFilterOps.mFilterTypes & FILTERTYPE_UUID) { mFilterOps.mFilterTypes &= ~FILTERTYPE_UUID; mFilterOps.mFilterUUID = LLUUID::null; @@ -1615,6 +1689,11 @@ U64 LLInventoryFilter::getFilterThumbnails() const return mFilterOps.mFilterThumbnails; } +U64 LLInventoryFilter::getFilterFavorites() const +{ + return mFilterOps.mFilterFavorites; +} + bool LLInventoryFilter::hasFilterString() const { return mFilterSubString.size() > 0; @@ -1707,7 +1786,7 @@ std::string LLInventoryFilter::getEmptyLookupMessage(bool is_empty_folder) const } } -bool LLInventoryFilter::areDateLimitsSet() +bool LLInventoryFilter::areDateLimitsSet() const { return mFilterOps.mMinDate != time_min() || mFilterOps.mMaxDate != time_max() diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index 7e64a03e73..c0164e04e4 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -61,6 +61,7 @@ public: FILTERTYPE_NO_MARKETPLACE_ITEMS = 0x1 << 10, // pass iff folder is not under the marketplace FILTERTYPE_WORN = 0x1 << 11, // pass if item is worn FILTERTYPE_SETTINGS = 0x1 << 12, // pass if the item is a settings object + FILTERTYPE_NO_TRASH_ITEMS = 0x1 << 13, // pass iff folder is not under the marketplace }; enum EFilterDateDirection @@ -83,6 +84,13 @@ public: FILTER_ONLY_THUMBNAILS }; + enum EFilterFavorite + { + FILTER_INCLUDE_FAVORITES, + FILTER_EXCLUDE_FAVORITES, + FILTER_ONLY_FAVORITES + }; + enum ESortOrderType { SO_NAME = 0, // Sort inventory by name @@ -149,6 +157,7 @@ public: Optional<PermissionMask> permissions; Optional<EFilterCreatorType> creator_type; Optional<EFilterThumbnail> thumbnails; + Optional<EFilterFavorite> favorites; Params() : types("filter_types", FILTERTYPE_OBJECT), @@ -156,6 +165,7 @@ public: wearable_types("wearable_types", 0xffffFFFFffffFFFFULL), settings_types("settings_types", 0xffffFFFFffffFFFFULL), thumbnails("thumbnails", FILTER_INCLUDE_THUMBNAILS), + favorites("favorites", FILTER_INCLUDE_FAVORITES), category_types("category_types", 0xffffFFFFffffFFFFULL), links("links", FILTERLINK_INCLUDE_LINKS), search_visibility("search_visibility", 0xFFFFFFFF), @@ -177,6 +187,7 @@ public: mFilterWearableTypes, mFilterSettingsTypes, // for _SETTINGS mFilterThumbnails, + mFilterFavorites, mFilterLinks, mFilterCategoryTypes; // For _CATEGORY LLUUID mFilterUUID; // for UUID @@ -220,6 +231,7 @@ public: U64 getFilterSettingsTypes() const; U64 getSearchVisibilityTypes() const; U64 getFilterThumbnails() const; + U64 getFilterFavorites() const; bool isFilterObjectTypesWith(LLInventoryType::EType t) const; void setFilterObjectTypes(U64 types); @@ -233,8 +245,10 @@ public: void setFilterMarketplaceInactiveFolders(); void setFilterMarketplaceUnassociatedFolders(); void setFilterMarketplaceListingFolders(bool select_only_listing_folders); + void setFilterNoTrashFolder(); void setFilterNoMarketplaceFolder(); void setFilterThumbnails(U64 filter_thumbnails); + void setFilterFavorites(U64 filter_favorites); void updateFilterTypes(U64 types, U64& current_types); void setSearchType(ESearchType type); ESearchType getSearchType() { return mSearchType; } @@ -339,9 +353,10 @@ public: LLInventoryFilter& operator =(const LLInventoryFilter& other); bool checkAgainstFilterThumbnails(const LLUUID& object_id) const; + bool checkAgainstFilterFavorites(const LLUUID& object_id) const; private: - bool areDateLimitsSet(); + bool areDateLimitsSet() const; bool checkAgainstFilterSubString(const std::string& desc) const; bool checkAgainstFilterType(const class LLFolderViewModelItemInventory* listener) const; bool checkAgainstFilterType(const LLInventoryItem* item) const; diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 1ccefa3212..3cc57e851f 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -51,6 +51,7 @@ #include "lldirpicker.h" #include "lldonotdisturbnotificationstorage.h" #include "llfloatermarketplacelistings.h" +#include "llfloatermodelpreview.h" #include "llfloatersidepanelcontainer.h" #include "llfocusmgr.h" #include "llfolderview.h" @@ -62,6 +63,7 @@ #include "llinventorymodel.h" #include "llinventorypanel.h" #include "lllineeditor.h" +#include "llmaterialeditor.h" #include "llmarketplacenotifications.h" #include "llmarketplacefunctions.h" #include "llmenugl.h" @@ -86,6 +88,7 @@ #include "llviewermessage.h" #include "llviewerfoldertype.h" #include "llviewerobjectlist.h" +#include "llviewermenufile.h" #include "llviewerregion.h" #include "llviewerwindow.h" #include "llvoavatarself.h" @@ -438,7 +441,13 @@ void copy_inventory_category(LLInventoryModel* model, { copy_inventory_category_content(new_id, model, cat, root_copy_id, move_no_copy_items); }; - gInventory.createNewCategory(parent_id, LLFolderType::FT_NONE, cat->getName(), func, cat->getThumbnailUUID()); + LLFolderType::EType type = LLFolderType::FT_NONE; + if (cat->getPreferredType() == LLFolderType::FT_OUTFIT) + { + // at the moment only permitting copy of outfits and normal folders + type = LLFolderType::FT_OUTFIT; + } + gInventory.createNewCategory(parent_id, type, cat->getName(), func, cat->getThumbnailUUID()); } void copy_inventory_category(LLInventoryModel* model, @@ -460,6 +469,25 @@ void copy_inventory_category(LLInventoryModel* model, gInventory.createNewCategory(parent_id, LLFolderType::FT_NONE, cat->getName(), func, cat->getThumbnailUUID()); } +void copy_inventory_category(LLInventoryModel* model, + LLViewerInventoryCategory* cat, + const LLUUID& parent_id, + const LLUUID& root_copy_id, + bool move_no_copy_items, + LLPointer<LLInventoryCallback> callback) +{ + // Create the initial folder + inventory_func_type func = [model, cat, root_copy_id, move_no_copy_items, callback](const LLUUID& new_id) + { + copy_inventory_category_content(new_id, model, cat, root_copy_id, move_no_copy_items); + if (callback) + { + callback.get()->fire(new_id); + } + }; + gInventory.createNewCategory(parent_id, LLFolderType::FT_NONE, cat->getName(), func, cat->getThumbnailUUID()); +} + void copy_cb(const LLUUID& dest_folder, const LLUUID& root_id) { // Decrement the count in root_id since that one item won't be copied over @@ -1730,7 +1758,7 @@ bool sort_alpha(const LLViewerInventoryCategory* cat1, const LLViewerInventoryCa // The only inventory changes that are done is to move and sort folders containing no-copy items to stock folders. // @pending_callbacks - how many callbacks we are waiting for, must be inited before use // @result - true if things validate, false if issues are raised, must be inited before use -typedef boost::function<void(S32 pending_callbacks, bool result)> validation_result_callback_t; +typedef std::function<void(S32 pending_callbacks, bool result)> validation_result_callback_t; void validate_marketplacelistings( LLInventoryCategory* cat, validation_result_callback_t cb_result, @@ -2147,21 +2175,10 @@ void validate_marketplacelistings( void change_item_parent(const LLUUID& item_id, const LLUUID& new_parent_id) { - LLInventoryItem* inv_item = gInventory.getItem(item_id); + LLViewerInventoryItem* inv_item = gInventory.getItem(item_id); if (inv_item) { - LLInventoryModel::update_list_t update; - LLInventoryModel::LLCategoryUpdate old_folder(inv_item->getParentUUID(), -1); - update.push_back(old_folder); - LLInventoryModel::LLCategoryUpdate new_folder(new_parent_id, 1); - update.push_back(new_folder); - gInventory.accountForUpdate(update); - - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(inv_item); - new_item->setParent(new_parent_id); - new_item->updateParentOnServer(false); - gInventory.updateItem(new_item); - gInventory.notifyObservers(); + gInventory.changeItemParent(inv_item, new_parent_id, false); } } @@ -2169,17 +2186,17 @@ void move_items_to_folder(const LLUUID& new_cat_uuid, const uuid_vec_t& selected { for (uuid_vec_t::const_iterator it = selected_uuids.begin(); it != selected_uuids.end(); ++it) { - LLInventoryItem* inv_item = gInventory.getItem(*it); + LLViewerInventoryItem* inv_item = gInventory.getItem(*it); if (inv_item) { - change_item_parent(*it, new_cat_uuid); + gInventory.changeItemParent(inv_item, new_cat_uuid, false); } else { - LLInventoryCategory* inv_cat = gInventory.getCategory(*it); + LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it); if (inv_cat && !LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType())) { - gInventory.changeCategoryParent((LLViewerInventoryCategory*)inv_cat, new_cat_uuid, false); + gInventory.changeCategoryParent(inv_cat, new_cat_uuid, false); } } } @@ -2314,7 +2331,7 @@ bool can_move_to_landmarks(LLInventoryItem* inv_item) } // Returns true if folder's content can be moved to Current Outfit or any outfit folder. -bool can_move_to_my_outfits(LLInventoryModel* model, LLInventoryCategory* inv_cat, U32 wear_limit) +bool can_move_to_my_outfits_as_outfit(LLInventoryModel* model, LLInventoryCategory* inv_cat, U32 wear_limit) { LLInventoryModel::cat_array_t *cats; LLInventoryModel::item_array_t *items; @@ -2325,9 +2342,9 @@ bool can_move_to_my_outfits(LLInventoryModel* model, LLInventoryCategory* inv_ca return false; } - if (items->size() == 0) + if (items->size() == 0 && inv_cat->getPreferredType() != LLFolderType::FT_OUTFIT) { - // Nothing to move(create) + // Nothing to create an outfit folder from return false; } @@ -2353,6 +2370,51 @@ bool can_move_to_my_outfits(LLInventoryModel* model, LLInventoryCategory* inv_ca return true; } +bool can_move_to_my_outfits_as_subfolder(LLInventoryModel* model, LLInventoryCategory* inv_cat, S32 depth) +{ + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + model->getDirectDescendentsOf(inv_cat->getUUID(), cats, items); + + if (items->size() > 0) + { + // subfolders don't allow items + return false; + } + + if (inv_cat->getPreferredType() != LLFolderType::FT_NONE) + { + // only normal folders can become subfodlers + return false; + } + + constexpr size_t MAX_CONTENT = 255; + if (cats->size() > MAX_CONTENT) + { + // don't allow massive folders + return false; + } + + for (LLPointer<LLViewerInventoryCategory>& cat : *cats) + { + // outfits are valid to move, check non-outfit folders + if (cat->getPreferredType() != LLFolderType::FT_OUTFIT) + { + if (depth == 3) + { + // don't allow massive folders + return false; + } + if (!can_move_to_my_outfits_as_subfolder(model, cat, depth + 1)) + { + return false; + } + } + } + + return true; +} + std::string get_localized_folder_name(LLUUID cat_uuid) { std::string localized_root_name; @@ -2418,6 +2480,143 @@ void ungroup_folder_items(const LLUUID& folder_id) gInventory.notifyObservers(); } +class LLUpdateFavorite : public LLInventoryCallback +{ +public: + LLUpdateFavorite(const LLUUID& inv_item_id) + : mInvItemID(inv_item_id) + {} + /* virtual */ void fire(const LLUUID& inv_item_id) override + { + gInventory.addChangedMask(LLInventoryObserver::UPDATE_FAVORITE, mInvItemID); + + LLInventoryModel::item_array_t items; + LLInventoryModel::cat_array_t cat_array; + LLLinkedItemIDMatches matches(mInvItemID); + gInventory.collectDescendentsIf(gInventory.getRootFolderID(), + cat_array, + items, + LLInventoryModel::INCLUDE_TRASH, + matches); + + std::set<LLUUID> link_ids; + for (LLInventoryModel::item_array_t::iterator it = items.begin(); it != items.end(); ++it) + { + LLPointer<LLViewerInventoryItem> item = *it; + + gInventory.addChangedMask(LLInventoryObserver::UPDATE_FAVORITE, item->getUUID()); + } + + gInventory.notifyObservers(); + } +private: + LLUUID mInvItemID; +}; + +void favorite_send(LLInventoryObject* obj, const LLUUID& obj_id, bool favorite) +{ + LLSD updates; + if (favorite) + { + updates["favorite"] = LLSD().with("toggled", true); + } + else + { + updates["favorite"] = LLSD(); + } + + LLPointer<LLInventoryCallback> cb = new LLUpdateFavorite(obj_id); + + LLViewerInventoryCategory* view_folder = dynamic_cast<LLViewerInventoryCategory*>(obj); + if (view_folder) + { + update_inventory_category(obj_id, updates, cb); + } + LLViewerInventoryItem* view_item = dynamic_cast<LLViewerInventoryItem*>(obj); + if (view_item) + { + update_inventory_item(obj_id, updates, cb); + } +} + +bool get_is_favorite(const LLInventoryObject* object) +{ + if (object->getIsLinkType()) + { + LLInventoryObject* obj = gInventory.getObject(object->getLinkedUUID()); + return obj && obj->getIsFavorite(); + } + + return object->getIsFavorite(); +} + +bool get_is_favorite(const LLUUID& obj_id) +{ + LLInventoryObject* object = gInventory.getObject(obj_id); + if (object && object->getIsLinkType()) + { + LLInventoryObject* obj = gInventory.getObject(object->getLinkedUUID()); + return obj && obj->getIsFavorite(); + } + + return object->getIsFavorite(); +} + +void set_favorite(const LLUUID& obj_id, bool favorite) +{ + LLInventoryObject* obj = gInventory.getObject(obj_id); + + if (obj && obj->getIsLinkType()) + { + if (!favorite && obj->getIsFavorite()) + { + // Links currently aren't supposed to be favorites, + // instead should show state of the original + LL_INFOS("Inventory") << "Recovering proper 'favorites' state of a link " << obj_id << LL_ENDL; + favorite_send(obj, obj_id, false); + } + obj = gInventory.getObject(obj->getLinkedUUID()); + } + + if (obj && obj->getIsFavorite() != favorite) + { + favorite_send(obj, obj->getUUID(), favorite); + } +} + +void toggle_favorite(const LLUUID& obj_id) +{ + LLInventoryObject* obj = gInventory.getObject(obj_id); + if (obj && obj->getIsLinkType()) + { + obj = gInventory.getObject(obj->getLinkedUUID()); + } + + if (obj) + { + favorite_send(obj, obj->getUUID(), !obj->getIsFavorite()); + } +} + +void toggle_favorites(const uuid_vec_t& ids) +{ + if (ids.size() == 0) + { + return; + } + if (ids.size() == 1) + { + toggle_favorite(ids[0]); + return; + } + + bool new_val = !get_is_favorite(ids.front()); + for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it) + { + set_favorite(*it, new_val); + } +} + std::string get_searchable_description(LLInventoryModel* model, const LLUUID& item_id) { if (model) @@ -2493,6 +2692,40 @@ bool can_share_item(const LLUUID& item_id) return can_share; } + +EMyOutfitsSubfolderType myoutfit_object_subfolder_type( + LLInventoryModel* model, + const LLUUID& obj_id, + const LLUUID& my_outfits_id) +{ + if (obj_id == my_outfits_id) return MY_OUTFITS_NO; + + const LLViewerInventoryCategory* test_cat = model->getCategory(obj_id); + if (test_cat->getPreferredType() == LLFolderType::FT_OUTFIT) + { + return MY_OUTFITS_OUTFIT; + } + while (test_cat) + { + if (test_cat->getPreferredType() == LLFolderType::FT_OUTFIT) + { + return MY_OUTFITS_SUBOUTFIT; + } + + const LLUUID& parent_id = test_cat->getParentUUID(); + if (parent_id.isNull()) + { + return MY_OUTFITS_NO; + } + if (parent_id == my_outfits_id) + { + return MY_OUTFITS_SUBFOLDER; + } + test_cat = model->getCategory(parent_id); + } + + return MY_OUTFITS_NO; +} ///---------------------------------------------------------------------------- /// LLMarketplaceValidator implementations ///---------------------------------------------------------------------------- @@ -2621,6 +2854,11 @@ bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(const LLInventoryIte return false; } +bool LLIsFolderType::operator()(LLInventoryCategory* cat, LLInventoryItem* item) +{ + return cat && cat->getPreferredType() == mType; +} + bool LLIsType::operator()(LLInventoryCategory* cat, LLInventoryItem* item) { if(mType == LLAssetType::AT_CATEGORY) @@ -2713,6 +2951,20 @@ bool LLIsTypeWithPermissions::operator()(LLInventoryCategory* cat, LLInventoryIt return false; } +bool LLFavoritesCollector::operator()(LLInventoryCategory* cat, + LLInventoryItem* item) +{ + if (item && item->getIsFavorite()) + { + return true; + } + if (cat && cat->getIsFavorite()) + { + return true; + } + return false; +} + bool LLBuddyCollector::operator()(LLInventoryCategory* cat, LLInventoryItem* item) { @@ -3197,7 +3449,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root for (LLInventoryModel::item_array_t::value_type& item : items) { - if (get_is_item_worn(item)) + if (!item->getIsLinkType() && get_is_item_worn(item)) { has_worn = true; LLWearableType::EType type = item->getWearableType(); @@ -3217,7 +3469,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root } } LLViewerInventoryItem* item = gInventory.getItem(obj_id); - if (item && get_is_item_worn(item)) + if (item && !item->getIsLinkType() && get_is_item_worn(item)) { has_worn = true; LLWearableType::EType type = item->getWearableType(); @@ -3423,7 +3675,6 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root } else if ("new_folder_from_selected" == action) { - LLInventoryObject* first_item = gInventory.getObject(*ids.begin()); if (!first_item) { @@ -3467,6 +3718,20 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root ungroup_folder_items(*ids.begin()); } } + else if ("add_to_favorites" == action) + { + for (const LLUUID& id : ids) + { + set_favorite(id, true); + } + } + else if ("remove_from_favorites" == action) + { + for (const LLUUID& id : ids) + { + set_favorite(id, false); + } + } else if ("thumbnail" == action) { if (selected_items.size() > 0) @@ -3577,6 +3842,79 @@ void LLInventoryAction::removeItemFromDND(LLFolderView* root) } } +void LLInventoryAction::fileUploadLocation(const LLUUID& dest_id, const std::string& action) +{ + if (action == "def_model") + { + gSavedPerAccountSettings.setString("ModelUploadFolder", dest_id.asString()); + } + else if (action == "def_texture") + { + gSavedPerAccountSettings.setString("TextureUploadFolder", dest_id.asString()); + } + else if (action == "def_sound") + { + gSavedPerAccountSettings.setString("SoundUploadFolder", dest_id.asString()); + } + else if (action == "def_animation") + { + gSavedPerAccountSettings.setString("AnimationUploadFolder", dest_id.asString()); + } + else if (action == "def_pbr_material") + { + gSavedPerAccountSettings.setString("PBRUploadFolder", dest_id.asString()); + } + else if (action == "upload_texture") + { + LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2, dest_id), LLFilePicker::FFLOAD_IMAGE, false); + } + else if (action == "upload_sound") + { + LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2, dest_id), LLFilePicker::FFLOAD_WAV, false); + } + else if (action == "upload_animation") + { + LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2, dest_id), LLFilePicker::FFLOAD_ANIM, false); + } + else if (action == "upload_model") + { + LLFloaterModelPreview::showModelPreview(dest_id); + } + else if (action == "upload_pbr_material") + { + LLMaterialEditor::importMaterial(dest_id); + } + else if (action == "upload_bulk") + { + LLFilePickerReplyThread::startPicker(boost::bind(&upload_bulk, _1, _2, true, dest_id), LLFilePicker::FFLOAD_ALL, true); + } +} + +bool LLInventoryAction::isFileUploadLocation(const LLUUID& dest_id, const std::string& action) +{ + if (action == "def_model") + { + return gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_OBJECT) == dest_id; + } + else if (action == "def_texture") + { + return gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE) == dest_id; + } + else if (action == "def_sound") + { + return gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_SOUND) == dest_id; + } + else if (action == "def_animation") + { + return gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_ANIMATION) == dest_id; + } + else if (action == "def_pbr_material") + { + return gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_MATERIAL) == dest_id; + } + return false; +} + void LLInventoryAction::onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLHandle<LLFolderView> root) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); @@ -3685,15 +4023,17 @@ void LLInventoryAction::buildMarketplaceFolders(LLFolderView* root) for (; set_iter != selected_items.end(); ++set_iter) { viewModel = dynamic_cast<LLFolderViewModelItemInventory *>((*set_iter)->getViewModelItem()); - if (!viewModel || !viewModel->getInventoryObject()) continue; - if (gInventory.isObjectDescendentOf(viewModel->getInventoryObject()->getParentUUID(), marketplacelistings_id)) + if (!viewModel) continue; + LLInventoryObject* inv_obj = viewModel->getInventoryObject(); + if (!inv_obj) continue; + if (gInventory.isObjectDescendentOf(inv_obj->getParentUUID(), marketplacelistings_id)) { - const LLUUID &parent_id = viewModel->getInventoryObject()->getParentUUID(); + const LLUUID &parent_id = inv_obj->getParentUUID(); if (parent_id != marketplacelistings_id) { sMarketplaceFolders.push_back(parent_id); } - const LLUUID &curr_id = viewModel->getInventoryObject()->getUUID(); + const LLUUID &curr_id = inv_obj->getUUID(); if (curr_id != marketplacelistings_id) { sMarketplaceFolders.push_back(curr_id); diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index 13a64f21dc..eba67be313 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -78,6 +78,7 @@ void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::s void copy_inventory_category(LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& parent_id, const LLUUID& root_copy_id = LLUUID::null, bool move_no_copy_items = false); void copy_inventory_category(LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& parent_id, const LLUUID& root_copy_id, bool move_no_copy_items, inventory_func_type callback); +void copy_inventory_category(LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& parent_id, const LLUUID& root_copy_id, bool move_no_copy_items, LLPointer<LLInventoryCallback> callback); void copy_inventory_category_content(const LLUUID& new_cat_uuid, LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& root_copy_id, bool move_no_copy_items); @@ -112,15 +113,33 @@ std::string get_category_path(LLUUID cat_id); bool can_move_to_outfit(LLInventoryItem* inv_item, bool move_is_into_current_outfit); bool can_move_to_landmarks(LLInventoryItem* inv_item); -bool can_move_to_my_outfits(LLInventoryModel* model, LLInventoryCategory* inv_cat, U32 wear_limit); +bool can_move_to_my_outfits_as_outfit(LLInventoryModel* model, LLInventoryCategory* inv_cat, U32 wear_limit); +bool can_move_to_my_outfits_as_subfolder(LLInventoryModel* model, LLInventoryCategory* inv_cat, S32 depth = 0); std::string get_localized_folder_name(LLUUID cat_uuid); void new_folder_window(const LLUUID& folder_id); void ungroup_folder_items(const LLUUID& folder_id); +bool get_is_favorite(const LLInventoryObject* object); +bool get_is_favorite(const LLUUID& obj_id); +void set_favorite(const LLUUID& obj_id, bool favorite); +void toggle_favorite(const LLUUID& obj_id); +void toggle_favorites(const uuid_vec_t& ids); std::string get_searchable_description(LLInventoryModel* model, const LLUUID& item_id); std::string get_searchable_creator_name(LLInventoryModel* model, const LLUUID& item_id); std::string get_searchable_UUID(LLInventoryModel* model, const LLUUID& item_id); bool can_share_item(const LLUUID& item_id); +enum EMyOutfitsSubfolderType +{ + MY_OUTFITS_NO, + MY_OUTFITS_SUBFOLDER, + MY_OUTFITS_OUTFIT, + MY_OUTFITS_SUBOUTFIT, +}; +EMyOutfitsSubfolderType myoutfit_object_subfolder_type( + LLInventoryModel* model, + const LLUUID& obj_id, + const LLUUID& my_outfits_id); + /** Miscellaneous global functions ** ** *******************************************************************************/ @@ -132,13 +151,13 @@ class LLMarketplaceValidator: public LLSingleton<LLMarketplaceValidator> LOG_CLASS(LLMarketplaceValidator); public: - typedef boost::function<void(std::string& validation_message, S32 depth, LLError::ELevel log_level)> validation_msg_callback_t; - typedef boost::function<void(bool result)> validation_done_callback_t; + typedef std::function<void(std::string& validation_message, S32 depth, LLError::ELevel log_level)> validation_msg_callback_t; + typedef std::function<void(bool result)> validation_done_callback_t; void validateMarketplaceListings( const LLUUID &category_id, - validation_done_callback_t cb_done = NULL, - validation_msg_callback_t cb_msg = NULL, + validation_done_callback_t cb_done = nullptr, + validation_msg_callback_t cb_msg = nullptr, bool fix_hierarchy = true, S32 depth = -1); @@ -187,7 +206,9 @@ class LLInventoryCollectFunctor { public: virtual ~LLInventoryCollectFunctor(){}; - virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) = 0; + virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) = 0; + + virtual bool exceedsLimit() { return false; } static bool itemTransferCommonlyAllowed(const LLInventoryItem* item); }; @@ -234,6 +255,24 @@ protected: // the type is the type passed in during construction. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLIsFolderType : public LLInventoryCollectFunctor +{ +public: + LLIsFolderType(LLFolderType::EType type) : mType(type) {} + virtual ~LLIsFolderType() {} + virtual bool operator()(LLInventoryCategory* cat, + LLInventoryItem* item); +protected: + LLFolderType::EType mType; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLIsType +// +// Implementation of a LLInventoryCollectFunctor which returns true if +// the type is the type passed in during construction. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + class LLIsType : public LLInventoryCollectFunctor { public: @@ -344,6 +383,18 @@ protected: }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLFavoritesCollector +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLFavoritesCollector : public LLInventoryCollectFunctor +{ +public: + LLFavoritesCollector() {} + virtual ~LLFavoritesCollector() {} + virtual bool operator()(LLInventoryCategory* cat, + LLInventoryItem* item); +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLBuddyCollector // // Simple class that collects calling cards that are not null, and not @@ -601,6 +652,8 @@ struct LLInventoryAction static void callback_copySelected(const LLSD& notification, const LLSD& response, class LLInventoryModel* model, class LLFolderView* root, const std::string& action); static void onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLHandle<LLFolderView> root); static void removeItemFromDND(LLFolderView* root); + static void fileUploadLocation(const LLUUID& dest_id, const std::string& action); + static bool isFileUploadLocation(const LLUUID& dest_id, const std::string& action); static void saveMultipleTextures(const std::vector<std::string>& filenames, std::set<LLFolderViewItem*> selected_items, LLInventoryModel* model); diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index c4f93cee98..f77088e0b1 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -60,10 +60,12 @@ static LLPanelInjector<LLInventoryGallery> t_inventory_gallery("inventory_galler const S32 GALLERY_ITEMS_PER_ROW_MIN = 2; const S32 FAST_LOAD_THUMBNAIL_TRSHOLD = 50; // load folders below this value immediately + // Helper dnd functions bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, bool drop, std::string& tooltip_msg, bool is_link); bool dragItemIntoFolder(LLUUID folder_id, LLInventoryItem* inv_item, bool drop, std::string& tooltip_msg, bool user_confirm); void dropToMyOutfits(LLInventoryCategory* inv_cat); +void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest_id); class LLGalleryPanel: public LLPanel { @@ -634,7 +636,7 @@ void LLInventoryGallery::removeFromLastRow(LLInventoryGalleryItem* item) mItemPanels.pop_back(); } -LLInventoryGalleryItem* LLInventoryGallery::buildGalleryItem(std::string name, LLUUID item_id, LLAssetType::EType type, LLUUID thumbnail_id, LLInventoryType::EType inventory_type, U32 flags, time_t creation_date, bool is_link, bool is_worn) +LLInventoryGalleryItem* LLInventoryGallery::buildGalleryItem(std::string name, LLUUID item_id, LLAssetType::EType type, LLUUID thumbnail_id, LLInventoryType::EType inventory_type, U32 flags, time_t creation_date, bool is_link, bool is_worn, bool is_favorite) { LLInventoryGalleryItem::Params giparams; giparams.visible = true; @@ -645,6 +647,7 @@ LLInventoryGalleryItem* LLInventoryGallery::buildGalleryItem(std::string name, L gitem->setUUID(item_id); gitem->setGallery(this); gitem->setType(type, inventory_type, flags, is_link); + gitem->setFavorite(is_favorite); gitem->setLoadImmediately(mLoadThumbnailsImmediately); gitem->setThumbnail(thumbnail_id); gitem->setWorn(is_worn); @@ -937,8 +940,19 @@ bool LLInventoryGallery::updateAddedItem(LLUUID item_id) } bool res = false; + bool is_favorite = get_is_favorite(obj); - LLInventoryGalleryItem* item = buildGalleryItem(name, item_id, obj->getType(), thumbnail_id, inventory_type, misc_flags, obj->getCreationDate(), obj->getIsLinkType(), is_worn); + LLInventoryGalleryItem* item = buildGalleryItem( + name, + item_id, + obj->getType(), + thumbnail_id, + inventory_type, + misc_flags, + obj->getCreationDate(), + obj->getIsLinkType(), + is_worn, + is_favorite); mItemMap.insert(LLInventoryGallery::gallery_item_map_t::value_type(item_id, item)); if (mGalleryCreated) { @@ -975,7 +989,7 @@ void LLInventoryGallery::updateRemovedItem(LLUUID item_id) mItemBuildQuery.erase(item_id); } -void LLInventoryGallery::updateChangedItemName(LLUUID item_id, std::string name) +void LLInventoryGallery::updateChangedItemData(LLUUID item_id, std::string name, bool is_favorite) { gallery_item_map_t::iterator iter = mItemMap.find(item_id); if (iter != mItemMap.end()) @@ -984,6 +998,7 @@ void LLInventoryGallery::updateChangedItemName(LLUUID item_id, std::string name) if (item) { item->setItemName(name); + item->setFavorite(is_favorite); } } } @@ -1801,8 +1816,8 @@ void LLInventoryGallery::paste(const LLUUID& dest, const LLUUID& marketplacelistings_id) { LLHandle<LLPanel> handle = getHandle(); - std::function <void(const LLUUID)> on_copy_callback = NULL; - LLPointer<LLInventoryCallback> cb = NULL; + std::function<void(const LLUUID)> on_copy_callback = nullptr; + LLPointer<LLInventoryCallback> cb = nullptr; if (dest == mFolderID) { on_copy_callback = [handle](const LLUUID& inv_item) @@ -1999,7 +2014,7 @@ void LLInventoryGallery::deleteSelection() for (LLInventoryModel::item_array_t::value_type& item : items) { - if (get_is_item_worn(item)) + if (!item->getIsLinkType() && get_is_item_worn(item)) { has_worn = true; LLWearableType::EType type = item->getWearableType(); @@ -2020,7 +2035,7 @@ void LLInventoryGallery::deleteSelection() } LLViewerInventoryItem* item = gInventory.getItem(id); - if (item && get_is_item_worn(item)) + if (item && !item->getIsLinkType() && get_is_item_worn(item)) { has_worn = true; LLWearableType::EType type = item->getWearableType(); @@ -2105,6 +2120,30 @@ void LLInventoryGallery::pasteAsLink() std::vector<LLUUID> objects; LLClipboard::instance().pasteFromClipboard(objects); + if (objects.size() == 0) + { + LLClipboard::instance().setCutMode(false); + return; + } + + LLUUID& first_id = objects[0]; + LLInventoryItem* item = gInventory.getItem(first_id); + if (item && item->getAssetUUID().isNull()) + { + if (item->getActualType() == LLAssetType::AT_NOTECARD) + { + LLNotificationsUtil::add("CantLinkNotecard"); + LLClipboard::instance().setCutMode(false); + return; + } + else if (item->getActualType() == LLAssetType::AT_MATERIAL) + { + LLNotificationsUtil::add("CantLinkMaterial"); + LLClipboard::instance().setCutMode(false); + return; + } + } + bool paste_into_root = mSelectedItemIDs.empty(); for (LLUUID& dest : mSelectedItemIDs) { @@ -2333,7 +2372,7 @@ void LLInventoryGallery::refreshList(const LLUUID& category_id) return; } - updateChangedItemName(*items_iter, obj->getName()); + updateChangedItemData(*items_iter, obj->getName(), get_is_favorite(obj)); mNeedsArrange = true; } @@ -2849,6 +2888,14 @@ void LLInventoryGalleryItem::setType(LLAssetType::EType type, LLInventoryType::E getChild<LLIconCtrl>("link_overlay")->setVisible(is_link); } +void LLInventoryGalleryItem::setFavorite(bool is_favorite) +{ + getChild<LLIconCtrl>("fav_icon")->setVisible(is_favorite); + static const LLUIColor text_color = LLUIColorTable::instance().getColor("LabelTextColor", LLColor4::white); + static const LLUIColor favorite_color = LLUIColorTable::instance().getColor("InventoryFavoriteColor", LLColor4::white); + mNameText->setReadOnlyColor(is_favorite ? favorite_color : text_color); +} + void LLInventoryGalleryItem::setThumbnail(LLUUID id) { mDefaultImage = id.isNull(); @@ -3535,12 +3582,12 @@ bool dragItemIntoFolder(LLUUID folder_id, LLInventoryItem* inv_item, bool drop, if (accept && drop) { - std::shared_ptr<LLMoveInv> move_inv (new LLMoveInv()); + std::shared_ptr<LLMoveInv> move_inv = std::make_shared<LLMoveInv>(); move_inv->mObjectID = inv_item->getParentUUID(); std::pair<LLUUID, LLUUID> item_pair(folder_id, inv_item->getUUID()); move_inv->mMoveList.push_back(item_pair); - move_inv->mCallback = NULL; - move_inv->mUserData = NULL; + move_inv->mCallback = nullptr; + move_inv->mUserData = nullptr; if (is_move) { warn_move_inventory(object, move_inv); @@ -3712,6 +3759,7 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, // bool is_movable = true; + bool create_outfit = false; if (is_movable && (marketplacelistings_id == cat_id)) { @@ -3745,14 +3793,24 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, U32 max_items_to_wear = gSavedSettings.getU32("WearFolderLimit"); if (is_movable && move_is_into_outfit) { - if (dest_id == my_outifts_id) + if ((inv_cat->getPreferredType() != LLFolderType::FT_NONE) && (inv_cat->getPreferredType() != LLFolderType::FT_OUTFIT)) + { + tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); + is_movable = false; + } + else if (dest_id == my_outifts_id) { if (source != LLToolDragAndDrop::SOURCE_AGENT || move_is_from_marketplacelistings) { tooltip_msg = LLTrans::getString("TooltipOutfitNotInInventory"); is_movable = false; } - else if (can_move_to_my_outfits(model, inv_cat, max_items_to_wear)) + else if (can_move_to_my_outfits_as_outfit(model, inv_cat, max_items_to_wear)) + { + is_movable = true; + create_outfit = true; + } + else if (can_move_to_my_outfits_as_subfolder(model, inv_cat)) { is_movable = true; } @@ -3762,13 +3820,44 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, is_movable = false; } } - else if (dest_cat && dest_cat->getPreferredType() == LLFolderType::FT_NONE) + else if (!dest_cat) { - is_movable = ((inv_cat->getPreferredType() == LLFolderType::FT_NONE) || (inv_cat->getPreferredType() == LLFolderType::FT_OUTFIT)); + is_movable = false; + tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); } else { - is_movable = false; + EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, dest_id, my_outifts_id); + EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id); + if ((dest_res == MY_OUTFITS_OUTFIT || dest_res == MY_OUTFITS_SUBOUTFIT) && inv_res == MY_OUTFITS_OUTFIT) + { + is_movable = false; + tooltip_msg = LLTrans::getString("TooltipCantMoveOutfitIntoOutfit"); + } + else if (dest_res == MY_OUTFITS_OUTFIT || dest_res == MY_OUTFITS_SUBOUTFIT) + { + is_movable = false; + tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); + } + else if (dest_res == MY_OUTFITS_SUBFOLDER && inv_res == MY_OUTFITS_SUBOUTFIT) + { + is_movable = false; + tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); + } + else if (can_move_to_my_outfits_as_outfit(model, inv_cat, max_items_to_wear)) + { + is_movable = true; + create_outfit = true; + } + else if (can_move_to_my_outfits_as_subfolder(model, inv_cat)) + { + is_movable = true; + } + else + { + is_movable = false; + tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); + } } } if (is_movable && move_is_into_current_outfit && is_link) @@ -3894,9 +3983,73 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, if (dest_id == my_outifts_id) { - // Category can contains objects, - // create a new folder and populate it with links to original objects - dropToMyOutfits(inv_cat); + EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id); + if (inv_res == MY_OUTFITS_SUBFOLDER || inv_res == MY_OUTFITS_OUTFIT || !create_outfit) + { + gInventory.changeCategoryParent( + (LLViewerInventoryCategory*)inv_cat, + dest_id, + move_is_into_trash); + } + else + { + // Category can contains objects, + // create a new folder and populate it with links to original objects + dropToMyOutfits(inv_cat); + } + } + else if (move_is_into_my_outfits) + { + EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, dest_id, my_outifts_id); + EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id); + switch (inv_res) + { + case MY_OUTFITS_NO: + // Moning from outside outfits into outfits + if (dest_res == MY_OUTFITS_SUBFOLDER && create_outfit) + { + // turn it into outfit + dropToMyOutfitsSubfolder(inv_cat, dest_id); + } + else + { + gInventory.changeCategoryParent( + (LLViewerInventoryCategory*)inv_cat, + dest_id, + move_is_into_trash); + } + break; + case MY_OUTFITS_SUBFOLDER: + case MY_OUTFITS_OUTFIT: + // only permit moving subfodlers and outfits into other subfolders + if (dest_res == MY_OUTFITS_SUBFOLDER) + { + gInventory.changeCategoryParent( + (LLViewerInventoryCategory*)inv_cat, + dest_id, + move_is_into_trash); + } + else + { + assert(false); // mot permitted, shouldn't have accepted + } + break; + case MY_OUTFITS_SUBOUTFIT: + if (dest_res == MY_OUTFITS_SUBOUTFIT || dest_res == MY_OUTFITS_OUTFIT) + { + gInventory.changeCategoryParent( + (LLViewerInventoryCategory*)inv_cat, + dest_id, + move_is_into_trash); + } + else + { + assert(false); // mot permitted, shouldn't have accepted + } + break; + default: + break; + } } // if target is current outfit folder we use link else if (move_is_into_current_outfit && @@ -4041,3 +4194,11 @@ void dropToMyOutfits(LLInventoryCategory* inv_cat) inventory_func_type func = boost::bind(&outfitFolderCreatedCallback, inv_cat->getUUID(), _1); gInventory.createNewCategory(dest_id, LLFolderType::FT_OUTFIT, inv_cat->getName(), func, inv_cat->getThumbnailUUID()); } + +void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID &dest_id) +{ + // Note: creation will take time, so passing folder id to callback is slightly unreliable, + // but so is collecting and passing descendants' ids + inventory_func_type func = boost::bind(&outfitFolderCreatedCallback, inv_cat->getUUID(), _1); + gInventory.createNewCategory(dest_id, LLFolderType::FT_OUTFIT, inv_cat->getName(), func, inv_cat->getThumbnailUUID()); +} diff --git a/indra/newview/llinventorygallery.h b/indra/newview/llinventorygallery.h index 59d08d19ed..a53637a477 100644 --- a/indra/newview/llinventorygallery.h +++ b/indra/newview/llinventorygallery.h @@ -44,14 +44,14 @@ class LLGalleryGestureObserver; class LLInventoryGalleryContextMenu; -typedef boost::function<void()> callback_t; +typedef std::function<void()> callback_t; class LLInventoryGallery : public LLPanel, public LLEditMenuHandler { public: typedef boost::signals2::signal<void(const LLUUID&)> selection_change_signal_t; - typedef boost::function<void(const LLUUID&)> selection_change_callback_t; + typedef std::function<void(const LLUUID&)> selection_change_callback_t; typedef std::deque<LLUUID> selection_deque; struct Params @@ -102,7 +102,7 @@ public: void getCurrentCategories(uuid_vec_t& vcur); bool updateAddedItem(LLUUID item_id); // returns true if added item is visible void updateRemovedItem(LLUUID item_id); - void updateChangedItemName(LLUUID item_id, std::string name); + void updateChangedItemData(LLUUID item_id, std::string name, bool is_favorite); void updateItemThumbnail(LLUUID item_id); void updateWornItem(LLUUID item_id, bool is_worn); @@ -227,7 +227,7 @@ private: bool updateRowsIfNeeded(); void updateGalleryWidth(); - LLInventoryGalleryItem* buildGalleryItem(std::string name, LLUUID item_id, LLAssetType::EType type, LLUUID thumbnail_id, LLInventoryType::EType inventory_type, U32 flags, time_t creation_date, bool is_link, bool is_worn); + LLInventoryGalleryItem* buildGalleryItem(std::string name, LLUUID item_id, LLAssetType::EType type, LLUUID thumbnail_id, LLInventoryType::EType inventory_type, U32 flags, time_t creation_date, bool is_link, bool is_worn, bool is_favorite); LLInventoryGalleryItem* getItem(const LLUUID& id) const; void buildGalleryPanel(int row_count); @@ -343,6 +343,7 @@ public: void setHidden(bool hidden) {mHidden = hidden;} void setType(LLAssetType::EType type, LLInventoryType::EType inventory_type, U32 flags, bool is_link); + void setFavorite(bool is_favorite); LLAssetType::EType getAssetType() { return mType; } void setThumbnail(LLUUID id); void setGallery(LLInventoryGallery* gallery) { mGallery = gallery; } diff --git a/indra/newview/llinventorygallerymenu.cpp b/indra/newview/llinventorygallerymenu.cpp index 0c35a7f695..22f6414960 100644 --- a/indra/newview/llinventorygallerymenu.cpp +++ b/indra/newview/llinventorygallerymenu.cpp @@ -112,6 +112,7 @@ LLContextMenu* LLInventoryGalleryContextMenu::createMenu() enable_registrar.add("Inventory.CanSetUploadLocation", boost::bind(&LLInventoryGalleryContextMenu::canSetUploadLocation, this, _2)); enable_registrar.add("Inventory.CanSetFavoriteFolder", boost::bind(&LLInventoryGalleryContextMenu::canSetFavoriteFolder, this)); + enable_registrar.add("Inventory.FileUploadLocation.Check", boost::bind(&LLInventoryGalleryContextMenu::isUploadLocationSelected, this, _2)); enable_registrar.add("Inventory.EnvironmentEnabled", [](LLUICtrl*, const LLSD&) { @@ -252,6 +253,20 @@ void LLInventoryGalleryContextMenu::doToSelected(const LLSD& userdata) { ungroup_folder_items(mUUIDs.front()); } + else if ("add_to_favorites" == action) + { + for (const LLUUID& id : mUUIDs) + { + set_favorite(id, true); + } + } + else if ("remove_from_favorites" == action) + { + for (const LLUUID& id : mUUIDs) + { + set_favorite(id, false); + } + } else if ("replaceoutfit" == action) { modify_outfit(false, mUUIDs.front(), &gInventory); @@ -325,14 +340,21 @@ void LLInventoryGalleryContextMenu::doToSelected(const LLSD& userdata) { LLVector3d global_pos; landmark->getGlobalPos(global_pos); - boost::function<void(std::string& slurl)> copy_slurl_to_clipboard_cb = [](const std::string& slurl) + if (!global_pos.isExactlyZero()) + { + boost::function<void(std::string& slurl)> copy_slurl_to_clipboard_cb = [](const std::string& slurl) + { + gViewerWindow->getWindow()->copyTextToClipboard(utf8str_to_wstring(slurl)); + LLSD args; + args["SLURL"] = slurl; + LLNotificationsUtil::add("CopySLURL", args); + }; + LLLandmarkActions::getSLURLfromPosGlobal(global_pos, copy_slurl_to_clipboard_cb, true); + } + else { - gViewerWindow->getWindow()->copyTextToClipboard(utf8str_to_wstring(slurl)); - LLSD args; - args["SLURL"] = slurl; - LLNotificationsUtil::add("CopySLURL", args); - }; - LLLandmarkActions::getSLURLfromPosGlobal(global_pos, copy_slurl_to_clipboard_cb, true); + LLNotificationsUtil::add("LandmarkLocationUnknown"); + } }; LLLandmark* landmark = LLLandmarkActions::getLandmark(mUUIDs.front(), copy_slurl_cb); if (landmark) @@ -349,7 +371,7 @@ void LLInventoryGalleryContextMenu::doToSelected(const LLSD& userdata) } else if ("show_on_map" == action) { - boost::function<void(LLLandmark*)> show_on_map_cb = [](LLLandmark* landmark) + std::function<void(LLLandmark*)> show_on_map_cb = [](LLLandmark* landmark) { LLVector3d landmark_global_pos; if (landmark->getGlobalPos(landmark_global_pos)) @@ -474,22 +496,13 @@ void LLInventoryGalleryContextMenu::onRename(const LLSD& notification, const LLS void LLInventoryGalleryContextMenu::fileUploadLocation(const LLSD& userdata) { const std::string param = userdata.asString(); - if (param == "model") - { - gSavedPerAccountSettings.setString("ModelUploadFolder", mUUIDs.front().asString()); - } - else if (param == "texture") - { - gSavedPerAccountSettings.setString("TextureUploadFolder", mUUIDs.front().asString()); - } - else if (param == "sound") - { - gSavedPerAccountSettings.setString("SoundUploadFolder", mUUIDs.front().asString()); - } - else if (param == "animation") - { - gSavedPerAccountSettings.setString("AnimationUploadFolder", mUUIDs.front().asString()); - } + LLInventoryAction::fileUploadLocation(mUUIDs.front(), param); +} + +bool LLInventoryGalleryContextMenu::isUploadLocationSelected(const LLSD& userdata) +{ + const std::string param = userdata.asString(); + return LLInventoryAction::isFileUploadLocation(mUUIDs.front(), param); } bool LLInventoryGalleryContextMenu::canSetUploadLocation(const LLSD& userdata) @@ -607,7 +620,9 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men bool is_trash = (selected_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH)); bool is_in_trash = gInventory.isObjectDescendentOf(selected_id, gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH)); bool is_lost_and_found = (selected_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND)); - bool is_outfits= (selected_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS)); + const LLUUID my_outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + bool is_outfits= (selected_id == my_outfits); + bool is_in_outfits = is_outfits || gInventory.isObjectDescendentOf(selected_id, my_outfits); bool is_in_favorites = gInventory.isObjectDescendentOf(selected_id, gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE)); //bool is_favorites= (selected_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE)); @@ -616,20 +631,23 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men bool has_children = false; bool is_full_perm_item = false; bool is_copyable = false; - LLViewerInventoryItem* selected_item = gInventory.getItem(selected_id); + + LLViewerInventoryCategory* selected_category = nullptr; + LLViewerInventoryItem* selected_item = nullptr; if(is_folder) { - LLInventoryCategory* category = gInventory.getCategory(selected_id); - if (category) + selected_category = dynamic_cast<LLViewerInventoryCategory*>(obj); + if (selected_category) { - folder_type = category->getPreferredType(); + folder_type = selected_category->getPreferredType(); is_system_folder = LLFolderType::lookupIsProtectedType(folder_type); has_children = (gInventory.categoryHasChildren(selected_id) != LLInventoryModel::CHILDREN_NO); } } else { + selected_item = dynamic_cast<LLViewerInventoryItem*>(obj); if (selected_item) { is_full_perm_item = selected_item->getIsFullPerm(); @@ -746,10 +764,9 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men } else { - if (is_agent_inventory && !is_inbox && !is_cof && !is_in_favorites && !is_outfits) + if (is_agent_inventory && !is_inbox && !is_cof && !is_in_favorites && !is_outfits && !is_in_outfits) { - LLViewerInventoryCategory* category = gInventory.getCategory(selected_id); - if (!category || !LLFriendCardsManager::instance().isCategoryInFriendFolder(category)) + if (!selected_category || !LLFriendCardsManager::instance().isCategoryInFriendFolder(selected_category)) { items.push_back(std::string("New Folder")); } @@ -777,6 +794,22 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men if (inventory_linking) { items.push_back(std::string("Paste As Link")); + + if (selected_item) + { + if (!LLAssetType::lookupCanLink(selected_item->getActualType())) + { + disabled_items.push_back(std::string("Paste As Link")); + } + else if (gInventory.isObjectDescendentOf(selected_item->getUUID(), gInventory.getLibraryRootFolderID())) + { + disabled_items.push_back(std::string("Paste As Link")); + } + } + else if (selected_category && LLFolderType::lookupIsProtectedType(selected_category->getPreferredType())) + { + disabled_items.push_back(std::string("Paste As Link")); + } } } if (is_folder && is_agent_inventory) @@ -787,20 +820,44 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men { items.push_back(std::string("New Folder")); } + items.push_back(std::string("upload_options")); items.push_back(std::string("upload_def")); } items.push_back(std::string("Set favorite folder")); - if(is_outfits && !isRootFolder()) + if(is_outfits) { - items.push_back(std::string("New Outfit")); + EMyOutfitsSubfolderType res = myoutfit_object_subfolder_type(&gInventory, selected_id, my_outfits); + if (res != MY_OUTFITS_OUTFIT && res != MY_OUTFITS_SUBOUTFIT) + { + items.push_back(std::string("New Outfit")); + items.push_back(std::string("New Outfit Folder")); + } + items.push_back(std::string("Delete")); + items.push_back(std::string("Rename")); + if (!get_is_category_and_children_removable(&gInventory, selected_id, false)) + { + disabled_items.push_back(std::string("Delete")); + } + } + + if (!is_trash && !is_in_trash && gInventory.getRootFolderID() != selected_id) + { + if (get_is_favorite(obj)) + { + items.push_back(std::string("Remove from Favorites")); + } + else + { + items.push_back(std::string("Add to Favorites")); + } } items.push_back(std::string("Subfolder Separator")); - if (!is_system_folder && !isRootFolder()) + if (!is_system_folder && !isRootFolder() && !is_outfits) { - if(has_children && (folder_type != LLFolderType::FT_OUTFIT)) + if(has_children && (folder_type != LLFolderType::FT_OUTFIT) && !is_in_outfits) { items.push_back(std::string("Ungroup folder items")); } @@ -842,6 +899,17 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men if(is_agent_inventory) { items.push_back(std::string("Cut")); + if (!is_in_trash) + { + if (get_is_favorite(obj)) + { + items.push_back(std::string("Remove from Favorites")); + } + else + { + items.push_back(std::string("Add to Favorites")); + } + } if (!is_link || !is_cof || !get_is_item_worn(selected_id)) { items.push_back(std::string("Delete")); @@ -980,6 +1048,7 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men } disabled_items.push_back(std::string("New Folder")); + disabled_items.push_back(std::string("upload_options")); disabled_items.push_back(std::string("upload_def")); disabled_items.push_back(std::string("create_new")); } @@ -1001,9 +1070,8 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men { if (is_folder) { - LLViewerInventoryCategory* cat = gInventory.getCategory(selected_id); - if (cat - && !LLFolderType::lookupIsProtectedType(cat->getPreferredType()) + if (selected_category + && !LLFolderType::lookupIsProtectedType(selected_category->getPreferredType()) && gInventory.isObjectDescendentOf(selected_id, gInventory.getRootFolderID())) { can_list = true; @@ -1030,6 +1098,15 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men disabled_items.push_back(std::string("Marketplace Move")); } } + + if (get_is_favorite(obj)) + { + items.push_back(std::string("Remove from Favorites")); + } + else if (is_agent_inventory) + { + items.push_back(std::string("Add to Favorites")); + } } hide_context_entries(*menu, items, disabled_items); diff --git a/indra/newview/llinventorygallerymenu.h b/indra/newview/llinventorygallerymenu.h index 7f6598e171..d91c752544 100644 --- a/indra/newview/llinventorygallerymenu.h +++ b/indra/newview/llinventorygallerymenu.h @@ -47,6 +47,7 @@ protected: void updateMenuItemsVisibility(LLContextMenu* menu); void fileUploadLocation(const LLSD& userdata); + bool isUploadLocationSelected(const LLSD& userdata); bool canSetUploadLocation(const LLSD& userdata); void setFavoriteFolder(); diff --git a/indra/newview/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp index 9e936eee5b..15735ebde3 100644 --- a/indra/newview/llinventoryitemslist.cpp +++ b/indra/newview/llinventoryitemslist.cpp @@ -40,6 +40,10 @@ #include "llinventorymodel.h" #include "llviewerinventory.h" +bool LLInventoryItemsList::sListIdleRegistered = false; +LLInventoryItemsList::all_list_t LLInventoryItemsList::sAllLists; +LLInventoryItemsList::all_list_t::iterator LLInventoryItemsList::sAllListIter; + LLInventoryItemsList::Params::Params() {} @@ -47,6 +51,7 @@ LLInventoryItemsList::LLInventoryItemsList(const LLInventoryItemsList::Params& p : LLFlatListViewEx(p) , mRefreshState(REFRESH_COMPLETE) , mForceRefresh(false) +, mNeedsArrange(true) { // TODO: mCommitOnSelectionChange is set to "false" in LLFlatListView // but reset to true in all derived classes. This settings might need to @@ -55,13 +60,39 @@ LLInventoryItemsList::LLInventoryItemsList(const LLInventoryItemsList::Params& p setNoFilteredItemsMsg(LLTrans::getString("InventoryNoMatchingItems")); - gIdleCallbacks.addFunction(idle, this); + sAllLists.push_back(this); + sAllListIter = sAllLists.begin(); + + if (!sListIdleRegistered) + { + sAllListIter = sAllLists.begin(); + gIdleCallbacks.addFunction(idle, nullptr); + + LLEventPumps::instance().obtain("LLApp").listen( + "LLInventoryItemsList", + [](const LLSD& stat) + { + std::string status(stat["status"]); + if (status != "running") + { + // viewer is starting shutdown + gIdleCallbacks.deleteFunction(idle, nullptr); + } + return false; + }); + sListIdleRegistered = true; + } } // virtual LLInventoryItemsList::~LLInventoryItemsList() { - gIdleCallbacks.deleteFunction(idle, this); + auto it = std::find(sAllLists.begin(), sAllLists.end(), this); + if (it != sAllLists.end()) + { + sAllLists.erase(it); + sAllListIter = sAllLists.begin(); + } } void LLInventoryItemsList::refreshList(const LLInventoryModel::item_array_t item_array) @@ -99,7 +130,7 @@ void LLInventoryItemsList::updateSelection() for(std::vector<LLSD>::const_iterator cur_id_it = cur.begin(); cur_id_it != cur.end() && !mSelectTheseIDs.empty(); ++cur_id_it) { - uuid_vec_t::iterator select_ids_it = std::find(mSelectTheseIDs.begin(), mSelectTheseIDs.end(), *cur_id_it); + uuid_vec_t::iterator select_ids_it = std::find(mSelectTheseIDs.begin(), mSelectTheseIDs.end(), cur_id_it->asUUID()); if(select_ids_it != mSelectTheseIDs.end()) { selectItemByUUID(*select_ids_it); @@ -111,25 +142,56 @@ void LLInventoryItemsList::updateSelection() mSelectTheseIDs.clear(); } -void LLInventoryItemsList::doIdle() +bool LLInventoryItemsList::doIdle() { - if (mRefreshState == REFRESH_COMPLETE) return; + if (mRefreshState == REFRESH_COMPLETE) return true; // done + LL_PROFILE_ZONE_SCOPED; - if (isInVisibleChain() || mForceRefresh ) + if (isInVisibleChain() || mForceRefresh || !getFilterSubString().empty()) { refresh(); mRefreshCompleteSignal(this, LLSD()); + return false; // keep going } + return true; // done } //static void LLInventoryItemsList::idle(void* user_data) { - LLInventoryItemsList* self = static_cast<LLInventoryItemsList*>(user_data); - if ( self ) - { // Do the real idle - self->doIdle(); + if (sAllLists.empty()) + return; + + LL_PROFILE_ZONE_SCOPED; + + using namespace std::chrono; + auto start = steady_clock::now(); + const milliseconds time_limit = milliseconds(2); + const auto end_time = start + time_limit; + S32 max_update_count = 50; + + if (sAllListIter == sAllLists.end()) + { + sAllListIter = sAllLists.begin(); + } + + S32 updated = 0; + while (steady_clock::now() < end_time + && updated < max_update_count + && sAllListIter != sAllLists.end()) + { + LLInventoryItemsList* list = *sAllListIter; + // Refresh is split into multiple separate parts, + // so keep repeating it while there is time, until done. + // Todo: refresh() split is pointless now? + // Or still useful for large folders? + if (list->doIdle()) + { + // Item is done + ++sAllListIter; + updated++; + } } } @@ -141,6 +203,7 @@ void LLInventoryItemsList::refresh() { case REFRESH_ALL: { + LL_PROFILE_ZONE_NAMED("items_refresh_all"); mAddedItems.clear(); mRemovedItems.clear(); computeDifference(getIDs(), mAddedItems, mRemovedItems); @@ -157,24 +220,35 @@ void LLInventoryItemsList::refresh() mRefreshState = REFRESH_LIST_SORT; } - rearrangeItems(); - notifyParentItemsRectChanged(); break; } case REFRESH_LIST_ERASE: { + LL_PROFILE_ZONE_NAMED("items_refresh_erase"); uuid_vec_t::const_iterator it = mRemovedItems.begin(); for (; mRemovedItems.end() != it; ++it) { // don't filter items right away - removeItemByUUID(*it, false); + removeItemByUUID(*it, false /*don't rearrange*/); } mRemovedItems.clear(); - mRefreshState = REFRESH_LIST_SORT; // fix visibility and arrange + mRefreshState = REFRESH_LIST_SORT; // fix visibility + + // Assume that visible items were removed. + if (getVisible()) + { + rearrangeItems(); + notifyParentItemsRectChanged(); + } + else + { + mNeedsArrange = true; + } break; } case REFRESH_LIST_APPEND: { + LL_PROFILE_ZONE_NAMED("items_refresh_append"); static const unsigned ADD_LIMIT = 25; // Note: affects perfomance unsigned int nadded = 0; @@ -212,18 +286,25 @@ void LLInventoryItemsList::refresh() LLSD action; action.with("match_filter", cur_filter); + bool new_visible_items = false; pairs_const_iterator_t pair_it = panel_list.begin(); for (; pair_it != panel_list.end(); ++pair_it) { item_pair_t* item_pair = *pair_it; if (item_pair->first->getParent() != NULL) { - updateItemVisibility(item_pair->first, action); + new_visible_items |= updateItemVisibility(item_pair->first, action); } } - rearrangeItems(); - notifyParentItemsRectChanged(); + mNeedsArrange |= new_visible_items; + if (mNeedsArrange && getVisible()) + { + // show changes now + rearrangeItems(); + notifyParentItemsRectChanged(); + mNeedsArrange = false; + } if (mAddedItems.size() > 0) { @@ -239,23 +320,44 @@ void LLInventoryItemsList::refresh() } case REFRESH_LIST_SORT: { + LL_PROFILE_ZONE_NAMED("items_refresh_sort"); // Filter, sort, rearrange and notify parent about shape changes - filterItems(true, true); + if (filterItems(true, true)) + { + mNeedsArrange = false; // just rearranged + } if (mAddedItems.size() == 0) { + if (mNeedsArrange) + { + // Done, last chance to rearrange + rearrangeItems(); + notifyParentItemsRectChanged(); + mNeedsArrange = false; + } // After list building completed, select items that had been requested to select before list was build updateSelection(); mRefreshState = REFRESH_COMPLETE; } else { + if (mNeedsArrange && getVisible()) + { + // show changes now + rearrangeItems(); + notifyParentItemsRectChanged(); + mNeedsArrange = false; + } mRefreshState = REFRESH_LIST_APPEND; } break; } default: - break; + { + mRefreshState = REFRESH_COMPLETE; + break; + } } setForceRefresh(mRefreshState != REFRESH_COMPLETE); @@ -280,6 +382,7 @@ void LLInventoryItemsList::computeDifference( LLPanel* LLInventoryItemsList::createNewItem(LLViewerInventoryItem* item) { + LL_PROFILE_ZONE_SCOPED; if (!item) { LL_WARNS() << "No inventory item. Couldn't create flat list item." << LL_ENDL; diff --git a/indra/newview/llinventoryitemslist.h b/indra/newview/llinventoryitemslist.h index 9ebeb5e52b..f80d6b31b8 100644 --- a/indra/newview/llinventoryitemslist.h +++ b/indra/newview/llinventoryitemslist.h @@ -59,7 +59,10 @@ public: * Sets the flag indicating that the list needs to be refreshed even if it is * not currently visible. */ - void setForceRefresh(bool force_refresh) { mForceRefresh = force_refresh; } + void setForceRefresh(bool force_refresh) + { + mForceRefresh = force_refresh; + } /** * If refreshes when invisible. @@ -76,7 +79,7 @@ public: * This is needed for example to filter items of the list hidden by closed * accordion tab. */ - virtual void doIdle(); // Real idle routine + bool doIdle(); // Real idle routine static void idle(void* user_data); // static glue to doIdle() protected: @@ -114,6 +117,7 @@ protected: }; ERefreshStates mRefreshState; + bool mNeedsArrange = true; private: uuid_vec_t mIDs; // IDs of items that were added in refreshList(). @@ -126,6 +130,12 @@ private: bool mForceRefresh; commit_signal_t mRefreshCompleteSignal; + + // Update synchronization + typedef std::vector<LLInventoryItemsList*> all_list_t; + static all_list_t sAllLists; + static all_list_t::iterator sAllListIter; + static bool sListIdleRegistered; }; #endif //LL_LLINVENTORYITEMSLIST_H diff --git a/indra/newview/llinventorylistener.cpp b/indra/newview/llinventorylistener.cpp new file mode 100644 index 0000000000..028483e134 --- /dev/null +++ b/indra/newview/llinventorylistener.cpp @@ -0,0 +1,309 @@ +/** + * @file llinventorylistener.cpp + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, 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 "llinventorylistener.h" + +#include "llappearancemgr.h" +#include "llinventoryfunctions.h" +#include "lltransutil.h" +#include "llwearableitemslist.h" +#include "stringize.h" + +LLInventoryListener::LLInventoryListener() + : LLEventAPI("LLInventory", + "API for interactions with viewer Inventory items") +{ + add("getItemsInfo", + "Return information about items or folders defined in [\"item_ids\"]:\n" + "reply will contain [\"items\"] and [\"categories\"] result set keys", + &LLInventoryListener::getItemsInfo, + llsd::map("item_ids", LLSD(), "reply", LLSD())); + + add("getFolderTypeNames", + "Return the table of folder type names, contained in [\"names\"]\n", + &LLInventoryListener::getFolderTypeNames, + llsd::map("reply", LLSD())); + + add("getAssetTypeNames", + "Return the table of asset type names, contained in [\"names\"]\n", + &LLInventoryListener::getAssetTypeNames, + llsd::map("reply", LLSD())); + + add("getBasicFolderID", + "Return the UUID of the folder by specified folder type name, for example:\n" + "\"Textures\", \"My outfits\", \"Sounds\" and other basic folders which have associated type", + &LLInventoryListener::getBasicFolderID, + llsd::map("ft_name", LLSD(), "reply", LLSD())); + + add("getDirectDescendants", + "Return result set keys [\"categories\"] and [\"items\"] for the direct\n" + "descendants of the [\"folder_id\"]", + &LLInventoryListener::getDirectDescendants, + llsd::map("folder_id", LLSD(), "reply", LLSD())); + + add("collectDescendantsIf", + "Return result set keys [\"categories\"] and [\"items\"] for the descendants\n" + "of the [\"folder_id\"], if it passes specified filters:\n" + "[\"name\"] is a substring of object's name,\n" + "[\"desc\"] is a substring of object's description,\n" + "asset [\"type\"] corresponds to the string name of the object's asset type\n" + "[\"limit\"] sets item count limit in result set (default unlimited)\n" + "[\"filter_links\"]: EXCLUDE_LINKS - don't show links, ONLY_LINKS - only show links, INCLUDE_LINKS - show links too (default)", + &LLInventoryListener::collectDescendantsIf, + llsd::map("folder_id", LLSD(), "reply", LLSD())); +} + +void add_cat_info(LLEventAPI::Response& response, LLViewerInventoryCategory* cat) +{ + response["categories"].insert(cat->getUUID().asString(), + llsd::map("id", cat->getUUID(), + "name", cat->getName(), + "parent_id", cat->getParentUUID(), + "type", LLFolderType::lookup(cat->getPreferredType()))); + +}; + +void add_item_info(LLEventAPI::Response& response, LLViewerInventoryItem* item) +{ + response["items"].insert(item->getUUID().asString(), + llsd::map("id", item->getUUID(), + "name", item->getName(), + "parent_id", item->getParentUUID(), + "desc", item->getDescription(), + "inv_type", LLInventoryType::lookup(item->getInventoryType()), + "asset_type", LLAssetType::lookup(item->getType()), + "creation_date", LLSD::Integer(item->getCreationDate()), + "asset_id", item->getAssetUUID(), + "is_link", item->getIsLinkType(), + "linked_id", item->getLinkedUUID())); +} + +void add_objects_info(LLEventAPI::Response& response, LLInventoryModel::cat_array_t cat_array, LLInventoryModel::item_array_t item_array) +{ + for (auto& p : item_array) + { + add_item_info(response, p); + } + for (auto& p : cat_array) + { + add_cat_info(response, p); + } +} + +void LLInventoryListener::getItemsInfo(LLSD const &data) +{ + Response response(LLSD(), data); + uuid_vec_t ids = LLSDParam<uuid_vec_t>(data["item_ids"]); + for (auto &it : ids) + { + LLViewerInventoryItem* item = gInventory.getItem(it); + if (item) + { + add_item_info(response, item); + } + else + { + LLViewerInventoryCategory *cat = gInventory.getCategory(it); + if (cat) + { + add_cat_info(response, cat); + } + } + } +} + +void LLInventoryListener::getFolderTypeNames(LLSD const &data) +{ + Response response(llsd::map("names", LLFolderType::getTypeNames()), data); +} + +void LLInventoryListener::getAssetTypeNames(LLSD const &data) +{ + Response response(llsd::map("names", LLAssetType::getTypeNames()), data); +} + +void LLInventoryListener::getBasicFolderID(LLSD const &data) +{ + Response response(llsd::map("id", gInventory.findCategoryUUIDForType(LLFolderType::lookup(data["ft_name"].asString()))), data); +} + + +void LLInventoryListener::getDirectDescendants(LLSD const &data) +{ + Response response(LLSD(), data); + LLUUID folder_id(data["folder_id"].asUUID()); + LLViewerInventoryCategory* cat = gInventory.getCategory(folder_id); + if (!cat) + { + return response.error(stringize("Folder ", std::quoted(data["folder_id"].asString()), " was not found")); + } + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + gInventory.getDirectDescendentsOf(folder_id, cats, items); + + add_objects_info(response, *cats, *items); +} + +struct LLFilteredCollector : public LLInventoryCollectFunctor +{ + enum EFilterLink + { + INCLUDE_LINKS, // show links too + EXCLUDE_LINKS, // don't show links + ONLY_LINKS // only show links + }; + + LLFilteredCollector(LLSD const &data); + virtual ~LLFilteredCollector() {} + virtual bool operator()(LLInventoryCategory *cat, LLInventoryItem *item) override; + virtual bool exceedsLimit() override + { + // mItemLimit == 0 means unlimited + return (mItemLimit && mItemLimit <= mItemCount); + } + + protected: + bool checkagainstType(LLInventoryCategory *cat, LLInventoryItem *item); + bool checkagainstNameDesc(LLInventoryCategory *cat, LLInventoryItem *item); + bool checkagainstLinks(LLInventoryCategory *cat, LLInventoryItem *item); + + LLAssetType::EType mType; + std::string mName; + std::string mDesc; + EFilterLink mLinkFilter; + + S32 mItemLimit; + S32 mItemCount; +}; + +void LLInventoryListener::collectDescendantsIf(LLSD const &data) +{ + Response response(LLSD(), data); + LLUUID folder_id(data["folder_id"].asUUID()); + LLViewerInventoryCategory *cat = gInventory.getCategory(folder_id); + if (!cat) + { + return response.error(stringize("Folder ", std::quoted(data["folder_id"].asString()), " was not found")); + } + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + + LLFilteredCollector collector = LLFilteredCollector(data); + + gInventory.collectDescendentsIf(folder_id, cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH, collector); + + add_objects_info(response, cat_array, item_array); +} + +LLFilteredCollector::LLFilteredCollector(LLSD const &data) : + mType(LLAssetType::EType::AT_UNKNOWN), + mLinkFilter(INCLUDE_LINKS), + mItemLimit(0), + mItemCount(0) +{ + + mName = data["name"].asString(); + mDesc = data["desc"].asString(); + + if (data.has("type")) + { + mType = LLAssetType::lookup(data["type"]); + } + if (data.has("filter_links")) + { + if (data["filter_links"] == "EXCLUDE_LINKS") + { + mLinkFilter = EXCLUDE_LINKS; + } + else if (data["filter_links"] == "ONLY_LINKS") + { + mLinkFilter = ONLY_LINKS; + } + } + if (data["limit"].isInteger()) + { + mItemLimit = std::max(data["limit"].asInteger(), 1); + } +} + +bool LLFilteredCollector::operator()(LLInventoryCategory *cat, LLInventoryItem *item) +{ + bool passed = checkagainstType(cat, item); + passed = passed && checkagainstNameDesc(cat, item); + passed = passed && checkagainstLinks(cat, item); + + if (passed) + { + ++mItemCount; + } + return passed; +} + +bool LLFilteredCollector::checkagainstNameDesc(LLInventoryCategory *cat, LLInventoryItem *item) +{ + std::string name, desc; + bool passed(true); + if (cat) + { + if (!mDesc.empty()) return false; + name = cat->getName(); + } + if (item) + { + name = item->getName(); + passed = (mDesc.empty() || (item->getDescription().find(mDesc) != std::string::npos)); + } + + return passed && (mName.empty() || name.find(mName) != std::string::npos); +} + +bool LLFilteredCollector::checkagainstType(LLInventoryCategory *cat, LLInventoryItem *item) +{ + if (mType == LLAssetType::AT_UNKNOWN) + { + return true; + } + if (cat && (mType == LLAssetType::AT_CATEGORY)) + { + return true; + } + if (item && item->getType() == mType) + { + return true; + } + return false; +} + +bool LLFilteredCollector::checkagainstLinks(LLInventoryCategory *cat, LLInventoryItem *item) +{ + bool is_link = cat ? cat->getIsLinkType() : item->getIsLinkType(); + if (is_link && (mLinkFilter == EXCLUDE_LINKS)) + return false; + if (!is_link && (mLinkFilter == ONLY_LINKS)) + return false; + return true; +} diff --git a/indra/newview/llinventorylistener.h b/indra/newview/llinventorylistener.h new file mode 100644 index 0000000000..d50397730c --- /dev/null +++ b/indra/newview/llinventorylistener.h @@ -0,0 +1,48 @@ +/** + * @file llinventorylistener.h + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, 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_LLINVENTORYLISTENER_H +#define LL_LLINVENTORYLISTENER_H + +#include "lleventapi.h" +#include "llinventoryfunctions.h" + +class LLInventoryListener : public LLEventAPI +{ +public: + LLInventoryListener(); + +private: + void getItemsInfo(LLSD const &data); + void getFolderTypeNames(LLSD const &data); + void getAssetTypeNames(LLSD const &data); + void getBasicFolderID(LLSD const &data); + void getDirectDescendants(LLSD const &data); + void collectDescendantsIf(LLSD const &data); +}; + +#endif // LL_LLINVENTORYLISTENER_H + diff --git a/indra/newview/llinventorylistitem.cpp b/indra/newview/llinventorylistitem.cpp index e210975a5a..a435a4f7c7 100644 --- a/indra/newview/llinventorylistitem.cpp +++ b/indra/newview/llinventorylistitem.cpp @@ -43,7 +43,19 @@ static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelInventoryListItemBaseParams(&typeid(LLPanelInventoryListItemBase::Params), "inventory_list_item"); -static const S32 WIDGET_SPACING = 3; +constexpr S32 WIDGET_SPACING = 3; +constexpr S32 FAVORITE_IMAGE_SIZE = 14; +constexpr S32 FAVORITE_IMAGE_PAD = 3; + +bool get_is_item_favorite(const LLViewerInventoryItem* inv) +{ + if (inv->getIsLinkType()) + { + LLInventoryObject* obj = gInventory.getObject(inv->getLinkedUUID()); + return obj && obj->getIsFavorite(); + } + return inv->getIsFavorite(); +} LLPanelInventoryListItemBase::Params::Params() : default_style("default_style"), @@ -57,6 +69,7 @@ LLPanelInventoryListItemBase::Params::Params() LLPanelInventoryListItemBase* LLPanelInventoryListItemBase::create(LLViewerInventoryItem* item) { + LL_PROFILE_ZONE_SCOPED_CATEGORY_UI; LLPanelInventoryListItemBase* list_item = NULL; if (item) { @@ -75,19 +88,30 @@ void LLPanelInventoryListItemBase::draw() LLViewerInventoryItem* inv_item = getItem(); if (inv_item) { - updateItem(inv_item->getName()); + updateItem(inv_item->getName(), get_is_item_favorite(inv_item)); } setNeedsRefresh(false); } + static LLUICachedControl<bool> draw_star("InventoryFavoritesUseStar", true); + + LLRect local_rect = getLocalRect(); if (mHovered && mHoverImage) { - mHoverImage->draw(getLocalRect()); + mHoverImage->draw(local_rect); + } + else if (mIsFavorite && draw_star()) + { + + static LLPointer<LLUIImage> fav_img = LLRender2D::getInstance()->getUIImage("Inv_Favorite_Star_Full"); + gl_draw_scaled_image( + local_rect.getWidth() - FAVORITE_IMAGE_SIZE - FAVORITE_IMAGE_PAD, FAVORITE_IMAGE_PAD, + FAVORITE_IMAGE_SIZE, FAVORITE_IMAGE_SIZE, fav_img->getImage()); } if (mSelected && mSelectedImage) { - mSelectedImage->draw(getLocalRect()); + mSelectedImage->draw(local_rect); } if (mSeparatorVisible && mSeparatorImage) @@ -95,7 +119,7 @@ void LLPanelInventoryListItemBase::draw() // place under bottom of listitem, using image height // item_pad in list using the item should be >= image height // to avoid cropping of top of the next item. - LLRect separator_rect = getLocalRect(); + LLRect separator_rect = local_rect; separator_rect.mTop = separator_rect.mBottom; separator_rect.mBottom -= mSeparatorImage->getHeight(); F32 alpha = getCurrentTransparency(); @@ -107,9 +131,15 @@ void LLPanelInventoryListItemBase::draw() // virtual void LLPanelInventoryListItemBase::updateItem(const std::string& name, + bool favorite, EItemState item_state) { setIconImage(mIconImage); + if (mIsFavorite != favorite) + { + mIsFavorite = favorite; + reshapeMiddleWidgets(); + } setTitle(name, mHighlightedText, item_state); } @@ -160,11 +190,12 @@ void LLPanelInventoryListItemBase::setShowWidget(LLUICtrl* ctrl, bool show) bool LLPanelInventoryListItemBase::postBuild() { + LL_PROFILE_ZONE_SCOPED_CATEGORY_UI; LLViewerInventoryItem* inv_item = getItem(); if (inv_item) { mIconImage = LLInventoryIcon::getIcon(inv_item->getType(), inv_item->getInventoryType(), inv_item->getFlags(), false); - updateItem(inv_item->getName()); + updateItem(inv_item->getName(), get_is_item_favorite(inv_item)); } setNeedsRefresh(true); @@ -290,6 +321,7 @@ LLPanelInventoryListItemBase::LLPanelInventoryListItemBase(LLViewerInventoryItem mHovered(false), mSelected(false), mSeparatorVisible(false), + mIsFavorite(false), mHoverImage(params.hover_image), mSelectedImage(params.selected_image), mSeparatorImage(params.separator_image) @@ -392,6 +424,16 @@ void LLPanelInventoryListItemBase::setTitle(const std::string& title, default:; } + if (mIsFavorite) + { + static LLUICachedControl<bool> use_color("InventoryFavoritesColorText", true); + if (use_color) + { + static const LLUIColor favorite_color = LLUIColorTable::instance().getColor("InventoryFavoriteColor", LLColor4::white); + style_params.color = favorite_color; + } + } + LLTextUtil::textboxSetHighlightedVal( mTitleCtrl, style_params, @@ -466,6 +508,10 @@ void LLPanelInventoryListItemBase::reshapeMiddleWidgets() S32 name_left = icon_rect.mRight + getWidgetSpacing(); S32 name_right = getLocalRect().getWidth() - mRightWidgetsWidth - getWidgetSpacing(); + if (mIsFavorite) + { + name_right -= FAVORITE_IMAGE_SIZE + FAVORITE_IMAGE_PAD; + } LLRect name_rect(mTitleCtrl->getRect()); name_rect.set(name_left, name_rect.mTop, name_right, name_rect.mBottom); mTitleCtrl->setShape(name_rect); diff --git a/indra/newview/llinventorylistitem.h b/indra/newview/llinventorylistitem.h index 21540a380b..40a86001a4 100644 --- a/indra/newview/llinventorylistitem.h +++ b/indra/newview/llinventorylistitem.h @@ -167,6 +167,7 @@ protected: * Called after inventory item was updated, update panel widgets to reflect inventory changes. */ virtual void updateItem(const std::string& name, + bool favorite, EItemState item_state = IS_DEFAULT); void setLeftWidgetsWidth(S32 width) { mLeftWidgetsWidth = width; } @@ -222,8 +223,9 @@ private: LLUIImagePtr mSelectedImage; LLUIImagePtr mSeparatorImage; - bool mSelected; - bool mSeparatorVisible; + bool mSelected = false; + bool mSeparatorVisible = false; + bool mIsFavorite = false; // note that any setter needs to update tittle std::string mHighlightedText; diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index b6ff31a7ed..3a7bc20c30 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -78,7 +78,7 @@ // Increment this if the inventory contents change in a non-backwards-compatible way. // For viewer 2, the addition of link items makes a pre-viewer-2 cache incorrect. -const S32 LLInventoryModel::sCurrentInvCacheVersion = 3; +const S32 LLInventoryModel::sCurrentInvCacheVersion = 5; bool LLInventoryModel::sFirstTimeInViewer2 = true; S32 LLInventoryModel::sPendingSystemFolders = 0; @@ -1007,7 +1007,8 @@ void LLInventoryModel::createNewCategory(const LLUUID& parent_id, return; } - if (preferred_type != LLFolderType::FT_NONE) + if (preferred_type != LLFolderType::FT_NONE + && preferred_type != LLFolderType::FT_OUTFIT) { // Ultimately this should only be done for non-singleton // types. Requires back-end changes to guarantee that others @@ -1036,7 +1037,7 @@ void LLInventoryModel::createNewCategory(const LLUUID& parent_id, { if (new_category.isNull()) { - if (callback && !callback.empty()) + if (callback) { callback(new_category); } @@ -1063,7 +1064,7 @@ void LLInventoryModel::createNewCategory(const LLUUID& parent_id, updateCategory(cat); } - if (callback && !callback.empty()) + if (callback) { callback(new_category); } @@ -1106,9 +1107,9 @@ void LLInventoryModel::createNewCategoryCoro(std::string url, LLSD postData, inv { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("createNewCategoryCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("createNewCategoryCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); httpOpts->setWantHeaders(true); @@ -1282,6 +1283,10 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id, { for (auto& cat : *cat_array) { + if (add.exceedsLimit()) + { + break; + } if(add(cat,NULL)) { cats.push_back(cat); @@ -1297,6 +1302,10 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id, { for (auto& item : *item_array) { + if (add.exceedsLimit()) + { + break; + } if(add(NULL, item)) { items.push_back(item); @@ -2681,6 +2690,7 @@ bool LLInventoryModel::loadSkeleton( LL_PROFILE_ZONE_SCOPED; LL_DEBUGS(LOG_INV) << "importing inventory skeleton for " << owner_id << LL_ENDL; + LLTimer timer; typedef std::set<LLPointer<LLViewerInventoryCategory>, InventoryIDPtrLess> cat_set_t; cat_set_t temp_cats; bool rv = true; @@ -2767,6 +2777,7 @@ bool LLInventoryModel::loadSkeleton( bool is_cache_obsolete = false; if (loadFromFile(inventory_filename, categories, items, categories_to_update, is_cache_obsolete)) { + LL_PROFILE_ZONE_NAMED("loadFromFile"); // We were able to find a cache of files. So, use what we // found to generate a set of categories we should add. We // will go through each category loaded and if the version @@ -2806,8 +2817,9 @@ bool LLInventoryModel::loadSkeleton( cached_ids.insert(tcat->getUUID()); // At the moment download does not provide a thumbnail - // uuid, use the one from cache + // uuid or favorite, use values from cache tcat->setThumbnailUUID(cat->getThumbnailUUID()); + tcat->setFavorite(cat->getIsFavorite()); } } @@ -2964,7 +2976,8 @@ bool LLInventoryModel::loadSkeleton( } LL_INFOS(LOG_INV) << "Successfully loaded " << cached_category_count - << " categories and " << cached_item_count << " items from cache." + << " categories and " << cached_item_count << " items from cache" + << " after " << timer.getElapsedTimeF32() << " seconds." << LL_ENDL; return rv; @@ -3244,11 +3257,11 @@ void LLInventoryModel::initHttpRequest() mHttpRequestFG = new LLCore::HttpRequest; mHttpRequestBG = new LLCore::HttpRequest; - mHttpOptions = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); + mHttpOptions = std::make_shared<LLCore::HttpOptions>(); mHttpOptions->setTransferTimeout(300); mHttpOptions->setUseRetryAfter(true); // mHttpOptions->setTrace(2); // Do tracing of requests - mHttpHeaders = LLCore::HttpHeaders::ptr_t(new LLCore::HttpHeaders); + mHttpHeaders = std::make_shared<LLCore::HttpHeaders>(); mHttpHeaders->append(HTTP_OUT_HEADER_CONTENT_TYPE, HTTP_CONTENT_LLSD_XML); mHttpHeaders->append(HTTP_OUT_HEADER_ACCEPT, HTTP_CONTENT_LLSD_XML); mHttpPolicyClass = app_core_http.getPolicy(LLAppCoreHttp::AP_INVENTORY); @@ -3371,7 +3384,7 @@ bool LLInventoryModel::loadFromFile(const std::string& filename, } LL_INFOS(LOG_INV) << "loading inventory from: (" << filename << ")" << LL_ENDL; - llifstream file(filename.c_str()); + llifstream file(filename.c_str(), std::ifstream::in | std::ifstream::binary); if (!file.is_open()) { @@ -3380,80 +3393,92 @@ bool LLInventoryModel::loadFromFile(const std::string& filename, } is_cache_obsolete = true; // Obsolete until proven current - - //U64 lines_count = 0U; - std::string line; - LLPointer<LLSDParser> parser = new LLSDNotationParser(); - while (std::getline(file, line)) + U32 value_nbo = 0; + file.read((char*)&value_nbo, sizeof(U32)); + if (file.fail()) { - LLSD s_item; - std::istringstream iss(line); - if (parser->parse(iss, s_item, line.length()) == LLSDParser::PARSE_FAILURE) + LL_WARNS(LOG_INV) << "Failed to read cache version. Unable to load inventory from: " << filename << LL_ENDL; + } + else + { + S32 version = (S32)ntohl(value_nbo); + if (version == sCurrentInvCacheVersion) { - LL_WARNS(LOG_INV)<< "Parsing inventory cache failed" << LL_ENDL; - break; + // Cache is up to date + is_cache_obsolete = false; } - - if (s_item.has("inv_cache_version")) + else { - S32 version = s_item["inv_cache_version"].asInteger(); - if (version == sCurrentInvCacheVersion) - { - // Cache is up to date - is_cache_obsolete = false; - continue; - } - else - { - LL_WARNS(LOG_INV)<< "Inventory cache is out of date" << LL_ENDL; - break; - } + LL_WARNS(LOG_INV) << "Inventory cache is out of date" << LL_ENDL; } - else if (s_item.has("cat_id")) + } + + LLSD inventory; + if (!is_cache_obsolete) + { + LLPointer<LLSDParser> parser = new LLSDBinaryParser(); + + if (parser->parse(file, inventory, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE) { - if (is_cache_obsolete) - break; + is_cache_obsolete = true; + LL_WARNS(LOG_INV) << "Parsing inventory cache failed" << LL_ENDL; + } + } - LLPointer<LLViewerInventoryCategory> inv_cat = new LLViewerInventoryCategory(LLUUID::null); - if(inv_cat->importLLSD(s_item)) + if (!is_cache_obsolete) + { + const LLSD& llsd_cats = inventory["categories"]; + if (llsd_cats.isArray()) + { + LLSD::array_const_iterator iter = llsd_cats.beginArray(); + LLSD::array_const_iterator end = llsd_cats.endArray(); + for (; iter != end; ++iter) { - categories.push_back(inv_cat); + LLPointer<LLViewerInventoryCategory> inv_cat = new LLViewerInventoryCategory(LLUUID::null); + if (inv_cat->importLLSDMap(*iter)) + { + categories.push_back(inv_cat); + } } } - else if (s_item.has("item_id")) - { - if (is_cache_obsolete) - break; - LLPointer<LLViewerInventoryItem> inv_item = new LLViewerInventoryItem; - if( inv_item->fromLLSD(s_item) ) + const LLSD& llsd_items = inventory["items"]; + if (llsd_items.isArray()) + { + LLSD::array_const_iterator iter = llsd_items.beginArray(); + LLSD::array_const_iterator end = llsd_items.endArray(); + for (; iter != end; ++iter) { - if(inv_item->getUUID().isNull()) - { - LL_DEBUGS(LOG_INV) << "Ignoring inventory with null item id: " - << inv_item->getName() << LL_ENDL; - } - else + LLPointer<LLViewerInventoryItem> inv_item = new LLViewerInventoryItem; + if (inv_item->fromLLSD(*iter)) { - if (inv_item->getType() == LLAssetType::AT_UNKNOWN) + if (inv_item->getUUID().isNull()) { - cats_to_update.insert(inv_item->getParentUUID()); + LL_DEBUGS(LOG_INV) << "Ignoring inventory with null item id: " + << inv_item->getName() << LL_ENDL; } else { - items.push_back(inv_item); + if (inv_item->getType() == LLAssetType::AT_UNKNOWN) + { + cats_to_update.insert(inv_item->getParentUUID()); + } + else + { + items.push_back(inv_item); + } } } + + // TODO(brad) - figure out how to reenable this without breaking everything else + // static constexpr U64 BATCH_SIZE = 512U; + // if ((++lines_count % BATCH_SIZE) == 0) + // { + // // SL-19968 - make sure message system code gets a chance to run every so often + // pump_idle_startup_network(); + // } } } - -// TODO(brad) - figure out how to reenable this without breaking everything else -// static constexpr U64 BATCH_SIZE = 512U; -// if ((++lines_count % BATCH_SIZE) == 0) -// { -// // SL-19968 - make sure message system code gets a chance to run every so often -// pump_idle_startup_network(); -// } } file.close(); @@ -3476,56 +3501,56 @@ bool LLInventoryModel::saveToFile(const std::string& filename, try { - llofstream fileXML(filename.c_str()); - if (!fileXML.is_open()) + llofstream fileSD(filename.c_str(), std::ios_base::out | std::ios_base::binary); + if (!fileSD.is_open()) { LL_WARNS(LOG_INV) << "Failed to open file. Unable to save inventory to: " << filename << LL_ENDL; return false; } - - LLSD cache_ver; - cache_ver["inv_cache_version"] = sCurrentInvCacheVersion; - - if (fileXML.fail()) + U32 value_nbo = htonl(sCurrentInvCacheVersion); + fileSD.write((const char*)(&value_nbo), sizeof(U32)); + if (fileSD.fail()) { - LL_WARNS(LOG_INV) << "Failed to write cache version to file. Unable to save inventory to: " << filename << LL_ENDL; + LL_WARNS(LOG_INV) << "Failed to write cache. Unable to save inventory to: " << filename << LL_ENDL; return false; } - fileXML << LLSDOStreamer<LLSDNotationFormatter>(cache_ver) << std::endl; + LLSD inventory; + inventory["categories"] = LLSD::emptyArray(); + LLSD& cat_array = inventory["categories"]; S32 cat_count = 0; for (auto& cat : categories) { if (cat->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN) { - fileXML << LLSDOStreamer<LLSDNotationFormatter>(cat->exportLLSD()) << std::endl; + LLSD sd; + cat->exportLLSD(sd); + cat_array.append(sd); cat_count++; } - - if (fileXML.fail()) - { - LL_WARNS(LOG_INV) << "Failed to write a folder to file. Unable to save inventory to: " << filename << LL_ENDL; - return false; - } } + inventory["items"] = LLSD::emptyArray(); + LLSD& item_array = inventory["items"]; auto it_count = items.size(); for (auto& item : items) { - fileXML << LLSDOStreamer<LLSDNotationFormatter>(item->asLLSD()) << std::endl; - - if (fileXML.fail()) - { - LL_WARNS(LOG_INV) << "Failed to write an item to file. Unable to save inventory to: " << filename << LL_ENDL; - return false; - } + LLSD sd; + item->asLLSD(sd); + item_array.append(sd); + } + fileSD << LLSDOStreamer<LLSDBinaryFormatter>(inventory) << std::endl; + if (fileSD.fail()) + { + LL_WARNS(LOG_INV) << "Failed to write cache. Unable to save inventory to: " << filename << LL_ENDL; + return false; } - fileXML.flush(); + fileSD.flush(); - fileXML.close(); + fileSD.close(); - LL_INFOS(LOG_INV) << "Inventory saved: " << cat_count << " categories, " << it_count << " items." << LL_ENDL; + LL_INFOS(LOG_INV) << "Inventory saved: " << (S32)cat_count << " categories, " << (S32)it_count << " items." << LL_ENDL; } catch (...) { diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index d28743357e..2859923df9 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -122,9 +122,8 @@ public: FetchItemHttpHandler(const LLSD & request_sd); virtual ~FetchItemHttpHandler(); - protected: - FetchItemHttpHandler(const FetchItemHttpHandler &); // Not defined - void operator=(const FetchItemHttpHandler &); // Not defined + FetchItemHttpHandler(const FetchItemHttpHandler&) = delete; + FetchItemHttpHandler& operator=(const FetchItemHttpHandler&) = delete; public: virtual void onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response); @@ -489,7 +488,7 @@ public: void createNewCategory(const LLUUID& parent_id, LLFolderType::EType preferred_type, const std::string& name, - inventory_func_type callback = NULL, + inventory_func_type callback = nullptr, const LLUUID& thumbnail_id = LLUUID::null); protected: // Internal methods that add inventory and make sure that all of diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index 2cf1554957..1e5f771ba7 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -125,9 +125,8 @@ public: LLInventoryModelBackgroundFetch::instance().incrFetchCount(-1); } -protected: - BGItemHttpHandler(const BGItemHttpHandler&); // Not defined - void operator=(const BGItemHttpHandler&); // Not defined + BGItemHttpHandler(const BGItemHttpHandler&) = delete; + BGItemHttpHandler& operator=(const BGItemHttpHandler&) = delete; }; @@ -159,8 +158,8 @@ public: } protected: - BGFolderHttpHandler(const BGFolderHttpHandler&); // Not defined - void operator=(const BGFolderHttpHandler&); // Not defined + BGFolderHttpHandler(const BGFolderHttpHandler&) = delete; + BGFolderHttpHandler& operator=(const BGFolderHttpHandler&) = delete; public: virtual void onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse* response); @@ -886,31 +885,34 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis(const FetchQueueInfo& fetc static LLCachedControl<S32> ais_batch(gSavedSettings, "BatchSizeAIS3", 20); S32 batch_limit = llclamp(ais_batch(), 1, 40); - for (LLInventoryModel::cat_array_t::iterator it = categories->begin(); - it != categories->end(); - ++it) + if (categories) { - LLViewerInventoryCategory* child_cat = (*it); - if (LLViewerInventoryCategory::VERSION_UNKNOWN != child_cat->getVersion() - || child_cat->getFetching() >= target_state) + for (LLInventoryModel::cat_array_t::iterator it = categories->begin(); + it != categories->end(); + ++it) { - continue; - } + LLViewerInventoryCategory* child_cat = (*it); + if (LLViewerInventoryCategory::VERSION_UNKNOWN != child_cat->getVersion() + || child_cat->getFetching() >= target_state) + { + continue; + } - if (child_cat->getPreferredType() == LLFolderType::FT_MARKETPLACE_LISTINGS) - { - // special case, marketplace will fetch that as needed - continue; - } + if (child_cat->getPreferredType() == LLFolderType::FT_MARKETPLACE_LISTINGS) + { + // special case, marketplace will fetch that as needed + continue; + } - children.emplace_back(child_cat->getUUID()); - mExpectedFolderIds.emplace_back(child_cat->getUUID()); - child_cat->setFetching(target_state); + children.emplace_back(child_cat->getUUID()); + mExpectedFolderIds.emplace_back(child_cat->getUUID()); + child_cat->setFetching(target_state); - if (children.size() >= batch_limit) - { - content_done = false; - break; + if (children.size() >= batch_limit) + { + content_done = false; + break; + } } } @@ -940,14 +942,17 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis(const FetchQueueInfo& fetc // This will have a bit of overlap with onAISContentCalback, // but something else might have downloaded folders, so verify // every child that is complete has it's children done as well - for (LLInventoryModel::cat_array_t::iterator it = categories->begin(); - it != categories->end(); - ++it) + if (categories) { - LLViewerInventoryCategory* child_cat = (*it); - if (LLViewerInventoryCategory::VERSION_UNKNOWN != child_cat->getVersion()) + for (LLInventoryModel::cat_array_t::iterator it = categories->begin(); + it != categories->end(); + ++it) { - mFetchFolderQueue.emplace_back(child_cat->getUUID(), FT_RECURSIVE); + LLViewerInventoryCategory* child_cat = (*it); + if (LLViewerInventoryCategory::VERSION_UNKNOWN != child_cat->getVersion()) + { + mFetchFolderQueue.emplace_back(child_cat->getUUID(), FT_RECURSIVE); + } } } } @@ -998,12 +1003,15 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis(const FetchQueueInfo& fetc LLInventoryModel::cat_array_t* categories(NULL); LLInventoryModel::item_array_t* items(NULL); gInventory.getDirectDescendentsOf(cat_id, categories, items); - for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin(); - it != categories->end(); - ++it) + if (categories) { - // not emplace_front to not cause an infinite loop - mFetchFolderQueue.emplace_back((*it)->getUUID(), FT_RECURSIVE); + for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin(); + it != categories->end(); + ++it) + { + // not emplace_front to not cause an infinite loop + mFetchFolderQueue.emplace_back((*it)->getUUID(), FT_RECURSIVE); + } } } } @@ -1208,7 +1216,7 @@ void LLInventoryModelBackgroundFetch::bulkFetch() if (! url.empty()) { - LLCore::HttpHandler::ptr_t handler(new BGFolderHttpHandler(folder_request_body, recursive_cats)); + LLCore::HttpHandler::ptr_t handler = std::make_shared<BGFolderHttpHandler>(folder_request_body, recursive_cats); gInventory.requestPost(false, url, folder_request_body, handler, "Inventory Folder"); } } @@ -1219,7 +1227,7 @@ void LLInventoryModelBackgroundFetch::bulkFetch() if (! url.empty()) { - LLCore::HttpHandler::ptr_t handler(new BGFolderHttpHandler(folder_request_body_lib, recursive_cats)); + LLCore::HttpHandler::ptr_t handler = std::make_shared<BGFolderHttpHandler>(folder_request_body_lib, recursive_cats); gInventory.requestPost(false, url, folder_request_body_lib, handler, "Library Folder"); } } @@ -1235,7 +1243,7 @@ void LLInventoryModelBackgroundFetch::bulkFetch() { LLSD body; body["items"] = item_request_body; - LLCore::HttpHandler::ptr_t handler(new BGItemHttpHandler(body)); + LLCore::HttpHandler::ptr_t handler = std::make_shared<BGItemHttpHandler>(body); gInventory.requestPost(false, url, body, handler, "Inventory Item"); } } @@ -1248,7 +1256,7 @@ void LLInventoryModelBackgroundFetch::bulkFetch() { LLSD body; body["items"] = item_request_body_lib; - LLCore::HttpHandler::ptr_t handler(new BGItemHttpHandler(body)); + LLCore::HttpHandler::ptr_t handler = std::make_shared<BGItemHttpHandler>(body); gInventory.requestPost(false, url, body, handler, "Library Item"); } } @@ -1534,7 +1542,7 @@ void BGFolderHttpHandler::processFailure(LLCore::HttpStatus status, LLCore::Http { LLSD request_body; request_body["folders"] = folders; - LLCore::HttpHandler::ptr_t handler(new BGFolderHttpHandler(request_body, recursive_cats)); + LLCore::HttpHandler::ptr_t handler = std::make_shared<BGFolderHttpHandler>(request_body, recursive_cats); gInventory.requestPost(false, url, request_body, handler, "Inventory Folder"); recursive_cats.clear(); folders.clear(); @@ -1544,7 +1552,7 @@ void BGFolderHttpHandler::processFailure(LLCore::HttpStatus status, LLCore::Http LLSD request_body; request_body["folders"] = folders; - LLCore::HttpHandler::ptr_t handler(new BGFolderHttpHandler(request_body, recursive_cats)); + LLCore::HttpHandler::ptr_t handler = std::make_shared<BGFolderHttpHandler>(request_body, recursive_cats); gInventory.requestPost(false, url, request_body, handler, "Inventory Folder"); return; } diff --git a/indra/newview/llinventorymodelbackgroundfetch.h b/indra/newview/llinventorymodelbackgroundfetch.h index 2e9f69ee29..ef6fa06e9f 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.h +++ b/indra/newview/llinventorymodelbackgroundfetch.h @@ -53,7 +53,7 @@ public: void scheduleFolderFetch(const LLUUID& cat_id, bool forced = false); void scheduleItemFetch(const LLUUID& item_id, bool forced = false); - typedef boost::function<void()> nullary_func_t; + typedef std::function<void()> nullary_func_t; // AIS3 only, Fetches folder and everything links inside the folder point to // Intended for outfits void fetchFolderAndLinks(const LLUUID& cat_id, nullary_func_t callback); @@ -78,7 +78,7 @@ public: bool isBulkFetchProcessingComplete() const; void setAllFoldersFetched(); - typedef boost::function<void()> folders_fetched_callback_t; + typedef std::function<void()> folders_fetched_callback_t; boost::signals2::connection setFetchCompletionCallback(folders_fetched_callback_t cb); void addRequestAtFront(const LLUUID& id, bool recursive, bool is_category); diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp index ac791e224e..a50d6b579e 100644 --- a/indra/newview/llinventoryobserver.cpp +++ b/indra/newview/llinventoryobserver.cpp @@ -249,7 +249,7 @@ void fetch_items_from_llsd(const LLSD& items_llsd) if (!url.empty()) { body[i]["agent_id"] = gAgent.getID(); - LLCore::HttpHandler::ptr_t handler(new LLInventoryModel::FetchItemHttpHandler(body[i])); + LLCore::HttpHandler::ptr_t handler = std::make_shared<LLInventoryModel::FetchItemHttpHandler>(body[i]); gInventory.requestPost(true, url, body[i], handler, (i ? "Library Item" : "Inventory Item")); continue; } @@ -749,6 +749,13 @@ void LLInventoryCategoriesObserver::changed(U32 mask) cat_changed = true; } + bool is_favorite = category->getIsFavorite(); + if (cat_data.mIsFavorite != is_favorite) + { + cat_data.mIsFavorite = is_favorite; + cat_changed = true; + } + // If anything has changed above, fire the callback. if (cat_changed) cat_data.mCallback(); @@ -766,6 +773,7 @@ bool LLInventoryCategoriesObserver::addCategory(const LLUUID& cat_id, callback_t S32 version = LLViewerInventoryCategory::VERSION_UNKNOWN; S32 current_num_known_descendents = LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN; bool can_be_added = true; + bool favorite = false; LLUUID thumbnail_id; LLViewerInventoryCategory* category = gInventory.getCategory(cat_id); @@ -779,6 +787,7 @@ bool LLInventoryCategoriesObserver::addCategory(const LLUUID& cat_id, callback_t // to a category have been made. version = category->getVersion(); thumbnail_id = category->getThumbnailUUID(); + favorite = category->getIsFavorite(); LLInventoryModel::cat_array_t* cats; LLInventoryModel::item_array_t* items; @@ -804,11 +813,11 @@ bool LLInventoryCategoriesObserver::addCategory(const LLUUID& cat_id, callback_t if(init_name_hash) { digest_t item_name_hash = gInventory.hashDirectDescendentNames(cat_id); - mCategoryMap.insert(category_map_value_t(cat_id,LLCategoryData(cat_id, thumbnail_id, cb, version, current_num_known_descendents,item_name_hash))); + mCategoryMap.insert(category_map_value_t(cat_id,LLCategoryData(cat_id, thumbnail_id, favorite, cb, version, current_num_known_descendents,item_name_hash))); } else { - mCategoryMap.insert(category_map_value_t(cat_id,LLCategoryData(cat_id, thumbnail_id, cb, version, current_num_known_descendents))); + mCategoryMap.insert(category_map_value_t(cat_id,LLCategoryData(cat_id, thumbnail_id, favorite, cb, version, current_num_known_descendents))); } } @@ -821,25 +830,37 @@ void LLInventoryCategoriesObserver::removeCategory(const LLUUID& cat_id) } LLInventoryCategoriesObserver::LLCategoryData::LLCategoryData( - const LLUUID& cat_id, const LLUUID& thumbnail_id, callback_t cb, S32 version, S32 num_descendents) + const LLUUID& cat_id, + const LLUUID& thumbnail_id, + bool is_favorite, + callback_t cb, + S32 version, + S32 num_descendents) : mCatID(cat_id) , mCallback(cb) , mVersion(version) , mDescendentsCount(num_descendents) , mThumbnailId(thumbnail_id) + , mIsFavorite(is_favorite) , mIsNameHashInitialized(false) { } LLInventoryCategoriesObserver::LLCategoryData::LLCategoryData( - const LLUUID& cat_id, const LLUUID& thumbnail_id, callback_t cb, S32 version, S32 num_descendents, const digest_t& name_hash) + const LLUUID& cat_id, + const LLUUID& thumbnail_id, + bool is_favorite, + callback_t cb, S32 version, + S32 num_descendents, + const digest_t& name_hash) : mCatID(cat_id) , mCallback(cb) , mVersion(version) , mDescendentsCount(num_descendents) , mThumbnailId(thumbnail_id) + , mIsFavorite(is_favorite) , mIsNameHashInitialized(true) , mItemNameHash(name_hash) { diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h index 950b02d3cf..99cb9ec811 100644 --- a/indra/newview/llinventoryobserver.h +++ b/indra/newview/llinventoryobserver.h @@ -60,6 +60,7 @@ public: CREATE = 512, // With ADD, item has just been created. // unfortunately a particular message is still associated with some unique semantics. UPDATE_CREATE = 1024, // With ADD, item added via UpdateCreateInventoryItem + UPDATE_FAVORITE = 2048, // With ADD, item added via UpdateCreateInventoryItem ALL = 0xffffffff }; LLInventoryObserver(); @@ -257,7 +258,7 @@ protected: class LLInventoryCategoriesObserver : public LLInventoryObserver { public: - typedef boost::function<void()> callback_t; + typedef std::function<void()> callback_t; LLInventoryCategoriesObserver() {}; virtual void changed(U32 mask); @@ -276,12 +277,26 @@ protected: typedef LLUUID digest_t; // To clarify the actual usage of this "UUID" struct LLCategoryData { - LLCategoryData(const LLUUID& cat_id, const LLUUID& thumbnail_id, callback_t cb, S32 version, S32 num_descendents); - LLCategoryData(const LLUUID& cat_id, const LLUUID& thumbnail_id, callback_t cb, S32 version, S32 num_descendents, const digest_t& name_hash); + LLCategoryData( + const LLUUID& cat_id, + const LLUUID& thumbnail_id, + bool is_favorite, + callback_t cb, + S32 version, + S32 num_descendents); + LLCategoryData( + const LLUUID& cat_id, + const LLUUID& thumbnail_id, + bool is_favorite, + callback_t cb, + S32 version, + S32 num_descendents, + const digest_t& name_hash); callback_t mCallback; S32 mVersion; S32 mDescendentsCount; digest_t mItemNameHash; + bool mIsFavorite; bool mIsNameHashInitialized; LLUUID mCatID; LLUUID mThumbnailId; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 1795de727d..9919dd5f8f 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -55,11 +55,13 @@ #include "llviewerfoldertype.h" #include "llvoavatarself.h" +class LLInventoryFavoritesItemsPanel; class LLInventoryRecentItemsPanel; class LLAssetFilteredInventoryPanel; static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel"); static LLDefaultChildRegistry::Register<LLInventoryRecentItemsPanel> t_recent_inventory_panel("recent_inventory_panel"); +static LLDefaultChildRegistry::Register<LLInventoryFavoritesItemsPanel> t_favorites_inventory_panel("favorites_inventory_panel"); static LLDefaultChildRegistry::Register<LLAssetFilteredInventoryPanel> t_asset_filtered_inv_panel("asset_filtered_inv_panel"); const std::string LLInventoryPanel::DEFAULT_SORT_ORDER = std::string("InventorySortOrder"); @@ -111,7 +113,7 @@ protected: class LLInvPanelComplObserver : public LLInventoryCompletionObserver { public: - typedef boost::function<void()> callback_t; + typedef std::function<void()> callback_t; LLInvPanelComplObserver(callback_t cb) : mCallback(cb) @@ -186,6 +188,7 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) : mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars, this)); mCommitCallbackRegistrar.add("Inventory.FileUploadLocation", boost::bind(&LLInventoryPanel::fileUploadLocation, this, _2)); mCommitCallbackRegistrar.add("Inventory.SetFavoriteFolder", boost::bind(&LLInventoryPanel::setFavoriteFolder, this)); + mEnableCallbackRegistrar.add("Inventory.FileUploadLocation.Check", boost::bind(&LLInventoryPanel::isUploadLocationSelected, this, _2)); mCommitCallbackRegistrar.add("Inventory.OpenNewFolderWindow", boost::bind(&LLInventoryPanel::openSingleViewInventory, this, LLUUID())); } @@ -365,9 +368,28 @@ void LLInventoryPanel::initializeViewBuilding() if (mInventory->isInventoryUsable() && LLStartUp::getStartupState() <= STATE_WEARABLES_WAIT) { + LLTimer timer; // Usually this happens on login, so we have less time constraits, but too long and we can cause a disconnect const F64 max_time = 20.f; initializeViews(max_time); + + if (mViewsInitialized == VIEWS_INITIALIZED) + { + LL_INFOS("Inventory") + << "Fully initialized inventory panel " << getName() + << " with " << (S32)mItemMap.size() + << " views in " << timer.getElapsedTimeF32() << " seconds." + << LL_ENDL; + } + else + { + LL_INFOS("Inventory") + << "Partially initialized inventory panel " << getName() + << " with " << (S32)mItemMap.size() + << " views in " << timer.getElapsedTimeF32() + << " seconds. Pending known views: " << (S32)mBuildViewsQueue.size() + << LL_ENDL; + } } else { @@ -606,7 +628,7 @@ void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInve // This could be anything. For now, just refresh the item. if (mask & LLInventoryObserver::INTERNAL) { - if (view_item) + if (view_item && view_item->getViewModelItem()) { view_item->refresh(); } @@ -623,6 +645,19 @@ void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInve } } + if (mask & LLInventoryObserver::UPDATE_FAVORITE) + { + if (view_item && view_item->getViewModelItem()) + { + view_item->refresh(); + LLFolderViewFolder* parent = view_item->getParentFolder(); + if (parent) + { + parent->updateHasFavorites(get_is_favorite(model_item)); + } + } + } + // We don't typically care which of these masks the item is actually flagged with, since the masks // may not be accurate (e.g. in the main inventory panel, I move an item from My Inventory into // Landmarks; this is a STRUCTURE change for that panel but is an ADD change for the Landmarks @@ -651,6 +686,16 @@ void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInve setSelection(item_id, false); } updateFolderLabel(model_item->getParentUUID()); + + if (get_is_favorite(model_item)) + { + LLFolderViewFolder* new_parent = getFolderByID(model_item->getParentUUID()); + if (new_parent) + { + new_parent->updateHasFavorites(true); + } + } + } ////////////////////////////// @@ -664,9 +709,11 @@ void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInve { LLFolderViewModelItem* old_parent_vmi = old_parent->getViewModelItem(); LLFolderViewModelItemInventory* viewmodel_folder = static_cast<LLFolderViewModelItemInventory*>(old_parent_vmi); - LLFolderViewFolder* new_parent = (LLFolderViewFolder*)getItemByID(model_item->getParentUUID()); - // Item has been moved. - if (old_parent != new_parent) + LLFolderViewFolder* new_parent = getFolderByID(model_item->getParentUUID()); + + if (old_parent != new_parent // Item has been moved. + && (new_parent != NULL || !isInRootContent(item_id, view_item)) // item is not or shouldn't be in root content + ) { if (new_parent != NULL) { @@ -701,9 +748,21 @@ void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInve { old_parent_vmi->dirtyDescendantsFilter(); } + + if (view_item->isFavorite()) + { + if (old_parent) + { + old_parent->updateHasFavorites(false); // favorite was removed + } + if (new_parent) + { + new_parent->updateHasFavorites(true); // favorite was added + } } } } + } ////////////////////////////// // REMOVE Operation @@ -713,6 +772,7 @@ void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInve // Remove the item's UI. LLFolderViewFolder* parent = view_item->getParentFolder(); removeItemID(viewmodel_item->getUUID()); + bool was_favorite = view_item->isFavorite(); view_item->destroyView(); if(parent) { @@ -726,6 +786,10 @@ void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInve updateFolderLabel(viewmodel_folder->getUUID()); } } + if (was_favorite) + { + parent->updateHasFavorites(false); // favorite was removed + } } } } @@ -736,7 +800,7 @@ void LLInventoryPanel::modelChanged(U32 mask) { LL_PROFILE_ZONE_SCOPED; - if (mViewsInitialized != VIEWS_INITIALIZED) return; + if (mViewsInitialized != VIEWS_INITIALIZED) return; // todo: Store changes if building? const LLInventoryModel* model = getModel(); if (!model) return; @@ -843,7 +907,23 @@ void LLInventoryPanel::idle(void* user_data) bool in_visible_chain = panel->isInVisibleChain(); - if (!panel->mBuildViewsQueue.empty()) + if (!panel->mBuildRootQueue.empty()) + { + const F64 max_time = in_visible_chain ? 0.006f : 0.001f; // 6 ms + F64 curent_time = LLTimer::getTotalSeconds(); + panel->mBuildViewsEndTime = curent_time + max_time; + + while (curent_time < panel->mBuildViewsEndTime + && !panel->mBuildRootQueue.empty()) + { + LLUUID item_id = panel->mBuildRootQueue.back(); + panel->mBuildRootQueue.pop_back(); + panel->findAndInitRootContent(item_id); + + curent_time = LLTimer::getTotalSeconds(); + } + } + else if (!panel->mBuildViewsQueue.empty()) { const F64 max_time = in_visible_chain ? 0.006f : 0.001f; // 6 ms F64 curent_time = LLTimer::getTotalSeconds(); @@ -883,6 +963,11 @@ void LLInventoryPanel::idle(void* user_data) panel->mViewsInitialized = VIEWS_INITIALIZED; } } + // in case panel is empty or only has 'roots' + else if (panel->mViewsInitialized == VIEWS_BUILDING) + { + panel->mViewsInitialized = VIEWS_INITIALIZED; + } // Take into account the fact that the root folder might be invalidated if (panel->mFolderRoot.get()) @@ -925,20 +1010,9 @@ void LLInventoryPanel::initializeViews(F64 max_time) mBuildViewsEndTime = curent_time + max_time; // init everything - LLUUID root_id = getRootFolderID(); - if (root_id.notNull()) - { - buildNewViews(getRootFolderID()); - } - else - { - // Default case: always add "My Inventory" root first, "Library" root second - // If we run out of time, this still should create root folders - buildNewViews(gInventory.getRootFolderID()); // My Inventory - buildNewViews(gInventory.getLibraryRootFolderID()); // Library - } + initRootContent(); - if (mBuildViewsQueue.empty()) + if (mBuildViewsQueue.empty() && mBuildRootQueue.empty()) { mViewsInitialized = VIEWS_INITIALIZED; } @@ -969,6 +1043,22 @@ void LLInventoryPanel::initializeViews(F64 max_time) } } +void LLInventoryPanel::initRootContent() +{ + LLUUID root_id = getRootFolderID(); + if (root_id.notNull()) + { + buildNewViews(getRootFolderID()); + } + else + { + // Default case: always add "My Inventory" root first, "Library" root second + // If we run out of time, this still should create root folders + buildNewViews(gInventory.getRootFolderID()); // My Inventory + buildNewViews(gInventory.getLibraryRootFolderID()); // Library + } +} + LLFolderViewFolder * LLInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge, bool allow_drop) { @@ -1506,7 +1596,7 @@ void LLInventoryPanel::setSelection(const LLUUID& obj_id, bool take_keyboard_foc setSelectionByID(obj_id, take_keyboard_focus); } -void LLInventoryPanel::setSelectCallback(const boost::function<void (const std::deque<LLFolderViewItem*>& items, bool user_action)>& cb) +void LLInventoryPanel::setSelectCallback(const std::function<void (const std::deque<LLFolderViewItem*>& items, bool user_action)>& cb) { if (mFolderRoot.get()) { @@ -1740,26 +1830,8 @@ bool LLInventoryPanel::beginIMSession() void LLInventoryPanel::fileUploadLocation(const LLSD& userdata) { const std::string param = userdata.asString(); - if (param == "model") - { - gSavedPerAccountSettings.setString("ModelUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString()); - } - else if (param == "texture") - { - gSavedPerAccountSettings.setString("TextureUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString()); - } - else if (param == "sound") - { - gSavedPerAccountSettings.setString("SoundUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString()); - } - else if (param == "animation") - { - gSavedPerAccountSettings.setString("AnimationUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString()); - } - else if (param == "pbr_material") - { - gSavedPerAccountSettings.setString("PBRUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString()); - } + const LLUUID dest = LLFolderBridge::sSelf.get()->getUUID(); + LLInventoryAction::fileUploadLocation(dest, param); } void LLInventoryPanel::setFavoriteFolder() @@ -1767,6 +1839,13 @@ void LLInventoryPanel::setFavoriteFolder() gSavedPerAccountSettings.setString("FavoriteFolder", LLFolderBridge::sSelf.get()->getUUID().asString()); } +bool LLInventoryPanel::isUploadLocationSelected(const LLSD& userdata) +{ + const std::string param = userdata.asString(); + const LLUUID dest = LLFolderBridge::sSelf.get()->getUUID(); + return LLInventoryAction::isFileUploadLocation(dest, param); +} + void LLInventoryPanel::openSingleViewInventory(LLUUID folder_id) { LLPanelMainInventory::newFolderWindow(folder_id.isNull() ? LLFolderBridge::sSelf.get()->getUUID() : folder_id); @@ -2032,7 +2111,7 @@ void LLInventoryPanel::removeItemID(const LLUUID& id) ++it) { mItemMap.erase((*it)->getUUID()); - } +} for (LLInventoryModel::item_array_t::iterator it = items.begin(), end_it = items.end(); it != end_it; @@ -2212,6 +2291,297 @@ LLInventoryRecentItemsPanel::LLInventoryRecentItemsPanel( const Params& params) mInvFVBridgeBuilder = &RECENT_ITEMS_BUILDER; } +/************************************************************************/ +/* Favorites Inventory Panel related class */ +/************************************************************************/ +static const LLFavoritesInventoryBridgeBuilder FAVORITES_BUILDER; +class LLInventoryFavoritesItemsPanel : public LLInventoryPanel +{ +public: + struct Params : public LLInitParam::Block<Params, LLInventoryPanel::Params> + {}; + + void initFromParams(const Params& p) + { + LLInventoryPanel::initFromParams(p); + // turn off trash + getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() | (1ULL << LLFolderType::FT_TRASH)); + getFilter().setFilterNoTrashFolder(); + // turn off marketplace for favorites + getFilter().setFilterNoMarketplaceFolder(); + } + + void removeItemID(const LLUUID& id) override; + bool isInRootContent(const LLUUID& id, LLFolderViewItem* view_item) override; + bool hasPredecessorsInRootContent(const LLInventoryObject* model_item) const; + +protected: + LLInventoryFavoritesItemsPanel(const Params&); + friend class LLUICtrlFactory; + + void findAndInitRootContent(const LLUUID& folder_id) override; + void initRootContent() override; + + // removeFavorite removes item from root, does not readd favorited children if present + bool removeFavorite(const LLUUID& id, const LLInventoryObject* model_item); + void itemChanged(const LLUUID& item_id, U32 mask, const LLInventoryObject* model_item) override; + + std::set<LLUUID> mRootContentIDs; +}; + +LLInventoryFavoritesItemsPanel::LLInventoryFavoritesItemsPanel(const Params& params) + : LLInventoryPanel(params) +{ + // replace bridge builder to have necessary View bridges. + mInvFVBridgeBuilder = &FAVORITES_BUILDER; +} + +void LLInventoryFavoritesItemsPanel::removeItemID(const LLUUID& id) +{ + std::set<LLUUID>::iterator found = mRootContentIDs.find(id); + if (found != mRootContentIDs.end()) + { + mRootContentIDs.erase(found); + // check content for favorites + mBuildRootQueue.emplace_back(id); + } + + LLInventoryPanel::removeItemID(id); +} + +bool LLInventoryFavoritesItemsPanel::isInRootContent(const LLUUID& id, LLFolderViewItem* view_item) +{ + if (!view_item->isFavorite()) + { + return false; + } + + std::set<LLUUID>::iterator found = mRootContentIDs.find(id); + return found != mRootContentIDs.end(); +} + +bool LLInventoryFavoritesItemsPanel::hasPredecessorsInRootContent(const LLInventoryObject* obj) const +{ + LLUUID parent_id = obj->getParentUUID(); + while (parent_id.notNull()) + { + if (mRootContentIDs.contains(parent_id)) + { + return true; + } + LLViewerInventoryCategory* cat = mInventory->getCategory(parent_id); + if (cat) + { + parent_id = cat->getParentUUID(); + } + } + return false; +} + +void LLInventoryFavoritesItemsPanel::findAndInitRootContent(const LLUUID& id) +{ + F64 curent_time = LLTimer::getTotalSeconds(); + if (mBuildViewsEndTime < curent_time) + { + mBuildRootQueue.emplace_back(id); + return; + } + LLViewerInventoryCategory::cat_array_t* categories; + LLViewerInventoryItem::item_array_t* items; + mInventory->lockDirectDescendentArrays(id, categories, items); + + if (categories) + { + S32 count = static_cast<S32>(categories->size()); + for (S32 i = 0; i < count; ++i) + { + LLViewerInventoryCategory* cat = categories->at(i); + if (cat->getPreferredType() == LLFolderType::FT_TRASH) + { + continue; + } + else if (cat->getIsFavorite()) + { + LLFolderViewItem* folder_view_item = getItemByID(cat->getUUID()); + if (!folder_view_item) + { + const LLUUID& parent_id = cat->getParentUUID(); + mRootContentIDs.emplace(cat->getUUID()); + + buildViewsTree(cat->getUUID(), parent_id, cat, folder_view_item, mFolderRoot.get(), BUILD_TIMELIMIT); + } + } + else + { + findAndInitRootContent(cat->getUUID()); + } + } + } + + if (items) + { + S32 count = static_cast<S32>(items->size()); + for (S32 i = 0; i < count; ++i) + { + LLViewerInventoryItem* item = items->at(i); + const LLUUID item_id = item->getUUID(); + if (item->getIsFavorite() && typedViewsFilter(item_id, item)) + { + LLFolderViewItem* folder_view_item = getItemByID(id); + if (!folder_view_item) + { + const LLUUID& parent_id = item->getParentUUID(); + mRootContentIDs.emplace(item_id); + + buildViewsTree(item_id, parent_id, item, folder_view_item, mFolderRoot.get(), BUILD_TIMELIMIT); + } + } + } + } + + mInventory->unlockDirectDescendentArrays(id); +} + +void LLInventoryFavoritesItemsPanel::initRootContent() +{ + findAndInitRootContent(gInventory.getRootFolderID()); // My Inventory +} + +bool LLInventoryFavoritesItemsPanel::removeFavorite(const LLUUID& id, const LLInventoryObject* model_item) +{ + std::set<LLUUID>::iterator found = mRootContentIDs.find(id); + if (found == mRootContentIDs.end()) + { + return false; + } + + mRootContentIDs.erase(found); + + // This item is in root's content, remove item's UI. + LLFolderViewItem* view_item = getItemByID(id); + if (view_item) + { + LLFolderViewFolder* parent = view_item->getParentFolder(); + LLFolderViewModelItemInventory* viewmodel_item = static_cast<LLFolderViewModelItemInventory*>(view_item->getViewModelItem()); + if (viewmodel_item) + { + removeItemID(viewmodel_item->getUUID()); + } + bool was_favorite = view_item->isFavorite(); + view_item->destroyView(); + if (parent) + { + parent->getViewModelItem()->dirtyDescendantsFilter(); + LLFolderViewModelItemInventory* viewmodel_folder = static_cast<LLFolderViewModelItemInventory*>(parent->getViewModelItem()); + if (viewmodel_folder) + { + updateFolderLabel(viewmodel_folder->getUUID()); + } + if (was_favorite) + { + parent->updateHasFavorites(false); // favorite was removed + } + } + } + + return true; +} + +void LLInventoryFavoritesItemsPanel::itemChanged(const LLUUID& id, U32 mask, const LLInventoryObject* model_item) +{ + LLFolderViewItem* view_item = getItemByID(id); + if (!model_item && !view_item) + { + // remove operation, but item is not in panel already + return; + } + + bool handled = false; + + if (mask & (LLInventoryObserver::UPDATE_FAVORITE | + LLInventoryObserver::STRUCTURE | + LLInventoryObserver::ADD | + LLInventoryObserver::REMOVE)) + { + // specifically exlude links and not get_is_favorite(model_item) + if (model_item && model_item->getIsFavorite()) + { + if (!view_item) + { + const LLViewerInventoryCategory* cat = dynamic_cast<const LLViewerInventoryCategory*>(model_item); + if (cat) + { + // New favorite folder + if (cat->getPreferredType() != LLFolderType::FT_TRASH) + { + // If any descendants were in the list, remove them + // Todo: Consider implementing and checking hasFavorites to save on search + LLFavoritesCollector is_favorite; + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + gInventory.collectDescendentsIf(id, cat_array, item_array, false, is_favorite); + for (LLInventoryModel::cat_array_t::const_iterator it = cat_array.begin(); it != cat_array.end(); ++it) + { + removeFavorite((*it)->getUUID(), *it); + } + for (LLInventoryModel::item_array_t::const_iterator it = item_array.begin(); it != item_array.end(); ++it) + { + removeFavorite((*it)->getUUID(), *it); + } + + LLFolderViewItem* folder_view_item = getItemByID(cat->getUUID()); + if (!folder_view_item + && !hasPredecessorsInRootContent(model_item)) + { + const LLUUID& parent_id = cat->getParentUUID(); + mRootContentIDs.emplace(cat->getUUID()); + + buildViewsTree(cat->getUUID(), parent_id, cat, folder_view_item, mFolderRoot.get(), BUILD_ONE_FOLDER); + } + } + } + else + { + // New favorite item + if (model_item->getIsFavorite() + && typedViewsFilter(id, model_item) + && !hasPredecessorsInRootContent(model_item)) + { + const LLUUID& parent_id = model_item->getParentUUID(); + mRootContentIDs.emplace(id); + + buildViewsTree(id, parent_id, model_item, NULL, mFolderRoot.get(), BUILD_ONE_FOLDER); + } + } + handled = true; + } + } + else + { + handled = removeFavorite(id, model_item); + if (handled) + { + const LLViewerInventoryCategory* cat = dynamic_cast<const LLViewerInventoryCategory*>(model_item); + // Todo: Consider implementing and checking hasFavorites to save on search + if (cat) + { + // re-add any favorited children + mBuildRootQueue.emplace_back(id); + } + } + } + } + + if (!handled + && (!model_item || model_item->getParentUUID().notNull())) // filter out 'My inventory' + { + LLInventoryPanel::itemChanged(id, mask, model_item); + } +} +/************************************************************************/ +/* LLInventorySingleFolderPanel */ +/************************************************************************/ + static LLDefaultChildRegistry::Register<LLInventorySingleFolderPanel> t_single_folder_inventory_panel("single_folder_inventory_panel"); LLInventorySingleFolderPanel::LLInventorySingleFolderPanel(const Params& params) @@ -2398,7 +2768,7 @@ void LLInventorySingleFolderPanel::updateSingleFolderRoot() mFolderRoot.get()->setFollowsAll(); mFolderRoot.get()->addChild(mFolderRoot.get()->mStatusTextBox); - if (!mSelectionCallback.empty()) + if (mSelectionCallback != nullptr) { mFolderRoot.get()->setSelectCallback(mSelectionCallback); } diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index ab17196e5f..644e0a1855 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -37,6 +37,7 @@ #include "llinventorymodel.h" #include "llscrollcontainer.h" #include "lluictrlfactory.h" +#include <functional> #include <set> class LLInvFVBridge; @@ -182,7 +183,7 @@ public: // Call this method to set the selection. void openAllFolders(); void setSelection(const LLUUID& obj_id, bool take_keyboard_focus); - void setSelectCallback(const boost::function<void (const std::deque<LLFolderViewItem*>& items, bool user_action)>& cb); + void setSelectCallback(const std::function<void (const std::deque<LLFolderViewItem*>& items, bool user_action)>& cb); void clearSelection(); selected_items_t getSelectedItems() const; @@ -226,6 +227,7 @@ public: bool beginIMSession(); void fileUploadLocation(const LLSD& userdata); void setFavoriteFolder(); + bool isUploadLocationSelected(const LLSD& userdata); void openSingleViewInventory(LLUUID folder_id = LLUUID()); void purgeSelectedItems(); bool attachObject(const LLSD& userdata); @@ -252,7 +254,8 @@ public: bool reset_filter = false); static void setSFViewAndOpenFolder(const LLInventoryPanel* panel, const LLUUID& folder_id); void addItemID(const LLUUID& id, LLFolderViewItem* itemp); - void removeItemID(const LLUUID& id); + virtual void removeItemID(const LLUUID& id); + virtual bool isInRootContent(const LLUUID& id, LLFolderViewItem* view_item) { return false; } LLFolderViewItem* getItemByID(const LLUUID& id); LLFolderViewFolder* getFolderByID(const LLUUID& id); void setSelectionByID(const LLUUID& obj_id, bool take_keyboard_focus); @@ -335,6 +338,8 @@ public: protected: // Builds the UI. Call this once the inventory is usable. void initializeViews(F64 max_time); + virtual void initRootContent(); + virtual void findAndInitRootContent(const LLUUID& root_id) {}; // Specific inventory colors static bool sColorSetInitialized; @@ -371,8 +376,8 @@ protected: virtual LLFolderViewFolder* createFolderViewFolder(LLInvFVBridge * bridge, bool allow_drop); virtual LLFolderViewItem* createFolderViewItem(LLInvFVBridge * bridge); - boost::function<void(const std::deque<LLFolderViewItem*>& items, bool user_action)> mSelectionCallback; -private: + std::function<void(const std::deque<LLFolderViewItem*>& items, bool user_action)> mSelectionCallback; + // buildViewsTree does not include some checks and is meant // for recursive use, use buildNewViews() for first call LLFolderViewItem* buildViewsTree(const LLUUID& id, @@ -395,6 +400,8 @@ private: EViewsInitializationState mViewsInitialized; // Whether views have been generated F64 mBuildViewsEndTime; // Stop building views past this timestamp std::deque<LLUUID> mBuildViewsQueue; + std::deque<LLUUID> mBuildRootQueue; + }; @@ -431,7 +438,7 @@ public: std::list<LLUUID> getNavBackwardList() { return mBackwardFolders; } std::list<LLUUID> getNavForwardList() { return mForwardFolders; } - typedef boost::function<void()> root_changed_callback_t; + typedef std::function<void()> root_changed_callback_t; boost::signals2::connection setRootChangedCallback(root_changed_callback_t cb); protected: diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp index 73425e9f4c..9b90e41549 100644 --- a/indra/newview/lllandmarkactions.cpp +++ b/indra/newview/lllandmarkactions.cpp @@ -80,6 +80,40 @@ public: } }; +class LLFetchFirstLandmarkByPos : public LLInventoryCollectFunctor +{ +private: + LLVector3d mPos; + bool mFound = false; +public: + LLFetchFirstLandmarkByPos(const LLVector3d& pos) : + mPos(pos), mFound(false) + { + } + + /*virtual*/ bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) + { + if (mFound || !item || item->getType() != LLAssetType::AT_LANDMARK) + return false; + + LLLandmark* landmark = gLandmarkList.getAsset(item->getAssetUUID()); + if (!landmark) // the landmark not been loaded yet + return false; + + LLVector3d landmark_global_pos; + if (!landmark->getGlobalPos(landmark_global_pos)) + return false; + //we have to round off each coordinates to compare positions properly + mFound = ll_round(mPos.mdV[VX]) == ll_round(landmark_global_pos.mdV[VX]) + && ll_round(mPos.mdV[VY]) == ll_round(landmark_global_pos.mdV[VY]) + && ll_round(mPos.mdV[VZ]) == ll_round(landmark_global_pos.mdV[VZ]); + return mFound; + } + + // only care about first found landmark, so stop when found + /*virtual*/ bool exceedsLimit() { return mFound; } +}; + class LLFetchLandmarksByName : public LLInventoryCollectFunctor { private: @@ -155,6 +189,9 @@ public: mFounded = LLViewerParcelMgr::getInstance()->inAgentParcel(landmark_global_pos); return mFounded; } + + // only care about first found landmark, so stop when found + /*virtual*/ bool exceedsLimit() { return mFounded; } }; static void fetch_landmarks(LLInventoryModel::cat_array_t& cats, @@ -197,23 +234,61 @@ bool LLLandmarkActions::landmarkAlreadyExists() //static bool LLLandmarkActions::hasParcelLandmark() { + static LLUUID sLastItemID; + static S32 sLastFrame = -1; + if (sLastItemID.notNull()) + { + LLInventoryItem* item = gInventory.getItem(sLastItemID); + if (item) + { + LLLandmark* landmark = gLandmarkList.getAsset(item->getAssetUUID()); + if (landmark) + { + LLVector3d landmark_global_pos; + if (landmark->getGlobalPos(landmark_global_pos) + && LLViewerParcelMgr::getInstance()->inAgentParcel(landmark_global_pos)) + { + return true; + } + } + } + // Cached landmark does not match current parcel anymore, + // repeat inventory search to find a replacement landmark + // or to make sure there are none. + sLastItemID.setNull(); + sLastFrame = -1; + } + + if (sLastFrame == LLFrameTimer::getFrameCount()) + { + // Ideally this should also check parcel change and landmark additions, + // not just frame change. + // But should be sufficient to check only frame as this is used + // after inventory and parcel operations. + return false; + } + sLastFrame = LLFrameTimer::getFrameCount(); + LLFirstAgentParcelLandmark get_first_agent_landmark; LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; fetch_landmarks(cats, items, get_first_agent_landmark); - return !items.empty(); - + if (!items.empty()) + { + sLastItemID = items[0]->getUUID(); + return true; + } + return false; } -// *TODO: This could be made more efficient by only fetching the FIRST -// landmark that meets the criteria LLViewerInventoryItem* LLLandmarkActions::findLandmarkForGlobalPos(const LLVector3d &pos) { // Determine whether there are landmarks pointing to the current parcel. + // Will stop after first found landmark. LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; - LLFetchlLandmarkByPos is_current_pos_landmark(pos); - fetch_landmarks(cats, items, is_current_pos_landmark); + LLFetchFirstLandmarkByPos get_landmark_from_pos(pos); + fetch_landmarks(cats, items, get_landmark_from_pos); if(items.empty()) { @@ -385,12 +460,24 @@ void LLLandmarkActions::copySLURLtoClipboard(const LLUUID& landmarkInventoryItem { LLVector3d global_pos; landmark->getGlobalPos(global_pos); - LLLandmarkActions::getSLURLfromPosGlobal(global_pos,©_slurl_to_clipboard_callback,true); + if (!global_pos.isExactlyZero()) + { + LLLandmarkActions::getSLURLfromPosGlobal(global_pos, ©_slurl_to_clipboard_callback, true); + } + else + { + LLNotificationsUtil::add("LandmarkLocationUnknown"); + } } } void copy_slurl_to_clipboard_callback(const std::string& slurl) { + if (slurl.empty()) + { + LLNotificationsUtil::add("LandmarkLocationUnknown"); + return; + } gViewerWindow->getWindow()->copyTextToClipboard(utf8str_to_wstring(slurl)); LLSD args; args["SLURL"] = slurl; diff --git a/indra/newview/lllandmarkactions.h b/indra/newview/lllandmarkactions.h index 1abf10e110..0996dfed29 100644 --- a/indra/newview/lllandmarkactions.h +++ b/indra/newview/lllandmarkactions.h @@ -39,8 +39,8 @@ class LLLandmark; class LLLandmarkActions { public: - typedef boost::function<void(std::string& slurl)> slurl_callback_t; - typedef boost::function<void(std::string& slurl, S32 x, S32 y, S32 z)> region_name_and_coords_callback_t; + typedef std::function<void(std::string& slurl)> slurl_callback_t; + typedef std::function<void(std::string& slurl, S32 x, S32 y, S32 z)> region_name_and_coords_callback_t; /** * @brief Fetches landmark LLViewerInventoryItems for the given landmark name. @@ -107,7 +107,7 @@ public: * * @return pointer to loaded landmark from gLandmarkList or NULL if landmark does not exist or wasn't loaded. */ - static LLLandmark* getLandmark(const LLUUID& landmarkInventoryItemID, LLLandmarkList::loaded_callback_t cb = NULL); + static LLLandmark* getLandmark(const LLUUID& landmarkInventoryItemID, LLLandmarkList::loaded_callback_t cb = nullptr); /** * @brief Performs standard action of copying of SLURL from landmark to user's clipboard. diff --git a/indra/newview/lllandmarklist.cpp b/indra/newview/lllandmarklist.cpp index 3fa0ab99f3..b25a42a938 100644 --- a/indra/newview/lllandmarklist.cpp +++ b/indra/newview/lllandmarklist.cpp @@ -147,29 +147,66 @@ void LLLandmarkList::processGetAssetReply( else { // failed to parse, shouldn't happen + LL_WARNS("Landmarks") << "Failed to parse landmark " << uuid << LL_ENDL; gLandmarkList.eraseCallbacks(uuid); } } else { // got a good status, but no file, shouldn't happen + LL_WARNS("Landmarks") << "Empty buffer for landmark " << uuid << LL_ENDL; gLandmarkList.eraseCallbacks(uuid); } + + // We got this asset, remove it from retry and bad lists. + gLandmarkList.mRetryList.erase(uuid); + gLandmarkList.mBadList.erase(uuid); } else { - // SJB: No use case for a notification here. Use LL_DEBUGS() instead - if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status ) + if (LL_ERR_NO_CAP == status) + { + // A problem with asset cap, always allow retrying. + // Todo: should this reschedule? + gLandmarkList.mRequestedList.erase(uuid); + gLandmarkList.eraseCallbacks(uuid); + // If there was a previous request, it likely failed due to an obsolete cap + // so clear the retry marker to allow multiple retries. + gLandmarkList.mRetryList.erase(uuid); + return; + } + if (gLandmarkList.mBadList.find(uuid) != gLandmarkList.mBadList.end()) + { + // Already on the 'bad' list, ignore + gLandmarkList.mRequestedList.erase(uuid); + gLandmarkList.eraseCallbacks(uuid); + return; + } + if (LL_ERR_ASSET_REQUEST_FAILED == status + && gLandmarkList.mRetryList.find(uuid) == gLandmarkList.mRetryList.end()) + { + // There is a number of reasons why an asset request can fail, + // like a cap being obsolete due to user teleporting. + // Let viewer rerequest at least once more. + // Todo: should this reshchedule? + gLandmarkList.mRetryList.emplace(uuid); + gLandmarkList.mRequestedList.erase(uuid); + gLandmarkList.eraseCallbacks(uuid); + return; + } + + if (LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status) { - LL_WARNS("Landmarks") << "Missing Landmark" << LL_ENDL; - //LLNotificationsUtil::add("LandmarkMissing"); + LL_WARNS("Landmarks") << "Missing Landmark " << uuid << LL_ENDL; } else { - LL_WARNS("Landmarks") << "Unable to load Landmark" << LL_ENDL; - //LLNotificationsUtil::add("UnableToLoadLandmark"); + LL_WARNS("Landmarks") << "Unable to load Landmark " << uuid + << ". asset status: " << status + << ". Extended status: " << (S64)ext_status << LL_ENDL; } + gLandmarkList.mRetryList.erase(uuid); gLandmarkList.mBadList.insert(uuid); gLandmarkList.mRequestedList.erase(uuid); //mBadList effectively blocks any load, so no point keeping id in requests gLandmarkList.eraseCallbacks(uuid); diff --git a/indra/newview/lllandmarklist.h b/indra/newview/lllandmarklist.h index 508148abde..76b5b97211 100644 --- a/indra/newview/lllandmarklist.h +++ b/indra/newview/lllandmarklist.h @@ -27,7 +27,7 @@ #ifndef LL_LLLANDMARKLIST_H #define LL_LLLANDMARKLIST_H -#include <boost/function.hpp> +#include <functional> #include <map> #include "lllandmark.h" #include "lluuid.h" @@ -40,7 +40,7 @@ class LLInventoryItem; class LLLandmarkList { public: - typedef boost::function<void(LLLandmark*)> loaded_callback_t; + typedef std::function<void(LLLandmark*)> loaded_callback_t; LLLandmarkList() {} ~LLLandmarkList(); @@ -50,7 +50,7 @@ public: //const LLLandmark* getNext() { return mList.getNextData(); } bool assetExists(const LLUUID& asset_uuid); - LLLandmark* getAsset(const LLUUID& asset_uuid, loaded_callback_t cb = NULL); + LLLandmark* getAsset(const LLUUID& asset_uuid, loaded_callback_t cb = nullptr); static void processGetAssetReply( const LLUUID& uuid, LLAssetType::EType type, @@ -72,6 +72,7 @@ protected: typedef std::set<LLUUID> landmark_uuid_list_t; landmark_uuid_list_t mBadList; + landmark_uuid_list_t mRetryList; typedef std::map<LLUUID,F32> landmark_requested_list_t; landmark_requested_list_t mRequestedList; diff --git a/indra/newview/lllistcontextmenu.h b/indra/newview/lllistcontextmenu.h index 4b515a3b26..cb2ca5260f 100644 --- a/indra/newview/lllistcontextmenu.h +++ b/indra/newview/lllistcontextmenu.h @@ -63,7 +63,7 @@ public: virtual void hide(); protected: - typedef boost::function<void (const LLUUID& id)> functor_t; + typedef std::function<void (const LLUUID& id)> functor_t; virtual LLContextMenu* createMenu() = 0; diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp index 31c9eb8966..6e56aac270 100644 --- a/indra/newview/lllocalbitmaps.cpp +++ b/indra/newview/lllocalbitmaps.cpp @@ -38,6 +38,7 @@ /* image compression headers. */ #include "llimagebmp.h" #include "llimagetga.h" +#include "llimagej2c.h" #include "llimagejpeg.h" #include "llimagepng.h" @@ -106,6 +107,10 @@ LLLocalBitmap::LLLocalBitmap(std::string filename) { mExtension = ET_IMG_JPG; } + else if (temp_exten == "j2c" || temp_exten == "jp2") + { + mExtension = ET_IMG_J2C; + } else if (temp_exten == "png") { mExtension = ET_IMG_PNG; @@ -191,7 +196,7 @@ bool LLLocalBitmap::updateSelf(EUpdateType optional_firstupdate) #ifndef LL_WINDOWS const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(mFilename)); #else - const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(utf8str_to_utf16str(mFilename))); + const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(ll_convert<std::wstring>(mFilename))); #endif LLSD new_last_modified = asctime(localtime(&temp_time)); @@ -214,7 +219,10 @@ bool LLLocalBitmap::updateSelf(EUpdateType optional_firstupdate) LLPointer<LLViewerFetchedTexture> texture = new LLViewerFetchedTexture ("file://"+mFilename, FTT_LOCAL_FILE, mWorldID, LL_LOCAL_USE_MIPMAPS); - texture->createGLTexture(LL_LOCAL_DISCARD_LEVEL, raw_image); + if (!texture->createGLTexture(LL_LOCAL_DISCARD_LEVEL, raw_image)) + { + LL_WARNS() << "Failed to create GL texture for local bitmap: " << mFilename << " " << mWorldID << LL_ENDL; + } texture->ref(); gTextureList.addImage(texture, TEX_LIST_STANDARD); @@ -293,8 +301,9 @@ void LLLocalBitmap::addGLTFMaterial(LLGLTFMaterial* mat) return; } - mat_list_t::iterator end = mGLTFMaterialWithLocalTextures.end(); - for (mat_list_t::iterator it = mGLTFMaterialWithLocalTextures.begin(); it != end;) + mat->addLocalTextureTracking(getTrackingID(), getWorldID()); + + for (mat_list_t::iterator it = mGLTFMaterialWithLocalTextures.begin(); it != mGLTFMaterialWithLocalTextures.end();) { if (it->get() == mat) { @@ -304,15 +313,12 @@ void LLLocalBitmap::addGLTFMaterial(LLGLTFMaterial* mat) if ((*it)->getNumRefs() == 1) { it = mGLTFMaterialWithLocalTextures.erase(it); - end = mGLTFMaterialWithLocalTextures.end(); } else { it++; } } - - mat->addLocalTextureTracking(getTrackingID(), getWorldID()); mGLTFMaterialWithLocalTextures.push_back(mat); } @@ -356,6 +362,21 @@ bool LLLocalBitmap::decodeBitmap(LLPointer<LLImageRaw> rawimg) break; } + case ET_IMG_J2C: + { + LLPointer<LLImageJ2C> jpeg_image = new LLImageJ2C; + if (jpeg_image->load(mFilename)) + { + jpeg_image->setDiscardLevel(0); + if (jpeg_image->decode(rawimg, 0.0f)) + { + rawimg->biasedScaleToPowerOfTwo(LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT); + decode_successful = true; + } + } + break; + } + case ET_IMG_PNG: { LLPointer<LLImagePNG> png_image = new LLImagePNG; @@ -628,16 +649,16 @@ void LLLocalBitmap::updateUserLayers(LLUUID old_id, LLUUID new_id, LLWearableTyp void LLLocalBitmap::updateGLTFMaterials(LLUUID old_id, LLUUID new_id) { // Might be a better idea to hold this in LLGLTFMaterialList - mat_list_t::iterator end = mGLTFMaterialWithLocalTextures.end(); - for (mat_list_t::iterator it = mGLTFMaterialWithLocalTextures.begin(); it != end;) + for (mat_list_t::iterator it = mGLTFMaterialWithLocalTextures.begin(); it != mGLTFMaterialWithLocalTextures.end();) { if ((*it)->getNumRefs() == 1) { // render and override materials are often recreated, // clean up any remains it = mGLTFMaterialWithLocalTextures.erase(it); - end = mGLTFMaterialWithLocalTextures.end(); } + // Render material consists of base and override materials, make sure replaceLocalTexture + // gets called for base and override before applyOverride else if ((*it)->replaceLocalTexture(mTrackingID, old_id, new_id)) { it++; @@ -647,43 +668,51 @@ void LLLocalBitmap::updateGLTFMaterials(LLUUID old_id, LLUUID new_id) // Matching id not found, no longer in use // material would clean itself, remove from the list it = mGLTFMaterialWithLocalTextures.erase(it); - end = mGLTFMaterialWithLocalTextures.end(); } } - // Render material consists of base and override materials, make sure replaceLocalTexture - // gets called for base and override before applyOverride - end = mGLTFMaterialWithLocalTextures.end(); - for (mat_list_t::iterator it = mGLTFMaterialWithLocalTextures.begin(); it != end;) + // Updating render materials calls updateTextureTracking which can modify + // mGLTFMaterialWithLocalTextures, so precollect all entries that need to be updated + std::set<LLTextureEntry*> update_entries; + for (LLGLTFMaterial* mat : mGLTFMaterialWithLocalTextures) { - LLFetchedGLTFMaterial* fetched_mat = dynamic_cast<LLFetchedGLTFMaterial*>((*it).get()); + // mGLTFMaterialWithLocalTextures includes overrides that are not 'fetched' + // and don't have texture entries (they don't need to since render material does). + LLFetchedGLTFMaterial* fetched_mat = dynamic_cast<LLFetchedGLTFMaterial*>(mat); if (fetched_mat) { for (LLTextureEntry* entry : fetched_mat->mTextureEntires) { - // Normally a change in applied material id is supposed to - // drop overrides thus reset material, but local materials - // currently reuse their existing asset id, and purpose is - // to preview how material will work in-world, overrides - // included, so do an override to render update instead. - LLGLTFMaterial* override_mat = entry->getGLTFMaterialOverride(); - if (override_mat) - { - // do not create a new material, reuse existing pointer - LLFetchedGLTFMaterial* render_mat = dynamic_cast<LLFetchedGLTFMaterial*>(entry->getGLTFRenderMaterial()); - if (render_mat) - { - *render_mat = *fetched_mat; - render_mat->applyOverride(*override_mat); - } - else - { - LL_WARNS_ONCE() << "Failed to apply local material override, render material not found" << LL_ENDL; - } - } + update_entries.insert(entry); + } + } + } + + + for (LLTextureEntry* entry : update_entries) + { + // Normally a change in applied material id is supposed to + // drop overrides thus reset material, but local materials + // currently reuse their existing asset id, and purpose is + // to preview how material will work in-world, overrides + // included, so do an override to render update instead. + LLGLTFMaterial* override_mat = entry->getGLTFMaterialOverride(); + LLGLTFMaterial* mat = entry->getGLTFMaterial(); + if (override_mat && mat) + { + // do not create a new material, reuse existing pointer + // so that mTextureEntires remains untouched + LLGLTFMaterial* render_mat = entry->getGLTFRenderMaterial(); + if (render_mat && render_mat != mat) + { + *render_mat = *mat; + render_mat->applyOverride(*override_mat); // can update mGLTFMaterialWithLocalTextures + } + else + { + LL_WARNS() << "A TE had an override, but no render material" << LL_ENDL; } } - ++it; } } diff --git a/indra/newview/lllocalbitmaps.h b/indra/newview/lllocalbitmaps.h index e169f96e70..6c9d65e3b6 100644 --- a/indra/newview/lllocalbitmaps.h +++ b/indra/newview/lllocalbitmaps.h @@ -89,6 +89,7 @@ class LLLocalBitmap ET_IMG_BMP, ET_IMG_TGA, ET_IMG_JPG, + ET_IMG_J2C, ET_IMG_PNG }; @@ -106,7 +107,7 @@ class LLLocalBitmap // Store a list of accosiated materials // Might be a better idea to hold this in LLGLTFMaterialList - typedef std::vector<LLPointer<LLGLTFMaterial> > mat_list_t; + typedef std::list<LLPointer<LLGLTFMaterial> > mat_list_t; mat_list_t mGLTFMaterialWithLocalTextures; }; diff --git a/indra/newview/lllocalgltfmaterials.cpp b/indra/newview/lllocalgltfmaterials.cpp index fab18f2d26..d6facad23d 100644 --- a/indra/newview/lllocalgltfmaterials.cpp +++ b/indra/newview/lllocalgltfmaterials.cpp @@ -134,7 +134,7 @@ bool LLLocalGLTFMaterial::updateSelf() #ifndef LL_WINDOWS const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(mFilename)); #else - const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(utf8str_to_utf16str(mFilename))); + const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(ll_convert<std::wstring>(mFilename))); #endif LLSD new_last_modified = asctime(localtime(&temp_time)); diff --git a/indra/newview/lllocationhistory.h b/indra/newview/lllocationhistory.h index ca9b81457c..34cb83367f 100644 --- a/indra/newview/lllocationhistory.h +++ b/indra/newview/lllocationhistory.h @@ -29,10 +29,9 @@ #include "llsingleton.h" // for LLSingleton +#include <functional> #include <vector> #include <string> -#include <map> -#include <boost/function.hpp> #include <boost/signals2.hpp> class LLSD; @@ -115,7 +114,7 @@ public: }; typedef std::vector<LLLocationHistoryItem> location_list_t; - typedef boost::function<void(EChangeType event)> history_changed_callback_t; + typedef std::function<void(EChangeType event)> history_changed_callback_t; typedef boost::signals2::signal<void(EChangeType event)> history_changed_signal_t; diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 1db7bd978c..1a07efe25d 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -32,6 +32,8 @@ #include "lllogchat.h" #include "llregex.h" #include "lltrans.h" +#include "llurlaction.h" +#include "llurlentry.h" #include "llviewercontrol.h" #include "lldiriterator.h" @@ -78,8 +80,8 @@ const static std::string MULTI_LINE_PREFIX(" "); * * Note: "You" was used as an avatar names in viewers of previous versions */ -const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}\\]\\s+|\\[\\d{1,2}:\\d{2}\\]\\s+)?(.*)$"); -const static boost::regex TIMESTAMP("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}\\]|\\[\\d{1,2}:\\d{2}\\]).*"); +const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}:\\d{2}\\s[AaPp][Mm]\\]\\s+|\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}:\\d{2}\\]\\s+|\\[\\d{1,2}:\\d{2}:\\d{2}\\s[AaPp][Mm]\\]\\s+|\\[\\d{1,2}:\\d{2}\\]\\s+)?(.*)$"); +const static boost::regex TIMESTAMP("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}(\\s[AaPp][Mm])?\\]|\\[\\d{1,2}:\\d{2}(\\s[AaPp][Mm])?\\]).*"); /** * Regular expression suitable to match names like @@ -150,6 +152,10 @@ public: void checkAndCutOffDate(std::string& time_str) { + if (time_str.size() < 10) // not enough space for a date + { + return; + } // Cuts off the "%Y/%m/%d" from string for todays timestamps. // Assume that passed string has at least "%H:%M" time format. date log_date(not_a_date_time); @@ -166,20 +172,12 @@ public: if ( days_alive == zero_days ) { - // Yep, today's so strip "%Y/%m/%d" info - ptime stripped_time(not_a_date_time); - - mTimeStream.str(LLStringUtil::null); - mTimeStream << time_str; - mTimeStream >> stripped_time; - mTimeStream.clear(); - - time_str.clear(); - - mTimeStream.str(LLStringUtil::null); - mTimeStream << stripped_time; - mTimeStream >> time_str; - mTimeStream.clear(); + size_t pos = time_str.find_first_of(' '); + if (pos != std::string::npos) + { + time_str.erase(0, pos + 1); + LLStringUtil::trim(time_str); + } } LL_DEBUGS("LLChatLogParser") @@ -308,18 +306,24 @@ std::string LLLogChat::timestamp2LogString(U32 timestamp, bool withdate) std::string timeStr; if (withdate) { - timeStr = "[" + LLTrans::getString ("TimeYear") + "]/[" - + LLTrans::getString ("TimeMonth") + "]/[" - + LLTrans::getString ("TimeDay") + "] [" - + LLTrans::getString ("TimeHour") + "]:[" - + LLTrans::getString ("TimeMin") + "]:[" - + LLTrans::getString ("TimeSec") + "]"; + timeStr = "[" + LLTrans::getString("TimeYear") + "]/[" + + LLTrans::getString("TimeMonth") + "]/[" + + LLTrans::getString("TimeDay") + "] "; + } + + static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); + if (use_24h) + { + timeStr += "[" + LLTrans::getString("TimeHour") + "]:[" + + LLTrans::getString("TimeMin") + "]:[" + + LLTrans::getString("TimeSec") + "]"; } else { - timeStr = "[" + LLTrans::getString("TimeHour") + "]:[" - + LLTrans::getString ("TimeMin")+"]:[" - + LLTrans::getString ("TimeSec")+"]"; + timeStr += "[" + LLTrans::getString("TimeHour12") + "]:[" + + LLTrans::getString("TimeMin") + "]:[" + + LLTrans::getString("TimeSec") + "] [" + + LLTrans::getString("TimeAMPM") + "]"; } LLSD substitution; @@ -360,13 +364,29 @@ void LLLogChat::saveHistory(const std::string& filename, return; } + std::string altered_line = line; + + // avoid costly regex calls + if (line.find("/mention") != std::string::npos) + { + static const boost::regex mention_regex(APP_HEADER_REGEX "/agent/[\\da-f-]+/mention", boost::regex::perl | boost::regex::icase); + + // replace mention URL with [@username](URL) + altered_line = boost::regex_replace(line, mention_regex, [](const boost::smatch& match) -> std::string + { + std::string url = match[0].str(); + std::string username = LLUrlAction::getURLLabel(url); + return "[" + username + "](" + url + ")"; + }); + } + LLSD item; if (gSavedPerAccountSettings.getBOOL("LogTimestamp")) item["time"] = LLLogChat::timestamp2LogString(0, gSavedPerAccountSettings.getBOOL("LogTimestampDate")); item["from_id"] = from_id; - item["message"] = line; + item["message"] = altered_line; //adding "Second Life:" for all system messages to make chat log history parsing more reliable if (from.empty() && from_id.isNull()) @@ -434,8 +454,8 @@ void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& m } // If we got here, we managed to stat the file. - // Open the file to read - LLFILE* fptr = LLFile::fopen(log_file_name, "r"); /*Flawfinder: ignore*/ + // Open the file to read in binary mode to prevent interpreting other characters as EOF + LLFILE* fptr = LLFile::fopen(log_file_name, "rb"); /*Flawfinder: ignore*/ if (!fptr) { // Ok, this is strange but not really tragic in the big picture of things LL_WARNS("ChatHistory") << "Unable to read file " << log_file_name << " after stat was successful" << LL_ENDL; @@ -472,6 +492,19 @@ void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& m std::string line(remove_utf8_bom(buffer)); + + // fast heuristic test for a mention URL in a string + // this is used to avoid costly regex calls + if (line.find("/mention)") != std::string::npos) + { + // restore original mention URL from [@username](URL) format + static const boost::regex altered_mention_regex("\\[@([^\\]]+)\\]\\((" APP_HEADER_REGEX "/agent/[\\da-f-]+/mention)\\)", + boost::regex::perl | boost::regex::icase); + + // $2 captures the URL part + line = boost::regex_replace(line, altered_mention_regex, "$2"); + } + //updated 1.23 plain text log format requires a space added before subsequent lines in a multilined message if (' ' == line[0]) { @@ -894,6 +927,11 @@ bool LLLogChat::isTranscriptFileFound(std::string fullname) return result; } +std::string LLLogChat::getGroupChatSuffix() +{ + return GROUP_CHAT_SUFFIX; +} + //*TODO mark object's names in a special way so that they will be distinguishable form avatar name //which are more strict by its nature (only firstname and secondname) //Example, an object's name can be written like "Object <actual_object's_name>" @@ -1147,7 +1185,7 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LL } bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false; - LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/ + LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "rb");/*Flawfinder: ignore*/ if (!fptr) { @@ -1156,17 +1194,17 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LL { std::string old_name(file_name); old_name.erase(old_name.size() - GROUP_CHAT_SUFFIX.size()); - fptr = LLFile::fopen(LLLogChat::makeLogFileName(old_name), "r"); + fptr = LLFile::fopen(LLLogChat::makeLogFileName(old_name), "rb"); if (fptr) { fclose(fptr); LLFile::copy(LLLogChat::makeLogFileName(old_name), LLLogChat::makeLogFileName(file_name)); } - fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r"); + fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "rb"); } if (!fptr) { - fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/ + fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "rb");/*Flawfinder: ignore*/ if (!fptr) { mNewLoad = false; diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h index dbbd8ae1ba..39c40b985e 100644 --- a/indra/newview/lllogchat.h +++ b/indra/newview/lllogchat.h @@ -127,6 +127,8 @@ public: static bool isAdHocTranscriptExist(std::string file_name); static bool isTranscriptFileFound(std::string fullname); + static std::string getGroupChatSuffix(); + bool historyThreadsFinished(LLUUID session_id); LLLoadHistoryThread* getLoadHistoryThread(LLUUID session_id); LLDeleteHistoryThread* getDeleteHistoryThread(LLUUID session_id); diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index cbc3744aa3..e9d68723d3 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -62,7 +62,7 @@ const S32 LOGIN_MAX_RETRIES = 0; // Viewer should not autmatically retry login const F32 LOGIN_SRV_TIMEOUT_MIN = 10; -const F32 LOGIN_SRV_TIMEOUT_MAX = 120; +const F32 LOGIN_SRV_TIMEOUT_MAX = 180; const F32 LOGIN_DNS_TIMEOUT_FACTOR = 0.9; // make DNS wait shorter then retry time class LLLoginInstance::Disposable { @@ -80,7 +80,7 @@ std::string construct_start_string(); LLLoginInstance::LLLoginInstance() : - mLoginModule(new LLLogin()), + mLoginModule(std::make_unique<LLLogin>()), mNotifications(NULL), mLoginState("offline"), mSaveMFA(true), @@ -329,6 +329,15 @@ void LLLoginInstance::handleLoginFailure(const LLSD& event) LL_DEBUGS("LLLogin") << "reason " << reason_response << " message " << message_response << LL_ENDL; + + if (response.has("mfa_hash")) + { + mRequestData["params"]["mfa_hash"] = response["mfa_hash"]; + mRequestData["params"]["token"] = ""; + + saveMFAHash(response); + } + // For the cases of critical message or TOS agreement, // start the TOS dialog. The dialog response will be handled // by the LLLoginInstance::handleTOSResponse() callback. @@ -593,6 +602,24 @@ bool LLLoginInstance::handleMFAChallenge(LLSD const & notif, LLSD const & respon return true; } +void LLLoginInstance::saveMFAHash(LLSD const& response) +{ + std::string grid(LLGridManager::getInstance()->getGridId()); + std::string user_id(LLStartUp::getUserId()); + + // Only save mfa_hash for future logins if the user wants their info remembered. + if (response.has("mfa_hash") && gSavedSettings.getBOOL("RememberUser") && LLLoginInstance::getInstance()->saveMFA()) + { + gSecAPIHandler->addToProtectedMap("mfa_hash", grid, user_id, response["mfa_hash"]); + } + else if (!LLLoginInstance::getInstance()->saveMFA()) + { + gSecAPIHandler->removeFromProtectedMap("mfa_hash", grid, user_id); + } + // TODO(brad) - related to SL-17223 consider building a better interface that sync's automatically + gSecAPIHandler->syncProtectedMap(); +} + std::string construct_start_string() { std::string start; diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h index 748909c069..54ce51720f 100644 --- a/indra/newview/lllogininstance.h +++ b/indra/newview/lllogininstance.h @@ -29,7 +29,6 @@ #include "lleventdispatcher.h" #include "lleventapi.h" -#include <boost/function.hpp> #include <memory> // std::shared_ptr #include "llsecapi.h" class LLLogin; @@ -70,6 +69,8 @@ public: void setNotificationsInterface(LLNotificationsInterface* ni) { mNotifications = ni; } LLNotificationsInterface& getNotificationsInterface() const { return *mNotifications; } + void saveMFAHash(LLSD const& response); + private: typedef std::shared_ptr<LLEventAPI::Response> ResponsePtr; void constructAuthParams(LLPointer<LLCredential> user_credentials); diff --git a/indra/newview/llmachineid.cpp b/indra/newview/llmachineid.cpp index aa03001389..51c38aba3a 100644 --- a/indra/newview/llmachineid.cpp +++ b/indra/newview/llmachineid.cpp @@ -293,7 +293,7 @@ bool LLWMIMethods::getGenericSerialNumber(const BSTR &select, const LPCWSTR &var if (validate_as_uuid) { std::wstring ws(serialNumber, serial_size); - std::string str = ll_convert_wide_to_string(ws); + std::string str = ll_convert<std::string>(ws); if (!LLUUID::validate(str)) { @@ -315,7 +315,7 @@ bool LLWMIMethods::getGenericSerialNumber(const BSTR &select, const LPCWSTR &var continue; } } - LL_INFOS("AppInit") << " Serial Number : " << vtProp.bstrVal << LL_ENDL; + LL_INFOS("AppInit") << " Serial Number : " << ll_convert_wide_to_string(std::wstring(vtProp.bstrVal, SysStringLen(vtProp.bstrVal))) << LL_ENDL; unsigned int j = 0; diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index 0888f630e8..9bcfd9e2c0 100644 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -695,24 +695,28 @@ bool LLManipTranslate::handleHover(S32 x, S32 y, MASK mask) // handle attachments in local space if (object->isAttachment() && object->mDrawable.notNull()) { - // calculate local version of relative move - LLQuaternion objWorldRotation = object->mDrawable->mXform.getParent()->getWorldRotation(); - objWorldRotation.transQuat(); + LLXform* object_xform_parent = object->mDrawable->mXform.getParent(); + if (object_xform_parent) + { + // calculate local version of relative move + LLQuaternion objWorldRotation = object_xform_parent->getWorldRotation(); + objWorldRotation.transQuat(); - LLVector3 old_position_local = object->getPosition(); - LLVector3 new_position_local = selectNode->mSavedPositionLocal + (clamped_relative_move_f * objWorldRotation); + LLVector3 old_position_local = object->getPosition(); + LLVector3 new_position_local = selectNode->mSavedPositionLocal + (clamped_relative_move_f * objWorldRotation); - //RN: I forget, but we need to do this because of snapping which doesn't often result - // in position changes even when the mouse moves - object->setPosition(new_position_local); - rebuild(object); - gAgentAvatarp->clampAttachmentPositions(); - new_position_local = object->getPosition(); + //RN: I forget, but we need to do this because of snapping which doesn't often result + // in position changes even when the mouse moves + object->setPosition(new_position_local); + rebuild(object); + gAgentAvatarp->clampAttachmentPositions(); + new_position_local = object->getPosition(); - if (selectNode->mIndividualSelection) - { - // counter-translate child objects if we are moving the root as an individual - object->resetChildrenPosition(old_position_local - new_position_local, true); + if (selectNode->mIndividualSelection) + { + // counter-translate child objects if we are moving the root as an individual + object->resetChildrenPosition(old_position_local - new_position_local, true); + } } } else diff --git a/indra/newview/llmarketplacefunctions.cpp b/indra/newview/llmarketplacefunctions.cpp index 7b8211ded8..ac2f52a262 100644 --- a/indra/newview/llmarketplacefunctions.cpp +++ b/indra/newview/llmarketplacefunctions.cpp @@ -206,10 +206,10 @@ namespace LLMarketplaceImport { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("marketplacePostCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("marketplacePostCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpHeaders::ptr_t httpHeaders = std::make_shared<LLCore::HttpHeaders>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); httpOpts->setWantHeaders(true); httpOpts->setFollowRedirects(true); @@ -267,17 +267,17 @@ namespace LLMarketplaceImport { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("marketplaceGetCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("marketplaceGetCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLCore::HttpHeaders::ptr_t httpHeaders; - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); httpOpts->setWantHeaders(true); httpOpts->setFollowRedirects(!sMarketplaceCookie.empty()); if (buildHeaders) { - httpHeaders = LLCore::HttpHeaders::ptr_t(new LLCore::HttpHeaders); + httpHeaders = std::make_shared<LLCore::HttpHeaders>(); httpHeaders->append(HTTP_OUT_HEADER_ACCEPT, "*/*"); httpHeaders->append(HTTP_OUT_HEADER_COOKIE, sMarketplaceCookie); @@ -783,9 +783,9 @@ void LLMarketplaceData::getMerchantStatusCoro() { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getMerchantStatusCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("getMerchantStatusCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); httpOpts->setFollowRedirects(true); @@ -861,9 +861,9 @@ void LLMarketplaceData::getSLMListingsCoro(LLUUID folderId) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getMerchantStatusCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("getSLMListingsCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpHeaders::ptr_t httpHeaders = std::make_shared<LLCore::HttpHeaders>(); httpHeaders->append("Accept", "application/json"); httpHeaders->append("Content-Type", "application/json"); @@ -926,9 +926,9 @@ void LLMarketplaceData::getSingleListingCoro(S32 listingId, LLUUID folderId) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getMerchantStatusCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("getSingleListingCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpHeaders::ptr_t httpHeaders = std::make_shared<LLCore::HttpHeaders>(); httpHeaders->append("Accept", "application/json"); httpHeaders->append("Content-Type", "application/json"); @@ -997,9 +997,9 @@ void LLMarketplaceData::createSLMListingCoro(LLUUID folderId, LLUUID versionId, { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getMerchantStatusCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("createSLMListingCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpHeaders::ptr_t httpHeaders = std::make_shared<LLCore::HttpHeaders>(); httpHeaders->append("Accept", "application/json"); httpHeaders->append("Content-Type", "application/json"); @@ -1071,9 +1071,9 @@ void LLMarketplaceData::updateSLMListingCoro(LLUUID folderId, S32 listingId, LLU { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getMerchantStatusCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("updateSLMListingCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpHeaders::ptr_t httpHeaders = std::make_shared<LLCore::HttpHeaders>(); httpHeaders->append("Accept", "application/json"); httpHeaders->append("Content-Type", "application/json"); @@ -1166,9 +1166,9 @@ void LLMarketplaceData::associateSLMListingCoro(LLUUID folderId, S32 listingId, { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getMerchantStatusCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("associateSLMListingCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpHeaders::ptr_t httpHeaders = std::make_shared<LLCore::HttpHeaders>(); httpHeaders->append("Accept", "application/json"); httpHeaders->append("Content-Type", "application/json"); @@ -1247,9 +1247,9 @@ void LLMarketplaceData::deleteSLMListingCoro(S32 listingId) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getMerchantStatusCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("deleteSLMListingCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpHeaders::ptr_t httpHeaders = std::make_shared<LLCore::HttpHeaders>(); httpHeaders->append("Accept", "application/json"); httpHeaders->append("Content-Type", "application/json"); diff --git a/indra/newview/llmarketplacefunctions.h b/indra/newview/llmarketplacefunctions.h index 281743c1d6..07ed667b0a 100644 --- a/indra/newview/llmarketplacefunctions.h +++ b/indra/newview/llmarketplacefunctions.h @@ -28,15 +28,11 @@ #ifndef LL_LLMARKETPLACEFUNCTIONS_H #define LL_LLMARKETPLACEFUNCTIONS_H - -#include <llsd.h> -#include <boost/function.hpp> -#include <boost/signals2.hpp> - +#include "llsd.h" #include "llsingleton.h" #include "llstring.h" - +#include <boost/signals2.hpp> namespace MarketplaceErrorCodes { diff --git a/indra/newview/llmarketplacenotifications.h b/indra/newview/llmarketplacenotifications.h index a602b930de..0b03bde16c 100644 --- a/indra/newview/llmarketplacenotifications.h +++ b/indra/newview/llmarketplacenotifications.h @@ -30,7 +30,7 @@ #include <llsd.h> -#include <boost/function.hpp> +#include <functional> // @@ -48,7 +48,7 @@ namespace LLMarketplaceInventoryNotifications { void update(); - typedef boost::function<void (const LLSD&)> NoCopyCallbackFunction; + typedef std::function<void (const LLSD&)> NoCopyCallbackFunction; void addNoCopyNotification(const LLSD& payload, const NoCopyCallbackFunction& cb); }; diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp index 1e3a328464..4e14f416e9 100644 --- a/indra/newview/llmaterialeditor.cpp +++ b/indra/newview/llmaterialeditor.cpp @@ -63,8 +63,9 @@ #include "tinygltf/tiny_gltf.h" #include "lltinygltfhelper.h" -#include <strstream> +#include <boost/iostreams/device/array.hpp> +#include <boost/iostreams/stream.hpp> const std::string MATERIAL_BASE_COLOR_DEFAULT_NAME = "Base Color"; const std::string MATERIAL_NORMAL_DEFAULT_NAME = "Normal"; @@ -137,7 +138,8 @@ LLFloaterComboOptions* LLFloaterComboOptions::showUI( { combo_picker->mComboOptions->addSimpleElement(*iter); } - combo_picker->mComboOptions->selectFirstItem(); + // select 'Bulk Upload All' option + combo_picker->mComboOptions->selectNthItem((S32)options.size() - 1); combo_picker->openFloater(LLSD(title)); combo_picker->setFocus(true); @@ -492,7 +494,7 @@ bool LLMaterialEditor::postBuild() refreshUploadCost(); } - boost::function<void(LLUICtrl*, void*)> changes_callback = [this](LLUICtrl * ctrl, void* userData) + std::function<void(LLUICtrl*, void*)> changes_callback = [this](LLUICtrl * ctrl, void* userData) { const U32 *flag = (const U32*)userData; markChangesUnsaved(*flag); @@ -1245,7 +1247,7 @@ bool LLMaterialEditor::decodeAsset(const std::vector<char>& buffer) { LLSD asset; - std::istrstream str(&buffer[0], buffer.size()); + boost::iostreams::stream<boost::iostreams::array_source> str(buffer.data(), buffer.size()); if (LLSDSerialize::deserialize(asset, str, buffer.size())) { if (asset.has("version") && LLGLTFMaterial::isAcceptedVersion(asset["version"].asString())) @@ -1332,15 +1334,6 @@ const std::string LLMaterialEditor::buildMaterialDescription() desc << mNormalName; } - // trim last char if it's a ',' in case there is no normal texture - // present and the code above inserts one - // (no need to check for string length - always has initial string) - std::string::iterator iter = desc.str().end() - 1; - if (*iter == ',') - { - desc.str().erase(iter); - } - // sanitize the material description so that it's compatible with the inventory // note: split this up because clang doesn't like operating directly on the // str() - error: lvalue reference to type 'basic_string<...>' cannot bind to a @@ -1348,6 +1341,15 @@ const std::string LLMaterialEditor::buildMaterialDescription() std::string inv_desc = desc.str(); LLInventoryObject::correctInventoryName(inv_desc); + // trim last char if it's a ',' in case there is no normal texture + // present and the code above inserts one + // (no need to check for string length - always has initial string) + std::string::iterator iter = inv_desc.end() - 1; + if (*iter == ',') + { + inv_desc.erase(iter); + } + return inv_desc; } @@ -1414,7 +1416,7 @@ bool LLMaterialEditor::saveIfNeeded() } std::string res_desc = buildMaterialDescription(); - createInventoryItem(buffer, mMaterialName, res_desc, local_permissions); + createInventoryItem(buffer, mMaterialName, res_desc, local_permissions, mUploadFolder); // We do not update floater with uploaded asset yet, so just close it. closeFloater(); @@ -1584,12 +1586,12 @@ private: std::string mNewName; }; -void LLMaterialEditor::createInventoryItem(const std::string &buffer, const std::string &name, const std::string &desc, const LLPermissions& permissions) +void LLMaterialEditor::createInventoryItem(const std::string &buffer, const std::string &name, const std::string &desc, const LLPermissions& permissions, const LLUUID& upload_folder) { // gen a new uuid for this asset LLTransactionID tid; tid.generate(); // timestamp-based randomization + uniquification - LLUUID parent = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_MATERIAL); + LLUUID parent = upload_folder.isNull() ? gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_MATERIAL) : upload_folder; const U8 subtype = NO_INV_SUBTYPE; // TODO maybe use AT_SETTINGS and LLSettingsType::ST_MATERIAL ? LLPointer<LLObjectsMaterialItemCallback> cb = new LLObjectsMaterialItemCallback(permissions, buffer, name); @@ -1903,7 +1905,11 @@ static void pack_textures( } } -void LLMaterialEditor::uploadMaterialFromModel(const std::string& filename, tinygltf::Model& model_in, S32 index) +void LLMaterialEditor::uploadMaterialFromModel( + const std::string& filename, + tinygltf::Model& model_in, + S32 index, + const LLUUID& dest) { if (index < 0 || !LLMaterialEditor::capabilitiesAvailable()) { @@ -1926,12 +1932,13 @@ void LLMaterialEditor::uploadMaterialFromModel(const std::string& filename, tiny // This uses 'filename' to make sure multiple bulk uploads work // instead of fighting for a single instance. LLMaterialEditor* me = (LLMaterialEditor*)LLFloaterReg::getInstance("material_editor", LLSD().with("filename", filename).with("index", LLSD::Integer(index))); + me->mUploadFolder = dest; me->loadMaterial(model_in, filename, index, false); me->saveIfNeeded(); } -void LLMaterialEditor::loadMaterialFromFile(const std::string& filename, S32 index) +void LLMaterialEditor::loadMaterialFromFile(const std::string& filename, S32 index, const LLUUID& dest_folder) { LL_PROFILE_ZONE_SCOPED_CATEGORY_UI; @@ -1980,12 +1987,14 @@ void LLMaterialEditor::loadMaterialFromFile(const std::string& filename, S32 ind { // Prespecified material LLMaterialEditor* me = (LLMaterialEditor*)LLFloaterReg::getInstance("material_editor"); + me->mUploadFolder = dest_folder; me->loadMaterial(model_in, filename, index); } else if (model_in.materials.size() == 1) { // Only one material, just load it LLMaterialEditor* me = (LLMaterialEditor*)LLFloaterReg::getInstance("material_editor"); + me->mUploadFolder = dest_folder; me->loadMaterial(model_in, filename, 0); } else @@ -2011,11 +2020,12 @@ void LLMaterialEditor::loadMaterialFromFile(const std::string& filename, S32 ind material_list.push_back(LLTrans::getString("material_batch_import_text")); LLFloaterComboOptions::showUI( - [model_in, filename](const std::string& option, S32 index) + [model_in, filename, dest_folder](const std::string& option, S32 index) { if (index >= 0) // -1 on cancel { LLMaterialEditor* me = (LLMaterialEditor*)LLFloaterReg::getInstance("material_editor"); + me->mUploadFolder = dest_folder; me->loadMaterial(model_in, filename, index); } }, @@ -2431,17 +2441,17 @@ void LLMaterialEditor::onSaveObjectsMaterialAsMsgCallback(const LLSD& notificati return; } - createInventoryItem(str.str(), new_name, std::string(), permissions); + createInventoryItem(str.str(), new_name, std::string(), permissions, LLUUID::null); } -const void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type, bool allow_2k); +void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type, bool allow_2k, const LLUUID& dest); void LLMaterialEditor::loadMaterial(const tinygltf::Model &model_in, const std::string &filename, S32 index, bool open_floater) { if (index == model_in.materials.size()) { // bulk upload all the things - upload_bulk({ filename }, LLFilePicker::FFLOAD_MATERIAL, true); + upload_bulk({ filename }, LLFilePicker::FFLOAD_MATERIAL, true, mUploadFolder); return; } @@ -2478,6 +2488,42 @@ void LLMaterialEditor::loadMaterial(const tinygltf::Model &model_in, const std:: pack_textures(base_color_img, normal_img, mr_img, emissive_img, occlusion_img, mBaseColorJ2C, mNormalJ2C, mMetallicRoughnessJ2C, mEmissiveJ2C); + if (open_floater) + { + bool textures_scaled = false; + if (mBaseColorFetched && mBaseColorJ2C + && (mBaseColorFetched->getWidth() != mBaseColorJ2C->getWidth() + || mBaseColorFetched->getHeight() != mBaseColorJ2C->getHeight())) + { + textures_scaled = true; + } + else if (mNormalFetched && mNormalJ2C + && (mNormalFetched->getWidth() != mNormalJ2C->getWidth() + || mNormalFetched->getHeight() != mNormalJ2C->getHeight())) + { + textures_scaled = true; + } + else if (mMetallicRoughnessFetched && mMetallicRoughnessJ2C + && (mMetallicRoughnessFetched->getWidth() != mMetallicRoughnessJ2C->getWidth() + || mMetallicRoughnessFetched->getHeight() != mMetallicRoughnessJ2C->getHeight())) + { + textures_scaled = true; + } + else if (mEmissiveFetched && mEmissiveJ2C + && (mEmissiveFetched->getWidth() != mEmissiveJ2C->getWidth() + || mEmissiveFetched->getHeight() != mEmissiveJ2C->getHeight())) + { + textures_scaled = true; + } + + if (textures_scaled) + { + LLSD args; + args["MAX_SIZE"] = LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT; + LLNotificationsUtil::add("MaterialImagesWereScaled", args); + } + } + LLUUID base_color_id; if (mBaseColorFetched.notNull()) { @@ -2684,10 +2730,8 @@ const std::string LLMaterialEditor::getImageNameFromUri(std::string image_uri, c // so we can include everything if (stripped_uri.length() > 0) { - // example "DamagedHelmet: base layer" + // example "base layer" return STRINGIZE( - mMaterialNameShort << - ": " << stripped_uri << " (" << texture_type << @@ -2696,28 +2740,17 @@ const std::string LLMaterialEditor::getImageNameFromUri(std::string image_uri, c } else // uri doesn't include the type (because the uri is empty) - // so we must reorganize the string a bit to include the name - // and an explicit name type + // include an explicit name type { - // example "DamagedHelmet: (Emissive)" - return STRINGIZE( - mMaterialNameShort << - " (" << - texture_type << - ")" - ); + // example "Emissive" + return texture_type; } } else - // uri includes the type so just use it directly with the - // name of the material + // uri includes the type so just use it directly { - return STRINGIZE( - // example: AlienBust: normal_layer - mMaterialNameShort << - ": " << - stripped_uri - ); + // example: "normal_layer" + return stripped_uri; } } @@ -2848,18 +2881,25 @@ void LLMaterialEditor::setFromGltfMetaData(const std::string& filename, const ti } } -void LLMaterialEditor::importMaterial() +void LLMaterialEditor::importMaterial(const LLUUID dest_folder) { LLFilePickerReplyThread::startPicker( - [](const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter load_filter, LLFilePicker::ESaveFilter save_filter) + [dest_folder](const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter load_filter, LLFilePicker::ESaveFilter save_filter) { if (LLAppViewer::instance()->quitRequested()) { return; } - if (filenames.size() > 0) + try + { + if (filenames.size() > 0) + { + LLMaterialEditor::loadMaterialFromFile(filenames[0], -1, dest_folder); + } + } + catch (std::bad_alloc&) { - LLMaterialEditor::loadMaterialFromFile(filenames[0], -1); + LLNotificationsUtil::add("CannotOpenFileTooBig"); } }, LLFilePicker::FFLOAD_MATERIAL, @@ -3542,6 +3582,7 @@ void LLMaterialEditor::saveTexture(LLImageJ2C* img, const std::string& name, con LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"), expected_upload_cost, + mUploadFolder, false, cb, failed_upload)); diff --git a/indra/newview/llmaterialeditor.h b/indra/newview/llmaterialeditor.h index 232467460e..1abdd7f84c 100644 --- a/indra/newview/llmaterialeditor.h +++ b/indra/newview/llmaterialeditor.h @@ -94,7 +94,7 @@ class LLMaterialEditor : public LLPreview, public LLVOInventoryListener void setFromGltfMetaData(const std::string& filename, const tinygltf::Model& model, S32 index); // open a file dialog and select a gltf/glb file for import - static void importMaterial(); + static void importMaterial(const LLUUID dest_folder = LLUUID::null); // for live preview, apply current material to currently selected object void applyToSelection(); @@ -105,8 +105,11 @@ class LLMaterialEditor : public LLPreview, public LLVOInventoryListener void loadAsset() override; // @index if -1 and file contains more than one material, // will promt to select specific one - static void uploadMaterialFromModel(const std::string& filename, tinygltf::Model& model, S32 index); - static void loadMaterialFromFile(const std::string& filename, S32 index = -1); + static void uploadMaterialFromModel(const std::string& filename, + tinygltf::Model& model, + S32 index, + const LLUUID& dest_folder_id = LLUUID::null); + static void loadMaterialFromFile(const std::string& filename, S32 index = -1, const LLUUID& dest_folder = LLUUID::null); void onSelectionChanged(); // live overrides selection changes @@ -134,8 +137,6 @@ class LLMaterialEditor : public LLPreview, public LLVOInventoryListener void onClickSave(); - void getGLTFModel(tinygltf::Model& model); - std::string getEncodedAsset(); bool decodeAsset(const std::vector<char>& buffer); @@ -239,7 +240,7 @@ private: static void saveObjectsMaterialAs(const LLGLTFMaterial *render_material, const LLLocalGLTFMaterial *local_material, const LLPermissions& permissions, const LLUUID& object_id /* = LLUUID::null */, const LLUUID& item /* = LLUUID::null */); static bool updateInventoryItem(const std::string &buffer, const LLUUID &item_id, const LLUUID &task_id); - static void createInventoryItem(const std::string &buffer, const std::string &name, const std::string &desc, const LLPermissions& permissions); + static void createInventoryItem(const std::string &buffer, const std::string &name, const std::string &desc, const LLPermissions& permissions, const LLUUID& upload_folder); void setFromGLTFMaterial(LLGLTFMaterial* mat); bool setFromSelection(); @@ -249,6 +250,7 @@ private: friend class LLMaterialFilePicker; LLUUID mAssetID; + LLUUID mUploadFolder; LLTextureCtrl* mBaseColorTextureCtrl; LLTextureCtrl* mMetallicTextureCtrl; diff --git a/indra/newview/llmaterialmgr.cpp b/indra/newview/llmaterialmgr.cpp index ee5e5b438e..723f834d6f 100644 --- a/indra/newview/llmaterialmgr.cpp +++ b/indra/newview/llmaterialmgr.cpp @@ -67,7 +67,7 @@ class LLMaterialHttpHandler : public LLHttpSDHandler { public: - typedef boost::function<void(bool, const LLSD&)> CallbackFunction; + typedef std::function<void(bool, const LLSD&)> CallbackFunction; typedef std::shared_ptr<LLMaterialHttpHandler> ptr_t; LLMaterialHttpHandler(const std::string& method, CallbackFunction cback); @@ -137,9 +137,9 @@ LLMaterialMgr::LLMaterialMgr(): { LLAppCoreHttp & app_core_http(LLAppViewer::instance()->getAppCoreHttp()); - mHttpRequest = LLCore::HttpRequest::ptr_t(new LLCore::HttpRequest()); - mHttpHeaders = LLCore::HttpHeaders::ptr_t(new LLCore::HttpHeaders()); - mHttpOptions = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions()); + mHttpRequest = std::make_shared<LLCore::HttpRequest>(); + mHttpHeaders = std::make_shared<LLCore::HttpHeaders>(); + mHttpOptions = std::make_shared<LLCore::HttpOptions>(); mHttpPolicy = app_core_http.getPolicy(LLAppCoreHttp::AP_MATERIALS); mMaterials.insert(std::pair<LLMaterialID, LLMaterialPtr>(LLMaterialID::null, LLMaterialPtr(NULL))); @@ -684,9 +684,9 @@ void LLMaterialMgr::processGetQueue() LLSD postData = LLSD::emptyMap(); postData[MATERIALS_CAP_ZIP_FIELD] = materialBinary; - LLCore::HttpHandler::ptr_t handler(new LLMaterialHttpHandler("POST", + LLCore::HttpHandler::ptr_t handler = std::make_shared<LLMaterialHttpHandler>("POST", boost::bind(&LLMaterialMgr::onGetResponse, this, _1, _2, region_id) - )); + ); LL_DEBUGS("Materials") << "POSTing to region '" << regionp->getName() << "' at '" << capURL << " for " << materialsData.size() << " materials." << "\ndata: " << ll_pretty_print_sd(materialsData) << LL_ENDL; @@ -864,9 +864,9 @@ void LLMaterialMgr::processGetAllQueueCoro(LLUUID regionId) LL_DEBUGS("Materials") << "GET all for region " << regionId << "url " << capURL << LL_ENDL; - LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter( - new LLCoreHttpUtil::HttpCoroutineAdapter("processGetAllQueue", LLCore::HttpRequest::DEFAULT_POLICY_ID)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest()); + LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("processGetAllQueue", LLCore::HttpRequest::DEFAULT_POLICY_ID); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD result = httpAdapter->getAndSuspend(httpRequest, capURL); @@ -973,9 +973,9 @@ void LLMaterialMgr::processPutQueue() LL_DEBUGS("Materials") << "put for " << itRequest->second.size() << " faces to region " << itRequest->first->getName() << LL_ENDL; - LLCore::HttpHandler::ptr_t handler (new LLMaterialHttpHandler("PUT", + LLCore::HttpHandler::ptr_t handler = std::make_shared<LLMaterialHttpHandler>("PUT", boost::bind(&LLMaterialMgr::onPutResponse, this, _1, _2) - )); + ); LLCore::HttpHandle handle = LLCoreHttpUtil::requestPutWithLLSD( mHttpRequest, mHttpPolicy, capURL, diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 202008f7f9..c7b60b2fd5 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -347,6 +347,7 @@ bool LLMediaCtrl::handleRightMouseDown( S32 x, S32 y, MASK mask ) { LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registar; registar.add("Open.WebInspector", boost::bind(&LLMediaCtrl::onOpenWebInspector, this)); + registar.add("Open.ShowSource", boost::bind(&LLMediaCtrl::onShowSource, this)); // stinson 05/05/2014 : use this as the parent of the context menu if the static menu // container has yet to be created @@ -364,8 +365,9 @@ bool LLMediaCtrl::handleRightMouseDown( S32 x, S32 y, MASK mask ) { // hide/show debugging options bool media_plugin_debugging_enabled = gSavedSettings.getBOOL("MediaPluginDebugging"); + menu->setItemVisible("debug_separator", media_plugin_debugging_enabled); menu->setItemVisible("open_webinspector", media_plugin_debugging_enabled ); - menu->setItemVisible("debug_separator", media_plugin_debugging_enabled ); + menu->setItemVisible("show_page_source", media_plugin_debugging_enabled); menu->show(x, y); LLMenuGL::showPopup(this, menu, x, y); @@ -444,6 +446,12 @@ void LLMediaCtrl::onOpenWebInspector() mMediaSource->getMediaPlugin()->showWebInspector( true ); } +void LLMediaCtrl::onShowSource() +{ + if (mMediaSource && mMediaSource->hasMedia()) + mMediaSource->getMediaPlugin()->showPageSource(); +} + //////////////////////////////////////////////////////////////////////////////// // bool LLMediaCtrl::handleKeyHere( KEY key, MASK mask ) diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 9f9564af46..a644ef3071 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -171,6 +171,7 @@ public: // right click debugging item void onOpenWebInspector(); + void onShowSource(); LLUUID getTextureID() {return mMediaTextureID;} diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp index 83a6e66019..50236587ac 100644 --- a/indra/newview/llmediadataclient.cpp +++ b/indra/newview/llmediadataclient.cpp @@ -172,9 +172,9 @@ LLMediaDataClient::LLMediaDataClient(F32 queue_timer_delay, F32 retry_timer_dela mMaxSortedQueueSize(max_sorted_queue_size), mMaxRoundRobinQueueSize(max_round_robin_queue_size), mQueueTimerIsRunning(false), - mHttpRequest(new LLCore::HttpRequest()), - mHttpHeaders(new LLCore::HttpHeaders()), - mHttpOpts(new LLCore::HttpOptions()), + mHttpRequest(std::make_shared<LLCore::HttpRequest>()), + mHttpHeaders(std::make_shared<LLCore::HttpHeaders>()), + mHttpOpts(std::make_shared<LLCore::HttpOptions>()), mHttpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID) { // *TODO: Look up real Policy ID @@ -660,7 +660,7 @@ void LLMediaDataClient::Handler::onFailure(LLCore::HttpResponse * response, LLCo void LLObjectMediaDataClient::fetchMedia(LLMediaDataClientObject *object) { // Create a get request and put it in the queue. - enqueue(Request::ptr_t(new RequestGet(object, this))); + enqueue(std::make_shared<RequestGet>(object, this)); } const char *LLObjectMediaDataClient::getCapabilityName() const @@ -880,14 +880,14 @@ LLSD LLObjectMediaDataClient::RequestGet::getPayload() const LLCore::HttpHandler::ptr_t LLObjectMediaDataClient::RequestGet::createHandler() { - return LLCore::HttpHandler::ptr_t(new LLObjectMediaDataClient::Handler(shared_from_this())); + return std::make_shared<LLObjectMediaDataClient::Handler>(shared_from_this()); } void LLObjectMediaDataClient::updateMedia(LLMediaDataClientObject *object) { // Create an update request and put it in the queue. - enqueue(Request::ptr_t(new RequestUpdate(object, this))); + enqueue(std::make_shared<RequestUpdate>(object, this)); } LLObjectMediaDataClient::RequestUpdate::RequestUpdate(LLMediaDataClientObject *obj, LLMediaDataClient *mdc): @@ -917,7 +917,7 @@ LLSD LLObjectMediaDataClient::RequestUpdate::getPayload() const LLCore::HttpHandler::ptr_t LLObjectMediaDataClient::RequestUpdate::createHandler() { // This just uses the base class's responder. - return LLCore::HttpHandler::ptr_t(new LLMediaDataClient::Handler(shared_from_this())); + return std::make_shared<LLMediaDataClient::Handler>(shared_from_this()); } void LLObjectMediaDataClient::Handler::onSuccess(LLCore::HttpResponse * response, const LLSD &content) @@ -1037,7 +1037,7 @@ void LLObjectMediaNavigateClient::navigate(LLMediaDataClientObject *object, U8 t // LL_INFOS("LLMediaDataClient") << "navigate() initiated: " << ll_print_sd(sd_payload) << LL_ENDL; // Create a get request and put it in the queue. - enqueue(Request::ptr_t(new RequestNavigate(object, this, texture_index, url))); + enqueue(std::make_shared<RequestNavigate>(object, this, texture_index, url)); } LLObjectMediaNavigateClient::RequestNavigate::RequestNavigate(LLMediaDataClientObject *obj, LLMediaDataClient *mdc, U8 texture_index, const std::string &url): @@ -1058,7 +1058,7 @@ LLSD LLObjectMediaNavigateClient::RequestNavigate::getPayload() const LLCore::HttpHandler::ptr_t LLObjectMediaNavigateClient::RequestNavigate::createHandler() { - return LLCore::HttpHandler::ptr_t(new LLObjectMediaNavigateClient::Handler(shared_from_this())); + return std::make_shared<LLObjectMediaNavigateClient::Handler>(shared_from_this()); } void LLObjectMediaNavigateClient::Handler::onSuccess(LLCore::HttpResponse * response, const LLSD &content) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 93453f507c..c0b1a5326a 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -255,12 +255,13 @@ // mSkinInfoQ mMutex rw.repo.mMutex, rw.main.mMutex [5] (was: [0]) // mDecompositionRequests mMutex rw.repo.mMutex, ro.repo.none [5] // mPhysicsShapeRequests mMutex rw.repo.mMutex, ro.repo.none [5] -// mDecompositionQ mMutex rw.repo.mMutex, rw.main.mMutex [5] (was: [0]) +// mDecompositionQ mMutex rw.repo.mLoadedMutex, rw.main.mLoadedMutex [5] (was: [0]) +// mPhysicsQ mMutex rw.repo.mLoadedMutex, rw.main.mLoadedMutex [5] (was: [0]) // mHeaderReqQ mMutex ro.repo.none [5], rw.repo.mMutex, rw.any.mMutex // mLODReqQ mMutex ro.repo.none [5], rw.repo.mMutex, rw.any.mMutex -// mUnavailableQ mMutex rw.repo.none [0], ro.main.none [5], rw.main.mMutex -// mLoadedQ mMutex rw.repo.mMutex, ro.main.none [5], rw.main.mMutex -// mPendingLOD mMutex rw.repo.mMutex, rw.any.mMutex +// mUnavailableQ mMutex rw.repo.none [0], ro.main.none [5], rw.main.mLoadedMutex +// mLoadedQ mMutex rw.repo.mLoadedMutex, ro.main.none [5], rw.main.mLoadedMutex +// mPendingLOD mMutex rw.repo.mPendingMutex, rw.any.mPendingMutex // mGetMeshCapability mMutex rw.main.mMutex, ro.repo.mMutex (was: [0]) // mGetMesh2Capability mMutex rw.main.mMutex, ro.repo.mMutex (was: [0]) // mGetMeshVersion mMutex rw.main.mMutex, ro.repo.mMutex @@ -343,20 +344,22 @@ static LLFastTimer::DeclareTimer FTM_MESH_FETCH("Mesh Fetch"); LLMeshRepository gMeshRepo; -const S32 MESH_HEADER_SIZE = 4096; // Important: assumption is that headers fit in this space +constexpr U32 CACHE_PREAMBLE_VERSION = 1; +constexpr S32 CACHE_PREAMBLE_SIZE = sizeof(U32) * 3; //version, header_size, flags +constexpr S32 MESH_HEADER_SIZE = 4096; // Important: assumption is that headers fit in this space -const S32 REQUEST2_HIGH_WATER_MIN = 32; // Limits for GetMesh2 regions -const S32 REQUEST2_HIGH_WATER_MAX = 100; -const S32 REQUEST2_LOW_WATER_MIN = 16; -const S32 REQUEST2_LOW_WATER_MAX = 50; +constexpr S32 REQUEST2_HIGH_WATER_MIN = 32; // Limits for GetMesh2 regions +constexpr S32 REQUEST2_HIGH_WATER_MAX = 100; +constexpr S32 REQUEST2_LOW_WATER_MIN = 16; +constexpr S32 REQUEST2_LOW_WATER_MAX = 50; -const U32 LARGE_MESH_FETCH_THRESHOLD = 1U << 21; // Size at which requests goes to narrow/slow queue -const long SMALL_MESH_XFER_TIMEOUT = 120L; // Seconds to complete xfer, small mesh downloads -const long LARGE_MESH_XFER_TIMEOUT = 600L; // Seconds to complete xfer, large downloads +constexpr U32 LARGE_MESH_FETCH_THRESHOLD = 1U << 21; // Size at which requests goes to narrow/slow queue +constexpr long SMALL_MESH_XFER_TIMEOUT = 120L; // Seconds to complete xfer, small mesh downloads +constexpr long LARGE_MESH_XFER_TIMEOUT = 600L; // Seconds to complete xfer, large downloads -const U32 DOWNLOAD_RETRY_LIMIT = 8; -const F32 DOWNLOAD_RETRY_DELAY = 0.5f; // seconds +constexpr U32 DOWNLOAD_RETRY_LIMIT = 8; +constexpr F32 DOWNLOAD_RETRY_DELAY = 0.5f; // seconds // Would normally like to retry on uploads as some // retryable failures would be recoverable. Unfortunately, @@ -366,7 +369,7 @@ const F32 DOWNLOAD_RETRY_DELAY = 0.5f; // seconds // cap which then produces a 404 on retry destroying some // (occasionally) useful error information. We'll leave // upload retries to the user as in the past. SH-4667. -const long UPLOAD_RETRY_LIMIT = 0L; +constexpr long UPLOAD_RETRY_LIMIT = 0L; // Maximum mesh version to support. Three least significant digits are reserved for the minor version, // with major version changes indicating a format change that is not backwards compatible and should not @@ -374,7 +377,7 @@ const long UPLOAD_RETRY_LIMIT = 0L; // present, the version is 0.001. A viewer that can parse version 0.001 can also parse versions up to 0.999, // but not 1.0 (integer 1000). // See wiki at https://wiki.secondlife.com/wiki/Mesh/Mesh_Asset_Format -const S32 MAX_MESH_VERSION = 999; +constexpr S32 MAX_MESH_VERSION = 999; U32 LLMeshRepository::sBytesReceived = 0; U32 LLMeshRepository::sMeshRequestCount = 0; @@ -386,12 +389,12 @@ U32 LLMeshRepository::sLODProcessing = 0; U32 LLMeshRepository::sLODPending = 0; U32 LLMeshRepository::sCacheBytesRead = 0; -U32 LLMeshRepository::sCacheBytesWritten = 0; +std::atomic<U32> LLMeshRepository::sCacheBytesWritten = 0; U32 LLMeshRepository::sCacheBytesHeaders = 0; U32 LLMeshRepository::sCacheBytesSkins = 0; U32 LLMeshRepository::sCacheBytesDecomps = 0; U32 LLMeshRepository::sCacheReads = 0; -U32 LLMeshRepository::sCacheWrites = 0; +std::atomic<U32> LLMeshRepository::sCacheWrites = 0; U32 LLMeshRepository::sMaxLockHoldoffs = 0; LLDeadmanTimer LLMeshRepository::sQuiescentTimer(15.0, false); // true -> gather cpu metrics @@ -542,6 +545,66 @@ bool RequestStats::isDelayed() const return mTimer.getStarted() && !mTimer.hasExpired(); } +F32 calculate_score(LLVOVolume* object) +{ + if (!object) + { + return -1.f; + } + LLDrawable* drawable = object->mDrawable; + if (!drawable) + { + return -1; + } + if (drawable->isState(LLDrawable::RIGGED) || object->isAttachment()) + { + LLVOAvatar* avatar = object->getAvatar(); + LLDrawable* av_drawable = avatar ? avatar->mDrawable : nullptr; + if (avatar && av_drawable) + { + // See LLVOVolume::calcLOD() + F32 radius; + if (avatar->isControlAvatar()) + { + const LLVector3* box = avatar->getLastAnimExtents(); + LLVector3 diag = box[1] - box[0]; + radius = diag.magVec() * 0.5f; + } + else + { + // Volume in a rigged mesh attached to a regular avatar. + const LLVector3* box = avatar->getLastAnimExtents(); + LLVector3 diag = box[1] - box[0]; + radius = diag.magVec(); + + if (!avatar->isSelf() && !avatar->hasFirstFullAttachmentData()) + { + // slightly deprioritize avatars that are still receiving data + radius *= 0.9f; + } + } + return radius / llmax(av_drawable->mDistanceWRTCamera, 1.f); + } + } + return drawable->getRadius() / llmax(drawable->mDistanceWRTCamera, 1.f); +} + +void PendingRequestBase::updateScore() +{ + mScore = 0; + if (mTrackedData) + { + for (LLVOVolume* volume : mTrackedData->mVolumes) + { + F32 cur_score = calculate_score(volume); + if (cur_score > 0) + { + mScore = llmax(mScore, cur_score); + } + } + } +} + LLViewerFetchedTexture* LLMeshUploadThread::FindViewerTexture(const LLImportMaterial& material) { LLPointer< LLViewerFetchedTexture > * ppTex = static_cast< LLPointer< LLViewerFetchedTexture > * >(material.mOpaqueData); @@ -550,6 +613,7 @@ LLViewerFetchedTexture* LLMeshUploadThread::FindViewerTexture(const LLImportMate std::atomic<S32> LLMeshRepoThread::sActiveHeaderRequests = 0; std::atomic<S32> LLMeshRepoThread::sActiveLODRequests = 0; +std::atomic<S32> LLMeshRepoThread::sActiveSkinRequests = 0; U32 LLMeshRepoThread::sMaxConcurrentRequests = 1; S32 LLMeshRepoThread::sRequestLowWater = REQUEST2_LOW_WATER_MIN; S32 LLMeshRepoThread::sRequestHighWater = REQUEST2_HIGH_WATER_MIN; @@ -584,17 +648,16 @@ public: : LLCore::HttpHandler(), mMeshParams(), mProcessed(false), + mHasDataOwnership(true), mHttpHandle(LLCORE_HTTP_HANDLE_INVALID), mOffset(offset), mRequestedBytes(requested_bytes) {} - virtual ~LLMeshHandlerBase() - {} + virtual ~LLMeshHandlerBase() = default; -protected: - LLMeshHandlerBase(const LLMeshHandlerBase &); // Not defined - void operator=(const LLMeshHandlerBase &); // Not defined + LLMeshHandlerBase(const LLMeshHandlerBase &) = delete; + LLMeshHandlerBase& operator=(const LLMeshHandlerBase&) = delete; public: virtual void onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response); @@ -607,6 +670,9 @@ public: LLCore::HttpHandle mHttpHandle; U32 mOffset; U32 mRequestedBytes; + +protected: + bool mHasDataOwnership = true; }; @@ -625,9 +691,8 @@ public: } virtual ~LLMeshHeaderHandler(); -protected: - LLMeshHeaderHandler(const LLMeshHeaderHandler &); // Not defined - void operator=(const LLMeshHeaderHandler &); // Not defined + LLMeshHeaderHandler(const LLMeshHeaderHandler&) = delete; + LLMeshHeaderHandler& operator=(const LLMeshHeaderHandler&) = delete; public: virtual void processData(LLCore::BufferArray * body, S32 body_offset, U8 * data, S32 data_size); @@ -651,14 +716,16 @@ public: } virtual ~LLMeshLODHandler(); -protected: - LLMeshLODHandler(const LLMeshLODHandler &); // Not defined - void operator=(const LLMeshLODHandler &); // Not defined + LLMeshLODHandler(const LLMeshLODHandler&) = delete; + LLMeshLODHandler& operator=(const LLMeshLODHandler&) = delete; public: virtual void processData(LLCore::BufferArray * body, S32 body_offset, U8 * data, S32 data_size); virtual void processFailure(LLCore::HttpStatus status); +private: + void processLod(U8* data, S32 data_size); + public: S32 mLOD; }; @@ -674,12 +741,15 @@ public: LLMeshSkinInfoHandler(const LLUUID& id, U32 offset, U32 requested_bytes) : LLMeshHandlerBase(offset, requested_bytes), mMeshID(id) - {} + { + LLMeshRepoThread::incActiveSkinRequests(); + } virtual ~LLMeshSkinInfoHandler(); -protected: - LLMeshSkinInfoHandler(const LLMeshSkinInfoHandler &); // Not defined - void operator=(const LLMeshSkinInfoHandler &); // Not defined + LLMeshSkinInfoHandler(const LLMeshSkinInfoHandler&) = delete; + LLMeshSkinInfoHandler& operator=(const LLMeshSkinInfoHandler&) = delete; + + void processSkin(U8* data, S32 data_size); public: virtual void processData(LLCore::BufferArray * body, S32 body_offset, U8 * data, S32 data_size); @@ -703,9 +773,8 @@ public: {} virtual ~LLMeshDecompositionHandler(); -protected: - LLMeshDecompositionHandler(const LLMeshDecompositionHandler &); // Not defined - void operator=(const LLMeshDecompositionHandler &); // Not defined + LLMeshDecompositionHandler(const LLMeshDecompositionHandler&) = delete; + LLMeshDecompositionHandler& operator=(const LLMeshDecompositionHandler&) = delete; public: virtual void processData(LLCore::BufferArray * body, S32 body_offset, U8 * data, S32 data_size); @@ -729,9 +798,8 @@ public: {} virtual ~LLMeshPhysicsShapeHandler(); -protected: - LLMeshPhysicsShapeHandler(const LLMeshPhysicsShapeHandler &); // Not defined - void operator=(const LLMeshPhysicsShapeHandler &); // Not defined + LLMeshPhysicsShapeHandler(const LLMeshPhysicsShapeHandler&) = delete; + LLMeshPhysicsShapeHandler& operator=(const LLMeshPhysicsShapeHandler&) = delete; public: virtual void processData(LLCore::BufferArray * body, S32 body_offset, U8 * data, S32 data_size); @@ -742,8 +810,12 @@ public: }; -void log_upload_error(LLCore::HttpStatus status, const LLSD& content, - const char * const stage, const std::string & model_name) +void log_upload_error( + LLCore::HttpStatus status, + const LLSD& content, + const char * const stage, + const std::string & model_name, + const std::vector<std::string> & texture_filenames) { // Add notification popup. LLSD args; @@ -801,6 +873,20 @@ void log_upload_error(LLCore::HttpStatus status, const LLSD& content, error_num++; } } + + if (err.has("TextureIndex")) + { + S32 texture_index = err["TextureIndex"].asInteger(); + if (texture_index < texture_filenames.size()) + { + args["MESSAGE"] = message + "\n" + texture_filenames[texture_index]; + } + else + { + llassert(false); // figure out why or how texture wasn't in the list + args["MESSAGE"] = message + llformat("\nTexture index: %d", texture_index); + } + } } else { @@ -823,6 +909,14 @@ void log_upload_error(LLCore::HttpStatus status, const LLSD& content, gMeshRepo.uploadError(args); } +void write_preamble(LLFileSystem &file, S32 header_bytes, S32 flags) +{ + LLMeshRepository::sCacheBytesWritten += CACHE_PREAMBLE_SIZE; + file.write((U8*)&CACHE_PREAMBLE_VERSION, sizeof(U32)); + file.write((U8*)&header_bytes, sizeof(U32)); + file.write((U8*)&flags, sizeof(U32)); +} + LLMeshRepoThread::LLMeshRepoThread() : LLThread("mesh repo"), mHttpRequest(NULL), @@ -837,18 +931,26 @@ LLMeshRepoThread::LLMeshRepoThread() mMutex = new LLMutex(); mHeaderMutex = new LLMutex(); + mLoadedMutex = new LLMutex(); + mPendingMutex = new LLMutex(); + mSkinMapMutex = new LLMutex(); mSignal = new LLCondition(); mHttpRequest = new LLCore::HttpRequest; - mHttpOptions = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); + mHttpOptions = std::make_shared<LLCore::HttpOptions>(); mHttpOptions->setTransferTimeout(SMALL_MESH_XFER_TIMEOUT); mHttpOptions->setUseRetryAfter(gSavedSettings.getBOOL("MeshUseHttpRetryAfter")); - mHttpLargeOptions = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); + mHttpLargeOptions = std::make_shared<LLCore::HttpOptions>(); mHttpLargeOptions->setTransferTimeout(LARGE_MESH_XFER_TIMEOUT); mHttpLargeOptions->setUseRetryAfter(gSavedSettings.getBOOL("MeshUseHttpRetryAfter")); - mHttpHeaders = LLCore::HttpHeaders::ptr_t(new LLCore::HttpHeaders); + mHttpHeaders = std::make_shared<LLCore::HttpHeaders>(); mHttpHeaders->append(HTTP_OUT_HEADER_ACCEPT, HTTP_CONTENT_VND_LL_MESH); mHttpPolicyClass = app_core_http.getPolicy(LLAppCoreHttp::AP_MESH2); mHttpLargePolicyClass = app_core_http.getPolicy(LLAppCoreHttp::AP_LARGE_MESH); + + // Lod processing is expensive due to the number of requests + // and a need to do expensive cacheOptimize(). + mMeshThreadPool = std::make_unique<LL::ThreadPool>("MeshLodProcessing", 2); + mMeshThreadPool->start(); } @@ -874,14 +976,28 @@ LLMeshRepoThread::~LLMeshRepoThread() mDecompositionQ.pop_front(); } + while (!mPhysicsQ.empty()) + { + delete mPhysicsQ.front(); + mPhysicsQ.pop_front(); + } + delete mHttpRequest; - mHttpRequest = NULL; + mHttpRequest = nullptr; delete mMutex; - mMutex = NULL; + mMutex = nullptr; delete mHeaderMutex; - mHeaderMutex = NULL; + mHeaderMutex = nullptr; + delete mLoadedMutex; + mLoadedMutex = nullptr; + delete mPendingMutex; + mPendingMutex = nullptr; + delete mSkinMapMutex; + mSkinMapMutex = nullptr; delete mSignal; - mSignal = NULL; + mSignal = nullptr; + delete[] mDiskCacheBuffer; + mDiskCacheBuffer = nullptr; } void LLMeshRepoThread::run() @@ -908,6 +1024,7 @@ void LLMeshRepoThread::run() // On the other hand, this may actually be an effective and efficient scheme... mSignal->wait(); + LL_PROFILE_ZONE_NAMED("mesh_thread_loop") if (LLApp::isExiting()) { @@ -925,11 +1042,55 @@ void LLMeshRepoThread::run() } sRequestWaterLevel = static_cast<S32>(mHttpRequestSet.size()); // Stats data update - // NOTE: order of queue processing intentionally favors LOD requests over header requests + // NOTE: order of queue processing intentionally favors LOD and Skin requests over header requests // Todo: we are processing mLODReqQ, mHeaderReqQ, mSkinRequests, mDecompositionRequests and mPhysicsShapeRequests // in relatively similar manners, remake code to simplify/unify the process, // like processRequests(&requestQ, fetchFunction); which does same thing for each element + if (mHttpRequestSet.size() < sRequestHighWater + && !mSkinRequests.empty()) + { + if (!mSkinRequests.empty()) + { + std::list<UUIDBasedRequest> incomplete; + while (!mSkinRequests.empty() && mHttpRequestSet.size() < sRequestHighWater) + { + + mMutex->lock(); + auto req = mSkinRequests.front(); + mSkinRequests.pop_front(); + mMutex->unlock(); + if (req.isDelayed()) + { + incomplete.emplace_back(req); + } + else if (!fetchMeshSkinInfo(req.mId)) + { + if (req.canRetry()) + { + req.updateTime(); + incomplete.emplace_back(req); + } + else + { + LLMutexLock locker(mLoadedMutex); + mSkinUnavailableQ.push_back(req); + LL_DEBUGS() << "mSkinReqQ failed: " << req.mId << LL_ENDL; + } + } + } + + if (!incomplete.empty()) + { + LLMutexLock locker(mMutex); + for (const auto& req : incomplete) + { + mSkinRequests.push_back(req); + } + } + } + } + if (!mLODReqQ.empty() && mHttpRequestSet.size() < sRequestHighWater) { std::list<LODRequest> incomplete; @@ -950,7 +1111,7 @@ void LLMeshRepoThread::run() // failed to load before, wait a bit incomplete.push_front(req); } - else if (!fetchMeshLOD(req.mMeshParams, req.mLOD, req.canRetry())) + else if (!fetchMeshLOD(req.mMeshParams, req.mLOD)) { if (req.canRetry()) { @@ -961,7 +1122,7 @@ void LLMeshRepoThread::run() else { // too many fails - LLMutexLock lock(mMutex); + LLMutexLock lock(mLoadedMutex); mUnavailableQ.push_back(req); LL_WARNS() << "Failed to load " << req.mMeshParams << " , skip" << LL_ENDL; } @@ -998,7 +1159,7 @@ void LLMeshRepoThread::run() // failed to load before, wait a bit incomplete.push_front(req); } - else if (!fetchMeshHeader(req.mMeshParams, req.canRetry())) + else if (!fetchMeshHeader(req.mMeshParams)) { if (req.canRetry()) { @@ -1028,54 +1189,13 @@ void LLMeshRepoThread::run() // performing long-duration actions. if (mHttpRequestSet.size() < sRequestHighWater - && (!mSkinRequests.empty() - || !mDecompositionRequests.empty() + && (!mDecompositionRequests.empty() || !mPhysicsShapeRequests.empty())) { // Something to do probably, lock and double-check. We don't want // to hold the lock long here. That will stall main thread activities // so we bounce it. - if (!mSkinRequests.empty()) - { - std::list<UUIDBasedRequest> incomplete; - while (!mSkinRequests.empty() && mHttpRequestSet.size() < sRequestHighWater) - { - - mMutex->lock(); - auto req = mSkinRequests.front(); - mSkinRequests.pop_front(); - mMutex->unlock(); - if (req.isDelayed()) - { - incomplete.emplace_back(req); - } - else if (!fetchMeshSkinInfo(req.mId, req.canRetry())) - { - if (req.canRetry()) - { - req.updateTime(); - incomplete.emplace_back(req); - } - else - { - LLMutexLock locker(mMutex); - mSkinUnavailableQ.push_back(req); - LL_DEBUGS() << "mSkinReqQ failed: " << req.mId << LL_ENDL; - } - } - } - - if (!incomplete.empty()) - { - LLMutexLock locker(mMutex); - for (const auto& req : incomplete) - { - mSkinRequests.push_back(req); - } - } - } - // holding lock, try next list // *TODO: For UI/debug-oriented lists, we might drop the fine- // grained locking as there's a lowered expectation of smoothness @@ -1103,7 +1223,7 @@ void LLMeshRepoThread::run() } else { - LL_DEBUGS() << "mDecompositionRequests failed: " << req.mId << LL_ENDL; + LL_DEBUGS(LOG_MESH) << "mDecompositionRequests failed: " << req.mId << LL_ENDL; } } } @@ -1139,7 +1259,7 @@ void LLMeshRepoThread::run() } else { - LL_DEBUGS() << "mPhysicsShapeRequests failed: " << req.mId << LL_ENDL; + LL_DEBUGS(LOG_MESH) << "mPhysicsShapeRequests failed: " << req.mId << LL_ENDL; } } } @@ -1168,6 +1288,12 @@ void LLMeshRepoThread::run() LL_WARNS(LOG_MESH) << "Convex decomposition unable to be quit." << LL_ENDL; } } +void LLMeshRepoThread::cleanup() +{ + mShuttingDown = true; + mSignal->broadcast(); + mMeshThreadPool->close(); +} // Mutex: LLMeshRepoThread::mMutex must be held on entry void LLMeshRepoThread::loadMeshSkinInfo(const LLUUID& mesh_id) @@ -1195,40 +1321,91 @@ void LLMeshRepoThread::lockAndLoadMeshLOD(const LLVolumeParams& mesh_params, S32 } } - void LLMeshRepoThread::loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod) { //could be called from any thread const LLUUID& mesh_id = mesh_params.getSculptID(); - LLMutexLock lock(mMutex); - LLMutexLock header_lock(mHeaderMutex); - mesh_header_map::iterator iter = mMeshHeader.find(mesh_id); - if (iter != mMeshHeader.end()) + loadMeshLOD(mesh_id, mesh_params, lod); +} + +void LLMeshRepoThread::loadMeshLOD(const LLUUID& mesh_id, const LLVolumeParams& mesh_params, S32 lod) +{ + if (hasHeader(mesh_id)) { //if we have the header, request LOD byte range LODRequest req(mesh_params, lod); { + LLMutexLock lock(mMutex); mLODReqQ.push(req); LLMeshRepository::sLODProcessing++; } } else { + LLMutexLock lock(mPendingMutex); HeaderRequest req(mesh_params); pending_lod_map::iterator pending = mPendingLOD.find(mesh_id); if (pending != mPendingLOD.end()) - { //append this lod request to existing header request - pending->second.push_back(lod); - llassert(pending->second.size() <= LLModel::NUM_LODS); + { + //append this lod request to existing header request + if (lod < LLModel::NUM_LODS && lod >= 0) + { + pending->second[lod]++; + } + else + { + LL_WARNS(LOG_MESH) << "Invalid LOD request: " << lod << "for mesh" << mesh_id << LL_ENDL; + } + llassert_msg(lod < LLModel::NUM_LODS, "Requested lod is out of bounds"); } else - { //if no header request is pending, fetch header + { + //if no header request is pending, fetch header + auto& array = mPendingLOD[mesh_id]; + std::fill(array.begin(), array.end(), 0); + array[lod]++; + + LLMutexLock lock(mMutex); mHeaderReqQ.push(req); - mPendingLOD[mesh_id].push_back(lod); } } } +U8* LLMeshRepoThread::getDiskCacheBuffer(S32 size) +{ + if (mDiskCacheBufferSize < size) + { + const S32 MINIMUM_BUFFER_SIZE = 8192; // a minimum to avoid frequent early reallocations + size = llmax(MINIMUM_BUFFER_SIZE, size); + delete[] mDiskCacheBuffer; + try + { + mDiskCacheBuffer = new U8[size]; + } + catch (std::bad_alloc&) + { + LL_WARNS(LOG_MESH) << "Failed to allocate memory for mesh thread's buffer, size: " << size << LL_ENDL; + mDiskCacheBuffer = NULL; + + // Not sure what size is reasonable + // but if 30MB allocation failed, we definitely have issues + const S32 MAX_SIZE = 30 * 1024 * 1024; //30MB + if (size < MAX_SIZE) + { + LLAppViewer::instance()->outOfMemorySoftQuit(); + } // else ignore failures for anomalously large data + } + mDiskCacheBufferSize = size; + } + else + { + // reusing old buffer, reset heading bytes to ensure + // old content won't be parsable if something fails. + memset(mDiskCacheBuffer, 0, 16); + } + return mDiskCacheBuffer; +} + // Mutex: must be holding mMutex when called void LLMeshRepoThread::setGetMeshCap(const std::string & mesh_cap) { @@ -1327,7 +1504,7 @@ LLCore::HttpHandle LLMeshRepoThread::getByteRange(const std::string & url, } -bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id, bool can_retry) +bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id) { LL_PROFILE_ZONE_SCOPED; if (!mHeaderMutex) @@ -1337,7 +1514,7 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id, bool can_retry) mHeaderMutex->lock(); - auto header_it = mMeshHeader.find(mesh_id); + mesh_header_map::const_iterator header_it = mMeshHeader.find(mesh_id); if (header_it == mMeshHeader.end()) { //we have no header info for this mesh, do nothing mHeaderMutex->unlock(); @@ -1346,23 +1523,24 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id, bool can_retry) ++LLMeshRepository::sMeshRequestCount; bool ret = true; - U32 header_size = header_it->second.first; + const LLMeshHeader& header = header_it->second; + U32 header_size = header.mHeaderSize; if (header_size > 0) { - const LLMeshHeader& header = header_it->second.second; - S32 version = header.mVersion; S32 offset = header_size + header.mSkinOffset; S32 size = header.mSkinSize; + bool in_cache = header.mSkinInCache; mHeaderMutex->unlock(); if (version <= MAX_MESH_VERSION && offset >= 0 && size > 0) { //check cache for mesh skin info + S32 disk_ofset = offset + CACHE_PREAMBLE_SIZE; LLFileSystem file(mesh_id, LLAssetType::AT_MESH); - if (file.getSize() >= offset + size) + if (in_cache && file.getSize() >= disk_ofset + size) { U8* buffer = new(std::nothrow) U8[size]; if (!buffer) @@ -1370,19 +1548,19 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id, bool can_retry) LL_WARNS(LOG_MESH) << "Failed to allocate memory for skin info, size: " << size << LL_ENDL; // Not sure what size is reasonable for skin info, - // but if 20MB allocation failed, we definetely have issues + // but if 30MB allocation failed, we definitely have issues const S32 MAX_SIZE = 30 * 1024 * 1024; //30MB if (size < MAX_SIZE) { LLAppViewer::instance()->outOfMemorySoftQuit(); } // else ignore failures for anomalously large data - LLMutexLock locker(mMutex); + LLMutexLock locker(mLoadedMutex); mSkinUnavailableQ.emplace_back(mesh_id); return true; } LLMeshRepository::sCacheBytesRead += size; ++LLMeshRepository::sCacheReads; - file.seek(offset); + file.seek(disk_ofset); file.read(buffer, size); //make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written) @@ -1393,14 +1571,72 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id, bool can_retry) } if (!zero) - { //attempt to parse - if (skinInfoReceived(mesh_id, buffer, size)) + { + //attempt to parse + bool posted = mMeshThreadPool->getQueue().post( + [mesh_id, buffer, size] + () + { + if (gMeshRepo.mThread->isShuttingDown()) + { + delete[] buffer; + return; + } + if (!gMeshRepo.mThread->skinInfoReceived(mesh_id, buffer, size)) + { + // either header is faulty or something else overwrote the cache + S32 header_size = 0; + U32 header_flags = 0; + { + LL_DEBUGS(LOG_MESH) << "Mesh header for ID " << mesh_id << " cache mismatch." << LL_ENDL; + + LLMutexLock lock(gMeshRepo.mThread->mHeaderMutex); + + auto header_it = gMeshRepo.mThread->mMeshHeader.find(mesh_id); + if (header_it != gMeshRepo.mThread->mMeshHeader.end()) + { + LLMeshHeader& header = header_it->second; + // for safety just mark everything as missing + header.mSkinInCache = false; + header.mPhysicsConvexInCache = false; + header.mPhysicsMeshInCache = false; + for (S32 i = 0; i < LLModel::NUM_LODS; ++i) + { + header.mLodInCache[i] = false; + } + header_size = header.mHeaderSize; + header_flags = header.getFlags(); + } + } + + if (header_size > 0) + { + LLFileSystem file(mesh_id, LLAssetType::AT_MESH, LLFileSystem::READ_WRITE); + if (file.getMaxSize() >= CACHE_PREAMBLE_SIZE) + { + write_preamble(file, header_size, header_flags); + } + } + + { + LLMutexLock lock(gMeshRepo.mThread->mMutex); + UUIDBasedRequest req(mesh_id); + gMeshRepo.mThread->mSkinRequests.push_back(req); + } + } + delete[] buffer; + }); + if (posted) + { + // lambda owns buffer + return true; + } + else if (skinInfoReceived(mesh_id, buffer, size)) { delete[] buffer; return true; } } - delete[] buffer; } @@ -1410,7 +1646,7 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id, bool can_retry) if (!http_url.empty()) { - LLMeshHandlerBase::ptr_t handler(new LLMeshSkinInfoHandler(mesh_id, offset, size)); + LLMeshHandlerBase::ptr_t handler = std::make_shared<LLMeshSkinInfoHandler>(mesh_id, offset, size); LLCore::HttpHandle handle = getByteRange(http_url, offset, size, handler); if (LLCORE_HTTP_HANDLE_INVALID == handle) { @@ -1420,26 +1656,21 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id, bool can_retry) << LL_ENDL; ret = false; } - else if(can_retry) + else { handler->mHttpHandle = handle; mHttpRequestSet.insert(handler); } - else - { - LLMutexLock locker(mMutex); - mSkinUnavailableQ.emplace_back(mesh_id); - } } else { - LLMutexLock locker(mMutex); + LLMutexLock locker(mLoadedMutex); mSkinUnavailableQ.emplace_back(mesh_id); } } else { - LLMutexLock locker(mMutex); + LLMutexLock locker(mLoadedMutex); mSkinUnavailableQ.emplace_back(mesh_id); } } @@ -1470,42 +1701,35 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id) } ++LLMeshRepository::sMeshRequestCount; - U32 header_size = header_it->second.first; + const auto& header = header_it->second; + U32 header_size = header.mHeaderSize; bool ret = true; if (header_size > 0) { - const auto& header = header_it->second.second; S32 version = header.mVersion; S32 offset = header_size + header.mPhysicsConvexOffset; S32 size = header.mPhysicsConvexSize; + bool in_cache = header.mPhysicsConvexInCache; mHeaderMutex->unlock(); if (version <= MAX_MESH_VERSION && offset >= 0 && size > 0) { - //check cache for mesh skin info + // check cache for mesh decomposition + S32 disk_ofset = offset + CACHE_PREAMBLE_SIZE; LLFileSystem file(mesh_id, LLAssetType::AT_MESH); - if (file.getSize() >= offset+size) + if (in_cache && file.getSize() >= disk_ofset + size) { - U8* buffer = new(std::nothrow) U8[size]; + U8* buffer = getDiskCacheBuffer(size); if (!buffer) { - LL_WARNS(LOG_MESH) << "Failed to allocate memory for mesh decomposition, size: " << size << LL_ENDL; - - // Not sure what size is reasonable for decomposition - // but if 20MB allocation failed, we definetely have issues - const S32 MAX_SIZE = 30 * 1024 * 1024; //30MB - if (size < MAX_SIZE) - { - LLAppViewer::instance()->outOfMemorySoftQuit(); - } // else ignore failures for anomalously large decompositiions return true; } LLMeshRepository::sCacheBytesRead += size; ++LLMeshRepository::sCacheReads; - file.seek(offset); + file.seek(disk_ofset); file.read(buffer, size); //make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written) @@ -1519,12 +1743,9 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id) { //attempt to parse if (decompositionReceived(mesh_id, buffer, size)) { - delete[] buffer; return true; } } - - delete[] buffer; } //reading from cache failed for whatever reason, fetch from sim @@ -1533,7 +1754,7 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id) if (!http_url.empty()) { - LLMeshHandlerBase::ptr_t handler(new LLMeshDecompositionHandler(mesh_id, offset, size)); + LLMeshHandlerBase::ptr_t handler = std::make_shared<LLMeshDecompositionHandler>(mesh_id, offset, size); LLCore::HttpHandle handle = getByteRange(http_url, offset, size, handler); if (LLCORE_HTTP_HANDLE_INVALID == handle) { @@ -1578,41 +1799,36 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id) } ++LLMeshRepository::sMeshRequestCount; - U32 header_size = header_it->second.first; + const auto& header = header_it->second; + U32 header_size = header.mHeaderSize; bool ret = true; if (header_size > 0) { - const auto& header = header_it->second.second; S32 version = header.mVersion; S32 offset = header_size + header.mPhysicsMeshOffset; S32 size = header.mPhysicsMeshSize; + bool in_cache = header.mPhysicsMeshInCache; mHeaderMutex->unlock(); + // todo: check header.mHasPhysicsMesh if (version <= MAX_MESH_VERSION && offset >= 0 && size > 0) { //check cache for mesh physics shape info + S32 disk_ofset = offset + CACHE_PREAMBLE_SIZE; LLFileSystem file(mesh_id, LLAssetType::AT_MESH); - if (file.getSize() >= offset+size) + if (in_cache && file.getSize() >= disk_ofset +size) { LLMeshRepository::sCacheBytesRead += size; ++LLMeshRepository::sCacheReads; - file.seek(offset); - U8* buffer = new(std::nothrow) U8[size]; + + U8* buffer = getDiskCacheBuffer(size); if (!buffer) { - LL_WARNS(LOG_MESH) << "Failed to allocate memory for mesh decomposition, size: " << size << LL_ENDL; - - // Not sure what size is reasonable for physcis - // but if 20MB allocation failed, we definetely have issues - const S32 MAX_SIZE = 30 * 1024 * 1024; //30MB - if (size < MAX_SIZE) - { - LLAppViewer::instance()->outOfMemorySoftQuit(); - } // else ignore failures for anomalously large data return true; } + file.seek(disk_ofset); file.read(buffer, size); //make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written) @@ -1626,12 +1842,9 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id) { //attempt to parse if (physicsShapeReceived(mesh_id, buffer, size) == MESH_OK) { - delete[] buffer; return true; } } - - delete[] buffer; } //reading from cache failed for whatever reason, fetch from sim @@ -1640,7 +1853,7 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id) if (!http_url.empty()) { - LLMeshHandlerBase::ptr_t handler(new LLMeshPhysicsShapeHandler(mesh_id, offset, size)); + LLMeshHandlerBase::ptr_t handler = std::make_shared<LLMeshPhysicsShapeHandler>(mesh_id, offset, size); LLCore::HttpHandle handle = getByteRange(http_url, offset, size, handler); if (LLCORE_HTTP_HANDLE_INVALID == handle) { @@ -1674,33 +1887,41 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id) //static void LLMeshRepoThread::incActiveLODRequests() { - LLMutexLock lock(gMeshRepo.mThread->mMutex); ++LLMeshRepoThread::sActiveLODRequests; } //static void LLMeshRepoThread::decActiveLODRequests() { - LLMutexLock lock(gMeshRepo.mThread->mMutex); --LLMeshRepoThread::sActiveLODRequests; } //static void LLMeshRepoThread::incActiveHeaderRequests() { - LLMutexLock lock(gMeshRepo.mThread->mMutex); ++LLMeshRepoThread::sActiveHeaderRequests; } //static void LLMeshRepoThread::decActiveHeaderRequests() { - LLMutexLock lock(gMeshRepo.mThread->mMutex); --LLMeshRepoThread::sActiveHeaderRequests; } +//static +void LLMeshRepoThread::incActiveSkinRequests() +{ + ++LLMeshRepoThread::sActiveSkinRequests; +} + +//static +void LLMeshRepoThread::decActiveSkinRequests() +{ + --LLMeshRepoThread::sActiveSkinRequests; +} + //return false if failed to get header -bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params, bool can_retry) +bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params) { LL_PROFILE_ZONE_SCOPED; ++LLMeshRepository::sMeshRequestCount; @@ -1714,17 +1935,34 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params, bool c if (size > 0) { // *NOTE: if the header size is ever more than 4KB, this will break - U8 buffer[MESH_HEADER_SIZE]; - S32 bytes = llmin(size, MESH_HEADER_SIZE); + constexpr S32 DISK_MINIMAL_READ = 4096; + U8 buffer[DISK_MINIMAL_READ * 2]; + S32 bytes = llmin(size, DISK_MINIMAL_READ); LLMeshRepository::sCacheBytesRead += bytes; ++LLMeshRepository::sCacheReads; + file.read(buffer, bytes); - if (headerReceived(mesh_params, buffer, bytes) == MESH_OK) + + U32 version = 0; + memcpy(&version, buffer, sizeof(U32)); + if (version == CACHE_PREAMBLE_VERSION) { - LL_DEBUGS(LOG_MESH) << "Mesh/Cache: Mesh header for ID " << mesh_params.getSculptID() << " - was retrieved from the cache." << LL_ENDL; + S32 header_size = 0; + memcpy(&header_size, buffer + sizeof(U32), sizeof(S32)); + if (header_size + CACHE_PREAMBLE_SIZE > DISK_MINIMAL_READ) + { + bytes = llmin(size , DISK_MINIMAL_READ * 2); + file.read(buffer + DISK_MINIMAL_READ, bytes - DISK_MINIMAL_READ); + } + U32 flags = 0; + memcpy(&flags, buffer + 2 * sizeof(U32), sizeof(U32)); + if (headerReceived(mesh_params, buffer + CACHE_PREAMBLE_SIZE, bytes - CACHE_PREAMBLE_SIZE, flags) == MESH_OK) + { + LL_DEBUGS(LOG_MESH) << "Mesh/Cache: Mesh header for ID " << mesh_params.getSculptID() << " - was retrieved from the cache." << LL_ENDL; - // Found mesh in cache - return true; + // Found mesh in cache + return true; + } } } } @@ -1743,7 +1981,7 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params, bool c //within the first 4KB //NOTE -- this will break of headers ever exceed 4KB - LLMeshHandlerBase::ptr_t handler(new LLMeshHeaderHandler(mesh_params, 0, MESH_HEADER_SIZE)); + LLMeshHandlerBase::ptr_t handler = std::make_shared<LLMeshHeaderHandler>(mesh_params, 0, MESH_HEADER_SIZE); LLCore::HttpHandle handle = getByteRange(http_url, 0, MESH_HEADER_SIZE, handler); if (LLCORE_HTTP_HANDLE_INVALID == handle) { @@ -1753,7 +1991,7 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params, bool c << LL_ENDL; retval = false; } - else if (can_retry) + else { handler->mHttpHandle = handle; mHttpRequestSet.insert(handler); @@ -1764,7 +2002,7 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params, bool c } //return false if failed to get mesh lod. -bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, bool can_retry) +bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod) { LL_PROFILE_ZONE_SCOPED; if (!mHeaderMutex) @@ -1784,41 +2022,43 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, ++LLMeshRepository::sMeshRequestCount; bool retval = true; - U32 header_size = header_it->second.first; + const auto& header = header_it->second; + U32 header_size = header.mHeaderSize; if (header_size > 0) { - const auto& header = header_it->second.second; S32 version = header.mVersion; S32 offset = header_size + header.mLodOffset[lod]; S32 size = header.mLodSize[lod]; + bool in_cache = header.mLodInCache[lod]; mHeaderMutex->unlock(); if (version <= MAX_MESH_VERSION && offset >= 0 && size > 0) { - + S32 disk_ofset = offset + CACHE_PREAMBLE_SIZE; //check cache for mesh asset LLFileSystem file(mesh_id, LLAssetType::AT_MESH); - if (file.getSize() >= offset+size) + if (in_cache && (file.getSize() >= disk_ofset + size)) { - U8* buffer = new(std::nothrow) U8[size]; + U8* buffer = new(std::nothrow) U8[size]; // todo, make buffer thread local and read in thread? if (!buffer) { LL_WARNS(LOG_MESH) << "Can't allocate memory for mesh " << mesh_id << " LOD " << lod << ", size: " << size << LL_ENDL; // Not sure what size is reasonable for a mesh, - // but if 20MB allocation failed, we definetely have issues + // but if 30MB allocation failed, we definitely have issues const S32 MAX_SIZE = 30 * 1024 * 1024; //30MB if (size < MAX_SIZE) { LLAppViewer::instance()->outOfMemorySoftQuit(); } // else ignore failures for anomalously large data - LLMutexLock lock(mMutex); + + LLMutexLock lock(mLoadedMutex); mUnavailableQ.push_back(LODRequest(mesh_params, lod)); return true; } LLMeshRepository::sCacheBytesRead += size; ++LLMeshRepository::sCacheReads; - file.seek(offset); + file.seek(disk_ofset); file.read(buffer, size); //make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written) @@ -1829,15 +2069,81 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, } if (!zero) - { //attempt to parse - if (lodReceived(mesh_params, lod, buffer, size) == MESH_OK) + { + //attempt to parse + const LLVolumeParams params(mesh_params); + bool posted = mMeshThreadPool->getQueue().post( + [params, mesh_id, lod, buffer, size] + () { + if (gMeshRepo.mThread->isShuttingDown()) + { + delete[] buffer; + return; + } + if (gMeshRepo.mThread->lodReceived(params, lod, buffer, size) == MESH_OK) + { + LL_DEBUGS(LOG_MESH) << "Mesh/Cache: Mesh body for ID " << mesh_id << " - was retrieved from the cache." << LL_ENDL; + } + else + { + // either header is faulty or something else overwrote the cache + S32 header_size = 0; + U32 header_flags = 0; + { + LL_DEBUGS(LOG_MESH) << "Mesh header for ID " << mesh_id << " cache mismatch." << LL_ENDL; + + LLMutexLock lock(gMeshRepo.mThread->mHeaderMutex); + + auto header_it = gMeshRepo.mThread->mMeshHeader.find(mesh_id); + if (header_it != gMeshRepo.mThread->mMeshHeader.end()) + { + LLMeshHeader& header = header_it->second; + // for safety just mark everything as missing + header.mSkinInCache = false; + header.mPhysicsConvexInCache = false; + header.mPhysicsMeshInCache = false; + for (S32 i = 0; i < LLModel::NUM_LODS; ++i) + { + header.mLodInCache[i] = false; + } + header_size = header.mHeaderSize; + header_flags = header.getFlags(); + } + } + + if (header_size > 0) + { + LLFileSystem file(mesh_id, LLAssetType::AT_MESH, LLFileSystem::READ_WRITE); + if (file.getMaxSize() >= CACHE_PREAMBLE_SIZE) + { + write_preamble(file, header_size, header_flags); + } + } + + { + LLMutexLock lock(gMeshRepo.mThread->mMutex); + LODRequest req(params, lod); + gMeshRepo.mThread->mLODReqQ.push(req); + LLMeshRepository::sLODProcessing++; + } + } delete[] buffer; + }); + if (posted) + { + // now lambda owns buffer + return true; + } + else if (lodReceived(mesh_params, lod, buffer, size) == MESH_OK) + { + delete[] buffer; LL_DEBUGS(LOG_MESH) << "Mesh/Cache: Mesh body for ID " << mesh_id << " - was retrieved from the cache." << LL_ENDL; return true; } + } delete[] buffer; @@ -1851,7 +2157,7 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, { LL_DEBUGS(LOG_MESH) << "Mesh/Cache: Mesh body for ID " << mesh_id << " - was retrieved from the simulator." << LL_ENDL; - LLMeshHandlerBase::ptr_t handler(new LLMeshLODHandler(mesh_params, lod, offset, size)); + LLMeshHandlerBase::ptr_t handler = std::make_shared<LLMeshLODHandler>(mesh_params, lod, offset, size); LLCore::HttpHandle handle = getByteRange(http_url, offset, size, handler); if (LLCORE_HTTP_HANDLE_INVALID == handle) { @@ -1861,27 +2167,22 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, << LL_ENDL; retval = false; } - else if (can_retry) + else { + // we already made a request, store the handle handler->mHttpHandle = handle; mHttpRequestSet.insert(handler); - // *NOTE: Allowing a re-request, not marking as unavailable. Is that correct? - } - else - { - LLMutexLock lock(mMutex); - mUnavailableQ.push_back(LODRequest(mesh_params, lod)); } } else { - LLMutexLock lock(mMutex); + LLMutexLock lock(mLoadedMutex); mUnavailableQ.push_back(LODRequest(mesh_params, lod)); } } else { - LLMutexLock lock(mMutex); + LLMutexLock lock(mLoadedMutex); mUnavailableQ.push_back(LODRequest(mesh_params, lod)); } } @@ -1893,14 +2194,19 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, return retval; } -EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size) +EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size, U32 flags) { + LL_PROFILE_ZONE_SCOPED; const LLUUID mesh_id = mesh_params.getSculptID(); LLSD header_data; LLMeshHeader header; llssize header_size = 0; + S32 skin_offset = -1; + S32 skin_size = -1; + S32 lod_offset[LLModel::NUM_LODS] = { -1 }; + S32 lod_size[LLModel::NUM_LODS] = { -1 }; if (data_size > 0) { llssize dsize = data_size; @@ -1933,7 +2239,40 @@ EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mes // make sure there is at least one lod, function returns -1 and marks as 404 otherwise else if (LLMeshRepository::getActualMeshLOD(header, 0) >= 0) { - header_size += stream.tellg(); + header.mHeaderSize = (S32)stream.tellg(); + header_size += header.mHeaderSize; + skin_offset = header.mSkinOffset; + skin_size = header.mSkinSize; + + memcpy(lod_offset, header.mLodOffset, sizeof(lod_offset)); + memcpy(lod_size, header.mLodSize, sizeof(lod_size)); + + if (flags != 0) + { + header.setFromFlags(flags); + } + else + { + if (header.mSkinSize > 0 && header_size + header.mSkinOffset + header.mSkinSize < data_size) + { + header.mSkinInCache = true; + } + if (header.mPhysicsConvexSize > 0 && header_size + header.mPhysicsConvexOffset + header.mPhysicsConvexSize < data_size) + { + header.mPhysicsConvexInCache = true; + } + if (header.mPhysicsMeshSize > 0 && header_size + header.mPhysicsMeshOffset + header.mPhysicsMeshSize < data_size) + { + header.mPhysicsMeshInCache = true; + } + for (S32 i = 0; i < LLModel::NUM_LODS; ++i) + { + if (lod_size[i] > 0 && header_size + lod_offset[i] + lod_size[i] < data_size) + { + header.mLodInCache[i] = true; + } + } + } } } else @@ -1947,35 +2286,85 @@ EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mes { LLMutexLock lock(mHeaderMutex); - mMeshHeader[mesh_id] = { (U32)header_size, header }; + mMeshHeader[mesh_id] = header; LLMeshRepository::sCacheBytesHeaders += (U32)header_size; } // immediately request SkinInfo since we'll need it before we can render any LoD if it is present + if (skin_offset >= 0 && skin_size > 0) { - LLMutexLock lock(gMeshRepo.mMeshMutex); + { + LLMutexLock lock(gMeshRepo.mMeshMutex); - if (gMeshRepo.mLoadingSkins.find(mesh_id) == gMeshRepo.mLoadingSkins.end()) + if (gMeshRepo.mLoadingSkins.find(mesh_id) == gMeshRepo.mLoadingSkins.end()) + { + gMeshRepo.mLoadingSkins[mesh_id]; // add an empty vector to indicate to main thread that we are loading skin info + } + } + + S32 offset = (S32)header_size + skin_offset; + bool request_skin = true; + if (offset + skin_size < data_size) { - gMeshRepo.mLoadingSkins[mesh_id] = {}; // add an empty vector to indicate to main thread that we are loading skin info + request_skin = !skinInfoReceived(mesh_id, data + offset, skin_size); + } + if (request_skin) + { + LLMutexLock lock(mMutex); + mSkinRequests.push_back(UUIDBasedRequest(mesh_id)); } } - fetchMeshSkinInfo(mesh_id); - - LLMutexLock lock(mMutex); // make sure only one thread access mPendingLOD at the same time. + std::array<S32, LLModel::NUM_LODS> pending_lods; + bool has_pending_lods = false; + { + LLMutexLock lock(mPendingMutex); // make sure only one thread access mPendingLOD at the same time. + pending_lod_map::iterator iter = mPendingLOD.find(mesh_id); + if (iter != mPendingLOD.end()) + { + pending_lods = iter->second; + mPendingLOD.erase(iter); + has_pending_lods = true; + } + } //check for pending requests - pending_lod_map::iterator iter = mPendingLOD.find(mesh_id); - if (iter != mPendingLOD.end()) + if (has_pending_lods) { - for (U32 i = 0; i < iter->second.size(); ++i) + for (S32 i = 0; i < pending_lods.size(); ++i) { - LODRequest req(mesh_params, iter->second[i]); - mLODReqQ.push(req); - LLMeshRepository::sLODProcessing++; + if (pending_lods[i] > 1) + { + // mLoadingMeshes should be protecting from dupplciates, but looks + // like this is possible if object rezzes, unregisterMesh, then + // rezzes again before first request completes. + // mLoadingMeshes might need to change a bit to not rerequest if + // mesh is already pending. + // + // Todo: Improve mLoadingMeshes and once done turn this into an assert. + // Low priority since such situation should be relatively rare + LL_INFOS(LOG_MESH) << "Multiple dupplicate requests for mesd ID: " << mesh_id << " LOD: " << i + << LL_ENDL; + } + if (pending_lods[i] > 0 && lod_size[i] > 0) + { + // try to load from data we just received + bool request_lod = true; + S32 offset = (S32)header_size + lod_offset[i]; + if (offset + lod_size[i] <= data_size) + { + // initial request is 4096 bytes, it's big enough to fit this lod + request_lod = lodReceived(mesh_params, i, data + offset, lod_size[i]) != MESH_OK; + } + if (request_lod) + { + LLMutexLock lock(mMutex); + LODRequest req(mesh_params, i); + mLODReqQ.push(req); + LLMeshRepository::sLODProcessing++; + } + } } - mPendingLOD.erase(iter); } } @@ -1992,13 +2381,27 @@ EMeshProcessingResult LLMeshRepoThread::lodReceived(const LLVolumeParams& mesh_p LLPointer<LLVolume> volume = new LLVolume(mesh_params, LLVolumeLODGroup::getVolumeScaleFromDetail(lod)); if (volume->unpackVolumeFaces(data, data_size)) { - if (volume->getNumFaces() > 0) + // Use LLVolume::getNumVolumeFaces() here and not LLVolume::getNumFaces(), + // because setMeshAssetLoaded() has not yet been called for this volume + // (it is set later in LLMeshRepository::notifyMeshLoaded()), and + // getNumFaces() would return the number of faces in the LLProfile + // instead. HB + S32 num_faces = volume->getNumVolumeFaces(); + if (num_faces > 0) { // if we have a valid SkinInfo, cache per-joint bounding boxes for this LOD - LLMeshSkinInfo* skin_info = mSkinMap[mesh_params.getSculptID()]; - if (skin_info && isAgentAvatarValid()) + LLPointer<LLMeshSkinInfo> skin_info = nullptr; { - for (S32 i = 0; i < volume->getNumFaces(); ++i) + LLMutexLock lock(mSkinMapMutex); + skin_map::iterator iter = mSkinMap.find(mesh_params.getSculptID()); + if (iter != mSkinMap.end()) + { + skin_info = iter->second; + } + } + if (skin_info.notNull() && isAgentAvatarValid()) + { + for (S32 i = 0; i < num_faces; ++i) { // NOTE: no need to lock gAgentAvatarp as the state being checked is not changed after initialization LLVolumeFace& face = volume->getVolumeFace(i); @@ -2008,7 +2411,7 @@ EMeshProcessingResult LLMeshRepoThread::lodReceived(const LLVolumeParams& mesh_p LoadedMesh mesh(volume, mesh_params, lod); { - LLMutexLock lock(mMutex); + LLMutexLock lock(mLoadedMutex); mLoadedQ.push_back(mesh); // LLPointer is not thread safe, since we added this pointer into // threaded list, make sure counter gets decreased inside mutex lock @@ -2017,6 +2420,11 @@ EMeshProcessingResult LLMeshRepoThread::lodReceived(const LLVolumeParams& mesh_p // might be good idea to turn mesh into pointer to avoid making a copy mesh.mVolume = NULL; } + { + // make sure skin info is not removed from list while we are decreasing reference count + LLMutexLock lock(mSkinMapMutex); + skin_info = nullptr; + } return MESH_OK; } } @@ -2026,6 +2434,7 @@ EMeshProcessingResult LLMeshRepoThread::lodReceived(const LLVolumeParams& mesh_p bool LLMeshRepoThread::skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 data_size) { + LL_PROFILE_ZONE_SCOPED; LLSD skin; if (data_size > 0) @@ -2052,7 +2461,7 @@ bool LLMeshRepoThread::skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 dat LLPointer<LLMeshSkinInfo> info = nullptr; info = new LLMeshSkinInfo(mesh_id, skin); - if (isAgentAvatarValid()) + if (isAgentAvatarValid() && gAgentAvatarp->mInitFlags != 0) { // joint numbers are consistent inside LLVOAvatar and animations, but inconsistent inside meshes, // generate a map of mesh joint numbers to LLVOAvatar joint numbers LLSkinningUtil::initJointNums(info, gAgentAvatarp); @@ -2060,12 +2469,15 @@ bool LLMeshRepoThread::skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 dat // copy the skin info for the background thread so we can use it // to calculate per-joint bounding boxes when volumes are loaded - mSkinMap[mesh_id] = new LLMeshSkinInfo(*info); + { + LLMutexLock lock(mSkinMapMutex); + mSkinMap[mesh_id] = new LLMeshSkinInfo(*info); + } { // Move the LLPointer in to the skin info queue to avoid reference // count modification after we leave the lock - LLMutexLock lock(mMutex); + LLMutexLock lock(mLoadedMutex); mSkinInfoQ.emplace_back(std::move(info)); } } @@ -2075,6 +2487,7 @@ bool LLMeshRepoThread::skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 dat bool LLMeshRepoThread::decompositionReceived(const LLUUID& mesh_id, U8* data, S32 data_size) { + LL_PROFILE_ZONE_SCOPED; LLSD decomp; if (data_size > 0) @@ -2101,7 +2514,7 @@ bool LLMeshRepoThread::decompositionReceived(const LLUUID& mesh_id, U8* data, S3 LLModel::Decomposition* d = new LLModel::Decomposition(decomp); d->mMeshID = mesh_id; { - LLMutexLock lock(mMutex); + LLMutexLock lock(mLoadedMutex); mDecompositionQ.push_back(d); } } @@ -2111,6 +2524,7 @@ bool LLMeshRepoThread::decompositionReceived(const LLUUID& mesh_id, U8* data, S3 EMeshProcessingResult LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size) { + LL_PROFILE_ZONE_SCOPED; LLSD physics_shape; LLModel::Decomposition* d = new LLModel::Decomposition(); @@ -2150,15 +2564,16 @@ EMeshProcessingResult LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_ } { - LLMutexLock lock(mMutex); - mDecompositionQ.push_back(d); + LLMutexLock lock(mLoadedMutex); + mPhysicsQ.push_back(d); } return MESH_OK; } -LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, LLVector3& scale, bool upload_textures, +LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list_t& data, const LLMeshUploadThread::lod_sources_map_t& sources_list, + LLVector3& scale, bool upload_textures, bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position, - const std::string & upload_url, bool do_upload, + const std::string & upload_url, LLUUID destination_folder_id, bool do_upload, LLHandle<LLWholeModelFeeObserver> fee_observer, LLHandle<LLWholeModelUploadObserver> upload_observer) : LLThread("mesh upload"), @@ -2166,10 +2581,12 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, mDiscarded(false), mDoUpload(do_upload), mWholeModelUploadURL(upload_url), + mDestinationFolderId(destination_folder_id), mFeeObserverHandle(fee_observer), mUploadObserverHandle(upload_observer) { mInstanceList = data; + mLodSources = sources_list; mUploadTextures = upload_textures; mUploadSkin = upload_skin; mUploadJoints = upload_joints; @@ -2187,11 +2604,11 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, mMeshUploadTimeOut = gSavedSettings.getS32("MeshUploadTimeOut"); mHttpRequest = new LLCore::HttpRequest; - mHttpOptions = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); + mHttpOptions = std::make_shared<LLCore::HttpOptions>(); mHttpOptions->setTransferTimeout(mMeshUploadTimeOut); mHttpOptions->setUseRetryAfter(gSavedSettings.getBOOL("MeshUseHttpRetryAfter")); mHttpOptions->setRetries(UPLOAD_RETRY_LIMIT); - mHttpHeaders = LLCore::HttpHeaders::ptr_t(new LLCore::HttpHeaders); + mHttpHeaders = std::make_shared<LLCore::HttpHeaders>(); mHttpHeaders->append(HTTP_OUT_HEADER_CONTENT_TYPE, HTTP_CONTENT_LLSD_XML); mHttpPolicyClass = LLAppViewer::instance()->getAppCoreHttp().getPolicy(LLAppCoreHttp::AP_UPLOADS); } @@ -2202,7 +2619,6 @@ LLMeshUploadThread::~LLMeshUploadThread() mHttpRequest = NULL; delete mMutex; mMutex = NULL; - } LLMeshUploadThread::DecompRequest::DecompRequest(LLModel* mdl, LLModel* base_model, LLMeshUploadThread* thread) @@ -2236,7 +2652,7 @@ void LLMeshUploadThread::DecompRequest::completed() void LLMeshUploadThread::preStart() { //build map of LLModel refs to instances for callbacks - for (instance_list::iterator iter = mInstanceList.begin(); iter != mInstanceList.end(); ++iter) + for (instance_list_t::iterator iter = mInstanceList.begin(); iter != mInstanceList.end(); ++iter) { mInstance[iter->mModel].push_back(*iter); } @@ -2270,6 +2686,8 @@ void dump_llsd_to_file(const LLSD& content, std::string filename) { if (gSavedSettings.getBOOL("MeshUploadLogXML")) { + filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, + filename); llofstream of(filename.c_str()); LLSDSerialize::toPrettyXML(content,of); } @@ -2283,346 +2701,302 @@ LLSD llsd_from_file(std::string filename) return result; } -void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures) +void LLMeshUploadThread::packModelIntance( + LLModel* model, + LLMeshUploadThread::instance_list_t& instance_list, + std::string& model_name, + LLSD& res, + S32& mesh_num, + S32& texture_num, + S32& instance_num, + std::unordered_set<LLViewerTexture* >& textures, + std::unordered_map<LLViewerTexture*, S32> texture_index, + std::unordered_map<LLModel*, S32>& mesh_index, + std::vector<std::string>& texture_list_dest, + bool include_textures + ) { - LLSD result; - - LLSD res; - result["folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_OBJECT); - result["texture_folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE); - result["asset_type"] = "mesh"; - result["inventory_type"] = "object"; - result["description"] = "(No Description)"; - result["next_owner_mask"] = LLSD::Integer(LLFloaterPerms::getNextOwnerPerms("Uploads")); - result["group_mask"] = LLSD::Integer(LLFloaterPerms::getGroupPerms("Uploads")); - result["everyone_mask"] = LLSD::Integer(LLFloaterPerms::getEveryonePerms("Uploads")); + LLMeshUploadData data; + data.mBaseModel = model; - res["mesh_list"] = LLSD::emptyArray(); - res["texture_list"] = LLSD::emptyArray(); - res["instance_list"] = LLSD::emptyArray(); - S32 mesh_num = 0; - S32 texture_num = 0; - - std::unordered_set<LLViewerTexture* > textures; - std::unordered_map<LLViewerTexture*,S32> texture_index; - - std::unordered_map<LLModel*,S32> mesh_index; - std::string model_name; - - S32 instance_num = 0; - - for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter) + LLModelInstance& first_instance = *(instance_list.begin()); + for (S32 i = 0; i < 5; i++) { - LLMeshUploadData data; - data.mBaseModel = iter->first; + data.mModel[i] = first_instance.mLOD[i]; + } - if (data.mBaseModel->mSubmodelID) + if (mesh_index.find(data.mBaseModel) == mesh_index.end()) + { + // Have not seen this model before - create a new mesh_list entry for it. + if (model_name.empty()) { - // These are handled below to insure correct parenting order on creation - // due to map walking being based on model address (aka random) - continue; + model_name = data.mBaseModel->getName(); } - LLModelInstance& first_instance = *(iter->second.begin()); - for (S32 i = 0; i < 5; i++) - { - data.mModel[i] = first_instance.mLOD[i]; - } + std::stringstream ostr; - if (mesh_index.find(data.mBaseModel) == mesh_index.end()) - { - // Have not seen this model before - create a new mesh_list entry for it. - if (model_name.empty()) - { - model_name = data.mBaseModel->getName(); - } + LLModel::Decomposition& decomp = + data.mModel[LLModel::LOD_PHYSICS].notNull() ? + data.mModel[LLModel::LOD_PHYSICS]->mPhysics : + data.mBaseModel->mPhysics; - std::stringstream ostr; + decomp.mBaseHull = mHullMap[data.mBaseModel]; - LLModel::Decomposition& decomp = - data.mModel[LLModel::LOD_PHYSICS].notNull() ? - data.mModel[LLModel::LOD_PHYSICS]->mPhysics : - data.mBaseModel->mPhysics; + 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, + mLockScaleIfJointPosition, + LLModel::WRITE_BINARY, + false, + data.mBaseModel->mSubmodelID); - decomp.mBaseHull = mHullMap[data.mBaseModel]; + data.mAssetData = ostr.str(); + std::string str = ostr.str(); - 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, - mLockScaleIfJointPosition, - false, - false, - data.mBaseModel->mSubmodelID); + res["mesh_list"][mesh_num] = LLSD::Binary(str.begin(), str.end()); + mesh_index[data.mBaseModel] = mesh_num; + mesh_num++; + } - data.mAssetData = ostr.str(); - std::string str = ostr.str(); + // For all instances that use this model + for (instance_list_t::iterator instance_iter = instance_list.begin(); + instance_iter != instance_list.end(); + ++instance_iter) + { + LLModelInstance& instance = *instance_iter; - res["mesh_list"][mesh_num] = LLSD::Binary(str.begin(),str.end()); - mesh_index[data.mBaseModel] = mesh_num; - mesh_num++; - } + LLSD instance_entry; - // For all instances that use this model - for (instance_list::iterator instance_iter = iter->second.begin(); - instance_iter != iter->second.end(); - ++instance_iter) + for (S32 i = 0; i < 5; i++) { + data.mModel[i] = instance.mLOD[i]; + } - LLModelInstance& instance = *instance_iter; - - LLSD instance_entry; + LLVector3 pos, scale; + LLQuaternion rot; + LLMatrix4 transformation = instance.mTransform; + decomposeMeshMatrix(transformation, pos, rot, scale); + instance_entry["position"] = ll_sd_from_vector3(pos); + instance_entry["rotation"] = ll_sd_from_quaternion(rot); + instance_entry["scale"] = ll_sd_from_vector3(scale); - for (S32 i = 0; i < 5; i++) - { - data.mModel[i] = instance.mLOD[i]; - } + instance_entry["material"] = LL_MCODE_WOOD; + if (model->mSubmodelID) + { + // Should it really be different? + instance_entry["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_NONE); + } + else + { + instance_entry["physics_shape_type"] = data.mModel[LLModel::LOD_PHYSICS].notNull() ? (U8)(LLViewerObject::PHYSICS_SHAPE_PRIM) : (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL); + } + instance_entry["mesh"] = mesh_index[data.mBaseModel]; + instance_entry["mesh_name"] = instance.mLabel; - LLVector3 pos, scale; - LLQuaternion rot; - LLMatrix4 transformation = instance.mTransform; - decomposeMeshMatrix(transformation,pos,rot,scale); - instance_entry["position"] = ll_sd_from_vector3(pos); - instance_entry["rotation"] = ll_sd_from_quaternion(rot); - instance_entry["scale"] = ll_sd_from_vector3(scale); + instance_entry["face_list"] = LLSD::emptyArray(); - instance_entry["material"] = LL_MCODE_WOOD; - instance_entry["physics_shape_type"] = data.mModel[LLModel::LOD_PHYSICS].notNull() ? (U8)(LLViewerObject::PHYSICS_SHAPE_PRIM) : (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL); - instance_entry["mesh"] = mesh_index[data.mBaseModel]; - instance_entry["mesh_name"] = instance.mLabel; + // We want to be able to allow more than 8 materials... + // + S32 end = llmin((S32)data.mBaseModel->mMaterialList.size(), instance.mModel->getNumVolumeFaces()); - instance_entry["face_list"] = LLSD::emptyArray(); + for (S32 face_num = 0; face_num < end; face_num++) + { + // multiple faces can reuse the same material + LLImportMaterial& material = instance.mMaterial[data.mBaseModel->mMaterialList[face_num]]; + LLSD face_entry = LLSD::emptyMap(); - // We want to be able to allow more than 8 materials... - // - S32 end = llmin((S32)data.mBaseModel->mMaterialList.size(), instance.mModel->getNumVolumeFaces()) ; + LLViewerFetchedTexture* texture = NULL; - for (S32 face_num = 0; face_num < end; face_num++) + if (material.mDiffuseMapFilename.size()) { - // multiple faces can reuse the same material - LLImportMaterial& material = instance.mMaterial[data.mBaseModel->mMaterialList[face_num]]; - LLSD face_entry = LLSD::emptyMap(); + texture = FindViewerTexture(material); + } - LLViewerFetchedTexture *texture = NULL; + if ((texture != NULL) && + (textures.find(texture) == textures.end())) + { + textures.insert(texture); + } - if (material.mDiffuseMapFilename.size()) + std::stringstream texture_str; + if (texture != NULL && include_textures && mUploadTextures) + { + if (texture->hasSavedRawImage()) { - texture = FindViewerTexture(material); - } + LLImageDataLock lock(texture->getSavedRawImage()); - if ((texture != NULL) && - (textures.find(texture) == textures.end())) - { - textures.insert(texture); - } + LLPointer<LLImageJ2C> upload_file = + LLViewerTextureList::convertToUploadFile(texture->getSavedRawImage()); - std::stringstream texture_str; - if (texture != NULL && include_textures && mUploadTextures) - { - if (texture->hasSavedRawImage()) + if (!upload_file.isNull() && upload_file->getDataSize() && !upload_file->isBufferInvalid()) { - LLImageDataLock lock(texture->getSavedRawImage()); - - LLPointer<LLImageJ2C> upload_file = - LLViewerTextureList::convertToUploadFile(texture->getSavedRawImage()); - - if (!upload_file.isNull() && upload_file->getDataSize()) - { - texture_str.write((const char*) upload_file->getData(), upload_file->getDataSize()); - } + texture_str.write((const char*)upload_file->getData(), upload_file->getDataSize()); } } + } - if (texture != NULL && - mUploadTextures && - texture_index.find(texture) == texture_index.end()) - { - texture_index[texture] = texture_num; - std::string str = texture_str.str(); - res["texture_list"][texture_num] = LLSD::Binary(str.begin(),str.end()); - texture_num++; - } - - // Subset of TextureEntry fields. - if (texture != NULL && mUploadTextures) - { - face_entry["image"] = texture_index[texture]; - face_entry["scales"] = 1.0; - face_entry["scalet"] = 1.0; - face_entry["offsets"] = 0.0; - face_entry["offsett"] = 0.0; - face_entry["imagerot"] = 0.0; - } - face_entry["diffuse_color"] = ll_sd_from_color4(material.mDiffuseColor); - face_entry["fullbright"] = material.mFullbright; - instance_entry["face_list"][face_num] = face_entry; + if (texture != NULL && + mUploadTextures && + texture_index.find(texture) == texture_index.end()) + { + texture_index[texture] = texture_num; + std::string str = texture_str.str(); + res["texture_list"][texture_num] = LLSD::Binary(str.begin(), str.end()); + // store indexes for error handling; + texture_list_dest.push_back(material.mDiffuseMapFilename); + texture_num++; } - res["instance_list"][instance_num] = instance_entry; - instance_num++; + // Subset of TextureEntry fields. + if (texture != NULL && mUploadTextures) + { + face_entry["image"] = texture_index[texture]; + face_entry["scales"] = 1.0; + face_entry["scalet"] = 1.0; + face_entry["offsets"] = 0.0; + face_entry["offsett"] = 0.0; + face_entry["imagerot"] = 0.0; + } + face_entry["diffuse_color"] = ll_sd_from_color4(material.mDiffuseColor); + face_entry["fullbright"] = material.mFullbright; + instance_entry["face_list"][face_num] = face_entry; } + + res["instance_list"][instance_num] = instance_entry; + instance_num++; + } +} + +void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, std::vector<std::string>& texture_list_dest, bool include_textures) +{ + LLSD result; + + LLSD res; + if (mDestinationFolderId.isNull()) + { + result["folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_OBJECT); + result["texture_folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE); } + else + { + result["folder_id"] = mDestinationFolderId; + result["texture_folder_id"] = mDestinationFolderId; + } + result["asset_type"] = "mesh"; + result["inventory_type"] = "object"; + result["description"] = "(No Description)"; + result["next_owner_mask"] = LLSD::Integer(LLFloaterPerms::getNextOwnerPerms("Uploads")); + result["group_mask"] = LLSD::Integer(LLFloaterPerms::getGroupPerms("Uploads")); + result["everyone_mask"] = LLSD::Integer(LLFloaterPerms::getEveryonePerms("Uploads")); - for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter) + res["mesh_list"] = LLSD::emptyArray(); + res["texture_list"] = LLSD::emptyArray(); + res["instance_list"] = LLSD::emptyArray(); + LLSD& lod_sources = res["source_format"]; + lod_sources["high"] = 0; + for (auto &source : mLodSources) { - LLMeshUploadData data; - data.mBaseModel = iter->first; + lod_sources[source.first] = source.second; + } + S32 mesh_num = 0; + S32 texture_num = 0; + S32 instance_num = 0; + + std::unordered_set<LLViewerTexture* > textures; + std::unordered_map<LLViewerTexture*,S32> texture_index; - if (!data.mBaseModel->mSubmodelID) + std::unordered_map<LLModel*,S32> mesh_index; + std::string model_name; + + // If server gets a m1, m2, m3, m4 list, m1 becomes the root + // and the rest go as m4, m3, m2 + // to counter that mInstance is sorted as m4, m3, m2, m1 + // and we grab m1 from the end and send it first + LLModel* root_model = nullptr; + for (instance_map_t::reverse_iterator iter = mInstance.rbegin(); iter != mInstance.rend(); ++iter) + { + if (iter->first->mSubmodelID) { - // These were handled above already... - // + // Submodel can't be root continue; } + root_model = iter->first; + packModelIntance( + iter->first, + iter->second, + model_name, + res, + mesh_num, + texture_num, + instance_num, + textures, + texture_index, + mesh_index, + texture_list_dest, + include_textures); + break; + } - LLModelInstance& first_instance = *(iter->second.begin()); - for (S32 i = 0; i < 5; i++) + // Handle models, ignore submodels for now. + // Probably should pre-sort by mSubmodelID instead of running twice. + // Note: mInstance should be sorted by model name for the sake of + // deterministic order. + for (auto& iter : mInstance) + { + if (iter.first->mSubmodelID) { - data.mModel[i] = first_instance.mLOD[i]; + // These are handled below to insure correct parenting order on creation + // due to map walking being based on model address (aka random) + continue; } - - if (mesh_index.find(data.mBaseModel) == mesh_index.end()) + if (root_model == iter.first) { - // Have not seen this model before - create a new mesh_list entry for it. - if (model_name.empty()) - { - model_name = data.mBaseModel->getName(); - } - - 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, - mLockScaleIfJointPosition, - false, - false, - data.mBaseModel->mSubmodelID); - - data.mAssetData = ostr.str(); - std::string str = ostr.str(); - - res["mesh_list"][mesh_num] = LLSD::Binary(str.begin(),str.end()); - mesh_index[data.mBaseModel] = mesh_num; - mesh_num++; + // Reached root, root was already packed and is last non-submodel + break; } + packModelIntance( + iter.first, + iter.second, + model_name, + res, + mesh_num, + texture_num, + instance_num, + textures, + texture_index, + mesh_index, + texture_list_dest, + include_textures); + } - // For all instances that use this model - for (instance_list::iterator instance_iter = iter->second.begin(); - instance_iter != iter->second.end(); - ++instance_iter) + // Now handle the submodels. + for (auto& iter : mInstance) + { + if (!iter.first->mSubmodelID) { - - LLModelInstance& instance = *instance_iter; - - LLSD instance_entry; - - for (S32 i = 0; i < 5; i++) - { - data.mModel[i] = instance.mLOD[i]; - } - - LLVector3 pos, scale; - LLQuaternion rot; - LLMatrix4 transformation = instance.mTransform; - decomposeMeshMatrix(transformation,pos,rot,scale); - instance_entry["position"] = ll_sd_from_vector3(pos); - instance_entry["rotation"] = ll_sd_from_quaternion(rot); - instance_entry["scale"] = ll_sd_from_vector3(scale); - - instance_entry["material"] = LL_MCODE_WOOD; - instance_entry["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_NONE); - instance_entry["mesh"] = mesh_index[data.mBaseModel]; - - instance_entry["face_list"] = LLSD::emptyArray(); - - // We want to be able to allow more than 8 materials... - // - S32 end = llmin((S32)instance.mMaterial.size(), instance.mModel->getNumVolumeFaces()) ; - - for (S32 face_num = 0; face_num < end; face_num++) - { - LLImportMaterial& material = instance.mMaterial[data.mBaseModel->mMaterialList[face_num]]; - LLSD face_entry = LLSD::emptyMap(); - - LLViewerFetchedTexture *texture = NULL; - - if (material.mDiffuseMapFilename.size()) - { - texture = FindViewerTexture(material); - } - - if ((texture != NULL) && - (textures.find(texture) == textures.end())) - { - textures.insert(texture); - } - - std::stringstream texture_str; - if (texture != NULL && include_textures && mUploadTextures) - { - if (texture->hasSavedRawImage()) - { - LLImageDataLock lock(texture->getSavedRawImage()); - - LLPointer<LLImageJ2C> upload_file = - LLViewerTextureList::convertToUploadFile(texture->getSavedRawImage()); - - if (!upload_file.isNull() && upload_file->getDataSize()) - { - texture_str.write((const char*) upload_file->getData(), upload_file->getDataSize()); - } - } - } - - if (texture != NULL && - mUploadTextures && - texture_index.find(texture) == texture_index.end()) - { - texture_index[texture] = texture_num; - std::string str = texture_str.str(); - res["texture_list"][texture_num] = LLSD::Binary(str.begin(),str.end()); - texture_num++; - } - - // Subset of TextureEntry fields. - if (texture != NULL && mUploadTextures) - { - face_entry["image"] = texture_index[texture]; - face_entry["scales"] = 1.0; - face_entry["scalet"] = 1.0; - face_entry["offsets"] = 0.0; - face_entry["offsett"] = 0.0; - face_entry["imagerot"] = 0.0; - } - face_entry["diffuse_color"] = ll_sd_from_color4(material.mDiffuseColor); - face_entry["fullbright"] = material.mFullbright; - instance_entry["face_list"][face_num] = face_entry; - } - - res["instance_list"][instance_num] = instance_entry; - instance_num++; + // These were handled above already... + continue; } + packModelIntance( + iter.first, + iter.second, + model_name, + res, + mesh_num, + texture_num, + instance_num, + textures, + texture_index, + mesh_index, + texture_list_dest, + include_textures); } if (model_name.empty()) model_name = "mesh model"; @@ -2638,7 +3012,7 @@ void LLMeshUploadThread::generateHulls() { bool has_valid_requests = false ; - for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter) + for (instance_map_t::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter) { LLMeshUploadData data; data.mBaseModel = iter->first; @@ -2710,7 +3084,8 @@ void LLMeshUploadThread::doWholeModelUpload() LL_DEBUGS(LOG_MESH) << "Hull generation completed." << LL_ENDL; mModelData = LLSD::emptyMap(); - wholeModelToLLSD(mModelData, true); + mTextureFiles.clear(); + wholeModelToLLSD(mModelData, mTextureFiles, true); LLSD body = mModelData["asset_resources"]; dump_llsd_to_file(body, make_dump_name("whole_model_body_", dump_num)); @@ -2763,7 +3138,8 @@ void LLMeshUploadThread::requestWholeModelFee() generateHulls(); mModelData = LLSD::emptyMap(); - wholeModelToLLSD(mModelData, false); + mTextureFiles.clear(); + wholeModelToLLSD(mModelData, mTextureFiles, false); dump_llsd_to_file(mModelData, make_dump_name("whole_model_fee_request_", dump_num)); LLCore::HttpHandle handle = LLCoreHttpUtil::requestPostWithLLSD(mHttpRequest, mHttpPolicyClass, @@ -2829,7 +3205,7 @@ void LLMeshUploadThread::onCompleted(LLCore::HttpHandle handle, LLCore::HttpResp body["error"] = LLSD::emptyMap(); body["error"]["message"] = reason; body["error"]["identifier"] = "NetworkError"; // from asset-upload/upload_util.py - log_upload_error(status, body, "upload", mModelData["name"].asString()); + log_upload_error(status, body, "upload", mModelData["name"].asString(), mTextureFiles); if (observer) { @@ -2864,7 +3240,7 @@ void LLMeshUploadThread::onCompleted(LLCore::HttpHandle handle, LLCore::HttpResp else { LL_WARNS(LOG_MESH) << "Upload failed. Not in expected 'complete' state." << LL_ENDL; - log_upload_error(status, body, "upload", mModelData["name"].asString()); + log_upload_error(status, body, "upload", mModelData["name"].asString(), mTextureFiles); if (observer) { @@ -2889,7 +3265,7 @@ void LLMeshUploadThread::onCompleted(LLCore::HttpHandle handle, LLCore::HttpResp body["error"] = LLSD::emptyMap(); body["error"]["message"] = reason; body["error"]["identifier"] = "NetworkError"; // from asset-upload/upload_util.py - log_upload_error(status, body, "fee", mModelData["name"].asString()); + log_upload_error(status, body, "fee", mModelData["name"].asString(), mTextureFiles); if (observer) { @@ -2922,7 +3298,7 @@ void LLMeshUploadThread::onCompleted(LLCore::HttpHandle handle, LLCore::HttpResp else { LL_WARNS(LOG_MESH) << "Fee request failed. Not in expected 'upload' state." << LL_ENDL; - log_upload_error(status, body, "fee", mModelData["name"].asString()); + log_upload_error(status, body, "fee", mModelData["name"].asString(), mTextureFiles); if (observer) { @@ -2943,15 +3319,17 @@ void LLMeshRepoThread::notifyLoadedMeshes() return; } + LL_PROFILE_ZONE_SCOPED; + if (!mLoadedQ.empty()) { std::deque<LoadedMesh> loaded_queue; - mMutex->lock(); + mLoadedMutex->lock(); if (!mLoadedQ.empty()) { loaded_queue.swap(mLoadedQ); - mMutex->unlock(); + mLoadedMutex->unlock(); update_metrics = true; @@ -2960,44 +3338,52 @@ void LLMeshRepoThread::notifyLoadedMeshes() { if (mesh.mVolume->getNumVolumeFaces() > 0) { - gMeshRepo.notifyMeshLoaded(mesh.mMeshParams, mesh.mVolume); + gMeshRepo.notifyMeshLoaded(mesh.mMeshParams, mesh.mVolume, mesh.mLOD); } else { - gMeshRepo.notifyMeshUnavailable(mesh.mMeshParams, - LLVolumeLODGroup::getVolumeDetailFromScale(mesh.mVolume->getDetail())); + gMeshRepo.notifyMeshUnavailable(mesh.mMeshParams, mesh.mLOD, LLVolumeLODGroup::getVolumeDetailFromScale(mesh.mVolume->getDetail())); } } } + else + { + mLoadedMutex->unlock(); + } } if (!mUnavailableQ.empty()) { std::deque<LODRequest> unavil_queue; - mMutex->lock(); + mLoadedMutex->lock(); if (!mUnavailableQ.empty()) { unavil_queue.swap(mUnavailableQ); - mMutex->unlock(); + mLoadedMutex->unlock(); update_metrics = true; // Process the elements free of the lock for (const auto& req : unavil_queue) { - gMeshRepo.notifyMeshUnavailable(req.mMeshParams, req.mLOD); + gMeshRepo.notifyMeshUnavailable(req.mMeshParams, req.mLOD, req.mLOD); } } + else + { + mLoadedMutex->unlock(); + } } - if (!mSkinInfoQ.empty() || !mSkinUnavailableQ.empty() || ! mDecompositionQ.empty()) + if (!mSkinInfoQ.empty() || !mSkinUnavailableQ.empty() || !mDecompositionQ.empty() || !mPhysicsQ.empty()) { - if (mMutex->trylock()) + if (mLoadedMutex->trylock()) { std::deque<LLPointer<LLMeshSkinInfo>> skin_info_q; std::deque<UUIDBasedRequest> skin_info_unavail_q; std::list<LLModel::Decomposition*> decomp_q; + std::list<LLModel::Decomposition*> physics_q; if (! mSkinInfoQ.empty()) { @@ -3014,7 +3400,12 @@ void LLMeshRepoThread::notifyLoadedMeshes() decomp_q.swap(mDecompositionQ); } - mMutex->unlock(); + if (!mPhysicsQ.empty()) + { + physics_q.swap(mPhysicsQ); + } + + mLoadedMutex->unlock(); // Process the elements free of the lock while (! skin_info_q.empty()) @@ -3030,9 +3421,15 @@ void LLMeshRepoThread::notifyLoadedMeshes() while (! decomp_q.empty()) { - gMeshRepo.notifyDecompositionReceived(decomp_q.front()); + gMeshRepo.notifyDecompositionReceived(decomp_q.front(), false); decomp_q.pop_front(); } + + while (!physics_q.empty()) + { + gMeshRepo.notifyDecompositionReceived(physics_q.front(), true); + physics_q.pop_front(); + } } } @@ -3051,9 +3448,11 @@ S32 LLMeshRepoThread::getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lo if (iter != mMeshHeader.end()) { - auto& header = iter->second.second; - - return LLMeshRepository::getActualMeshLOD(header, lod); + auto& header = iter->second; + if (header.mHeaderSize > 0) + { + return LLMeshRepository::getActualMeshLOD(header, lod); + } } return lod; @@ -3220,7 +3619,10 @@ void LLMeshHandlerBase::onCompleted(LLCore::HttpHandle handle, LLCore::HttpRespo processData(body, body_offset, data, static_cast<S32>(data_size) - body_offset); - delete [] data; + if (mHasDataOwnership) + { + delete [] data; + } } // Release handler @@ -3253,7 +3655,7 @@ void LLMeshHeaderHandler::processFailure(LLCore::HttpStatus status) << LL_ENDL; // Can't get the header so none of the LODs will be available - LLMutexLock lock(gMeshRepo.mThread->mMutex); + LLMutexLock lock(gMeshRepo.mThread->mLoadedMutex); for (int i(0); i < LLVolumeLODGroup::NUM_LODS; ++i) { gMeshRepo.mThread->mUnavailableQ.push_back(LLMeshRepoThread::LODRequest(mMeshParams, i)); @@ -3263,6 +3665,7 @@ void LLMeshHeaderHandler::processFailure(LLCore::HttpStatus status) void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* body_offset */, U8 * data, S32 data_size) { + LL_PROFILE_ZONE_SCOPED; LLUUID mesh_id = mMeshParams.getSculptID(); bool success = (!MESH_HEADER_PROCESS_FAILED) && ((data != NULL) == (data_size > 0)); // if we have data but no size or have size but no data, something is wrong; @@ -3282,7 +3685,7 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b << LL_ENDL; // Can't get the header so none of the LODs will be available - LLMutexLock lock(gMeshRepo.mThread->mMutex); + LLMutexLock lock(gMeshRepo.mThread->mLoadedMutex); for (int i(0); i < LLVolumeLODGroup::NUM_LODS; ++i) { gMeshRepo.mThread->mUnavailableQ.push_back(LLMeshRepoThread::LODRequest(mMeshParams, i)); @@ -3298,8 +3701,8 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b LLMeshRepoThread::mesh_header_map::iterator iter = gMeshRepo.mThread->mMeshHeader.find(mesh_id); if (iter != gMeshRepo.mThread->mMeshHeader.end()) { - header_bytes = (S32)iter->second.first; - header = iter->second.second; + header = iter->second; + header_bytes = header.mHeaderSize; } if (header_bytes > 0 @@ -3324,7 +3727,7 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b // LLSD is smart and can work like smart pointer, is not thread safe. gMeshRepo.mThread->mHeaderMutex->unlock(); - S32 bytes = lod_bytes + header_bytes; + S32 bytes = lod_bytes + header_bytes + CACHE_PREAMBLE_SIZE; // It's possible for the remote asset to have more data than is needed for the local cache @@ -3337,6 +3740,11 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b LLMeshRepository::sCacheBytesWritten += data_size; ++LLMeshRepository::sCacheWrites; + // write preamble + U32 flags = header.getFlags(); + write_preamble(file, header_bytes, flags); + + // write header file.write(data, data_size); S32 remaining = bytes - file.tell(); @@ -3359,7 +3767,7 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b gMeshRepo.mThread->mHeaderMutex->unlock(); // headerReceived() parsed header, but header's data is invalid so none of the LODs will be available - LLMutexLock lock(gMeshRepo.mThread->mMutex); + LLMutexLock lock(gMeshRepo.mThread->mLoadedMutex); for (int i(0); i < LLVolumeLODGroup::NUM_LODS; ++i) { gMeshRepo.mThread->mUnavailableQ.push_back(LLMeshRepoThread::LODRequest(mMeshParams, i)); @@ -3388,9 +3796,64 @@ void LLMeshLODHandler::processFailure(LLCore::HttpStatus status) << " (" << status.toTerseString() << "). Not retrying." << LL_ENDL; - LLMutexLock lock(gMeshRepo.mThread->mMutex); + LLMutexLock lock(gMeshRepo.mThread->mLoadedMutex); gMeshRepo.mThread->mUnavailableQ.push_back(LLMeshRepoThread::LODRequest(mMeshParams, mLOD)); } +void LLMeshLODHandler::processLod(U8* data, S32 data_size) +{ + EMeshProcessingResult result = gMeshRepo.mThread->lodReceived(mMeshParams, mLOD, data, data_size); + if (result == MESH_OK) + { + // good fetch from sim, write to cache + LLFileSystem file(mMeshParams.getSculptID(), LLAssetType::AT_MESH, LLFileSystem::READ_WRITE); + + S32 offset = mOffset + CACHE_PREAMBLE_SIZE; + S32 size = mRequestedBytes; + + if (file.getSize() >= offset + size) + { + S32 header_bytes = 0; + U32 flags = 0; + { + LLMutexLock lock(gMeshRepo.mThread->mHeaderMutex); + + LLMeshRepoThread::mesh_header_map::iterator header_it = gMeshRepo.mThread->mMeshHeader.find(mMeshParams.getSculptID()); + if (header_it != gMeshRepo.mThread->mMeshHeader.end()) + { + LLMeshHeader& header = header_it->second; + // update header + if (!header.mLodInCache[mLOD]) + { + header.mLodInCache[mLOD] = true; + header_bytes = header.mHeaderSize; + flags = header.getFlags(); + } + // todo: handle else because we shouldn't have requested twice? + } + } + if (flags > 0) + { + write_preamble(file, header_bytes, flags); + } + + file.seek(offset, 0); + file.write(data, size); + LLMeshRepository::sCacheBytesWritten += size; + ++LLMeshRepository::sCacheWrites; + } + } + else + { + LL_WARNS(LOG_MESH) << "Error during mesh LOD processing. ID: " << mMeshParams.getSculptID() + << ", Reason: " << result + << " LOD: " << mLOD + << " Data size: " << data_size + << " Not retrying." + << LL_ENDL; + LLMutexLock lock(gMeshRepo.mThread->mLoadedMutex); + gMeshRepo.mThread->mUnavailableQ.push_back(LLMeshRepoThread::LODRequest(mMeshParams, mLOD)); + } +} void LLMeshLODHandler::processData(LLCore::BufferArray * /* body */, S32 /* body_offset */, U8 * data, S32 data_size) @@ -3399,33 +3862,31 @@ void LLMeshLODHandler::processData(LLCore::BufferArray * /* body */, S32 /* body if ((!MESH_LOD_PROCESS_FAILED) && ((data != NULL) == (data_size > 0))) // if we have data but no size or have size but no data, something is wrong { - EMeshProcessingResult result = gMeshRepo.mThread->lodReceived(mMeshParams, mLOD, data, data_size); - if (result == MESH_OK) + LLMeshHandlerBase::ptr_t shrd_handler = shared_from_this(); + bool posted = gMeshRepo.mThread->mMeshThreadPool->getQueue().post( + [shrd_handler, data, data_size] + () { - // good fetch from sim, write to cache - LLFileSystem file(mMeshParams.getSculptID(), LLAssetType::AT_MESH, LLFileSystem::READ_WRITE); - - S32 offset = mOffset; - S32 size = mRequestedBytes; - - if (file.getSize() >= offset+size) + if (gMeshRepo.mThread->isShuttingDown()) { - file.seek(offset); - file.write(data, size); - LLMeshRepository::sCacheBytesWritten += size; - ++LLMeshRepository::sCacheWrites; + delete[] data; + return; } + LLMeshLODHandler* handler = (LLMeshLODHandler * )shrd_handler.get(); + handler->processLod(data, data_size); + delete[] data; + }); + + if (posted) + { + // ownership of data was passed to the lambda + mHasDataOwnership = false; } else { - LL_WARNS(LOG_MESH) << "Error during mesh LOD processing. ID: " << mMeshParams.getSculptID() - << ", Reason: " << result - << " LOD: " << mLOD - << " Data size: " << data_size - << " Not retrying." - << LL_ENDL; - LLMutexLock lock(gMeshRepo.mThread->mMutex); - gMeshRepo.mThread->mUnavailableQ.push_back(LLMeshRepoThread::LODRequest(mMeshParams, mLOD)); + // mesh thread dies later than event queue, so this is normal + LL_INFOS_ONCE(LOG_MESH) << "Failed to post work into mMeshThreadPool" << LL_ENDL; + processLod(data, data_size); } } else @@ -3435,7 +3896,7 @@ void LLMeshLODHandler::processData(LLCore::BufferArray * /* body */, S32 /* body << " LOD: " << mLOD << " Data size: " << data_size << LL_ENDL; - LLMutexLock lock(gMeshRepo.mThread->mMutex); + LLMutexLock lock(gMeshRepo.mThread->mLoadedMutex); gMeshRepo.mThread->mUnavailableQ.push_back(LLMeshRepoThread::LODRequest(mMeshParams, mLOD)); } } @@ -3446,6 +3907,7 @@ LLMeshSkinInfoHandler::~LLMeshSkinInfoHandler() { LL_WARNS(LOG_MESH) << "deleting unprocessed request handler (may be ok on exit)" << LL_ENDL; } + LLMeshRepoThread::decActiveSkinRequests(); } void LLMeshSkinInfoHandler::processFailure(LLCore::HttpStatus status) @@ -3454,38 +3916,103 @@ void LLMeshSkinInfoHandler::processFailure(LLCore::HttpStatus status) << ", Reason: " << status.toString() << " (" << status.toTerseString() << "). Not retrying." << LL_ENDL; - LLMutexLock lock(gMeshRepo.mThread->mMutex); + LLMutexLock lock(gMeshRepo.mThread->mLoadedMutex); gMeshRepo.mThread->mSkinUnavailableQ.emplace_back(mMeshID); } -void LLMeshSkinInfoHandler::processData(LLCore::BufferArray * /* body */, S32 /* body_offset */, - U8 * data, S32 data_size) +void LLMeshSkinInfoHandler::processSkin(U8* data, S32 data_size) { - LL_PROFILE_ZONE_SCOPED; - if ((!MESH_SKIN_INFO_PROCESS_FAILED) - && ((data != NULL) == (data_size > 0)) // if we have data but no size or have size but no data, something is wrong - && gMeshRepo.mThread->skinInfoReceived(mMeshID, data, data_size)) + if (gMeshRepo.mThread->skinInfoReceived(mMeshID, data, data_size)) { // good fetch from sim, write to cache LLFileSystem file(mMeshID, LLAssetType::AT_MESH, LLFileSystem::READ_WRITE); - S32 offset = mOffset; + S32 offset = mOffset + CACHE_PREAMBLE_SIZE; S32 size = mRequestedBytes; - if (file.getSize() >= offset+size) + if (file.getSize() >= offset + size) { LLMeshRepository::sCacheBytesWritten += size; ++LLMeshRepository::sCacheWrites; - file.seek(offset); + + S32 header_bytes = 0; + U32 flags = 0; + { + LLMutexLock lock(gMeshRepo.mThread->mHeaderMutex); + + LLMeshRepoThread::mesh_header_map::iterator header_it = gMeshRepo.mThread->mMeshHeader.find(mMeshID); + if (header_it != gMeshRepo.mThread->mMeshHeader.end()) + { + LLMeshHeader& header = header_it->second; + // update header + if (!header.mSkinInCache) + { + header.mSkinInCache = true; + header_bytes = header.mHeaderSize; + flags = header.getFlags(); + } + // todo: handle else because we shouldn't have requested twice? + } + } + if (flags > 0) + { + write_preamble(file, header_bytes, flags); + } + + file.seek(offset, 0); file.write(data, size); } } else { LL_WARNS(LOG_MESH) << "Error during mesh skin info processing. ID: " << mMeshID + << ", Unknown reason. Not retrying." + << LL_ENDL; + LLMutexLock lock(gMeshRepo.mThread->mLoadedMutex); + gMeshRepo.mThread->mSkinUnavailableQ.emplace_back(mMeshID); + } +} + +void LLMeshSkinInfoHandler::processData(LLCore::BufferArray * /* body */, S32 /* body_offset */, + U8 * data, S32 data_size) +{ + LL_PROFILE_ZONE_SCOPED; + if ((!MESH_SKIN_INFO_PROCESS_FAILED) + && ((data != NULL) == (data_size > 0))) // if we have data but no size or have size but no data, something is wrong + { + LLMeshHandlerBase::ptr_t shrd_handler = shared_from_this(); + bool posted = gMeshRepo.mThread->mMeshThreadPool->getQueue().post( + [shrd_handler, data, data_size] + () + { + if (gMeshRepo.mThread->isShuttingDown()) + { + delete[] data; + return; + } + LLMeshSkinInfoHandler* handler = (LLMeshSkinInfoHandler*)shrd_handler.get(); + handler->processSkin(data, data_size); + delete[] data; + }); + + if (posted) + { + // ownership of data was passed to the lambda + mHasDataOwnership = false; + } + else + { + // mesh thread dies later than event queue, so this is normal + LL_INFOS_ONCE(LOG_MESH) << "Failed to post work into mMeshThreadPool" << LL_ENDL; + processSkin(data, data_size); + } + } + else + { + LL_WARNS(LOG_MESH) << "Error during mesh skin info processing. ID: " << mMeshID << ", Unknown reason. Not retrying." << LL_ENDL; - LLMutexLock lock(gMeshRepo.mThread->mMutex); + LLMutexLock lock(gMeshRepo.mThread->mLoadedMutex); gMeshRepo.mThread->mSkinUnavailableQ.emplace_back(mMeshID); } } @@ -3519,14 +4046,39 @@ void LLMeshDecompositionHandler::processData(LLCore::BufferArray * /* body */, S // good fetch from sim, write to cache LLFileSystem file(mMeshID, LLAssetType::AT_MESH, LLFileSystem::READ_WRITE); - S32 offset = mOffset; + S32 offset = mOffset + CACHE_PREAMBLE_SIZE; S32 size = mRequestedBytes; if (file.getSize() >= offset+size) { LLMeshRepository::sCacheBytesWritten += size; ++LLMeshRepository::sCacheWrites; - file.seek(offset); + + S32 header_bytes = 0; + U32 flags = 0; + { + LLMutexLock lock(gMeshRepo.mThread->mHeaderMutex); + + LLMeshRepoThread::mesh_header_map::iterator header_it = gMeshRepo.mThread->mMeshHeader.find(mMeshID); + if (header_it != gMeshRepo.mThread->mMeshHeader.end()) + { + LLMeshHeader& header = header_it->second; + // update header + if (!header.mPhysicsConvexInCache) + { + header.mPhysicsConvexInCache = true; + header_bytes = header.mHeaderSize; + flags = header.getFlags(); + } + // todo: handle else because we shouldn't have requested twice? + } + } + if (flags > 0) + { + write_preamble(file, header_bytes, flags); + } + + file.seek(offset, 0); file.write(data, size); } } @@ -3567,14 +4119,39 @@ void LLMeshPhysicsShapeHandler::processData(LLCore::BufferArray * /* body */, S3 // good fetch from sim, write to cache for caching LLFileSystem file(mMeshID, LLAssetType::AT_MESH, LLFileSystem::READ_WRITE); - S32 offset = mOffset; + S32 offset = mOffset + CACHE_PREAMBLE_SIZE; S32 size = mRequestedBytes; if (file.getSize() >= offset+size) { LLMeshRepository::sCacheBytesWritten += size; ++LLMeshRepository::sCacheWrites; - file.seek(offset); + + S32 header_bytes = 0; + U32 flags = 0; + { + LLMutexLock lock(gMeshRepo.mThread->mHeaderMutex); + + LLMeshRepoThread::mesh_header_map::iterator header_it = gMeshRepo.mThread->mMeshHeader.find(mMeshID); + if (header_it != gMeshRepo.mThread->mMeshHeader.end()) + { + LLMeshHeader& header = header_it->second; + // update header + if (!header.mPhysicsMeshInCache) + { + header.mPhysicsMeshInCache = true; + header_bytes = header.mHeaderSize; + flags = header.getFlags(); + } + // todo: handle else because we shouldn't have requested twice? + } + } + if (flags > 0) + { + write_preamble(file, header_bytes, flags); + } + + file.seek(offset, 0); file.write(data, size); } } @@ -3635,7 +4212,7 @@ void LLMeshRepository::shutdown() mUploads[i]->discard() ; //discard the uploading requests. } - mThread->mSignal->broadcast(); + mThread->cleanup(); while (!mThread->isStopped()) { @@ -3700,45 +4277,46 @@ void LLMeshRepository::unregisterMesh(LLVOVolume* vobj) { for (auto& param : lod) { - vector_replace_with_last(param.second, vobj); + vector_replace_with_last(param.second.mVolumes, vobj); } } for (auto& skin_pair : mLoadingSkins) { - vector_replace_with_last(skin_pair.second, vobj); + vector_replace_with_last(skin_pair.second.mVolumes, vobj); } } -S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_params, S32 detail, S32 last_lod) +S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_params, S32 new_lod, S32 last_lod) { LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK; //LL_LL_RECORD_BLOCK_TIME(FTM_MESH_FETCH); // Manage time-to-load metrics for mesh download operations. metricsProgress(1); - if (detail < 0 || detail >= LLVolumeLODGroup::NUM_LODS) + if (new_lod < 0 || new_lod >= LLVolumeLODGroup::NUM_LODS) { - return detail; + return new_lod; } { LLMutexLock lock(mMeshMutex); //add volume to list of loading meshes const auto& mesh_id = mesh_params.getSculptID(); - mesh_load_map::iterator iter = mLoadingMeshes[detail].find(mesh_id); - if (iter != mLoadingMeshes[detail].end()) + mesh_load_map::iterator iter = mLoadingMeshes[new_lod].find(mesh_id); + if (iter != mLoadingMeshes[new_lod].end()) { //request pending for this mesh, append volume id to list - auto it = std::find(iter->second.begin(), iter->second.end(), vobj); - if (it == iter->second.end()) { - iter->second.push_back(vobj); + auto it = std::find(iter->second.mVolumes.begin(), iter->second.mVolumes.end(), vobj); + if (it == iter->second.mVolumes.end()) { + iter->second.addVolume(vobj); } } else { //first request for this mesh - mLoadingMeshes[detail][mesh_id].push_back(vobj); - mPendingRequests.push_back(LLMeshRepoThread::LODRequest(mesh_params, detail)); + std::shared_ptr<PendingRequestBase> request = std::make_shared<PendingRequestLOD>(mesh_params, new_lod); + mPendingRequests.emplace_back(request); + mLoadingMeshes[new_lod][mesh_id].initData(vobj, request); LLMeshRepository::sLODPending++; } } @@ -3767,7 +4345,7 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para } //next, see what the next lowest LOD available might be - for (S32 i = detail-1; i >= 0; --i) + for (S32 i = new_lod -1; i >= 0; --i) { LLVolume* lod = group->refLOD(i); if (lod && lod->isMeshAssetLoaded() && lod->getNumVolumeFaces() > 0) @@ -3780,7 +4358,7 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para } //no lower LOD is a available, is a higher lod available? - for (S32 i = detail+1; i < LLVolumeLODGroup::NUM_LODS; ++i) + for (S32 i = new_lod+1; i < LLVolumeLODGroup::NUM_LODS; ++i) { LLVolume* lod = group->refLOD(i); if (lod && lod->isMeshAssetLoaded() && lod->getNumVolumeFaces() > 0) @@ -3794,7 +4372,7 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para } } - return detail; + return new_lod; } void LLMeshRepository::notifyLoadedMeshes() @@ -3918,6 +4496,7 @@ void LLMeshRepository::notifyLoadedMeshes() // erase from background thread mThread->mWorkQueue.post([=, this]() { + LLMutexLock(mThread->mSkinMapMutex); mThread->mSkinMap.erase(id); }); } @@ -3932,13 +4511,20 @@ void LLMeshRepository::notifyLoadedMeshes() { LLMutexTrylock lock1(mMeshMutex); LLMutexTrylock lock2(mThread->mMutex); + LLMutexTrylock lock3(mThread->mHeaderMutex); + LLMutexTrylock lock4(mThread->mPendingMutex); static U32 hold_offs(0); - if (! lock1.isLocked() || ! lock2.isLocked()) + if (! lock1.isLocked() || ! lock2.isLocked() || ! lock3.isLocked() || ! lock4.isLocked()) { // If we can't get the locks, skip and pick this up later. + // Eventually thread queue will be free enough ++hold_offs; sMaxLockHoldoffs = llmax(sMaxLockHoldoffs, hold_offs); + if (hold_offs > 4) + { + LL_WARNS_ONCE() << "High mesh thread holdoff" << LL_ENDL; + } return; } hold_offs = 0; @@ -3974,72 +4560,61 @@ void LLMeshRepository::notifyLoadedMeshes() mUploadErrorQ.pop(); } - S32 active_count = LLMeshRepoThread::sActiveHeaderRequests + LLMeshRepoThread::sActiveLODRequests; - if (active_count < LLMeshRepoThread::sRequestLowWater) + // mPendingRequests go into queues, queues go into active http requests. + // Checking sRequestHighWater to keep queues at least somewhat populated + // for faster transition into http + S32 active_count = LLMeshRepoThread::sActiveHeaderRequests + LLMeshRepoThread::sActiveLODRequests + LLMeshRepoThread::sActiveSkinRequests; + active_count += (S32)(mThread->mLODReqQ.size() + mThread->mHeaderReqQ.size() + mThread->mSkinInfoQ.size()); + if (active_count < LLMeshRepoThread::sRequestHighWater) { S32 push_count = LLMeshRepoThread::sRequestHighWater - active_count; if (mPendingRequests.size() > push_count) { + LL_PROFILE_ZONE_NAMED("Mesh score update"); // More requests than the high-water limit allows so // sort and forward the most important. - //calculate "score" for pending requests - - //create score map - std::map<LLUUID, F32> score_map; - - for (U32 i = 0; i < LLVolumeLODGroup::NUM_LODS; ++i) + // update "score" for pending requests + for (std::shared_ptr<PendingRequestBase>& req_p : mPendingRequests) { - for (mesh_load_map::iterator iter = mLoadingMeshes[i].begin(); iter != mLoadingMeshes[i].end(); ++iter) - { - F32 max_score = 0.f; - for (auto obj_iter = iter->second.begin(); obj_iter != iter->second.end(); ++obj_iter) - { - LLVOVolume* object = *obj_iter; - if (object) - { - LLDrawable* drawable = object->mDrawable; - if (drawable) - { - F32 cur_score = drawable->getRadius()/llmax(drawable->mDistanceWRTCamera, 1.f); - max_score = llmax(max_score, cur_score); - } - } - } - - score_map[iter->first] = max_score; - } - } - - //set "score" for pending requests - for (std::vector<LLMeshRepoThread::LODRequest>::iterator iter = mPendingRequests.begin(); iter != mPendingRequests.end(); ++iter) - { - iter->mScore = score_map[iter->mMeshParams.getSculptID()]; + req_p->checkScore(); } //sort by "score" std::partial_sort(mPendingRequests.begin(), mPendingRequests.begin() + push_count, - mPendingRequests.end(), LLMeshRepoThread::CompareScoreGreater()); + mPendingRequests.end(), PendingRequestBase::CompareScoreGreater()); } - while (!mPendingRequests.empty() && push_count > 0) { - LLMeshRepoThread::LODRequest& request = mPendingRequests.front(); - mThread->loadMeshLOD(request.mMeshParams, request.mLOD); + std::shared_ptr<PendingRequestBase>& req_p = mPendingRequests.front(); + // todo: check hasTrackedData here and erase request if none + // since this is supposed to mean that request was removed + switch (req_p->getRequestType()) + { + case MESH_REQUEST_LOD: + { + PendingRequestLOD* lod = (PendingRequestLOD*)req_p.get(); + mThread->loadMeshLOD(lod->mMeshParams, lod->mLOD); + LLMeshRepository::sLODPending--; + break; + } + case MESH_REQUEST_SKIN: + { + PendingRequestUUID* skin = (PendingRequestUUID*)req_p.get(); + mThread->loadMeshSkinInfo(skin->getId()); + break; + } + + default: + LL_ERRS() << "Unknown request type in LLMeshRepository::notifyLoadedMeshes" << LL_ENDL; + break; + } mPendingRequests.erase(mPendingRequests.begin()); - LLMeshRepository::sLODPending--; push_count--; } } - //send skin info requests - while (!mPendingSkinRequests.empty()) - { - mThread->loadMeshSkinInfo(mPendingSkinRequests.front()); - mPendingSkinRequests.pop(); - } - //send decomposition requests while (!mPendingDecompositionRequests.empty()) { @@ -4069,7 +4644,7 @@ void LLMeshRepository::notifySkinInfoReceived(LLMeshSkinInfo* info) skin_load_map::iterator iter = mLoadingSkins.find(info->mMeshID); if (iter != mLoadingSkins.end()) { - for (LLVOVolume* vobj : iter->second) + for (LLVOVolume* vobj : iter->second.mVolumes) { if (vobj) { @@ -4085,7 +4660,7 @@ void LLMeshRepository::notifySkinInfoUnavailable(const LLUUID& mesh_id) skin_load_map::iterator iter = mLoadingSkins.find(mesh_id); if (iter != mLoadingSkins.end()) { - for (LLVOVolume* vobj : iter->second) + for (LLVOVolume* vobj : iter->second.mVolumes) { if (vobj) { @@ -4096,13 +4671,13 @@ void LLMeshRepository::notifySkinInfoUnavailable(const LLUUID& mesh_id) } } -void LLMeshRepository::notifyDecompositionReceived(LLModel::Decomposition* decomp) +void LLMeshRepository::notifyDecompositionReceived(LLModel::Decomposition* decomp, bool physics_mesh) { - decomposition_map::iterator iter = mDecompositionMap.find(decomp->mMeshID); + LLUUID decomp_id = decomp->mMeshID; // Copy to avoid invalidation in below deletion + decomposition_map::iterator iter = mDecompositionMap.find(decomp_id); if (iter == mDecompositionMap.end()) { //just insert decomp into map - mDecompositionMap[decomp->mMeshID] = decomp; - mLoadingDecompositions.erase(decomp->mMeshID); + mDecompositionMap[decomp_id] = decomp; sCacheBytesDecomps += decomp->sizeBytes(); } else @@ -4110,21 +4685,27 @@ void LLMeshRepository::notifyDecompositionReceived(LLModel::Decomposition* decom sCacheBytesDecomps -= iter->second->sizeBytes(); iter->second->merge(decomp); sCacheBytesDecomps += iter->second->sizeBytes(); - - mLoadingDecompositions.erase(decomp->mMeshID); delete decomp; } + + if (physics_mesh) + { + mLoadingPhysicsShapes.erase(decomp_id); + } + else + { + mLoadingDecompositions.erase(decomp_id); + } } -void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVolume* volume) +void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVolume* volume, S32 lod) { //called from main thread - S32 detail = LLVolumeLODGroup::getVolumeDetailFromScale(volume->getDetail()); //get list of objects waiting to be notified this mesh is loaded const auto& mesh_id = mesh_params.getSculptID(); - mesh_load_map::iterator obj_iter = mLoadingMeshes[detail].find(mesh_id); + mesh_load_map::iterator obj_iter = mLoadingMeshes[lod].find(mesh_id); - if (volume && obj_iter != mLoadingMeshes[detail].end()) + if (volume && obj_iter != mLoadingMeshes[lod].end()) { //make sure target volume is still valid if (volume->getNumVolumeFaces() <= 0) @@ -4134,6 +4715,7 @@ void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVol } { //update system volume + S32 detail = LLVolumeLODGroup::getVolumeDetailFromScale(volume->getDetail()); LLVolume* sys_volume = LLPrimitive::getVolumeManager()->refVolume(mesh_params, detail); if (sys_volume) { @@ -4149,7 +4731,7 @@ void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVol } //notify waiting LLVOVolume instances that their requested mesh is available - for (LLVOVolume* vobj : obj_iter->second) + for (LLVOVolume* vobj : obj_iter->second.mVolumes) { if (vobj) { @@ -4157,29 +4739,29 @@ void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVol } } - mLoadingMeshes[detail].erase(obj_iter); + mLoadingMeshes[lod].erase(obj_iter); LLViewerStatsRecorder::instance().meshLoaded(); } } -void LLMeshRepository::notifyMeshUnavailable(const LLVolumeParams& mesh_params, S32 lod) +void LLMeshRepository::notifyMeshUnavailable(const LLVolumeParams& mesh_params, S32 request_lod, S32 volume_lod) { //called from main thread //get list of objects waiting to be notified this mesh is loaded const auto& mesh_id = mesh_params.getSculptID(); - mesh_load_map::iterator obj_iter = mLoadingMeshes[lod].find(mesh_id); - if (obj_iter != mLoadingMeshes[lod].end()) + mesh_load_map::iterator obj_iter = mLoadingMeshes[request_lod].find(mesh_id); + if (obj_iter != mLoadingMeshes[request_lod].end()) { - F32 detail = LLVolumeLODGroup::getVolumeScaleFromDetail(lod); + F32 detail = LLVolumeLODGroup::getVolumeScaleFromDetail(volume_lod); - LLVolume* sys_volume = LLPrimitive::getVolumeManager()->refVolume(mesh_params, lod); + LLVolume* sys_volume = LLPrimitive::getVolumeManager()->refVolume(mesh_params, volume_lod); if (sys_volume) { sys_volume->setMeshAssetUnavaliable(true); LLPrimitive::getVolumeManager()->unrefVolume(sys_volume); } - for (LLVOVolume* vobj : obj_iter->second) + for (LLVOVolume* vobj : obj_iter->second.mVolumes) { if (vobj) { @@ -4189,12 +4771,12 @@ void LLMeshRepository::notifyMeshUnavailable(const LLVolumeParams& mesh_params, obj_volume->getDetail() == detail && obj_volume->getParams() == mesh_params) { //should force volume to find most appropriate LOD - vobj->setVolume(obj_volume->getParams(), lod); + vobj->setVolume(obj_volume->getParams(), volume_lod); } } } - mLoadingMeshes[lod].erase(obj_iter); + mLoadingMeshes[request_lod].erase(obj_iter); } } @@ -4222,16 +4804,17 @@ const LLMeshSkinInfo* LLMeshRepository::getSkinInfo(const LLUUID& mesh_id, LLVOV skin_load_map::iterator iter = mLoadingSkins.find(mesh_id); if (iter != mLoadingSkins.end()) { //request pending for this mesh, append volume id to list - auto it = std::find(iter->second.begin(), iter->second.end(), requesting_obj); - if (it == iter->second.end()) { - iter->second.push_back(requesting_obj); + auto it = std::find(iter->second.mVolumes.begin(), iter->second.mVolumes.end(), requesting_obj); + if (it == iter->second.mVolumes.end()) { + iter->second.addVolume(requesting_obj); } } else { //first request for this mesh - mLoadingSkins[mesh_id].push_back(requesting_obj); - mPendingSkinRequests.push(mesh_id); + std::shared_ptr<PendingRequestBase> request = std::make_shared<PendingRequestUUID>(mesh_id, MESH_REQUEST_SKIN); + mLoadingSkins[mesh_id].initData(requesting_obj, request); + mPendingRequests.emplace_back(request); } } } @@ -4259,7 +4842,6 @@ void LLMeshRepository::fetchPhysicsShape(const LLUUID& mesh_id) std::unordered_set<LLUUID>::iterator iter = mLoadingPhysicsShapes.find(mesh_id); if (iter == mLoadingPhysicsShapes.end()) { //no request pending for this skin info - // *FIXME: Nothing ever deletes entries, can't be right mLoadingPhysicsShapes.insert(mesh_id); mPendingPhysicsShapeRequests.push(mesh_id); } @@ -4358,7 +4940,7 @@ bool LLMeshRepository::hasSkinInfo(const LLUUID& mesh_id) return false; } -bool LLMeshRepository::hasHeader(const LLUUID& mesh_id) +bool LLMeshRepository::hasHeader(const LLUUID& mesh_id) const { if (mesh_id.isNull()) { @@ -4368,13 +4950,13 @@ bool LLMeshRepository::hasHeader(const LLUUID& mesh_id) return mThread->hasHeader(mesh_id); } -bool LLMeshRepoThread::hasPhysicsShapeInHeader(const LLUUID& mesh_id) +bool LLMeshRepoThread::hasPhysicsShapeInHeader(const LLUUID& mesh_id) const { LLMutexLock lock(mHeaderMutex); - mesh_header_map::iterator iter = mMeshHeader.find(mesh_id); - if (iter != mMeshHeader.end() && iter->second.first > 0) + mesh_header_map::const_iterator iter = mMeshHeader.find(mesh_id); + if (iter != mMeshHeader.end() && iter->second.mHeaderSize > 0) { - LLMeshHeader &mesh = iter->second.second; + const LLMeshHeader &mesh = iter->second; if (mesh.mPhysicsMeshSize > 0) { return true; @@ -4384,13 +4966,13 @@ bool LLMeshRepoThread::hasPhysicsShapeInHeader(const LLUUID& mesh_id) return false; } -bool LLMeshRepoThread::hasSkinInfoInHeader(const LLUUID& mesh_id) +bool LLMeshRepoThread::hasSkinInfoInHeader(const LLUUID& mesh_id) const { LLMutexLock lock(mHeaderMutex); - mesh_header_map::iterator iter = mMeshHeader.find(mesh_id); - if (iter != mMeshHeader.end() && iter->second.first > 0) + mesh_header_map::const_iterator iter = mMeshHeader.find(mesh_id); + if (iter != mMeshHeader.end() && iter->second.mHeaderSize > 0) { - LLMeshHeader& mesh = iter->second.second; + const LLMeshHeader& mesh = iter->second; if (mesh.mSkinOffset >= 0 && mesh.mSkinSize > 0) { @@ -4401,34 +4983,35 @@ bool LLMeshRepoThread::hasSkinInfoInHeader(const LLUUID& mesh_id) return false; } -bool LLMeshRepoThread::hasHeader(const LLUUID& mesh_id) +bool LLMeshRepoThread::hasHeader(const LLUUID& mesh_id) const { LLMutexLock lock(mHeaderMutex); - mesh_header_map::iterator iter = mMeshHeader.find(mesh_id); + mesh_header_map::const_iterator iter = mMeshHeader.find(mesh_id); return iter != mMeshHeader.end(); } -void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures, +void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, const std::map<std::string, std::string> &lod_sources, + LLVector3& scale, bool upload_textures, bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position, - std::string upload_url, bool do_upload, + std::string upload_url, const LLUUID& destination_folder_id, bool do_upload, LLHandle<LLWholeModelFeeObserver> fee_observer, LLHandle<LLWholeModelUploadObserver> upload_observer) { - LLMeshUploadThread* thread = new LLMeshUploadThread(data, scale, upload_textures, + LLMeshUploadThread* thread = new LLMeshUploadThread(data, lod_sources, scale, upload_textures, upload_skin, upload_joints, lock_scale_if_joint_position, - upload_url, do_upload, fee_observer, upload_observer); + upload_url, destination_folder_id, do_upload, fee_observer, upload_observer); mUploadWaitList.push_back(thread); } -S32 LLMeshRepository::getMeshSize(const LLUUID& mesh_id, S32 lod) +S32 LLMeshRepository::getMeshSize(const LLUUID& mesh_id, S32 lod) const { LL_PROFILE_ZONE_SCOPED_CATEGORY_VOLUME; if (mThread && mesh_id.notNull() && LLPrimitive::NO_LOD != lod) { LLMutexLock lock(mThread->mHeaderMutex); - LLMeshRepoThread::mesh_header_map::iterator iter = mThread->mMeshHeader.find(mesh_id); - if (iter != mThread->mMeshHeader.end() && iter->second.first > 0) + LLMeshRepoThread::mesh_header_map::const_iterator iter = mThread->mMeshHeader.find(mesh_id); + if (iter != mThread->mMeshHeader.end() && iter->second.mHeaderSize > 0) { - const LLMeshHeader& header = iter->second.second; + const LLMeshHeader& header = iter->second; if (header.m404) { @@ -4532,9 +5115,9 @@ F32 LLMeshRepository::getStreamingCostLegacy(LLUUID mesh_id, F32 radius, S32* by { LLMutexLock lock(mThread->mHeaderMutex); LLMeshRepoThread::mesh_header_map::iterator iter = mThread->mMeshHeader.find(mesh_id); - if (iter != mThread->mMeshHeader.end() && iter->second.first > 0) + if (iter != mThread->mMeshHeader.end() && iter->second.mHeaderSize > 0) { - result = getStreamingCostLegacy(iter->second.second, radius, bytes, bytes_visible, lod, unscaled_value); + result = getStreamingCostLegacy(iter->second, radius, bytes, bytes_visible, lod, unscaled_value); } } if (result > 0.f) @@ -4726,7 +5309,7 @@ bool LLMeshCostData::init(const LLMeshHeader& header) } -S32 LLMeshCostData::getSizeByLOD(S32 lod) +S32 LLMeshCostData::getSizeByLOD(S32 lod) const { if (llclamp(lod,0,3) != lod) { @@ -4735,12 +5318,12 @@ S32 LLMeshCostData::getSizeByLOD(S32 lod) return mSizeByLOD[lod]; } -S32 LLMeshCostData::getSizeTotal() +S32 LLMeshCostData::getSizeTotal() const { return mSizeByLOD[0] + mSizeByLOD[1] + mSizeByLOD[2] + mSizeByLOD[3]; } -F32 LLMeshCostData::getEstTrisByLOD(S32 lod) +F32 LLMeshCostData::getEstTrisByLOD(S32 lod) const { if (llclamp(lod,0,3) != lod) { @@ -4749,12 +5332,12 @@ F32 LLMeshCostData::getEstTrisByLOD(S32 lod) return mEstTrisByLOD[lod]; } -F32 LLMeshCostData::getEstTrisMax() +F32 LLMeshCostData::getEstTrisMax() const { return llmax(mEstTrisByLOD[0], mEstTrisByLOD[1], mEstTrisByLOD[2], mEstTrisByLOD[3]); } -F32 LLMeshCostData::getRadiusWeightedTris(F32 radius) +F32 LLMeshCostData::getRadiusWeightedTris(F32 radius) const { F32 max_distance = 512.f; @@ -4798,7 +5381,7 @@ F32 LLMeshCostData::getRadiusWeightedTris(F32 radius) return weighted_avg; } -F32 LLMeshCostData::getEstTrisForStreamingCost() +F32 LLMeshCostData::getEstTrisForStreamingCost() const { LL_DEBUGS("StreamingCost") << "tris_by_lod: " << mEstTrisByLOD[0] << ", " @@ -4808,7 +5391,7 @@ F32 LLMeshCostData::getEstTrisForStreamingCost() F32 charged_tris = mEstTrisByLOD[3]; F32 allowed_tris = mEstTrisByLOD[3]; - const F32 ENFORCE_FLOOR = 64.0f; + constexpr F32 ENFORCE_FLOOR = 64.0f; for (S32 i=2; i>=0; i--) { // How many tris can we have in this LOD without affecting land impact? @@ -4825,13 +5408,13 @@ F32 LLMeshCostData::getEstTrisForStreamingCost() return charged_tris; } -F32 LLMeshCostData::getRadiusBasedStreamingCost(F32 radius) +F32 LLMeshCostData::getRadiusBasedStreamingCost(F32 radius) const { static LLCachedControl<U32> mesh_triangle_budget(gSavedSettings, "MeshTriangleBudget"); return getRadiusWeightedTris(radius)/mesh_triangle_budget*15000.f; } -F32 LLMeshCostData::getTriangleBasedStreamingCost() +F32 LLMeshCostData::getTriangleBasedStreamingCost() const { F32 result = ANIMATED_OBJECT_COST_PER_KTRI * 0.001f * getEstTrisForStreamingCost(); return result; @@ -4846,9 +5429,9 @@ bool LLMeshRepository::getCostData(LLUUID mesh_id, LLMeshCostData& data) { LLMutexLock lock(mThread->mHeaderMutex); LLMeshRepoThread::mesh_header_map::iterator iter = mThread->mMeshHeader.find(mesh_id); - if (iter != mThread->mMeshHeader.end() && iter->second.first > 0) + if (iter != mThread->mMeshHeader.end() && iter->second.mHeaderSize > 0) { - LLMeshHeader& header = iter->second.second; + LLMeshHeader& header = iter->second; bool header_invalid = (header.m404 || header.mLodSize[0] <= 0 @@ -5405,13 +5988,7 @@ bool LLMeshRepository::meshUploadEnabled() bool LLMeshRepository::meshRezEnabled() { static LLCachedControl<bool> mesh_enabled(gSavedSettings, "MeshEnabled"); - LLViewerRegion *region = gAgent.getRegion(); - if(mesh_enabled && - region) - { - return region->meshRezEnabled(); - } - return false; + return mesh_enabled; } // Threading: main thread only diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index 3d25a4dd78..01b51e753e 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -63,6 +63,16 @@ typedef enum e_mesh_processing_result_enum MESH_UNKNOWN } EMeshProcessingResult; +typedef enum e_mesh_request_type_enum +{ + MESH_REQUEST_HEADER, + MESH_REQUEST_LOD, + MESH_REQUEST_SKIN, + MESH_REQUEST_DECOMPOSITION, + MESH_REQUEST_PHYSICS, + MESH_REQUEST_UKNOWN +} EMeshRequestType; + class LLMeshUploadData { public: @@ -158,7 +168,6 @@ public: void submitRequest(Request* request); static S32 llcdCallback(const char*, S32, S32); - void cancel(); void setMeshData(LLCDMeshData& mesh, bool vertex_based); void doDecomposition(); @@ -183,7 +192,8 @@ public: class RequestStats { public: - RequestStats() : mRetries(0) {}; + + RequestStats() :mRetries(0) {}; void updateTime(); bool canRetry() const; @@ -195,6 +205,118 @@ private: LLFrameTimer mTimer; }; +class MeshLoadData; +class PendingRequestBase +{ +public: + struct CompareScoreGreater + { + bool operator()(const std::shared_ptr<PendingRequestBase>& lhs, const std::shared_ptr<PendingRequestBase>& rhs) + { + return lhs->mScore > rhs->mScore; // greatest = first + } + }; + + PendingRequestBase() : mScore(0.f), mTrackedData(nullptr), mScoreDirty(true) {}; + virtual ~PendingRequestBase() {} + + bool operator<(const PendingRequestBase& rhs) const + { + return mId < rhs.mId; + } + + F32 getScore() const { return mScore; } + void checkScore() + { + constexpr F32 EXPIRE_TIME_SECS = 8.f; + if (mScoreTimer.getElapsedTimeF32() > EXPIRE_TIME_SECS || mScoreDirty) + { + updateScore(); + mScoreDirty = false; + mScoreTimer.reset(); + } + }; + + LLUUID getId() const { return mId; } + virtual EMeshRequestType getRequestType() const = 0; + + void trackData(MeshLoadData* data) { mTrackedData = data; mScoreDirty = true; } + void untrackData() { mTrackedData = nullptr; } + bool hasTrackedData() { return mTrackedData != nullptr; } + void setScoreDirty() { mScoreDirty = true; } + +protected: + void updateScore(); + + LLUUID mId; + F32 mScore; + bool mScoreDirty; + LLTimer mScoreTimer; + MeshLoadData* mTrackedData; +}; + +class PendingRequestLOD : public PendingRequestBase +{ +public: + LLVolumeParams mMeshParams; + S32 mLOD; + + PendingRequestLOD(const LLVolumeParams& mesh_params, S32 lod) + : PendingRequestBase(), mMeshParams(mesh_params), mLOD(lod) + { + mId = mMeshParams.getSculptID(); + } + + EMeshRequestType getRequestType() const override { return MESH_REQUEST_LOD; } +}; + +class PendingRequestUUID : public PendingRequestBase +{ +public: + + PendingRequestUUID(const LLUUID& id, EMeshRequestType type) + : PendingRequestBase(), mRequestType(type) + { + mId = id; + } + + EMeshRequestType getRequestType() const override { return mRequestType; } + +private: + EMeshRequestType mRequestType; +}; + + +class MeshLoadData +{ +public: + MeshLoadData() {} + ~MeshLoadData() + { + if (std::shared_ptr<PendingRequestBase> request = mRequest.lock()) + { + request->untrackData(); + } + } + void initData(LLVOVolume* vol, std::shared_ptr<PendingRequestBase>& request) + { + mVolumes.push_back(vol); + request->trackData(this); + mRequest = request; + } + void addVolume(LLVOVolume* vol) + { + mVolumes.push_back(vol); + if (std::shared_ptr<PendingRequestBase> request = mRequest.lock()) + { + request->setScoreDirty(); + } + } + std::vector<LLVOVolume*> mVolumes; +private: + std::weak_ptr<PendingRequestBase> mRequest; +}; + class LLMeshHeader { public: @@ -235,19 +357,67 @@ public: m404 = header.has("404"); } +private: + + enum EDiskCacheFlags { + FLAG_SKIN = 1 << LLModel::NUM_LODS, + FLAG_PHYSCONVEX = 1 << (LLModel::NUM_LODS + 1), + FLAG_PHYSMESH = 1 << (LLModel::NUM_LODS + 2), + }; +public: + U32 getFlags() + { + U32 flags = 0; + for (U32 i = 0; i < LLModel::NUM_LODS; i++) + { + if (mLodInCache[i]) + { + flags |= 1 << i; + } + } + if (mSkinInCache) + { + flags |= FLAG_SKIN; + } + if (mPhysicsConvexInCache) + { + flags |= FLAG_PHYSCONVEX; + } + if (mPhysicsMeshInCache) + { + flags |= FLAG_PHYSMESH; + } + return flags; + } + + void setFromFlags(U32 flags) + { + for (U32 i = 0; i < LLModel::NUM_LODS; i++) + { + mLodInCache[i] = (flags & (1 << i)) != 0; + } + mSkinInCache = (flags & FLAG_SKIN) != 0; + mPhysicsConvexInCache = (flags & FLAG_PHYSCONVEX) != 0; + mPhysicsMeshInCache = (flags & FLAG_PHYSMESH) != 0; + } S32 mVersion = -1; S32 mSkinOffset = -1; S32 mSkinSize = -1; + bool mSkinInCache = false; S32 mPhysicsConvexOffset = -1; S32 mPhysicsConvexSize = -1; + bool mPhysicsConvexInCache = false; S32 mPhysicsMeshOffset = -1; S32 mPhysicsMeshSize = -1; + bool mPhysicsMeshInCache = false; - S32 mLodOffset[4] = { -1 }; - S32 mLodSize[4] = { -1 }; + S32 mLodOffset[LLModel::NUM_LODS] = { -1 }; + S32 mLodSize[LLModel::NUM_LODS] = { -1 }; + bool mLodInCache[LLModel::NUM_LODS] = { false }; + S32 mHeaderSize = -1; bool m404 = false; }; @@ -258,6 +428,7 @@ public: static std::atomic<S32> sActiveHeaderRequests; static std::atomic<S32> sActiveLODRequests; + static std::atomic<S32> sActiveSkinRequests; static U32 sMaxConcurrentRequests; static S32 sRequestLowWater; static S32 sRequestHighWater; @@ -265,10 +436,13 @@ public: LLMutex* mMutex; LLMutex* mHeaderMutex; + LLMutex* mLoadedMutex; + LLMutex* mPendingMutex; + LLMutex* mSkinMapMutex; LLCondition* mSignal; //map of known mesh headers - typedef boost::unordered_map<LLUUID, std::pair<U32, LLMeshHeader>> mesh_header_map; // pair is header_size and data + typedef boost::unordered_map<LLUUID, LLMeshHeader> mesh_header_map; // pair is header_size and data mesh_header_map mMeshHeader; class HeaderRequest : public RequestStats @@ -292,22 +466,13 @@ public: public: LLVolumeParams mMeshParams; S32 mLOD; - F32 mScore; LODRequest(const LLVolumeParams& mesh_params, S32 lod) - : RequestStats(), mMeshParams(mesh_params), mLOD(lod), mScore(0.f) + : RequestStats(), mMeshParams(mesh_params), mLOD(lod) { } }; - struct CompareScoreGreater - { - bool operator()(const LODRequest& lhs, const LODRequest& rhs) - { - return lhs.mScore > rhs.mScore; // greatest = first - } - }; - class UUIDBasedRequest : public RequestStats { public: @@ -356,6 +521,9 @@ public: // list of completed Decomposition info requests std::list<LLModel::Decomposition*> mDecompositionQ; + // list of completed Physics Mesh info requests + std::list<LLModel::Decomposition*> mPhysicsQ; + //queue of requested headers std::queue<HeaderRequest> mHeaderReqQ; @@ -369,7 +537,7 @@ public: std::deque<LoadedMesh> mLoadedQ; //map of pending header requests and currently desired LODs - typedef std::unordered_map<LLUUID, std::vector<S32> > pending_lod_map; + typedef std::unordered_map<LLUUID, std::array<S32, LLModel::NUM_LODS> > pending_lod_map; pending_lod_map mPendingLOD; // map of mesh ID to skin info (mirrors LLMeshRepository::mSkinMap) @@ -379,6 +547,8 @@ public: // workqueue for processing generic requests LL::WorkQueue mWorkQueue; + // lods have their own thread due to costly cacheOptimize() calls + std::unique_ptr<LL::ThreadPool> mMeshThreadPool; // llcorehttp library interface objects. LLCore::HttpStatus mHttpStatus; @@ -398,20 +568,22 @@ public: ~LLMeshRepoThread(); virtual void run(); + void cleanup(); + bool isShuttingDown() { return mShuttingDown; } void lockAndLoadMeshLOD(const LLVolumeParams& mesh_params, S32 lod); void loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod); - bool fetchMeshHeader(const LLVolumeParams& mesh_params, bool can_retry = true); - bool fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, bool can_retry = true); - EMeshProcessingResult headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size); + bool fetchMeshHeader(const LLVolumeParams& mesh_params); + bool fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod); + EMeshProcessingResult headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size, U32 flags = 0); EMeshProcessingResult lodReceived(const LLVolumeParams& mesh_params, S32 lod, U8* data, S32 data_size); bool skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 data_size); bool decompositionReceived(const LLUUID& mesh_id, U8* data, S32 data_size); EMeshProcessingResult physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size); - bool hasPhysicsShapeInHeader(const LLUUID& mesh_id); - bool hasSkinInfoInHeader(const LLUUID& mesh_id); - bool hasHeader(const LLUUID& mesh_id); + bool hasPhysicsShapeInHeader(const LLUUID& mesh_id) const; + bool hasSkinInfoInHeader(const LLUUID& mesh_id) const; + bool hasHeader(const LLUUID& mesh_id) const; void notifyLoadedMeshes(); S32 getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod); @@ -422,7 +594,7 @@ public: //send request for skin info, returns true if header info exists // (should hold onto mesh_id and try again later if header info does not exist) - bool fetchMeshSkinInfo(const LLUUID& mesh_id, bool can_retry = true); + bool fetchMeshSkinInfo(const LLUUID& mesh_id); //send request for decomposition, returns true if header info exists // (should hold onto mesh_id and try again later if header info does not exist) @@ -436,6 +608,8 @@ public: static void decActiveLODRequests(); static void incActiveHeaderRequests(); static void decActiveHeaderRequests(); + static void incActiveSkinRequests(); + static void decActiveSkinRequests(); // Set the caps strings and preferred version for constructing // mesh fetch URLs. @@ -456,6 +630,15 @@ private: LLCore::HttpHandle getByteRange(const std::string & url, size_t offset, size_t len, const LLCore::HttpHandler::ptr_t &handler); + + // Mutex: acquires mPendingMutex, mMutex and mHeaderMutex as needed + void loadMeshLOD(const LLUUID &mesh_id, const LLVolumeParams& mesh_params, S32 lod); + + // Threads: Repo thread only + U8* getDiskCacheBuffer(S32 size); + S32 mDiskCacheBufferSize = 0; + U8* mDiskCacheBuffer = nullptr; + bool mShuttingDown = false; }; @@ -488,14 +671,31 @@ public: LLPointer<DecompRequest> mFinalDecomp; volatile bool mPhysicsComplete; - typedef std::map<LLPointer<LLModel>, std::vector<LLVector3> > hull_map; - hull_map mHullMap; + typedef std::map<LLPointer<LLModel>, std::vector<LLVector3> > hull_map_t; + hull_map_t mHullMap; - typedef std::vector<LLModelInstance> instance_list; - instance_list mInstanceList; + typedef std::vector<LLModelInstance> instance_list_t; + instance_list_t mInstanceList; - typedef std::map<LLPointer<LLModel>, instance_list> instance_map; - instance_map mInstance; + // Upload should happen in deterministic order, so sort instances by model name. + struct LLUploadModelInstanceLess + { + inline bool operator()(const LLPointer<LLModel>& a, const LLPointer<LLModel>& b) const + { + if (a.isNull() || b.isNull()) + { + llassert(false); // We are uploading these models, they shouldn't be null. + return true; + } + // Note: probably can sort by mBaseModel->mSubmodelID here as well to avoid + // running over the list twice in wholeModelToLLSD. + return a->mLabel > b->mLabel; + } + }; + typedef std::map<LLPointer<LLModel>, instance_list_t, LLUploadModelInstanceLess> instance_map_t; + instance_map_t mInstance; + typedef std::map<std::string, std::string> lod_sources_map_t; + lod_sources_map_t mLodSources; LLMutex* mMutex; S32 mPendingUploads; @@ -510,10 +710,14 @@ public: LLHost mHost; std::string mWholeModelFeeCapability; std::string mWholeModelUploadURL; + LLUUID mDestinationFolderId; - LLMeshUploadThread(instance_list& data, LLVector3& scale, bool upload_textures, + LLMeshUploadThread(instance_list_t& data, const lod_sources_map_t& sources_list, + LLVector3& scale, bool upload_textures, bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position, - const std::string & upload_url, bool do_upload = true, + const std::string & upload_url, + const LLUUID destination_folder_id = LLUUID::null, + bool do_upload = true, LLHandle<LLWholeModelFeeObserver> fee_observer = (LLHandle<LLWholeModelFeeObserver>()), LLHandle<LLWholeModelUploadObserver> upload_observer = (LLHandle<LLWholeModelUploadObserver>())); ~LLMeshUploadThread(); @@ -529,7 +733,7 @@ public: void doWholeModelUpload(); void requestWholeModelFee(); - void wholeModelToLLSD(LLSD& dest, bool include_textures); + void wholeModelToLLSD(LLSD& dest, std::vector<std::string>& texture_list_dest, bool include_textures); void decomposeMeshMatrix(LLMatrix4& transformation, LLVector3& result_pos, @@ -544,12 +748,29 @@ public: static LLViewerFetchedTexture* FindViewerTexture(const LLImportMaterial& material); +protected: + void packModelIntance( + LLModel* model, + LLMeshUploadThread::instance_list_t& instance_list, + std::string& model_name, + LLSD& res, + S32& mesh_num, + S32& texture_num, + S32& instance_num, + std::unordered_set<LLViewerTexture* > &textures, + std::unordered_map<LLViewerTexture*, S32> texture_index, + std::unordered_map<LLModel*, S32>& mesh_index, + std::vector<std::string>& texture_list_dest, + bool include_textures + ); + private: LLHandle<LLWholeModelFeeObserver> mFeeObserverHandle; LLHandle<LLWholeModelUploadObserver> mUploadObserverHandle; bool mDoUpload; // if false only model data will be requested, otherwise the model will be uploaded LLSD mModelData; + std::vector<std::string> mTextureFiles; // llcorehttp library interface objects. LLCore::HttpStatus mHttpStatus; @@ -568,35 +789,35 @@ public: bool init(const LLMeshHeader& header); // Size for given LOD - S32 getSizeByLOD(S32 lod); + S32 getSizeByLOD(S32 lod) const; // Sum of all LOD sizes. - S32 getSizeTotal(); + S32 getSizeTotal() const; // Estimated triangle counts for the given LOD. - F32 getEstTrisByLOD(S32 lod); + F32 getEstTrisByLOD(S32 lod) const; // Estimated triangle counts for the largest LOD. Typically this // is also the "high" LOD, but not necessarily. - F32 getEstTrisMax(); + F32 getEstTrisMax() const; // Triangle count as computed by original streaming cost // formula. Triangles in each LOD are weighted based on how // frequently they will be seen. // This was called "unscaled_value" in the original getStreamingCost() functions. - F32 getRadiusWeightedTris(F32 radius); + F32 getRadiusWeightedTris(F32 radius) const; // Triangle count used by triangle-based cost formula. Based on // triangles in highest LOD plus potentially partial charges for // lower LODs depending on complexity. - F32 getEstTrisForStreamingCost(); + F32 getEstTrisForStreamingCost() const; // Streaming cost. This should match the server-side calculation // for the corresponding volume. - F32 getRadiusBasedStreamingCost(F32 radius); + F32 getRadiusBasedStreamingCost(F32 radius) const; // New streaming cost formula, currently only used for animated objects. - F32 getTriangleBasedStreamingCost(); + F32 getTriangleBasedStreamingCost() const; private: // From the "size" field of the mesh header. LOD 0=lowest, 3=highest. @@ -620,12 +841,12 @@ public: static U32 sLODPending; static U32 sLODProcessing; static U32 sCacheBytesRead; - static U32 sCacheBytesWritten; + static std::atomic<U32> sCacheBytesWritten; static U32 sCacheBytesHeaders; static U32 sCacheBytesSkins; static U32 sCacheBytesDecomps; static U32 sCacheReads; - static U32 sCacheWrites; + static std::atomic<U32> sCacheWrites; static U32 sMaxLockHoldoffs; // Maximum sequential locking failures static LLDeadmanTimer sQuiescentTimer; // Time-to-complete-mesh-downloads after significant events @@ -646,14 +867,14 @@ public: void unregisterMesh(LLVOVolume* volume); //mesh management functions - S32 loadMesh(LLVOVolume* volume, const LLVolumeParams& mesh_params, S32 detail = 0, S32 last_lod = -1); + S32 loadMesh(LLVOVolume* volume, const LLVolumeParams& mesh_params, S32 new_lod = 0, S32 last_lod = -1); void notifyLoadedMeshes(); - void notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVolume* volume); - void notifyMeshUnavailable(const LLVolumeParams& mesh_params, S32 lod); + void notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVolume* volume, S32 lod); + void notifyMeshUnavailable(const LLVolumeParams& mesh_params, S32 request_lod, S32 volume_lod); void notifySkinInfoReceived(LLMeshSkinInfo* info); void notifySkinInfoUnavailable(const LLUUID& info); - void notifyDecompositionReceived(LLModel::Decomposition* info); + void notifyDecompositionReceived(LLModel::Decomposition* info, bool physics_mesh); S32 getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod); static S32 getActualMeshLOD(LLMeshHeader& header, S32 lod); @@ -662,7 +883,7 @@ public: void fetchPhysicsShape(const LLUUID& mesh_id); bool hasPhysicsShape(const LLUUID& mesh_id); bool hasSkinInfo(const LLUUID& mesh_id); - bool hasHeader(const LLUUID& mesh_id); + bool hasHeader(const LLUUID& mesh_id) const; void buildHull(const LLVolumeParams& params, S32 detail); void buildPhysicsMesh(LLModel::Decomposition& decomp); @@ -670,13 +891,16 @@ public: bool meshUploadEnabled(); bool meshRezEnabled(); - void uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures, + void uploadModel(std::vector<LLModelInstance>& data, const std::map<std::string, std::string> &lod_sources, + LLVector3& scale, bool upload_textures, bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position, - std::string upload_url, bool do_upload = true, + std::string upload_url, + const LLUUID& destination_folder_id = LLUUID::null, + bool do_upload = true, LLHandle<LLWholeModelFeeObserver> fee_observer= (LLHandle<LLWholeModelFeeObserver>()), LLHandle<LLWholeModelUploadObserver> upload_observer = (LLHandle<LLWholeModelUploadObserver>())); - S32 getMeshSize(const LLUUID& mesh_id, S32 lod); + S32 getMeshSize(const LLUUID& mesh_id, S32 lod) const; // Quiescent timer management, main thread only. static void metricsStart(); @@ -684,7 +908,7 @@ public: static void metricsProgress(unsigned int count); static void metricsUpdate(); - typedef boost::unordered_map<LLUUID, std::vector<LLVOVolume*> > mesh_load_map; + typedef std::unordered_map<LLUUID, MeshLoadData> mesh_load_map; mesh_load_map mLoadingMeshes[4]; typedef std::unordered_map<LLUUID, LLPointer<LLMeshSkinInfo>> skin_map; @@ -695,15 +919,13 @@ public: LLMutex* mMeshMutex; - std::vector<LLMeshRepoThread::LODRequest> mPendingRequests; + typedef std::vector <std::shared_ptr<PendingRequestBase> > pending_requests_vec; + pending_requests_vec mPendingRequests; //list of mesh ids awaiting skin info - typedef boost::unordered_map<LLUUID, std::vector<LLVOVolume*> > skin_load_map; + typedef std::unordered_map<LLUUID, MeshLoadData > skin_load_map; skin_load_map mLoadingSkins; - //list of mesh ids that need to send skin info fetch requests - std::queue<LLUUID> mPendingSkinRequests; - //list of mesh ids awaiting decompositions std::unordered_set<LLUUID> mLoadingDecompositions; diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index 64ea1710f5..6a7c25ec0f 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -30,7 +30,7 @@ #include "llmodelloader.h" #include "lldaeloader.h" -#include "llgltfloader.h" +#include "gltf/llgltfloader.h" #include "llfloatermodelpreview.h" #include "llagent.h" @@ -40,6 +40,7 @@ #include "lldrawable.h" #include "llface.h" #include "lliconctrl.h" +#include "lljointdata.h" #include "llmatrix4a.h" #include "llmeshrepository.h" #include "llmeshoptimizer.h" @@ -132,20 +133,21 @@ std::string getLodSuffix(S32 lod) return suffix; } -void FindModel(LLModelLoader::scene& scene, const std::string& name_to_match, LLModel*& baseModelOut, LLMatrix4& matOut) +static bool FindModel(const LLModelLoader::scene& scene, const std::string& name_to_match, LLModel*& baseModelOut, LLMatrix4& matOut) { - for (auto scene_iter = scene.begin(); scene_iter != scene.end(); scene_iter++) + for (const auto& scene_pair : scene) { - for (auto model_iter = scene_iter->second.begin(); model_iter != scene_iter->second.end(); model_iter++) + for (const auto& model_iter : scene_pair.second) { - if (model_iter->mModel && (model_iter->mModel->mLabel == name_to_match)) + if (model_iter.mModel && (model_iter.mModel->mLabel == name_to_match)) { - baseModelOut = model_iter->mModel; - matOut = scene_iter->first; - return; + baseModelOut = model_iter.mModel; + matOut = scene_pair.first; + return true; } } } + return false; } //----------------------------------------------------------------------------- @@ -162,10 +164,14 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp) , mPhysicsSearchLOD(LLModel::LOD_PHYSICS) , mResetJoints(false) , mModelNoErrors(true) + , mLoading(false) + , mModelLoader(nullptr) , mLastJointUpdate(false) , mFirstSkinUpdate(true) , mHasDegenerate(false) - , mImporterDebug(LLCachedControl<bool>(gSavedSettings, "ImporterDebug", false)) + , mNumOfFetchingTextures(0) + , mTexturesNeedScaling(false) + , mImporterDebug(LLCachedControl<bool>(gSavedSettings, "ImporterDebugVerboseLogging", false)) { mNeedsUpdate = true; mCameraDistance = 0.f; @@ -174,11 +180,9 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp) mCameraZoom = 1.f; mTextureName = 0; mPreviewLOD = 0; - mModelLoader = NULL; mMaxTriangleLimit = 0; mDirty = false; mGenLOD = false; - mLoading = false; mLookUpLodFiles = false; mLoadState = LLModelLoader::STARTING; mGroup = 0; @@ -210,6 +214,7 @@ LLModelPreview::~LLModelPreview() { mModelLoader->shutdown(); mModelLoader = NULL; + mLoading = false; } if (mPreviewAvatar) @@ -319,10 +324,8 @@ void LLModelPreview::rebuildUploadData() mat *= scale_mat; - for (auto model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter) - { // for each instance with said transform applied - LLModelInstance instance = *model_iter; - + for (LLModelInstance& instance : iter->second) + { //for each instance with said transform applied LLModel* base_model = instance.mModel; if (base_model && !requested_name.empty()) @@ -354,7 +357,7 @@ void LLModelPreview::rebuildUploadData() } else { - //Physics can be inherited from other LODs or loaded, so we need to adjust what extension we are searching for + // Physics can be inherited from other LODs or loaded, so we need to adjust what extension we are searching for extensionLOD = mPhysicsSearchLOD; } @@ -365,9 +368,9 @@ void LLModelPreview::rebuildUploadData() name_to_match += toAdd; } - FindModel(mScene[i], name_to_match, lod_model, transform); + bool found = FindModel(mScene[i], name_to_match, lod_model, transform); - if (!lod_model && i != LLModel::LOD_PHYSICS) + if (!found && i != LLModel::LOD_PHYSICS) { if (mImporterDebug) { @@ -380,7 +383,7 @@ void LLModelPreview::rebuildUploadData() } int searchLOD = (i > LLModel::LOD_HIGH) ? LLModel::LOD_HIGH : i; - while ((searchLOD <= LLModel::LOD_HIGH) && !lod_model) + for (; searchLOD <= LLModel::LOD_HIGH; ++searchLOD) { std::string name_to_match = instance.mLabel; llassert(!name_to_match.empty()); @@ -394,8 +397,8 @@ void LLModelPreview::rebuildUploadData() // See if we can find an appropriately named model in LOD 'searchLOD' // - FindModel(mScene[searchLOD], name_to_match, lod_model, transform); - searchLOD++; + if (FindModel(mScene[searchLOD], name_to_match, lod_model, transform)) + break; } } } @@ -558,10 +561,7 @@ void LLModelPreview::rebuildUploadData() texture->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, true, false, new LLHandle<LLModelPreview>(getHandle()), &mCallbackTextureList, false); texture->forceToSaveRawImage(0, F32_MAX); texture->updateFetch(); - if (mModelLoader) - { - mModelLoader->mNumOfFetchingTextures++; - } + mNumOfFetchingTextures++; } } } @@ -576,7 +576,7 @@ void LLModelPreview::rebuildUploadData() for (U32 model_ind = 0; model_ind < mModel[lod].size(); ++model_ind) { bool found_model = false; - for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) + for (LLMeshUploadThread::instance_list_t::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) { LLModelInstance& instance = *iter; if (instance.mLOD[lod] == mModel[lod][model_ind]) @@ -692,7 +692,7 @@ void LLModelPreview::saveUploadData(const std::string& filename, save_skinweights, save_joint_positions, lock_scale_if_joint_position, - false, true, instance.mModel->mSubmodelID); + LLModel::WRITE_BINARY, true, instance.mModel->mSubmodelID); data["mesh"][instance.mModel->mLocalID] = str.str(); } @@ -754,6 +754,10 @@ void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable LL_WARNS() << out.str() << LL_ENDL; LLFloaterModelPreview::addStringToLog(out, true); assert(lod >= LLModel::LOD_IMPOSTOR && lod < LLModel::NUM_LODS); + if (mModelLoader == nullptr) + { + mLoading = false; + } return; } @@ -781,7 +785,7 @@ void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable mLODFile[lod] = filename; - std::map<std::string, std::string> joint_alias_map; + std::map<std::string, std::string, std::less<>> joint_alias_map; getJointAliases(joint_alias_map); LLHandle<LLModelPreview> preview_handle = getHandle(); @@ -807,10 +811,14 @@ void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable joint_alias_map, LLSkinningUtil::getMaxJointCount(), gSavedSettings.getU32("ImporterModelLimit"), + gSavedSettings.getU32("ImporterDebugMode"), gSavedSettings.getBOOL("ImporterPreprocessDAE")); } else { + LLVOAvatar* av = getPreviewAvatar(); + std::vector<LLJointData> viewer_skeleton; + av->getJointMatricesAndHierarhy(viewer_skeleton); mModelLoader = new LLGLTFLoader( filename, lod, @@ -823,7 +831,9 @@ void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable mJointsFromNode, joint_alias_map, LLSkinningUtil::getMaxJointCount(), - gSavedSettings.getU32("ImporterModelLimit")); + gSavedSettings.getU32("ImporterModelLimit"), + gSavedSettings.getU32("ImporterDebugMode"), + viewer_skeleton); } if (force_disable_slm) @@ -986,7 +996,9 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod) setRigValidForJointPositionUpload(mModelLoader->isRigValidForJointPositionUpload()); setLegacyRigFlags(mModelLoader->getLegacyRigFlags()); + mTexturesNeedScaling |= mModelLoader->mTexturesNeedScaling; mModelLoader->loadTextures(); + warnTextureScaling(); if (loaded_lod == -1) { //populate all LoDs from model loader scene @@ -1174,8 +1186,7 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod) LLModel* found_model = NULL; LLMatrix4 transform; - FindModel(mBaseScene, loaded_name, found_model, transform); - if (found_model) + if (FindModel(mBaseScene, loaded_name, found_model, transform)) { // don't rename correctly named models (even if they are placed in a wrong order) name_based = true; } @@ -1809,7 +1820,7 @@ F32 LLModelPreview::genMeshOptimizerPerFace(LLModel *base_model, LLModel *target void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 decimation, bool enforce_tri_limit) { - LL_INFOS() << "Generating lod " << which_lod << " using meshoptimizer" << LL_ENDL; + LL_DEBUGS("Upload") << "Generating lod " << which_lod << " using meshoptimizer" << LL_ENDL; // Allow LoD from -1 to LLModel::LOD_PHYSICS if (which_lod < -1 || which_lod > LLModel::NUM_LODS - 1) { @@ -1886,6 +1897,12 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d mMaxTriangleLimit = base_triangle_count; + // For logging purposes + S32 meshes_processed = 0; + S32 meshes_simplified = 0; + S32 meshes_sloppy_simplified = 0; + S32 meshes_fail_count = 0; + // Build models S32 start = LLModel::LOD_HIGH; @@ -1895,7 +1912,7 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d { start = which_lod; end = which_lod; - } + }; for (S32 lod = start; lod >= end; --lod) { @@ -1958,6 +1975,11 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d const LLVolumeFace &face = base->getVolumeFace(face_idx); LLVolumeFace &new_face = target_model->getVolumeFace(face_idx); new_face = face; + meshes_fail_count++; + } + else + { + meshes_simplified++; } } } @@ -1970,7 +1992,18 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d if (genMeshOptimizerPerFace(base, target_model, face_idx, indices_decimator, lod_error_threshold, MESH_OPTIMIZER_NO_TOPOLOGY) < 0) { // Sloppy failed and returned an invalid model - genMeshOptimizerPerFace(base, target_model, face_idx, indices_decimator, lod_error_threshold, MESH_OPTIMIZER_FULL); + if (genMeshOptimizerPerFace(base, target_model, face_idx, indices_decimator, lod_error_threshold, MESH_OPTIMIZER_FULL) < 0) + { + meshes_fail_count++; + } + else + { + meshes_simplified++; + } + } + else + { + meshes_sloppy_simplified++; } } } @@ -2070,25 +2103,28 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d precise_ratio = genMeshOptimizerPerModel(base, target_model, indices_decimator, lod_error_threshold, MESH_OPTIMIZER_FULL); } - LL_INFOS() << "Model " << target_model->getName() + LL_DEBUGS("Upload") << "Model " << target_model->getName() << " lod " << which_lod << " resulting ratio " << precise_ratio << " simplified using per model method." << LL_ENDL; + meshes_simplified++; } else { - LL_INFOS() << "Model " << target_model->getName() + LL_DEBUGS("Upload") << "Model " << target_model->getName() << " lod " << which_lod << " resulting ratio " << sloppy_ratio << " sloppily simplified using per model method." << LL_ENDL; + meshes_sloppy_simplified++; } } else { - LL_INFOS() << "Model " << target_model->getName() + LL_DEBUGS("Upload") << "Model " << target_model->getName() << " lod " << which_lod << " resulting ratio " << precise_ratio << " simplified using per model method." << LL_ENDL; + meshes_simplified++; } } @@ -2102,6 +2138,8 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d //copy material list target_model->mMaterialList = base->mMaterialList; + meshes_processed++; + if (!validate_model(target_model)) { LL_ERRS() << "Invalid model generated when creating LODs" << LL_ENDL; @@ -2131,6 +2169,11 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d } } } + + LL_INFOS("Upload") << "LOD " << which_lod << ", Mesh optimizer processed meshes : " << meshes_processed + <<" simplified: " << meshes_simplified + << ", slopily simplified: " << meshes_sloppy_simplified + << ", failures: " << meshes_fail_count << LL_ENDL; } void LLModelPreview::updateStatusMessages() @@ -2166,7 +2209,7 @@ void LLModelPreview::updateStatusMessages() total_submeshes[i] = 0; } - for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) + for (LLMeshUploadThread::instance_list_t::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) { LLModelInstance& instance = *iter; @@ -2350,7 +2393,7 @@ void LLModelPreview::updateStatusMessages() if (lod != lod_high) { - if (total_submeshes[lod] && total_submeshes[lod] != total_submeshes[lod_high]) + if (total_submeshes[lod] && total_submeshes[lod] > total_submeshes[lod_high]) { //number of submeshes is different message = "mesh_status_submesh_mismatch"; upload_status[lod] = 2; @@ -2468,7 +2511,7 @@ void LLModelPreview::updateStatusMessages() LLMutexLock lock(this); if (mModelLoader) { - if (!mModelLoader->areTexturesReady() && mFMP->childGetValue("upload_textures").asBoolean()) + if (!areTexturesReady() && mFMP->childGetValue("upload_textures").asBoolean()) { // Some textures are still loading, prevent upload until they are done mModelNoErrors = false; @@ -2500,6 +2543,8 @@ void LLModelPreview::updateStatusMessages() S32 phys_tris = 0; S32 phys_hulls = 0; S32 phys_points = 0; + S32 which_mode = 0; + S32 file_mode = 1; //get the triangle count for the whole scene for (LLModelLoader::scene::iterator iter = mScene[LLModel::LOD_PHYSICS].begin(), endIter = mScene[LLModel::LOD_PHYSICS].end(); iter != endIter; ++iter) @@ -2581,7 +2626,16 @@ void LLModelPreview::updateStatusMessages() //enable = enable && !use_hull && fmp->childGetValue("physics_optimize").asBoolean(); //enable/disable "analysis" UI - LLPanel* panel = fmp->getChild<LLPanel>("physics analysis"); +#if LL_HAVOK + LLPanel* panel = fmp->getChild<LLPanel>("physics simplification"); + panel->setVisible(true); + + panel = fmp->getChild<LLPanel>("physics analysis havok"); + panel->setVisible(true); +#else + LLPanel* panel = fmp->getChild<LLPanel>("physics analysis vhacd"); + panel->setVisible(true); +#endif LLView* child = panel->getFirstChild(); while (child) { @@ -2605,6 +2659,8 @@ void LLModelPreview::updateStatusMessages() fmp->childSetVisible("simplify_cancel", false); fmp->childSetVisible("Decompose", true); fmp->childSetVisible("decompose_cancel", false); + fmp->childSetVisible("Analyze", true); + fmp->childSetVisible("analyze_cancel", false); if (phys_hulls > 0) { @@ -2614,6 +2670,7 @@ void LLModelPreview::updateStatusMessages() if (phys_tris || phys_hulls > 0) { fmp->childEnable("Decompose"); + fmp->childEnable("Analyze"); } } else @@ -2621,18 +2678,16 @@ void LLModelPreview::updateStatusMessages() fmp->childEnable("simplify_cancel"); fmp->childEnable("decompose_cancel"); } - } - - LLCtrlSelectionInterface* iface = fmp->childGetSelectionInterface("physics_lod_combo"); - S32 which_mode = 0; - S32 file_mode = 1; - if (iface) - { - which_mode = iface->getFirstSelectedIndex(); - file_mode = iface->getItemCount() - 1; + LLCtrlSelectionInterface* iface = fmp->childGetSelectionInterface("physics_lod_combo"); + if (iface) + { + which_mode = iface->getFirstSelectedIndex(); + file_mode = iface->getItemCount() - 1; + } } + if (which_mode == file_mode) { mFMP->childEnable("physics_file"); @@ -3041,9 +3096,12 @@ void LLModelPreview::loadedCallback( S32 lod, void* opaque) { + if(LLModelPreview::sIgnoreLoadedCallback) + return; + LLModelPreview* pPreview = static_cast<LLModelPreview*>(opaque); LLMutexLock lock(pPreview); - if (pPreview && pPreview->mModelLoader && !LLModelPreview::sIgnoreLoadedCallback) + if (pPreview && pPreview->mModelLoader) { // Load loader's warnings into floater's log tab const LLSD out = pPreview->mModelLoader->logOut(); @@ -3092,25 +3150,48 @@ void LLModelPreview::lookupLODModelFiles(S32 lod) S32 next_lod = (lod - 1 >= LLModel::LOD_IMPOSTOR) ? lod - 1 : LLModel::LOD_PHYSICS; std::string lod_filename = mLODFile[LLModel::LOD_HIGH]; - std::string ext = ".dae"; std::string lod_filename_lower(lod_filename); LLStringUtil::toLower(lod_filename_lower); - std::string::size_type i = lod_filename_lower.rfind(ext); - if (i != std::string::npos) + + // Check for each supported file extension + std::vector<std::string> supported_exts = { ".dae", ".gltf", ".glb" }; + std::string found_ext; + std::string::size_type ext_pos = std::string::npos; + + for (const auto& ext : supported_exts) { - lod_filename.replace(i, lod_filename.size() - ext.size(), getLodSuffix(next_lod) + ext); + std::string::size_type i = lod_filename_lower.rfind(ext); + if (i != std::string::npos) + { + ext_pos = i; + found_ext = ext; + break; + } } - if (gDirUtilp->fileExists(lod_filename)) + + if (ext_pos != std::string::npos) { - LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance; - if (fmp) + // Replace extension with LOD suffix + original extension + std::string lod_file_to_check = lod_filename; + lod_file_to_check.replace(ext_pos, found_ext.size(), getLodSuffix(next_lod) + found_ext); + + if (gDirUtilp->fileExists(lod_file_to_check)) + { + LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance; + if (fmp) + { + fmp->setCtrlLoadFromFile(next_lod); + } + loadModel(lod_file_to_check, next_lod); + } + else { - fmp->setCtrlLoadFromFile(next_lod); + lookupLODModelFiles(next_lod); } - loadModel(lod_filename, next_lod); } else { + // No recognized extension found, continue with next LOD lookupLODModelFiles(next_lod); } } @@ -3151,6 +3232,7 @@ U32 LLModelPreview::loadTextures(LLImportMaterial& material, LLHandle<LLModelPre tex->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, true, false, new LLHandle<LLModelPreview>(handle), &preview->mCallbackTextureList, false); tex->forceToSaveRawImage(0, F32_MAX); material.setDiffuseMap(tex->getID()); // record tex ID + preview->mNumOfFetchingTextures++; return 1; } @@ -3325,7 +3407,6 @@ bool LLModelPreview::render() fmp->setViewOptionEnabled("show_skin_weight", show_skin_weight); } } - //if (this) return TRUE; if (upload_skin && !has_skin_weights) { //can't upload skin weights if model has no skin weights @@ -3461,7 +3542,7 @@ bool LLModelPreview::render() if (!show_skin_weight) { - for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) + for (LLMeshUploadThread::instance_list_t::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) { LLModelInstance& instance = *iter; @@ -3551,7 +3632,7 @@ bool LLModelPreview::render() gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA); - for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) + for (LLMeshUploadThread::instance_list_t::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) { LLModelInstance& instance = *iter; @@ -3647,7 +3728,6 @@ bool LLModelPreview::render() buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts() - 1, buffer->getNumIndices(), 0); gGL.diffuseColor4fv(PREVIEW_PSYH_EDGE_COL.mV); - glLineWidth(PREVIEW_PSYH_EDGE_WIDTH); #if GL_VERSION_1_1 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); #endif @@ -3656,7 +3736,6 @@ bool LLModelPreview::render() #if GL_VERSION_1_1 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); #endif - glLineWidth(1.f); buffer->unmapBuffer(); } @@ -3668,7 +3747,6 @@ bool LLModelPreview::render() // only do this if mDegenerate was set in the preceding mesh checks [Check this if the ordering ever breaks] if (mHasDegenerate) { - glLineWidth(PREVIEW_DEG_EDGE_WIDTH); #if GL_VERSION_1_1 glPointSize(PREVIEW_DEG_POINT_SIZE); #endif @@ -3679,7 +3757,7 @@ bool LLModelPreview::render() gGL.diffuseColor4f(1.f, 0.f, 0.f, 1.f); const LLVector4a scale(0.5f); - for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) + for (LLMeshUploadThread::instance_list_t::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) { LLModelInstance& instance = *iter; @@ -3740,7 +3818,7 @@ bool LLModelPreview::render() gGL.popMatrix(); } - glLineWidth(1.f); + //glLineWidth(1.f); #if GL_VERSION_1_1 glPointSize(1.f); #endif @@ -3864,7 +3942,7 @@ bool LLModelPreview::render() { gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); gGL.diffuseColor4fv(PREVIEW_EDGE_COL.mV); - glLineWidth(PREVIEW_EDGE_WIDTH); + //glLineWidth(PREVIEW_EDGE_WIDTH); #if GL_VERSION_1_1 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); #endif @@ -3872,7 +3950,6 @@ bool LLModelPreview::render() #if GL_VERSION_1_1 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); #endif - glLineWidth(1.f); } } } @@ -4011,6 +4088,18 @@ void LLModelPreview::setPreviewLOD(S32 lod) updateStatusMessages(); } +void LLModelPreview::warnTextureScaling() +{ + if (areTexturesReady() && mTexturesNeedScaling) + { + std::ostringstream out; + out << "One or more textures in this model were scaled to be within the allowed limits."; + LL_INFOS() << out.str() << LL_ENDL; + LLSD args; + LLFloaterModelPreview::addStringToLog("ModelTextureScaling", args, true, -1); + } +} + //static void LLModelPreview::textureLoadedCallback( bool success, @@ -4031,11 +4120,19 @@ void LLModelPreview::textureLoadedCallback( LLModelPreview* preview = static_cast<LLModelPreview*>(handle->get()); preview->refresh(); - if (final && preview->mModelLoader) + if (final) { - if (preview->mModelLoader->mNumOfFetchingTextures > 0) + if (src_vi + && (src_vi->getOriginalWidth() > LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT + || src_vi->getOriginalHeight() > LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT)) + { + preview->mTexturesNeedScaling = true; + } + + if (preview->mNumOfFetchingTextures > 0) { - preview->mModelLoader->mNumOfFetchingTextures--; + preview->mNumOfFetchingTextures--; + preview->warnTextureScaling(); } } } diff --git a/indra/newview/llmodelpreview.h b/indra/newview/llmodelpreview.h index 0873263587..92ac2d1faf 100644 --- a/indra/newview/llmodelpreview.h +++ b/indra/newview/llmodelpreview.h @@ -204,6 +204,7 @@ public: std::vector<S32> mLodsQuery; std::vector<S32> mLodsWithParsingError; bool mHasDegenerate; + bool areTexturesReady() { return !mNumOfFetchingTextures; } protected: @@ -213,6 +214,7 @@ protected: static LLJoint* lookupJointByName(const std::string&, void* opaque); static U32 loadTextures(LLImportMaterial& material, LLHandle<LLModelPreview> handle); + void warnTextureScaling(); void lookupLODModelFiles(S32 lod); private: @@ -242,6 +244,9 @@ private: /// Not read unless mWarnOfUnmatchedPhyicsMeshes is true. LLPointer<LLModel> mDefaultPhysicsShapeP; + S32 mNumOfFetchingTextures; + bool mTexturesNeedScaling; + typedef enum { MESH_OPTIMIZER_FULL, @@ -314,7 +319,7 @@ protected: // Amount of triangles in original(base) model U32 mMaxTriangleLimit; - LLMeshUploadThread::instance_list mUploadData; + LLMeshUploadThread::instance_list_t mUploadData; std::set<LLViewerFetchedTexture * > mTextureSet; LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList; diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index a8ceaffde8..df515389c5 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -538,7 +538,7 @@ void LLPanelStandStopFlying::setStandStopFlyingMode(EStandStopFlyingMode mode) LLFirstUse::sit(); LLFirstUse::notMoving(false); } - panel->mStandButton->setVisible(SSFM_STAND == mode); + panel->mStandButton->setVisible((SSFM_STAND == mode) & gAgent.isAllowedToStand()); panel->mStopFlyingButton->setVisible(SSFM_STOP_FLYING == mode); //visibility of it should be updated after updating visibility of the buttons diff --git a/indra/newview/llmoveview.h b/indra/newview/llmoveview.h index 3690245e1d..208e1e80f1 100644 --- a/indra/newview/llmoveview.h +++ b/indra/newview/llmoveview.h @@ -143,6 +143,7 @@ public: static void clearStandStopFlyingMode(EStandStopFlyingMode mode); /*virtual*/ bool postBuild(); /*virtual*/ void setVisible(bool visible); + void setVisibleStandButton(bool visible) { mStandButton->setVisible(visible); } // *HACK: due to hard enough to have this control aligned with "Move" button while resizing // let update its position in each frame diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index 2d51acc063..f47a8cd241 100644 --- a/indra/newview/llmutelist.cpp +++ b/indra/newview/llmutelist.cpp @@ -154,7 +154,8 @@ std::string LLMute::getDisplayType() const // LLMuteList() //----------------------------------------------------------------------------- LLMuteList::LLMuteList() : - mIsLoaded(false) + mLoadState(ML_INITIAL), + mRequestStartTime(0.f) { gGenericDispatcher.addHandler("emptymutelist", &sDispatchEmptyMuteList); @@ -189,7 +190,7 @@ LLMuteList::~LLMuteList() void LLMuteList::cleanupSingleton() { - LLAvatarNameCache::getInstance()->setAccountNameChangedCallback(NULL); + LLAvatarNameCache::getInstance()->setAccountNameChangedCallback(nullptr); } bool LLMuteList::isLinden(const std::string& name) @@ -209,6 +210,23 @@ bool LLMuteList::isLinden(const std::string& name) return last_name == "linden"; } +bool LLMuteList::getLoadFailed() const +{ + if (mLoadState == ML_FAILED) + { + return true; + } + if (mLoadState == ML_REQUESTED) + { + constexpr F64 WAIT_SECONDS = 30; + if (mRequestStartTime + WAIT_SECONDS < LLTimer::getTotalSeconds()) + { + return true; + } + } + return false; +} + static LLVOAvatar* find_avatar(const LLUUID& id) { LLViewerObject *obj = gObjectList.findObject(id); @@ -371,11 +389,14 @@ void LLMuteList::updateAdd(const LLMute& mute) msg->addU32("MuteFlags", mute.mFlags); gAgent.sendReliableMessage(); - if (!mIsLoaded) + if (!isLoaded()) { LL_WARNS() << "Added elements to non-initialized block list" << LL_ENDL; } - mIsLoaded = true; // why is this here? -MG + // Based of logs and testing, if file doesn't exist server side, + // viewer will not receive any callback and won't know to set + // ML_LOADED. As a workaround, set it regardless of current state. + mLoadState = ML_LOADED; } @@ -564,6 +585,7 @@ bool LLMuteList::loadFromFile(const std::string& filename) if(!filename.size()) { LL_WARNS() << "Mute List Filename is Empty!" << LL_ENDL; + mLoadState = ML_FAILED; return false; } @@ -571,6 +593,7 @@ bool LLMuteList::loadFromFile(const std::string& filename) if (!fp) { LL_WARNS() << "Couldn't open mute list " << filename << LL_ENDL; + mLoadState = ML_FAILED; return false; } @@ -730,13 +753,17 @@ void LLMuteList::requestFromServer(const LLUUID& agent_id) if (gDisconnected) { LL_WARNS() << "Trying to request mute list when disconnected!" << LL_ENDL; + mLoadState = ML_FAILED; return; } if (!gAgent.getRegion()) { LL_WARNS() << "No region for agent yet, skipping mute list request!" << LL_ENDL; + mLoadState = ML_FAILED; return; } + mLoadState = ML_REQUESTED; + mRequestStartTime = LLTimer::getElapsedSeconds(); // Double amount of retries due to this request happening during busy stage // Ideally this should be turned into a capability gMessageSystem->sendReliable(gAgent.getRegionHost(), LL_DEFAULT_RELIABLE_RETRIES * 2, true, LL_PING_BASED_TIMEOUT_DUMMY, NULL, NULL); @@ -749,7 +776,7 @@ void LLMuteList::requestFromServer(const LLUUID& agent_id) void LLMuteList::cache(const LLUUID& agent_id) { // Write to disk even if empty. - if(mIsLoaded) + if(isLoaded()) { std::string agent_id_string; std::string filename; @@ -776,7 +803,18 @@ void LLMuteList::processMuteListUpdate(LLMessageSystem* msg, void**) std::string unclean_filename; msg->getStringFast(_PREHASH_MuteData, _PREHASH_Filename, unclean_filename); std::string filename = LLDir::getScrubbedFileName(unclean_filename); + if (filename.empty()) + { + LL_WARNS() << "Received empty mute list filename." << LL_ENDL; + } + + LLMuteList* mute_list = getInstance(); + mute_list->mLoadState = ML_REQUESTED; + mute_list->mRequestStartTime = LLTimer::getElapsedSeconds(); + // Todo: Based of logs and testing, there is no callback + // from server if file doesn't exist server side. + // Once server side gets fixed make sure it gets handled right. std::string *local_filename_and_path = new std::string(gDirUtilp->getExpandedFilename( LL_PATH_CACHE, filename )); gXferManager->requestFile(*local_filename_and_path, filename, @@ -801,20 +839,24 @@ void LLMuteList::processUseCachedMuteList(LLMessageSystem* msg, void**) void LLMuteList::onFileMuteList(void** user_data, S32 error_code, LLExtStat ext_status) { - LL_INFOS() << "LLMuteList::processMuteListFile()" << LL_ENDL; - std::string* local_filename_and_path = (std::string*)user_data; if(local_filename_and_path && !local_filename_and_path->empty() && (error_code == 0)) { + LL_INFOS() << "Received mute list from server" << LL_ENDL; LLMuteList::getInstance()->loadFromFile(*local_filename_and_path); LLFile::remove(*local_filename_and_path); } + else + { + LL_INFOS() << "LLMuteList xfer failed with code " << error_code << LL_ENDL; + LLMuteList::getInstance()->mLoadState = ML_FAILED; + } delete local_filename_and_path; } void LLMuteList::onAccountNameChanged(const LLUUID& id, const std::string& username) { - if (mIsLoaded) + if (isLoaded()) { LLMute mute(id, username, LLMute::AGENT); mute_set_t::iterator mute_it = mMutes.find(mute); @@ -866,7 +908,7 @@ void LLMuteList::removeObserver(LLMuteListObserver* observer) void LLMuteList::setLoaded() { - mIsLoaded = true; + mLoadState = ML_LOADED; notifyObservers(); } diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h index 13d579c61f..b65fd61fcc 100644 --- a/indra/newview/llmutelist.h +++ b/indra/newview/llmutelist.h @@ -74,6 +74,14 @@ class LLMuteList : public LLSingleton<LLMuteList> LLSINGLETON(LLMuteList); ~LLMuteList(); /*virtual*/ void cleanupSingleton() override; + + enum EMuteListState + { + ML_INITIAL, + ML_REQUESTED, + ML_LOADED, + ML_FAILED, + }; public: // reasons for auto-unmuting a resident enum EAutoReason @@ -107,7 +115,8 @@ public: static bool isLinden(const std::string& name); - bool isLoaded() const { return mIsLoaded; } + bool isLoaded() const { return mLoadState == ML_LOADED; } + bool getLoadFailed() const; std::vector<LLMute> getMutes() const; @@ -167,7 +176,8 @@ private: typedef std::set<LLMuteListObserver*> observer_set_t; observer_set_t mObservers; - bool mIsLoaded; + EMuteListState mLoadState; + F64 mRequestStartTime; friend class LLDispatchEmptyMuteList; }; diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h index dde85f4d29..ffff21c95c 100644 --- a/indra/newview/llnamelistctrl.h +++ b/indra/newview/llnamelistctrl.h @@ -210,12 +210,12 @@ private: boost::signals2::signal<void(const LLUUID &)> mIconClickedSignal; public: - boost::signals2::connection setOnNameListCompleteCallback(boost::function<void(bool)> onNameListCompleteCallback) + boost::signals2::connection setOnNameListCompleteCallback(std::function<void(bool)> onNameListCompleteCallback) { return mNameListCompleteSignal.connect(onNameListCompleteCallback); } - boost::signals2::connection setIconClickedCallback(boost::function<void(const LLUUID &)> cb) + boost::signals2::connection setIconClickedCallback(std::function<void(const LLUUID&)> cb) { return mIconClickedSignal.connect(cb); } diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp index 23f1f8fa5a..cdf7f05ada 100644 --- a/indra/newview/llnotificationhandlerutil.cpp +++ b/indra/newview/llnotificationhandlerutil.cpp @@ -92,10 +92,18 @@ void LLHandlerUtil::logToIM(const EInstantMessage& session_type, from = SYSTEM_FROM; } - // 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); + std::string file_name; + if (session_type == IM_SESSION_GROUP_START) + { + file_name = session_name + LLLogChat::getGroupChatSuffix(); + } + else + { + // Build a new format username or firstname_lastname for legacy names + // to use it for a history log filename. + file_name = LLCacheName::buildUsername(session_name); + } + LLIMModel::instance().logToFile(file_name, from, from_id, message); } else { diff --git a/indra/newview/llnotificationlistitem.cpp b/indra/newview/llnotificationlistitem.cpp index 5b8b28ebe6..9a33bcb1b9 100644 --- a/indra/newview/llnotificationlistitem.cpp +++ b/indra/newview/llnotificationlistitem.cpp @@ -38,6 +38,7 @@ #include "lluicolortable.h" #include "message.h" #include "llnotificationsutil.h" +#include "llviewercontrol.h" #include <boost/regex.hpp> LLNotificationListItem::LLNotificationListItem(const Params& p) : LLPanel(p), @@ -133,10 +134,22 @@ std::string LLNotificationListItem::buildNotificationDate(const LLDate& time_sta default: timeStr = "[" + LLTrans::getString("TimeMonth") + "]/[" +LLTrans::getString("TimeDay")+"]/[" - +LLTrans::getString("TimeYear")+"] [" - +LLTrans::getString("TimeHour")+"]:[" - +LLTrans::getString("TimeMin")+"] [" - +LLTrans::getString("TimeTimezone")+"]"; + +LLTrans::getString("TimeYear")+"] ["; + + static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); + if (use_24h) + { + timeStr += LLTrans::getString("TimeHour") + "]:[" + + LLTrans::getString("TimeMin") + "] [" + + LLTrans::getString("TimeTimezone") + "]"; + } + else + { + timeStr += LLTrans::getString("TimeHour12") + "]:[" + + LLTrans::getString("TimeMin") + "] [" + + LLTrans::getString("TimeAMPM") + "] [" + + LLTrans::getString("TimeTimezone") + "]"; + } break; } LLSD substitution; diff --git a/indra/newview/llnotificationlistitem.h b/indra/newview/llnotificationlistitem.h index 2ed90e31b2..b3283ca642 100644 --- a/indra/newview/llnotificationlistitem.h +++ b/indra/newview/llnotificationlistitem.h @@ -84,7 +84,7 @@ public: virtual void onMouseLeave(S32 x, S32 y, MASK mask); //callbacks - typedef boost::function<void (LLNotificationListItem* item)> item_callback_t; + typedef std::function<void (LLNotificationListItem* item)> item_callback_t; typedef boost::signals2::signal<void (LLNotificationListItem* item)> item_signal_t; item_signal_t mOnItemClose; item_signal_t mOnItemClick; @@ -156,8 +156,8 @@ protected: LLTextBox* mGroupNameBoxExp; private: - LLGroupNotificationListItem(const LLGroupNotificationListItem &); - LLGroupNotificationListItem & operator=(LLGroupNotificationListItem &); + LLGroupNotificationListItem(const LLGroupNotificationListItem&) = delete; + LLGroupNotificationListItem& operator=(LLGroupNotificationListItem&) = delete; void setGroupName(std::string name); bool updateFromCache(); @@ -175,8 +175,8 @@ public: private: friend class LLNotificationListItem; LLGroupInviteNotificationListItem(const Params& p); - LLGroupInviteNotificationListItem(const LLGroupInviteNotificationListItem &); - LLGroupInviteNotificationListItem & operator=(LLGroupInviteNotificationListItem &); + LLGroupInviteNotificationListItem(const LLGroupInviteNotificationListItem&) = delete; + LLGroupInviteNotificationListItem& operator=(LLGroupInviteNotificationListItem&) = delete; void setFee(S32 fee); @@ -202,8 +202,8 @@ public: private: friend class LLNotificationListItem; LLGroupNoticeNotificationListItem(const Params& p); - LLGroupNoticeNotificationListItem(const LLGroupNoticeNotificationListItem &); - LLGroupNoticeNotificationListItem & operator=(LLGroupNoticeNotificationListItem &); + LLGroupNoticeNotificationListItem(const LLGroupNoticeNotificationListItem&) = delete; + LLGroupNoticeNotificationListItem& operator=(LLGroupNoticeNotificationListItem&) = delete; void setSender(std::string sender); void onClickAttachment(); @@ -226,8 +226,8 @@ public: private: friend class LLNotificationListItem; LLTransactionNotificationListItem(const Params& p); - LLTransactionNotificationListItem(const LLTransactionNotificationListItem &); - LLTransactionNotificationListItem & operator=(LLTransactionNotificationListItem &); + LLTransactionNotificationListItem(const LLTransactionNotificationListItem&) = delete; + LLTransactionNotificationListItem& operator=(LLTransactionNotificationListItem&) = delete; LLAvatarIconCtrl* mAvatarIcon; LLAvatarIconCtrl* mAvatarIconExp; }; @@ -239,8 +239,8 @@ public: private: friend class LLNotificationListItem; LLSystemNotificationListItem(const Params& p); - LLSystemNotificationListItem(const LLSystemNotificationListItem &); - LLSystemNotificationListItem & operator=(LLSystemNotificationListItem &); + LLSystemNotificationListItem(const LLSystemNotificationListItem&) = delete; + LLSystemNotificationListItem & operator=(LLSystemNotificationListItem &) = delete; LLIconCtrl* mSystemNotificationIcon; LLIconCtrl* mSystemNotificationIconExp; bool mIsCaution; diff --git a/indra/newview/llnotificationmanager.cpp b/indra/newview/llnotificationmanager.cpp index 505f276f8c..29f11f7ca6 100644 --- a/indra/newview/llnotificationmanager.cpp +++ b/indra/newview/llnotificationmanager.cpp @@ -60,7 +60,7 @@ void LLNotificationManager::init() mChannels.emplace_back(new LLBrowserNotification()); mChannels.emplace_back(new LLIMHandler()); - mChatHandler = std::shared_ptr<LLFloaterIMNearbyChatHandler>(new LLFloaterIMNearbyChatHandler()); + mChatHandler = std::make_shared<LLFloaterIMNearbyChatHandler>(); } //-------------------------------------------------------------------------- diff --git a/indra/newview/llnotificationstorage.cpp b/indra/newview/llnotificationstorage.cpp index 75bafb8785..5cec35fc88 100644 --- a/indra/newview/llnotificationstorage.cpp +++ b/indra/newview/llnotificationstorage.cpp @@ -41,7 +41,7 @@ #include "llregistry.h" #include "llviewermessage.h" -typedef boost::function<LLNotificationResponderInterface * (const LLSD& pParams)> responder_constructor_t; +typedef std::function<LLNotificationResponderInterface*(const LLSD& pParams)> responder_constructor_t; class LLResponderRegistry : public LLRegistrySingleton<std::string, responder_constructor_t, LLResponderRegistry> { diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp index b1d5cd9e16..8589afae06 100644 --- a/indra/newview/lloutfitgallery.cpp +++ b/indra/newview/lloutfitgallery.cpp @@ -69,7 +69,6 @@ const S32 GALLERY_ITEMS_PER_ROW_MIN = 2; LLOutfitGallery::LLOutfitGallery(const LLOutfitGallery::Params& p) : LLOutfitListBase(), - mOutfitsObserver(NULL), mScrollPanel(NULL), mGalleryPanel(NULL), mLastRowPanel(NULL), @@ -88,9 +87,16 @@ LLOutfitGallery::LLOutfitGallery(const LLOutfitGallery::Params& p) mItemsInRow(p.items_in_row), mRowPanWidthFactor(p.row_panel_width_factor), mGalleryWidthFactor(p.gallery_width_factor), - mTextureSelected(NULL) + mTextureSelected(NULL), + mSortMenu(nullptr) { updateGalleryWidth(); + + LLControlVariable* ctrl = gSavedSettings.getControl("InventoryFavoritesColorText"); + if (ctrl) + { + mSavedSettingInvFavColor = ctrl->getSignal()->connect(boost::bind(&LLOutfitGallery::handleInvFavColorChange, this)); + } } LLOutfitGallery::Params::Params() @@ -421,19 +427,32 @@ void LLOutfitGallery::updateRowsIfNeeded() bool compareGalleryItem(LLOutfitGalleryItem* item1, LLOutfitGalleryItem* item2) { - static LLCachedControl<bool> outfit_gallery_sort_by_name(gSavedSettings, "OutfitGallerySortByName"); - if(outfit_gallery_sort_by_name || - ((item1->isDefaultImage() && item2->isDefaultImage()) || (!item1->isDefaultImage() && !item2->isDefaultImage()))) - { - std::string name1 = item1->getItemName(); - std::string name2 = item2->getItemName(); - - return (LLStringUtil::compareDict(name1, name2) < 0); - } - else + static LLCachedControl<S32> sort_by_name(gSavedSettings, "OutfitGallerySortOrder", 0); + switch (sort_by_name()) { - return item2->isDefaultImage(); + case 2: + // Sort by favorites - favorite items first, then alphabetically + if (item1->isFavorite() != item2->isFavorite()) + { + return item1->isFavorite(); + } + break; + case 1: + // Sort by images - items with non-default images first, then alphabetically + if (item1->isDefaultImage() != item2->isDefaultImage()) + { + return item2->isDefaultImage(); + } + break; + default: + // Sort alphabetically only + break; } + + // Final comparison is always alphabetical by name + std::string name1 = item1->getItemName(); + std::string name2 = item2->getItemName(); + return (LLStringUtil::compareDict(name1, name2) < 0); } void LLOutfitGallery::reArrangeRows(S32 row_diff) @@ -476,6 +495,20 @@ void LLOutfitGallery::updateGalleryWidth() mGalleryWidth = mGalleryWidthFactor * mItemsInRow - mItemHorizontalGap; } +void LLOutfitGallery::handleInvFavColorChange() +{ + for (outfit_map_t::iterator iter = mOutfitMap.begin(); + iter != mOutfitMap.end(); + ++iter) + { + if (!iter->second) continue; + LLOutfitGalleryItem* item = (LLOutfitGalleryItem*)iter->second; + + // refresh font color + item->setOutfitFavorite(item->isFavorite()); + } +} + LLPanel* LLOutfitGallery::addLastRow() { mRowCount++; @@ -627,7 +660,7 @@ void LLOutfitGallery::removeFromLastRow(LLOutfitGalleryItem* item) mItemPanels.pop_back(); } -LLOutfitGalleryItem* LLOutfitGallery::buildGalleryItem(std::string name, LLUUID outfit_id) +LLOutfitGalleryItem* LLOutfitGallery::buildGalleryItem(std::string name, LLUUID outfit_id, bool is_favorite) { LLOutfitGalleryItem::Params giparams; LLOutfitGalleryItem* gitem = LLUICtrlFactory::create<LLOutfitGalleryItem>(giparams); @@ -636,6 +669,7 @@ LLOutfitGalleryItem* LLOutfitGallery::buildGalleryItem(std::string name, LLUUID gitem->setFollowsLeft(); gitem->setFollowsTop(); gitem->setOutfitName(name); + gitem->setOutfitFavorite(is_favorite); gitem->setUUID(outfit_id); gitem->setGallery(this); return gitem; @@ -730,12 +764,6 @@ LLOutfitGallery::~LLOutfitGallery() { delete mOutfitGalleryMenu; - if (gInventory.containsObserver(mOutfitsObserver)) - { - gInventory.removeObserver(mOutfitsObserver); - } - delete mOutfitsObserver; - while (!mUnusedRowPanels.empty()) { LLPanel* panelp = mUnusedRowPanels.back(); @@ -790,11 +818,22 @@ void LLOutfitGallery::getCurrentCategories(uuid_vec_t& vcur) void LLOutfitGallery::updateAddedCategory(LLUUID cat_id) { + LL_PROFILE_ZONE_SCOPED; LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id); if (!cat) return; - std::string name = cat->getName(); - LLOutfitGalleryItem* item = buildGalleryItem(name, cat_id); + if (!isOutfitFolder(cat)) + { + // Assume a subfolder that contains or will contain outfits, track it + const LLUUID outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + mCategoriesObserver->addCategory(cat_id, [this, outfits]() + { + observerCallback(outfits); + }); + return; + } + + LLOutfitGalleryItem* item = buildGalleryItem(cat->getName(), cat_id, cat->getIsFavorite()); mOutfitMap.insert(LLOutfitGallery::outfit_map_value_t(cat_id, item)); item->setRightMouseDownCallback(boost::bind(&LLOutfitListBase::outfitRightClickCallBack, this, _1, _2, _3, cat_id)); @@ -809,14 +848,8 @@ void LLOutfitGallery::updateAddedCategory(LLUUID cat_id) if (!outfit_category) return; - if (mOutfitsObserver == NULL) - { - mOutfitsObserver = new LLInventoryCategoriesObserver(); - gInventory.addObserver(mOutfitsObserver); - } - // Start observing changes in "My Outfits" category. - mOutfitsObserver->addCategory(cat_id, + mCategoriesObserver->addCategory(cat_id, boost::bind(&LLOutfitGallery::refreshOutfit, this, cat_id), true); outfit_category->fetch(); @@ -829,7 +862,7 @@ void LLOutfitGallery::updateRemovedCategory(LLUUID cat_id) if (outfits_iter != mOutfitMap.end()) { // 0. Remove category from observer. - mOutfitsObserver->removeCategory(cat_id); + mCategoriesObserver->removeCategory(cat_id); //const LLUUID& outfit_id = outfits_iter->first; LLOutfitGalleryItem* item = outfits_iter->second; @@ -863,6 +896,7 @@ void LLOutfitGallery::updateChangedCategoryName(LLViewerInventoryCategory *cat, if (item) { item->setOutfitName(name); + item->setOutfitFavorite(cat->getIsFavorite()); } } } @@ -943,6 +977,10 @@ LLOutfitListGearMenuBase* LLOutfitGallery::createGearMenu() static LLDefaultChildRegistry::Register<LLOutfitGalleryItem> r("outfit_gallery_item"); +bool LLOutfitGalleryItem::sColorSetInitialized = false; +LLUIColor LLOutfitGalleryItem::sDefaultTextColor; +LLUIColor LLOutfitGalleryItem::sDefaultFavoriteColor; + LLOutfitGalleryItem::LLOutfitGalleryItem(const Params& p) : LLPanel(p), mGallery(nullptr), @@ -954,6 +992,12 @@ LLOutfitGalleryItem::LLOutfitGalleryItem(const Params& p) mUUID(LLUUID()) { buildFromFile("panel_outfit_gallery_item.xml"); + if (!sColorSetInitialized) + { + sDefaultTextColor = LLUIColorTable::instance().getColor("White", LLColor4::white); + sDefaultFavoriteColor = LLUIColorTable::instance().getColor("InventoryFavoriteColor", LLColor4::white); + sColorSetInitialized = true; + } } LLOutfitGalleryItem::~LLOutfitGalleryItem() @@ -1000,6 +1044,19 @@ void LLOutfitGalleryItem::draw() gl_draw_scaled_image(interior.mLeft - 1, interior.mBottom, interior.getWidth(), interior.getHeight(), mTexturep, UI_VERTEX_COLOR % alpha); } + static LLUICachedControl<bool> draw_star("InventoryFavoritesUseStar", true); + if(mFavorite && draw_star()) + { + const S32 HPAD = 3; + const S32 VPAD = 6; // includes padding for text and for the image + const S32 image_size = 14; + static LLPointer<LLUIImage> fav_img = LLRender2D::getInstance()->getUIImage("Inv_Favorite_Star_Full"); + + const F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency(); + gl_draw_scaled_image( + border.getWidth() - image_size - HPAD, image_size + VPAD + mOutfitNameText->getRect().getHeight(), + image_size, image_size, fav_img->getImage(), UI_VERTEX_COLOR % alpha); + } } void LLOutfitGalleryItem::setOutfitName(std::string name) @@ -1009,18 +1066,28 @@ void LLOutfitGalleryItem::setOutfitName(std::string name) mOutfitName = name; } +void LLOutfitGalleryItem::setOutfitFavorite(bool is_favorite) +{ + mFavorite = is_favorite; + + static LLCachedControl<bool> use_color(gSavedSettings, "InventoryFavoritesColorText"); + mOutfitNameText->setReadOnlyColor((mFavorite && use_color()) ? sDefaultFavoriteColor : sDefaultTextColor); +} + void LLOutfitGalleryItem::setOutfitWorn(bool value) { mWorn = value; LLStringUtil::format_map_t worn_string_args; std::string worn_string = getString("worn_string", worn_string_args); - LLUIColor text_color = LLUIColorTable::instance().getColor("White", LLColor4::white); - mOutfitWornText->setReadOnlyColor(text_color); - mOutfitNameText->setReadOnlyColor(text_color); + mOutfitWornText->setReadOnlyColor(sDefaultTextColor.get()); + mOutfitNameText->setReadOnlyColor(sDefaultTextColor.get()); mOutfitWornText->setFont(value ? LLFontGL::getFontSansSerifBold() : LLFontGL::getFontSansSerifSmall()); mOutfitNameText->setFont(value ? LLFontGL::getFontSansSerifBold() : LLFontGL::getFontSansSerifSmall()); mOutfitWornText->setValue(value ? worn_string : ""); mOutfitNameText->setText(mOutfitName); // refresh LLTextViewModel to pick up font changes + + static LLCachedControl<bool> use_color(gSavedSettings, "InventoryFavoritesColorText"); + mOutfitNameText->setReadOnlyColor((mFavorite && use_color()) ? sDefaultFavoriteColor : sDefaultTextColor); } void LLOutfitGalleryItem::setSelected(bool value) @@ -1172,6 +1239,7 @@ LLContextMenu* LLOutfitGalleryContextMenu::createMenu() registrar.add("Outfit.Delete", boost::bind(LLOutfitGallery::onRemoveOutfit, selected_id)); registrar.add("Outfit.Create", boost::bind(&LLOutfitGalleryContextMenu::onCreate, this, _2)); registrar.add("Outfit.Thumbnail", boost::bind(&LLOutfitGalleryContextMenu::onThumbnail, this, selected_id)); + registrar.add("Outfit.Favorite", boost::bind(&LLOutfitGalleryContextMenu::onFavorite, this, selected_id)); registrar.add("Outfit.Save", boost::bind(&LLOutfitGalleryContextMenu::onSave, this, selected_id)); enable_registrar.add("Outfit.OnEnable", boost::bind(&LLOutfitGalleryContextMenu::onEnable, this, _2)); enable_registrar.add("Outfit.OnVisible", boost::bind(&LLOutfitGalleryContextMenu::onVisible, this, _2)); @@ -1210,25 +1278,12 @@ void LLOutfitGalleryGearMenu::onUpdateItemsVisibility() { if (!mMenu) return; bool have_selection = getSelectedOutfitID().notNull(); - mMenu->setItemVisible("expand", false); - mMenu->setItemVisible("collapse", false); mMenu->setItemVisible("thumbnail", have_selection); mMenu->setItemVisible("sepatator3", true); mMenu->setItemVisible("sort_folders_by_name", true); LLOutfitListGearMenuBase::onUpdateItemsVisibility(); } -void LLOutfitGalleryGearMenu::onChangeSortOrder() -{ - bool sort_by_name = !gSavedSettings.getBOOL("OutfitGallerySortByName"); - gSavedSettings.setBOOL("OutfitGallerySortByName", sort_by_name); - LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList); - if (gallery) - { - gallery->reArrangeRows(); - } -} - bool LLOutfitGalleryGearMenu::hasDefaultImage() { LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList); @@ -1345,6 +1400,15 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id) } } +LLToggleableMenu* LLOutfitGallery::getSortMenu() +{ + if (!mSortMenu) + { + mSortMenu = new LLOutfitGallerySortMenu(this); + } + return mSortMenu->getMenu(); +} + LLUUID LLOutfitGallery::getPhotoAssetId(const LLUUID& outfit_id) { outfit_map_t::iterator outfit_it = mOutfitMap.find(outfit_id); @@ -1360,3 +1424,84 @@ LLUUID LLOutfitGallery::getDefaultPhoto() return LLUUID(); } + +//////////////////// LLOutfitGallerySortMenu //////////////////// + +LLOutfitGallerySortMenu::LLOutfitGallerySortMenu(LLOutfitListBase* parent_panel) + : mPanelHandle(parent_panel->getHandle()) +{ + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; + + registrar.add("Sort.OnSort", boost::bind(&LLOutfitGallerySortMenu::onSort, this, _2)); + enable_registrar.add("Sort.OnEnable", boost::bind(&LLOutfitGallerySortMenu::onEnable, this, _2)); + + mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>( + "menu_outfit_gallery_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + llassert(mMenu); +} + + +LLToggleableMenu* LLOutfitGallerySortMenu::getMenu() +{ + return mMenu; +} + +void LLOutfitGallerySortMenu::updateItemsVisibility() +{ + onUpdateItemsVisibility(); +} + +void LLOutfitGallerySortMenu::onUpdateItemsVisibility() +{ + if (!mMenu) return; +} + +bool LLOutfitGallerySortMenu::onEnable(LLSD::String param) +{ + static LLCachedControl<S32> sort_order(gSavedSettings, "OutfitGallerySortOrder", 0); + if ("favorites_to_top" == param) + { + return sort_order == 2; + } + else if ("images_to_top" == param) + { + return sort_order == 1; + } + else if ("by_name" == param) + { + return sort_order == 0; + } + + return false; +} + +void LLOutfitGallerySortMenu::onSort(LLSD::String param) +{ + S32 sort_order = gSavedSettings.getS32("OutfitGallerySortOrder"); + S32 new_sort_order = 0; + if ("favorites_to_top" == param) + { + new_sort_order = 2; + } + else if ("images_to_top" == param) + { + new_sort_order = 1; + } + else if ("by_name" == param) + { + new_sort_order = 0; + } + if (sort_order == new_sort_order) + { + new_sort_order = sort_order ? 0 : 1; + } + gSavedSettings.setS32("OutfitGallerySortOrder", new_sort_order); + + LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mPanelHandle.get()); + if (gallery) + { + gallery->reArrangeRows(); + } +} + diff --git a/indra/newview/lloutfitgallery.h b/indra/newview/lloutfitgallery.h index 541ea2f9d4..5801a32a39 100644 --- a/indra/newview/lloutfitgallery.h +++ b/indra/newview/lloutfitgallery.h @@ -42,11 +42,13 @@ class LLOutfitGalleryItem; class LLOutfitListGearMenuBase; class LLOutfitGalleryGearMenu; class LLOutfitGalleryContextMenu; +class LLOutfitGallerySortMenu; class LLOutfitGallery : public LLOutfitListBase { public: friend class LLOutfitGalleryGearMenu; + friend class LLOutfitGallerySortMenu; friend class LLOutfitGalleryContextMenu; friend class LLUpdateGalleryOnPhotoLinked; @@ -102,10 +104,12 @@ public: /*virtual*/ bool getHasExpandableFolders() { return false; } + /*virtual*/ void onChangeSortOrder(const LLSD& userdata) {}; void updateMessageVisibility(); bool hasDefaultImage(const LLUUID& outfit_cat_id); void refreshOutfit(const LLUUID& category_id); + virtual LLToggleableMenu* getSortMenu(); protected: /*virtual*/ void onHighlightBaseOutfit(LLUUID base_id, LLUUID prev_id); @@ -133,8 +137,9 @@ private: void reArrangeRows(S32 row_diff = 0); void updateRowsIfNeeded(); void updateGalleryWidth(); + void handleInvFavColorChange(); - LLOutfitGalleryItem* buildGalleryItem(std::string name, LLUUID outfit_id); + LLOutfitGalleryItem* buildGalleryItem(std::string name, LLUUID outfit_id, bool is_favorite); LLOutfitGalleryItem* getSelectedItem() const; LLOutfitGalleryItem* getItem(const LLUUID& id) const; @@ -176,6 +181,7 @@ private: int mGalleryWidthFactor; LLListContextMenu* mOutfitGalleryMenu; + LLOutfitGallerySortMenu* mSortMenu; typedef std::map<LLUUID, LLOutfitGalleryItem*> outfit_map_t; typedef outfit_map_t::value_type outfit_map_value_t; @@ -187,6 +193,8 @@ private: LLInventoryCategoriesObserver* mOutfitsObserver; + + boost::signals2::connection mSavedSettingInvFavColor; }; class LLOutfitGalleryContextMenu : public LLOutfitContextMenu { @@ -213,8 +221,6 @@ public: protected: /*virtual*/ void onUpdateItemsVisibility(); private: - /*virtual*/ void onChangeSortOrder(); - bool hasDefaultImage(); }; @@ -243,6 +249,7 @@ public: bool setImageAssetId(LLUUID asset_id); LLUUID getImageAssetId(); void setOutfitName(std::string name); + void setOutfitFavorite(bool is_favorite); void setOutfitWorn(bool value); void setSelected(bool value); void setUUID(const LLUUID &outfit_id) {mUUID = outfit_id;} @@ -250,6 +257,7 @@ public: std::string getItemName() {return mOutfitName;} bool isDefaultImage() {return mDefaultImage;} + bool isFavorite() { return mFavorite; } bool isHidden() {return mHidden;} void setHidden(bool hidden) {mHidden = hidden;} @@ -267,7 +275,29 @@ private: bool mWorn; bool mDefaultImage; bool mHidden; + bool mFavorite; std::string mOutfitName; + + static bool sColorSetInitialized; + static LLUIColor sDefaultTextColor; + static LLUIColor sDefaultFavoriteColor; +}; + +class LLOutfitGallerySortMenu +{ +public: + LLOutfitGallerySortMenu(LLOutfitListBase* parent_panel); + + LLToggleableMenu* getMenu(); + void updateItemsVisibility(); + +private: + void onUpdateItemsVisibility(); + bool onEnable(LLSD::String param); + void onSort(LLSD::String param); + + LLToggleableMenu* mMenu; + LLHandle<LLPanel> mPanelHandle; }; #endif // LL_LLOUTFITGALLERYCTRL_H diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 0f5f7aebf8..32831fcd9b 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -34,10 +34,13 @@ #include "llaccordionctrl.h" #include "llaccordionctrltab.h" #include "llagentwearables.h" +#include "llaisapi.h" #include "llappearancemgr.h" +#include "llappviewer.h" #include "llfloaterreg.h" #include "llfloatersidepanelcontainer.h" #include "llinspecttexture.h" +#include "llinventorymodelbackgroundfetch.h" #include "llinventoryfunctions.h" #include "llinventorymodel.h" #include "llmenubutton.h" @@ -45,22 +48,33 @@ #include "lloutfitobserver.h" #include "lltoggleablemenu.h" #include "lltransutil.h" +#include "llviewercontrol.h" #include "llviewermenu.h" #include "llvoavatar.h" #include "llvoavatarself.h" #include "llwearableitemslist.h" -static bool is_tab_header_clicked(LLAccordionCtrlTab* tab, S32 y); +static bool is_tab_header_clicked(LLOutfitAccordionCtrlTab* tab, S32 y); static const LLOutfitTabNameComparator OUTFIT_TAB_NAME_COMPARATOR; +static const LLOutfitTabFavComparator OUTFIT_TAB_FAV_COMPARATOR; /*virtual*/ bool LLOutfitTabNameComparator::compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const { - std::string name1 = tab1->getTitle(); - std::string name2 = tab2->getTitle(); + return (LLStringUtil::compareDict(tab1->getTitle(), tab2->getTitle()) < 0); +} - return (LLStringUtil::compareDict(name1, name2) < 0); +bool LLOutfitTabFavComparator::compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const +{ + LLOutfitAccordionCtrlTab* taba = (LLOutfitAccordionCtrlTab*)tab1; + LLOutfitAccordionCtrlTab* tabb = (LLOutfitAccordionCtrlTab*)tab2; + if (taba->getFavorite() != tabb->getFavorite()) + { + return taba->getFavorite(); + } + + return (LLStringUtil::compareDict(tab1->getTitle(), tab2->getTitle()) < 0); } struct outfit_accordion_tab_params : public LLInitParam::Block<outfit_accordion_tab_params, LLOutfitAccordionCtrlTab::Params> @@ -80,6 +94,9 @@ const outfit_accordion_tab_params& get_accordion_tab_params() { initialized = true; + LLOutfitAccordionCtrlTab::sFavoriteIcon = LLUI::getUIImage("Inv_Favorite_Star_Full"); + LLOutfitAccordionCtrlTab::sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", LLColor4U(255, 255, 255)); + LLXMLNodePtr xmlNode; if (LLUICtrlFactory::getLayeredXMLNode("outfit_accordion_tab.xml", xmlNode)) { @@ -103,11 +120,20 @@ LLOutfitsList::LLOutfitsList() , mAccordion(NULL) , mListCommands(NULL) , mItemSelected(false) + , mSortMenu(nullptr) { + LLControlVariable* ctrl = gSavedSettings.getControl("InventoryFavoritesColorText"); + if (ctrl) + { + mSavedSettingInvFavColor = ctrl->getSignal()->connect(boost::bind(&LLOutfitsList::handleInvFavColorChange, this)); + } } LLOutfitsList::~LLOutfitsList() { + delete mSortMenu; + mSavedSettingInvFavColor.disconnect(); + mGearMenuConnection.disconnect(); } bool LLOutfitsList::postBuild() @@ -115,9 +141,25 @@ bool LLOutfitsList::postBuild() mAccordion = getChild<LLAccordionCtrl>("outfits_accordion"); mAccordion->setComparator(&OUTFIT_TAB_NAME_COMPARATOR); + initComparator(); + return LLOutfitListBase::postBuild(); } +void LLOutfitsList::initComparator() +{ + S32 mode = gSavedSettings.getS32("OutfitListSortOrder"); + if (mode == 0) + { + mAccordion->setComparator(&OUTFIT_TAB_NAME_COMPARATOR); + } + else + { + mAccordion->setComparator(&OUTFIT_TAB_FAV_COMPARATOR); + } + sortOutfits(); +} + //virtual void LLOutfitsList::onOpen(const LLSD& info) { @@ -139,9 +181,21 @@ void LLOutfitsList::onOpen(const LLSD& info) void LLOutfitsList::updateAddedCategory(LLUUID cat_id) { + LL_PROFILE_ZONE_SCOPED; LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id); if (!cat) return; + if (!isOutfitFolder(cat)) + { + // Assume a subfolder that contains or will contain outfits, track it + const LLUUID outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + mCategoriesObserver->addCategory(cat_id, [this, outfits]() + { + observerCallback(outfits); + }); + return; + } + std::string name = cat->getName(); outfit_accordion_tab_params tab_params(get_accordion_tab_params()); @@ -154,6 +208,7 @@ void LLOutfitsList::updateAddedCategory(LLUUID cat_id) tab->setName(name); tab->setTitle(name); + tab->setFavorite(cat->getIsFavorite()); // *TODO: LLUICtrlFactory::defaultBuilder does not use "display_children" from xml. Should be investigated. tab->setDisplayChildren(false); @@ -183,23 +238,44 @@ void LLOutfitsList::updateAddedCategory(LLUUID cat_id) // Setting callback to reset items selection inside outfit on accordion collapsing and expanding (EXT-7875) tab->setDropDownStateChangedCallback(boost::bind(&LLOutfitsList::resetItemSelection, this, list, cat_id)); - // force showing list items that don't match current filter(EXT-7158) - list->setForceShowingUnmatchedItems(true); + // Depending on settings, force showing list items that don't match current filter(EXT-7158) + static LLCachedControl<bool> list_filter(gSavedSettings, "OutfitListFilterFullList"); + list->setForceShowingUnmatchedItems(list_filter(), false); // Setting list commit callback to monitor currently selected wearable item. list->setCommitCallback(boost::bind(&LLOutfitsList::onListSelectionChange, this, _1)); // Setting list refresh callback to apply filter on list change. - list->setRefreshCompleteCallback(boost::bind(&LLOutfitsList::onRefreshComplete, this, _1)); + list->setRefreshCompleteCallback([this, tab](LLUICtrl* ctrl, const LLSD& sd) + { + onRefreshComplete(ctrl, tab); + }); list->setRightMouseDownCallback(boost::bind(&LLOutfitsList::onWearableItemsListRightClick, this, _1, _2, _3)); - // Fetch the new outfit contents. - cat->fetch(); - - // Refresh the list of outfit items after fetch(). - // Further list updates will be triggered by the category observer. - list->updateList(cat_id); + if (AISAPI::isAvailable() && LLInventoryModelBackgroundFetch::instance().folderFetchActive()) + { + // For reliability just fetch it whole, linked items included + // Todo: list is not warrantied to exist once callback arrives + // Fix it! + LLInventoryModelBackgroundFetch::instance().fetchFolderAndLinks(cat_id, [cat_id, list] + { + if (list) + { + list->updateList(cat_id); + list->setForceRefresh(true); + } + }); + } + else + { + // Fetch the new outfit contents. + cat->fetch(); + // Refresh the list of outfit items after fetch(). + // Further list updates will be triggered by the category observer. + list->updateList(cat_id); + list->setForceRefresh(true); + } // If filter is currently applied we store the initial tab state. if (!getFilterSubString().empty()) @@ -221,7 +297,7 @@ void LLOutfitsList::updateRemovedCategory(LLUUID cat_id) if (outfits_iter != mOutfitsMap.end()) { const LLUUID& outfit_id = outfits_iter->first; - LLAccordionCtrlTab* tab = outfits_iter->second; + LLOutfitAccordionCtrlTab* tab = outfits_iter->second; // An outfit is removed from the list. Do the following: // 1. Remove outfit category from observer to stop monitoring its changes. @@ -249,13 +325,11 @@ void LLOutfitsList::onHighlightBaseOutfit(LLUUID base_id, LLUUID prev_id) { if (mOutfitsMap[prev_id]) { - mOutfitsMap[prev_id]->setTitleFontStyle("NORMAL"); - mOutfitsMap[prev_id]->setTitleColor(LLUIColorTable::instance().getColor("AccordionHeaderTextColor")); + mOutfitsMap[prev_id]->setOutfitSelected(false); } if (mOutfitsMap[base_id]) { - mOutfitsMap[base_id]->setTitleFontStyle("BOLD"); - mOutfitsMap[base_id]->setTitleColor(LLUIColorTable::instance().getColor("SelectedOutfitTextColor")); + mOutfitsMap[base_id]->setOutfitSelected(true); } } @@ -299,7 +373,7 @@ void LLOutfitsList::onSetSelectedOutfitByUUID(const LLUUID& outfit_uuid) { if (outfit_uuid == iter->first) { - LLAccordionCtrlTab* tab = iter->second; + LLOutfitAccordionCtrlTab* tab = iter->second; if (!tab) continue; LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView()); @@ -313,6 +387,11 @@ void LLOutfitsList::onSetSelectedOutfitByUUID(const LLUUID& outfit_uuid) } } +void LLOutfitListBase::onAction(const LLSD& userdata) +{ + performAction(userdata.asString()); +} + // virtual bool LLOutfitListBase::isActionEnabled(const LLSD& userdata) { @@ -388,7 +467,7 @@ void LLOutfitsList::onCollapseAllFolders() iter != mOutfitsMap.end(); ++iter) { - LLAccordionCtrlTab* tab = iter->second; + LLOutfitAccordionCtrlTab* tab = iter->second; if(tab && tab->isExpanded()) { tab->changeOpenClose(true); @@ -402,7 +481,7 @@ void LLOutfitsList::onExpandAllFolders() iter != mOutfitsMap.end(); ++iter) { - LLAccordionCtrlTab* tab = iter->second; + LLOutfitAccordionCtrlTab* tab = iter->second; if(tab && !tab->isExpanded()) { tab->changeOpenClose(false); @@ -425,11 +504,12 @@ void LLOutfitsList::updateChangedCategoryName(LLViewerInventoryCategory *cat, st if (outfits_iter != mOutfitsMap.end()) { // Update tab name with the new category name. - LLAccordionCtrlTab* tab = outfits_iter->second; + LLOutfitAccordionCtrlTab* tab = outfits_iter->second; if (tab) { tab->setName(name); tab->setTitle(name); + tab->setFavorite(cat->getIsFavorite()); } } } @@ -477,7 +557,7 @@ void LLOutfitsList::deselectOutfit(const LLUUID& category_id) LLOutfitListBase::deselectOutfit(category_id); } -void LLOutfitsList::restoreOutfitSelection(LLAccordionCtrlTab* tab, const LLUUID& category_id) +void LLOutfitsList::restoreOutfitSelection(LLOutfitAccordionCtrlTab* tab, const LLUUID& category_id) { // Try restoring outfit selection after filtering. if (mAccordion->getSelectedTab() == tab) @@ -486,23 +566,21 @@ void LLOutfitsList::restoreOutfitSelection(LLAccordionCtrlTab* tab, const LLUUID } } -void LLOutfitsList::onRefreshComplete(LLUICtrl* ctrl) +void LLOutfitsList::onRefreshComplete(LLUICtrl* ctrl, LLOutfitAccordionCtrlTab* tab) { if (!ctrl || getFilterSubString().empty()) return; - for (outfits_map_t::iterator - iter = mOutfitsMap.begin(), - iter_end = mOutfitsMap.end(); - iter != iter_end; ++iter) + LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView()); + if (list != ctrl) { - LLAccordionCtrlTab* tab = iter->second; - if (!tab) continue; - - LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView()); - if (list != ctrl) continue; - - applyFilterToTab(iter->first, tab, getFilterSubString()); + llassert(false); + LL_WARNS() << "LLOutfitsList::onRefreshComplete: ctrl does not match tab's list!" << LL_ENDL; + return; + } + if (tab->getFilterGeneration() != getFilterGeneration()) + { + applyFilterToTab(tab->getFolderID(), tab, getFilterSubString()); } } @@ -515,7 +593,7 @@ void LLOutfitsList::onFilterSubStringChanged(const std::string& new_string, cons while (iter != iter_end) { const LLUUID& category_id = iter->first; - LLAccordionCtrlTab* tab = iter++->second; + LLOutfitAccordionCtrlTab* tab = iter++->second; if (!tab) continue; LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView()); @@ -554,9 +632,10 @@ void LLOutfitsList::onFilterSubStringChanged(const std::string& new_string, cons void LLOutfitsList::applyFilterToTab( const LLUUID& category_id, - LLAccordionCtrlTab* tab, + LLOutfitAccordionCtrlTab* tab, const std::string& filter_substring) { + LL_PROFILE_ZONE_SCOPED; if (!tab) return; LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView()); if (!list) return; @@ -568,6 +647,7 @@ void LLOutfitsList::applyFilterToTab( LLStringUtil::toUpper(cur_filter); tab->setTitle(tab->getTitle(), cur_filter); + tab->setFilterGeneration(getFilterGeneration()); if (std::string::npos == title.find(cur_filter)) { @@ -691,7 +771,7 @@ void LLOutfitsList::onCOFChanged() outfits_map_t::iterator map_iter = mOutfitsMap.begin(), map_end = mOutfitsMap.end(); while (map_iter != map_end) { - LLAccordionCtrlTab* tab = (map_iter++)->second; + LLOutfitAccordionCtrlTab* tab = (map_iter++)->second; if (!tab) continue; LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView()); @@ -722,7 +802,7 @@ void LLOutfitsList::sortOutfits() void LLOutfitsList::onOutfitRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id) { - LLAccordionCtrlTab* tab = dynamic_cast<LLAccordionCtrlTab*>(ctrl); + LLOutfitAccordionCtrlTab* tab = dynamic_cast<LLOutfitAccordionCtrlTab*>(ctrl); if (mOutfitMenu && is_tab_header_clicked(tab, y) && cat_id.notNull()) { // Focus tab header to trigger tab selection change. @@ -738,13 +818,82 @@ void LLOutfitsList::onOutfitRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUI } } +void LLOutfitsList::handleInvFavColorChange() +{ + for (outfits_map_t::iterator iter = mOutfitsMap.begin(); + iter != mOutfitsMap.end(); + ++iter) + { + if (!iter->second) continue; + LLOutfitAccordionCtrlTab* tab = iter->second; + + // refresh font color + tab->setFavorite(tab->getFavorite()); + } +} + +void LLOutfitsList::onChangeSortOrder(const LLSD& userdata) +{ + std::string sort_data = userdata.asString(); + if (sort_data == "favorites_to_top") + { + // at the moment this is a toggle + S32 val = gSavedSettings.getS32("OutfitListSortOrder"); + gSavedSettings.setS32("OutfitListSortOrder", (val ? 0 : 1)); + + initComparator(); + } + else if (sort_data == "show_entire_outfit") + { + bool new_val = !gSavedSettings.getBOOL("OutfitListFilterFullList"); + gSavedSettings.setBOOL("OutfitListFilterFullList", new_val); + + if (!getFilterSubString().empty()) + { + for (outfits_map_t::value_type& outfit : mOutfitsMap) + { + LLOutfitAccordionCtrlTab* tab = outfit.second; + const LLUUID& category_id = outfit.first; + if (!tab) continue; + + LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView()); + if (list) + { + list->setForceRefresh(true); + list->setForceShowingUnmatchedItems(new_val, tab->getDisplayChildren()); + } + applyFilterToTab(category_id, tab, getFilterSubString()); + } + mAccordion->arrange(); + } + } +} + +LLToggleableMenu* LLOutfitsList::getSortMenu() +{ + if (!mSortMenu) + { + mSortMenu = new LLOutfitListSortMenu(this); + } + return mSortMenu->getMenu(); +} + +void LLOutfitsList::updateMenuItemsVisibility() +{ + if (mSortMenu) + { + mSortMenu->updateItemsVisibility(); + } + LLOutfitListBase::updateMenuItemsVisibility(); +} + LLOutfitListGearMenuBase* LLOutfitsList::createGearMenu() { return new LLOutfitListGearMenu(this); } -bool is_tab_header_clicked(LLAccordionCtrlTab* tab, S32 y) +bool is_tab_header_clicked(LLOutfitAccordionCtrlTab* tab, S32 y) { if(!tab || !tab->getHeaderVisible()) return false; @@ -755,10 +904,10 @@ bool is_tab_header_clicked(LLAccordionCtrlTab* tab, S32 y) LLOutfitListBase::LLOutfitListBase() : LLPanelAppearanceTab() , mIsInitialized(false) + , mGearMenu(nullptr) { mCategoriesObserver = new LLInventoryCategoriesObserver(); mOutfitMenu = new LLOutfitContextMenu(this); - //mGearMenu = createGearMenu(); } LLOutfitListBase::~LLOutfitListBase() @@ -819,8 +968,45 @@ void LLOutfitListBase::observerCallback(const LLUUID& category_id) refreshList(category_id); } +bool LLOutfitListBase::isOutfitFolder(LLViewerInventoryCategory* cat) const +{ + if (!cat) + { + return false; + } + if (cat->getPreferredType() == LLFolderType::FT_OUTFIT) + { + return true; + } + // assumes that folder is somewhere inside MyOutfits + if (cat->getPreferredType() == LLFolderType::FT_NONE) + { + LLViewerInventoryCategory* inv_cat = dynamic_cast<LLViewerInventoryCategory*>(cat); + if (inv_cat && inv_cat->getDescendentCount() > 3) + { + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + gInventory.getDirectDescendentsOf(inv_cat->getUUID(), cats, items); + if (cats->empty() // protection against outfits inside + && items->size() > 3) // arbitrary, if doesn't have at least base parts, not an outfit + { + // For now assume this to be an old style outfit, not a subfolder + // but ideally no such 'outfits' should be left in My Outfits + // Todo: stop counting FT_NONE as outfits, + // convert obvious outfits into FT_OUTFIT + return true; + } + } + } + return false; +} + void LLOutfitListBase::refreshList(const LLUUID& category_id) { + if (LLAppViewer::instance()->quitRequested()) + { + return; + } bool wasNull = mRefreshListState.CategoryUUID.isNull(); mRefreshListState.CategoryUUID.setNull(); @@ -879,10 +1065,21 @@ void LLOutfitListBase::onIdle(void* userdata) void LLOutfitListBase::onIdleRefreshList() { + LL_PROFILE_ZONE_SCOPED; + if (LLAppViewer::instance()->quitRequested()) + { + mRefreshListState.CategoryUUID.setNull(); + gIdleCallbacks.deleteFunction(onIdle, this); + return; + } if (mRefreshListState.CategoryUUID.isNull()) + { + LL_WARNS() << "Called onIdleRefreshList without id" << LL_ENDL; + gIdleCallbacks.deleteFunction(onIdle, this); return; + } - const F64 MAX_TIME = 0.05f; + const F64 MAX_TIME = 0.005f; F64 curent_time = LLTimer::getTotalSeconds(); const F64 end_time = curent_time + MAX_TIME; @@ -924,8 +1121,8 @@ void LLOutfitListBase::onIdleRefreshList() if (cat) { std::string name = cat->getName(); - updateChangedCategoryName(cat, name); - } + updateChangedCategoryName(cat, name); + } curent_time = LLTimer::getTotalSeconds(); if (curent_time >= end_time) @@ -1022,12 +1219,6 @@ void LLOutfitListBase::ChangeOutfitSelection(LLWearableItemsList* list, const LL bool LLOutfitListBase::postBuild() { - mGearMenu = createGearMenu(); - - LLMenuButton* menu_gear_btn = getChild<LLMenuButton>("options_gear_btn"); - - menu_gear_btn->setMouseDownCallback(boost::bind(&LLOutfitListGearMenuBase::updateItemsVisibility, mGearMenu)); - menu_gear_btn->setMenu(mGearMenu->getMenu()); return true; } @@ -1041,6 +1232,20 @@ void LLOutfitListBase::expandAllFolders() onExpandAllFolders(); } +void LLOutfitListBase::updateMenuItemsVisibility() +{ + mGearMenu->updateItemsVisibility(); +} + +LLToggleableMenu* LLOutfitListBase::getGearMenu() +{ + if (!mGearMenu) + { + mGearMenu = createGearMenu(); + } + return mGearMenu->getMenu(); +}; + void LLOutfitListBase::deselectOutfit(const LLUUID& category_id) { // Reset selection if the outfit is selected. @@ -1067,6 +1272,7 @@ LLContextMenu* LLOutfitContextMenu::createMenu() registrar.add("Outfit.Rename", boost::bind(renameOutfit, selected_id)); registrar.add("Outfit.Delete", boost::bind(&LLOutfitListBase::removeSelected, mOutfitList)); registrar.add("Outfit.Thumbnail", boost::bind(&LLOutfitContextMenu::onThumbnail, this, selected_id)); + registrar.add("Outfit.Favorite", boost::bind(&LLOutfitContextMenu::onFavorite, this, selected_id)); registrar.add("Outfit.Save", boost::bind(&LLOutfitContextMenu::onSave, this, selected_id)); enable_registrar.add("Outfit.OnEnable", boost::bind(&LLOutfitContextMenu::onEnable, this, _2)); @@ -1117,6 +1323,16 @@ bool LLOutfitContextMenu::onVisible(LLSD::String param) { return LLAppearanceMgr::instance().getCanRemoveOutfit(outfit_cat_id); } + else if ("favorites_add" == param) + { + LLViewerInventoryCategory* cat = gInventory.getCategory(outfit_cat_id); + return cat && !cat->getIsFavorite(); + } + else if ("favorites_remove" == param) + { + LLViewerInventoryCategory* cat = gInventory.getCategory(outfit_cat_id); + return cat && cat->getIsFavorite(); + } return true; } @@ -1141,6 +1357,14 @@ void LLOutfitContextMenu::onThumbnail(const LLUUID &outfit_cat_id) } } +void LLOutfitContextMenu::onFavorite(const LLUUID& outfit_cat_id) +{ + if (outfit_cat_id.notNull()) + { + toggle_favorite(outfit_cat_id); + } +} + void LLOutfitContextMenu::onSave(const LLUUID &outfit_cat_id) { if (outfit_cat_id.notNull()) @@ -1171,14 +1395,13 @@ LLOutfitListGearMenuBase::LLOutfitListGearMenuBase(LLOutfitListBase* olist) registrar.add("Gear.Rename", boost::bind(&LLOutfitListGearMenuBase::onRename, this)); registrar.add("Gear.Delete", boost::bind(&LLOutfitListBase::removeSelected, mOutfitList)); registrar.add("Gear.Create", boost::bind(&LLOutfitListGearMenuBase::onCreate, this, _2)); - registrar.add("Gear.Collapse", boost::bind(&LLOutfitListBase::onCollapseAllFolders, mOutfitList)); - registrar.add("Gear.Expand", boost::bind(&LLOutfitListBase::onExpandAllFolders, mOutfitList)); registrar.add("Gear.WearAdd", boost::bind(&LLOutfitListGearMenuBase::onAdd, this)); registrar.add("Gear.Save", boost::bind(&LLOutfitListGearMenuBase::onSave, this)); registrar.add("Gear.Thumbnail", boost::bind(&LLOutfitListGearMenuBase::onThumbnail, this)); - registrar.add("Gear.SortByName", boost::bind(&LLOutfitListGearMenuBase::onChangeSortOrder, this)); + registrar.add("Gear.Favorite", boost::bind(&LLOutfitListGearMenuBase::onFavorite, this)); + registrar.add("Gear.SortByImage", boost::bind(&LLOutfitListGearMenuBase::onChangeSortOrder, this)); enable_registrar.add("Gear.OnEnable", boost::bind(&LLOutfitListGearMenuBase::onEnable, this, _2)); enable_registrar.add("Gear.OnVisible", boost::bind(&LLOutfitListGearMenuBase::onVisible, this, _2)); @@ -1312,6 +1535,16 @@ bool LLOutfitListGearMenuBase::onVisible(LLSD::String param) { return false; } + else if ("favorites_add" == param) + { + LLViewerInventoryCategory* cat = gInventory.getCategory(selected_outfit_id); + return cat && !cat->getIsFavorite(); + } + else if ("favorites_remove" == param) + { + LLViewerInventoryCategory* cat = gInventory.getCategory(selected_outfit_id); + return cat && cat->getIsFavorite(); + } return true; } @@ -1323,6 +1556,12 @@ void LLOutfitListGearMenuBase::onThumbnail() LLFloaterReg::showInstance("change_item_thumbnail", data); } +void LLOutfitListGearMenuBase::onFavorite() +{ + const LLUUID& selected_outfit_id = getSelectedOutfitID(); + toggle_favorite(selected_outfit_id); +} + void LLOutfitListGearMenuBase::onChangeSortOrder() { @@ -1338,21 +1577,91 @@ LLOutfitListGearMenu::~LLOutfitListGearMenu() void LLOutfitListGearMenu::onUpdateItemsVisibility() { if (!mMenu) return; - mMenu->setItemVisible("expand", true); - mMenu->setItemVisible("collapse", true); mMenu->setItemVisible("thumbnail", getSelectedOutfitID().notNull()); + mMenu->setItemVisible("favorite", getSelectedOutfitID().notNull()); mMenu->setItemVisible("sepatator3", false); mMenu->setItemVisible("sort_folders_by_name", false); LLOutfitListGearMenuBase::onUpdateItemsVisibility(); } +//////////////////// LLOutfitListSortMenu //////////////////// + +LLOutfitListSortMenu::LLOutfitListSortMenu(LLOutfitListBase* parent_panel) + : mPanelHandle(parent_panel->getHandle()) +{ + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; + + registrar.add("Sort.Collapse", boost::bind(&LLOutfitListBase::onCollapseAllFolders, parent_panel)); + registrar.add("Sort.Expand", boost::bind(&LLOutfitListBase::onExpandAllFolders, parent_panel)); + registrar.add("Sort.OnSort", boost::bind(&LLOutfitListBase::onChangeSortOrder, parent_panel, _2)); + enable_registrar.add("Sort.OnEnable", boost::bind(&LLOutfitListSortMenu::onEnable, this, _2)); + + mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>( + "menu_outfit_list_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + llassert(mMenu); +} + + +LLToggleableMenu* LLOutfitListSortMenu::getMenu() +{ + return mMenu; +} + +void LLOutfitListSortMenu::updateItemsVisibility() +{ + onUpdateItemsVisibility(); +} + +void LLOutfitListSortMenu::onUpdateItemsVisibility() +{ + if (!mMenu) return; + mMenu->setItemVisible("expand", true); + mMenu->setItemVisible("collapse", true); + mMenu->setItemVisible("sort_favorites_to_top", true); + mMenu->setItemVisible("show_entire_outfit_in_search", true); +} + +bool LLOutfitListSortMenu::onEnable(LLSD::String param) +{ + if ("favorites_to_top" == param) + { + static LLCachedControl<S32> sort_order(gSavedSettings, "OutfitListSortOrder", 0); + return sort_order == 1; + } + else if ("show_entire_outfit" == param) + { + static LLCachedControl<bool> filter_mode(gSavedSettings, "OutfitListFilterFullList", 0); + return filter_mode; + } + + return false; +} + + +//////////////////// LLOutfitAccordionCtrlTab //////////////////// + +LLUIImage* LLOutfitAccordionCtrlTab::sFavoriteIcon; +LLUIColor LLOutfitAccordionCtrlTab::sFgColor; + +void LLOutfitAccordionCtrlTab::draw() +{ + LLAccordionCtrlTab::draw(); + drawFavoriteIcon(); +} + bool LLOutfitAccordionCtrlTab::handleToolTip(S32 x, S32 y, MASK mask) { if (y >= getLocalRect().getHeight() - getHeaderHeight()) { LLSD params; params["inv_type"] = LLInventoryType::IT_CATEGORY; - params["thumbnail_id"] = gInventory.getCategory(mFolderID)->getThumbnailUUID(); + LLViewerInventoryCategory* cat = gInventory.getCategory(mFolderID); + if (cat) + { + params["thumbnail_id"] = cat->getThumbnailUUID(); + } + // else consider returning params["item_id"] = mFolderID; LLToolTipMgr::instance().show(LLToolTip::Params() @@ -1366,4 +1675,54 @@ bool LLOutfitAccordionCtrlTab::handleToolTip(S32 x, S32 y, MASK mask) return LLAccordionCtrlTab::handleToolTip(x, y, mask); } + +void LLOutfitAccordionCtrlTab::setFavorite(bool is_favorite) +{ + mIsFavorite = is_favorite; + updateTitleColor(); +} + +void LLOutfitAccordionCtrlTab::setOutfitSelected(bool val) +{ + mIsSelected = val; + setTitleFontStyle(mIsSelected ? "BOLD" : "NORMAL"); + updateTitleColor(); + } + +void LLOutfitAccordionCtrlTab::updateTitleColor() + { + static LLUICachedControl<bool> highlight_color("InventoryFavoritesColorText", true); + if (mIsFavorite && highlight_color()) + { + setTitleColor(LLUIColorTable::instance().getColor("InventoryFavoriteColor")); + } + else if (mIsSelected) + { + setTitleColor(LLUIColorTable::instance().getColor("SelectedOutfitTextColor")); + } + else + { + setTitleColor(LLUIColorTable::instance().getColor("AccordionHeaderTextColor")); + } + } + +void LLOutfitAccordionCtrlTab::drawFavoriteIcon() +{ + if (!mIsFavorite) + { + return; + } + static LLUICachedControl<bool> draw_star("InventoryFavoritesUseStar", true); + if (!draw_star) + { + return; + } + + const S32 PAD = 2; + const S32 image_size = 18; + + gl_draw_scaled_image( + getRect().getWidth() - image_size - PAD, getRect().getHeight() - image_size - PAD, + image_size, image_size, sFavoriteIcon->getImage(), sFgColor); +} // EOF diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h index f581b419d9..bcf7e45696 100644 --- a/indra/newview/lloutfitslist.h +++ b/indra/newview/lloutfitslist.h @@ -38,13 +38,13 @@ #include "lltoggleablemenu.h" #include "llviewermenu.h" -class LLAccordionCtrlTab; +class LLOutfitAccordionCtrlTab; class LLInventoryCategoriesObserver; class LLOutfitListGearMenuBase; +class LLOutfitListSortMenuBase; class LLWearableItemsList; class LLListContextMenu; - /** * @class LLOutfitTabNameComparator * @@ -61,10 +61,21 @@ public: /*virtual*/ bool compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const; }; +class LLOutfitTabFavComparator : public LLAccordionCtrl::LLTabComparator +{ + LOG_CLASS(LLOutfitTabFavComparator); + +public: + LLOutfitTabFavComparator() {}; + virtual ~LLOutfitTabFavComparator() {}; + + /*virtual*/ bool compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const; +}; + class LLOutfitListBase : public LLPanelAppearanceTab { public: - typedef boost::function<void(const LLUUID&)> selection_change_callback_t; + typedef std::function<void(const LLUUID&)> selection_change_callback_t; typedef boost::signals2::signal<void(const LLUUID&)> selection_change_signal_t; LLOutfitListBase(); @@ -92,6 +103,7 @@ public: boost::signals2::connection setSelectionChangeCallback(selection_change_callback_t cb); void outfitRightClickCallBack(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id); + void onAction(const LLSD& userdata); virtual bool isActionEnabled(const LLSD& userdata); virtual void performAction(std::string action); virtual bool hasItemSelected() = 0; @@ -109,6 +121,12 @@ public: virtual bool getHasExpandableFolders() = 0; + virtual void onChangeSortOrder(const LLSD& userdata) = 0; + + virtual void updateMenuItemsVisibility(); + virtual LLToggleableMenu* getGearMenu(); + virtual bool getTrashMenuVisible() { return true; }; + protected: void observerCallback(const LLUUID& category_id); virtual LLOutfitListGearMenuBase* createGearMenu() = 0; @@ -118,6 +136,8 @@ protected: void onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response); virtual void onChangeOutfitSelection(LLWearableItemsList* list, const LLUUID& category_id) = 0; + bool isOutfitFolder(LLViewerInventoryCategory* cat) const; + static void onIdle(void* userdata); void onIdleRefreshList(); @@ -139,6 +159,7 @@ protected: selection_change_signal_t mSelectionChangeSignal; LLListContextMenu* mOutfitMenu; LLOutfitListGearMenuBase* mGearMenu; + boost::signals2::connection mGearMenuConnection; }; ////////////////////////////////////////////////////////////////////////// @@ -155,7 +176,6 @@ protected: /* virtual */ LLContextMenu* createMenu(); bool onEnable(LLSD::String param); - bool onVisible(LLSD::String param); static void editOutfit(); @@ -163,6 +183,7 @@ protected: static void renameOutfit(const LLUUID& outfit_cat_id); void onThumbnail(const LLUUID &outfit_cat_id); + void onFavorite(const LLUUID& outfit_cat_id); void onSave(const LLUUID &outfit_cat_id); private: @@ -182,6 +203,7 @@ public: protected: virtual void onUpdateItemsVisibility(); virtual void onThumbnail(); + virtual void onFavorite(); virtual void onChangeSortOrder(); const LLUUID& getSelectedOutfitID(); @@ -202,6 +224,23 @@ private: bool onVisible(LLSD::String param); }; +class LLOutfitListSortMenu +{ +public: + LLOutfitListSortMenu(LLOutfitListBase* parent_panel); + + LLToggleableMenu* getMenu(); + void updateItemsVisibility(); + +private: + void onUpdateItemsVisibility(); + bool onEnable(LLSD::String param); + + LLToggleableMenu* mMenu; + LLHandle<LLPanel> mPanelHandle; +}; + + class LLOutfitListGearMenu : public LLOutfitListGearMenuBase { public: @@ -221,8 +260,19 @@ public: Params() : cat_id("cat_id") {} }; + virtual void draw(); virtual bool handleToolTip(S32 x, S32 y, MASK mask); + void setFavorite(bool is_favorite); + bool getFavorite() const { return mIsFavorite; } + LLUUID getFolderID() const { return mFolderID; } + void setOutfitSelected(bool val); + U32 getFilterGeneration() const { return mFilterGeneration; } + void setFilterGeneration(U32 generation) { mFilterGeneration = generation; } + + static LLUIImage* sFavoriteIcon; + static LLUIColor sFgColor; + protected: LLOutfitAccordionCtrlTab(const LLOutfitAccordionCtrlTab::Params &p) : LLAccordionCtrlTab(p), @@ -230,7 +280,13 @@ public: {} friend class LLUICtrlFactory; + void updateTitleColor(); + void drawFavoriteIcon(); + LLUUID mFolderID; + bool mIsFavorite = false; + bool mIsSelected = false; + U32 mFilterGeneration = 0; }; /** * @class LLOutfitsList @@ -249,6 +305,7 @@ public: virtual ~LLOutfitsList(); /*virtual*/ bool postBuild(); + void initComparator(); /*virtual*/ void onOpen(const LLSD& info); @@ -287,6 +344,10 @@ public: /*virtual*/ bool getHasExpandableFolders() { return true; } + /*virtual*/ void onChangeSortOrder(const LLSD& userdata); + virtual LLToggleableMenu* getSortMenu(); + void updateMenuItemsVisibility(); + protected: LLOutfitListGearMenuBase* createGearMenu(); @@ -328,20 +389,20 @@ private: * * A tab may be hidden if it doesn't match current filter. */ - void restoreOutfitSelection(LLAccordionCtrlTab* tab, const LLUUID& category_id); + void restoreOutfitSelection(LLOutfitAccordionCtrlTab* tab, const LLUUID& category_id); /** * Called upon list refresh event to update tab visibility depending on * the results of applying filter to the title and list items of the tab. */ - void onRefreshComplete(LLUICtrl* ctrl); + void onRefreshComplete(LLUICtrl* ctrl, LLOutfitAccordionCtrlTab* tab); /** * Applies filter to the given tab * * @see applyFilter() */ - void applyFilterToTab(const LLUUID& category_id, LLAccordionCtrlTab* tab, const std::string& filter_substring); + void applyFilterToTab(const LLUUID& category_id, LLOutfitAccordionCtrlTab* tab, const std::string& filter_substring); /** * Returns true if all selected items can be worn. @@ -357,6 +418,8 @@ private: static void onOutfitRename(const LLSD& notification, const LLSD& response); + void handleInvFavColorChange(); + //LLInventoryCategoriesObserver* mCategoriesObserver; LLAccordionCtrl* mAccordion; @@ -366,7 +429,7 @@ private: typedef wearables_lists_map_t::value_type wearables_lists_map_value_t; wearables_lists_map_t mSelectedListsMap; - typedef std::map<LLUUID, LLAccordionCtrlTab*> outfits_map_t; + typedef std::map<LLUUID, LLOutfitAccordionCtrlTab*> outfits_map_t; typedef outfits_map_t::value_type outfits_map_value_t; outfits_map_t mOutfitsMap; @@ -374,13 +437,15 @@ private: // Used to monitor COF changes for updating items worn state. See EXT-8636. uuid_vec_t mCOFLinkedItems; - //LLOutfitListGearMenu* mGearMenu; + LLOutfitListSortMenu* mSortMenu; //bool mIsInitialized; /** * True if there is a selection inside currently selected outfit */ bool mItemSelected; + + boost::signals2::connection mSavedSettingInvFavColor; }; #endif //LL_LLOUTFITSLIST_H diff --git a/indra/newview/llpanelappearancetab.cpp b/indra/newview/llpanelappearancetab.cpp index 3ee4ab8e51..ef04d7f13f 100644 --- a/indra/newview/llpanelappearancetab.cpp +++ b/indra/newview/llpanelappearancetab.cpp @@ -40,6 +40,7 @@ void LLPanelAppearanceTab::setFilterSubString(const std::string& new_string) { std::string old_string = mFilterSubString; mFilterSubString = new_string; + mFilterGeneration++; onFilterSubStringChanged(mFilterSubString, old_string); } @@ -52,6 +53,7 @@ void LLPanelAppearanceTab::checkFilterSubString() { std::string old_string = mFilterSubString; mFilterSubString = sRecentFilterSubString; + mFilterGeneration++; onFilterSubStringChanged(mFilterSubString, old_string); } } diff --git a/indra/newview/llpanelappearancetab.h b/indra/newview/llpanelappearancetab.h index e4d16582de..936fe2aec7 100644 --- a/indra/newview/llpanelappearancetab.h +++ b/indra/newview/llpanelappearancetab.h @@ -29,6 +29,8 @@ #include "llpanel.h" +class LLToggleableMenu; + class LLPanelAppearanceTab : public LLPanel { public: @@ -46,6 +48,12 @@ public: virtual void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const {} const std::string& getFilterSubString() { return mFilterSubString; } + U32 getFilterGeneration() { return mFilterGeneration; } + + virtual void updateMenuItemsVisibility() = 0; + virtual LLToggleableMenu* getGearMenu() = 0; + virtual LLToggleableMenu* getSortMenu() = 0; + virtual bool getTrashMenuVisible() = 0; protected: @@ -56,6 +64,7 @@ protected: private: std::string mFilterSubString; + U32 mFilterGeneration = 0; static std::string sRecentFilterSubString; }; diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 0e72771bd8..35624436b3 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -126,11 +126,11 @@ static void put_avatar_properties_coro(std::string cap_url, LLUUID agent_id, LLS { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("put_avatar_properties_coro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("put_avatar_properties_coro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLCore::HttpHeaders::ptr_t httpHeaders; - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); httpOpts->setFollowRedirects(true); std::string finalUrl = cap_url + "/" + agent_id.asString(); diff --git a/indra/newview/llpanelblockedlist.cpp b/indra/newview/llpanelblockedlist.cpp index 7d55ba3265..69f51b03b6 100644 --- a/indra/newview/llpanelblockedlist.cpp +++ b/indra/newview/llpanelblockedlist.cpp @@ -263,7 +263,7 @@ void LLPanelBlockedList::callbackBlockByName(const std::string& text) // Constructor/Destructor LLFloaterGetBlockedObjectName::LLFloaterGetBlockedObjectName(const LLSD& key) : LLFloater(key) -, mGetObjectNameCallback(NULL) +, mGetObjectNameCallback(nullptr) { } diff --git a/indra/newview/llpanelblockedlist.h b/indra/newview/llpanelblockedlist.h index 1f470199ce..782a44bc5b 100644 --- a/indra/newview/llpanelblockedlist.h +++ b/indra/newview/llpanelblockedlist.h @@ -95,7 +95,7 @@ class LLFloaterGetBlockedObjectName : public LLFloater { friend class LLFloaterReg; public: - typedef boost::function<void (const std::string&)> get_object_name_callback_t; + typedef std::function<void(const std::string&)> get_object_name_callback_t; bool postBuild() override; diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index 1faf241aaa..aefda39fb9 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -153,8 +153,10 @@ void LLPanelClassifiedInfo::reshape(S32 width, S32 height, bool called_from_pare void LLPanelClassifiedInfo::onOpen(const LLSD& key) { + bool from_search = key.has("from_search") ? key["from_search"].asBoolean() : false; + LLUUID avatar_id = key["classified_creator_id"]; - if(avatar_id.isNull()) + if(avatar_id.isNull() && !from_search) { return; } @@ -266,6 +268,15 @@ void LLPanelClassifiedInfo::processProperties(void* data, EAvatarProcessorType t } } +void LLPanelClassifiedInfo::setAvatarId(const LLUUID& avatar_id) +{ + if (mAvatarId.notNull()) + { + LLAvatarPropertiesProcessor::getInstance()->removeObserver(mAvatarId, this); + } + mAvatarId = avatar_id; +} + void LLPanelClassifiedInfo::resetData() { setClassifiedName(LLStringUtil::null); diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h index 266b9d222a..a429468a52 100644 --- a/indra/newview/llpanelclassified.h +++ b/indra/newview/llpanelclassified.h @@ -53,7 +53,7 @@ public: /*virtual*/ void processProperties(void* data, EAvatarProcessorType type); - void setAvatarId(const LLUUID& avatar_id) { mAvatarId = avatar_id; } + void setAvatarId(const LLUUID& avatar_id); LLUUID& getAvatarId() { return mAvatarId; } diff --git a/indra/newview/llpaneldirbrowser.cpp b/indra/newview/llpaneldirbrowser.cpp new file mode 100644 index 0000000000..69329c4ea4 --- /dev/null +++ b/indra/newview/llpaneldirbrowser.cpp @@ -0,0 +1,1145 @@ +/** + * @file llpaneldirbrowser.cpp + * @brief Base class for panels in the legacy Search directory. + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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$ + */ + +// Base class for the various search panels/results browsers +// in the Find floater. For example, Find > Popular Places +// is derived from this. + +#include "llviewerprecompiledheaders.h" + +#include "llpaneldirbrowser.h" + +// linden library includes +#include "lldir.h" +#include "lleventflags.h" +#include "llqueryflags.h" +#include "message.h" + +// viewer project includes +#include "llagent.h" +#include "llbutton.h" +#include "llcheckboxctrl.h" +#include "llcombobox.h" +#include "lllineeditor.h" +#include "llnotificationsutil.h" +#include "llpanelavatar.h" +#include "llpanelgroup.h" +#include "llpanelclassified.h" +#include "llpaneldirevents.h" +#include "llpaneldirland.h" +#include "llproductinforequest.h" +#include "llscrolllistctrl.h" +#include "lltextbox.h" +#include "lltrans.h" +#include "llviewercontrol.h" +#include "llfloaterdirectory.h" +#include "llpanelprofile.h" +#include "llpanelplaces.h" +#include "llpaneleventinfo.h" + + +std::map<LLUUID, LLPanelDirBrowser*> gDirBrowserInstances; + +LLPanelDirBrowser::LLPanelDirBrowser() +: LLPanel(), + mSearchID(), + mWantSelectID(), + mCurrentSortColumn("name"), + mCurrentSortAscending(true), + mSearchStart(0), + mResultsPerPage(RESULTS_PER_PAGE_DEFAULT), + mResultsReceived(0), + mMinSearchChars(1), + mResultsContents(), + mHaveSearchResults(false), + mDidAutoSelect(true), + mLastResultTimer(), + mFloaterDirectory(nullptr) +{ +} + +bool LLPanelDirBrowser::postBuild() +{ + childSetCommitCallback("results", onCommitList, this); + + mPrevPageBtn = getChild<LLButton>("prev_btn"); + mNextPageBtn = getChild<LLButton>("next_btn"); + + mPrevPageBtn->setClickedCallback([this](LLUICtrl*, const LLSD&){ prevPage(); }); + mPrevPageBtn->setVisible(false); + + mNextPageBtn->setClickedCallback([this](LLUICtrl*, const LLSD&) { nextPage(); }); + mNextPageBtn->setVisible(false); + + return true; +} + +LLPanelDirBrowser::~LLPanelDirBrowser() +{ + // Children all cleaned up by default view destructor. + gDirBrowserInstances.erase(mSearchID); +} + +// virtual +void LLPanelDirBrowser::draw() +{ + // HACK: If the results panel has data, we want to select the first + // item. Unfortunately, we don't know when the find is actually done, + // so only do this if it's been some time since the last packet of + // results was received. + if (mLastResultTimer.getElapsedTimeF32() > 0.5) + { + if (!mDidAutoSelect && + !childHasFocus("results")) + { + LLCtrlListInterface *list = childGetListInterface("results"); + if (list) + { + if (list->getCanSelect()) + { + list->selectFirstItem(); // select first item by default + childSetFocus("results", true); + } + // Request specific data from the server + onCommitList(NULL, this); + } + } + mDidAutoSelect = true; + } + + LLPanel::draw(); +} + + +// virtual +void LLPanelDirBrowser::nextPage() +{ + mSearchStart += mResultsPerPage; + mPrevPageBtn->setVisible(true); + + performQuery(); +} + + +// virtual +void LLPanelDirBrowser::prevPage() +{ + mSearchStart -= mResultsPerPage; + mPrevPageBtn->setVisible(mSearchStart > 0); + + performQuery(); +} + + +void LLPanelDirBrowser::resetSearchStart() +{ + mSearchStart = 0; + mNextPageBtn->setVisible(false); + mPrevPageBtn->setVisible(false); +} + +// protected +void LLPanelDirBrowser::updateResultCount() +{ + LLScrollListCtrl* list = getChild<LLScrollListCtrl>("results"); + + S32 result_count = list->getItemCount(); + std::string result_text; + + if (!mHaveSearchResults) result_count = 0; + + if (mNextPageBtn && mNextPageBtn->getVisible()) + { + // Item count be off by a few if bogus items sent from database + // Just use the number of results per page. JC + result_text = llformat(">%d found", mResultsPerPage); + } + else + { + result_text = llformat("%d found", result_count); + } + + childSetValue("result_text", result_text); + + if (result_count == 0) + { + // add none found response + if (list->getItemCount() == 0) + { + list->setCommentText(std::string("None found.")); // *TODO: Translate + list->operateOnAll(LLCtrlListInterface::OP_DESELECT); + } + } + else + { + childEnable("results"); + } +} + +// static +std::string LLPanelDirBrowser::filterShortWords(const std::string source_string, int shortest_word_length, bool& was_filtered) +{ + // degenerate case + if ( source_string.length() < 1 ) + return ""; + + std::stringstream codec( source_string ); + std::string each_word; + std::vector< std::string > all_words; + + while( codec >> each_word ) + all_words.push_back( each_word ); + + std::ostringstream dest_string( "" ); + + was_filtered = false; + + std::vector< std::string >::iterator iter = all_words.begin(); + while( iter != all_words.end() ) + { + if ( (int)(*iter).length() >= shortest_word_length ) + { + dest_string << *iter; + dest_string << " "; + } + else + { + was_filtered = true; + } + + ++iter; + }; + + return dest_string.str(); +} + +void LLPanelDirBrowser::selectByUUID(const LLUUID& id) +{ + LLCtrlListInterface *list = childGetListInterface("results"); + if (!list) return; + bool found = list->setCurrentByID(id); + if (found) + { + // we got it, don't wait for network + // Don't bother looking for this in the draw loop. + mWantSelectID.setNull(); + // Make sure UI updates. + onCommitList(NULL, this); + } + else + { + // waiting for this item from the network + mWantSelectID = id; + } +} + +void LLPanelDirBrowser::selectEventByID(S32 event_id) +{ + if (mFloaterDirectory) + { + if (mFloaterDirectory->mPanelEventp) + { + mFloaterDirectory->mPanelEventp->setVisible(true); + mFloaterDirectory->mPanelEventp->setEventID(event_id); + } + } +} + +void LLPanelDirBrowser::getSelectedInfo(LLUUID* id, S32 *type) +{ + LLCtrlListInterface *list = childGetListInterface("results"); + if (!list) return; + + LLSD id_sd = childGetValue("results"); + + *id = id_sd.asUUID(); + + std::string id_str = id_sd.asString(); + *type = mResultsContents[id_str]["type"]; +} + + +// static +void LLPanelDirBrowser::onCommitList(LLUICtrl* ctrl, void* data) +{ + LLPanelDirBrowser* self = (LLPanelDirBrowser*)data; + LLCtrlListInterface *list = self->childGetListInterface("results"); + if (!list) return; + + // Start with everyone invisible + if (self->mFloaterDirectory) + { + self->mFloaterDirectory->hideAllDetailPanels(); + } + + if (!list->getCanSelect()) + { + return; + } + + std::string id_str = self->childGetValue("results").asString(); + if (id_str.empty()) + { + return; + } + + LLSD item_id = list->getCurrentID(); + S32 type = self->mResultsContents[id_str]["type"]; + if (type == EVENT_CODE) + { + // all but events use the UUID above + item_id = self->mResultsContents[id_str]["event_id"]; + } + //std::string name = self->mResultsContents[id_str]["name"].asString(); + self->showDetailPanel(type, item_id); +} + +void LLPanelDirBrowser::showDetailPanel(S32 type, LLSD id) +{ + switch(type) + { + case AVATAR_CODE: + if (mFloaterDirectory && mFloaterDirectory->mPanelAvatarp) + { + mFloaterDirectory->mPanelAvatarp->setVisible(true); + mFloaterDirectory->mPanelAvatarp->onOpen(id); + mFloaterDirectory->mPanelAvatarp->updateData(); + } + break; + case GROUP_CODE: + if (mFloaterDirectory && mFloaterDirectory->mPanelGroupp) + { + mFloaterDirectory->mPanelGroupp->setVisible(true); + mFloaterDirectory->mPanelGroupp->onOpen(LLSD().with("group_id", id)); + } + break; + case PLACE_CODE: + case FOR_SALE_CODE: + case AUCTION_CODE: + if (mFloaterDirectory && mFloaterDirectory->mPanelPlacep) + { + mFloaterDirectory->mPanelPlacep->setVisible(true); + LLSD key; + key["type"] = "remote_place"; + key["id"]= id; + mFloaterDirectory->mPanelPlacep->onOpen(key); + } + break; + case CLASSIFIED_CODE: + if (mFloaterDirectory && mFloaterDirectory->mPanelClassifiedp) + { + mFloaterDirectory->mPanelClassifiedp->setVisible(true); + LLSD key; + key["classified_id"] = id; + key["from_search"] = true; + mFloaterDirectory->mPanelClassifiedp->onOpen(key); + } + break; + case EVENT_CODE: + { + U32 event_id = (U32)id.asInteger(); + showEvent(event_id); + } + break; + default: + { + LL_WARNS() << "Unknown event type!" << LL_ENDL; + } + break; + } +} + + +void LLPanelDirBrowser::showEvent(const U32 event_id) +{ + // Start with everyone invisible + if (mFloaterDirectory) + { + mFloaterDirectory->hideAllDetailPanels(); + if (mFloaterDirectory->mPanelEventp) + { + mFloaterDirectory->mPanelEventp->setVisible(true); + mFloaterDirectory->mPanelEventp->setEventID(event_id); + } + } +} + +void LLPanelDirBrowser::processDirPeopleReply(LLMessageSystem *msg, void**) +{ + LLUUID query_id; + std::string first_name; + std::string last_name; + LLUUID agent_id; + + msg->getUUIDFast(_PREHASH_QueryData,_PREHASH_QueryID, query_id); + + LLPanelDirBrowser* self = get_if_there(gDirBrowserInstances, query_id, (LLPanelDirBrowser*)NULL); + if (!self) + { + // data from an old query + return; + } + + self->mHaveSearchResults = true; + + LLCtrlListInterface *list = self->childGetListInterface("results"); + if (!list) return; + + if (!list->getCanSelect()) + { + list->operateOnAll(LLCtrlListInterface::OP_DELETE); + self->mResultsContents = LLSD(); + } + + S32 rows = msg->getNumberOfBlocksFast(_PREHASH_QueryReplies); + self->mResultsReceived += rows; + + rows = self->showNextButton(rows); + + for (S32 i = 0; i < rows; i++) + { + msg->getStringFast(_PREHASH_QueryReplies,_PREHASH_FirstName, first_name, i); + msg->getStringFast(_PREHASH_QueryReplies,_PREHASH_LastName, last_name, i); + msg->getUUIDFast( _PREHASH_QueryReplies,_PREHASH_AgentID, agent_id, i); + // msg->getU8Fast( _PREHASH_QueryReplies,_PREHASH_Online, online, i); + // unused + // msg->getStringFast(_PREHASH_QueryReplies,_PREHASH_Group, group, i); + // msg->getS32Fast( _PREHASH_QueryReplies,_PREHASH_Reputation, reputation, i); + + if (agent_id.isNull()) + { + continue; + } + + LLSD content; + + LLSD row; + row["id"] = agent_id; + + // We don't show online status in the finder anymore, + // so just use the 'offline' icon as the generic 'person' icon + row["columns"][0]["column"] = "icon"; + row["columns"][0]["type"] = "icon"; + row["columns"][0]["value"] = "icon_avatar_offline.tga"; + + content["type"] = AVATAR_CODE; + + std::string fullname = first_name + " " + last_name; + row["columns"][1]["column"] = "name"; + row["columns"][1]["value"] = fullname; + row["columns"][1]["font"] = "SANSSERIF"; + + content["name"] = fullname; + + list->addElement(row); + self->mResultsContents[agent_id.asString()] = content; + } + + list->sortByColumn(self->mCurrentSortColumn, self->mCurrentSortAscending); + self->updateResultCount(); + + // Poke the result received timer + self->mLastResultTimer.reset(); + self->mDidAutoSelect = false; +} + + +void LLPanelDirBrowser::processDirPlacesReply(LLMessageSystem* msg, void**) +{ + LLUUID agent_id; + LLUUID query_id; + LLUUID parcel_id; + std::string name; + bool is_for_sale = false; + bool is_auction = false; + F32 dwell; + + msg->getUUID("AgentData", "AgentID", agent_id); + msg->getUUID("QueryData", "QueryID", query_id ); + + if (msg->getNumberOfBlocks("StatusData")) + { + U32 status; + msg->getU32("StatusData", "Status", status); + if (status & STATUS_SEARCH_PLACES_BANNEDWORD) + { + LLNotificationsUtil::add("SearchWordBanned"); + } + } + + LLPanelDirBrowser* self = get_if_there(gDirBrowserInstances, query_id, (LLPanelDirBrowser*)NULL); + if (!self) + { + // data from an old query + return; + } + + self->mHaveSearchResults = true; + + LLCtrlListInterface *list = self->childGetListInterface("results"); + if (!list) return; + + if (!list->getCanSelect()) + { + list->operateOnAll(LLCtrlListInterface::OP_DELETE); + self->mResultsContents = LLSD(); + } + + S32 count = msg->getNumberOfBlocks("QueryReplies"); + self->mResultsReceived += count; + + count = self->showNextButton(count); + + for (S32 i = 0; i < count ; i++) + { + msg->getUUID("QueryReplies", "ParcelID", parcel_id, i); + msg->getString("QueryReplies", "Name", name, i); + msg->getBOOL("QueryReplies", "ForSale", is_for_sale, i); + msg->getBOOL("QueryReplies", "Auction", is_auction, i); + msg->getF32("QueryReplies", "Dwell", dwell, i); + + if (parcel_id.isNull()) + { + continue; + } + + LLSD content; + S32 type; + + LLSD row = self->createLandSale(parcel_id, is_auction, is_for_sale, name, &type); + + content["type"] = type; + content["name"] = name; + + std::string buffer = llformat("%.0f", (F64)dwell); + row["columns"][2]["column"] = "dwell"; + row["columns"][2]["value"] = buffer; + row["columns"][2]["font"] = "SansSerifSmall"; + + list->addElement(row); + self->mResultsContents[parcel_id.asString()] = content; + } + + list->sortByColumn(self->mCurrentSortColumn, self->mCurrentSortAscending); + self->updateResultCount(); + + // Poke the result received timer + self->mLastResultTimer.reset(); + self->mDidAutoSelect = false; +} + + +void LLPanelDirBrowser::processDirEventsReply(LLMessageSystem* msg, void**) +{ + LLUUID agent_id; + LLUUID query_id; + LLUUID owner_id; + std::string name; + std::string date; + + msg->getUUID("AgentData", "AgentID", agent_id); + msg->getUUID("QueryData", "QueryID", query_id ); + + LLPanelDirBrowser* self = get_if_there(gDirBrowserInstances, query_id, (LLPanelDirBrowser*)NULL); + if (!self) + { + return; + } + + if (msg->getNumberOfBlocks("StatusData")) + { + U32 status; + msg->getU32("StatusData", "Status", status); + if (status & STATUS_SEARCH_EVENTS_BANNEDWORD) + { + LLNotificationsUtil::add("SearchWordBanned"); + } + } + + self->mHaveSearchResults = true; + + LLCtrlListInterface *list = self->childGetListInterface("results"); + if (!list) return; + + if (!list->getCanSelect()) + { + list->operateOnAll(LLCtrlListInterface::OP_DELETE); + self->mResultsContents = LLSD(); + } + + S32 rows = msg->getNumberOfBlocks("QueryReplies"); + self->mResultsReceived += rows; + + rows = self->showNextButton(rows); + + for (S32 i = 0; i < rows; i++) + { + U32 event_id; + U32 unix_time; + U32 event_flags; + + msg->getUUID("QueryReplies", "OwnerID", owner_id, i); + msg->getString("QueryReplies", "Name", name, i); + msg->getU32("QueryReplies", "EventID", event_id, i); + msg->getString("QueryReplies", "Date", date, i); + msg->getU32("QueryReplies", "UnixTime", unix_time, i); + msg->getU32("QueryReplies", "EventFlags", event_flags, i); + + // Skip empty events + if (owner_id.isNull()) + { + //RN: should this check event_id instead? + LL_WARNS() << "skipped event due to owner_id null, event_id " << event_id << LL_ENDL; + continue; + } + LLSD content; + + content["type"] = EVENT_CODE; + content["name"] = name; + content["event_id"] = (S32)event_id; + + LLSD row; + row["id"] = llformat("%u", event_id); + + // Column 0 - event icon + LLUUID image_id; + if (event_flags == EVENT_FLAG_ADULT) + { + row["columns"][0]["column"] = "icon"; + row["columns"][0]["type"] = "icon"; + row["columns"][0]["value"] = "icon_event_adult.tga"; + } + else if (event_flags == EVENT_FLAG_MATURE) + { + row["columns"][0]["column"] = "icon"; + row["columns"][0]["type"] = "icon"; + row["columns"][0]["value"] = "icon_event_mature.tga"; + } + else + { + row["columns"][0]["column"] = "icon"; + row["columns"][0]["type"] = "icon"; + row["columns"][0]["value"] = "icon_event.tga"; + } + + row["columns"][1]["column"] = "name"; + row["columns"][1]["value"] = name; + row["columns"][1]["font"] = "SANSSERIF"; + + row["columns"][2]["column"] = "date"; + row["columns"][2]["value"] = date; + row["columns"][2]["font"] = "SansSerifSmall"; + + row["columns"][3]["column"] = "time"; + row["columns"][3]["value"] = llformat("%u", unix_time); + row["columns"][3]["font"] = "SansSerifSmall"; + + list->addElement(row, ADD_TOP /*ADD_SORTED*/); + + std::string id_str = llformat("%u", event_id); + self->mResultsContents[id_str] = content; + } + + list->sortByColumn(self->mCurrentSortColumn, self->mCurrentSortAscending); + self->updateResultCount(); + + // Poke the result received timer + self->mLastResultTimer.reset(); + self->mDidAutoSelect = false; +} + + +// static +void LLPanelDirBrowser::processDirGroupsReply(LLMessageSystem* msg, void**) +{ + S32 i; + + LLUUID query_id; + LLUUID group_id; + std::string group_name; + S32 members; + F32 search_order; + + msg->getUUIDFast(_PREHASH_QueryData,_PREHASH_QueryID, query_id ); + + LLPanelDirBrowser* self = get_if_there(gDirBrowserInstances, query_id, (LLPanelDirBrowser*)NULL); + if (!self) + { + return; + } + + self->mHaveSearchResults = true; + + LLCtrlListInterface *list = self->childGetListInterface("results"); + if (!list) return; + + if (!list->getCanSelect()) + { + list->operateOnAll(LLCtrlListInterface::OP_DELETE); + self->mResultsContents = LLSD(); + } + + S32 rows = msg->getNumberOfBlocksFast(_PREHASH_QueryReplies); + self->mResultsReceived += rows; + + rows = self->showNextButton(rows); + + for (i = 0; i < rows; i++) + { + msg->getUUIDFast(_PREHASH_QueryReplies, _PREHASH_GroupID, group_id, i ); + msg->getStringFast(_PREHASH_QueryReplies, _PREHASH_GroupName, group_name, i); + msg->getS32Fast(_PREHASH_QueryReplies, _PREHASH_Members, members, i ); + msg->getF32Fast(_PREHASH_QueryReplies, _PREHASH_SearchOrder, search_order, i ); + + if (group_id.isNull()) + { + continue; + } + + LLSD content; + content["type"] = GROUP_CODE; + content["name"] = group_name; + + LLSD row; + row["id"] = group_id; + + LLUUID image_id; + row["columns"][0]["column"] = "icon"; + row["columns"][0]["type"] = "icon"; + row["columns"][0]["value"] = "icon_group.tga"; + + row["columns"][1]["column"] = "name"; + row["columns"][1]["value"] = group_name; + row["columns"][1]["font"] = "SANSSERIF"; + + row["columns"][2]["column"] = "members"; + row["columns"][2]["value"] = members; + row["columns"][2]["font"] = "SansSerifSmall"; + + row["columns"][3]["column"] = "score"; + row["columns"][3]["value"] = search_order; + + list->addElement(row); + self->mResultsContents[group_id.asString()] = content; + } + list->sortByColumn(self->mCurrentSortColumn, self->mCurrentSortAscending); + self->updateResultCount(); + + // Poke the result received timer + self->mLastResultTimer.reset(); + self->mDidAutoSelect = false; +} + + +// static +void LLPanelDirBrowser::processDirClassifiedReply(LLMessageSystem* msg, void**) +{ + S32 i; + S32 num_new_rows; + + LLUUID agent_id; + LLUUID query_id; + + msg->getUUID("AgentData", "AgentID", agent_id); + if (agent_id != gAgent.getID()) + { + LL_WARNS() << "Message for wrong agent " << agent_id + << " in processDirClassifiedReply" << LL_ENDL; + return; + } + + msg->getUUID("QueryData", "QueryID", query_id); + LLPanelDirBrowser* self = get_if_there(gDirBrowserInstances, query_id, (LLPanelDirBrowser*)NULL); + if (!self) + { + return; + } + + if (msg->getNumberOfBlocks("StatusData")) + { + U32 status; + msg->getU32("StatusData", "Status", status); + if (status & STATUS_SEARCH_CLASSIFIEDS_BANNEDWORD) + { + LLNotificationsUtil::add("SearchWordBanned"); + } + } + + self->mHaveSearchResults = true; + + LLCtrlListInterface *list = self->childGetListInterface("results"); + if (!list) return; + + if (!list->getCanSelect()) + { + list->operateOnAll(LLCtrlListInterface::OP_DELETE); + self->mResultsContents = LLSD(); + } + + num_new_rows = msg->getNumberOfBlocksFast(_PREHASH_QueryReplies); + self->mResultsReceived += num_new_rows; + + num_new_rows = self->showNextButton(num_new_rows); + for (i = 0; i < num_new_rows; i++) + { + LLUUID classified_id; + std::string name; + U32 creation_date = 0; // unix timestamp + U32 expiration_date = 0; // future use + S32 price_for_listing = 0; + msg->getUUID("QueryReplies", "ClassifiedID", classified_id, i); + msg->getString("QueryReplies", "Name", name, i); + msg->getU32("QueryReplies","CreationDate",creation_date,i); + msg->getU32("QueryReplies","ExpirationDate",expiration_date,i); + msg->getS32("QueryReplies","PriceForListing",price_for_listing,i); + + if ( classified_id.notNull() ) + { + self->addClassified(list, classified_id, name, creation_date, price_for_listing); + + LLSD content; + content["type"] = CLASSIFIED_CODE; + content["name"] = name; + self->mResultsContents[classified_id.asString()] = content; + } + } + // The server does the initial sort, by price paid per listing and date. JC + self->updateResultCount(); + + // Poke the result received timer + self->mLastResultTimer.reset(); + self->mDidAutoSelect = false; +} + +void LLPanelDirBrowser::processDirLandReply(LLMessageSystem *msg, void**) +{ + LLUUID agent_id; + LLUUID query_id; + LLUUID parcel_id; + std::string name; + std::string land_sku; + std::string land_type; + bool auction = false; + bool for_sale = false; + S32 sale_price; + S32 actual_area; + + msg->getUUID("AgentData", "AgentID", agent_id); + msg->getUUID("QueryData", "QueryID", query_id ); + + LLPanelDirBrowser* browser = get_if_there(gDirBrowserInstances, query_id, (LLPanelDirBrowser*)NULL); + if (!browser) + { + // data from an old query + return; + } + + // Only handled by LLPanelDirLand + LLPanelDirLand* self = (LLPanelDirLand*)browser; + + self->mHaveSearchResults = true; + + LLCtrlListInterface *list = self->childGetListInterface("results"); + if (!list) return; + + if (!list->getCanSelect()) + { + list->operateOnAll(LLCtrlListInterface::OP_DELETE); + self->mResultsContents = LLSD(); + } + + bool use_price = gSavedSettings.getBOOL("FindLandPrice"); + S32 limit_price = self->childGetValue("priceedit").asInteger(); + + bool use_area = gSavedSettings.getBOOL("FindLandArea"); + S32 limit_area = self->childGetValue("areaedit").asInteger(); + + S32 i; + S32 count = msg->getNumberOfBlocks("QueryReplies"); + self->mResultsReceived += count; + + S32 non_auction_count = 0; + for (i = 0; i < count; i++) + { + msg->getUUID("QueryReplies", "ParcelID", parcel_id, i); + msg->getString("QueryReplies", "Name", name, i); + msg->getBOOL("QueryReplies", "Auction", auction, i); + msg->getBOOL("QueryReplies", "ForSale", for_sale, i); + msg->getS32("QueryReplies", "SalePrice", sale_price, i); + msg->getS32("QueryReplies", "ActualArea", actual_area, i); + + if ( msg->getSizeFast(_PREHASH_QueryReplies, i, _PREHASH_ProductSKU) > 0 ) + { + msg->getStringFast(_PREHASH_QueryReplies, _PREHASH_ProductSKU, land_sku, i); + land_type = LLProductInfoRequestManager::instance().getDescriptionForSku(land_sku); + } + else + { + land_sku.clear(); + land_type = LLTrans::getString("land_type_unknown"); + } + + if (parcel_id.isNull()) continue; + + if (use_price && (sale_price > limit_price)) continue; + + if (use_area && (actual_area < limit_area)) continue; + + LLSD content; + S32 type; + + LLSD row = self->createLandSale(parcel_id, auction, for_sale, name, &type); + + content["type"] = type; + content["name"] = name; + content["landtype"] = land_type; + + std::string buffer = "Auction"; + if (!auction) + { + buffer = llformat("%d", sale_price); + non_auction_count++; + } + row["columns"][2]["column"] = "price"; + row["columns"][2]["value"] = buffer; + row["columns"][2]["font"] = "SansSerifSmall"; + + buffer = llformat("%d", actual_area); + row["columns"][3]["column"] = "area"; + row["columns"][3]["value"] = buffer; + row["columns"][3]["font"] = "SansSerifSmall"; + + if (!auction) + { + F32 price_per_meter; + if (actual_area > 0) + { + price_per_meter = (F32)sale_price / (F32)actual_area; + } + else + { + price_per_meter = 0.f; + } + // Prices are usually L$1 - L$10 / meter + buffer = llformat("%.1f", price_per_meter); + row["columns"][4]["column"] = "per_meter"; + row["columns"][4]["value"] = buffer; + row["columns"][4]["font"] = "SansSerifSmall"; + } + else + { + // Auctions start at L$1 per meter + row["columns"][4]["column"] = "per_meter"; + row["columns"][4]["value"] = "1.0"; + row["columns"][4]["font"] = "SansSerifSmall"; + } + + row["columns"][5]["column"] = "landtype"; + row["columns"][5]["value"] = land_type; + row["columns"][5]["font"] = "SansSerifSmall"; + + list->addElement(row); + self->mResultsContents[parcel_id.asString()] = content; + } + + // All auction results are shown on the first page + // But they don't count towards the 100 / page limit + // So figure out the next button here, when we know how many aren't auctions + count = self->showNextButton(non_auction_count); + + self->updateResultCount(); + + // Poke the result received timer + self->mLastResultTimer.reset(); + self->mDidAutoSelect = false; +} + +void LLPanelDirBrowser::addClassified(LLCtrlListInterface *list, const LLUUID& pick_id, const std::string& name, const U32 creation_date, const S32 price_for_listing) +{ + std::string type = llformat("%d", CLASSIFIED_CODE); + + LLSD row; + row["id"] = pick_id; + + row["columns"][0]["column"] = "icon"; + row["columns"][0]["type"] = "icon"; + row["columns"][0]["value"] = "icon_top_pick.tga"; + + row["columns"][1]["column"] = "name"; + row["columns"][1]["value"] = name; + row["columns"][1]["font"] = "SANSSERIF"; + + row["columns"][2]["column"] = "price"; + row["columns"][2]["value"] = price_for_listing; + row["columns"][2]["font"] = "SansSerifSmall"; + + list->addElement(row); +} + +LLSD LLPanelDirBrowser::createLandSale(const LLUUID& parcel_id, bool is_auction, bool is_for_sale, const std::string& name, S32 *type) +{ + LLSD row; + row["id"] = parcel_id; + LLUUID image_id; + + // Icon and type + if(is_auction) + { + row["columns"][0]["column"] = "icon"; + row["columns"][0]["type"] = "icon"; + row["columns"][0]["value"] = "icon_auction.tga"; + + *type = AUCTION_CODE; + } + else if (is_for_sale) + { + row["columns"][0]["column"] = "icon"; + row["columns"][0]["type"] = "icon"; + row["columns"][0]["value"] = "icon_for_sale.tga"; + + *type = FOR_SALE_CODE; + } + else + { + row["columns"][0]["column"] = "icon"; + row["columns"][0]["type"] = "icon"; + row["columns"][0]["value"] = "icon_place.tga"; + + *type = PLACE_CODE; + } + + row["columns"][1]["column"] = "name"; + row["columns"][1]["value"] = name; + row["columns"][1]["font"] = "SANSSERIF"; + + return row; +} + +void LLPanelDirBrowser::setupNewSearch() +{ + LLScrollListCtrl* list = getChild<LLScrollListCtrl>("results"); + + gDirBrowserInstances.erase(mSearchID); + // Make a new query ID + mSearchID.generate(); + + gDirBrowserInstances.emplace(mSearchID, this); + + // ready the list for results + list->operateOnAll(LLCtrlListInterface::OP_DELETE); + list->setCommentText(LLTrans::getString("Searching")); + list->setEnabled(false); + + mResultsReceived = 0; + mHaveSearchResults = false; + + // Set all panels to be invisible + mFloaterDirectory->hideAllDetailPanels(); + + updateResultCount(); +} + + +// static +// called from calssifieds, events, groups, land, people, and places +void LLPanelDirBrowser::onClickSearchCore(void* userdata) +{ + LLPanelDirBrowser* self = (LLPanelDirBrowser*)userdata; + if (!self) return; + + self->resetSearchStart(); + self->performQuery(); +} + + +// static +void LLPanelDirBrowser::sendDirFindQuery( + LLMessageSystem* msg, + const LLUUID& query_id, + const std::string& text, + U32 flags, + S32 query_start) +{ + msg->newMessage("DirFindQuery"); + msg->nextBlock("AgentData"); + msg->addUUID("AgentID", gAgent.getID()); + msg->addUUID("SessionID", gAgent.getSessionID()); + msg->nextBlock("QueryData"); + msg->addUUID("QueryID", query_id); + msg->addString("QueryText", text); + msg->addU32("QueryFlags", flags); + msg->addS32("QueryStart", query_start); + gAgent.sendReliableMessage(); +} + + +void LLPanelDirBrowser::onKeystrokeName(LLLineEditor* line, void* data) +{ + LLPanelDirBrowser *self = (LLPanelDirBrowser*)data; + if (line->getLength() >= (S32)self->mMinSearchChars) + { + self->setDefaultBtn( "Search" ); + self->childEnable("Search"); + } + else + { + self->setDefaultBtn(); + self->childDisable("Search"); + } +} + +// setup results when shown +void LLPanelDirBrowser::onVisibilityChange(bool new_visibility) +{ + if (new_visibility) + { + onCommitList(NULL, this); + } + LLPanel::onVisibilityChange(new_visibility); +} + +S32 LLPanelDirBrowser::showNextButton(S32 rows) +{ + // HACK: This hack doesn't work for llpaneldirfind (ALL) + // because other data is being returned as well. + if ( getName() != "find_all_old_panel") + { + // HACK: The (mResultsPerPage)+1th entry indicates there are 'more' + bool show_next = (mResultsReceived > mResultsPerPage); + mNextPageBtn->setVisible(show_next); + if (show_next) + { + rows -= (mResultsReceived - mResultsPerPage); + } + } + else + { + // Hide page buttons + mNextPageBtn->setVisible(false); + mPrevPageBtn->setVisible(false); + } + return rows; +} diff --git a/indra/newview/llpaneldirbrowser.h b/indra/newview/llpaneldirbrowser.h new file mode 100644 index 0000000000..f422affc4b --- /dev/null +++ b/indra/newview/llpaneldirbrowser.h @@ -0,0 +1,167 @@ +/** + * @file llpaneldirbrowser.h + * @brief Base class for panels in the legacy Search directory. + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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_LLPANELDIRBROWSER_H +#define LL_LLPANELDIRBROWSER_H + +#include "llpanel.h" + +#include "llframetimer.h" + +class LLMessageSystem; +class LLFloaterDirectory; +class LLLineEditor; + +class LLPanelDirBrowser: public LLPanel +{ +public: + LLPanelDirBrowser(); + virtual ~LLPanelDirBrowser(); + + bool postBuild() override; + void setFloaterDirectory(LLFloaterDirectory* floater) { mFloaterDirectory = floater; } + + // Use to get periodic updates. + void draw() override; + + void onVisibilityChange(bool curVisibilityIn) override; + + // Redo your search for the prev/next page of results + virtual void prevPage(); + virtual void nextPage(); + void resetSearchStart(); + // Do the current query (used by prevPage/nextPage) + virtual void performQuery() {}; + + const LLUUID& getSearchID() const { return mSearchID; } + + // Select the line in the scroll list control with this ID, + // either now or when data arrives from the server. + void selectByUUID(const LLUUID& id); + + void selectEventByID(S32 event_id); + + void getSelectedInfo(LLUUID* id, S32 *type); + + void showDetailPanel(S32 type, LLSD item_id); + // type is EVENT_CODE, PLACE_CODE, etc. from below. + // item_id is integer for events, UUID for all others. + + // from llpaneldirbase + void setupNewSearch(); + + // default handler for clicking the search button resets the + // next/prev state and performs the query. + // Expects a pointer to an LLPanelDirBrowser object. + static void onClickSearchCore(void* userdata); + + // query_start indicates the first result row to + // return, usually 0 or 100 or 200 because the searches + // return a max of 100 rows + static void sendDirFindQuery( + LLMessageSystem* msg, + const LLUUID& query_id, + const std::string& text, + U32 flags, + S32 query_start); + + void showEvent(const U32 event_id); + + static void onCommitList(LLUICtrl* ctrl, void* data); + + static void processDirPeopleReply(LLMessageSystem* msg, void**); + static void processDirPlacesReply(LLMessageSystem* msg, void**); + static void processDirEventsReply(LLMessageSystem* msg, void**); + static void processDirGroupsReply(LLMessageSystem* msg, void**); + static void processDirClassifiedReply(LLMessageSystem* msg, void**); + static void processDirLandReply(LLMessageSystem *msg, void**); + + std::string filterShortWords( const std::string source_string, int shortest_word_length, bool& was_filtered ); + +protected: + void updateResultCount(); + + void addClassified(LLCtrlListInterface *list, const LLUUID& classified_id, const std::string& name, const U32 creation_date, const S32 price_for_listing); + LLSD createLandSale(const LLUUID& parcel_id, bool is_auction, bool is_for_sale, const std::string& name, S32 *type); + + static void onKeystrokeName(LLLineEditor* line, void* data); + + // If this is a search for a panel like "people_panel" (and not the "all" panel) + // optionally show the "Next" button. Return the actual number of + // rows to display. + S32 showNextButton(S32 rows); + +protected: + LLUUID mSearchID; // Unique ID for a pending search + LLUUID mWantSelectID; // scroll item to select on arrival + std::string mCurrentSortColumn; + bool mCurrentSortAscending; + // Some searches return a max of 100 items per page, so we can + // start the search from the 100th item rather than the 0th, etc. + S32 mSearchStart; + // Places is 100 per page, events is 200 per page + S32 mResultsPerPage; + S32 mResultsReceived; + + U32 mMinSearchChars; + + LLSD mResultsContents; + + bool mHaveSearchResults; + bool mDidAutoSelect; + LLFrameTimer mLastResultTimer; + + LLFloaterDirectory* mFloaterDirectory; + LLButton* mPrevPageBtn; + LLButton* mNextPageBtn; +}; + +constexpr S32 RESULTS_PER_PAGE_DEFAULT = 100; +constexpr S32 RESULTS_PER_PAGE_EVENTS = 200; + +// Codes used for sorting by type. +const S32 INVALID_CODE = -1; +const S32 EVENT_CODE = 0; +const S32 PLACE_CODE = 1; +// We no longer show online vs. offline in search result icons. +//const S32 ONLINE_CODE = 2; +//const S32 OFFLINE_CODE = 3; +const S32 AVATAR_CODE = 3; +const S32 GROUP_CODE = 4; +const S32 CLASSIFIED_CODE = 5; +const S32 FOR_SALE_CODE = 6; // for sale place +const S32 AUCTION_CODE = 7; // for auction place +const S32 POPULAR_CODE = 8; // popular by dwell + +// mask values for search flags +const S32 SEARCH_NONE = 0; // should try not to send this to the search engine +const S32 SEARCH_PG = 1; +const S32 SEARCH_MATURE = 2; +const S32 SEARCH_ADULT = 4; + +extern std::map<LLUUID, LLPanelDirBrowser*> gDirBrowserInstances; + +#endif // LL_LLPANELDIRBROWSER_H diff --git a/indra/newview/llpaneldirclassified.cpp b/indra/newview/llpaneldirclassified.cpp new file mode 100644 index 0000000000..ca625b956b --- /dev/null +++ b/indra/newview/llpaneldirclassified.cpp @@ -0,0 +1,109 @@ +/** + * @file llpaneldirclassified.cpp + * @brief Classified panel in the legacy Search directory. + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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 "llpaneldirclassified.h" + +#include "llclassifiedflags.h" + +#include "llfontgl.h" +#include "message.h" +#include "llqueryflags.h" + +#include "llagent.h" +#include "llbutton.h" +#include "llcontrol.h" +#include "llcombobox.h" +#include "llclassifiedinfo.h" +#include "lluiconstants.h" +#include "llpaneldirbrowser.h" +#include "lltextbox.h" + +#include "llcheckboxctrl.h" +#include "llfloaterdirectory.h" +#include "lllineeditor.h" +#include "llsearcheditor.h" +#include "llviewermenu.h" +#include "llnotificationsutil.h" + +static LLPanelInjector<LLPanelDirClassified> t_panel_dir_classified("panel_dir_classified"); + +LLPanelDirClassified::LLPanelDirClassified() +: LLPanelDirBrowser() +{ +} + +bool LLPanelDirClassified::postBuild() +{ + LLPanelDirBrowser::postBuild(); + + childSetAction("Search", onClickSearchCore, this); + setDefaultBtn("Search"); + return true; +} + +LLPanelDirClassified::~LLPanelDirClassified() +{ +} + +void LLPanelDirClassified::performQuery() +{ + static LLUICachedControl<bool> inc_pg("ShowPGClassifieds", true); + static LLUICachedControl<bool> inc_mature("ShowMatureClassifieds", false); + static LLUICachedControl<bool> inc_adult("ShowAdultClassifieds", false); + + if (!(inc_pg || inc_mature || inc_adult)) + { + LLNotificationsUtil::add("NoContentToSearch"); + return; + } + + // This sets mSearchID and clears the list of results + setupNewSearch(); + + // send the message + LLMessageSystem *msg = gMessageSystem; + msg->newMessageFast(_PREHASH_DirClassifiedQuery); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + + bool filter_auto_renew = false; + U32 query_flags = pack_classified_flags_request(filter_auto_renew, inc_pg, + inc_mature && gAgent.canAccessMature(), + inc_adult && gAgent.canAccessAdult()); + U32 category = childGetValue("Category").asInteger(); + + msg->nextBlockFast(_PREHASH_QueryData); + msg->addUUIDFast(_PREHASH_QueryID, mSearchID ); + msg->addStringFast(_PREHASH_QueryText, childGetValue("name").asString()); + msg->addU32Fast(_PREHASH_QueryFlags, query_flags); + msg->addU32Fast(_PREHASH_Category, category); + msg->addS32Fast(_PREHASH_QueryStart,mSearchStart); + + gAgent.sendReliableMessage(); +} diff --git a/indra/newview/llpaneldirclassified.h b/indra/newview/llpaneldirclassified.h new file mode 100644 index 0000000000..6682f73929 --- /dev/null +++ b/indra/newview/llpaneldirclassified.h @@ -0,0 +1,55 @@ +/** + * @file llpaneldirclassified.h + * @brief Classified panel in the legacy Search directory. + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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_LLPANELDIRCLASSIFIED_H +#define LL_LLPANELDIRCLASSIFIED_H + +#include "llpaneldirbrowser.h" + +// UI class forward declarations +class LLButton; +class LLCheckBoxCtrl; +class LLComboBox; +class LLLineEditor; +class LLScrollListCtrl; + +class LLPanelDirClassified : public LLPanelDirBrowser +{ +public: + LLPanelDirClassified(); + /*virtual*/ ~LLPanelDirClassified(); + + bool postBuild(); + + // Request the classifieds from the database + void performQuery(); + +protected: + // onClickNext and onClickPrev are special case searches + static void onClickSearch(void *userdata); +}; + +#endif diff --git a/indra/newview/llpaneldirevents.cpp b/indra/newview/llpaneldirevents.cpp new file mode 100644 index 0000000000..7ac1229637 --- /dev/null +++ b/indra/newview/llpaneldirevents.cpp @@ -0,0 +1,247 @@ +/** + * @file llpaneldirevents.cpp + * @brief Events panel in the legacy Search directory. + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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 "llpaneldirevents.h" + +#include <sstream> + +// linden library includes +#include "message.h" +#include "llqueryflags.h" + +// viewer project includes +#include "llagent.h" +#include "llviewercontrol.h" +#include "llnotificationsutil.h" +#include "llpaneldirbrowser.h" +#include "llresmgr.h" +#include "lluiconstants.h" +#include "llappviewer.h" + +static LLPanelInjector<LLPanelDirEvents> t_panel_dir_events("panel_dir_events"); + +constexpr S32 DAY_TO_SEC = 24 * 60 * 60; + +LLPanelDirEvents::LLPanelDirEvents() + : LLPanelDirBrowser(), + mDay(0) +{ + // more results per page for this + mResultsPerPage = RESULTS_PER_PAGE_EVENTS; +} + +bool LLPanelDirEvents::postBuild() +{ + LLPanelDirBrowser::postBuild(); + + childSetCommitCallback("date_mode", onDateModeCallback, this); + + childSetAction("back_btn", onBackBtn, this); + childSetAction("forward_btn", onForwardBtn, this); + + childSetCommitCallback("mature", onCommitMature, this); + + childSetAction("Search", LLPanelDirBrowser::onClickSearchCore, this); + setDefaultBtn("Search"); + + onDateModeCallback(NULL, this); + + mCurrentSortColumn = "time"; + + setDay(0); // for today + + return true; +} + +LLPanelDirEvents::~LLPanelDirEvents() +{ +} + +void LLPanelDirEvents::setDay(S32 day) +{ + mDay = day; + + // Get time UTC + time_t utc_time = time_corrected(); + + // Correct for offset + utc_time += day * DAY_TO_SEC; + + // There's only one internal tm buffer. + struct tm* internal_time; + + // Convert to Pacific, based on server's opinion of whether + // it's daylight savings time there. + internal_time = utc_to_pacific_time(utc_time, is_daylight_savings()); + + std::string buffer = llformat("%d/%d", + 1 + internal_time->tm_mon, // Jan = 0 + internal_time->tm_mday); // 2001 = 101 + childSetValue("date_text", buffer); +} + +// virtual +void LLPanelDirEvents::performQuery() +{ + // event_id 0 will perform no delete action. + performQueryOrDelete(0); +} + +void LLPanelDirEvents::performQueryOrDelete(U32 event_id) +{ + S32 relative_day = mDay; + // Update the date field to show the date IN THE SERVER'S + // TIME ZONE, as that is what will be displayed in each event + + // Get time UTC + time_t utc_time = time_corrected(); + + // Correct for offset + utc_time += relative_day * DAY_TO_SEC; + + // There's only one internal tm buffer. + struct tm* internal_time; + + // Convert to Pacific, based on server's opinion of whether + // it's daylight savings time there. + internal_time = utc_to_pacific_time(utc_time, is_daylight_savings()); + + std::string buffer = llformat("%d/%d", + 1 + internal_time->tm_mon, // Jan = 0 + internal_time->tm_mday); // 2001 = 101 + childSetValue("date_text", buffer); + + // Record the relative day so back and forward buttons + // offset from this day. + mDay = relative_day; + + static LLUICachedControl<bool> incpg("ShowPGEvents", true); + static LLUICachedControl<bool> incmature("ShowMatureEvents", false); + static LLUICachedControl<bool> incadult("ShowAdultEvents", false); + if (!(incpg || incmature || incadult)) + { + LLNotificationsUtil::add("NoContentToSearch"); + return; + } + + U32 scope = DFQ_DATE_EVENTS; + if (incpg) scope |= DFQ_INC_PG; + if (incmature && gAgent.canAccessMature()) scope |= DFQ_INC_MATURE; + if (incadult && gAgent.canAccessAdult()) scope |= DFQ_INC_ADULT; + + setupNewSearch(); + + std::ostringstream params; + + // Date mode for the search + if ("current" == childGetValue("date_mode").asString()) + { + params << "u|"; + } + else + { + params << mDay << "|"; + } + + // Categories are stored in the database in table indra.event_category + // XML must match. + U32 cat_id = childGetValue("category_combo").asInteger(); + + params << cat_id << "|"; + params << childGetValue("event_search_text").asString(); + + // send the message + if (0 == event_id) + { + sendDirFindQuery(gMessageSystem, mSearchID, params.str(), scope, mSearchStart); + } + else + { + // This delete will also perform a query. + LLMessageSystem* msg = gMessageSystem; + + msg->newMessageFast(_PREHASH_EventGodDelete); + + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + + msg->nextBlockFast(_PREHASH_EventData); + msg->addU32Fast(_PREHASH_EventID, event_id); + + msg->nextBlockFast(_PREHASH_QueryData); + msg->addUUIDFast(_PREHASH_QueryID, mSearchID); + msg->addStringFast(_PREHASH_QueryText, params.str()); + msg->addU32Fast(_PREHASH_QueryFlags, scope); + msg->addS32Fast(_PREHASH_QueryStart, mSearchStart); + gAgent.sendReliableMessage(); + } +} + +// static +void LLPanelDirEvents::onDateModeCallback(LLUICtrl* ctrl, void *data) +{ + LLPanelDirEvents* self = (LLPanelDirEvents*)data; + if (self->childGetValue("date_mode").asString() == "date") + { + self->childEnable("forward_btn"); + self->childEnable("back_btn"); + } + else + { + self->childDisable("forward_btn"); + self->childDisable("back_btn"); + } +} + +// static +void LLPanelDirEvents::onBackBtn(void* data) +{ + LLPanelDirEvents* self = (LLPanelDirEvents*)data; + self->resetSearchStart(); + self->setDay(self->mDay - 1); + self->performQuery(); +} + + +// static +void LLPanelDirEvents::onForwardBtn(void* data) +{ + LLPanelDirEvents* self = (LLPanelDirEvents*)data; + self->resetSearchStart(); + self->setDay(self->mDay + 1); + self->performQuery(); +} + + +// static +void LLPanelDirEvents::onCommitMature(LLUICtrl* ctrl, void* data) +{ + // just perform another search + onClickSearchCore(data); +} diff --git a/indra/newview/llpaneldirevents.h b/indra/newview/llpaneldirevents.h new file mode 100644 index 0000000000..596abc5f0e --- /dev/null +++ b/indra/newview/llpaneldirevents.h @@ -0,0 +1,61 @@ +/** + * @file llpaneldirevents.h + * @brief Events panel in the legacy Search directory. + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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_LLPANELDIREVENTS_H +#define LL_LLPANELDIREVENTS_H + +#include "llpaneldirbrowser.h" + +class LLUICtrl; +class LLPanelDirBrowser; + +class LLPanelDirEvents : public LLPanelDirBrowser +{ +public: + LLPanelDirEvents(); + virtual ~LLPanelDirEvents(); + + bool postBuild() override; + + /*virtual*/ void performQuery() override; + + void performQueryOrDelete(U32 event_id); + + // pass 0 for today, 1 for tomorrow + void setDay(S32 day); + +protected: + static void onDateModeCallback(LLUICtrl* ctrl, void *data); + static void onBackBtn(void* data); + static void onForwardBtn(void* data); + static void onCommitMature(LLUICtrl* ctrl, void* data); + +protected: + S32 mDay; // 0 = today, 1 = tomorrow +}; + + +#endif diff --git a/indra/newview/llpaneldirgroups.cpp b/indra/newview/llpaneldirgroups.cpp new file mode 100644 index 0000000000..992d92091c --- /dev/null +++ b/indra/newview/llpaneldirgroups.cpp @@ -0,0 +1,90 @@ +/** + * @file llpaneldirgroups.cpp + * @brief Groups panel in the legacy Search directory. + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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 "llpaneldirgroups.h" + +#include "llagent.h" +#include "llqueryflags.h" +#include "llviewercontrol.h" +#include "llsearcheditor.h" + +static LLPanelInjector<LLPanelDirGroups> t_panel_dir_groups("panel_dir_groups"); + +LLPanelDirGroups::LLPanelDirGroups() + : LLPanelDirBrowser() +{ + mMinSearchChars = 3; +} + + +bool LLPanelDirGroups::postBuild() +{ + LLPanelDirBrowser::postBuild(); + + //getChild<LLLineEditor>("name")->setKeystrokeCallback(boost::bind(&LLPanelDirBrowser::onKeystrokeName, _1, _2), NULL); + + childSetAction("Search", &LLPanelDirBrowser::onClickSearchCore, this); + setDefaultBtn( "Search" ); + + return true; +} + +LLPanelDirGroups::~LLPanelDirGroups() +{ +} + +// virtual +void LLPanelDirGroups::performQuery() +{ + if (childGetValue("name").asString().length() < mMinSearchChars) + { + return; + } + + setupNewSearch(); + + // groups + U32 scope = DFQ_GROUPS; + + // Check group mature filter. + if ( !gSavedSettings.getBOOL("ShowMatureGroups") || gAgent.isTeen() ) + { + scope |= DFQ_FILTER_MATURE; + } + + mCurrentSortColumn = "score"; + mCurrentSortAscending = false; + + // send the message + sendDirFindQuery( + gMessageSystem, + mSearchID, + childGetValue("name").asString(), + scope, + mSearchStart); +} diff --git a/indra/newview/llpaneldirgroups.h b/indra/newview/llpaneldirgroups.h new file mode 100644 index 0000000000..1e10353e2a --- /dev/null +++ b/indra/newview/llpaneldirgroups.h @@ -0,0 +1,45 @@ +/** + * @file llpaneldirgroups.h + * @brief Groups panel in the legacy Search directory. + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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 LLPANELDIRGROUPS_H +#define LLPANELDIRGROUPS_H + +#include "llpaneldirbrowser.h" + +class LLPanelDirGroups : public LLPanelDirBrowser +{ +public: + LLPanelDirGroups(); + virtual ~LLPanelDirGroups(); + + /*virtual*/ bool postBuild(); + + /*virtual*/ void performQuery(); + + static void onClickSearch(void *userdata); +}; + +#endif diff --git a/indra/newview/llpaneldirland.cpp b/indra/newview/llpaneldirland.cpp new file mode 100644 index 0000000000..f85a8b948e --- /dev/null +++ b/indra/newview/llpaneldirland.cpp @@ -0,0 +1,233 @@ +/** + * @file llpaneldirland.cpp + * @brief Land panel in the legacy Search directory. + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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 "llpaneldirland.h" + +#include "llagent.h" +#include "llcheckboxctrl.h" +#include "llcombobox.h" +#include "lllineeditor.h" +#include "llnotificationsutil.h" +#include "llqueryflags.h" +#include "llscrolllistctrl.h" +#include "llstatusbar.h" +#include "lltextbox.h" +#include "llviewercontrol.h" +#include "llviewermessage.h" + +//----------------------------------------------------------------------------- +// Constants +//----------------------------------------------------------------------------- + +static const char FIND_ALL[] = "All Types"; +static const char FIND_AUCTION[] = "Auction"; +static const char FIND_MAINLANDSALES[] = "Mainland Sales"; +static const char FIND_ESTATESALES[] = "Estate Sales"; + +static LLPanelInjector<LLPanelDirLand> t_panel_dir_land("panel_dir_land"); + +LLPanelDirLand::LLPanelDirLand() + : LLPanelDirBrowser() +{ +} + +bool LLPanelDirLand::postBuild() +{ + LLPanelDirBrowser::postBuild(); + + childSetValue("type", gSavedSettings.getString("FindLandType")); + + childSetCommitCallback("pricecheck", onCommitPrice, this); + childSetCommitCallback("areacheck", onCommitArea, this); + + if (gStatusBar) + { + childSetValue("priceedit", gStatusBar->getBalance()); + } + childSetEnabled("priceedit", gSavedSettings.getBOOL("FindLandPrice")); + LLLineEditor* priceedit = getChild<LLLineEditor>("priceedit"); + priceedit->setPrevalidateInput(LLTextValidate::validateNonNegativeS32); + + childSetEnabled("areaedit", gSavedSettings.getBOOL("FindLandArea")); + LLLineEditor* areaedit = getChild<LLLineEditor>("areaedit"); + areaedit->setPrevalidateInput(LLTextValidate::validateNonNegativeS32); + + childSetAction("Search", onClickSearchCore, this); + setDefaultBtn("Search"); + + mCurrentSortColumn = "per_meter"; + + LLScrollListCtrl* results = getChild<LLScrollListCtrl>("results"); + if (results) + { + results->setSortChangedCallback(boost::bind(&LLPanelDirLand::onClickSort, this)); + results->sortByColumn(mCurrentSortColumn,mCurrentSortAscending); + } + + return true; +} + +LLPanelDirLand::~LLPanelDirLand() +{ + // Children all cleaned up by default view destructor. +} + +void LLPanelDirLand::onClickSort() +{ + performQuery(); +} + +// static +void LLPanelDirLand::onCommitPrice(LLUICtrl* ctrl, void* data) +{ + LLPanelDirLand* self = (LLPanelDirLand*)data; + LLCheckBoxCtrl* check = (LLCheckBoxCtrl*)ctrl; + + if (!self || !check) return; + self->childSetEnabled("priceedit", check->get()); +} + +// static +void LLPanelDirLand::onCommitArea(LLUICtrl* ctrl, void* data) +{ + LLPanelDirLand* self = (LLPanelDirLand*)data; + LLCheckBoxCtrl* check = (LLCheckBoxCtrl*)ctrl; + + if (!self || !check) return; + self->childSetEnabled("areaedit", check->get()); +} + +void LLPanelDirLand::performQuery() +{ + static LLUICachedControl<bool> inc_pg("ShowPGLand", true); + static LLUICachedControl<bool> inc_mature("ShowMatureLand", false); + static LLUICachedControl<bool> inc_adult("ShowAdultLand", false); + if (!(inc_pg || inc_mature || inc_adult)) + { + LLNotificationsUtil::add("NoContentToSearch"); + return; + } + + LLMessageSystem* msg = gMessageSystem; + + setupNewSearch(); + + // We could change the UI to allow arbitrary combinations of these options + U32 search_type = ST_ALL; + const std::string& type = childGetValue("type").asString(); + if(!type.empty()) + { + if (FIND_AUCTION == type) search_type = ST_AUCTION; + else if(FIND_MAINLANDSALES == type) search_type = ST_MAINLAND; + else if(FIND_ESTATESALES == type) search_type = ST_ESTATE; + } + + U32 query_flags = 0x0; + if (gAgent.wantsPGOnly()) query_flags |= DFQ_PG_SIMS_ONLY; + + bool adult_enabled = gAgent.canAccessAdult(); + bool mature_enabled = gAgent.canAccessMature(); + + if (inc_pg) + { + query_flags |= DFQ_INC_PG; + } + + if (inc_mature && mature_enabled) + { + query_flags |= DFQ_INC_MATURE; + } + + if (inc_adult && adult_enabled) + { + query_flags |= DFQ_INC_ADULT; + } + + // Add old flags in case we are talking to an old dataserver + if (inc_pg && !inc_mature) + { + query_flags |= DFQ_PG_SIMS_ONLY; + } + + if (!inc_pg && inc_mature) + { + query_flags |= DFQ_MATURE_SIMS_ONLY; + } + + LLScrollListCtrl* list = getChild<LLScrollListCtrl>("results"); + if (list) + { + std::string sort_name = list->getSortColumnName(); + BOOL sort_asc = list->getSortAscending(); + + if (sort_name == "name") + { + query_flags |= DFQ_NAME_SORT; + } + else if (sort_name == "price") + { + query_flags |= DFQ_PRICE_SORT; + } + else if (sort_name == "per_meter") + { + query_flags |= DFQ_PER_METER_SORT; + } + else if (sort_name == "area") + { + query_flags |= DFQ_AREA_SORT; + } + + if (sort_asc) + { + query_flags |= DFQ_SORT_ASC; + } + } + + if (childGetValue("pricecheck").asBoolean()) + { + query_flags |= DFQ_LIMIT_BY_PRICE; + } + + if (childGetValue("areacheck").asBoolean()) + { + query_flags |= DFQ_LIMIT_BY_AREA; + } + + msg->newMessage("DirLandQuery"); + msg->nextBlock("AgentData"); + msg->addUUID("AgentID", gAgent.getID()); + msg->addUUID("SessionID", gAgent.getSessionID()); + msg->nextBlock("QueryData"); + msg->addUUID("QueryID", getSearchID()); + msg->addU32("QueryFlags", query_flags); + msg->addU32("SearchType", search_type); + msg->addS32("Price", childGetValue("priceedit").asInteger()); + msg->addS32("Area", childGetValue("areaedit").asInteger()); + msg->addS32Fast(_PREHASH_QueryStart,mSearchStart); + gAgent.sendReliableMessage(); +} diff --git a/indra/newview/llpaneldirland.h b/indra/newview/llpaneldirland.h new file mode 100644 index 0000000000..197c4cdc3d --- /dev/null +++ b/indra/newview/llpaneldirland.h @@ -0,0 +1,53 @@ +/** + * @file llpaneldirland.h + * @brief Land panel in the legacy Search directory. + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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_LLPANELDIRLAND_H +#define LL_LLPANELDIRLAND_H + +#include "llpaneldirbrowser.h" + +class LLUICtrl; +class LLPanelDirBrowser; + +class LLPanelDirLand : public LLPanelDirBrowser +{ +public: + LLPanelDirLand(); + /*virtual*/ ~LLPanelDirLand(); + + bool postBuild(); + + void performQuery(); + +protected: + void onClickSort(); + static void onCommitPrice(LLUICtrl* ctrl, void* data); + static void onCommitArea(LLUICtrl* ctrl, void* data); + +}; + + +#endif diff --git a/indra/newview/llpaneldirpeople.cpp b/indra/newview/llpaneldirpeople.cpp new file mode 100644 index 0000000000..6a55e3bc7c --- /dev/null +++ b/indra/newview/llpaneldirpeople.cpp @@ -0,0 +1,105 @@ +/** + * @file llpaneldirpeople.cpp + * @brief People panel in the legacy Search directory. + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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 "llpaneldirpeople.h" +#include "llviewerwindow.h" +#include "llsearcheditor.h" + +// viewer project includes +#include "llqueryflags.h" +#include "llnotificationsutil.h" + +static LLPanelInjector<LLPanelDirPeople> t_panel_dir_people("panel_dir_people"); + +LLPanelDirPeople::LLPanelDirPeople() +: LLPanelDirBrowser() +{ + mMinSearchChars = 3; +} + +bool LLPanelDirPeople::postBuild() +{ + LLPanelDirBrowser::postBuild(); + + //getChild<LLLineEditor>("name")->setKeystrokeCallback(boost::bind(&LLPanelDirBrowser::onKeystrokeName, _1, _2), NULL); + + childSetAction("Search", &LLPanelDirBrowser::onClickSearchCore, this); + setDefaultBtn( "Search" ); + + return true; +} + +LLPanelDirPeople::~LLPanelDirPeople() +{ +} + +// virtual +void LLPanelDirPeople::performQuery() +{ + if (childGetValue("name").asString().length() < mMinSearchChars) + { + return; + } + + // filter short words out of the query string + // and indidate if we did have to filter it + // The shortest username is 2 characters long. + const S32 SHORTEST_WORD_LEN = 2; + bool query_was_filtered = false; + std::string query_string = LLPanelDirBrowser::filterShortWords( + childGetValue("name").asString(), + SHORTEST_WORD_LEN, + query_was_filtered ); + + // possible we threw away all the short words in the query so check length + if ( query_string.length() < mMinSearchChars ) + { + LLNotificationsUtil::add("SeachFilteredOnShortWordsEmpty"); + return; + }; + + // if we filtered something out, display a popup + if ( query_was_filtered ) + { + LLSD args; + args["FINALQUERY"] = query_string; + LLNotificationsUtil::add("SeachFilteredOnShortWords", args); + }; + + setupNewSearch(); + + U32 scope = DFQ_PEOPLE; + + // send the message + sendDirFindQuery( + gMessageSystem, + mSearchID, + query_string, + scope, + mSearchStart); +} diff --git a/indra/newview/llpaneldirpeople.h b/indra/newview/llpaneldirpeople.h new file mode 100644 index 0000000000..a8a7d17cb2 --- /dev/null +++ b/indra/newview/llpaneldirpeople.h @@ -0,0 +1,48 @@ +/** + * @file llpaneldirpeople.h + * @brief People panel in the legacy Search directory. + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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_LLPANELDIRPEOPLE_H +#define LL_LLPANELDIRPEOPLE_H + +#include "llpaneldirbrowser.h" +class LLLineEditor; +class LLFloaterDirectory; + +class LLPanelDirPeople : public LLPanelDirBrowser +{ +public: + LLPanelDirPeople(); + virtual ~LLPanelDirPeople(); + + /*virtual*/ bool postBuild(); + + /*virtual*/ void performQuery(); + + static void onClickSearch(void *userdata); + static void onKeystrokeName(LLLineEditor* line, void* data); +}; + +#endif diff --git a/indra/newview/llpaneldirplaces.cpp b/indra/newview/llpaneldirplaces.cpp new file mode 100644 index 0000000000..3501baf697 --- /dev/null +++ b/indra/newview/llpaneldirplaces.cpp @@ -0,0 +1,184 @@ +/** + * @file llpaneldirplaces.cpp + * @brief Places panel in the legacy Search directory. + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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 "llpaneldirplaces.h" + +#include "message.h" +#include "llparcel.h" +#include "llregionflags.h" +#include "llqueryflags.h" + +#include "llagent.h" +#include "llbutton.h" +#include "llcheckboxctrl.h" +#include "llcombobox.h" +#include "llfloaterdirectory.h" +#include "lllineeditor.h" +#include "llnotificationsutil.h" +#include "llpaneldirbrowser.h" +#include "llsearcheditor.h" +#include "lltextbox.h" +#include "llviewercontrol.h" + +static LLPanelInjector<LLPanelDirPlaces> t_panel_dir_people("panel_dir_places"); + +LLPanelDirPlaces::LLPanelDirPlaces() + : LLPanelDirBrowser() +{ + mMinSearchChars = 3; +} + +bool LLPanelDirPlaces::postBuild() +{ + LLPanelDirBrowser::postBuild(); + + //getChild<LLLineEditor>("name")->setKeystrokeCallback(boost::bind(&LLPanelDirBrowser::onKeystrokeName, _1, _2), NULL); + + childSetAction("Search", &LLPanelDirBrowser::onClickSearchCore, this); + setDefaultBtn("Search"); + + mCurrentSortColumn = "dwell"; + mCurrentSortAscending = false; + + return true; +} + +LLPanelDirPlaces::~LLPanelDirPlaces() +{ +} + +// virtual +void LLPanelDirPlaces::performQuery() +{ + std::string place_name = childGetValue("name").asString(); + if (place_name.length() < mMinSearchChars) + { + return; + } + + // "hi " is three chars but not a long-enough search + std::string query_string = place_name; + LLStringUtil::trim( query_string ); + bool query_was_filtered = (query_string != place_name); + + // possible we threw away all the short words in the query so check length + if ( query_string.length() < mMinSearchChars ) + { + LLNotificationsUtil::add("SeachFilteredOnShortWordsEmpty"); + return; + }; + + // if we filtered something out, display a popup + if ( query_was_filtered ) + { + LLSD args; + args["FINALQUERY"] = query_string; + LLNotificationsUtil::add("SeachFilteredOnShortWords", args); + }; + + std::string catstring = childGetValue("Category").asString(); + + // Because LLParcel::C_ANY is -1, must do special check + S32 category = 0; + if (catstring == "any") + { + category = LLParcel::C_ANY; + } + else + { + category = LLParcel::getCategoryFromString(catstring); + } + + U32 flags = 0x0; + bool adult_enabled = gAgent.canAccessAdult(); + bool mature_enabled = gAgent.canAccessMature(); + + static LLUICachedControl<bool> inc_pg("ShowPGSims", true); + static LLUICachedControl<bool> inc_mature("ShowMatureSims", false); + static LLUICachedControl<bool> inc_adult("ShowAdultSims", false); + if (!(inc_pg || inc_mature || inc_adult)) + { + LLNotificationsUtil::add("NoContentToSearch"); + return; + } + + if (inc_pg) + { + flags |= DFQ_INC_PG; + } + + if (inc_mature && mature_enabled) + { + flags |= DFQ_INC_MATURE; + } + + if (inc_adult && adult_enabled) + { + flags |= DFQ_INC_ADULT; + } + + queryCore(query_string, category, flags); +} + +void LLPanelDirPlaces::initialQuery() +{ + // All Linden locations in PG/Mature sims, any name. + U32 flags = DFQ_INC_PG | DFQ_INC_MATURE; + queryCore(LLStringUtil::null, LLParcel::C_LINDEN, flags); +} + +void LLPanelDirPlaces::queryCore(const std::string& name, S32 category, U32 flags) +{ + setupNewSearch(); + +// JC: Sorting by dwell severely impacts the performance of the query. +// Instead of sorting on the dataserver, we sort locally once the results +// are received. +// IW: Re-enabled dwell sort based on new 3-character minimum description +// Hopefully we'll move to next-gen Find before this becomes a big problem + + flags |= DFQ_DWELL_SORT; + + LLMessageSystem* msg = gMessageSystem; + + msg->newMessage("DirPlacesQuery"); + msg->nextBlock("AgentData"); + msg->addUUID("AgentID", gAgent.getID()); + msg->addUUID("SessionID", gAgent.getSessionID()); + msg->nextBlock("QueryData"); + msg->addUUID("QueryID", getSearchID()); + msg->addString("QueryText", name); + msg->addU32("QueryFlags", flags); + msg->addS8("Category", (S8)category); + // No longer support queries by region name, too many regions + // for combobox, no easy way to do autocomplete. JC + msg->addString("SimName", ""); + msg->addS32Fast(_PREHASH_QueryStart,mSearchStart); + gAgent.sendReliableMessage(); +} + diff --git a/indra/newview/llpaneldirplaces.h b/indra/newview/llpaneldirplaces.h new file mode 100644 index 0000000000..069414ebf5 --- /dev/null +++ b/indra/newview/llpaneldirplaces.h @@ -0,0 +1,51 @@ +/** + * @file llpaneldirplaces.h + * @brief Places panel in the legacy Search directory. + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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_LLPANELDIRPLACES_H +#define LL_LLPANELDIRPLACES_H + +#include "llpaneldirbrowser.h" + +class LLLineEditor; + +class LLPanelDirPlaces : public LLPanelDirBrowser +{ +public: + LLPanelDirPlaces(); + virtual ~LLPanelDirPlaces(); + + bool postBuild() override; + + void performQuery() override; + + // Initially fill in some data for the panel. + void initialQuery(); + +private: + void queryCore(const std::string& name, S32 category, U32 flags); +}; + +#endif diff --git a/indra/newview/llpaneldirweb.cpp b/indra/newview/llpaneldirweb.cpp new file mode 100644 index 0000000000..9e76bb81a6 --- /dev/null +++ b/indra/newview/llpaneldirweb.cpp @@ -0,0 +1,148 @@ +/** + * @file llpaneldirweb.cpp + * @brief Web panel in the legacy Search directory. + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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 "llpaneldirweb.h" + +#include "llagent.h" +#include "llbutton.h" +#include "llfloaterdirectory.h" +#include "lltextbox.h" +#include "llviewercontrol.h" +#include "llweb.h" + +static LLPanelInjector<LLPanelDirWeb> t_panel_dir_web("panel_dir_web"); + +LLPanelDirWeb::LLPanelDirWeb() +: LLPanel(), + mFloaterDirectory(nullptr), + mWebBrowser(nullptr) +{ +} + +bool LLPanelDirWeb::postBuild() +{ + childSetAction("home_btn", onClickHome, this); + + mBtnBack = getChild<LLButton>("back_btn"); + mBtnForward = getChild<LLButton>("forward_btn"); + mStatusBarText = getChild<LLTextBox>("statusbartext"); + + mBtnBack->setClickedCallback([this](LLUICtrl*, const LLSD&) { mWebBrowser->navigateBack(); }); + mBtnForward->setClickedCallback([this](LLUICtrl*, const LLSD&) { mWebBrowser->navigateForward(); }); + + mWebBrowser = findChild<LLMediaCtrl>("web_search"); + navigateToDefaultPage(); + mWebBrowser->addObserver(this); + + return true; +} + +void LLPanelDirWeb::draw() +{ + // Asynchronous so we need to keep checking + mBtnBack->setEnabled(mWebBrowser->canNavigateBack()); + mBtnForward->setEnabled(mWebBrowser->canNavigateForward()); + + LLPanel::draw(); +} + +LLPanelDirWeb::~LLPanelDirWeb() +{ +} + +// When we show any browser-based view, we want to hide all +// the right-side XUI detail panels. +// virtual +void LLPanelDirWeb::onVisibilityChange(bool new_visibility) +{ + if (new_visibility && mFloaterDirectory) + { + mFloaterDirectory->hideAllDetailPanels(); + } + LLPanel::onVisibilityChange(new_visibility); +} + +void LLPanelDirWeb::navigateToDefaultPage() +{ + std::string url = gSavedSettings.getString("SearchURL"); + + LLSD subs; + subs["QUERY"] = ""; + subs["TYPE"] = "standard"; + // Default to PG + std::string maturity = "g"; + if (gAgent.prefersAdult()) + { + // PG,Mature,Adult + maturity = "gma"; + } + else if (gAgent.prefersMature()) + { + // PG,Mature + maturity = "gm"; + } + subs["MATURITY"] = maturity; + url = LLWeb::expandURLSubstitutions(url, subs); + mWebBrowser->navigateTo(url, HTTP_CONTENT_TEXT_HTML); +} + +// static +void LLPanelDirWeb::onClickHome( void* data ) +{ + LLPanelDirWeb* self = (LLPanelDirWeb*)data; + if (!self) + return; + self->navigateToDefaultPage(); +} + +void LLPanelDirWeb::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) +{ + if (event == MEDIA_EVENT_LOCATION_CHANGED) + { + const std::string url = self->getLocation(); + if (url.length()) + mStatusBarText->setText(url); + } + else if (event == MEDIA_EVENT_NAVIGATE_COMPLETE) + { + // we populate the status bar with URLs as they change so clear it now we're done + const std::string end_str = ""; + mStatusBarText->setText(end_str); + } + else if (event == MEDIA_EVENT_STATUS_TEXT_CHANGED) + { + const std::string text = self->getStatusText(); + if (text.length()) + mStatusBarText->setText(text); + } + else if (event == MEDIA_EVENT_LINK_HOVERED) + { + const std::string link = self->getHoverLink(); + mStatusBarText->setText(link); + } +} diff --git a/indra/newview/llpaneldirweb.h b/indra/newview/llpaneldirweb.h new file mode 100644 index 0000000000..db7bdc4a6a --- /dev/null +++ b/indra/newview/llpaneldirweb.h @@ -0,0 +1,63 @@ +/** + * @file llpaneldirweb.h + * @brief Web panel in the legacy Search directory. + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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_LLPANELDIRWEB_H +#define LL_LLPANELDIRWEB_H + +#include "llpanel.h" +#include "llmediactrl.h" + +class LLTextBox; +class LLFloaterDirectory; +class LLWebBrowserCtrlObserver; + +class LLPanelDirWeb : public LLPanel, public LLViewerMediaObserver +{ +public: + LLPanelDirWeb(); + ~LLPanelDirWeb(); + + bool postBuild() override; + void onVisibilityChange(bool new_visibility) override; + void draw() override; + + void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) override; + + void navigateToDefaultPage(); + + void setFloaterDirectory(LLFloaterDirectory* floater) { mFloaterDirectory = floater; } + +protected: + static void onClickHome( void* data ); + + LLButton* mBtnBack; + LLButton* mBtnForward; + LLTextBox* mStatusBarText; + LLFloaterDirectory* mFloaterDirectory; + LLMediaCtrl* mWebBrowser; +}; + +#endif diff --git a/indra/newview/llpaneleditsky.cpp b/indra/newview/llpaneleditsky.cpp index 3d376251ff..578206a768 100644 --- a/indra/newview/llpaneleditsky.cpp +++ b/indra/newview/llpaneleditsky.cpp @@ -35,7 +35,6 @@ #include "llvirtualtrackball.h" #include "llsettingssky.h" #include "llenvironment.h" -#include "llatmosphere.h" #include "llviewercontrol.h" namespace @@ -926,13 +925,6 @@ void LLPanelSettingsSkyDensityTab::updateProfile() mSkySettings->setAbsorptionConfigs(absorption_config); mSkySettings->update(); setIsDirty(); - - if (gAtmosphere) - { - AtmosphericModelSettings atmospheric_settings; - LLEnvironment::getAtmosphericModelSettings(atmospheric_settings, mSkySettings); - gAtmosphere->configureAtmosphericModel(atmospheric_settings); - } } void LLPanelSettingsSkyDensityTab::onRayleighExponentialChanged() diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index 282b6d4a0a..8bcb6e9ec3 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -438,7 +438,7 @@ template <typename T> const LLEditWearableDictionary::PickerControlEntry* get_picker_entry (const ETextureIndex index) { return NULL; } -typedef boost::function<void(LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry*)> function_t; +typedef std::function<void(LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry*)> function_t; typedef struct PickerControlEntryNamePredicate { diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp index 4f1fd5dfca..f0555408dd 100644 --- a/indra/newview/llpanelemojicomplete.cpp +++ b/indra/newview/llpanelemojicomplete.cpp @@ -68,9 +68,9 @@ LLPanelEmojiComplete::LLPanelEmojiComplete(const LLPanelEmojiComplete::Params& p { LLScrollbar::Params sbparams; sbparams.orientation(LLScrollbar::VERTICAL); - sbparams.doc_size(mTotalEmojis); + sbparams.doc_size(static_cast<S32>(mTotalEmojis)); sbparams.doc_pos(0); - sbparams.page_size(mVisibleEmojis); + sbparams.page_size(static_cast<S32>(mVisibleEmojis)); sbparams.change_callback([this](S32 index, LLScrollbar*) { onScrollbarChange(index); }); mScrollbar = LLUICtrlFactory::create<LLScrollbar>(sbparams); addChild(mScrollbar); @@ -463,6 +463,7 @@ void LLPanelEmojiComplete::updateConstraints() { mEmojiHeight = mRenderRect.getHeight(); mRenderRect.stretch((mRenderRect.getWidth() - static_cast<S32>(mVisibleEmojis) * mEmojiWidth) / -2, 0); + mRenderRect.translate(-mRenderRect.mLeft, 0); // Left align emojis to fix hitboxes } updateScrollPos(); diff --git a/indra/newview/llpaneleventinfo.cpp b/indra/newview/llpaneleventinfo.cpp new file mode 100644 index 0000000000..43b20b3851 --- /dev/null +++ b/indra/newview/llpaneleventinfo.cpp @@ -0,0 +1,195 @@ +/** + * @file llpaneleventinfo.cpp + * @brief Info panel for events in the legacy Search + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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 "llpaneleventinfo.h" + +#include "llagent.h" +#include "llbutton.h" +#include "lleventflags.h" +#include "llfloaterreg.h" +#include "llfloaterworldmap.h" +#include "lltextbox.h" +#include "llviewertexteditor.h" +#include "llworldmap.h" + +static LLPanelInjector<LLPanelEventInfo> t_panel_event_info("panel_event_info"); + +LLPanelEventInfo::LLPanelEventInfo() + : LLPanel() +{ +} + +LLPanelEventInfo::~LLPanelEventInfo() +{ + if (mEventInfoConnection.connected()) + { + mEventInfoConnection.disconnect(); + } +} + +bool LLPanelEventInfo::postBuild() +{ + mTBName = getChild<LLTextBox>("event_name"); + + mTBCategory = getChild<LLTextBox>("event_category"); + mTBDate = getChild<LLTextBox>("event_date"); + mTBDuration = getChild<LLTextBox>("event_duration"); + mTBDesc = getChild<LLTextEditor>("event_desc"); + mTBDesc->setWordWrap(true); + + mTBRunBy = getChild<LLTextBox>("event_runby"); + mTBLocation = getChild<LLTextBox>("event_location"); + mTBCover = getChild<LLTextBox>("event_cover"); + + mTeleportBtn = getChild<LLButton>( "teleport_btn"); + mTeleportBtn->setClickedCallback(boost::bind(&LLPanelEventInfo::onClickTeleport, this)); + + mMapBtn = getChild<LLButton>( "map_btn"); + mMapBtn->setClickedCallback(boost::bind(&LLPanelEventInfo::onClickMap, this)); + + mNotifyBtn = getChild<LLButton>( "notify_btn"); + mNotifyBtn->setClickedCallback(boost::bind(&LLPanelEventInfo::onClickNotify, this)); + + mEventInfoConnection = gEventNotifier.setEventInfoCallback(boost::bind(&LLPanelEventInfo::processEventInfoReply, this, _1)); + + return true; +} + +void LLPanelEventInfo::setEventID(const U32 event_id) +{ + mEventID = event_id; + + if (event_id != 0) + { + sendEventInfoRequest(); + } +} + +void LLPanelEventInfo::sendEventInfoRequest() +{ + LLMessageSystem *msg = gMessageSystem; + + msg->newMessageFast(_PREHASH_EventInfoRequest); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); + msg->nextBlockFast(_PREHASH_EventData); + msg->addU32Fast(_PREHASH_EventID, mEventID); + gAgent.sendReliableMessage(); +} + +bool LLPanelEventInfo::processEventInfoReply(LLEventInfo event) +{ + if (event.mID != getEventID()) + return false; + + mTBName->setText(event.mName); + mTBName->setToolTip(event.mName); + mTBCategory->setText(event.mCategoryStr); + mTBDate->setText(event.mTimeStr); + mTBDesc->setText(event.mDesc); + mTBRunBy->setText(LLSLURL("agent", event.mRunByID, "inspect").getSLURLString()); + + mTBDuration->setText(llformat("%d:%.2d", event.mDuration / 60, event.mDuration % 60)); + + if (!event.mHasCover) + { + mTBCover->setText(getString("none")); + } + else + { + mTBCover->setText(llformat("%d", event.mCover)); + } + + mTBLocation->setText(LLSLURL(event.mSimName, event.mPosGlobal).getSLURLString()); + + if (event.mEventFlags & EVENT_FLAG_MATURE) + { + childSetVisible("event_mature_yes", true); + childSetVisible("event_mature_no", false); + } + else + { + childSetVisible("event_mature_yes", false); + childSetVisible("event_mature_no", true); + } + + if (event.mUnixTime < time_corrected()) + { + mNotifyBtn->setEnabled(false); + } + else + { + mNotifyBtn->setEnabled(true); + } + + if (gEventNotifier.hasNotification(event.mID)) + { + mNotifyBtn->setLabel(getString("dont_notify")); + } + else + { + mNotifyBtn->setLabel(getString("notify")); + } + mEventInfo = event; + return true; +} + +void LLPanelEventInfo::onClickTeleport() +{ + LLFloaterWorldMap* world_map = LLFloaterWorldMap::getInstance(); + if (world_map) + { + world_map->trackLocation(mEventInfo.mPosGlobal); + gAgent.teleportViaLocation(mEventInfo.mPosGlobal); + } +} + +void LLPanelEventInfo::onClickMap() +{ + LLFloaterWorldMap* world_map = LLFloaterWorldMap::getInstance(); + if (world_map) + { + world_map->trackLocation(mEventInfo.mPosGlobal); + LLFloaterReg::showInstance("world_map", "center"); + } +} + +void LLPanelEventInfo::onClickNotify() +{ + if (!gEventNotifier.hasNotification(mEventID)) + { + gEventNotifier.add(mEventInfo.mID, mEventInfo.mUnixTime, mEventInfo.mTimeStr, mEventInfo.mName); + mNotifyBtn->setLabel(getString("dont_notify")); + } + else + { + gEventNotifier.remove(mEventInfo.mID); + mNotifyBtn->setLabel(getString("notify")); + } +} diff --git a/indra/newview/llpaneleventinfo.h b/indra/newview/llpaneleventinfo.h new file mode 100644 index 0000000000..4f0e547493 --- /dev/null +++ b/indra/newview/llpaneleventinfo.h @@ -0,0 +1,76 @@ +/** + * @file llpaneleventinfo.h + * @brief Info panel for events in the legacy Search + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, 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_LLPANELEVENTINFO_H +#define LL_LLPANELEVENTINFO_H + +#include "lleventnotifier.h" + +class LLTextBox; +class LLTextEditor; +class LLButton; + +class LLPanelEventInfo : public LLPanel +{ +public: + LLPanelEventInfo(); + /*virtual*/ ~LLPanelEventInfo(); + + /*virtual*/ bool postBuild() override; + + void setEventID(const U32 event_id); + void sendEventInfoRequest(); + + bool processEventInfoReply(LLEventInfo event); + + U32 getEventID() { return mEventID; } + +protected: + void onClickTeleport(); + void onClickMap(); + void onClickNotify(); + +protected: + LLTextBox* mTBName; + LLTextBox* mTBCategory; + LLTextBox* mTBDate; + LLTextBox* mTBDuration; + LLTextEditor* mTBDesc; + + LLTextBox* mTBRunBy; + LLTextBox* mTBLocation; + LLTextBox* mTBCover; + + LLButton* mTeleportBtn; + LLButton* mMapBtn; + LLButton* mNotifyBtn; + + U32 mEventID; + LLEventInfo mEventInfo; + boost::signals2::connection mEventInfoConnection; +}; + +#endif // LL_LLPANELEVENTINFO_H diff --git a/indra/newview/llpanelexperiencelisteditor.h b/indra/newview/llpanelexperiencelisteditor.h index 7ff1ddac5a..70bc2ecd3c 100644 --- a/indra/newview/llpanelexperiencelisteditor.h +++ b/indra/newview/llpanelexperiencelisteditor.h @@ -42,7 +42,7 @@ public: typedef boost::signals2::signal<void (const LLUUID&) > list_changed_signal_t; // filter function for experiences, return true if the experience should be hidden. - typedef boost::function<bool (const LLSD&)> experience_function; + typedef std::function<bool(const LLSD&)> experience_function; typedef std::vector<experience_function> filter_list; typedef LLHandle<LLFloaterExperiencePicker> PickerHandle; LLPanelExperienceListEditor(); diff --git a/indra/newview/llpanelexperiencepicker.h b/indra/newview/llpanelexperiencepicker.h index 72c0b1b74d..5cde0a03fb 100644 --- a/indra/newview/llpanelexperiencepicker.h +++ b/indra/newview/llpanelexperiencepicker.h @@ -39,9 +39,9 @@ public: friend class LLExperienceSearchResponder; friend class LLFloaterExperiencePicker; - typedef boost::function<void (const uuid_vec_t&)> select_callback_t; + typedef std::function<void(const uuid_vec_t&)> select_callback_t; // filter function for experiences, return true if the experience should be hidden. - typedef boost::function<bool (const LLSD&)> filter_function; + typedef std::function<bool(const LLSD&)> filter_function; typedef std::vector<filter_function> filter_list; LLPanelExperiencePicker(); diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 74fb2f0f93..6c0ff4a929 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -162,6 +162,36 @@ void LLPanelFace::updateSelectedGLTFMaterials(std::function<void(LLGLTFMaterial* LLSelectMgr::getInstance()->getSelection()->applyToTEs(&select_func); } +void LLPanelFace::updateSelectedGLTFMaterialsWithScale(std::function<void(LLGLTFMaterial*, const F32, const F32)> func) +{ + struct LLSelectedTEGLTFMaterialFunctor : public LLSelectedTEFunctor + { + LLSelectedTEGLTFMaterialFunctor(std::function<void(LLGLTFMaterial*, const F32, const F32)> func) : mFunc(func) {} + virtual ~LLSelectedTEGLTFMaterialFunctor() {}; + bool apply(LLViewerObject* object, S32 face) override + { + LLGLTFMaterial new_override; + const LLTextureEntry* tep = object->getTE(face); + if (tep->getGLTFMaterialOverride()) + { + new_override = *tep->getGLTFMaterialOverride(); + } + + U32 s_axis = VX; + U32 t_axis = VY; + LLPrimitive::getTESTAxes(face, &s_axis, &t_axis); + mFunc(&new_override, object->getScale().mV[s_axis], object->getScale().mV[t_axis]); + LLGLTFMaterialList::queueModify(object, face, &new_override); + + return true; + } + + std::function<void(LLGLTFMaterial*, const F32, const F32)> mFunc; + } select_func(func); + + LLSelectMgr::getInstance()->getSelection()->applyToTEs(&select_func); +} + template<typename T> void readSelectedGLTFMaterial(std::function<T(const LLGLTFMaterial*)> func, T& value, bool& identical, bool has_tolerance, T tolerance) { @@ -182,6 +212,36 @@ void readSelectedGLTFMaterial(std::function<T(const LLGLTFMaterial*)> func, T& v identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&select_func, value, has_tolerance, tolerance); } +void getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo channel, F32& repeats, bool& identical) +{ + // The All channel should read base color values + if (channel == LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_COUNT) + channel = LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_BASE_COLOR; + + struct LLSelectedTEGetGLTFMaterialMaxRepeatsFunctor : public LLSelectedTEGetFunctor<F32> + { + LLSelectedTEGetGLTFMaterialMaxRepeatsFunctor(LLGLTFMaterial::TextureInfo channel) : mChannel(channel) {} + virtual ~LLSelectedTEGetGLTFMaterialMaxRepeatsFunctor() {}; + F32 get(LLViewerObject* object, S32 face) override + { + const LLTextureEntry* tep = object->getTE(face); + const LLGLTFMaterial* render_material = tep->getGLTFRenderMaterial(); + if (!render_material) + return 0.f; + + U32 s_axis = VX; + U32 t_axis = VY; + LLPrimitive::getTESTAxes(face, &s_axis, &t_axis); + F32 repeats_u = render_material->mTextureTransform[mChannel].mScale[VX] / object->getScale().mV[s_axis]; + F32 repeats_v = render_material->mTextureTransform[mChannel].mScale[VY] / object->getScale().mV[t_axis]; + return llmax(repeats_u, repeats_v); + } + + LLGLTFMaterial::TextureInfo mChannel; + } max_repeats_func(channel); + identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&max_repeats_func, repeats); +} + BOOST_STATIC_ASSERT(MATTYPE_DIFFUSE == LLRender::DIFFUSE_MAP && MATTYPE_NORMAL == LLRender::NORMAL_MAP && MATTYPE_SPECULAR == LLRender::SPECULAR_MAP); // @@ -216,7 +276,7 @@ LLRender::eTexIndex LLPanelFace::getMatTextureChannel() return LLRender::NORMAL_MAP; break; case MATTYPE_SPECULAR: // "Shininess (specular)" - if (getCurrentNormalMap().notNull()) + if (getCurrentSpecularMap().notNull()) return LLRender::SPECULAR_MAP; break; } @@ -322,6 +382,7 @@ bool LLPanelFace::postBuild() getChildSetCommitCallback(mPBRScaleU, "gltfTextureScaleU", [&](LLUICtrl*, const LLSD&) { onCommitGLTFTextureScaleU(); }); getChildSetCommitCallback(mPBRScaleV, "gltfTextureScaleV", [&](LLUICtrl*, const LLSD&) { onCommitGLTFTextureScaleV(); }); + getChildSetCommitCallback(mPBRRepeat, "gltfRptctrl", [&](LLUICtrl*, const LLSD&) { onCommitGLTFRepeatsPerMeter(); }); getChildSetCommitCallback(mPBRRotate, "gltfTextureRotation", [&](LLUICtrl*, const LLSD&) { onCommitGLTFRotation(); }); getChildSetCommitCallback(mPBROffsetU, "gltfTextureOffsetU", [&](LLUICtrl*, const LLSD&) { onCommitGLTFTextureOffsetU(); }); getChildSetCommitCallback(mPBROffsetV, "gltfTextureOffsetV", [&](LLUICtrl*, const LLSD&) { onCommitGLTFTextureOffsetV(); }); @@ -420,6 +481,7 @@ bool LLPanelFace::postBuild() mCtrlColorTransp->setFollowsLeft(); getChildSetCommitCallback(mCheckFullbright, "checkbox fullbright", [&](LLUICtrl*, const LLSD&) { onCommitFullbright(); }); + getChildSetCommitCallback(mCheckHideWater, "checkbox_hide_water", [&](LLUICtrl*, const LLSD&) { onCommitHideWater(); }); mLabelTexGen = getChild<LLTextBox>("tex gen"); getChildSetCommitCallback(mComboTexGen, "combobox texgen", [&](LLUICtrl*, const LLSD&) { onCommitTexGen(); }); @@ -481,10 +543,6 @@ LLPanelFace::~LLPanelFace() void LLPanelFace::onVisibilityChange(bool new_visibility) { - if (new_visibility) - { - gAgent.showLatestFeatureNotification("gltf"); - } LLPanel::onVisibilityChange(new_visibility); } @@ -1024,6 +1082,13 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) LLSelectedTEMaterial::getNormalID(normmap_id, identical_norm); LLSelectedTEMaterial::getSpecularID(specmap_id, identical_spec); + LLColor4 color = LLColor4::white; + bool identical_color = false; + + LLSelectedTE::getColor(color, identical_color); + F32 transparency = (1.f - color.mV[VALPHA]) * 100.f; + mExcludeWater = (id == IMG_ALPHA_GRAD) && normmap_id.isNull() && specmap_id.isNull() && (transparency == 0); + static S32 selected_te = -1; static LLUUID prev_obj_id; if ((LLToolFace::getInstance() == LLToolMgr::getInstance()->getCurrentTool()) && @@ -1098,12 +1163,85 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) updateVisibility(objectp); + bool missing_asset = false; + { + LLGLenum image_format = GL_RGB; + bool has_alpha = false; + bool identical_image_format = false; + LLSelectedTE::getImageFormat(image_format, has_alpha, identical_image_format, missing_asset); + + if (!missing_asset) + { + mIsAlpha = has_alpha; + switch (image_format) + { + case GL_RGBA: + case GL_ALPHA: + case GL_RGB: + break; + default: + { + LL_WARNS() << "Unexpected tex format in LLPanelFace..." << LL_ENDL; + } + break; + } + } + else + { + // Don't know image's properties, use material's mode value + mIsAlpha = true; + } + + // Diffuse Alpha Mode + // Init to the default that is appropriate for the alpha content of the asset + // + U8 alpha_mode = mIsAlpha ? LLMaterial::DIFFUSE_ALPHA_MODE_BLEND : LLMaterial::DIFFUSE_ALPHA_MODE_NONE; + + bool identical_alpha_mode = false; + + // See if that's been overridden by a material setting for same... + // + LLSelectedTEMaterial::getCurrentDiffuseAlphaMode(alpha_mode, identical_alpha_mode); + + // it is invalid to have any alpha mode other than blend if transparency is greater than zero ... + // Want masking? Want emissive? Tough! You get BLEND! + alpha_mode = (transparency > 0.f) ? LLMaterial::DIFFUSE_ALPHA_MODE_BLEND : alpha_mode; + + // ... unless there is no alpha channel in the texture, in which case alpha mode MUST be none + alpha_mode = mIsAlpha ? alpha_mode : LLMaterial::DIFFUSE_ALPHA_MODE_NONE; + + mComboAlphaMode->getSelectionInterface()->selectNthItem(alpha_mode); + mComboAlphaMode->setTentative(!identical_alpha_mode); + if (!identical_alpha_mode) + { + std::string multiple = LLTrans::getString("multiple_textures"); + mComboAlphaMode->setLabel(multiple); + } + updateAlphaControls(); + + mExcludeWater &= (LLMaterial::DIFFUSE_ALPHA_MODE_BLEND == alpha_mode); + } + + // Water exclusion + { + mCheckHideWater->setEnabled(editable && !has_pbr_material && !isMediaTexSelected()); + mCheckHideWater->set(mExcludeWater); + if (mExcludeWater && !has_pbr_material) + { + mComboMatMedia->selectNthItem(MATMEDIA_MATERIAL); + } + editable &= !mExcludeWater; + + // disable controls for water exclusion face after updateVisibility, so the whole panel is not hidden + mComboMatMedia->setEnabled(editable); + mRadioMaterialType->setEnabled(editable); + mRadioPbrType->setEnabled(editable); + mCheckSyncSettings->setEnabled(editable); + } + // Color swatch mLabelColor->setEnabled(editable); - LLColor4 color = LLColor4::white; - bool identical_color = false; - LLSelectedTE::getColor(color, identical_color); LLColor4 prev_color = mColorSwatch->get(); mColorSwatch->setOriginal(color); mColorSwatch->set(color, force_set_values || (prev_color != color) || !editable); @@ -1114,7 +1252,6 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) // Color transparency mLabelColorTransp->setEnabled(editable); - F32 transparency = (1.f - color.mV[VALPHA]) * 100.f; mCtrlColorTransp->setValue(editable ? transparency : 0); mCtrlColorTransp->setEnabled(editable && has_material); @@ -1167,65 +1304,11 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) // Texture { - LLGLenum image_format = GL_RGB; - bool identical_image_format = false; - bool missing_asset = false; - LLSelectedTE::getImageFormat(image_format, identical_image_format, missing_asset); - - if (!missing_asset) - { - mIsAlpha = false; - switch (image_format) - { - case GL_RGBA: - case GL_ALPHA: - { - mIsAlpha = true; - } - break; - - case GL_RGB: break; - default: - { - LL_WARNS() << "Unexpected tex format in LLPanelFace...resorting to no alpha" << LL_ENDL; - } - break; - } - } - else - { - // Don't know image's properties, use material's mode value - mIsAlpha = true; - } - if (LLViewerMedia::getInstance()->textureHasMedia(id)) { mBtnAlign->setEnabled(editable); } - // Diffuse Alpha Mode - - // Init to the default that is appropriate for the alpha content of the asset - // - U8 alpha_mode = mIsAlpha ? LLMaterial::DIFFUSE_ALPHA_MODE_BLEND : LLMaterial::DIFFUSE_ALPHA_MODE_NONE; - - bool identical_alpha_mode = false; - - // See if that's been overridden by a material setting for same... - // - LLSelectedTEMaterial::getCurrentDiffuseAlphaMode(alpha_mode, identical_alpha_mode, mIsAlpha); - - // it is invalid to have any alpha mode other than blend if transparency is greater than zero ... - // Want masking? Want emissive? Tough! You get BLEND! - alpha_mode = (transparency > 0.f) ? LLMaterial::DIFFUSE_ALPHA_MODE_BLEND : alpha_mode; - - // ... unless there is no alpha channel in the texture, in which case alpha mode MUST be none - alpha_mode = mIsAlpha ? alpha_mode : LLMaterial::DIFFUSE_ALPHA_MODE_NONE; - - mComboAlphaMode->getSelectionInterface()->selectNthItem(alpha_mode); - - updateAlphaControls(); - if (mTextureCtrl) { if (identical_diffuse) @@ -1374,9 +1457,18 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) spec_scale_s = editable ? spec_scale_s : 1.0f; spec_scale_s *= identical_planar_texgen ? 2.0f : 1.0f; - mTexScaleU->setValue(diff_scale_s); - mShinyScaleU->setValue(spec_scale_s); - mBumpyScaleU->setValue(norm_scale_s); + if (force_set_values) + { + mTexScaleU->forceSetValue(diff_scale_s); + mShinyScaleU->forceSetValue(spec_scale_s); + mBumpyScaleU->forceSetValue(norm_scale_s); + } + else + { + mTexScaleU->setValue(diff_scale_s); + mShinyScaleU->setValue(spec_scale_s); + mBumpyScaleU->setValue(norm_scale_s); + } mTexScaleU->setEnabled(editable && has_material); mShinyScaleU->setEnabled(editable && has_material && specmap_id.notNull()); @@ -1424,13 +1516,16 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) if (force_set_values) { mTexScaleV->forceSetValue(diff_scale_t); + mShinyScaleV->forceSetValue(spec_scale_t); + mBumpyScaleV->forceSetValue(norm_scale_t); } else { mTexScaleV->setValue(diff_scale_t); + mShinyScaleV->setValue(spec_scale_t); + mBumpyScaleV->setValue(norm_scale_t); } - mShinyScaleV->setValue(spec_scale_t); - mBumpyScaleV->setValue(norm_scale_t); + mTexScaleV->setTentative(LLSD(diff_scale_tentative)); mShinyScaleV->setTentative(LLSD(spec_scale_tentative)); @@ -1570,36 +1665,57 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) F32 repeats_norm = 1.f; F32 repeats_spec = 1.f; + F32 repeats_pbr_basecolor = 1.f; + F32 repeats_pbr_metallic_roughness = 1.f; + F32 repeats_pbr_normal = 1.f; + F32 repeats_pbr_emissive = 1.f; + bool identical_diff_repeats = false; bool identical_norm_repeats = false; bool identical_spec_repeats = false; - LLSelectedTE::getMaxDiffuseRepeats(repeats_diff, identical_diff_repeats); - LLSelectedTEMaterial::getMaxNormalRepeats(repeats_norm, identical_norm_repeats); - LLSelectedTEMaterial::getMaxSpecularRepeats(repeats_spec, identical_spec_repeats); + bool identical_pbr_basecolor_repeats = false; + bool identical_pbr_metallic_roughness_repeats = false; + bool identical_pbr_normal_repeats = false; + bool identical_pbr_emissive_repeats = false; { + LLSpinCtrl* repeats_spin_ctrl = nullptr; S32 index = mComboTexGen ? mComboTexGen->getCurrentIndex() : 0; bool enabled = editable && (index != 1); bool identical_repeats = true; S32 material_selection = mComboMatMedia->getCurrentIndex(); F32 repeats = 1.0f; - U32 material_type = MATTYPE_DIFFUSE; - if (material_selection == MATMEDIA_MATERIAL) + LLRender::eTexIndex material_channel = LLRender::DIFFUSE_MAP; + if (material_selection != MATMEDIA_PBR) { - material_type = mRadioMaterialType->getSelectedIndex(); + repeats_spin_ctrl = mTexRepeat; + material_channel = getMatTextureChannel(); + LLSelectedTE::getMaxDiffuseRepeats(repeats_diff, identical_diff_repeats); + LLSelectedTEMaterial::getMaxNormalRepeats(repeats_norm, identical_norm_repeats); + LLSelectedTEMaterial::getMaxSpecularRepeats(repeats_spec, identical_spec_repeats); } else if (material_selection == MATMEDIA_PBR) { + repeats_spin_ctrl = mPBRRepeat; enabled = editable && has_pbr_material; - material_type = mRadioPbrType->getSelectedIndex(); + material_channel = getPBRTextureChannel(); + + getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_BASE_COLOR, + repeats_pbr_basecolor, identical_pbr_basecolor_repeats); + getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS, + repeats_pbr_metallic_roughness, identical_pbr_metallic_roughness_repeats); + getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_NORMAL, + repeats_pbr_normal, identical_pbr_normal_repeats); + getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_EMISSIVE, + repeats_pbr_emissive, identical_pbr_emissive_repeats); } - switch (material_type) + switch (material_channel) { default: - case MATTYPE_DIFFUSE: + case LLRender::DIFFUSE_MAP: if (material_selection != MATMEDIA_PBR) { enabled = editable && !id.isNull(); @@ -1607,7 +1723,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) identical_repeats = identical_diff_repeats; repeats = repeats_diff; break; - case MATTYPE_SPECULAR: + case LLRender::SPECULAR_MAP: if (material_selection != MATMEDIA_PBR) { enabled = (editable && ((shiny == SHINY_TEXTURE) && !specmap_id.isNull())); @@ -1615,7 +1731,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) identical_repeats = identical_spec_repeats; repeats = repeats_spec; break; - case MATTYPE_NORMAL: + case LLRender::NORMAL_MAP: if (material_selection != MATMEDIA_PBR) { enabled = (editable && ((bumpy == BUMPY_TEXTURE) && !normmap_id.isNull())); @@ -1623,6 +1739,23 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) identical_repeats = identical_norm_repeats; repeats = repeats_norm; break; + case LLRender::NUM_TEXTURE_CHANNELS: + case LLRender::BASECOLOR_MAP: + identical_repeats = identical_pbr_basecolor_repeats; + repeats = repeats_pbr_basecolor; + break; + case LLRender::METALLIC_ROUGHNESS_MAP: + identical_repeats = identical_pbr_metallic_roughness_repeats; + repeats = repeats_pbr_metallic_roughness; + break; + case LLRender::GLTF_NORMAL_MAP: + identical_repeats = identical_pbr_normal_repeats; + repeats = repeats_pbr_normal; + break; + case LLRender::EMISSIVE_MAP: + identical_repeats = identical_pbr_emissive_repeats; + repeats = repeats_pbr_emissive; + break; } bool repeats_tentative = !identical_repeats; @@ -1630,14 +1763,14 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) if (force_set_values) { // onCommit, previosly edited element updates related ones - mTexRepeat->forceSetValue(editable ? repeats : 1.0f); + repeats_spin_ctrl->forceSetValue(editable ? repeats : 1.0f); } else { - mTexRepeat->setValue(editable ? repeats : 1.0f); + repeats_spin_ctrl->setValue(editable ? repeats : 1.0f); } - mTexRepeat->setTentative(LLSD(repeats_tentative)); - mTexRepeat->setEnabled(has_material && !identical_planar_texgen && enabled); + repeats_spin_ctrl->setTentative(LLSD(repeats_tentative)); + repeats_spin_ctrl->setEnabled(!identical_planar_texgen && enabled); } } @@ -1783,6 +1916,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) } mLabelColorTransp->setEnabled(false); mTexRepeat->setEnabled(false); + mPBRRepeat->setEnabled(false); mLabelTexGen->setEnabled(false); mLabelShininess->setEnabled(false); mLabelBumpiness->setEnabled(false); @@ -1978,6 +2112,7 @@ void LLPanelFace::updateVisibilityGLTF(LLViewerObject* objectp /*= nullptr */) mPBRRotate->setVisible(show_pbr); mPBROffsetU->setVisible(show_pbr); mPBROffsetV->setVisible(show_pbr); + mPBRRepeat->setVisible(show_pbr); } void LLPanelFace::updateCopyTexButton() @@ -1986,7 +2121,8 @@ void LLPanelFace::updateCopyTexButton() mMenuClipboardTexture->setEnabled(objectp && objectp->getPCode() == LL_PCODE_VOLUME && objectp->permModify() && !objectp->isPermanentEnforced() && !objectp->isInventoryPending() && (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1) - && LLMaterialEditor::canClipboardObjectsMaterial()); + && LLMaterialEditor::canClipboardObjectsMaterial() + && !mExcludeWater); std::string tooltip = (objectp && objectp->isInventoryPending()) ? LLTrans::getString("LoadingContents") : getString("paste_options"); mMenuClipboardTexture->setToolTip(tooltip); } @@ -2071,7 +2207,7 @@ void LLPanelFace::refreshMedia() // check if all faces have media(or, all dont have media) - LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo = selected_objects->getSelectedTEValue(&func, bool_has_media); + bool identical_has_media_info = selected_objects->getSelectedTEValue(&func, bool_has_media); const LLMediaEntry default_media_data; @@ -2093,7 +2229,8 @@ void LLPanelFace::refreshMedia() } func_media_data(default_media_data); LLMediaEntry media_data_get; - LLFloaterMediaSettings::getInstance()->mMultipleMedia = !(selected_objects->getSelectedTEValue(&func_media_data, media_data_get)); + bool multiple_media = !(selected_objects->getSelectedTEValue(&func_media_data, media_data_get)); + bool multiple_valid_media = false; std::string multi_media_info_str = LLTrans::getString("Multiple Media"); std::string media_title = ""; @@ -2102,12 +2239,12 @@ void LLPanelFace::refreshMedia() mAddMedia->setEnabled(editable); // IF all the faces have media (or all dont have media) - if (LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo) + if (identical_has_media_info) { // TODO: get media title and set it. mTitleMediaText->clear(); // if identical is set, all faces are same (whether all empty or has the same media) - if (!(LLFloaterMediaSettings::getInstance()->mMultipleMedia)) + if (!multiple_media) { // Media data is valid if (media_data_get != default_media_data) @@ -2128,9 +2265,9 @@ void LLPanelFace::refreshMedia() else // not all face has media but at least one does. { // seleted faces have not identical value - LLFloaterMediaSettings::getInstance()->mMultipleValidMedia = selected_objects->isMultipleTEValue(&func_media_data, default_media_data); + multiple_valid_media = selected_objects->isMultipleTEValue(&func_media_data, default_media_data); - if (LLFloaterMediaSettings::getInstance()->mMultipleValidMedia) + if (multiple_valid_media) { media_title = multi_media_info_str; } @@ -2167,7 +2304,7 @@ void LLPanelFace::refreshMedia() // load values for media settings updateMediaSettings(); - LLFloaterMediaSettings::initValues(mMediaSettings, editable); + LLFloaterMediaSettings::initValues(mMediaSettings, editable, identical_has_media_info, multiple_media, multiple_valid_media); } void LLPanelFace::unloadMedia() @@ -3027,6 +3164,36 @@ void LLPanelFace::onCommitFullbright() sendFullbright(); } +void LLPanelFace::onCommitHideWater() +{ + if (mCheckHideWater->get()) + { + LLHandle<LLPanel> handle = getHandle(); + LLNotificationsUtil::add("WaterExclusionSurfacesWarning", LLSD(), LLSD(), + [handle](const LLSD& notification, const LLSD& response) + { + if(LLPanelFace* panel = (LLPanelFace*)handle.get()) + { + if (LLNotificationsUtil::getSelectedOption(notification, response) == 1) + { + panel->mCheckHideWater->setValue(false); + return; + } + // apply invisiprim texture and reset related params to set water exclusion surface + panel->sendBump(0); + panel->sendShiny(0); + LLSelectMgr::getInstance()->selectionSetAlphaOnly(1.f); + LLSelectMgr::getInstance()->selectionSetImage(IMG_ALPHA_GRAD); + LLSelectedTEMaterial::setDiffuseAlphaMode(panel, LLMaterial::DIFFUSE_ALPHA_MODE_BLEND); + } + }); + } + else + { + LLSelectMgr::getInstance()->clearWaterExclusion(); + } +} + void LLPanelFace::onCommitGlow() { sendGlow(); @@ -3127,23 +3294,22 @@ void LLPanelFace::onSelectTexture() sendTexture(); LLGLenum image_format; + bool has_alpha; bool identical_image_format = false; bool missing_asset = false; - LLSelectedTE::getImageFormat(image_format, identical_image_format, missing_asset); + LLSelectedTE::getImageFormat(image_format, has_alpha, identical_image_format, missing_asset); - U32 alpha_mode = LLMaterial::DIFFUSE_ALPHA_MODE_NONE; if (!missing_asset) { + U32 alpha_mode = has_alpha ? LLMaterial::DIFFUSE_ALPHA_MODE_BLEND : LLMaterial::DIFFUSE_ALPHA_MODE_NONE; switch (image_format) { case GL_RGBA: case GL_ALPHA: - alpha_mode = LLMaterial::DIFFUSE_ALPHA_MODE_BLEND; - break; case GL_RGB: break; default: - LL_WARNS() << "Unexpected tex format in LLPanelFace...resorting to no alpha" << LL_ENDL; + LL_WARNS() << "Unexpected tex format in LLPanelFace..." << LL_ENDL; break; } @@ -3210,6 +3376,7 @@ void LLPanelFace::onSelectNormalTexture(const LLSD& data) // TODO: test if there is media on the item and only allow editing if present void LLPanelFace::onClickBtnEditMedia() { + LLFloaterMediaSettings::getInstance(); // make sure floater we are about to open exists before refreshMedia refreshMedia(); LLFloaterReg::showInstance("media_settings"); } @@ -3228,6 +3395,7 @@ void LLPanelFace::onClickBtnAddMedia() // check if multiple faces are selected if (LLSelectMgr::getInstance()->getSelection()->isMultipleTESelected()) { + LLFloaterMediaSettings::getInstance(); // make sure floater we are about to open exists before refreshMedia refreshMedia(); LLNotificationsUtil::add("MultipleFacesSelected", LLSD(), LLSD(), multipleFacesSelectedConfirm); } @@ -3592,23 +3760,13 @@ void LLPanelFace::onCommitRepeatsPerMeter() bool identical_scale_t = false; LLSelectedTE::getObjectScaleS(obj_scale_s, identical_scale_s); - LLSelectedTE::getObjectScaleS(obj_scale_t, identical_scale_t); + LLSelectedTE::getObjectScaleT(obj_scale_t, identical_scale_t); if (gSavedSettings.getBOOL("SyncMaterialSettings")) { LLSelectMgr::getInstance()->selectionTexScaleAutofit(repeats_per_meter); - - mBumpyScaleU->setValue(obj_scale_s * repeats_per_meter); - mBumpyScaleV->setValue(obj_scale_t * repeats_per_meter); - - LLSelectedTEMaterial::setNormalRepeatX(this, obj_scale_s * repeats_per_meter); - LLSelectedTEMaterial::setNormalRepeatY(this, obj_scale_t * repeats_per_meter); - - mShinyScaleU->setValue(obj_scale_s * repeats_per_meter); - mShinyScaleV->setValue(obj_scale_t * repeats_per_meter); - - LLSelectedTEMaterial::setSpecularRepeatX(this, obj_scale_s * repeats_per_meter); - LLSelectedTEMaterial::setSpecularRepeatY(this, obj_scale_t * repeats_per_meter); + LLSelectedTEMaterial::selectionNormalScaleAutofit(this, repeats_per_meter); + LLSelectedTEMaterial::selectionSpecularScaleAutofit(this, repeats_per_meter); } else { @@ -3619,18 +3777,10 @@ void LLPanelFace::onCommitRepeatsPerMeter() LLSelectMgr::getInstance()->selectionTexScaleAutofit(repeats_per_meter); break; case MATTYPE_NORMAL: - mBumpyScaleU->setValue(obj_scale_s * repeats_per_meter); - mBumpyScaleV->setValue(obj_scale_t * repeats_per_meter); - - LLSelectedTEMaterial::setNormalRepeatX(this, obj_scale_s * repeats_per_meter); - LLSelectedTEMaterial::setNormalRepeatY(this, obj_scale_t * repeats_per_meter); + LLSelectedTEMaterial::selectionNormalScaleAutofit(this, repeats_per_meter); break; case MATTYPE_SPECULAR: - mBumpyScaleU->setValue(obj_scale_s * repeats_per_meter); - mBumpyScaleV->setValue(obj_scale_t * repeats_per_meter); - - LLSelectedTEMaterial::setSpecularRepeatX(this, obj_scale_s * repeats_per_meter); - LLSelectedTEMaterial::setSpecularRepeatY(this, obj_scale_t * repeats_per_meter); + LLSelectedTEMaterial::selectionSpecularScaleAutofit(this, repeats_per_meter); break; default: llassert(false); @@ -3641,6 +3791,21 @@ void LLPanelFace::onCommitRepeatsPerMeter() updateUI(true); } +// Commit the number of GLTF repeats per meter +void LLPanelFace::onCommitGLTFRepeatsPerMeter() +{ + F32 repeats_per_meter = (F32)mPBRRepeat->getValue().asReal(); + + LLGLTFMaterial::TextureInfo material_type = getPBRTextureInfo(); + updateGLTFTextureTransformWithScale(material_type, [&](LLGLTFMaterial::TextureTransform* new_transform, F32 scale_s, F32 scale_t) + { + new_transform->mScale.mV[VX] = scale_s * repeats_per_meter; + new_transform->mScale.mV[VY] = scale_t * repeats_per_meter; + }); + + updateUI(true); +} + struct LLPanelFaceSetMediaFunctor : public LLSelectedTEFunctor { virtual bool apply(LLViewerObject* object, S32 te) @@ -3957,6 +4122,85 @@ void LLPanelFace::onPasteColor(LLViewerObject* objectp, S32 te) } } +void set_item_availability( + const LLUUID& id, + LLSD& dest, + const std::string& modifier, + bool is_creator, + std::map<LLUUID, LLUUID> &asset_item_map, + LLViewerObject* objectp) +{ + if (id.isNull()) + { + return; + } + + LLUUID item_id; + bool from_library = get_is_predefined_texture(id); + bool full_perm = from_library; + full_perm |= is_creator; + + if (!full_perm) + { + std::map<LLUUID, LLUUID>::iterator iter = asset_item_map.find(id); + if (iter != asset_item_map.end()) + { + item_id = iter->second; + } + else + { + // What this does is simply searches inventory for item with same asset id, + // as result it is Hightly unreliable, leaves little control to user, borderline hack + // but there are little options to preserve permissions - multiple inventory + // items might reference same asset and inventory search is expensive. + bool no_transfer = false; + if (objectp->getInventoryItemByAsset(id)) + { + no_transfer = !objectp->getInventoryItemByAsset(id)->getIsFullPerm(); + } + item_id = get_copy_free_item_by_asset_id(id, no_transfer); + // record value to avoid repeating inventory search when possible + asset_item_map[id] = item_id; + } + } + + if (item_id.notNull() && gInventory.isObjectDescendentOf(item_id, gInventory.getLibraryRootFolderID())) + { + full_perm = true; + from_library = true; + } + + dest[modifier + "itemfullperm"] = full_perm; + dest[modifier + "fromlibrary"] = from_library; + + // If full permission object, texture is free to copy, + // but otherwise we need to check inventory and extract permissions + // + // Normally we care only about restrictions for current user and objects + // don't inherit any 'next owner' permissions from texture, so there is + // no need to record item id if full_perm==true + if (!full_perm && item_id.notNull()) + { + LLViewerInventoryItem* itemp = gInventory.getItem(item_id); + if (itemp) + { + LLPermissions item_permissions = itemp->getPermissions(); + if (item_permissions.allowOperationBy(PERM_COPY, + gAgent.getID(), + gAgent.getGroupID())) + { + dest[modifier + "itemid"] = item_id; + dest[modifier + "itemfullperm"] = itemp->getIsFullPerm(); + if (!itemp->isFinished()) + { + // needed for dropTextureAllFaces + LLInventoryModelBackgroundFetch::instance().start(item_id, false); + } + } + } + } +} + void LLPanelFace::onCopyTexture() { LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getFirstObject(); @@ -3994,6 +4238,7 @@ void LLPanelFace::onCopyTexture() if (tep) { LLSD te_data; + LLUUID pbr_id = objectp->getRenderMaterialID(te); // asLLSD() includes media te_data["te"] = tep->asLLSD(); @@ -4002,21 +4247,20 @@ void LLPanelFace::onCopyTexture() te_data["te"]["bumpshiny"] = tep->getBumpShiny(); te_data["te"]["bumpfullbright"] = tep->getBumpShinyFullbright(); te_data["te"]["texgen"] = tep->getTexGen(); - te_data["te"]["pbr"] = objectp->getRenderMaterialID(te); + te_data["te"]["pbr"] = pbr_id; if (tep->getGLTFMaterialOverride() != nullptr) { te_data["te"]["pbr_override"] = tep->getGLTFMaterialOverride()->asJSON(); } - if (te_data["te"].has("imageid")) + if (te_data["te"].has("imageid") || pbr_id.notNull()) { - LLUUID item_id; - LLUUID id = te_data["te"]["imageid"].asUUID(); - bool from_library = get_is_predefined_texture(id); - bool full_perm = from_library; + LLUUID img_id = te_data["te"]["imageid"].asUUID(); + bool pbr_from_library = false; + bool pbr_full_perm = false; + bool is_creator = false; - if (!full_perm - && objectp->permCopy() + if (objectp->permCopy() && objectp->permTransfer() && objectp->permModify()) { @@ -4026,66 +4270,31 @@ void LLPanelFace::onCopyTexture() std::string creator_app_link; LLUUID creator_id; LLSelectMgr::getInstance()->selectGetCreator(creator_id, creator_app_link); - full_perm = objectp->mOwnerID == creator_id; - } - - if (id.notNull() && !full_perm) - { - std::map<LLUUID, LLUUID>::iterator iter = asset_item_map.find(id); - if (iter != asset_item_map.end()) - { - item_id = iter->second; - } - else - { - // What this does is simply searches inventory for item with same asset id, - // as result it is Hightly unreliable, leaves little control to user, borderline hack - // but there are little options to preserve permissions - multiple inventory - // items might reference same asset and inventory search is expensive. - bool no_transfer = false; - if (objectp->getInventoryItemByAsset(id)) - { - no_transfer = !objectp->getInventoryItemByAsset(id)->getIsFullPerm(); - } - item_id = get_copy_free_item_by_asset_id(id, no_transfer); - // record value to avoid repeating inventory search when possible - asset_item_map[id] = item_id; - } + is_creator = objectp->mOwnerID == creator_id; } - if (item_id.notNull() && gInventory.isObjectDescendentOf(item_id, gInventory.getLibraryRootFolderID())) + // check permissions for blin-phong/diffuse image and for pbr asset + if (img_id.notNull()) { - full_perm = true; - from_library = true; + set_item_availability(img_id, te_data["te"], "img", is_creator, asset_item_map, objectp); } - + if (pbr_id.notNull()) { - te_data["te"]["itemfullperm"] = full_perm; - te_data["te"]["fromlibrary"] = from_library; + set_item_availability(pbr_id, te_data["te"], "pbr", is_creator, asset_item_map, objectp); - // If full permission object, texture is free to copy, - // but otherwise we need to check inventory and extract permissions - // - // Normally we care only about restrictions for current user and objects - // don't inherit any 'next owner' permissions from texture, so there is - // no need to record item id if full_perm==true - if (!full_perm && !from_library && item_id.notNull()) + // permissions for overrides + // Overrides do not permit no-copy textures + LLGLTFMaterial* override = tep->getGLTFMaterialOverride(); + if (override != nullptr) { - LLViewerInventoryItem* itemp = gInventory.getItem(item_id); - if (itemp) + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) { - LLPermissions item_permissions = itemp->getPermissions(); - if (item_permissions.allowOperationBy(PERM_COPY, - gAgent.getID(), - gAgent.getGroupID())) + LLUUID& texture_id = override->mTextureId[i]; + if (texture_id.notNull()) { - te_data["te"]["imageitemid"] = item_id; - te_data["te"]["itemfullperm"] = itemp->getIsFullPerm(); - if (!itemp->isFinished()) - { - // needed for dropTextureAllFaces - LLInventoryModelBackgroundFetch::instance().start(item_id, false); - } + const std::string prefix = "pbr" + std::to_string(i); + te_data["te"][prefix + "imageid"] = texture_id; + set_item_availability(texture_id, te_data["te"], prefix, is_creator, asset_item_map, objectp); } } } @@ -4149,6 +4358,44 @@ void LLPanelFace::onCopyTexture() } } +bool get_full_permission(const LLSD& te, const std::string &prefix) +{ + return te.has(prefix + "itemfullperm") && te[prefix+"itemfullperm"].asBoolean(); +} + +bool LLPanelFace::validateInventoryItem(const LLSD& te, const std::string& prefix) +{ + if (te.has(prefix + "itemid")) + { + LLUUID item_id = te[prefix + "itemid"].asUUID(); + if (item_id.notNull()) + { + LLViewerInventoryItem* itemp = gInventory.getItem(item_id); + if (!itemp) + { + // image might be in object's inventory, but it can be not up to date + LLSD notif_args; + static std::string reason = getString("paste_error_inventory_not_found"); + notif_args["REASON"] = reason; + LLNotificationsUtil::add("FacePasteFailed", notif_args); + return false; + } + } + } + else + { + // Item was not found on 'copy' stage + // Since this happened at copy, might be better to either show this + // at copy stage or to drop clipboard here + LLSD notif_args; + static std::string reason = getString("paste_error_inventory_not_found"); + notif_args["REASON"] = reason; + LLNotificationsUtil::add("FacePasteFailed", notif_args); + return false; + } + return true; +} + void LLPanelFace::onPasteTexture() { if (!mClipboardParams.has("texture")) @@ -4213,39 +4460,49 @@ void LLPanelFace::onPasteTexture() for (; iter != end; ++iter) { const LLSD& te_data = *iter; - if (te_data.has("te") && te_data["te"].has("imageid")) + if (te_data.has("te")) { - bool full_perm = te_data["te"].has("itemfullperm") && te_data["te"]["itemfullperm"].asBoolean(); - full_perm_object &= full_perm; - if (!full_perm) + if (te_data["te"].has("imageid")) { - if (te_data["te"].has("imageitemid")) + bool full_perm = get_full_permission(te_data["te"], "img"); + full_perm_object &= full_perm; + if (!full_perm) { - LLUUID item_id = te_data["te"]["imageitemid"].asUUID(); - if (item_id.notNull()) + if (!validateInventoryItem(te_data["te"], "img")) { - LLViewerInventoryItem* itemp = gInventory.getItem(item_id); - if (!itemp) - { - // image might be in object's inventory, but it can be not up to date - LLSD notif_args; - static std::string reason = getString("paste_error_inventory_not_found"); - notif_args["REASON"] = reason; - LLNotificationsUtil::add("FacePasteFailed", notif_args); - return; - } + return; } } - else + } + if (te_data["te"].has("pbr")) + { + bool full_perm = get_full_permission(te_data["te"], "pbr"); + full_perm_object &= full_perm; + if (!full_perm) { - // Item was not found on 'copy' stage - // Since this happened at copy, might be better to either show this - // at copy stage or to drop clipboard here - LLSD notif_args; - static std::string reason = getString("paste_error_inventory_not_found"); - notif_args["REASON"] = reason; - LLNotificationsUtil::add("FacePasteFailed", notif_args); - return; + if (!validateInventoryItem(te_data["te"], "pbr")) + { + return; + } + } + if (te_data["te"].has("pbr_override")) + { + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) + { + const std::string prefix = "pbr" + std::to_string(i); + if (te_data["te"].has(prefix + "imageid")) + { + bool full_perm = get_full_permission(te_data["te"], prefix); + full_perm_object &= full_perm; + if (!full_perm) + { + if (!validateInventoryItem(te_data["te"], prefix)) + { + return; + } + } + } + } } } } @@ -4270,6 +4527,71 @@ void LLPanelFace::onPasteTexture() selected_objects->applyToTEs(&navigate_home_func); } +void get_item_and_permissions(const LLUUID &id, LLViewerInventoryItem*& itemp, bool& full_perm, bool& from_library, const LLSD &data, const std::string &prefix) +{ + full_perm = get_full_permission(data, prefix); + from_library = data.has(prefix + "fromlibrary") && data.get(prefix + "fromlibrary").asBoolean(); + LLViewerInventoryItem* itemp_res = NULL; + + if (data.has(prefix + "itemid")) + { + LLUUID item_id = data.get(prefix + "itemid").asUUID(); + if (item_id.notNull()) + { + LLViewerInventoryItem* itemp = gInventory.getItem(item_id); + if (itemp && itemp->isFinished()) + { + // dropTextureAllFaces will fail if incomplete + itemp_res = itemp; + } + else + { + // Theoretically shouldn't happend, but if it does happen, we + // might need to add a notification to user that paste will fail + // since inventory isn't fully loaded + LL_WARNS() << "Item " << item_id << " is incomplete, paste might fail silently." << LL_ENDL; + } + } + } + + // for case when item got removed from inventory after we pressed 'copy' + // or texture got pasted into previous object + if (!itemp_res && !full_perm) + { + // Due to checks for imageitemid in LLPanelFace::onPasteTexture() this should no longer be reachable. + LL_INFOS() << "Item " << data.get(prefix + "itemid").asUUID() << " no longer in inventory." << LL_ENDL; + // Todo: fix this, we are often searching same texture multiple times (equal to number of faces) + // Perhaps just mPanelFace->onPasteTexture(objectp, te, &asset_to_item_id_map); ? Not pretty, but will work + LLViewerInventoryCategory::cat_array_t cats; + LLViewerInventoryItem::item_array_t items; + LLAssetIDMatches asset_id_matches(id); + gInventory.collectDescendentsIf(LLUUID::null, + cats, + items, + LLInventoryModel::INCLUDE_TRASH, + asset_id_matches); + + // Extremely unreliable and perfomance unfriendly. + // But we need this to check permissions and it is how texture control finds items + for (S32 i = 0; i < items.size(); i++) + { + LLViewerInventoryItem* itemp = items[i]; + if (itemp && itemp->isFinished()) + { + // dropTextureAllFaces will fail if incomplete + LLPermissions item_permissions = itemp->getPermissions(); + if (item_permissions.allowOperationBy(PERM_COPY, + gAgent.getID(), + gAgent.getGroupID())) + { + itemp_res = itemp; + break; // first match + } + } + } + } +} + void LLPanelFace::onPasteTexture(LLViewerObject* objectp, S32 te) { LLSD te_data; @@ -4293,77 +4615,22 @@ void LLPanelFace::onPasteTexture(LLViewerObject* objectp, S32 te) if (te_data.has("te")) { // Texture - bool full_perm = te_data["te"].has("itemfullperm") && te_data["te"]["itemfullperm"].asBoolean(); - bool from_library = te_data["te"].has("fromlibrary") && te_data["te"]["fromlibrary"].asBoolean(); if (te_data["te"].has("imageid")) { + bool img_full_perm = false; + bool img_from_library = false; const LLUUID& imageid = te_data["te"]["imageid"].asUUID(); //texture or asset id - LLViewerInventoryItem* itemp_res = NULL; + LLViewerInventoryItem* img_itemp_res = NULL; - if (te_data["te"].has("imageitemid")) - { - LLUUID item_id = te_data["te"]["imageitemid"].asUUID(); - if (item_id.notNull()) - { - LLViewerInventoryItem* itemp = gInventory.getItem(item_id); - if (itemp && itemp->isFinished()) - { - // dropTextureAllFaces will fail if incomplete - itemp_res = itemp; - } - else - { - // Theoretically shouldn't happend, but if it does happen, we - // might need to add a notification to user that paste will fail - // since inventory isn't fully loaded - LL_WARNS() << "Item " << item_id << " is incomplete, paste might fail silently." << LL_ENDL; - } - } - } - // for case when item got removed from inventory after we pressed 'copy' - // or texture got pasted into previous object - if (!itemp_res && !full_perm) - { - // Due to checks for imageitemid in LLPanelFace::onPasteTexture() this should no longer be reachable. - LL_INFOS() << "Item " << te_data["te"]["imageitemid"].asUUID() << " no longer in inventory." << LL_ENDL; - // Todo: fix this, we are often searching same texture multiple times (equal to number of faces) - // Perhaps just mPanelFace->onPasteTexture(objectp, te, &asset_to_item_id_map); ? Not pretty, but will work - LLViewerInventoryCategory::cat_array_t cats; - LLViewerInventoryItem::item_array_t items; - LLAssetIDMatches asset_id_matches(imageid); - gInventory.collectDescendentsIf(LLUUID::null, - cats, - items, - LLInventoryModel::INCLUDE_TRASH, - asset_id_matches); + get_item_and_permissions(imageid, img_itemp_res, img_full_perm, img_from_library, te_data["te"], "img"); - // Extremely unreliable and perfomance unfriendly. - // But we need this to check permissions and it is how texture control finds items - for (S32 i = 0; i < items.size(); i++) - { - LLViewerInventoryItem* itemp = items[i]; - if (itemp && itemp->isFinished()) - { - // dropTextureAllFaces will fail if incomplete - LLPermissions item_permissions = itemp->getPermissions(); - if (item_permissions.allowOperationBy(PERM_COPY, - gAgent.getID(), - gAgent.getGroupID())) - { - itemp_res = itemp; - break; // first match - } - } - } - } - - if (itemp_res) + if (img_itemp_res) { if (te == -1) // all faces { LLToolDragAndDrop::dropTextureAllFaces(objectp, - itemp_res, - from_library ? LLToolDragAndDrop::SOURCE_LIBRARY : LLToolDragAndDrop::SOURCE_AGENT, + img_itemp_res, + img_from_library ? LLToolDragAndDrop::SOURCE_LIBRARY : LLToolDragAndDrop::SOURCE_AGENT, LLUUID::null, false); } @@ -4371,15 +4638,15 @@ void LLPanelFace::onPasteTexture(LLViewerObject* objectp, S32 te) { LLToolDragAndDrop::dropTextureOneFace(objectp, te, - itemp_res, - from_library ? LLToolDragAndDrop::SOURCE_LIBRARY : LLToolDragAndDrop::SOURCE_AGENT, + img_itemp_res, + img_from_library ? LLToolDragAndDrop::SOURCE_LIBRARY : LLToolDragAndDrop::SOURCE_AGENT, LLUUID::null, false, 0); } } // not an inventory item or no complete items - else if (full_perm) + else if (img_full_perm) { // Either library, local or existed as fullperm when user made a copy LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture(imageid, FTT_DEFAULT, true, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); @@ -4407,30 +4674,69 @@ void LLPanelFace::onPasteTexture(LLViewerObject* objectp, S32 te) // PBR/GLTF if (te_data["te"].has("pbr")) { - objectp->setRenderMaterialID(te, te_data["te"]["pbr"].asUUID(), false /*managing our own update*/); - tep->setGLTFRenderMaterial(nullptr); - tep->setGLTFMaterialOverride(nullptr); + const LLUUID pbr_id = te_data["te"]["pbr"].asUUID(); + bool pbr_full_perm = false; + bool pbr_from_library = false; + LLViewerInventoryItem* pbr_itemp_res = NULL; - LLSD override_data; - override_data["object_id"] = objectp->getID(); - override_data["side"] = te; + get_item_and_permissions(pbr_id, pbr_itemp_res, pbr_full_perm, pbr_from_library, te_data["te"], "pbr"); + + bool allow = true; + + // check overrides first since they don't need t be moved to inventory if (te_data["te"].has("pbr_override")) { - override_data["gltf_json"] = te_data["te"]["pbr_override"]; + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) + { + const std::string prefix = "pbr" + std::to_string(i); + if (te_data["te"].has(prefix + "imageid")) + { + LLUUID tex_id = te_data["te"][prefix + "imageid"]; + + bool full_perm = false; + bool from_library = false; + LLViewerInventoryItem* itemp_res = NULL; + get_item_and_permissions(tex_id, itemp_res, full_perm, from_library, te_data["te"], prefix); + allow = full_perm; + if (!allow) break; + } + } } - else + + if (allow && pbr_itemp_res) { - override_data["gltf_json"] = ""; + if (pbr_itemp_res) + { + allow = LLToolDragAndDrop::handleDropMaterialProtections( + objectp, + pbr_itemp_res, + pbr_from_library ? LLToolDragAndDrop::SOURCE_LIBRARY : LLToolDragAndDrop::SOURCE_AGENT, + pbr_id); + } + else + { + allow = pbr_full_perm; + } } - override_data["asset_id"] = te_data["te"]["pbr"].asUUID(); + if (allow) + { + objectp->setRenderMaterialID(te, te_data["te"]["pbr"].asUUID(), false /*managing our own update*/); + tep->setGLTFMaterialOverride(nullptr); - LLGLTFMaterialList::queueUpdate(override_data); + if (te_data["te"].has("pbr_override")) + { + LLGLTFMaterialList::queueApply(objectp, te, te_data["te"]["pbr"].asUUID(), te_data["te"]["pbr_override"]); + } + else + { + LLGLTFMaterialList::queueApply(objectp, te, te_data["te"]["pbr"].asUUID()); + } + } } else { objectp->setRenderMaterialID(te, LLUUID::null, false /*send in bulk later*/ ); - tep->setGLTFRenderMaterial(nullptr); tep->setGLTFMaterialOverride(nullptr); // blank out most override data on the server @@ -4597,6 +4903,29 @@ void LLPanelFace::updateGLTFTextureTransform(std::function<void(LLGLTFMaterial:: } } +void LLPanelFace::updateGLTFTextureTransformWithScale(const LLGLTFMaterial::TextureInfo texture_info, std::function<void(LLGLTFMaterial::TextureTransform*, const F32, const F32)> edit) +{ + if (texture_info == LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT) + { + updateSelectedGLTFMaterialsWithScale([&](LLGLTFMaterial* new_override, const F32 scale_s, const F32 scale_t) + { + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) + { + LLGLTFMaterial::TextureTransform& new_transform = new_override->mTextureTransform[(LLGLTFMaterial::TextureInfo)i]; + edit(&new_transform, scale_s, scale_t); + } + }); + } + else + { + updateSelectedGLTFMaterialsWithScale([&](LLGLTFMaterial* new_override, const F32 scale_s, const F32 scale_t) + { + LLGLTFMaterial::TextureTransform& new_transform = new_override->mTextureTransform[texture_info]; + edit(&new_transform, scale_s, scale_t); + }); + } +} + void LLPanelFace::setMaterialOverridesFromSelection() { const LLGLTFMaterial::TextureInfo texture_info = getPBRTextureInfo(); @@ -4672,8 +5001,9 @@ void LLPanelFace::setMaterialOverridesFromSelection() } } - mPBRScaleU->setValue(transform.mScale[VX]); - mPBRScaleV->setValue(transform.mScale[VY]); + // Force set scales just in case they were set by repeats per meter and their spinner is focused + mPBRScaleU->forceSetValue(transform.mScale[VX]); + mPBRScaleV->forceSetValue(transform.mScale[VY]); mPBRRotate->setValue(transform.mRotation * RAD_TO_DEG); mPBROffsetU->setValue(transform.mOffset[VX]); mPBROffsetV->setValue(transform.mOffset[VY]); @@ -4683,6 +5013,12 @@ void LLPanelFace::setMaterialOverridesFromSelection() mPBRRotate->setTentative(!rotation_same); mPBROffsetU->setTentative(!offset_u_same); mPBROffsetV->setTentative(!offset_v_same); + + F32 repeats = 1.f; + bool identical = false; + getSelectedGLTFMaterialMaxRepeats(getPBRDropChannel(), repeats, identical); + mPBRRepeat->forceSetValue(repeats); + mPBRRepeat->setTentative(!identical || !scale_u_same || !scale_v_same); } void LLPanelFace::Selection::connect() @@ -4891,6 +5227,26 @@ bool LLPanelFace::isIdenticalPlanarTexgen() return (identical_texgen && (selected_texgen == LLTextureEntry::TEX_GEN_PLANAR)); } +bool LLPanelFace::isMediaTexSelected() +{ + LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode(); + if (LLViewerObject* objectp = node->getObject()) + { + S32 num_tes = llmin((S32)objectp->getNumTEs(), (S32)objectp->getNumFaces()); + for (S32 te = 0; te < num_tes; ++te) + { + if (node->isTESelected(te)) + { + if (objectp->getTE(te) && objectp->getTE(te)->hasMedia()) + { + return true; + } + } + } + } + return false; +} + void LLPanelFace::LLSelectedTE::getFace(LLFace*& face_to_return, bool& identical_face) { struct LLSelectedTEGetFace : public LLSelectedTEGetFunctor<LLFace *> @@ -4903,12 +5259,13 @@ void LLPanelFace::LLSelectedTE::getFace(LLFace*& face_to_return, bool& identical identical_face = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&get_te_face_func, face_to_return, false, (LLFace*)nullptr); } -void LLPanelFace::LLSelectedTE::getImageFormat(LLGLenum& image_format_to_return, bool& identical_face, bool& missing_asset) +void LLPanelFace::LLSelectedTE::getImageFormat(LLGLenum& image_format_to_return, bool& has_alpha, bool& identical_face, bool& missing_asset) { struct LLSelectedTEGetmatId : public LLSelectedTEFunctor { LLSelectedTEGetmatId() : mImageFormat(GL_RGB) + , mHasAlpha(false) , mIdentical(true) , mMissingAsset(false) , mFirstRun(true) @@ -4923,6 +5280,10 @@ void LLPanelFace::LLSelectedTE::getImageFormat(LLGLenum& image_format_to_return, { format = image->getPrimaryFormat(); missing = image->isMissingAsset(); + if (format == GL_RGBA || format == GL_ALPHA) + { + mHasAlpha = true; + } } if (mFirstRun) @@ -4939,6 +5300,7 @@ void LLPanelFace::LLSelectedTE::getImageFormat(LLGLenum& image_format_to_return, return true; } LLGLenum mImageFormat; + bool mHasAlpha; bool mIdentical; bool mMissingAsset; bool mFirstRun; @@ -4946,6 +5308,7 @@ void LLPanelFace::LLSelectedTE::getImageFormat(LLGLenum& image_format_to_return, LLSelectMgr::getInstance()->getSelection()->applyToTEs(&func); image_format_to_return = func.mImageFormat; + has_alpha = func.mHasAlpha; identical_face = func.mIdentical; missing_asset = func.mMissingAsset; } @@ -5086,6 +5449,7 @@ void LLPanelFace::LLSelectedTEMaterial::getMaxSpecularRepeats(F32& repeats, bool LLMaterial* mat = object->getTE(face)->getMaterialParams().get(); U32 s_axis = VX; U32 t_axis = VY; + LLPrimitive::getTESTAxes(face, &s_axis, &t_axis); F32 repeats_s = 1.0f; F32 repeats_t = 1.0f; if (mat) @@ -5110,6 +5474,7 @@ void LLPanelFace::LLSelectedTEMaterial::getMaxNormalRepeats(F32& repeats, bool& LLMaterial* mat = object->getTE(face)->getMaterialParams().get(); U32 s_axis = VX; U32 t_axis = VY; + LLPrimitive::getTESTAxes(face, &s_axis, &t_axis); F32 repeats_s = 1.0f; F32 repeats_t = 1.0f; if (mat) @@ -5125,35 +5490,99 @@ void LLPanelFace::LLSelectedTEMaterial::getMaxNormalRepeats(F32& repeats, bool& identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &max_norm_repeats_func, repeats); } -void LLPanelFace::LLSelectedTEMaterial::getCurrentDiffuseAlphaMode(U8& diffuse_alpha_mode, bool& identical, bool diffuse_texture_has_alpha) +void LLPanelFace::LLSelectedTEMaterial::getCurrentDiffuseAlphaMode(U8& diffuse_alpha_mode, bool& identical) { struct LLSelectedTEGetDiffuseAlphaMode : public LLSelectedTEGetFunctor<U8> { - LLSelectedTEGetDiffuseAlphaMode() : _isAlpha(false) {} - LLSelectedTEGetDiffuseAlphaMode(bool diffuse_texture_has_alpha) : _isAlpha(diffuse_texture_has_alpha) {} + LLSelectedTEGetDiffuseAlphaMode() {} virtual ~LLSelectedTEGetDiffuseAlphaMode() {} U8 get(LLViewerObject* object, S32 face) { - U8 diffuse_mode = _isAlpha ? LLMaterial::DIFFUSE_ALPHA_MODE_BLEND : LLMaterial::DIFFUSE_ALPHA_MODE_NONE; - LLTextureEntry* tep = object->getTE(face); if (tep) { LLMaterial* mat = tep->getMaterialParams().get(); if (mat) { - diffuse_mode = mat->getDiffuseAlphaMode(); + return mat->getDiffuseAlphaMode(); + } + } + + bool has_alpha = false; + LLViewerTexture* image = object->getTEImage(face); + if (image) + { + LLGLenum format = image->getPrimaryFormat(); + if (format == GL_RGBA || format == GL_ALPHA) + { + has_alpha = true; } } + U8 diffuse_mode = has_alpha ? LLMaterial::DIFFUSE_ALPHA_MODE_BLEND : LLMaterial::DIFFUSE_ALPHA_MODE_NONE; return diffuse_mode; } - bool _isAlpha; // whether or not the diffuse texture selected contains alpha information - } get_diff_mode(diffuse_texture_has_alpha); + } get_diff_mode; identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &get_diff_mode, diffuse_alpha_mode); } +void LLPanelFace::LLSelectedTEMaterial::selectionNormalScaleAutofit(LLPanelFace* panel_face, F32 repeats_per_meter) +{ + struct f : public LLSelectedTEFunctor + { + LLPanelFace* mFacePanel; + F32 mRepeatsPerMeter; + f(LLPanelFace* face_panel, const F32& repeats_per_meter) : mFacePanel(face_panel), mRepeatsPerMeter(repeats_per_meter) {} + bool apply(LLViewerObject* object, S32 te) + { + if (object->permModify()) + { + // Compute S,T to axis mapping + U32 s_axis, t_axis; + if (!LLPrimitive::getTESTAxes(te, &s_axis, &t_axis)) + return true; + + F32 new_s = object->getScale().mV[s_axis] * mRepeatsPerMeter; + F32 new_t = object->getScale().mV[t_axis] * mRepeatsPerMeter; + + setNormalRepeatX(mFacePanel, new_s, te); + setNormalRepeatY(mFacePanel, new_t, te); + } + return true; + } + } setfunc(panel_face, repeats_per_meter); + LLSelectMgr::getInstance()->getSelection()->applyToTEs(&setfunc); +} + +void LLPanelFace::LLSelectedTEMaterial::selectionSpecularScaleAutofit(LLPanelFace* panel_face, F32 repeats_per_meter) +{ + struct f : public LLSelectedTEFunctor + { + LLPanelFace* mFacePanel; + F32 mRepeatsPerMeter; + f(LLPanelFace* face_panel, const F32& repeats_per_meter) : mFacePanel(face_panel), mRepeatsPerMeter(repeats_per_meter) {} + bool apply(LLViewerObject* object, S32 te) + { + if (object->permModify()) + { + // Compute S,T to axis mapping + U32 s_axis, t_axis; + if (!LLPrimitive::getTESTAxes(te, &s_axis, &t_axis)) + return true; + + F32 new_s = object->getScale().mV[s_axis] * mRepeatsPerMeter; + F32 new_t = object->getScale().mV[t_axis] * mRepeatsPerMeter; + + setSpecularRepeatX(mFacePanel, new_s, te); + setSpecularRepeatY(mFacePanel, new_t, te); + } + return true; + } + } setfunc(panel_face, repeats_per_meter); + LLSelectMgr::getInstance()->getSelection()->applyToTEs(&setfunc); +} + void LLPanelFace::LLSelectedTE::getObjectScaleS(F32& scale_s, bool& identical) { struct LLSelectedTEGetObjectScaleS : public LLSelectedTEGetFunctor<F32> diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h index 4d2ce208b4..86d5282518 100644 --- a/indra/newview/llpanelface.h +++ b/indra/newview/llpanelface.h @@ -139,6 +139,8 @@ protected: void updateMediaSettings(); void updateMediaTitle(); + bool isMediaTexSelected(); + void getState(); void sendTexture(); // applies and sends texture @@ -238,6 +240,7 @@ protected: void onCommitShiny(); void onCommitAlphaMode(); void onCommitFullbright(); + void onCommitHideWater(); void onCommitGlow(); void onCommitPlanarAlign(); void onCommitRepeatsPerMeter(); @@ -247,6 +250,7 @@ protected: void onCommitGLTFRotation(); void onCommitGLTFTextureOffsetU(); void onCommitGLTFTextureOffsetV(); + void onCommitGLTFRepeatsPerMeter(); void onClickAutoFix(); void onAlignTexture(); @@ -261,6 +265,9 @@ public: // needs to be accessible to selection manager void onCopyTexture(); void onPasteTexture(); void onPasteTexture(LLViewerObject* objectp, S32 te); +private: + // for copy/paste operations + bool validateInventoryItem(const LLSD& te, const std::string& prefix); protected: void menuDoToSelected(const LLSD& userdata); @@ -308,6 +315,7 @@ private: LLRadioGroup* mRadioPbrType { nullptr }; LLCheckBoxCtrl* mCheckFullbright { nullptr }; + LLCheckBoxCtrl* mCheckHideWater{ nullptr }; LLTextBox* mLabelColorTransp { nullptr }; LLSpinCtrl* mCtrlColorTransp { nullptr }; // transparency = 1 - alpha @@ -354,6 +362,7 @@ private: LLButton* mDelMedia { nullptr }; LLSpinCtrl* mPBRScaleU { nullptr }; LLSpinCtrl* mPBRScaleV { nullptr }; + LLSpinCtrl* mPBRRepeat { nullptr }; LLSpinCtrl* mPBRRotate { nullptr }; LLSpinCtrl* mPBROffsetU { nullptr }; LLSpinCtrl* mPBROffsetV { nullptr }; @@ -547,7 +556,9 @@ private: void updateVisibilityGLTF(LLViewerObject* objectp = nullptr); void updateSelectedGLTFMaterials(std::function<void(LLGLTFMaterial*)> func); + void updateSelectedGLTFMaterialsWithScale(std::function<void(LLGLTFMaterial*, const F32, const F32)> func); void updateGLTFTextureTransform(std::function<void(LLGLTFMaterial::TextureTransform*)> edit); + void updateGLTFTextureTransformWithScale(const LLGLTFMaterial::TextureInfo texture_info, std::function<void(LLGLTFMaterial::TextureTransform*, const F32, const F32)> edit); void setMaterialOverridesFromSelection(); @@ -555,6 +566,7 @@ private: LLMenuButton* mMenuClipboardTexture; bool mIsAlpha; + bool mExcludeWater { false }; LLSD mClipboardParams; @@ -640,7 +652,9 @@ public: static void getCurrent(LLMaterialPtr& material_ptr, bool& identical_material); static void getMaxSpecularRepeats(F32& repeats, bool& identical); static void getMaxNormalRepeats(F32& repeats, bool& identical); - static void getCurrentDiffuseAlphaMode(U8& diffuse_alpha_mode, bool& identical, bool diffuse_texture_has_alpha); + static void getCurrentDiffuseAlphaMode(U8& diffuse_alpha_mode, bool& identical); + static void selectionNormalScaleAutofit(LLPanelFace* panel_face, F32 repeats_per_meter); + static void selectionSpecularScaleAutofit(LLPanelFace* panel_face, F32 repeats_per_meter); DEF_GET_MAT_STATE(LLUUID, const LLUUID&, getNormalID, LLUUID::null, false, LLUUID::null); DEF_GET_MAT_STATE(LLUUID, const LLUUID&, getSpecularID, LLUUID::null, false, LLUUID::null); @@ -683,7 +697,7 @@ public: { public: static void getFace(class LLFace*& face_to_return, bool& identical_face); - static void getImageFormat(LLGLenum& image_format_to_return, bool& identical_face, bool& missing_asset); + static void getImageFormat(LLGLenum& image_format_to_return, bool& has_alpha, bool& identical_face, bool& missing_asset); static void getTexId(LLUUID& id, bool& identical); static void getPbrMaterialId(LLUUID& id, bool& identical, bool& has_pbr, bool& has_faces_without_pbr); static void getObjectScaleS(F32& scale_s, bool& identical); diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index 65aa1876b0..ecb66f9cea 100644 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -231,6 +231,12 @@ void LLPanelGroup::onBackBtnClick() } } +void LLPanelGroup::hideBackBtn() +{ + childSetVisible("back", false); + setBackgroundVisible(false); +} + void LLPanelGroup::onBtnRefresh(void* user_data) { LLPanelGroup* self = static_cast<LLPanelGroup*>(user_data); diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h index fa0e1d4104..b43a93bc40 100644 --- a/indra/newview/llpanelgroup.h +++ b/indra/newview/llpanelgroup.h @@ -87,6 +87,7 @@ public: const std::string& inventory_name, LLOfferInfo* inventory_offer); + void hideBackBtn(); protected: virtual void update(LLGroupChange gc); diff --git a/indra/newview/llpanelgroupbulk.cpp b/indra/newview/llpanelgroupbulk.cpp index 8032e207cd..81c0bd97be 100644 --- a/indra/newview/llpanelgroupbulk.cpp +++ b/indra/newview/llpanelgroupbulk.cpp @@ -54,17 +54,16 @@ ////////////////////////////////////////////////////////////////////////// LLPanelGroupBulkImpl::LLPanelGroupBulkImpl(const LLUUID& group_id) : mGroupID(group_id), - mBulkAgentList(NULL), - mOKButton(NULL), + mBulkAgentList(nullptr), + mOKButton(nullptr), mAddButton(nullptr), - mRemoveButton(NULL), - mGroupName(NULL), + mRemoveButton(nullptr), + mGroupName(nullptr), mLoadingText(), mTooManySelected(), - mCloseCallback(NULL), - mCloseCallbackUserData(NULL), - mAvatarNameCacheConnection(), - mRoleNames(NULL), + mCloseCallback(nullptr), + mCloseCallbackUserData(nullptr), + mRoleNames(nullptr), mOwnerWarning(), mAlreadyInGroup(), mConfirmedOwnerInvite(false), @@ -74,10 +73,13 @@ LLPanelGroupBulkImpl::LLPanelGroupBulkImpl(const LLUUID& group_id) : LLPanelGroupBulkImpl::~LLPanelGroupBulkImpl() { - if (mAvatarNameCacheConnection.connected()) + for (auto& [id, connection] : mAvatarNameCacheConnections) { - mAvatarNameCacheConnection.disconnect(); + if (connection.connected()) + connection.disconnect(); } + + mAvatarNameCacheConnections.clear(); } void LLPanelGroupBulkImpl::callbackClickAdd(LLPanelGroupBulk* panelp) @@ -124,43 +126,42 @@ void LLPanelGroupBulkImpl::callbackSelect(LLUICtrl* ctrl, void* userdata) void LLPanelGroupBulkImpl::addUsers(const uuid_vec_t& agent_ids) { - std::vector<std::string> names; for (const LLUUID& agent_id : agent_ids) { - LLAvatarName av_name; - if (LLAvatarNameCache::get(agent_id, &av_name)) + if (LLAvatarName av_name; LLAvatarNameCache::get(agent_id, &av_name)) { onAvatarNameCache(agent_id, av_name); } else { - if (mAvatarNameCacheConnection.connected()) + if (auto found = mAvatarNameCacheConnections.find(agent_id); found != mAvatarNameCacheConnections.end()) { - mAvatarNameCacheConnection.disconnect(); + if (found->second.connected()) + found->second.disconnect(); + + mAvatarNameCacheConnections.erase(found); } - // *TODO : Add a callback per avatar name being fetched. - mAvatarNameCacheConnection = LLAvatarNameCache::get(agent_id, + + mAvatarNameCacheConnections.try_emplace(agent_id, LLAvatarNameCache::get(agent_id, [&](const LLUUID& agent_id, const LLAvatarName& av_name) { onAvatarNameCache(agent_id, av_name); - }); + })); } } } void LLPanelGroupBulkImpl::onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name) { - if (mAvatarNameCacheConnection.connected()) + if (auto found = mAvatarNameCacheConnections.find(agent_id); found != mAvatarNameCacheConnections.end()) { - mAvatarNameCacheConnection.disconnect(); - } + if (found->second.connected()) + found->second.disconnect(); - std::vector<std::string> names; - uuid_vec_t agent_ids; - agent_ids.push_back(agent_id); - names.push_back(av_name.getCompleteName()); + mAvatarNameCacheConnections.erase(found); + } - addUsers(names, agent_ids); + addUsers({ av_name.getCompleteName() }, { agent_id }); } void LLPanelGroupBulkImpl::handleRemove() @@ -232,7 +233,7 @@ void LLPanelGroupBulkImpl::addUsers(const std::vector<std::string>& names, const } } -void LLPanelGroupBulkImpl::setGroupName(std::string name) +void LLPanelGroupBulkImpl::setGroupName(const std::string& name) { if (mGroupName) { @@ -337,12 +338,7 @@ void LLPanelGroupBulk::updateGroupData() void LLPanelGroupBulk::addUserCallback(const LLUUID& id, const LLAvatarName& av_name) { - std::vector<std::string> names; - uuid_vec_t agent_ids; - agent_ids.push_back(id); - names.push_back(av_name.getAccountName()); - - mImplementation->addUsers(names, agent_ids); + mImplementation->addUsers({ av_name.getAccountName() }, { id }); } void LLPanelGroupBulk::setCloseCallback(void (*close_callback)(void*), void* data) diff --git a/indra/newview/llpanelgroupbulkimpl.h b/indra/newview/llpanelgroupbulkimpl.h index 5515bd6d9a..f186ae5373 100644 --- a/indra/newview/llpanelgroupbulkimpl.h +++ b/indra/newview/llpanelgroupbulkimpl.h @@ -59,7 +59,7 @@ public: void handleSelection(); void addUsers(const std::vector<std::string>& names, const uuid_vec_t& agent_ids); - void setGroupName(std::string name); + void setGroupName(const std::string& name); public: @@ -84,7 +84,7 @@ public: void (*mCloseCallback)(void* data); void* mCloseCallbackUserData; - boost::signals2::connection mAvatarNameCacheConnection; + std::map<LLUUID, boost::signals2::connection> mAvatarNameCacheConnections; // The following are for the LLPanelGroupInvite subclass only. // These aren't needed for LLPanelGroupBulkBan, but if we have to add another diff --git a/indra/newview/llpanelgroupcreate.cpp b/indra/newview/llpanelgroupcreate.cpp index 4a370525ff..bc7b5caddf 100644 --- a/indra/newview/llpanelgroupcreate.cpp +++ b/indra/newview/llpanelgroupcreate.cpp @@ -85,6 +85,7 @@ bool LLPanelGroupCreate::postBuild() mInsignia = getChild<LLTextureCtrl>("insignia", true); mInsignia->setAllowLocalTexture(false); + mInsignia->setBakeTextureEnabled(false); mInsignia->setCanApplyImmediately(false); return true; diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index 0c331b4cec..38ae818910 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -211,6 +211,7 @@ void LLPanelGroupGeneral::setupCtrls(LLPanel* panel_group) { mInsignia->setCommitCallback(onCommitAny, this); mInsignia->setAllowLocalTexture(false); + mInsignia->setBakeTextureEnabled(false); } mFounderName = getChild<LLTextBox>("founder_name"); diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp index 41373cd7f5..7596c0eba8 100644 --- a/indra/newview/llpanellandmarkinfo.cpp +++ b/indra/newview/llpanellandmarkinfo.cpp @@ -41,6 +41,7 @@ #include "lllandmarkactions.h" #include "llparcel.h" #include "llslurl.h" +#include "llviewercontrol.h" #include "llviewerinventory.h" #include "llviewerparcelmgr.h" #include "llviewerregion.h" @@ -326,7 +327,8 @@ void LLPanelLandmarkInfo::displayItemInfo(const LLInventoryItem* pItem) } else { - std::string timeStr = getString("acquired_date"); + static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); + std::string timeStr = use_24h ? getString("acquired_date") : getString("acquired_date_ampm"); LLSD substitution; substitution["datetime"] = (S32) time_utc; LLStringUtil::format (timeStr, substitution); diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index ed80c8b732..fe9145bf71 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -183,7 +183,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, : LLPanel(), mCallback(callback), mCallbackData(cb_data), - mListener(new LLPanelLoginListener(this)), + mListener(std::make_unique<LLPanelLoginListener>(this)), mFirstLoginThisInstall(gSavedSettings.getBOOL("FirstLoginThisInstall")), mUsernameLength(0), mPasswordLength(0), diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index a5b4db0580..ad7aa57842 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -68,6 +68,7 @@ const std::string FILTERS_FILENAME("filters.xml"); const std::string ALL_ITEMS("All Items"); const std::string RECENT_ITEMS("Recent Items"); const std::string WORN_ITEMS("Worn Items"); +const std::string FAVORITES("Favorites"); static LLPanelInjector<LLPanelMainInventory> t_inventory("panel_main_inventory"); @@ -78,9 +79,9 @@ static LLPanelInjector<LLPanelMainInventory> t_inventory("panel_main_inventory") class LLFloaterInventoryFinder : public LLFloater { public: - LLFloaterInventoryFinder( LLPanelMainInventory* inventory_view); - virtual void draw(); - /*virtual*/ bool postBuild(); + LLFloaterInventoryFinder(LLPanelMainInventory* inventory_view); + void draw(); + bool postBuild(); void changeFilter(LLInventoryFilter* filter); void updateElementsFromFilter(); bool getCheckShowEmpty(); @@ -90,17 +91,35 @@ public: void onCreatorSelfFilterCommit(); void onCreatorOtherFilterCommit(); - static void onTimeAgo(LLUICtrl*, void *); - static void onCloseBtn(void* user_data); - static void selectAllTypes(void* user_data); - static void selectNoTypes(void* user_data); + void onTimeAgo(); + void onCloseBtn(); + void selectAllTypes(); + void selectNoTypes(); private: - LLPanelMainInventory* mPanelMainInventory; - LLSpinCtrl* mSpinSinceDays; - LLSpinCtrl* mSpinSinceHours; - LLCheckBoxCtrl* mCreatorSelf; - LLCheckBoxCtrl* mCreatorOthers; - LLInventoryFilter* mFilter; + LLPanelMainInventory* mPanelMainInventory{ nullptr }; + LLSpinCtrl* mSpinSinceDays{ nullptr }; + LLSpinCtrl* mSpinSinceHours{ nullptr }; + LLCheckBoxCtrl* mCreatorSelf{ nullptr }; + LLCheckBoxCtrl* mCreatorOthers{ nullptr }; + LLInventoryFilter* mFilter{ nullptr }; + + LLCheckBoxCtrl* mCheckAnimation{ nullptr }; + LLCheckBoxCtrl* mCheckCallingCard{ nullptr }; + LLCheckBoxCtrl* mCheckClothing{ nullptr }; + LLCheckBoxCtrl* mCheckGesture{ nullptr }; + LLCheckBoxCtrl* mCheckLandmark{ nullptr }; + LLCheckBoxCtrl* mCheckMaterial{ nullptr }; + LLCheckBoxCtrl* mCheckNotecard{ nullptr }; + LLCheckBoxCtrl* mCheckObject{ nullptr }; + LLCheckBoxCtrl* mCheckScript{ nullptr }; + LLCheckBoxCtrl* mCheckSounds{ nullptr }; + LLCheckBoxCtrl* mCheckTexture{ nullptr }; + LLCheckBoxCtrl* mCheckSnapshot{ nullptr }; + LLCheckBoxCtrl* mCheckSettings{ nullptr }; + LLCheckBoxCtrl* mCheckShowEmpty{ nullptr }; + LLCheckBoxCtrl* mCheckSinceLogoff{ nullptr }; + + LLRadioGroup* mRadioDateSearchDirection{ nullptr }; }; ///---------------------------------------------------------------------------- @@ -196,6 +215,17 @@ bool LLPanelMainInventory::postBuild() worn_filter.markDefault(); mWornItemsPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mWornItemsPanel, _1, _2)); } + + LLInventoryPanel* favorites_panel = getChild<LLInventoryPanel>(FAVORITES); + if (favorites_panel) + { + favorites_panel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER)); + LLInventoryFilter& favorites_filter = favorites_panel->getFilter(); + favorites_filter.setEmptyLookupMessage("InventoryNoMatchingFavorites"); + favorites_filter.markDefault(); + favorites_panel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, favorites_panel, _1, _2)); + } + mSearchTypeCombo = getChild<LLComboBox>("search_type"); if(mSearchTypeCombo) { @@ -560,7 +590,8 @@ void LLPanelMainInventory::doCreate(const LLSD& userdata) } else { - menu_create_inventory_item(getPanel(), NULL, userdata); + selectAllItemsPanel(); + menu_create_inventory_item(mAllItemsPanel, NULL, userdata); } } @@ -734,7 +765,6 @@ bool LLPanelMainInventory::filtersVisible(void* user_data) void LLPanelMainInventory::onClearSearch() { bool initially_active = false; - LLFloater *finder = getFinder(); if (mActivePanel && (getActivePanel() != mWornItemsPanel)) { initially_active = mActivePanel->getFilter().isNotDefault(); @@ -743,9 +773,9 @@ void LLPanelMainInventory::onClearSearch() mActivePanel->setFilterLinks(LLInventoryFilter::FILTERLINK_INCLUDE_LINKS); } - if (finder) + if (LLFloaterInventoryFinder* finder = getFinder()) { - LLFloaterInventoryFinder::selectAllTypes(finder); + finder->selectAllTypes(); } // re-open folders that were initially open in case filter was active @@ -1145,36 +1175,53 @@ bool LLFloaterInventoryFinder::postBuild() const LLRect& viewrect = mPanelMainInventory->getRect(); setRect(LLRect(viewrect.mLeft - getRect().getWidth(), viewrect.mTop, viewrect.mLeft, viewrect.mTop - getRect().getHeight())); - childSetAction("All", selectAllTypes, this); - childSetAction("None", selectNoTypes, this); + childSetAction("All", [this](LLUICtrl*, const LLSD&) { selectAllTypes(); }); + childSetAction("None", [this](LLUICtrl*, const LLSD&) { selectNoTypes(); }); mSpinSinceHours = getChild<LLSpinCtrl>("spin_hours_ago"); - childSetCommitCallback("spin_hours_ago", onTimeAgo, this); + mSpinSinceHours->setCommitCallback([this](LLUICtrl*, const LLSD&) { onTimeAgo(); }); mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago"); - childSetCommitCallback("spin_days_ago", onTimeAgo, this); + mSpinSinceDays->setCommitCallback([this](LLUICtrl*, const LLSD&) { onTimeAgo(); }); mCreatorSelf = getChild<LLCheckBoxCtrl>("check_created_by_me"); mCreatorOthers = getChild<LLCheckBoxCtrl>("check_created_by_others"); mCreatorSelf->setCommitCallback(boost::bind(&LLFloaterInventoryFinder::onCreatorSelfFilterCommit, this)); mCreatorOthers->setCommitCallback(boost::bind(&LLFloaterInventoryFinder::onCreatorOtherFilterCommit, this)); - childSetAction("Close", onCloseBtn, this); + mCheckAnimation = getChild<LLCheckBoxCtrl>("check_animation"); + mCheckCallingCard = getChild<LLCheckBoxCtrl>("check_calling_card"); + mCheckClothing = getChild<LLCheckBoxCtrl>("check_clothing"); + mCheckGesture = getChild<LLCheckBoxCtrl>("check_gesture"); + mCheckLandmark = getChild<LLCheckBoxCtrl>("check_landmark"); + mCheckMaterial = getChild<LLCheckBoxCtrl>("check_material"); + mCheckNotecard = getChild<LLCheckBoxCtrl>("check_notecard"); + mCheckObject = getChild<LLCheckBoxCtrl>("check_object"); + mCheckScript = getChild<LLCheckBoxCtrl>("check_script"); + mCheckSounds = getChild<LLCheckBoxCtrl>("check_sound"); + mCheckTexture = getChild<LLCheckBoxCtrl>("check_texture"); + mCheckSnapshot = getChild<LLCheckBoxCtrl>("check_snapshot"); + mCheckSettings = getChild<LLCheckBoxCtrl>("check_settings"); + mCheckShowEmpty = getChild<LLCheckBoxCtrl>("check_show_empty"); + mCheckSinceLogoff = getChild<LLCheckBoxCtrl>("check_since_logoff"); + + mRadioDateSearchDirection = getChild<LLRadioGroup>("date_search_direction"); + + childSetAction("Close", [this](LLUICtrl*, const LLSD&) { onCloseBtn(); }); updateElementsFromFilter(); + return true; } -void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data) -{ - LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data; - if (!self) return; - if ( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) +void LLFloaterInventoryFinder::onTimeAgo() +{ + if (mSpinSinceDays->get() || mSpinSinceHours->get()) { - self->getChild<LLUICtrl>("check_since_logoff")->setValue(false); + mCheckSinceLogoff->setValue(false); - U32 days = (U32)self->mSpinSinceDays->get(); - U32 hours = (U32)self->mSpinSinceHours->get(); + U32 days = (U32)mSpinSinceDays->get(); + U32 hours = (U32)mSpinSinceHours->get(); if (hours >= 24) { // Try to handle both cases of spinner clicking and text input in a sensible fashion as best as possible. @@ -1190,11 +1237,11 @@ void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data) days = hours / 24; } hours = (U32)hours % 24; - self->mSpinSinceHours->setFocus(false); - self->mSpinSinceDays->setFocus(false); - self->mSpinSinceDays->set((F32)days); - self->mSpinSinceHours->set((F32)hours); - self->mSpinSinceHours->setFocus(true); + mSpinSinceHours->setFocus(false); + mSpinSinceDays->setFocus(false); + mSpinSinceDays->set((F32)days); + mSpinSinceHours->set((F32)hours); + mSpinSinceHours->setFocus(true); } } } @@ -1223,29 +1270,28 @@ void LLFloaterInventoryFinder::updateElementsFromFilter() // update the ui elements setTitle(mFilter->getName()); - getChild<LLUICtrl>("check_animation")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_ANIMATION)); - - getChild<LLUICtrl>("check_calling_card")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_CALLINGCARD)); - getChild<LLUICtrl>("check_clothing")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE)); - getChild<LLUICtrl>("check_gesture")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE)); - getChild<LLUICtrl>("check_landmark")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK)); - getChild<LLUICtrl>("check_material")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_MATERIAL)); - getChild<LLUICtrl>("check_notecard")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD)); - getChild<LLUICtrl>("check_object")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT)); - getChild<LLUICtrl>("check_script")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_LSL)); - getChild<LLUICtrl>("check_sound")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_SOUND)); - getChild<LLUICtrl>("check_texture")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE)); - getChild<LLUICtrl>("check_snapshot")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT)); - getChild<LLUICtrl>("check_settings")->setValue((S32)(filter_types & 0x1 << LLInventoryType::IT_SETTINGS)); - getChild<LLUICtrl>("check_show_empty")->setValue(show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS); + mCheckAnimation->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_ANIMATION)); + mCheckCallingCard->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_CALLINGCARD)); + mCheckClothing->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE)); + mCheckGesture->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE)); + mCheckLandmark->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK)); + mCheckMaterial->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_MATERIAL)); + mCheckNotecard->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD)); + mCheckObject->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT)); + mCheckScript->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_LSL)); + mCheckSounds->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_SOUND)); + mCheckTexture->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE)); + mCheckSnapshot->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT)); + mCheckSettings->setValue((S32)(filter_types & 0x1 << LLInventoryType::IT_SETTINGS)); + mCheckShowEmpty->setValue(show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS); - getChild<LLUICtrl>("check_created_by_me")->setValue(show_created_by_me); - getChild<LLUICtrl>("check_created_by_others")->setValue(show_created_by_others); + mCreatorSelf->setValue(show_created_by_me); + mCreatorOthers->setValue(show_created_by_others); - getChild<LLUICtrl>("check_since_logoff")->setValue(mFilter->isSinceLogoff()); + mCheckSinceLogoff->setValue(mFilter->isSinceLogoff()); mSpinSinceHours->set((F32)(hours % 24)); mSpinSinceDays->set((F32)(hours / 24)); - getChild<LLRadioGroup>("date_search_direction")->setSelectedIndex(date_search_direction); + mRadioDateSearchDirection->setSelectedIndex(date_search_direction); } void LLFloaterInventoryFinder::draw() @@ -1253,80 +1299,80 @@ void LLFloaterInventoryFinder::draw() U64 filter = 0xffffffffffffffffULL; bool filtered_by_all_types = true; - if (!getChild<LLUICtrl>("check_animation")->getValue()) + if (!mCheckAnimation->getValue()) { filter &= ~(0x1 << LLInventoryType::IT_ANIMATION); filtered_by_all_types = false; } - if (!getChild<LLUICtrl>("check_calling_card")->getValue()) + if (!mCheckCallingCard->getValue()) { filter &= ~(0x1 << LLInventoryType::IT_CALLINGCARD); filtered_by_all_types = false; } - if (!getChild<LLUICtrl>("check_clothing")->getValue()) + if (!mCheckClothing->getValue()) { filter &= ~(0x1 << LLInventoryType::IT_WEARABLE); filtered_by_all_types = false; } - if (!getChild<LLUICtrl>("check_gesture")->getValue()) + if (!mCheckGesture->getValue()) { filter &= ~(0x1 << LLInventoryType::IT_GESTURE); filtered_by_all_types = false; } - if (!getChild<LLUICtrl>("check_landmark")->getValue()) + if (!mCheckLandmark->getValue()) { filter &= ~(0x1 << LLInventoryType::IT_LANDMARK); filtered_by_all_types = false; } - if (!getChild<LLUICtrl>("check_material")->getValue()) + if (!mCheckMaterial->getValue()) { filter &= ~(0x1 << LLInventoryType::IT_MATERIAL); filtered_by_all_types = false; } - if (!getChild<LLUICtrl>("check_notecard")->getValue()) + if (!mCheckNotecard->getValue()) { filter &= ~(0x1 << LLInventoryType::IT_NOTECARD); filtered_by_all_types = false; } - if (!getChild<LLUICtrl>("check_object")->getValue()) + if (!mCheckObject->getValue()) { filter &= ~(0x1 << LLInventoryType::IT_OBJECT); filter &= ~(0x1 << LLInventoryType::IT_ATTACHMENT); filtered_by_all_types = false; } - if (!getChild<LLUICtrl>("check_script")->getValue()) + if (!mCheckScript->getValue()) { filter &= ~(0x1 << LLInventoryType::IT_LSL); filtered_by_all_types = false; } - if (!getChild<LLUICtrl>("check_sound")->getValue()) + if (!mCheckSounds->getValue()) { filter &= ~(0x1 << LLInventoryType::IT_SOUND); filtered_by_all_types = false; } - if (!getChild<LLUICtrl>("check_texture")->getValue()) + if (!mCheckTexture->getValue()) { filter &= ~(0x1 << LLInventoryType::IT_TEXTURE); filtered_by_all_types = false; } - if (!getChild<LLUICtrl>("check_snapshot")->getValue()) + if (!mCheckSnapshot->getValue()) { filter &= ~(0x1 << LLInventoryType::IT_SNAPSHOT); filtered_by_all_types = false; } - if (!getChild<LLUICtrl>("check_settings")->getValue()) + if (!mCheckSettings->getValue()) { filter &= ~(0x1 << LLInventoryType::IT_SETTINGS); filtered_by_all_types = false; @@ -1444,65 +1490,56 @@ void LLFloaterInventoryFinder::onCreatorOtherFilterCommit() bool LLFloaterInventoryFinder::getCheckShowEmpty() { - return getChild<LLUICtrl>("check_show_empty")->getValue(); + return mCheckShowEmpty->getValue(); } bool LLFloaterInventoryFinder::getCheckSinceLogoff() { - return getChild<LLUICtrl>("check_since_logoff")->getValue(); + return mCheckSinceLogoff->getValue(); } U32 LLFloaterInventoryFinder::getDateSearchDirection() { - return getChild<LLRadioGroup>("date_search_direction")->getSelectedIndex(); + return mRadioDateSearchDirection->getSelectedIndex(); } -void LLFloaterInventoryFinder::onCloseBtn(void* user_data) +void LLFloaterInventoryFinder::onCloseBtn() { - LLFloaterInventoryFinder* finderp = (LLFloaterInventoryFinder*)user_data; - finderp->closeFloater(); + closeFloater(); } -// static -void LLFloaterInventoryFinder::selectAllTypes(void* user_data) +void LLFloaterInventoryFinder::selectAllTypes() { - LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data; - if(!self) return; - - self->getChild<LLUICtrl>("check_animation")->setValue(true); - self->getChild<LLUICtrl>("check_calling_card")->setValue(true); - self->getChild<LLUICtrl>("check_clothing")->setValue(true); - self->getChild<LLUICtrl>("check_gesture")->setValue(true); - self->getChild<LLUICtrl>("check_landmark")->setValue(true); - self->getChild<LLUICtrl>("check_material")->setValue(true); - self->getChild<LLUICtrl>("check_notecard")->setValue(true); - self->getChild<LLUICtrl>("check_object")->setValue(true); - self->getChild<LLUICtrl>("check_script")->setValue(true); - self->getChild<LLUICtrl>("check_sound")->setValue(true); - self->getChild<LLUICtrl>("check_texture")->setValue(true); - self->getChild<LLUICtrl>("check_snapshot")->setValue(true); - self->getChild<LLUICtrl>("check_settings")->setValue(true); + mCheckAnimation->setValue(true); + mCheckCallingCard->setValue(true); + mCheckClothing->setValue(true); + mCheckGesture->setValue(true); + mCheckLandmark->setValue(true); + mCheckMaterial->setValue(true); + mCheckNotecard->setValue(true); + mCheckObject->setValue(true); + mCheckScript->setValue(true); + mCheckSounds->setValue(true); + mCheckTexture->setValue(true); + mCheckSnapshot->setValue(true); + mCheckSettings->setValue(true); } -//static -void LLFloaterInventoryFinder::selectNoTypes(void* user_data) +void LLFloaterInventoryFinder::selectNoTypes() { - LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data; - if(!self) return; - - self->getChild<LLUICtrl>("check_animation")->setValue(false); - self->getChild<LLUICtrl>("check_calling_card")->setValue(false); - self->getChild<LLUICtrl>("check_clothing")->setValue(false); - self->getChild<LLUICtrl>("check_gesture")->setValue(false); - self->getChild<LLUICtrl>("check_landmark")->setValue(false); - self->getChild<LLUICtrl>("check_material")->setValue(false); - self->getChild<LLUICtrl>("check_notecard")->setValue(false); - self->getChild<LLUICtrl>("check_object")->setValue(false); - self->getChild<LLUICtrl>("check_script")->setValue(false); - self->getChild<LLUICtrl>("check_sound")->setValue(false); - self->getChild<LLUICtrl>("check_texture")->setValue(false); - self->getChild<LLUICtrl>("check_snapshot")->setValue(false); - self->getChild<LLUICtrl>("check_settings")->setValue(false); + mCheckAnimation->setValue(false); + mCheckCallingCard->setValue(false); + mCheckClothing->setValue(false); + mCheckGesture->setValue(false); + mCheckLandmark->setValue(false); + mCheckMaterial->setValue(false); + mCheckNotecard->setValue(false); + mCheckObject->setValue(false); + mCheckScript->setValue(false); + mCheckSounds->setValue(false); + mCheckTexture->setValue(false); + mCheckSnapshot->setValue(false); + mCheckSettings->setValue(false); } ////////////////////////////////////////////////////////////////////////////////// @@ -1582,7 +1619,7 @@ void LLPanelMainInventory::initInventoryViews() void LLPanelMainInventory::toggleViewMode() { - if(mSingleFolderMode && isCombinationViewMode()) + if(mSingleFolderMode && isCombinationViewMode() && mCombinationGalleryPanel->getRootFolder().notNull()) { mCombinationInventoryPanel->getRootFolder()->setForceArrange(false); } @@ -2030,7 +2067,11 @@ void LLPanelMainInventory::onVisibilityChange( bool new_visibility ) { menu->setVisible(false); } - getActivePanel()->getRootFolder()->finishRenamingItem(); + LLFolderView* root_folder = mActivePanel ? mActivePanel->getRootFolder() : nullptr; + if (root_folder) + { + root_folder->finishRenamingItem(); + } } } @@ -2043,7 +2084,8 @@ bool LLPanelMainInventory::isSaveTextureEnabled(const LLSD& userdata) } else { - LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem(); + LLFolderView* root_folder = getActivePanel() ? getActivePanel()->getRootFolder() : nullptr; + LLFolderViewItem* current_item = root_folder ? root_folder->getCurSelectedItem() : nullptr; if (current_item) { inv_item = dynamic_cast<LLViewerInventoryItem*>(static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getInventoryObject()); @@ -2439,8 +2481,6 @@ void LLPanelMainInventory::updateCombinationVisibility() mCombinationGalleryPanel->handleModifiedFilter(); } - getActivePanel()->getRootFolder(); - if (mReshapeInvLayout && show_inv_pane && (mCombinationGalleryPanel->hasVisibleItems() || mCombinationGalleryPanel->areViewsInitialized()) @@ -2497,8 +2537,12 @@ void LLPanelMainInventory::updateCombinationVisibility() && mCombinationInventoryPanel->areViewsInitialized()) { mCombinationInventoryPanel->setSelectionByID(mCombInvUUIDNeedsRename, true); - mCombinationInventoryPanel->getRootFolder()->scrollToShowSelection(); - mCombinationInventoryPanel->getRootFolder()->setNeedsAutoRename(true); + LLFolderView* root = mCombinationInventoryPanel->getRootFolder(); + if (root) + { + root->scrollToShowSelection(); + root->setNeedsAutoRename(true); + } mCombInvUUIDNeedsRename.setNull(); } } diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp index 6e4e9f426d..68e2808a83 100644 --- a/indra/newview/llpanelmediasettingssecurity.cpp +++ b/indra/newview/llpanelmediasettingssecurity.cpp @@ -220,7 +220,7 @@ const std::string LLPanelMediaSettingsSecurity::makeValidUrl( const std::string& if ( candidate_url.scheme().empty() ) { // build a URL comprised of default scheme and the original fragment - const std::string default_scheme( "http://" ); + const std::string default_scheme( "https://" ); return default_scheme + src_url; }; diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index 0a3a2e753a..23e6a9fbcf 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -2267,19 +2267,21 @@ void LLPanelObject::onCopyParams() if (objectp->getParameterEntryInUse(LLNetworkData::PARAMS_SCULPT)) { LLSculptParams *sculpt_params = (LLSculptParams *)objectp->getParameterEntry(LLNetworkData::PARAMS_SCULPT); - - LLUUID texture_id = sculpt_params->getSculptTexture(); - if (get_can_copy_texture(texture_id)) - { - LL_DEBUGS("FloaterTools") << "Recording texture" << LL_ENDL; - mClipboardParams["sculpt"]["id"] = texture_id; - } - else + if (sculpt_params) { - mClipboardParams["sculpt"]["id"] = SCULPT_DEFAULT_TEXTURE; - } + LLUUID texture_id = sculpt_params->getSculptTexture(); + if (get_can_copy_texture(texture_id)) + { + LL_DEBUGS("FloaterTools") << "Recording texture" << LL_ENDL; + mClipboardParams["sculpt"]["id"] = texture_id; + } + else + { + mClipboardParams["sculpt"]["id"] = SCULPT_DEFAULT_TEXTURE; + } - mClipboardParams["sculpt"]["type"] = sculpt_params->getSculptType(); + mClipboardParams["sculpt"]["type"] = sculpt_params->getSculptType(); + } } } diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index ef7986603b..a31a54bb67 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -129,6 +129,7 @@ public: virtual void navigateToFolder(bool new_window = false, bool change_mode = false) {} virtual bool isItemRenameable() const; virtual bool renameItem(const std::string& new_name); + virtual bool isFavorite() const { return false; } virtual bool isItemMovable() const; virtual bool isItemRemovable(bool check_worn = true) const; virtual bool removeItem(); @@ -384,10 +385,7 @@ bool LLTaskInvFVBridge::removeItem() return true; } - LLSD payload; - payload["task_id"] = mPanel->getTaskUUID(); - payload["inventory_ids"].append(mUUID); - LLNotificationsUtil::add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel)); + LLNotificationsUtil::add("CantModifyContentInNoModTask"); return false; } } @@ -410,13 +408,7 @@ void LLTaskInvFVBridge::removeBatch(std::vector<LLFolderViewModelItem*>& batch) if (!object->permModify()) { - LLSD payload; - payload["task_id"] = mPanel->getTaskUUID(); - for (LLFolderViewModelItem* item : batch) - { - payload["inventory_ids"].append(((LLTaskInvFVBridge*)item)->getUUID()); - } - LLNotificationsUtil::add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel)); + LLNotificationsUtil::add("CantModifyContentInNoModTask"); } else { @@ -1364,7 +1356,23 @@ bool LLPanelObjectInventory::postBuild() void LLPanelObjectInventory::doToSelected(const LLSD& userdata) { - LLInventoryAction::doToSelected(&gInventory, mFolders, userdata.asString()); + std::string action = userdata.asString(); + if ("rename" == action || "delete" == action) + { + LLViewerObject* objectp = gObjectList.findObject(mTaskUUID); + if (objectp && !objectp->permModify()) + { + LLNotificationsUtil::add("CantModifyContentInNoModTask"); + } + else + { + LLInventoryAction::doToSelected(&gInventory, mFolders, action); + } + } + else + { + LLInventoryAction::doToSelected(&gInventory, mFolders, action); + } } void LLPanelObjectInventory::clearContents() diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 4cd4afaa5a..a9e860d2ef 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -404,7 +404,9 @@ LLPanelOutfitEdit::LLPanelOutfitEdit() mWearableListManager(NULL), mPlusBtn(NULL), mWearablesGearMenuBtn(NULL), - mGearMenuBtn(NULL) + mGearMenuBtn(NULL), + mStatus(NULL), + mCurrentOutfitName(NULL) { mSavedFolderState = new LLSaveFolderState(); mSavedFolderState->setApply(false); diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index 47c02793a3..e2e2cf1a61 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -33,6 +33,7 @@ #include "llfloatersidepanelcontainer.h" #include "llinventoryfunctions.h" #include "llinventorymodelbackgroundfetch.h" +#include "llmenubutton.h" #include "llnotificationsutil.h" #include "lloutfitgallery.h" #include "lloutfitobserver.h" @@ -53,12 +54,17 @@ static const std::string SAVE_BTN("save_btn"); static LLPanelInjector<LLPanelOutfitsInventory> t_inventory("panel_outfits_inventory"); -LLPanelOutfitsInventory::LLPanelOutfitsInventory() : - mMyOutfitsPanel(NULL), - mCurrentOutfitPanel(NULL), - mActivePanel(NULL), - mAppearanceTabs(NULL), - mInitialized(false) +LLPanelOutfitsInventory::LLPanelOutfitsInventory() + : mMyOutfitsPanel(nullptr) + , mCurrentOutfitPanel(nullptr) + , mActivePanel(nullptr) + , mAppearanceTabs(nullptr) + , mInitialized(false) + , mGearMenu(nullptr) + , mSortMenu(nullptr) + , mTrashBtn(nullptr) + , mSortMenuPanel(nullptr) + , mTrashMenuPanel(nullptr) { gAgentWearables.addLoadedCallback(boost::bind(&LLPanelOutfitsInventory::onWearablesLoaded, this)); gAgentWearables.addLoadingStartedCallback(boost::bind(&LLPanelOutfitsInventory::onWearablesLoading, this)); @@ -75,6 +81,9 @@ LLPanelOutfitsInventory::~LLPanelOutfitsInventory() { gSavedSettings.setS32("LastAppearanceTab", mAppearanceTabs->getCurrentPanelIndex()); } + mGearMenuConnection.disconnect(); + mSortMenuConnection.disconnect(); + mTrashMenuConnection.disconnect(); } // virtual @@ -258,6 +267,22 @@ void LLPanelOutfitsInventory::initListCommandsHandlers() mOutfitGalleryPanel->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this)); } +void LLPanelOutfitsInventory::setMenuButtons(LLMenuButton* gear_menu, LLMenuButton* sort_menu, LLButton* trash_btn, LLPanel* sort_menu_panel, LLPanel* trash_menu_panel) +{ + mGearMenu = gear_menu; + mSortMenu = sort_menu; + mTrashBtn = trash_btn; + mSortMenuPanel = sort_menu_panel; + mTrashMenuPanel = trash_menu_panel; + + mGearMenuConnection.disconnect(); + mSortMenuConnection.disconnect(); + mTrashMenuConnection.disconnect(); + mGearMenuConnection = mGearMenu->setMouseDownCallback(boost::bind(&LLPanelOutfitsInventory::onGearMouseDown, this)); + mSortMenuConnection = mSortMenu->setMouseDownCallback(boost::bind(&LLPanelOutfitsInventory::onGearMouseDown, this)); + mTrashMenuConnection = mTrashBtn->setClickedCallback(boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this)); +} + void LLPanelOutfitsInventory::updateListCommands() { bool trash_enabled = isActionEnabled("delete"); @@ -284,6 +309,14 @@ void LLPanelOutfitsInventory::onTrashButtonClick() } } +void LLPanelOutfitsInventory::onGearMouseDown() +{ + if (mActivePanel) + { + mActivePanel->updateMenuItemsVisibility(); + } +} + bool LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata) { return mActivePanel && mActivePanel->isActionEnabled(userdata); @@ -320,6 +353,28 @@ void LLPanelOutfitsInventory::onTabChange() mActivePanel->checkFilterSubString(); mActivePanel->onOpen(LLSD()); + if (mGearMenu) + { + mGearMenu->setMenu(mActivePanel->getGearMenu(), LLMenuButton::MP_BOTTOM_LEFT); + } + if (mSortMenu && mSortMenuPanel) + { + LLToggleableMenu* menu = mActivePanel->getSortMenu(); + if (menu) + { + mSortMenu->setMenu(menu, LLMenuButton::MP_BOTTOM_LEFT); + mSortMenuPanel->setVisible(true); + } + else + { + mSortMenuPanel->setVisible(false); + } + } + if (mTrashMenuPanel) + { + mTrashMenuPanel->setVisible(mActivePanel->getTrashMenuVisible()); + } + updateVerbs(); } diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h index e046681e95..29f7eb44f7 100644 --- a/indra/newview/llpaneloutfitsinventory.h +++ b/indra/newview/llpaneloutfitsinventory.h @@ -30,11 +30,13 @@ #include "llpanel.h" +class LLButton; class LLOutfitGallery; class LLOutfitsList; class LLOutfitListGearMenuBase; class LLPanelAppearanceTab; class LLPanelWearing; +class LLMenuButton; class LLMenuGL; class LLSidepanelAppearance; class LLTabContainer; @@ -63,6 +65,13 @@ public: bool isCOFPanelActive() const; + void setMenuButtons( + LLMenuButton* gear_menu, + LLMenuButton* sort_menu, + LLButton* trash_btn, + LLPanel* sort_menu_panel, + LLPanel* trash_menu_panel); + protected: void updateVerbs(); @@ -92,20 +101,29 @@ protected: void initListCommandsHandlers(); void updateListCommands(); void onWearButtonClick(); - void showGearMenu(); void onTrashButtonClick(); + void onGearMouseDown(); bool isActionEnabled(const LLSD& userdata); void setWearablesLoading(bool val); void onWearablesLoaded(); void onWearablesLoading(); private: LLPanel* mListCommands; - LLMenuGL* mMenuAdd; LLButton* mWearBtn = nullptr; // List Commands // ////////////////////////////////////////////////////////////////////////////////// bool mInitialized; + + // not owned items + LLMenuButton* mGearMenu; + LLMenuButton* mSortMenu; + LLButton* mTrashBtn; + LLPanel* mSortMenuPanel; + LLPanel* mTrashMenuPanel; + boost::signals2::connection mGearMenuConnection; + boost::signals2::connection mSortMenuConnection; + boost::signals2::connection mTrashMenuConnection; }; #endif //LL_LLPANELOUTFITSINVENTORY_H diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 72fa553023..54ce205fb0 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -160,6 +160,7 @@ public: mAvatarsPositions[*id_it] = *pos_it; } }; + const id_to_pos_map_t& getAvatarsPositions() const { return mAvatarsPositions; } protected: virtual bool doCompare(const LLAvatarListItem* item1, const LLAvatarListItem* item2) const @@ -251,7 +252,7 @@ static LLPanelInjector<LLPanelPeople> t_people("panel_people"); class LLPanelPeople::Updater { public: - typedef boost::function<void()> callback_t; + typedef std::function<void()> callback_t; Updater(callback_t cb) : mCallback(cb) { @@ -841,10 +842,15 @@ void LLPanelPeople::updateNearbyList() std::vector<LLVector3d> positions; - LLWorld::getInstance()->getAvatars(&mNearbyList->getIDs(), &positions, gAgent.getPositionGlobal(), gSavedSettings.getF32("MPVNearMeRange")); + LLWorld::getInstance()->getAvatars(&mNearbyList->getIDs(), &positions, gAgent.getPositionGlobal(), gSavedSettings.getF32("NearMeRange")); mNearbyList->setDirty(); +#ifdef LL_DISCORD + if (gSavedSettings.getBOOL("EnableDiscord")) + LLAppViewer::updateDiscordPartyMaxSize((S32)mNearbyList->getIDs().size()); +#endif DISTANCE_COMPARATOR.updateAvatarsPositions(positions, mNearbyList->getIDs()); + gAgent.setAvatarsPositions(DISTANCE_COMPARATOR.getAvatarsPositions()); LLActiveSpeakerMgr::instance().update(true); } diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp index 04b8af49c1..794ae4ad44 100644 --- a/indra/newview/llpanelpeoplemenus.cpp +++ b/indra/newview/llpanelpeoplemenus.cpp @@ -155,11 +155,15 @@ void PeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags) bool PeopleContextMenu::enableContextMenuItem(const LLSD& userdata) { + std::string item = userdata.asString(); if(gAgent.getID() == mUUIDs.front()) { + if (item == std::string("can_zoom_in")) + { + return true; + } return false; } - std::string item = userdata.asString(); // Note: can_block and can_delete is used only for one person selected menu // so we don't need to go over all uuids. @@ -351,7 +355,10 @@ void PeopleContextMenu::eject() avatar = (LLVOAvatar*) object; } } - if (!avatar) return; + + if (!avatar) + return; + LLSD payload; payload["avatar_id"] = avatar->getID(); std::string fullname = avatar->getFullname(); diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index 0ce1f0f9d3..cbf5819fda 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -176,7 +176,7 @@ bool LLPanelPermissions::postBuild() childSetCommitCallback("sale type",LLPanelPermissions::onCommitSaleType,this); - childSetCommitCallback("Edit Cost", LLPanelPermissions::onCommitSaleInfo, this); + childSetCommitCallback("Edit Cost", LLPanelPermissions::onCommitSalePrice, this); childSetCommitCallback("checkbox next owner can modify",LLPanelPermissions::onCommitNextOwnerModify,this); childSetCommitCallback("checkbox next owner can copy",LLPanelPermissions::onCommitNextOwnerCopy,this); @@ -781,7 +781,9 @@ void LLPanelPermissions::refresh() if (has_change_sale_ability && (owner_mask_on & PERM_TRANSFER)) { - getChildView("checkbox for sale")->setEnabled(can_transfer || (!can_transfer && num_for_sale)); + bool change_sale_allowed = can_transfer || (!can_transfer && num_for_sale); + getChildView("checkbox for sale")->setEnabled(change_sale_allowed); + getChildView("Edit Cost")->setEnabled(change_sale_allowed && !is_for_sale_mixed); // Set the checkbox to tentative if the prices of each object selected // are not the same. getChild<LLUICtrl>("checkbox for sale")->setTentative( is_for_sale_mixed); @@ -1175,6 +1177,7 @@ void LLPanelPermissions::onCommitName(LLUICtrl*, void* data) { LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); new_item->rename(tb->getText()); + new_item->setComplete(true); // to not err at updateServer new_item->updateServer(false); gInventory.updateItem(new_item); gInventory.notifyObservers(); @@ -1223,6 +1226,16 @@ void LLPanelPermissions::onCommitSaleType(LLUICtrl*, void* data) self->setAllSaleInfo(); } +void LLPanelPermissions::onCommitSalePrice(LLUICtrl *, void *data) +{ + LLPanelPermissions *self = (LLPanelPermissions *) data; + LLCheckBoxCtrl *checkPurchase = self->getChild<LLCheckBoxCtrl>("checkbox for sale"); + if (checkPurchase && checkPurchase->get()) + { + self->setAllSaleInfo(); + } +} + void LLPanelPermissions::setAllSaleInfo() { LL_INFOS() << "LLPanelPermissions::setAllSaleInfo()" << LL_ENDL; diff --git a/indra/newview/llpanelpermissions.h b/indra/newview/llpanelpermissions.h index 77129434ed..12e88361c9 100644 --- a/indra/newview/llpanelpermissions.h +++ b/indra/newview/llpanelpermissions.h @@ -77,6 +77,7 @@ protected: static void onCommitSaleInfo(LLUICtrl* ctrl, void* data); static void onCommitSaleType(LLUICtrl* ctrl, void* data); + static void onCommitSalePrice(LLUICtrl *ctrl, void *data); void setAllSaleInfo(); static void onCommitClickAction(LLUICtrl* ctrl, void*); diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index 87f05f2028..c380b6860f 100644 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -517,7 +517,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, std::string parcel_owner = LLSLURL("agent", parcel->getOwnerID(), "inspect").getSLURLString(); mParcelOwner->setText(parcel_owner); - LLAvatarNameCache::get(region->getOwner(), boost::bind(&LLPanelPlaceInfo::onAvatarNameCache, _1, _2, mRegionOwnerText)); + mAvatarNameCacheConnection = LLAvatarNameCache::get(region->getOwner(), boost::bind(&LLPanelPlaceInfo::onAvatarNameCache, _1, _2, mRegionOwnerText)); mRegionGroupText->setText( getString("none_text")); } @@ -548,7 +548,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID(); if(auth_buyer_id.notNull()) { - LLAvatarNameCache::get(auth_buyer_id, boost::bind(&LLPanelPlaceInfo::onAvatarNameCache, _1, _2, mSaleToText)); + mAvatarNameCacheConnection = LLAvatarNameCache::get(auth_buyer_id, boost::bind(&LLPanelPlaceInfo::onAvatarNameCache, _1, _2, mSaleToText)); // Show sales info to a specific person or a group he belongs to. if (auth_buyer_id != gAgent.getID() && !gAgent.isInGroup(auth_buyer_id)) diff --git a/indra/newview/llpanelplaceprofile.h b/indra/newview/llpanelplaceprofile.h index f562be0f5d..0c161198f8 100644 --- a/indra/newview/llpanelplaceprofile.h +++ b/indra/newview/llpanelplaceprofile.h @@ -118,6 +118,8 @@ private: LLTextEditor* mResaleText; LLTextBox* mSaleToText; LLAccordionCtrl* mAccordionCtrl; + + boost::signals2::scoped_connection mAvatarNameCacheConnection; }; #endif // LL_LLPANELPLACEPROFILE_H diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 7deb1d9fd4..5435a79e16 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -651,7 +651,7 @@ void LLPanelPlaces::onFilterEdit(const std::string& search_string, bool force_fi void LLPanelPlaces::onTabSelected() { mActivePanel = dynamic_cast<LLPanelPlacesTab*>(mTabContainer->getCurrentPanel()); - if (!mActivePanel) + if (!mActivePanel || !mTabsCreated) return; onFilterEdit(mActivePanel->getFilterSubString(), true); @@ -1335,6 +1335,13 @@ LLPanelPlaceInfo* LLPanelPlaces::getCurrentInfoPanel() return NULL; } +void LLPanelPlaces::hideBackBtn() +{ + mPlaceProfileBackBtn->setVisible(false); + setBackgroundVisible(false); + mPlaceProfile->setBackgroundVisible(false); +} + static bool is_agent_in_selected_parcel(LLParcel* parcel) { LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h index fc04d8d45d..8360380b22 100644 --- a/indra/newview/llpanelplaces.h +++ b/indra/newview/llpanelplaces.h @@ -81,6 +81,8 @@ public: /*virtual*/ S32 notifyParent(const LLSD& info); + void hideBackBtn(); + private: void onLandmarkLoaded(LLLandmark* landmark); void onFilterEdit(const std::string& search_string, bool force_filter); diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index b8c12ce0b9..86071e38e1 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -294,7 +294,7 @@ void LLPanelPrimMediaControls::updateShape() LLViewerMediaImpl* media_impl = getTargetMediaImpl(); LLViewerObject* objectp = getTargetObject(); - if(!media_impl || gFloaterTools->getVisible()) + if(!media_impl || (gFloaterTools && gFloaterTools->getVisible())) { setVisible(false); return; @@ -645,7 +645,7 @@ void LLPanelPrimMediaControls::updateShape() vert_it = vect_face.begin(); vert_end = vect_face.end(); - glm::mat4 mat; + glm::mat4 mat = glm::identity<glm::mat4>(); if (!is_hud) { mat = get_current_projection() * get_current_modelview(); @@ -777,7 +777,7 @@ void LLPanelPrimMediaControls::draw() else if(mFadeTimer.getStarted()) { F32 time = mFadeTimer.getElapsedTimeF32(); - alpha *= llmax(lerp(1.0, 0.0, time / mControlFadeTime), 0.0f); + alpha *= llmax(lerp(1.f, 0.f, time / mControlFadeTime), 0.0f); if(time >= mControlFadeTime) { diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index 132098ba99..758ca0b0fa 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -106,11 +106,11 @@ LLUUID post_profile_image(std::string cap_url, const LLSD &first_data, std::stri { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("post_profile_image_coro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("post_profile_image_coro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLCore::HttpHeaders::ptr_t httpHeaders; - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); httpOpts->setFollowRedirects(true); LLSD result = httpAdapter->postAndSuspend(httpRequest, cap_url, first_data, httpOpts, httpHeaders); @@ -138,9 +138,9 @@ LLUUID post_profile_image(std::string cap_url, const LLSD &first_data, std::stri } // Upload the image - LLCore::HttpRequest::ptr_t uploaderhttpRequest(new LLCore::HttpRequest); - LLCore::HttpHeaders::ptr_t uploaderhttpHeaders(new LLCore::HttpHeaders); - LLCore::HttpOptions::ptr_t uploaderhttpOpts(new LLCore::HttpOptions); + LLCore::HttpRequest::ptr_t uploaderhttpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpHeaders::ptr_t uploaderhttpHeaders = std::make_shared<LLCore::HttpHeaders>(); + LLCore::HttpOptions::ptr_t uploaderhttpOpts = std::make_shared<LLCore::HttpOptions>(); S64 length; { @@ -328,7 +328,7 @@ public: } const std::string verb = params[1].asString(); - if (verb == "about") + if (verb == "about" || verb == "mention") { LLAvatarActions::showProfile(avatar_id); return true; @@ -693,6 +693,7 @@ LLPanelProfileSecondLife::LLPanelProfileSecondLife() , mWaitingForImageUpload(false) , mAllowPublish(false) , mHideAge(false) + , mAllowEdit(true) { } @@ -709,6 +710,10 @@ LLPanelProfileSecondLife::~LLPanelProfileSecondLife() { mAvatarNameCacheConnection.disconnect(); } + if (mMenuNameCacheConnection.connected()) + { + mMenuNameCacheConnection.disconnect(); + } } bool LLPanelProfileSecondLife::postBuild() @@ -757,14 +762,15 @@ void LLPanelProfileSecondLife::onOpen(const LLSD& key) LLUUID avatar_id = getAvatarId(); bool own_profile = getSelfProfile(); + bool allow_edit = own_profile && mAllowEdit; mGroupList->setShowNone(!own_profile); - childSetVisible("notes_panel", !own_profile); - childSetVisible("settings_panel", own_profile); - childSetVisible("about_buttons_panel", own_profile); + childSetVisible("notes_panel", !allow_edit); + childSetVisible("settings_panel", allow_edit); + childSetVisible("about_buttons_panel", allow_edit); - if (own_profile) + if (allow_edit) { // Group list control cannot toggle ForAgent loading // Less than ideal, but viewing own profile via search is edge case @@ -789,7 +795,7 @@ void LLPanelProfileSecondLife::onOpen(const LLSD& key) mAgentActionMenuButton->setMenu("menu_profile_other.xml", LLMenuButton::MP_BOTTOM_RIGHT); } - mDescriptionEdit->setParseHTML(!own_profile); + mDescriptionEdit->setParseHTML(!allow_edit); if (!own_profile) { @@ -859,7 +865,7 @@ void LLPanelProfileSecondLife::resetData() resetLoading(); // Set default image and 1:1 dimensions for it - mSecondLifePic->setValue("Generic_Person_Large"); + mSecondLifePic->setValue(LLUUID()); LLRect imageRect = mSecondLifePicLayout->getRect(); mSecondLifePicLayout->reshape(imageRect.getWidth(), imageRect.getWidth()); @@ -1022,7 +1028,7 @@ void LLPanelProfileSecondLife::fillCommonData(const LLAvatarData* avatar_data) if (getSelfProfile()) { mAllowPublish = avatar_data->flags & AVATAR_ALLOW_PUBLISH; - mShowInSearchCombo->setValue(mAllowPublish); + mShowInSearchCombo->setValue(mAllowPublish ? LLSD::Integer(1) : LLSD::Integer(0)); } } @@ -1280,7 +1286,7 @@ void LLPanelProfileSecondLife::setLoaded() { mHideAgeCombo->setEnabled(true); } - mDescriptionEdit->setEnabled(true); + mDescriptionEdit->setEnabled(mAllowEdit); } } @@ -1461,7 +1467,7 @@ void LLPanelProfileSecondLife::onCommitMenu(const LLSD& userdata) } else if (item_name == "edit_display_name") { - LLAvatarNameCache::get(getAvatarId(), boost::bind(&LLPanelProfileSecondLife::onAvatarNameCacheSetName, this, _1, _2)); + mMenuNameCacheConnection = LLAvatarNameCache::get(getAvatarId(), boost::bind(&LLPanelProfileSecondLife::onAvatarNameCacheSetName, this, _1, _2)); LLFirstUse::setDisplayName(false); } else if (item_name == "edit_partner") @@ -2071,6 +2077,7 @@ void LLPanelProfileFirstLife::onChangePhoto() } }); texture_floaterp->setLocalTextureEnabled(false); + texture_floaterp->setBakeTextureEnabled(false); texture_floaterp->setCanApply(false, true, false); parent_floater->addDependentFloater(mFloaterTexturePickerHandle); diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h index c207a4162a..c993ec547a 100644 --- a/indra/newview/llpanelprofile.h +++ b/indra/newview/llpanelprofile.h @@ -111,6 +111,8 @@ public: void processProperties(void* data, EAvatarProcessorType type) override; + void setAllowEdit(bool allow_edit) { mAllowEdit = allow_edit; } + protected: /** * Process profile related data received from server. @@ -207,8 +209,10 @@ private: bool mWaitingForImageUpload; bool mAllowPublish; bool mHideAge; + bool mAllowEdit; std::string mDescriptionText; boost::signals2::connection mAvatarNameCacheConnection; + boost::signals2::connection mMenuNameCacheConnection; }; diff --git a/indra/newview/llpanelprofileclassifieds.h b/indra/newview/llpanelprofileclassifieds.h index 42cd5f8975..1c58fa6cfa 100644 --- a/indra/newview/llpanelprofileclassifieds.h +++ b/indra/newview/llpanelprofileclassifieds.h @@ -157,17 +157,17 @@ public: void setParcelId(const LLUUID& id) { mParcelId = id; } - LLUUID getParcelId() { return mParcelId; } + LLUUID getParcelId() const { return mParcelId; } void setSimName(const std::string& sim_name) { mSimName = sim_name; } - std::string getSimName() { return mSimName; } + std::string getSimName() const { return mSimName; } void setFromSearch(bool val) { mFromSearch = val; } - bool fromSearch() { return mFromSearch; } + bool fromSearch() const { return mFromSearch; } - bool getInfoLoaded() { return mInfoLoaded; } + bool getInfoLoaded() const { return mInfoLoaded; } void setInfoLoaded(bool loaded) { mInfoLoaded = loaded; } @@ -175,9 +175,9 @@ public: void resetDirty() override; - bool isNew() { return mIsNew; } + bool isNew() const { return mIsNew; } - bool isNewWithErrors() { return mIsNewWithErrors; } + bool isNewWithErrors() const { return mIsNewWithErrors; } bool canClose(); @@ -191,10 +191,10 @@ public: bool getAutoRenew(); - S32 getPriceForListing() { return mPriceForListing; } + S32 getPriceForListing() const { return mPriceForListing; } void setEditMode(bool edit_mode); - bool getEditMode() {return mEditMode;} + bool getEditMode() const { return mEditMode; } static void setClickThrough( const LLUUID& classified_id, @@ -324,11 +324,8 @@ private: S32 mPriceForListing; -public: static void handleSearchStatResponse(LLUUID classifiedId, LLSD result); -private: - typedef std::list<LLPanelProfileClassified*> panel_list_t; static panel_list_t sAllPanels; diff --git a/indra/newview/llpanelprofilepicks.cpp b/indra/newview/llpanelprofilepicks.cpp index 08f3d3af5a..c9626bf9ea 100644 --- a/indra/newview/llpanelprofilepicks.cpp +++ b/indra/newview/llpanelprofilepicks.cpp @@ -55,6 +55,8 @@ static LLPanelInjector<LLPanelProfilePicks> t_panel_profile_picks("panel_profile_picks"); static LLPanelInjector<LLPanelProfilePick> t_panel_profile_pick("panel_profile_pick"); +constexpr F32 REQUEST_TIMEOUT = 60; +constexpr F32 LOCATION_CACHE_TIMOUT = 900; class LLPickHandler : public LLCommandHandler { @@ -246,6 +248,8 @@ void LLPanelProfilePicks::onClickNewBtn() select_tab(true). label(pick_panel->getPickName())); updateButtons(); + + pick_panel->addLocationChangedCallbacks(); } void LLPanelProfilePicks::onClickDelete() @@ -306,6 +310,7 @@ void LLPanelProfilePicks::processProperties(void* data, EAvatarProcessorType typ void LLPanelProfilePicks::processProperties(const LLAvatarData* avatar_picks) { + LL_DEBUGS("PickInfo") << "Processing picks for avatar " << getAvatarId() << LL_ENDL; LLUUID selected_id = mPickToSelectOnLoad; bool has_selection = false; if (mPickToSelectOnLoad.isNull()) @@ -320,6 +325,25 @@ void LLPanelProfilePicks::processProperties(const LLAvatarData* avatar_picks) } } + // Avoid pointlesly requesting parcel data, + // store previous values + std::map<LLUUID, std::string> parcelid_location_map; + std::map<LLUUID, LLUUID> pickid_parcelid_map; + + for (S32 tab_idx = 0; tab_idx < mTabContainer->getTabCount(); ++tab_idx) + { + LLPanelProfilePick* pick_panel = dynamic_cast<LLPanelProfilePick*>(mTabContainer->getPanelByIndex(tab_idx)); + if (pick_panel && pick_panel->getPickId().notNull()) + { + std::string location = pick_panel->getPickLocation(); + if (!location.empty()) + { + parcelid_location_map[pick_panel->getParcelID()] = pick_panel->getPickLocation(); + pickid_parcelid_map[pick_panel->getPickId()] = pick_panel->getParcelID(); + } + } + } + mTabContainer->deleteAllTabs(); LLAvatarData::picks_list_t::const_iterator it = avatar_picks->picks_list.begin(); @@ -334,6 +358,15 @@ void LLPanelProfilePicks::processProperties(const LLAvatarData* avatar_picks) pick_panel->setPickName(pick_name); pick_panel->setAvatarId(getAvatarId()); + std::map<LLUUID, LLUUID>::const_iterator found_pick = pickid_parcelid_map.find(pick_id); + if (found_pick != pickid_parcelid_map.end()) + { + std::map<LLUUID, std::string>::const_iterator found = parcelid_location_map.find(found_pick->second); + if (found != parcelid_location_map.end() && !found->second.empty()) + { + pick_panel->setPickLocation(found_pick->second, found->second); + } + } mTabContainer->addTabPanel( LLTabContainer::TabPanelParams(). panel(pick_panel). @@ -353,6 +386,11 @@ void LLPanelProfilePicks::processProperties(const LLAvatarData* avatar_picks) LLPanelProfilePick* pick_panel = LLPanelProfilePick::create(); pick_panel->setAvatarId(getAvatarId()); + std::map<LLUUID, std::string>::const_iterator found = parcelid_location_map.find(data.parcel_id); + if (found != parcelid_location_map.end() && !found->second.empty()) + { + pick_panel->setPickLocation(data.parcel_id, found->second); + } pick_panel->processProperties(&data); mTabContainer->addTabPanel( LLTabContainer::TabPanelParams(). @@ -571,10 +609,12 @@ void LLPanelProfilePick::setAvatarId(const LLUUID& avatar_id) { mPickName->setEnabled(true); mPickDescription->setEnabled(true); + mSetCurrentLocationButton->setVisible(true); } else { mSnapshotCtrl->setEnabled(false); + mSetCurrentLocationButton->setVisible(false); } } @@ -585,6 +625,7 @@ bool LLPanelProfilePick::postBuild() mSaveButton = getChild<LLButton>("save_changes_btn"); mCreateButton = getChild<LLButton>("create_changes_btn"); mCancelButton = getChild<LLButton>("cancel_changes_btn"); + mSetCurrentLocationButton = getChild<LLButton>("set_to_curr_location_btn"); mSnapshotCtrl = getChild<LLTextureCtrl>("pick_snapshot"); mSnapshotCtrl->setCommitCallback(boost::bind(&LLPanelProfilePick::onSnapshotChanged, this)); @@ -597,6 +638,7 @@ bool LLPanelProfilePick::postBuild() mSaveButton->setCommitCallback(boost::bind(&LLPanelProfilePick::onClickSave, this)); mCreateButton->setCommitCallback(boost::bind(&LLPanelProfilePick::onClickSave, this)); mCancelButton->setCommitCallback(boost::bind(&LLPanelProfilePick::onClickCancel, this)); + mSetCurrentLocationButton->setCommitCallback(boost::bind(&LLPanelProfilePick::onClickSetLocation, this)); mPickName->setKeystrokeCallback(boost::bind(&LLPanelProfilePick::onPickChanged, this, _1), NULL); mPickName->setEnabled(false); @@ -638,9 +680,14 @@ void LLPanelProfilePick::processProperties(void* data, EAvatarProcessorType type void LLPanelProfilePick::processProperties(const LLPickData* pick_info) { + LL_DEBUGS("PickInfo") << "Processing properties for pick " << mPickId << LL_ENDL; mIsEditing = false; mPickDescription->setParseHTML(true); - mParcelId = pick_info->parcel_id; + if (mParcelId != pick_info->parcel_id) + { + mParcelId = pick_info->parcel_id; + mPickLocationStr.clear(); + } setSnapshotId(pick_info->snapshot_id); if (!getSelfProfile()) { @@ -650,8 +697,11 @@ void LLPanelProfilePick::processProperties(const LLPickData* pick_info) setPickDesc(pick_info->desc); setPosGlobal(pick_info->pos_global); - // Send remote parcel info request to get parcel name and sim (region) name. - sendParcelInfoRequest(); + if (mPickLocationStr.empty() || mLastRequestTimer.getElapsedTimeF32() > LOCATION_CACHE_TIMOUT) + { + // Send remote parcel info request to get parcel name and sim (region) name. + sendParcelInfoRequest(); + } // *NOTE dzaporozhan // We want to keep listening to APT_PICK_INFO because user may @@ -691,9 +741,17 @@ void LLPanelProfilePick::setPickDesc(const std::string& desc) mPickDescription->setValue(desc); } +void LLPanelProfilePick::setPickLocation(const LLUUID &parcel_id, const std::string& location) +{ + setParcelID(parcel_id); // resets mPickLocationStr + setPickLocation(location); +} + void LLPanelProfilePick::setPickLocation(const std::string& location) { getChild<LLUICtrl>("pick_location")->setValue(location); + mPickLocationStr = location; + mLastRequestTimer.reset(); } void LLPanelProfilePick::onClickMap() @@ -759,6 +817,32 @@ bool LLPanelProfilePick::isDirty() const return false; } +void LLPanelProfilePick::onClickSetLocation() +{ + // Save location for later use. + setPosGlobal(gAgent.getPositionGlobal()); + + std::string parcel_name, region_name; + + LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); + if (parcel) + { + mParcelId = parcel->getID(); + parcel_name = parcel->getName(); + } + + LLViewerRegion* region = gAgent.getRegion(); + if (region) + { + region_name = region->getName(); + } + + setPickLocation(createLocationText(getLocationNotice(), parcel_name, region_name, getPosGlobal())); + + mLocationChanged = true; + enableSaveButton(true); +} + void LLPanelProfilePick::onClickSave() { if (mRegionCallbackConnection.connected()) @@ -769,6 +853,10 @@ void LLPanelProfilePick::onClickSave() { mParcelCallbackConnection.disconnect(); } + if (mLocationChanged) + { + onClickSetLocation(); + } sendUpdate(); mLocationChanged = false; @@ -790,16 +878,19 @@ std::string LLPanelProfilePick::getLocationNotice() void LLPanelProfilePick::sendParcelInfoRequest() { - if (mParcelId != mRequestedId) + if (mParcelId != mRequestedId || mLastRequestTimer.getElapsedTimeF32() > REQUEST_TIMEOUT) { if (mRequestedId.notNull()) { LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mRequestedId, this); } + LL_DEBUGS("PickInfo") << "Sending parcel request " << mParcelId << " for pick " << mPickId << LL_ENDL; LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelId, this); LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelId); mRequestedId = mParcelId; + mLastRequestTimer.reset(); + mPickLocationStr.clear(); } } @@ -816,6 +907,26 @@ void LLPanelProfilePick::processParcelInfo(const LLParcelData& parcel_data) } } +void LLPanelProfilePick::addLocationChangedCallbacks() +{ + mRegionCallbackConnection = gAgent.addRegionChangedCallback([this]() { onClickSetLocation(); }); + mParcelCallbackConnection = gAgent.addParcelChangedCallback([this]() { onClickSetLocation(); }); +} + +void LLPanelProfilePick::setParcelID(const LLUUID& parcel_id) +{ + if (mParcelId != parcel_id) + { + mParcelId = parcel_id; + mPickLocationStr.clear(); + } + if (mRequestedId.notNull() && mRequestedId != parcel_id) + { + LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mRequestedId, this); + mRequestedId.setNull(); + } +} + void LLPanelProfilePick::sendUpdate() { LLPickData pick_data; diff --git a/indra/newview/llpanelprofilepicks.h b/indra/newview/llpanelprofilepicks.h index e3f50f5576..847ac57cea 100644 --- a/indra/newview/llpanelprofilepicks.h +++ b/indra/newview/llpanelprofilepicks.h @@ -117,6 +117,8 @@ public: virtual void setPickName(const std::string& name); const std::string getPickName(); + virtual void setPickLocation(const LLUUID& parcel_id, const std::string& location); + std::string getPickLocation() { return mPickLocationStr; }; void processProperties(void* data, EAvatarProcessorType type) override; void processProperties(const LLPickData* pick_data); @@ -135,9 +137,12 @@ public: //This stuff we got from LLRemoteParcelObserver, in the last one we intentionally do nothing void processParcelInfo(const LLParcelData& parcel_data) override; - void setParcelID(const LLUUID& parcel_id) override { mParcelId = parcel_id; } + void setParcelID(const LLUUID& parcel_id) override; + LLUUID getParcelID() const { return mParcelId; } void setErrorStatus(S32 status, const std::string& reason) override {}; + void addLocationChangedCallbacks(); + protected: /** @@ -200,6 +205,11 @@ public: void resetDirty() override; /** + * Callback for "Set Location" button click + */ + void onClickSetLocation(); + + /** * Callback for "Save" and "Create" button click */ void onClickSave(); @@ -221,6 +231,7 @@ protected: LLTextureCtrl* mSnapshotCtrl; LLLineEditor* mPickName; LLTextEditor* mPickDescription; + LLButton* mSetCurrentLocationButton; LLButton* mSaveButton; LLButton* mCreateButton; LLButton* mCancelButton; @@ -230,13 +241,15 @@ protected: LLUUID mPickId; LLUUID mRequestedId; std::string mPickNameStr; + std::string mPickLocationStr; + LLTimer mLastRequestTimer; boost::signals2::connection mRegionCallbackConnection; boost::signals2::connection mParcelCallbackConnection; bool mLocationChanged; bool mNewPick; - bool mIsEditing; + bool mIsEditing; void onDescriptionFocusReceived(); }; diff --git a/indra/newview/llpanelsnapshot.cpp b/indra/newview/llpanelsnapshot.cpp index 32c9f6f402..56c0294dbe 100644 --- a/indra/newview/llpanelsnapshot.cpp +++ b/indra/newview/llpanelsnapshot.cpp @@ -37,6 +37,7 @@ // newview #include "llsidetraypanelcontainer.h" +#include "llsnapshotlivepreview.h" #include "llviewercontrol.h" // gSavedSettings #include "llagentbenefits.h" @@ -99,6 +100,17 @@ void LLPanelSnapshot::onOpen(const LLSD& key) { getParentByType<LLFloater>()->notify(LLSD().with("image-format-change", true)); } + + // If resolution is set to "Current Window", force a snapshot update + // each time a snapshot panel is opened to determine the correct + // image size (and upload fee) depending on the snapshot type. + if (mSnapshotFloater && getChild<LLUICtrl>(getImageSizeComboName())->getValue().asString() == "[i0,i0]") + { + if (LLSnapshotLivePreview* preview = mSnapshotFloater->getPreviewView()) + { + preview->mForceUpdateSnapshot = true; + } + } } LLSnapshotModel::ESnapshotFormat LLPanelSnapshot::getImageFormat() const diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp index 96b17acc40..7396f079b0 100644 --- a/indra/newview/llpanelsnapshotinventory.cpp +++ b/indra/newview/llpanelsnapshotinventory.cpp @@ -42,77 +42,35 @@ /** * The panel provides UI for saving snapshot as an inventory texture. */ -class LLPanelSnapshotInventoryBase - : public LLPanelSnapshot -{ - LOG_CLASS(LLPanelSnapshotInventoryBase); - -public: - LLPanelSnapshotInventoryBase(); - - /*virtual*/ bool postBuild(); -protected: - void onSend(); - /*virtual*/ LLSnapshotModel::ESnapshotType getSnapshotType(); -}; - class LLPanelSnapshotInventory - : public LLPanelSnapshotInventoryBase + : public LLPanelSnapshot { LOG_CLASS(LLPanelSnapshotInventory); public: LLPanelSnapshotInventory(); - /*virtual*/ bool postBuild(); - /*virtual*/ void onOpen(const LLSD& key); + bool postBuild() override; + void onOpen(const LLSD& key) override; void onResolutionCommit(LLUICtrl* ctrl); private: - /*virtual*/ std::string getWidthSpinnerName() const { return "inventory_snapshot_width"; } - /*virtual*/ std::string getHeightSpinnerName() const { return "inventory_snapshot_height"; } - /*virtual*/ std::string getAspectRatioCBName() const { return "inventory_keep_aspect_check"; } - /*virtual*/ std::string getImageSizeComboName() const { return "texture_size_combo"; } - /*virtual*/ std::string getImageSizePanelName() const { return LLStringUtil::null; } - /*virtual*/ void updateControls(const LLSD& info); - -}; - -class LLPanelOutfitSnapshotInventory - : public LLPanelSnapshotInventoryBase -{ - LOG_CLASS(LLPanelOutfitSnapshotInventory); - -public: - LLPanelOutfitSnapshotInventory(); - /*virtual*/ bool postBuild(); - /*virtual*/ void onOpen(const LLSD& key); - -private: - /*virtual*/ std::string getWidthSpinnerName() const { return ""; } - /*virtual*/ std::string getHeightSpinnerName() const { return ""; } - /*virtual*/ std::string getAspectRatioCBName() const { return ""; } - /*virtual*/ std::string getImageSizeComboName() const { return "texture_size_combo"; } - /*virtual*/ std::string getImageSizePanelName() const { return LLStringUtil::null; } - /*virtual*/ void updateControls(const LLSD& info); + std::string getWidthSpinnerName() const override { return "inventory_snapshot_width"; } + std::string getHeightSpinnerName() const override { return "inventory_snapshot_height"; } + std::string getAspectRatioCBName() const override { return "inventory_keep_aspect_check"; } + std::string getImageSizeComboName() const override { return "texture_size_combo"; } + std::string getImageSizePanelName() const override { return LLStringUtil::null; } + LLSnapshotModel::ESnapshotType getSnapshotType() override; + void updateControls(const LLSD& info) override; - /*virtual*/ void cancel(); + void onSend(); + void updateUploadCost(); + S32 calculateUploadCost(); }; static LLPanelInjector<LLPanelSnapshotInventory> panel_class1("llpanelsnapshotinventory"); -static LLPanelInjector<LLPanelOutfitSnapshotInventory> panel_class2("llpaneloutfitsnapshotinventory"); - -LLPanelSnapshotInventoryBase::LLPanelSnapshotInventoryBase() -{ -} - -bool LLPanelSnapshotInventoryBase::postBuild() -{ - return LLPanelSnapshot::postBuild(); -} - -LLSnapshotModel::ESnapshotType LLPanelSnapshotInventoryBase::getSnapshotType() +LLSnapshotModel::ESnapshotType LLPanelSnapshotInventory::getSnapshotType() { return LLSnapshotModel::SNAPSHOT_TEXTURE; } @@ -130,12 +88,14 @@ bool LLPanelSnapshotInventory::postBuild() getChild<LLSpinCtrl>(getHeightSpinnerName())->setAllowEdit(false); getChild<LLUICtrl>(getImageSizeComboName())->setCommitCallback(boost::bind(&LLPanelSnapshotInventory::onResolutionCommit, this, _1)); - return LLPanelSnapshotInventoryBase::postBuild(); + return LLPanelSnapshot::postBuild(); } // virtual void LLPanelSnapshotInventory::onOpen(const LLSD& key) { + updateUploadCost(); + LLPanelSnapshot::onOpen(key); } @@ -144,30 +104,24 @@ void LLPanelSnapshotInventory::updateControls(const LLSD& info) { const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true; getChild<LLUICtrl>("save_btn")->setEnabled(have_snapshot); + + updateUploadCost(); } void LLPanelSnapshotInventory::onResolutionCommit(LLUICtrl* ctrl) { - bool current_window_selected = (getChild<LLComboBox>(getImageSizeComboName())->getCurrentIndex() == 3); + LLComboBox* combo = getChild<LLComboBox>(getImageSizeComboName()); + // Current window likely won't ever change position from being the penultimate item + // Custom window is last item + S32 curent_window_index = combo->getItemCount() - 2; + bool current_window_selected = (combo->getCurrentIndex() == curent_window_index); getChild<LLSpinCtrl>(getWidthSpinnerName())->setVisible(!current_window_selected); getChild<LLSpinCtrl>(getHeightSpinnerName())->setVisible(!current_window_selected); } -void LLPanelSnapshotInventoryBase::onSend() +void LLPanelSnapshotInventory::onSend() { - S32 w = 0; - S32 h = 0; - - if( mSnapshotFloater ) - { - LLSnapshotLivePreview* preview = mSnapshotFloater->getPreviewView(); - if( preview ) - { - preview->getSize(w, h); - } - } - - S32 expected_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost(w, h); + S32 expected_upload_cost = calculateUploadCost(); if (can_afford_transaction(expected_upload_cost)) { if (mSnapshotFloater) @@ -188,36 +142,24 @@ void LLPanelSnapshotInventoryBase::onSend() } } -LLPanelOutfitSnapshotInventory::LLPanelOutfitSnapshotInventory() -{ - mCommitCallbackRegistrar.add("Inventory.SaveOutfitPhoto", boost::bind(&LLPanelOutfitSnapshotInventory::onSend, this)); - mCommitCallbackRegistrar.add("Inventory.SaveOutfitCancel", boost::bind(&LLPanelOutfitSnapshotInventory::cancel, this)); -} - -// virtual -bool LLPanelOutfitSnapshotInventory::postBuild() -{ - return LLPanelSnapshotInventoryBase::postBuild(); -} - -// virtual -void LLPanelOutfitSnapshotInventory::onOpen(const LLSD& key) +void LLPanelSnapshotInventory::updateUploadCost() { - getChild<LLUICtrl>("hint_lbl")->setTextArg("[UPLOAD_COST]", llformat("%d", LLAgentBenefitsMgr::current().getTextureUploadCost())); - LLPanelSnapshot::onOpen(key); + getChild<LLUICtrl>("hint_lbl")->setTextArg("[UPLOAD_COST]", llformat("%d", calculateUploadCost())); } -// virtual -void LLPanelOutfitSnapshotInventory::updateControls(const LLSD& info) +S32 LLPanelSnapshotInventory::calculateUploadCost() { - const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true; - getChild<LLUICtrl>("save_btn")->setEnabled(have_snapshot); -} + S32 w = 0; + S32 h = 0; -void LLPanelOutfitSnapshotInventory::cancel() -{ if (mSnapshotFloater) { - mSnapshotFloater->closeFloater(); + if (LLSnapshotLivePreview* preview = mSnapshotFloater->getPreviewView()) + { + w = preview->getEncodedImageWidth(); + h = preview->getEncodedImageHeight(); + } } + + return LLAgentBenefitsMgr::current().getTextureUploadCost(w, h); } diff --git a/indra/newview/llpanelsnapshotlocal.cpp b/indra/newview/llpanelsnapshotlocal.cpp index 366030c0fa..57759fbcaa 100644 --- a/indra/newview/llpanelsnapshotlocal.cpp +++ b/indra/newview/llpanelsnapshotlocal.cpp @@ -47,18 +47,18 @@ class LLPanelSnapshotLocal public: LLPanelSnapshotLocal(); - /*virtual*/ bool postBuild(); - /*virtual*/ void onOpen(const LLSD& key); + bool postBuild() override; + void onOpen(const LLSD& key) override; private: - /*virtual*/ std::string getWidthSpinnerName() const { return "local_snapshot_width"; } - /*virtual*/ std::string getHeightSpinnerName() const { return "local_snapshot_height"; } - /*virtual*/ std::string getAspectRatioCBName() const { return "local_keep_aspect_check"; } - /*virtual*/ std::string getImageSizeComboName() const { return "local_size_combo"; } - /*virtual*/ std::string getImageSizePanelName() const { return "local_image_size_lp"; } - /*virtual*/ LLSnapshotModel::ESnapshotFormat getImageFormat() const; - /*virtual*/ LLSnapshotModel::ESnapshotType getSnapshotType(); - /*virtual*/ void updateControls(const LLSD& info); + std::string getWidthSpinnerName() const override { return "local_snapshot_width"; } + std::string getHeightSpinnerName() const override { return "local_snapshot_height"; } + std::string getAspectRatioCBName() const override { return "local_keep_aspect_check"; } + std::string getImageSizeComboName() const override { return "local_size_combo"; } + std::string getImageSizePanelName() const override { return "local_image_size_lp"; } + LLSnapshotModel::ESnapshotFormat getImageFormat() const override; + LLSnapshotModel::ESnapshotType getSnapshotType() override; + void updateControls(const LLSD& info) override; S32 mLocalFormat; diff --git a/indra/newview/llpanelsnapshotoptions.cpp b/indra/newview/llpanelsnapshotoptions.cpp index 962d3bba16..05cd9e7b3a 100644 --- a/indra/newview/llpanelsnapshotoptions.cpp +++ b/indra/newview/llpanelsnapshotoptions.cpp @@ -30,12 +30,8 @@ #include "llsidetraypanelcontainer.h" #include "llfloatersnapshot.h" // FIXME: create a snapshot model -#include "llsnapshotlivepreview.h" #include "llfloaterreg.h" -#include "llagentbenefits.h" - - /** * Provides several ways to save a snapshot. */ @@ -46,12 +42,9 @@ class LLPanelSnapshotOptions public: LLPanelSnapshotOptions(); - ~LLPanelSnapshotOptions(); - /*virtual*/ bool postBuild(); - /*virtual*/ void onOpen(const LLSD& key); + bool postBuild() override; private: - void updateUploadCost(); void openPanel(const std::string& panel_name); void onSaveToProfile(); void onSaveToEmail(); @@ -71,10 +64,6 @@ LLPanelSnapshotOptions::LLPanelSnapshotOptions() mCommitCallbackRegistrar.add("Snapshot.SaveToComputer", boost::bind(&LLPanelSnapshotOptions::onSaveToComputer, this)); } -LLPanelSnapshotOptions::~LLPanelSnapshotOptions() -{ -} - // virtual bool LLPanelSnapshotOptions::postBuild() { @@ -82,30 +71,6 @@ bool LLPanelSnapshotOptions::postBuild() return LLPanel::postBuild(); } -// virtual -void LLPanelSnapshotOptions::onOpen(const LLSD& key) -{ - updateUploadCost(); -} - -void LLPanelSnapshotOptions::updateUploadCost() -{ - S32 w = 0; - S32 h = 0; - - if( mSnapshotFloater ) - { - LLSnapshotLivePreview* preview = mSnapshotFloater->getPreviewView(); - if( preview ) - { - preview->getSize(w, h); - } - } - - S32 upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost(w, h); - getChild<LLUICtrl>("save_to_inventory_btn")->setLabelArg("[AMOUNT]", llformat("%d", upload_cost)); -} - void LLPanelSnapshotOptions::openPanel(const std::string& panel_name) { LLSideTrayPanelContainer* parent = dynamic_cast<LLSideTrayPanelContainer*>(getParent()); diff --git a/indra/newview/llpanelsnapshotpostcard.cpp b/indra/newview/llpanelsnapshotpostcard.cpp index 23e8789e3f..f3dfdc9250 100644 --- a/indra/newview/llpanelsnapshotpostcard.cpp +++ b/indra/newview/llpanelsnapshotpostcard.cpp @@ -56,18 +56,18 @@ class LLPanelSnapshotPostcard public: LLPanelSnapshotPostcard(); - /*virtual*/ bool postBuild(); - /*virtual*/ void onOpen(const LLSD& key); + bool postBuild() override; + void onOpen(const LLSD& key) override; private: - /*virtual*/ std::string getWidthSpinnerName() const { return "postcard_snapshot_width"; } - /*virtual*/ std::string getHeightSpinnerName() const { return "postcard_snapshot_height"; } - /*virtual*/ std::string getAspectRatioCBName() const { return "postcard_keep_aspect_check"; } - /*virtual*/ std::string getImageSizeComboName() const { return "postcard_size_combo"; } - /*virtual*/ std::string getImageSizePanelName() const { return "postcard_image_size_lp"; } - /*virtual*/ LLSnapshotModel::ESnapshotFormat getImageFormat() const { return LLSnapshotModel::SNAPSHOT_FORMAT_JPEG; } - /*virtual*/ LLSnapshotModel::ESnapshotType getSnapshotType(); - /*virtual*/ void updateControls(const LLSD& info); + std::string getWidthSpinnerName() const override { return "postcard_snapshot_width"; } + std::string getHeightSpinnerName() const override { return "postcard_snapshot_height"; } + std::string getAspectRatioCBName() const override { return "postcard_keep_aspect_check"; } + std::string getImageSizeComboName() const override { return "postcard_size_combo"; } + std::string getImageSizePanelName() const override { return "postcard_image_size_lp"; } + LLSnapshotModel::ESnapshotFormat getImageFormat() const override { return LLSnapshotModel::SNAPSHOT_FORMAT_JPEG; } + LLSnapshotModel::ESnapshotType getSnapshotType() override; + void updateControls(const LLSD& info) override; bool missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response); static void sendPostcardFinished(LLSD result); diff --git a/indra/newview/llpanelsnapshotprofile.cpp b/indra/newview/llpanelsnapshotprofile.cpp index aa257dea9e..b533d7bbbc 100644 --- a/indra/newview/llpanelsnapshotprofile.cpp +++ b/indra/newview/llpanelsnapshotprofile.cpp @@ -49,17 +49,17 @@ class LLPanelSnapshotProfile public: LLPanelSnapshotProfile(); - /*virtual*/ bool postBuild(); - /*virtual*/ void onOpen(const LLSD& key); + bool postBuild() override; + void onOpen(const LLSD& key) override; private: - /*virtual*/ std::string getWidthSpinnerName() const { return "profile_snapshot_width"; } - /*virtual*/ std::string getHeightSpinnerName() const { return "profile_snapshot_height"; } - /*virtual*/ std::string getAspectRatioCBName() const { return "profile_keep_aspect_check"; } - /*virtual*/ std::string getImageSizeComboName() const { return "profile_size_combo"; } - /*virtual*/ std::string getImageSizePanelName() const { return "profile_image_size_lp"; } - /*virtual*/ LLSnapshotModel::ESnapshotFormat getImageFormat() const { return LLSnapshotModel::SNAPSHOT_FORMAT_PNG; } - /*virtual*/ void updateControls(const LLSD& info); + std::string getWidthSpinnerName() const override { return "profile_snapshot_width"; } + std::string getHeightSpinnerName() const override { return "profile_snapshot_height"; } + std::string getAspectRatioCBName() const override { return "profile_keep_aspect_check"; } + std::string getImageSizeComboName() const override { return "profile_size_combo"; } + std::string getImageSizePanelName() const override { return "profile_image_size_lp"; } + LLSnapshotModel::ESnapshotFormat getImageFormat() const override { return LLSnapshotModel::SNAPSHOT_FORMAT_PNG; } + void updateControls(const LLSD& info) override; void onSend(); }; diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 902412d359..bfdfa68e01 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -42,6 +42,7 @@ #include "llnotificationsutil.h" #include "lltextbox.h" #include "lltoggleablemenu.h" +#include "llviewercontrol.h" #include "llviewermenu.h" #include "lllandmarkactions.h" #include "llclipboard.h" @@ -215,8 +216,18 @@ std::string LLTeleportHistoryFlatItem::getTimestamp() // Only show timestamp for today and yesterday if(time_diff < seconds_today + seconds_in_day) { - timestamp = "[" + LLTrans::getString("TimeHour12")+"]:[" - + LLTrans::getString("TimeMin")+"] ["+ LLTrans::getString("TimeAMPM")+"]"; + static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); + if (use_24h) + { + timestamp = "[" + LLTrans::getString("TimeHour") + "]:[" + + LLTrans::getString("TimeMin") + "]"; + } + else + { + timestamp = "[" + LLTrans::getString("TimeHour12") + "]:[" + + LLTrans::getString("TimeMin") + "] [" + LLTrans::getString("TimeAMPM") + "]"; + } + LLSD substitution; substitution["datetime"] = (S32) date.secondsSinceEpoch(); LLStringUtil::format(timestamp, substitution); diff --git a/indra/newview/llpanelvoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp index 60877494e7..d8d6bcf5fd 100644 --- a/indra/newview/llpanelvoicedevicesettings.cpp +++ b/indra/newview/llpanelvoicedevicesettings.cpp @@ -240,13 +240,38 @@ void LLPanelVoiceDeviceSettings::refresh() if(mCtrlInputDevices) { mCtrlInputDevices->removeall(); - mCtrlInputDevices->add(getLocalizedDeviceName(mInputDevice), mInputDevice, ADD_BOTTOM); + auto it = mLocalizedDeviceNames.find(mInputDevice); + if (it != mLocalizedDeviceNames.end()) + { + mCtrlInputDevices->add(getLocalizedDeviceName(mInputDevice), mInputDevice, ADD_BOTTOM); + } + else + { + // Display name generaly doesn't match value. + // Value is an id so it's not nessesary readable, + // might not even be valid (disconnected usb). + // Until we get the data, don't change the device, + // otherwise box might override the control. + // But show a readable placeholder. + // Combo is disabled so it's safe to show + // a placeholder. + mCtrlInputDevices->add(getString("device_not_loaded"), mInputDevice, ADD_BOTTOM); + } mCtrlInputDevices->setValue(mInputDevice); } if(mCtrlOutputDevices) { mCtrlOutputDevices->removeall(); - mCtrlOutputDevices->add(getLocalizedDeviceName(mOutputDevice), mOutputDevice, ADD_BOTTOM); + auto it = mLocalizedDeviceNames.find(mOutputDevice); + if (it != mLocalizedDeviceNames.end()) + { + mCtrlOutputDevices->add(getLocalizedDeviceName(mOutputDevice), mOutputDevice, ADD_BOTTOM); + } + else + { + // Don't change the device, only the label + mCtrlOutputDevices->add(getString("device_not_loaded"), mOutputDevice, ADD_BOTTOM); + } mCtrlOutputDevices->setValue(mOutputDevice); } } diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp index 951dc45a78..5916163f60 100644 --- a/indra/newview/llpanelvolume.cpp +++ b/indra/newview/llpanelvolume.cpp @@ -576,32 +576,52 @@ void LLPanelVolume::getState( ) return object->getMaterial(); } } func; - bool material_same = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, material_code ); + LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); + bool material_same = selection->getSelectedTEValue( &func, material_code ); std::string LEGACY_FULLBRIGHT_DESC = LLTrans::getString("Fullbright"); - if (editable && single_volume && material_same) + + bool enable_material = editable && single_volume && material_same; + LLCachedControl<bool> edit_linked(gSavedSettings, "EditLinkedParts", false); + if (!enable_material) { - mComboMaterial->setEnabled( true ); - if (material_code == LL_MCODE_LIGHT) + LLViewerObject* root = selection->getPrimaryObject(); + while (root && !root->isAvatar() && root->getParent()) { - if (mComboMaterial->getItemCount() == mComboMaterialItemCount) + LLViewerObject* parent = (LLViewerObject*)root->getParent(); + if (parent->isAvatar()) { - mComboMaterial->add(LEGACY_FULLBRIGHT_DESC); + break; } - mComboMaterial->setSimple(LEGACY_FULLBRIGHT_DESC); - } - else - { - if (mComboMaterial->getItemCount() != mComboMaterialItemCount) + if (!parent->isSelected()) { - mComboMaterial->remove(LEGACY_FULLBRIGHT_DESC); + break; } + root = parent; + } + if (root) + { + material_code = root->getMaterial(); + } + } + + mComboMaterial->setEnabled(enable_material); - mComboMaterial->setSimple(std::string(LLMaterialTable::basic.getName(material_code))); + if (material_code == LL_MCODE_LIGHT) + { + if (mComboMaterial->getItemCount() == mComboMaterialItemCount) + { + mComboMaterial->add(LEGACY_FULLBRIGHT_DESC); } + mComboMaterial->setSimple(LEGACY_FULLBRIGHT_DESC); } else { - mComboMaterial->setEnabled( false ); + if (mComboMaterial->getItemCount() != mComboMaterialItemCount) + { + mComboMaterial->remove(LEGACY_FULLBRIGHT_DESC); + } + + mComboMaterial->setSimple(std::string(LLMaterialTable::basic.getName(material_code))); } // Physics properties diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp index c1534c9abd..4fcce50df1 100644 --- a/indra/newview/llpanelwearing.cpp +++ b/indra/newview/llpanelwearing.cpp @@ -113,6 +113,7 @@ protected: boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs, no_op)); registrar.add("Wearing.Detach", boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs, no_op)); + registrar.add("Wearing.Favorite", boost::bind(toggle_favorites, mUUIDs)); LLContextMenu* menu = createFromFile("menu_wearing_tab.xml"); updateMenuItemsVisibility(menu); @@ -125,6 +126,8 @@ protected: bool bp_selected = false; // true if body parts selected bool clothes_selected = false; bool attachments_selected = false; + bool can_favorite = false; + bool can_unfavorite = false; // See what types of wearables are selected. for (uuid_vec_t::const_iterator it = mUUIDs.begin(); it != mUUIDs.end(); ++it) @@ -137,6 +140,9 @@ protected: continue; } + LLUUID linked_id = item->getLinkedUUID(); + LLViewerInventoryItem* linked_item = gInventory.getItem(linked_id); + LLAssetType::EType type = item->getType(); if (type == LLAssetType::AT_CLOTHING) { @@ -150,6 +156,8 @@ protected: { attachments_selected = true; } + can_favorite |= !linked_item->getIsFavorite(); + can_unfavorite |= linked_item->getIsFavorite(); } // Enable/disable some menu items depending on the selection. @@ -166,6 +174,8 @@ protected: menu->setItemVisible("detach", allow_detach); menu->setItemVisible("edit_outfit_separator", show_touch | show_edit | allow_take_off || allow_detach); menu->setItemVisible("show_original", mUUIDs.size() == 1); + menu->setItemVisible("favorites_add", can_favorite); + menu->setItemVisible("favorites_remove", can_unfavorite); } }; @@ -232,6 +242,10 @@ LLPanelWearing::~LLPanelWearing() { mAttachmentsChangedConnection.disconnect(); } + if (mGearMenuConnection.connected()) + { + mGearMenuConnection.disconnect(); + } } bool LLPanelWearing::postBuild() @@ -249,10 +263,6 @@ bool LLPanelWearing::postBuild() mTempItemsList->setFgUnselectedColor(LLColor4::white); mTempItemsList->setRightMouseDownCallback(boost::bind(&LLPanelWearing::onTempAttachmentsListRightClick, this, _1, _2, _3)); - LLMenuButton* menu_gear_btn = getChild<LLMenuButton>("options_gear_btn"); - - menu_gear_btn->setMenu(mGearMenu->getMenu()); - return true; } @@ -456,8 +466,8 @@ void LLPanelWearing::getAttachmentLimitsCoro(std::string url) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getAttachmentLimitsCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("getAttachmentLimitsCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD result = httpAdapter->getAndSuspend(httpRequest, url); @@ -560,6 +570,16 @@ void LLPanelWearing::onRemoveAttachment() } } +LLToggleableMenu* LLPanelWearing::getGearMenu() +{ + return mGearMenu->getMenu(); +} + +LLToggleableMenu* LLPanelWearing::getSortMenu() +{ + return NULL; +} + void LLPanelWearing::onRemoveItem() { if (mWearablesTab->isExpanded()) diff --git a/indra/newview/llpanelwearing.h b/indra/newview/llpanelwearing.h index ea0787d0ef..aa80a3fc21 100644 --- a/indra/newview/llpanelwearing.h +++ b/indra/newview/llpanelwearing.h @@ -84,6 +84,11 @@ public: void onEditAttachment(); void onRemoveAttachment(); + void updateMenuItemsVisibility() {}; + LLToggleableMenu* getGearMenu(); + LLToggleableMenu* getSortMenu(); + bool getTrashMenuVisible() { return false; } + private: void onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y); void onTempAttachmentsListRightClick(LLUICtrl* ctrl, S32 x, S32 y); @@ -93,6 +98,7 @@ private: LLWearableItemsList* mCOFItemsList; LLScrollListCtrl* mTempItemsList; LLWearingGearMenu* mGearMenu; + boost::signals2::connection mGearMenuConnection; LLListContextMenu* mContextMenu; LLListContextMenu* mAttachmentsMenu; diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 9ef9c26411..c6a88dbada 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -41,7 +41,7 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLFolderViewModelInterface& root_view_model) : LLConversationItemSession(data_source->getSessionID(), root_view_model), mSpeakerMgr(data_source), - mValidateSpeakerCallback(NULL) + mValidateSpeakerCallback(nullptr) { mSpeakerAddListener = new SpeakerAddListener(*this); mSpeakerRemoveListener = new SpeakerRemoveListener(*this); diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index 7cb29a6211..4b4334c6f9 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -27,8 +27,8 @@ #ifndef LL_PARTICIPANTLIST_H #define LL_PARTICIPANTLIST_H -#include "llviewerprecompiledheaders.h" #include "llconversationmodel.h" +#include "llevent.h" class LLSpeakerMgr; class LLUICtrl; @@ -38,7 +38,7 @@ class LLParticipantList : public LLConversationItemSession LOG_CLASS(LLParticipantList); public: - typedef boost::function<bool (const LLUUID& speaker_id)> validate_speaker_callback_t; + typedef std::function<bool (const LLUUID& speaker_id)> validate_speaker_callback_t; LLParticipantList(LLSpeakerMgr* data_source, LLFolderViewModelInterface& root_view_model); ~LLParticipantList(); diff --git a/indra/newview/llpathfindingcharacterlist.cpp b/indra/newview/llpathfindingcharacterlist.cpp index 1366ba6c6f..8e03492381 100644 --- a/indra/newview/llpathfindingcharacterlist.cpp +++ b/indra/newview/llpathfindingcharacterlist.cpp @@ -65,7 +65,7 @@ void LLPathfindingCharacterList::parseCharacterListData(const LLSD& pCharacterLi continue; const std::string& uuid(characterDataIter->first); const LLSD& characterData = characterDataIter->second; - LLPathfindingObjectPtr character(new LLPathfindingCharacter(uuid, characterData)); + LLPathfindingObjectPtr character = std::make_shared<LLPathfindingCharacter>(uuid, characterData); objectMap.insert(std::pair<std::string, LLPathfindingObjectPtr>(uuid, character)); } } diff --git a/indra/newview/llpathfindinglinksetlist.cpp b/indra/newview/llpathfindinglinksetlist.cpp index 2012d7a094..81efb0a6fc 100644 --- a/indra/newview/llpathfindinglinksetlist.cpp +++ b/indra/newview/llpathfindinglinksetlist.cpp @@ -206,7 +206,7 @@ void LLPathfindingLinksetList::parseLinksetListData(const LLSD& pLinksetListData const LLSD& linksetData = linksetDataIter->second; if(linksetData.size() != 0) { - LLPathfindingObjectPtr linksetPtr(new LLPathfindingLinkset(uuid, linksetData)); + LLPathfindingObjectPtr linksetPtr = std::make_shared<LLPathfindingLinkset>(uuid, linksetData); objectMap.insert(std::pair<std::string, LLPathfindingObjectPtr>(uuid, linksetPtr)); } } diff --git a/indra/newview/llpathfindingmanager.cpp b/indra/newview/llpathfindingmanager.cpp index 84a62b3cbf..412e25a7b1 100644 --- a/indra/newview/llpathfindingmanager.cpp +++ b/indra/newview/llpathfindingmanager.cpp @@ -34,7 +34,6 @@ #include <map> #include <boost/bind.hpp> -#include <boost/function.hpp> #include <boost/signals2.hpp> #include "llagent.h" @@ -451,8 +450,8 @@ void LLPathfindingManager::navMeshStatusRequestCoro(std::string url, U64 regionH { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("NavMeshStatusRequest", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("NavMeshStatusRequest", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLViewerRegion *region = LLWorld::getInstance()->getRegionFromHandle(regionHandle); if (!region) @@ -541,8 +540,8 @@ void LLPathfindingManager::navAgentStateRequestCoro(std::string url) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("NavAgentStateRequest", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("NavAgentStateRequest", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD result = httpAdapter->getAndSuspend(httpRequest, url); @@ -569,8 +568,8 @@ void LLPathfindingManager::navMeshRebakeCoro(std::string url, rebake_navmesh_cal { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("NavMeshRebake", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("NavMeshRebake", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD postData = LLSD::emptyMap(); @@ -598,8 +597,8 @@ void LLPathfindingManager::linksetObjectsCoro(std::string url, LinksetsResponder { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("LinksetObjects", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("LinksetObjects", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD result; @@ -634,8 +633,8 @@ void LLPathfindingManager::linksetTerrainCoro(std::string url, LinksetsResponder { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("LinksetTerrain", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("LinksetTerrain", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD result; @@ -669,8 +668,8 @@ void LLPathfindingManager::charactersCoro(std::string url, request_id_t requestI { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("LinksetTerrain", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("charactersCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD result = httpAdapter->getAndSuspend(httpRequest, url); diff --git a/indra/newview/llpathfindingmanager.h b/indra/newview/llpathfindingmanager.h index 663cb3cf34..d209266467 100644 --- a/indra/newview/llpathfindingmanager.h +++ b/indra/newview/llpathfindingmanager.h @@ -27,10 +27,10 @@ #ifndef LL_LLPATHFINDINGMANAGER_H #define LL_LLPATHFINDINGMANAGER_H +#include <functional> #include <string> #include <map> -#include <boost/function.hpp> #include <boost/signals2.hpp> #include "llpathfindinglinkset.h" @@ -76,21 +76,21 @@ public: void requestGetNavMeshForRegion(LLViewerRegion *pRegion, bool pIsGetStatusOnly); typedef U32 request_id_t; - typedef boost::function<void (request_id_t, ERequestStatus, LLPathfindingObjectListPtr)> object_request_callback_t; + typedef std::function<void(request_id_t, ERequestStatus, LLPathfindingObjectListPtr)> object_request_callback_t; void requestGetLinksets(request_id_t pRequestId, object_request_callback_t pLinksetsCallback) const; void requestSetLinksets(request_id_t pRequestId, const LLPathfindingObjectListPtr &pLinksetListPtr, LLPathfindingLinkset::ELinksetUse pLinksetUse, S32 pA, S32 pB, S32 pC, S32 pD, object_request_callback_t pLinksetsCallback) const; void requestGetCharacters(request_id_t pRequestId, object_request_callback_t pCharactersCallback) const; - typedef boost::function<void (bool)> agent_state_callback_t; + typedef std::function<void(bool)> agent_state_callback_t; typedef boost::signals2::signal<void (bool)> agent_state_signal_t; typedef boost::signals2::connection agent_state_slot_t; agent_state_slot_t registerAgentStateListener(agent_state_callback_t pAgentStateCallback); void requestGetAgentState(); - typedef boost::function<void (bool)> rebake_navmesh_callback_t; + typedef std::function<void(bool)> rebake_navmesh_callback_t; void requestRebakeNavMesh(rebake_navmesh_callback_t pRebakeNavMeshCallback); protected: diff --git a/indra/newview/llpathfindingnavmesh.h b/indra/newview/llpathfindingnavmesh.h index d838a1a51c..44397c9118 100644 --- a/indra/newview/llpathfindingnavmesh.h +++ b/indra/newview/llpathfindingnavmesh.h @@ -27,9 +27,9 @@ #ifndef LL_LLPATHFINDINGNAVMESH_H #define LL_LLPATHFINDINGNAVMESH_H +#include <functional> #include <string> -#include <boost/function.hpp> #include <boost/signals2.hpp> #include "llpathfindingnavmeshstatus.h" @@ -54,7 +54,7 @@ public: kNavMeshRequestError } ENavMeshRequestStatus; - typedef boost::function<void (ENavMeshRequestStatus, const LLPathfindingNavMeshStatus &, const LLSD::Binary &)> navmesh_callback_t; + typedef std::function<void(ENavMeshRequestStatus, const LLPathfindingNavMeshStatus&, const LLSD::Binary&)> navmesh_callback_t; typedef boost::signals2::signal<void (ENavMeshRequestStatus, const LLPathfindingNavMeshStatus &, const LLSD::Binary &)> navmesh_signal_t; typedef boost::signals2::connection navmesh_slot_t; diff --git a/indra/newview/llpathfindingnavmeshzone.h b/indra/newview/llpathfindingnavmeshzone.h index e770efa0d0..8f7750d4c5 100644 --- a/indra/newview/llpathfindingnavmeshzone.h +++ b/indra/newview/llpathfindingnavmeshzone.h @@ -27,9 +27,9 @@ #ifndef LL_LLPATHFINDINGNAVMESHZONE_H #define LL_LLPATHFINDINGNAVMESHZONE_H +#include <functional> #include <vector> -#include <boost/function.hpp> #include <boost/signals2.hpp> #include "llpathfindingnavmesh.h" @@ -62,7 +62,7 @@ public: kNavMeshZoneComplete } ENavMeshZoneStatus; - typedef boost::function<void (ENavMeshZoneRequestStatus)> navmesh_zone_callback_t; + typedef std::function<void(ENavMeshZoneRequestStatus)> navmesh_zone_callback_t; typedef boost::signals2::signal<void (ENavMeshZoneRequestStatus)> navmesh_zone_signal_t; typedef boost::signals2::connection navmesh_zone_slot_t; @@ -81,7 +81,7 @@ public: protected: private: - typedef boost::function<void (void)> navmesh_location_callback_t; + typedef std::function<void(void)> navmesh_location_callback_t; class NavMeshLocation { public: diff --git a/indra/newview/llpathfindingobject.h b/indra/newview/llpathfindingobject.h index 79a796dd60..bf27f114f5 100644 --- a/indra/newview/llpathfindingobject.h +++ b/indra/newview/llpathfindingobject.h @@ -27,9 +27,9 @@ #ifndef LL_LLPATHFINDINGOBJECT_H #define LL_LLPATHFINDINGOBJECT_H +#include <functional> #include <string> -#include <boost/function.hpp> #include <boost/signals2.hpp> #include "llavatarname.h" @@ -61,7 +61,7 @@ public: inline bool isGroupOwned() const {return mIsGroupOwned;}; inline const LLVector3& getLocation() const {return mLocation;}; - typedef boost::function<void (const LLPathfindingObject *)> name_callback_t; + typedef std::function<void(const LLPathfindingObject*)> name_callback_t; typedef boost::signals2::signal<void (const LLPathfindingObject *)> name_signal_t; typedef boost::signals2::connection name_connection_t; diff --git a/indra/newview/llpathfindingpathtool.cpp b/indra/newview/llpathfindingpathtool.cpp index 61791492e7..57f4aefadf 100644 --- a/indra/newview/llpathfindingpathtool.cpp +++ b/indra/newview/llpathfindingpathtool.cpp @@ -30,7 +30,6 @@ #include "llpathfindingpathtool.h" -#include <boost/function.hpp> #include <boost/signals2.hpp> #include "llagent.h" diff --git a/indra/newview/llpathfindingpathtool.h b/indra/newview/llpathfindingpathtool.h index 189b9d4954..f6b4500f0f 100644 --- a/indra/newview/llpathfindingpathtool.h +++ b/indra/newview/llpathfindingpathtool.h @@ -27,7 +27,7 @@ #ifndef LL_LLPATHFINDINGPATHTOOL_H #define LL_LLPATHFINDINGPATHTOOL_H -#include <boost/function.hpp> +#include <functional> #include <boost/signals2.hpp> #include "llpathinglib.h" @@ -62,7 +62,7 @@ public: kCharacterTypeD } ECharacterType; - typedef boost::function<void (void)> path_event_callback_t; + typedef std::function<void(void)> path_event_callback_t; typedef boost::signals2::signal<void (void)> path_event_signal_t; typedef boost::signals2::connection path_event_slot_t; diff --git a/indra/newview/llpbrterrainfeatures.cpp b/indra/newview/llpbrterrainfeatures.cpp index bb771c6963..d652e23dd5 100644 --- a/indra/newview/llpbrterrainfeatures.cpp +++ b/indra/newview/llpbrterrainfeatures.cpp @@ -86,9 +86,9 @@ void LLPBRTerrainFeatures::queryRegionCoro(std::string cap_url, LLUUID region_id { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("queryRegionCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("queryRegionCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); LLCore::HttpHeaders::ptr_t httpHeaders; httpOpts->setFollowRedirects(true); @@ -159,9 +159,9 @@ void LLPBRTerrainFeatures::modifyRegionCoro(std::string cap_url, LLSD updates, v { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("modifyRegionCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("modifyRegionCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); LLCore::HttpHeaders::ptr_t httpHeaders; httpOpts->setFollowRedirects(true); diff --git a/indra/newview/llpersistentnotificationstorage.cpp b/indra/newview/llpersistentnotificationstorage.cpp index e06d025f59..1cc311e1b5 100644 --- a/indra/newview/llpersistentnotificationstorage.cpp +++ b/indra/newview/llpersistentnotificationstorage.cpp @@ -141,7 +141,7 @@ void LLPersistentNotificationStorage::loadNotifications() ++notification_it) { LLSD notification_params = *notification_it; - LLNotificationPtr notification(new LLNotification(notification_params)); + LLNotificationPtr notification = std::make_shared<LLNotification>(notification_params); LLNotificationResponderPtr responder(createResponder(notification_params["name"], notification_params["responder"])); notification->setResponseFunctor(responder); diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 86291708b0..e5c84728fe 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -646,18 +646,17 @@ bool LLPhysicsMotion::onUpdate(F32 time) velocity_new_local = 0; } - // Check for NaN values. A NaN value is detected if the variables doesn't equal itself. - // If NaN, then reset everything. - if ((mPosition_local != mPosition_local) || - (mVelocity_local != mVelocity_local) || - (position_new_local != position_new_local)) + // Check for NaN values. If NaN, then reset everything. + if (llisnan(mPosition_local) || + llisnan(mVelocity_local) || + llisnan(position_new_local)) { - position_new_local = 0; - mVelocity_local = 0; - mVelocityJoint_local = 0; - mAccelerationJoint_local = 0; - mPosition_local = 0; - mPosition_world = LLVector3(0,0,0); + position_new_local = 0.f; + mVelocity_local = 0.f; + mVelocityJoint_local = 0.f; + mAccelerationJoint_local = 0.f; + mPosition_local = 0.f; + mPosition_world = LLVector3(0.f,0.f,0.f); } const F32 position_new_local_clamped = llclamp(position_new_local, diff --git a/indra/newview/llpopupview.cpp b/indra/newview/llpopupview.cpp index cc55b3c8db..16149b7e33 100644 --- a/indra/newview/llpopupview.cpp +++ b/indra/newview/llpopupview.cpp @@ -94,8 +94,8 @@ void LLPopupView::draw() LLPanel::draw(); } -bool LLPopupView::handleMouseEvent(boost::function<bool(LLView*, S32, S32)> func, - boost::function<bool(LLView*)> predicate, +bool LLPopupView::handleMouseEvent(std::function<bool(LLView*, S32, S32)> func, + std::function<bool(LLView*)> predicate, S32 x, S32 y, bool close_popups) { diff --git a/indra/newview/llpopupview.h b/indra/newview/llpopupview.h index 4a88866185..8c0db623ac 100644 --- a/indra/newview/llpopupview.h +++ b/indra/newview/llpopupview.h @@ -55,7 +55,7 @@ public: popup_list_t getCurrentPopups() { return mPopups; } private: - bool handleMouseEvent(boost::function<bool(LLView*, S32, S32)>, boost::function<bool(LLView*)>, S32 x, S32 y, bool close_popups); + bool handleMouseEvent(std::function<bool(LLView*, S32, S32)>, std::function<bool(LLView*)>, S32 x, S32 y, bool close_popups); popup_list_t mPopups; }; #endif //LL_LLROOTVIEW_H diff --git a/indra/newview/llpostcard.h b/indra/newview/llpostcard.h index cfe6f3951d..11178aa027 100644 --- a/indra/newview/llpostcard.h +++ b/indra/newview/llpostcard.h @@ -40,7 +40,7 @@ class LLPostCard LOG_CLASS(LLPostCard); public: - typedef boost::function<void(bool ok)> result_callback_t; + typedef std::function<void(bool ok)> result_callback_t; static void setPostResultCallback(result_callback_t cb) { mResultCallback = cb; } static void reportPostResult(bool ok); diff --git a/indra/newview/llpresetsmanager.cpp b/indra/newview/llpresetsmanager.cpp index afd58af056..84455bb679 100644 --- a/indra/newview/llpresetsmanager.cpp +++ b/indra/newview/llpresetsmanager.cpp @@ -26,8 +26,6 @@ #include "llviewerprecompiledheaders.h" -#include <boost/assign/list_of.hpp> - #include "llpresetsmanager.h" #include "lldiriterator.h" @@ -250,17 +248,17 @@ void LLPresetsManager::settingChanged() void LLPresetsManager::getControlNames(std::vector<std::string>& names) { - const std::vector<std::string> camera_controls = boost::assign::list_of + const std::vector<std::string> camera_controls = { // From panel_preferences_move.xml - ("CameraAngle") - ("CameraOffsetScale") + "CameraAngle", + "CameraOffsetScale", // From llagentcamera.cpp - ("CameraOffsetBuild") - ("TrackFocusObject") - ("CameraOffsetRearView") - ("FocusOffsetRearView") - ("AvatarSitRotation") - ; + "CameraOffsetBuild", + "TrackFocusObject", + "CameraOffsetRearView", + "FocusOffsetRearView", + "AvatarSitRotation", + }; names = camera_controls; } diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 02a4c7fb26..c2aa4925bd 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -703,9 +703,10 @@ void LLScriptEdCore::sync() } } -bool LLScriptEdCore::hasChanged() +bool LLScriptEdCore::hasChanged() const { - if (!mEditor) return false; + if (!mEditor) + return false; return ((!mEditor->isPristine() || mEnableSave) && mHasScriptData); } diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index 70ee1a4274..a56697117a 100644 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -58,7 +58,7 @@ class LLScriptMovedObserver; class LLLiveLSLFile : public LLLiveFile { public: - typedef boost::function<bool(const std::string& filename)> change_callback_t; + typedef std::function<bool(const std::string& filename)> change_callback_t; LLLiveLSLFile(std::string file_path, change_callback_t change_cb); ~LLLiveLSLFile(); @@ -143,7 +143,7 @@ public: void setItemRemoved(bool script_removed){mScriptRemoved = script_removed;}; void setAssetID( const LLUUID& asset_id){ mAssetID = asset_id; }; - LLUUID getAssetID() { return mAssetID; } + LLUUID getAssetID() const { return mAssetID; } bool isFontSizeChecked(const LLSD &userdata); void onChangeFontSize(const LLSD &size_name); @@ -155,7 +155,7 @@ public: void onBtnDynamicHelp(); void onBtnUndoChanges(); - bool hasChanged(); + bool hasChanged() const; void selectFirstError(); @@ -211,7 +211,6 @@ class LLScriptEdContainer : public LLPreview public: LLScriptEdContainer(const LLSD& key); - LLScriptEdContainer(const LLSD& key, const bool live); bool handleKeyHere(KEY key, MASK mask); diff --git a/indra/newview/llproductinforequest.cpp b/indra/newview/llproductinforequest.cpp index 728cb22431..d962622dfd 100644 --- a/indra/newview/llproductinforequest.cpp +++ b/indra/newview/llproductinforequest.cpp @@ -70,8 +70,8 @@ void LLProductInfoRequestManager::getLandDescriptionsCoro(std::string url) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("genericPostCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("getLandDescriptionsCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD result = httpAdapter->getAndSuspend(httpRequest, url); diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index 2c09943b83..c77fc6dc84 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -81,6 +81,8 @@ bool LLProgressView::postBuild() { mProgressBar = getChild<LLProgressBar>("login_progress_bar"); + mLogosLabel = getChild<LLTextBox>("logos_lbl"); + mProgressText = getChild<LLTextBox>("progress_text"); mMessageText = getChild<LLTextBox>("message_text"); mMessageTextRectInitial = mMessageText->getRect(); // auto resizes, save initial size @@ -239,6 +241,33 @@ void LLProgressView::drawStartTexture(F32 alpha) gGL.popMatrix(); } +void LLProgressView::drawLogos(F32 alpha) +{ + if (mLogosList.empty()) + { + return; + } + + // logos are tied to label, + // due to potential resizes we have to figure offsets out on draw or resize + S32 offset_x, offset_y; + mLogosLabel->localPointToScreen(0, 0, &offset_x, &offset_y); + std::vector<TextureData>::const_iterator iter = mLogosList.begin(); + std::vector<TextureData>::const_iterator end = mLogosList.end(); + for (; iter != end; iter++) + { + gl_draw_scaled_image_with_border(iter->mDrawRect.mLeft + offset_x, + iter->mDrawRect.mBottom + offset_y, + iter->mDrawRect.getWidth(), + iter->mDrawRect.getHeight(), + iter->mTexturep.get(), + UI_VERTEX_COLOR % alpha, + false, + iter->mClipRect, + iter->mOffsetRect); + } +} + void LLProgressView::draw() { static LLTimer timer; @@ -254,6 +283,7 @@ void LLProgressView::draw() } LLPanel::draw(); + drawLogos(alpha); return; } @@ -266,6 +296,7 @@ void LLProgressView::draw() drawStartTexture(alpha); LLPanel::draw(); + drawLogos(alpha); // faded out completely - remove panel and reveal world if (mFadeToWorldTimer.getElapsedTimeF32() > FADE_TO_WORLD_TIME ) @@ -300,6 +331,7 @@ void LLProgressView::draw() drawStartTexture(1.0f); // draw children LLPanel::draw(); + drawLogos(1.0f); } void LLProgressView::setText(const std::string& text) @@ -330,6 +362,98 @@ void LLProgressView::setMessage(const std::string& msg) } } +void LLProgressView::loadLogo(const std::string &path, + const U8 image_codec, + const LLRect &pos_rect, + const LLRectf &clip_rect, + const LLRectf &offset_rect) +{ + // We need these images very early, so we have to force-load them, otherwise they might not load in time. + if (!gDirUtilp->fileExists(path)) + { + return; + } + + LLPointer<LLImageFormatted> start_image_frmted = LLImageFormatted::createFromType(image_codec); + if (!start_image_frmted->load(path)) + { + LL_WARNS("AppInit") << "Image load failed: " << path << LL_ENDL; + return; + } + + LLPointer<LLImageRaw> raw = new LLImageRaw; + if (!start_image_frmted->decode(raw, 0.0f)) + { + LL_WARNS("AppInit") << "Image decode failed " << path << LL_ENDL; + return; + } + // HACK: getLocalTexture allows only power of two dimentions + raw->expandToPowerOfTwo(); + + TextureData data; + data.mTexturep = LLViewerTextureManager::getLocalTexture(raw.get(), false); + data.mDrawRect = pos_rect; + data.mClipRect = clip_rect; + data.mOffsetRect = offset_rect; + mLogosList.push_back(data); +} + +void LLProgressView::initLogos() +{ + mLogosList.clear(); + +#if LL_FMODSTUDIO || LL_HAVOK + const U8 image_codec = IMG_CODEC_PNG; + const LLRectf default_clip(0.f, 1.f, 1.f, 0.f); + //const S32 default_height = 28; + const S32 default_pad = 15; + + S32 icon_width, icon_height; + + // We don't know final screen rect yet, so we can't precalculate position fully + S32 texture_start_x = (S32)mLogosLabel->getFont()->getWidthF32(mLogosLabel->getWText().c_str()) + default_pad; + S32 texture_start_y = -7; +#endif //LL_FMODSTUDIO || LL_HAVOK + + // Normally we would just preload these textures from textures.xml, + // and display them via icon control, but they are only needed on + // startup and preloaded/UI ones stay forever + // (and this code was done already so simply reused it) + std::string temp_str = gDirUtilp->getExpandedFilename(LL_PATH_DEFAULT_SKIN, "textures", "3p_icons"); + + temp_str += gDirUtilp->getDirDelimiter(); + +#ifdef LL_FMODSTUDIO + // original image size is 264x96, it is on longer side but + // with no internal paddings so it gets additional padding + icon_width = 77; + icon_height = 21; + S32 pad_fmod_y = 4; + texture_start_x++; + loadLogo(temp_str + "fmod_logo.png", + image_codec, + LLRect(texture_start_x, texture_start_y + pad_fmod_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_fmod_y), + default_clip, + default_clip); + + texture_start_x += icon_width + default_pad + 1; +#endif //LL_FMODSTUDIO +#ifdef LL_HAVOK + // original image size is 342x113, central element is on a larger side + // plus internal padding, so it gets slightly more height than desired 32 + icon_width = 88; + icon_height = 29; + S32 pad_havok_y = -1; + loadLogo(temp_str + "havok_logo.png", + image_codec, + LLRect(texture_start_x, texture_start_y + pad_havok_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_havok_y), + default_clip, + default_clip); + + texture_start_x += icon_width + default_pad; +#endif //LL_HAVOK +} + void LLProgressView::initStartTexture(S32 location_id, bool is_in_production) { if (gStartTexture.notNull()) @@ -408,11 +532,19 @@ void LLProgressView::initStartTexture(S32 location_id, bool is_in_production) void LLProgressView::initTextures(S32 location_id, bool is_in_production) { initStartTexture(location_id, is_in_production); + initLogos(); + + childSetVisible("panel_icons", !mLogosList.empty()); + childSetVisible("panel_top_spacer", mLogosList.empty()); } void LLProgressView::releaseTextures() { gStartTexture = NULL; + mLogosList.clear(); + + childSetVisible("panel_top_spacer", true); + childSetVisible("panel_icons", false); } void LLProgressView::setCancelButtonVisible(bool b, const std::string& label) diff --git a/indra/newview/llprogressview.h b/indra/newview/llprogressview.h index 250ee511d7..f529c16c1d 100644 --- a/indra/newview/llprogressview.h +++ b/indra/newview/llprogressview.h @@ -53,6 +53,7 @@ public: /*virtual*/ void draw(); void drawStartTexture(F32 alpha); + void drawLogos(F32 alpha); /*virtual*/ bool handleHover(S32 x, S32 y, MASK mask); /*virtual*/ bool handleKeyHere(KEY key, MASK mask); @@ -85,6 +86,7 @@ public: protected: LLProgressBar* mProgressBar; LLMediaCtrl* mMediaCtrl; + LLTextBox* mLogosLabel = nullptr; LLTextBox* mProgressText = nullptr; LLTextBox* mMessageText = nullptr; F32 mPercentDone; @@ -110,8 +112,25 @@ protected: bool handleUpdate(const LLSD& event_data); static void onIdle(void* user_data); + void loadLogo(const std::string &path, const U8 image_codec, const LLRect &pos_rect, const LLRectf &clip_rect, const LLRectf &offset_rect); + // logos have unusual location and need to be preloaded to not appear grey, then deleted + void initLogos(); // Loads a bitmap to display during load void initStartTexture(S32 location_id, bool is_in_production); + +private: + // We need to draw textures on login, but only once. + // So this vector gets filled up for textures to render and gets cleaned later + // Some textures have unusual requirements, so we are rendering directly + class TextureData + { + public: + LLPointer<LLViewerTexture> mTexturep; + LLRect mDrawRect; + LLRectf mClipRect; + LLRectf mOffsetRect; + }; + std::vector<TextureData> mLogosList; }; #endif // LL_LLPROGRESSVIEW_H diff --git a/indra/newview/llreflectionmap.cpp b/indra/newview/llreflectionmap.cpp index f3adb52d5e..7f5076bd56 100644 --- a/indra/newview/llreflectionmap.cpp +++ b/indra/newview/llreflectionmap.cpp @@ -52,6 +52,9 @@ LLReflectionMap::~LLReflectionMap() void LLReflectionMap::update(U32 resolution, U32 face, bool force_dynamic, F32 near_clip, bool useClipPlane, LLPlane clipPlane) { LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY; + if (!mCubeArray.notNull()) + return; + mLastUpdateTime = gFrameTimeSeconds; llassert(mCubeArray.notNull()); llassert(mCubeIndex != -1); @@ -174,7 +177,7 @@ void LLReflectionMap::autoAdjustOrigin() mPriority = 1; mOrigin.load3(mViewerObject->getPositionAgent().mV); - if (mViewerObject->getVolume() && ((LLVOVolume*)mViewerObject)->getReflectionProbeIsBox()) + if (mViewerObject->getVolume() && ((LLVOVolume*)mViewerObject.get())->getReflectionProbeIsBox()) { LLVector3 s = mViewerObject->getScale().scaledVec(LLVector3(0.5f, 0.5f, 0.5f)); mRadius = s.magVec(); diff --git a/indra/newview/llreflectionmap.h b/indra/newview/llreflectionmap.h index d20bba7059..39ec06a167 100644 --- a/indra/newview/llreflectionmap.h +++ b/indra/newview/llreflectionmap.h @@ -103,6 +103,9 @@ public: // last time this probe was bound for rendering F32 mLastBindTime = 0.f; + // Next update time + F32 mNextUpdateTime = 0.f; + // cube map used to sample this environment map LLPointer<LLCubeMapArray> mCubeArray; S32 mCubeIndex = -1; // index into cube map array or -1 if not currently stored in cube map array @@ -110,6 +113,9 @@ public: // probe has had at least one full update and is ready to render bool mComplete = false; + // number of tiees the probe has been completed + U32 mCompletedCount = 0; + // fade in parameter for this probe F32 mFadeIn = 0.f; @@ -124,7 +130,7 @@ public: LLSpatialGroup* mGroup = nullptr; // viewer object this probe is tracking (if any) - LLViewerObject* mViewerObject = nullptr; + LLPointer<LLViewerObject> mViewerObject; // what priority should this probe have (higher is higher priority) // currently only 0 or 1 diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp index 2708d5edf0..aa48035aa8 100644 --- a/indra/newview/llreflectionmapmanager.cpp +++ b/indra/newview/llreflectionmapmanager.cpp @@ -54,6 +54,7 @@ #endif LLPointer<LLImageGL> gEXRImage; +//LLTrace::BlockTimerStatHandle FTM_RENDER_RADIANCE("Render Radiance"); void load_exr(const std::string& filename) { @@ -144,13 +145,14 @@ static void touch_default_probe(LLReflectionMap* probe) LLReflectionMapManager::LLReflectionMapManager() { + mDynamicProbeCount = LL_MAX_REFLECTION_PROBE_COUNT; initCubeFree(); } void LLReflectionMapManager::initCubeFree() { // start at 1 because index 0 is reserved for mDefaultProbe - for (int i = 1; i < LL_MAX_REFLECTION_PROBE_COUNT; ++i) + for (U32 i = 1; i < mDynamicProbeCount; ++i) { mCubeFree.push_back(i); } @@ -210,6 +212,7 @@ void LLReflectionMapManager::update() } LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY; + LL_PROFILE_GPU_ZONE("reflection manager update"); llassert(!gCubeSnapshot); // assert a snapshot is not in progress if (LLAppViewer::instance()->logoutRequestSent()) { @@ -221,13 +224,83 @@ void LLReflectionMapManager::update() resume(); } + static LLCachedControl<F32> sProbeUpdateSlowDown(gSavedSettings, "MPRenderProbeSlowDown", 0.05); + + bool realtime = mRenderReflectionProbeDetail >= (S32)LLReflectionMapManager::DetailLevel::REALTIME; + + if(sProbeUpdateSlowDown > 0.0) + { + if ( mLastUpdate > 0.f ) + { + F32 elapsed = gFrameTimeSeconds - mLastUpdate; + if (elapsed > 0.0 && elapsed < sProbeUpdateSlowDown) + { + return; + } + } + } + + mLastUpdate = gFrameTimeSeconds; + + mResetFade = llmin((F32)(mResetFade + gFrameIntervalSeconds * 2.f), 1.f); + + { + U32 probe_count_temp = mDynamicProbeCount; + if (mRenderReflectionProbeDynamicAllocation > -1) + { + if (mRenderReflectionProbeLevel == 0) + { + mDynamicProbeCount = 1; + } + else if (mRenderReflectionProbeLevel == 1) + { + mDynamicProbeCount = (U32)mProbes.size(); + } + else if (mRenderReflectionProbeLevel == 2) + { + mDynamicProbeCount = llmax((U32)mProbes.size(), 128); + } + else + { + mDynamicProbeCount = 256; + } + + if (mRenderReflectionProbeDynamicAllocation > 1) + { + // Round mDynamicProbeCount to the nearest increment of 16 + mDynamicProbeCount = ((mDynamicProbeCount + mRenderReflectionProbeDynamicAllocation / 2) / mRenderReflectionProbeDynamicAllocation) * 16; + mDynamicProbeCount = llclamp(mDynamicProbeCount, 1, mRenderReflectionProbeCount); + } + else + { + mDynamicProbeCount = llclamp(mDynamicProbeCount + mRenderReflectionProbeDynamicAllocation, 1, mRenderReflectionProbeCount); + } + } + else + { + mDynamicProbeCount = mRenderReflectionProbeCount; + } + + mDynamicProbeCount = llmin(mDynamicProbeCount, LL_MAX_REFLECTION_PROBE_COUNT); + + if (mDynamicProbeCount != probe_count_temp) + mResetFade = 1.f; + } + initReflectionMaps(); static LLCachedControl<bool> render_hdr(gSavedSettings, "RenderHDREnabled", true); + static LLCachedControl<U32> MPColorPrecision(gSavedSettings, "MPColorPrecision", 0); + + U32 color_fmt = render_hdr ? GL_R11F_G11F_B10F : GL_RGB8; + + if(MPColorPrecision == 1) + { + color_fmt = GL_RGB8; + } if (!mRenderTarget.isComplete()) { - U32 color_fmt = render_hdr ? GL_R11F_G11F_B10F : GL_RGB8; U32 targetRes = mProbeResolution * 4; // super sample mRenderTarget.allocate(targetRes, targetRes, color_fmt, true); } @@ -240,7 +313,7 @@ void LLReflectionMapManager::update() mMipChain.resize(count); for (U32 i = 0; i < count; ++i) { - mMipChain[i].allocate(res, res, render_hdr ? GL_R11F_G11F_B10F : GL_RGB8); + mMipChain[i].allocate(res, res, color_fmt); res /= 2; } } @@ -278,11 +351,6 @@ void LLReflectionMapManager::update() bool did_update = false; - static LLCachedControl<S32> sDetail(gSavedSettings, "RenderReflectionProbeDetail", -1); - static LLCachedControl<S32> sLevel(gSavedSettings, "RenderReflectionProbeLevel", 3); - - bool realtime = sDetail >= (S32)LLReflectionMapManager::DetailLevel::REALTIME; - LLReflectionMap* closestDynamic = nullptr; LLReflectionMap* oldestProbe = nullptr; @@ -315,6 +383,10 @@ void LLReflectionMapManager::update() probe->mCubeArray = nullptr; probe->mCubeIndex = -1; probe->mComplete = false; + probe->mCompletedCount = 0; + probe->mLastUpdateTime = 0.0; + probe->mNextUpdateTime = 0.0; + probe->mFadeIn = 0; } } @@ -335,6 +407,10 @@ void LLReflectionMapManager::update() } } + mResetFade = llmin((F32)(mResetFade + gFrameIntervalSeconds * 2.f), 1.f); + + static LLCachedControl<F32> sDefaultUpdatePeriod(gSavedSettings, "RenderDefaultProbeUpdatePeriod", 2.0); + for (unsigned int i = 0; i < mProbes.size(); ++i) { LLReflectionMap* probe = mProbes[i]; @@ -351,6 +427,8 @@ void LLReflectionMapManager::update() continue; } + // Calculating distance + LLVector4a d; if (probe != mDefaultProbe) @@ -362,13 +440,14 @@ void LLReflectionMapManager::update() d.setSub(camera_pos, probe->mOrigin); probe->mDistance = d.getLength3().getF32() - probe->mRadius; } - else if (probe->mComplete) + else if (mDefaultProbe->mComplete) { // make default probe have a distance of 64m for the purposes of prioritization (if it's already been generated once) probe->mDistance = 64.f; } else { + probe->mNextUpdateTime = 0.f; probe->mDistance = -4096.f; //boost priority of default probe when it's not complete } @@ -377,8 +456,13 @@ void LLReflectionMapManager::update() probe->autoAdjustOrigin(); probe->mFadeIn = llmin((F32) (probe->mFadeIn + gFrameIntervalSeconds), 1.f); } + + // Guess oldest probe + if (probe->mOccluded && probe->mComplete) { + // occluded probe + if (oldestOccluded == nullptr) { oldestOccluded = probe; @@ -407,7 +491,7 @@ void LLReflectionMapManager::update() closestDynamic = probe; } - if (sLevel == 0) + if (mRenderReflectionProbeLevel == 0) { // only update default probe when coverage is set to none llassert(probe == mDefaultProbe); @@ -415,6 +499,8 @@ void LLReflectionMapManager::update() } } + // realtime + if (realtime && closestDynamic != nullptr) { LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("rmmu - realtime"); @@ -430,21 +516,23 @@ void LLReflectionMapManager::update() { updateProbeFace(closestDynamic, i); } + if(mRealtimeRadiancePass) updateProbeRadiance(closestDynamic); + else updateProbeIrradiance(closestDynamic); mRealtimeRadiancePass = !mRealtimeRadiancePass; // restore "isRadiancePass" mRadiancePass = radiance_pass; } - static LLCachedControl<F32> sUpdatePeriod(gSavedSettings, "RenderDefaultProbeUpdatePeriod", 2.f); - if ((gFrameTimeSeconds - mDefaultProbe->mLastUpdateTime) < sUpdatePeriod) + if ((gFrameTimeSeconds - mDefaultProbe->mLastUpdateTime) < sDefaultUpdatePeriod) { - if (sLevel == 0) +// if (sLevel == 0 && mDefaultProbe->mComplete) + if (mRenderReflectionProbeLevel == 0) { // when probes are disabled don't update the default probe more often than the prescribed update period oldestProbe = nullptr; } } - else if (sLevel > 0) + else if (mRenderReflectionProbeLevel > 0) { // when probes are enabled don't update the default probe less often than the prescribed update period oldestProbe = mDefaultProbe; } @@ -455,11 +543,21 @@ void LLReflectionMapManager::update() LLReflectionMap* probe = oldestProbe; llassert(probe->mCubeIndex != -1); + bool shouldUpdate = true; + + if( probe->mNextUpdateTime > 0.f && gFrameTimeSeconds < probe->mNextUpdateTime) + { + shouldUpdate = false; + } + + if(shouldUpdate) + { probe->autoAdjustOrigin(); sUpdateCount++; mUpdatingProbe = probe; doProbeUpdate(); + } } if (oldestOccluded) @@ -470,6 +568,14 @@ void LLReflectionMapManager::update() } } +void LLReflectionMapManager::refreshSettings() +{ + mRenderReflectionProbeDetail = gSavedSettings.getS32("RenderReflectionProbeDetail"); + mRenderReflectionProbeLevel = gSavedSettings.getS32("RenderReflectionProbeLevel"); + mRenderReflectionProbeCount = gSavedSettings.getU32("RenderReflectionProbeCount"); + mRenderReflectionProbeDynamicAllocation = gSavedSettings.getS32("RenderReflectionProbeDynamicAllocation"); +} + LLReflectionMap* LLReflectionMapManager::addProbe(LLSpatialGroup* group) { if (gGLManager.mGLVersion < 4.05f || !LLPipeline::sReflectionProbesEnabled) @@ -505,6 +611,16 @@ LLReflectionMap* LLReflectionMapManager::addProbe(LLSpatialGroup* group) return probe; } +U32 LLReflectionMapManager::probeCount() +{ + return mDynamicProbeCount; +} + +U32 LLReflectionMapManager::probeMemory() +{ + return (mDynamicProbeCount * 6 * (mProbeResolution * mProbeResolution) * 4) / 1024 / 1024 + (mDynamicProbeCount * 6 * (LL_IRRADIANCE_MAP_RESOLUTION * LL_IRRADIANCE_MAP_RESOLUTION) * 4) / 1024 / 1024; +} + struct CompareProbeDepth { bool operator()(const LLReflectionMap* lhs, const LLReflectionMap* rhs) @@ -657,11 +773,19 @@ void LLReflectionMapManager::doProbeUpdate() LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY; llassert(mUpdatingProbe != nullptr); - updateProbeFace(mUpdatingProbe, mUpdatingFace); + if(mUpdatingFace < 6) + { + updateProbeFace(mUpdatingProbe, mUpdatingFace); + } + else + { + if(isRadiancePass()) updateProbeRadiance(mUpdatingProbe); + else updateProbeIrradiance(mUpdatingProbe); + } bool debug_updates = gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PROBE_UPDATES) && mUpdatingProbe->mViewerObject; - if (++mUpdatingFace == 6) + if (mUpdatingFace == 6) { if (debug_updates) { @@ -671,7 +795,23 @@ void LLReflectionMapManager::doProbeUpdate() mUpdatingFace = 0; if (isRadiancePass()) { + static LLCachedControl<F32> sMPUpdatePeriod(gSavedSettings, "MPRenderProbeUpdatePeriod", 15.0); + mUpdatingProbe->mComplete = true; + mUpdatingProbe->mCompletedCount++; + + LL_WARNS() << "Probe updated (" << mUpdatingProbe->mCompletedCount << ")" << LL_ENDL; + + if(mUpdatingProbe->mCompletedCount < 5) + { + //probe->mNextUpdateTime = gFrameTimeSeconds + fmax( ((F32)sMPUpdatePeriod / 2.0), 0.25); + mUpdatingProbe->mNextUpdateTime = gFrameTimeSeconds + 1.0; + } + else + { + mUpdatingProbe->mNextUpdateTime = gFrameTimeSeconds + fmax( (F32)sMPUpdatePeriod, 0.10); + } + mUpdatingProbe = nullptr; mRadiancePass = false; } @@ -680,9 +820,14 @@ void LLReflectionMapManager::doProbeUpdate() mRadiancePass = true; } } - else if (debug_updates) + else { + ++mUpdatingFace; + + if (debug_updates) + { mUpdatingProbe->mViewerObject->setDebugText(llformat("%.1f", (F32)gFrameTimeSeconds), LLColor4(1, 1, 0, 1)); + } } } @@ -696,6 +841,8 @@ void LLReflectionMapManager::doProbeUpdate() // In effect this simulates single-bounce lighting. void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face) { + LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY; + LL_PROFILE_GPU_ZONE("probe update"); // hacky hot-swap of camera specific render targets gPipeline.mRT = &gPipeline.mAuxillaryRT; @@ -722,7 +869,7 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face) } else { - llassert(gSavedSettings.getS32("RenderReflectionProbeLevel") > 0); // should never update a probe that's not the default probe if reflection coverage is none + llassert(mRenderReflectionProbeLevel > 0); // should never update a probe that's not the default probe if reflection coverage is none probe->update(mRenderTarget.getWidth(), face); } @@ -735,7 +882,7 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face) sourceIdx += 1; } - gGL.setColorMask(true, true); + gGL.setColorMask(true, false); LLGLDepthTest depth(GL_FALSE, GL_FALSE); LLGLDisable cull(GL_CULL_FACE); LLGLDisable blend(GL_BLEND); @@ -769,7 +916,8 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face) // horizontal gGaussianProgram.uniform2f(direction, 1.f, 0.f); gGL.getTexUnit(diffuseChannel)->bind(screen_rt); - mRenderTarget.bindTarget(); + mRenderTarget.bindTarget("", 1); + mRenderTarget.clear(0); gPipeline.mScreenTriangleVB->setBuffer(); gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); mRenderTarget.flush(); @@ -777,7 +925,8 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face) // vertical gGaussianProgram.uniform2f(direction, 0.f, 1.f); gGL.getTexUnit(diffuseChannel)->bind(&mRenderTarget); - screen_rt->bindTarget(); + screen_rt->bindTarget("", 1); + screen_rt->clear(0); gPipeline.mScreenTriangleVB->setBuffer(); gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); screen_rt->flush(); @@ -792,7 +941,10 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face) for (int i = 0; i < mMipChain.size(); ++i) { LL_PROFILE_GPU_ZONE("probe mip"); - mMipChain[i].bindTarget(); + + mMipChain[i].bindTarget("probe face ", 0); + mMipChain[i].clear(0); + if (i == 0) { gGL.getTexUnit(diffuseChannel)->bind(screen_rt); @@ -836,17 +988,118 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face) gGL.getTexUnit(diffuseChannel)->unbind(LLTexUnit::TT_TEXTURE); gReflectionMipProgram.unbind(); } +} - if (face == 5) - { - mMipChain[0].bindTarget(); - static LLStaticHashedString sSourceIdx("sourceIdx"); +// ===================== IRRADIANCE ================================ - if (isRadiancePass()) +void LLReflectionMapManager::updateProbeIrradiance(LLReflectionMap* probe) +{ + LL_PROFILE_GPU_ZONE("probe irradiance gen"); + + static LLStaticHashedString sMipLevel("mipLevel"); + static LLStaticHashedString sRoughness("roughness"); + static LLStaticHashedString sWidth("u_width"); + + S32 sourceIdx = mReflectionProbeCount; + + if (probe != mUpdatingProbe) + { // this is the "realtime" probe that's updating every frame, use the secondary scratch space channel + sourceIdx += 1; + } + + gGL.setColorMask(true, false); + LLGLDepthTest depth(GL_FALSE, GL_FALSE); + LLGLDisable cull(GL_CULL_FACE); + LLGLDisable blend(GL_BLEND); + + static LLStaticHashedString sSourceIdx("sourceIdx"); + + + mMipChain[0].bindTarget("irradiance", 0); + mMipChain[0].clear(); + + gIrradianceGenProgram.bind(); + +#if GL_VERSION_4_0 + S32 channel = gIrradianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY); + mTexture->bind(channel); +#endif + + gIrradianceGenProgram.uniform1i(sSourceIdx, sourceIdx); + gIrradianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD); + + mVertexBuffer->setBuffer(); + + int start_mip = 0; + // find the mip target to start with based on irradiance map resolution + for (start_mip = 0; start_mip < mMipChain.size(); ++start_mip) + { + if (mMipChain[start_mip].getWidth() == LL_IRRADIANCE_MAP_RESOLUTION) { - //generate radiance map (even if this is not the irradiance map, we need the mip chain for the irradiance map) - gRadianceGenProgram.bind(); - mVertexBuffer->setBuffer(); + break; + } + } + + int i = start_mip; + + //LL_PROFILE_GPU_ZONE("probe irradiance gen"); + + glViewport(0, 0, mMipChain[i].getWidth(), mMipChain[i].getHeight()); + + for (int cf = 0; cf < 6; ++cf) + { + LLCoordFrame frame; + frame.lookAt(LLVector3(0, 0, 0), LLCubeMapArray::sClipToCubeLookVecs[cf], LLCubeMapArray::sClipToCubeUpVecs[cf]); + + F32 mat[16]; + frame.getOpenGLRotation(mat); + gGL.loadMatrix(mat); + + mVertexBuffer->drawArrays(gGL.TRIANGLE_STRIP, 0, 4); + + S32 res = mMipChain[i].getWidth(); +#if GL_VERSION_4_0 + mIrradianceMaps->bind(channel); + glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i - start_mip, 0, 0, probe->mCubeIndex * 6 + cf, 0, 0, res, res); + mTexture->bind(channel); +#endif + //mMipChain[0].clear(0); + } + + mMipChain[0].flush(); + gIrradianceGenProgram.unbind(); +} + +// ==================== RADIANCE =========================== + +void LLReflectionMapManager::updateProbeRadiance(LLReflectionMap* probe) +{ + LL_PROFILE_GPU_ZONE("probe radiance gen"); + static LLStaticHashedString sMipLevel("mipLevel"); + static LLStaticHashedString sRoughness("roughness"); + static LLStaticHashedString sWidth("u_width"); + + S32 sourceIdx = mReflectionProbeCount; + + if (probe != mUpdatingProbe) + { // this is the "realtime" probe that's updating every frame, use the secondary scratch space channel + sourceIdx += 1; + } + + gGL.setColorMask(true, false); + LLGLDepthTest depth(GL_FALSE, GL_FALSE); + LLGLDisable cull(GL_CULL_FACE); + LLGLDisable blend(GL_BLEND); + + static LLStaticHashedString sSourceIdx("sourceIdx"); + + //LL_RECORD_BLOCK_TIME(FTM_RENDER_RADIANCE); + + mMipChain[0].bindTarget("radiance", 0); + mMipChain[0].clear(); + + gRadianceGenProgram.bind(); + mVertexBuffer->setBuffer(); #if GL_VERSION_4_0 S32 channel = gRadianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY); @@ -855,22 +1108,19 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face) gRadianceGenProgram.uniform1i(sSourceIdx, sourceIdx); gRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD); gRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_STRENGTH, 1.f); + gRadianceGenProgram.uniform1i(sWidth, mProbeResolution); U32 res = mMipChain[0].getWidth(); for (int i = 0; i < mMipChain.size(); ++i) { - LL_PROFILE_GPU_ZONE("probe radiance gen"); - static LLStaticHashedString sMipLevel("mipLevel"); - static LLStaticHashedString sRoughness("roughness"); - static LLStaticHashedString sWidth("u_width"); + glViewport(0, 0, res, res); - gRadianceGenProgram.uniform1f(sRoughness, (F32)i / (F32)(mMipChain.size() - 1)); gRadianceGenProgram.uniform1f(sMipLevel, (GLfloat)i); - gRadianceGenProgram.uniform1i(sWidth, mProbeResolution); + gRadianceGenProgram.uniform1f(sRoughness, (F32)i / (F32)(mMipChain.size() - 1)); for (int cf = 0; cf < 6; ++cf) - { // for each cube face + { LLCoordFrame frame; frame.lookAt(LLVector3(0, 0, 0), LLCubeMapArray::sClipToCubeLookVecs[cf], LLCubeMapArray::sClipToCubeUpVecs[cf]); @@ -883,70 +1133,18 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face) #if GL_VERSION_4_0 glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i, 0, 0, probe->mCubeIndex * 6 + cf, 0, 0, res, res); #endif + LOG_GLERROR("glCopyTexSubImage3D"); } if (i != mMipChain.size() - 1) { res /= 2; - glViewport(0, 0, res, res); } - } + } gRadianceGenProgram.unbind(); - } - else - { - //generate irradiance map - gIrradianceGenProgram.bind(); -#if GL_VERSION_4_0 - S32 channel = gIrradianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY); - mTexture->bind(channel); -#endif - - gIrradianceGenProgram.uniform1i(sSourceIdx, sourceIdx); - gIrradianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD); - - mVertexBuffer->setBuffer(); - int start_mip = 0; - // find the mip target to start with based on irradiance map resolution - for (start_mip = 0; start_mip < mMipChain.size(); ++start_mip) - { - if (mMipChain[start_mip].getWidth() == LL_IRRADIANCE_MAP_RESOLUTION) - { - break; - } - } - - //for (int i = start_mip; i < mMipChain.size(); ++i) - { - int i = start_mip; - LL_PROFILE_GPU_ZONE("probe irradiance gen"); - glViewport(0, 0, mMipChain[i].getWidth(), mMipChain[i].getHeight()); - for (int cf = 0; cf < 6; ++cf) - { // for each cube face - LLCoordFrame frame; - frame.lookAt(LLVector3(0, 0, 0), LLCubeMapArray::sClipToCubeLookVecs[cf], LLCubeMapArray::sClipToCubeUpVecs[cf]); - - F32 mat[16]; - frame.getOpenGLRotation(mat); - gGL.loadMatrix(mat); - - mVertexBuffer->drawArrays(gGL.TRIANGLE_STRIP, 0, 4); - - S32 res = mMipChain[i].getWidth(); -#if GL_VERSION_4_0 - mIrradianceMaps->bind(channel); - glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i - start_mip, 0, 0, probe->mCubeIndex * 6 + cf, 0, 0, res, res); - mTexture->bind(channel); -#endif - } - } - } - - mMipChain[0].flush(); - - gIrradianceGenProgram.unbind(); - } + mMipChain[0].flush(); + //mTexture->unbind(); } void LLReflectionMapManager::reset() @@ -1021,61 +1219,20 @@ void LLReflectionMapManager::updateUniforms() } LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY; + LL_PROFILE_GPU_ZONE("rmmu - uniforms") - // structure for packing uniform buffer object - // see class3/deferred/reflectionProbeF.glsl - struct ReflectionProbeData - { - // for box probes, matrix that transforms from camera space to a [-1, 1] cube representing the bounding box of - // the box probe - LLMatrix4 refBox[LL_MAX_REFLECTION_PROBE_COUNT]; - - LLMatrix4 heroBox; - - // for sphere probes, origin (xyz) and radius (w) of refmaps in clip space - LLVector4 refSphere[LL_MAX_REFLECTION_PROBE_COUNT]; - - // extra parameters - // x - irradiance scale - // y - radiance scale - // z - fade in - // w - znear - LLVector4 refParams[LL_MAX_REFLECTION_PROBE_COUNT]; - - LLVector4 heroSphere; - - // indices used by probe: - // [i][0] - cubemap array index for this probe - // [i][1] - index into "refNeighbor" for probes that intersect this probe - // [i][2] - number of probes that intersect this probe, or -1 for no neighbors - // [i][3] - priority (probe type stored in sign bit - positive for spheres, negative for boxes) - GLint refIndex[LL_MAX_REFLECTION_PROBE_COUNT][4]; - - // list of neighbor indices - GLint refNeighbor[4096]; - - GLint refBucket[256][4]; //lookup table for which index to start with for the given Z depth - // numbrer of active refmaps - GLint refmapCount; - - GLint heroShape; - GLint heroMipCount; - GLint heroProbeCount; - }; mReflectionMaps.resize(mReflectionProbeCount); getReflectionMaps(mReflectionMaps); - ReflectionProbeData rpd; - F32 minDepth[256]; for (int i = 0; i < 256; ++i) { - rpd.refBucket[i][0] = mReflectionProbeCount; - rpd.refBucket[i][1] = mReflectionProbeCount; - rpd.refBucket[i][2] = mReflectionProbeCount; - rpd.refBucket[i][3] = mReflectionProbeCount; + mProbeData.refBucket[i][0] = mReflectionProbeCount; + mProbeData.refBucket[i][1] = mReflectionProbeCount; + mProbeData.refBucket[i][2] = mReflectionProbeCount; + mProbeData.refBucket[i][3] = mReflectionProbeCount; minDepth[i] = FLT_MAX; } @@ -1095,7 +1252,11 @@ void LLReflectionMapManager::updateUniforms() bool is_ambiance_pass = gCubeSnapshot && !isRadiancePass(); F32 ambscale = is_ambiance_pass ? 0.f : 1.f; + ambscale *= mResetFade; + ambscale = llmax(0, ambscale); F32 radscale = is_ambiance_pass ? 0.5f : 1.f; + radscale *= mResetFade; + radscale = llmax(0, radscale); for (auto* refmap : mReflectionMaps) { @@ -1121,7 +1282,7 @@ void LLReflectionMapManager::updateUniforms() if (refmap->mMinDepth < minDepth[i]) { minDepth[i] = refmap->mMinDepth; - rpd.refBucket[i][0] = refmap->mProbeIndex; + mProbeData.refBucket[i][0] = refmap->mProbeIndex; } } } @@ -1134,7 +1295,7 @@ void LLReflectionMapManager::updateUniforms() { if (refmap->mViewerObject && refmap->mViewerObject->getVolume()) { // have active manual probes live-track the object they're associated with - LLVOVolume* vobj = (LLVOVolume*)refmap->mViewerObject; + LLVOVolume* vobj = (LLVOVolume*)refmap->mViewerObject.get(); refmap->mOrigin.load3(vobj->getPositionAgent().mV); @@ -1149,23 +1310,23 @@ void LLReflectionMapManager::updateUniforms() } } modelview.affineTransform(refmap->mOrigin, oa); - rpd.refSphere[count].set(oa.getF32ptr()); - rpd.refSphere[count].mV[3] = refmap->mRadius; + mProbeData.refSphere[count].set(oa.getF32ptr()); + mProbeData.refSphere[count].mV[3] = refmap->mRadius; } - rpd.refIndex[count][0] = refmap->mCubeIndex; + mProbeData.refIndex[count][0] = refmap->mCubeIndex; llassert(nc % 4 == 0); - rpd.refIndex[count][1] = nc / 4; - rpd.refIndex[count][3] = refmap->mPriority; + mProbeData.refIndex[count][1] = nc / 4; + mProbeData.refIndex[count][3] = refmap->mPriority; // for objects that are reflection probes, use the volume as the influence volume of the probe // only possibile influence volumes are boxes and spheres, so detect boxes and treat everything else as spheres - if (refmap->getBox(rpd.refBox[count])) + if (refmap->getBox(mProbeData.refBox[count])) { // negate priority to indicate this probe has a box influence volume - rpd.refIndex[count][3] = -rpd.refIndex[count][3]; + mProbeData.refIndex[count][3] = -mProbeData.refIndex[count][3]; } - rpd.refParams[count].set( + mProbeData.refParams[count].set( llmax(minimum_ambiance, refmap->getAmbiance())*ambscale, // ambiance scale radscale, // radiance scale refmap->mFadeIn, // fade in weight @@ -1192,7 +1353,7 @@ void LLReflectionMapManager::updateUniforms() } // this neighbor may be sampled - rpd.refNeighbor[ni++] = idx; + mProbeData.refNeighbor[ni++] = idx; neighbor_count++; if (neighbor_count >= max_neighbors) @@ -1205,11 +1366,11 @@ void LLReflectionMapManager::updateUniforms() if (nc == ni) { //no neighbors, tag as empty - rpd.refIndex[count][1] = -1; + mProbeData.refIndex[count][1] = -1; } else { - rpd.refIndex[count][2] = ni - nc; + mProbeData.refIndex[count][2] = ni - nc; // move the cursor forward nc = ni; @@ -1247,19 +1408,19 @@ void LLReflectionMapManager::updateUniforms() } #endif - rpd.refmapCount = count; + mProbeData.refmapCount = count; gPipeline.mHeroProbeManager.updateUniforms(); // Get the hero data. - rpd.heroBox = gPipeline.mHeroProbeManager.mHeroData.heroBox; - rpd.heroSphere = gPipeline.mHeroProbeManager.mHeroData.heroSphere; - rpd.heroShape = gPipeline.mHeroProbeManager.mHeroData.heroShape; - rpd.heroMipCount = gPipeline.mHeroProbeManager.mHeroData.heroMipCount; - rpd.heroProbeCount = gPipeline.mHeroProbeManager.mHeroData.heroProbeCount; + mProbeData.heroBox = gPipeline.mHeroProbeManager.mHeroData.heroBox; + mProbeData.heroSphere = gPipeline.mHeroProbeManager.mHeroData.heroSphere; + mProbeData.heroShape = gPipeline.mHeroProbeManager.mHeroData.heroShape; + mProbeData.heroMipCount = gPipeline.mHeroProbeManager.mHeroData.heroMipCount; + mProbeData.heroProbeCount = gPipeline.mHeroProbeManager.mHeroData.heroProbeCount; - //copy rpd into uniform buffer object + //copy mProbeData into uniform buffer object if (mUBO == 0) { glGenBuffers(1, &mUBO); @@ -1268,7 +1429,7 @@ void LLReflectionMapManager::updateUniforms() { LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("rmmsu - update buffer"); glBindBuffer(GL_UNIFORM_BUFFER, mUBO); - glBufferData(GL_UNIFORM_BUFFER, sizeof(ReflectionProbeData), &rpd, GL_STREAM_DRAW); + glBufferData(GL_UNIFORM_BUFFER, sizeof(ReflectionProbeData), &mProbeData, GL_STREAM_DRAW); glBindBuffer(GL_UNIFORM_BUFFER, 0); } @@ -1402,12 +1563,15 @@ void LLReflectionMapManager::renderDebug() void LLReflectionMapManager::initReflectionMaps() { - U32 count = LL_MAX_REFLECTION_PROBE_COUNT; - static LLCachedControl<U32> ref_probe_res(gSavedSettings, "RenderReflectionProbeResolution", 128U); U32 probe_resolution = nhpo2(llclamp(ref_probe_res(), (U32)64, (U32)512)); - if (mTexture.isNull() || mReflectionProbeCount != count || mProbeResolution != probe_resolution || mReset) + + bool shouldInit = mTexture.isNull() || mReflectionProbeCount != mDynamicProbeCount || mProbeResolution != probe_resolution || mReset; + + if (shouldInit) { + //LL_WARNS() << "====== initReflectionMaps() =======" << LL_ENDL; + if(mProbeResolution != probe_resolution) { mRenderTarget.release(); @@ -1415,9 +1579,8 @@ void LLReflectionMapManager::initReflectionMaps() } gEXRImage = nullptr; - mReset = false; - mReflectionProbeCount = count; + mReflectionProbeCount = mDynamicProbeCount; mProbeResolution = probe_resolution; mMaxProbeLOD = log2f((F32)mProbeResolution) - 1.f; // number of mips - 1 @@ -1425,15 +1588,25 @@ void LLReflectionMapManager::initReflectionMaps() mTexture->getWidth() != mProbeResolution || mReflectionProbeCount + 2 != mTexture->getCount()) { - mTexture = new LLCubeMapArray(); - static LLCachedControl<bool> render_hdr(gSavedSettings, "RenderHDREnabled", true); - // store mReflectionProbeCount+2 cube maps, final two cube maps are used for render target and radiance map generation source) - mTexture->allocate(mProbeResolution, 3, mReflectionProbeCount + 2, true, render_hdr); + if (mTexture) + { + mTexture = new LLCubeMapArray(*mTexture, mProbeResolution, mReflectionProbeCount + 2); - mIrradianceMaps = new LLCubeMapArray(); - mIrradianceMaps->allocate(LL_IRRADIANCE_MAP_RESOLUTION, 3, mReflectionProbeCount, false, render_hdr); + mIrradianceMaps = new LLCubeMapArray(*mIrradianceMaps, LL_IRRADIANCE_MAP_RESOLUTION, mReflectionProbeCount); + } + else + { + mTexture = new LLCubeMapArray(); + + // store mReflectionProbeCount+2 cube maps, final two cube maps are used for render target and radiance map generation + // source) + mTexture->allocate(mProbeResolution, 3, mReflectionProbeCount + 2, true, render_hdr); + + mIrradianceMaps = new LLCubeMapArray(); + mIrradianceMaps->allocate(LL_IRRADIANCE_MAP_RESOLUTION, 3, mReflectionProbeCount, false, render_hdr); + } } // reset probe state @@ -1448,11 +1621,14 @@ void LLReflectionMapManager::initReflectionMaps() for (auto& probe : mProbes) { probe->mLastUpdateTime = 0.f; + probe->mNextUpdateTime = 0.f; probe->mComplete = false; + probe->mCompletedCount = 0; probe->mProbeIndex = -1; probe->mCubeArray = nullptr; probe->mCubeIndex = -1; probe->mNeighbors.clear(); + probe->mFadeIn = 0; } mCubeFree.clear(); @@ -1473,6 +1649,9 @@ void LLReflectionMapManager::initReflectionMaps() mDefaultProbe->mRadius = 4096.f; mDefaultProbe->mProbeIndex = 0; mDefaultProbe->mComplete = default_complete; + mDefaultProbe->mCompletedCount = 0; + mDefaultProbe->mLastUpdateTime = 0.f; + mDefaultProbe->mNextUpdateTime = 0.f; touch_default_probe(mDefaultProbe); } diff --git a/indra/newview/llreflectionmapmanager.h b/indra/newview/llreflectionmapmanager.h index f81fb30738..337c4ca7fa 100644 --- a/indra/newview/llreflectionmapmanager.h +++ b/indra/newview/llreflectionmapmanager.h @@ -38,7 +38,7 @@ class LLViewerObject; #define LL_MAX_REFLECTION_PROBE_COUNT 256 // reflection probe resolution -#define LL_IRRADIANCE_MAP_RESOLUTION 64 +#define LL_IRRADIANCE_MAP_RESOLUTION 16 // reflection probe mininum scale #define LL_REFLECTION_PROBE_MINIMUM_SCALE 1.f; @@ -56,6 +56,51 @@ public: REALTIME = 2 }; + // General guidance for UBOs is to statically allocate all of these fields to make your life ever so slightly easier. + // Then set a "max" value for the number of probes you'll ever have, and use that to index into the arrays. + // We do this with refmapCount. The shaders will just pick up on it there. + // This data structure should _always_ match what's in class3/deferred/reflectionProbeF.glsl. + // The shader can and will break otherwise. + // -Geenz 2025-03-10 + struct ReflectionProbeData + { + // for box probes, matrix that transforms from camera space to a [-1, 1] cube representing the bounding box of + // the box probe + LLMatrix4 refBox[LL_MAX_REFLECTION_PROBE_COUNT]; + + LLMatrix4 heroBox; + + // for sphere probes, origin (xyz) and radius (w) of refmaps in clip space + LLVector4 refSphere[LL_MAX_REFLECTION_PROBE_COUNT]; + + // extra parameters + // x - irradiance scale + // y - radiance scale + // z - fade in + // w - znear + LLVector4 refParams[LL_MAX_REFLECTION_PROBE_COUNT]; + + LLVector4 heroSphere; + + // indices used by probe: + // [i][0] - cubemap array index for this probe + // [i][1] - index into "refNeighbor" for probes that intersect this probe + // [i][2] - number of probes that intersect this probe, or -1 for no neighbors + // [i][3] - priority (probe type stored in sign bit - positive for spheres, negative for boxes) + GLint refIndex[LL_MAX_REFLECTION_PROBE_COUNT][4]; + + // list of neighbor indices + GLint refNeighbor[4096]; + + GLint refBucket[256][4]; // lookup table for which index to start with for the given Z depth + // numbrer of active refmaps + GLint refmapCount; + + GLint heroShape; + GLint heroMipCount; + GLint heroProbeCount; + }; + // allocate an environment map of the given resolution LLReflectionMapManager(); @@ -65,6 +110,8 @@ public: // maintain reflection probes void update(); + void refreshSettings(); + // add a probe for the given spatial group LLReflectionMap* addProbe(LLSpatialGroup* group = nullptr); @@ -114,6 +161,9 @@ public: // with false when done. void forceDefaultProbeAndUpdateUniforms(bool force = true); + U32 probeCount(); + U32 probeMemory(); + private: friend class LLPipeline; friend class LLHeroProbeManager; @@ -121,6 +171,9 @@ private: // initialize mCubeFree array to default values void initCubeFree(); + // Just does a bulk clear of all of the cubemaps. + void clearCubeMaps(); + // delete the probe with the given index in mProbes void deleteProbe(U32 i); @@ -161,6 +214,9 @@ private: // update the specified face of the specified probe void updateProbeFace(LLReflectionMap* probe, U32 face); + void updateProbeIrradiance(LLReflectionMap* probe); + void updateProbeRadiance(LLReflectionMap* probe); + // list of active reflection maps std::vector<LLPointer<LLReflectionMap> > mProbes; @@ -195,6 +251,14 @@ private: // number of reflection probes to use for rendering U32 mReflectionProbeCount; + U32 mDynamicProbeCount; + + // cached settings from gSavedSettings + S32 mRenderReflectionProbeDetail = -1; + S32 mRenderReflectionProbeLevel = 3; + U32 mRenderReflectionProbeCount = 256U; + S32 mRenderReflectionProbeDynamicAllocation = -1; + // resolution of reflection probes U32 mProbeResolution = 128; @@ -207,8 +271,15 @@ private: // if true, reset all probe render state on the next update (for teleports and sky changes) bool mReset = false; + float mResetFade = 1.f; + float mGlobalFadeTarget = 1.f; + // if true, only update the default probe bool mPaused = false; F32 mResumeTime = 0.f; + + F32 mLastUpdate = 0.f; + + ReflectionProbeData mProbeData; }; diff --git a/indra/newview/llremoteparcelrequest.cpp b/indra/newview/llremoteparcelrequest.cpp index 7b80e8c27f..f89afd38ab 100644 --- a/indra/newview/llremoteparcelrequest.cpp +++ b/indra/newview/llremoteparcelrequest.cpp @@ -102,7 +102,15 @@ void LLRemoteParcelInfoProcessor::processParcelInfoReply(LLMessageSystem* msg, v msg->getS32 ("Data", "SalePrice", parcel_data.sale_price); msg->getS32 ("Data", "AuctionID", parcel_data.auction_id); - LLRemoteParcelInfoProcessor::observer_multimap_t & observers = LLRemoteParcelInfoProcessor::getInstance()->mObservers; + LLRemoteParcelInfoProcessor* inst = LLRemoteParcelInfoProcessor::getInstance(); + + requests_map_t::const_iterator found = inst->mPendingParcelRequests.find(parcel_data.parcel_id); + if (found != inst->mPendingParcelRequests.end()) + { + inst->mPendingParcelRequests.erase(found); + } + + LLRemoteParcelInfoProcessor::observer_multimap_t & observers = inst->mObservers; typedef std::vector<observer_multimap_t::iterator> deadlist_t; deadlist_t dead_iters; @@ -151,6 +159,15 @@ void LLRemoteParcelInfoProcessor::processParcelInfoReply(LLMessageSystem* msg, v void LLRemoteParcelInfoProcessor::sendParcelInfoRequest(const LLUUID& parcel_id) { + constexpr F32 DUPPLICATE_TIMEOUT = 0.5f; + requests_map_t::const_iterator found = mPendingParcelRequests.find(parcel_id); + if (found != mPendingParcelRequests.end() && found->second.getElapsedTimeF32() < DUPPLICATE_TIMEOUT) + { + // recently requested + return; + } + mPendingParcelRequests[parcel_id].reset(); + LLMessageSystem *msg = gMessageSystem; msg->newMessage("ParcelInfoRequest"); @@ -184,8 +201,8 @@ void LLRemoteParcelInfoProcessor::regionParcelInfoCoro(std::string url, { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("RemoteParcelRequest", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("RemoteParcelRequest", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD bodyData; diff --git a/indra/newview/llremoteparcelrequest.h b/indra/newview/llremoteparcelrequest.h index 1420b4032e..7059e14bec 100644 --- a/indra/newview/llremoteparcelrequest.h +++ b/indra/newview/llremoteparcelrequest.h @@ -91,6 +91,8 @@ public: private: typedef std::multimap<LLUUID, LLHandle<LLRemoteParcelInfoObserver> > observer_multimap_t; observer_multimap_t mObservers; + typedef std::map<LLUUID, LLTimer> requests_map_t; + requests_map_t mPendingParcelRequests; // Dupplicate request avoidance void regionParcelInfoCoro(std::string url, LLUUID regionId, LLVector3 posRegion, LLVector3d posGlobal, LLHandle<LLRemoteParcelInfoObserver> observerHandle); }; diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp index 22a9dd0027..2fdec14f6d 100644 --- a/indra/newview/llscriptfloater.cpp +++ b/indra/newview/llscriptfloater.cpp @@ -109,25 +109,27 @@ bool LLScriptFloater::toggle(const LLUUID& notification_id) LLScriptFloater* LLScriptFloater::show(const LLUUID& notification_id) { LLScriptFloater* floater = LLFloaterReg::getTypedInstance<LLScriptFloater>("script_floater", notification_id); - floater->setNotificationId(notification_id); - floater->createForm(notification_id); - - //LLDialog(LLGiveInventory and LLLoadURL) should no longer steal focus (see EXT-5445) - floater->setAutoFocus(false); - - if(LLScriptFloaterManager::OBJ_SCRIPT == LLScriptFloaterManager::getObjectType(notification_id)) + if (floater) { - floater->setSavePosition(true); - floater->restorePosition(); - } - else - { - floater->dockToChiclet(true); - } + floater->setNotificationId(notification_id); + floater->createForm(notification_id); - //LLDialog(LLGiveInventory and LLLoadURL) should no longer steal focus (see EXT-5445) - LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id, false); + //LLDialog(LLGiveInventory and LLLoadURL) should no longer steal focus (see EXT-5445) + floater->setAutoFocus(false); + if (LLScriptFloaterManager::OBJ_SCRIPT == LLScriptFloaterManager::getObjectType(notification_id)) + { + floater->setSavePosition(true); + floater->restorePosition(); + } + else + { + floater->dockToChiclet(true); + } + + //LLDialog(LLGiveInventory and LLLoadURL) should no longer steal focus (see EXT-5445) + LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id, false); + } return floater; } diff --git a/indra/newview/llscrollingpanelparam.h b/indra/newview/llscrollingpanelparam.h index 3aba4e4e40..93daf22e76 100644 --- a/indra/newview/llscrollingpanelparam.h +++ b/indra/newview/llscrollingpanelparam.h @@ -81,7 +81,6 @@ public: protected: LLTimer mMouseDownTimer; // timer for how long mouse has been held down on a hint. F32 mLastHeldTime; - bool mAllowModify; LLButton* mLessBtn; LLButton* mMoreBtn; diff --git a/indra/newview/llsearchcombobox.h b/indra/newview/llsearchcombobox.h index 17787ca5e6..e0162bac80 100644 --- a/indra/newview/llsearchcombobox.h +++ b/indra/newview/llsearchcombobox.h @@ -61,11 +61,6 @@ public: ~LLSearchComboBox(); - /** - * Sets focus to text box - */ - void focusTextEntry(); - protected: LLSearchComboBox(const Params&p); @@ -98,6 +93,11 @@ protected: */ void onSelectionCommit(); + /** + * Sets focus to text box + */ + void focusTextEntry(); + LLButton* mSearchButton; }; diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 03cf79c28c..758e91f6c9 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -252,6 +252,7 @@ LLSelectMgr::LLSelectMgr() LLSelectMgr::~LLSelectMgr() { clearSelections(); + mSlectionLodModChangedConnection.disconnect(); } void LLSelectMgr::clearSelections() @@ -1996,8 +1997,94 @@ bool LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id) } } + // If this face already has the target material ID, do nothing. + // This prevents re-sending the same ID on OK, which can cause the server + // to drop overrides when queueApply is invoked with the OLD id. + if (objectp->getRenderMaterialID(te) == asset_id) + { + return true; + } + + // Preserve existing texture transforms when switching to PBR material + LLTextureEntry* tep = objectp->getTE(te); + bool should_preserve_transforms = false; + LLGLTFMaterial* preserved_override = nullptr; + + if (tep && asset_id.notNull()) + { + // Only preserve transforms from existing GLTF material override + // Do not fall back to texture entry transforms when switching between PBR materials + LLGLTFMaterial* existing_override = tep->getGLTFMaterialOverride(); + if (existing_override) + { + // Check if existing override has non-default transforms + const LLGLTFMaterial::TextureTransform& existing_transform = existing_override->mTextureTransform[0]; + const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform(); + + if (existing_transform.mScale != default_transform.mScale || + existing_transform.mOffset != default_transform.mOffset || + existing_transform.mRotation != default_transform.mRotation) + { + // Preserve non-default transforms from current PBR material + preserved_override = new LLGLTFMaterial(); + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) + { + preserved_override->mTextureTransform[i].mScale = existing_transform.mScale; + preserved_override->mTextureTransform[i].mOffset = existing_transform.mOffset; + preserved_override->mTextureTransform[i].mRotation = existing_transform.mRotation; + } + should_preserve_transforms = true; + } + // If existing override has default transforms, don't preserve anything + } + else + { + // No existing PBR material override - check texture entry transforms + // This handles the case of switching from Blinn-Phong to PBR material + F32 existing_scale_s, existing_scale_t, existing_offset_s, existing_offset_t, existing_rotation; + tep->getScale(&existing_scale_s, &existing_scale_t); + tep->getOffset(&existing_offset_s, &existing_offset_t); + existing_rotation = tep->getRotation(); + + const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform(); + if (existing_scale_s != default_transform.mScale.mV[0] || existing_scale_t != default_transform.mScale.mV[1] || + existing_offset_s != default_transform.mOffset.mV[0] || existing_offset_t != default_transform.mOffset.mV[1] || + existing_rotation != default_transform.mRotation) + { + // Preserve non-default transforms from texture entry + preserved_override = new LLGLTFMaterial(); + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) + { + LLVector2 pbr_scale, pbr_offset; + F32 pbr_rotation; + LLGLTFMaterial::convertTextureTransformToPBR( + existing_scale_s, existing_scale_t, + existing_offset_s, existing_offset_t, + existing_rotation, + pbr_scale, pbr_offset, pbr_rotation); + preserved_override->mTextureTransform[i].mScale = pbr_scale; + preserved_override->mTextureTransform[i].mOffset = pbr_offset; + preserved_override->mTextureTransform[i].mRotation = pbr_rotation; + } + should_preserve_transforms = true; + } + } + } + + objectp->clearTEWaterExclusion(te); // Blank out most override data on the object and send to server - objectp->setRenderMaterialID(te, asset_id); + if (should_preserve_transforms && preserved_override) + { + // Apply material with preserved transforms + LLGLTFMaterialList::queueApply(objectp, te, asset_id, preserved_override); + // Update local state + objectp->setRenderMaterialID(te, asset_id, false, true); + tep->setGLTFMaterialOverride(preserved_override); + } + else + { + objectp->setRenderMaterialID(te, asset_id); + } return true; } @@ -2248,6 +2335,7 @@ void LLSelectMgr::selectionRevertGLTFMaterials() { // Restore base material LLUUID asset_id = nodep->mSavedGLTFMaterialIds[te]; + LLUUID old_asset_id = objectp->getRenderMaterialID(te); // Update material locally objectp->setRenderMaterialID(te, asset_id, false /*wait for LLGLTFMaterialList update*/); @@ -2258,18 +2346,15 @@ void LLSelectMgr::selectionRevertGLTFMaterials() objectp->setTEGLTFMaterialOverride(te, material); } - // Enqueue update to server - if (asset_id.notNull() && material) + if (asset_id.isNull() || !material) { - // Restore overrides and base material - LLGLTFMaterialList::queueApply(objectp, te, asset_id, material); + //blank override out + LLGLTFMaterialList::queueApply(objectp, te, asset_id); } else { - //blank override out - LLGLTFMaterialList::queueApply(objectp, te, asset_id); + LLGLTFMaterialList::queueApply(objectp, te, asset_id, material); } - } return true; } @@ -2477,6 +2562,7 @@ void LLSelectMgr::selectionSetMedia(U8 media_type, const LLSD &media_data) } else { // Add/update media + object->clearTEWaterExclusion(te); object->setTEMediaFlags(te, mMediaFlags); LLVOVolume *vo = dynamic_cast<LLVOVolume*>(object); llassert(NULL != vo); @@ -3138,22 +3224,46 @@ void LLSelectMgr::adjustTexturesByScale(bool send_to_sim, bool stretch) F32 scale_x = 1; F32 scale_y = 1; + F32 offset_x = 0; + F32 offset_y = 0; - for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) + if (te_num < selectNode->mGLTFScaleRatios.size()) { - LLVector3 scale_ratio = selectNode->mGLTFScaleRatios[te_num][i]; - - if (planar) + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) { - scale_x = scale_ratio.mV[s_axis] / object_scale.mV[s_axis]; - scale_y = scale_ratio.mV[t_axis] / object_scale.mV[t_axis]; - } - else - { - scale_x = scale_ratio.mV[s_axis] * object_scale.mV[s_axis]; - scale_y = scale_ratio.mV[t_axis] * object_scale.mV[t_axis]; + LLVector3 scale_ratio = selectNode->mGLTFScaleRatios[te_num][i]; + + if (planar) + { + scale_x = scale_ratio.mV[s_axis] / object_scale.mV[s_axis]; + scale_y = scale_ratio.mV[t_axis] / object_scale.mV[t_axis]; + } + else + { + scale_x = scale_ratio.mV[s_axis] * object_scale.mV[s_axis]; + scale_y = scale_ratio.mV[t_axis] * object_scale.mV[t_axis]; + } + material->mTextureTransform[i].mScale.set(scale_x, scale_y); + + LLVector2 scales = selectNode->mGLTFScales[te_num][i]; + LLVector2 offsets = selectNode->mGLTFOffsets[te_num][i]; + F64 int_part = 0; + offset_x = (F32)modf((offsets[VX] + (scales[VX] - scale_x)) / 2, &int_part); + if (offset_x < 0) + { + offset_x++; + } + offset_y = (F32)modf((offsets[VY] + (scales[VY] - scale_y)) / 2, &int_part); + if (offset_y < 0) + { + offset_y++; + } + material->mTextureTransform[i].mOffset.set(offset_x, offset_y); } - material->mTextureTransform[i].mScale.set(scale_x, scale_y); + } + else + { + llassert(false); // make sure mGLTFScaleRatios is filled } const LLGLTFMaterial* base_material = tep->getGLTFMaterial(); @@ -6506,7 +6616,7 @@ void LLSelectMgr::renderSilhouettes(bool for_hud) gGL.popMatrix(); gGL.popMatrix(); - glLineWidth(1.f); + //glLineWidth(1.f); #if GL_VERSION_1_1 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); #endif @@ -6908,10 +7018,11 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query) { mTextureScaleRatios.clear(); mGLTFScaleRatios.clear(); + mGLTFScales.clear(); + mGLTFOffsets.clear(); if (mObject.notNull()) { - LLVector3 scale = mObject->getScale(); for (U8 i = 0; i < mObject->getNumTEs(); i++) @@ -6948,6 +7059,8 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query) F32 scale_x = 1; F32 scale_y = 1; std::vector<LLVector3> material_v_vec; + std::vector<LLVector2> material_scales_vec; + std::vector<LLVector2> material_offset_vec; for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) { if (material) @@ -6955,12 +7068,16 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query) LLGLTFMaterial::TextureTransform& transform = material->mTextureTransform[i]; scale_x = transform.mScale[VX]; scale_y = transform.mScale[VY]; + material_scales_vec.push_back(transform.mScale); + material_offset_vec.push_back(transform.mOffset); } else { // Not having an override doesn't mean that there is no material scale_x = 1; scale_y = 1; + material_scales_vec.emplace_back(scale_x, scale_y); + material_offset_vec.emplace_back(0.f, 0.f); } if (tep->getTexGen() == LLTextureEntry::TEX_GEN_PLANAR) @@ -6976,6 +7093,8 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query) material_v_vec.push_back(material_v); } mGLTFScaleRatios.push_back(material_v_vec); + mGLTFScales.push_back(material_scales_vec); + mGLTFOffsets.push_back(material_offset_vec); } } } @@ -7257,7 +7376,10 @@ void dialog_refresh_all() // *TODO: Eliminate all calls into outside classes below, make those // objects register with the update signal. - gFloaterTools->dirty(); + if (gFloaterTools) + { + gFloaterTools->dirty(); + } gMenuObject->needsArrange(); @@ -7486,7 +7608,8 @@ void LLSelectMgr::updatePointAt() LLVector3 select_offset; const LLPickInfo& pick = gViewerWindow->getLastPick(); LLViewerObject *click_object = pick.getObject(); - if (click_object && click_object->isSelected()) + bool was_hud = pick.mPickHUD && click_object && !click_object->isHUDAttachment(); + if (click_object && click_object->isSelected() && !was_hud) { // clicked on another object in our selection group, use that as target select_offset.setVec(pick.mObjectOffset); @@ -7724,6 +7847,14 @@ void LLSelectMgr::setAgentHUDZoom(F32 target_zoom, F32 current_zoom) gAgentCamera.mHUDCurZoom = current_zoom; } +void LLSelectMgr::clearWaterExclusion() +{ + // reset texture to default plywood + LLSelectMgr::getInstance()->selectionSetImage(DEFAULT_OBJECT_TEXTURE); + // reset texture repeats, that might be altered by invisiprim script from wiki + LLSelectMgr::getInstance()->selectionTexScaleAutofit(2.f); +} + ///////////////////////////////////////////////////////////////////////////// // Object selection iterator helpers ///////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index b70ec3dbea..11aad3b806 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -242,6 +242,8 @@ public: gltf_materials_vec_t mSavedGLTFOverrideMaterials; std::vector<LLVector3> mTextureScaleRatios; std::vector< std::vector<LLVector3> > mGLTFScaleRatios; + std::vector< std::vector<LLVector2> > mGLTFScales; + std::vector< std::vector<LLVector2> > mGLTFOffsets; std::vector<LLVector3> mSilhouetteVertices; // array of vertices to render silhouette of object std::vector<LLVector3> mSilhouetteNormals; // array of normals to render silhouette of object bool mSilhouetteExists; // need to generate silhouette? @@ -836,6 +838,7 @@ public: void getAgentHUDZoom(F32 &target_zoom, F32 ¤t_zoom) const; void updatePointAt(); + void clearWaterExclusion(); // Internal list maintenance functions. TODO: Make these private! void remove(std::vector<LLViewerObject*>& objects); @@ -940,6 +943,7 @@ private: bool mForceSelection; std::vector<LLAnimPauseRequest> mPauseRequests; + boost::signals2::connection mSlectionLodModChangedConnection; }; // *DEPRECATED: For callbacks or observers, use diff --git a/indra/newview/llsetkeybinddialog.cpp b/indra/newview/llsetkeybinddialog.cpp index 5dbd579b45..2790705fd8 100644 --- a/indra/newview/llsetkeybinddialog.cpp +++ b/indra/newview/llsetkeybinddialog.cpp @@ -40,7 +40,7 @@ class LLSetKeyBindDialog::Updater : public LLEventTimer { public: - typedef boost::function<void(MASK)> callback_t; + typedef std::function<void(MASK)> callback_t; Updater(callback_t cb, F32 period, MASK mask) :LLEventTimer(period), diff --git a/indra/newview/llsettingspicker.cpp b/indra/newview/llsettingspicker.cpp index 619882dc5e..5fc39b0dd8 100644 --- a/indra/newview/llsettingspicker.cpp +++ b/indra/newview/llsettingspicker.cpp @@ -152,7 +152,11 @@ void LLFloaterSettingsPicker::onClose(bool app_quitting) owner->setFocus(true); } mSettingItemID.setNull(); - mInventoryPanel->getRootFolder()->clearSelection(); + mInventoryPanel->clearSelection(); + if (mInventoryPanel->getRootFolder()) + { + mInventoryPanel->getRootFolder()->clearSelection(); + } } void LLFloaterSettingsPicker::setValue(const LLSD& value) diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index c618483fc4..1d1b31d2a6 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -40,6 +40,7 @@ #include "llfloaterworldmap.h" #include "llfolderviewmodel.h" #include "llloadingindicator.h" +#include "llmenubutton.h" #include "lloutfitobserver.h" #include "llpaneleditwearable.h" #include "llpaneloutfitsinventory.h" @@ -145,6 +146,14 @@ bool LLSidepanelAppearance::postBuild() setWearablesLoading(gAgentWearables.isCOFChangeInProgress()); + + LLMenuButton* menu_gear_btn = getChild<LLMenuButton>("options_gear_btn"); + LLMenuButton* menu_sort_btn = getChild<LLMenuButton>("sorting_menu_btn"); + LLButton* menu_trash_btn = getChild<LLButton>("trash_btn"); + LLPanel* menu_sort_btn_panel = getChild<LLPanel>("options_sort_btn_panel"); + LLPanel* menu_trash_btn_panel = getChild<LLPanel>("trash_btn_panel"); + mPanelOutfitsInventory->setMenuButtons(menu_gear_btn, menu_sort_btn, menu_trash_btn, menu_sort_btn_panel, menu_trash_btn_panel); + return true; } diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index fccf745a74..6d50f216f5 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -56,6 +56,8 @@ #include "llviewerregion.h" +const char* const DEFAULT_DESC = "(No Description)"; + class PropertiesChangedCallback : public LLInventoryCallback { public: @@ -128,6 +130,7 @@ LLSidepanelItemInfo::LLSidepanelItemInfo(const LLPanel::Params& p) , mUpdatePendingId(-1) , mIsDirty(false) /*Not ready*/ , mParentFloater(NULL) + , mLabelItemDesc(NULL) { gInventory.addObserver(this); gIdleCallbacks.addFunction(&LLSidepanelItemInfo::onIdle, (void*)this); @@ -158,10 +161,11 @@ bool LLSidepanelItemInfo::postBuild() mItemTypeIcon = getChild<LLIconCtrl>("item_type_icon"); mLabelOwnerName = getChild<LLTextBox>("LabelOwnerName"); mLabelCreatorName = getChild<LLTextBox>("LabelCreatorName"); + mLabelItemDesc = getChild<LLTextEditor>("LabelItemDesc"); getChild<LLLineEditor>("LabelItemName")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe); getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this)); - getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this)); + mLabelItemDesc->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this)); // Thumnail edition mChangeThumbnailBtn->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onEditThumbnail, this)); // acquired date @@ -483,7 +487,8 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item) } else { - std::string timeStr = getString("acquiredDate"); + static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); + std::string timeStr = use_24h ? getString("acquiredDate") : getString("acquiredDateAMPM"); LLSD substitution; substitution["datetime"] = (S32) time_utc; LLStringUtil::format (timeStr, substitution); @@ -923,17 +928,22 @@ void LLSidepanelItemInfo::onCommitDescription() LLViewerInventoryItem* item = findItem(); if(!item) return; - LLTextEditor* labelItemDesc = getChild<LLTextEditor>("LabelItemDesc"); - if(!labelItemDesc) + if(!mLabelItemDesc) + { + return; + } + if (!gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE)) { return; } - if((item->getDescription() != labelItemDesc->getText()) && - (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE))) + std::string old_desc = item->getDescription(); + std::string new_desc = mLabelItemDesc->getText(); + if(old_desc != new_desc) { + mLabelItemDesc->setSelectAllOnFocusReceived(false); LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); - new_item->setDescription(labelItemDesc->getText()); + new_item->setDescription(new_desc); onCommitChanges(new_item); } } diff --git a/indra/newview/llsidepaneliteminfo.h b/indra/newview/llsidepaneliteminfo.h index 718edc79d6..0895d3360c 100644 --- a/indra/newview/llsidepaneliteminfo.h +++ b/indra/newview/llsidepaneliteminfo.h @@ -46,6 +46,7 @@ class LLObjectInventoryObserver; class LLViewerObject; class LLPermissions; class LLTextBox; +class LLTextEditor; class LLSidepanelItemInfo : public LLPanel, public LLInventoryObserver { @@ -105,6 +106,7 @@ private: LLIconCtrl* mItemTypeIcon; LLTextBox* mLabelOwnerName; LLTextBox* mLabelCreatorName; + LLTextEditor* mLabelItemDesc; // // UI Elements diff --git a/indra/newview/llskinningutil.cpp b/indra/newview/llskinningutil.cpp index cee43f3cff..223fc2a8f5 100644 --- a/indra/newview/llskinningutil.cpp +++ b/indra/newview/llskinningutil.cpp @@ -116,8 +116,8 @@ void LLSkinningUtil::scrubInvalidJoints(LLVOAvatar *avatar, LLMeshSkinInfo* skin // needed for handling of any legacy bad data. if (!avatar->getJoint(skin->mJointNames[j])) { - LL_DEBUGS("Avatar") << avatar->getFullname() << " mesh rigged to invalid joint " << skin->mJointNames[j] << LL_ENDL; - LL_WARNS_ONCE("Avatar") << avatar->getFullname() << " mesh rigged to invalid joint" << skin->mJointNames[j] << LL_ENDL; + LL_DEBUGS("Avatar") << avatar->getDebugName() << " mesh rigged to invalid joint " << skin->mJointNames[j] << LL_ENDL; + LL_WARNS_ONCE("Avatar") << avatar->getDebugName() << " mesh rigged to invalid joint" << skin->mJointNames[j] << LL_ENDL; skin->mJointNames[j] = "mPelvis"; skin->mJointNumsInitialized = false; // force update after names change. } @@ -135,6 +135,12 @@ void LLSkinningUtil::initSkinningMatrixPalette( initJointNums(const_cast<LLMeshSkinInfo*>(skin), avatar); + if (skin->mInvBindMatrix.size() < count ) + { + // faulty model? mInvBindMatrix.size() should have matched mJointNames.size() + return; + } + LLMatrix4a world[LL_CHARACTER_MAX_ANIMATED_JOINTS]; for (S32 j = 0; j < count; ++j) @@ -354,7 +360,8 @@ void LLSkinningUtil::updateRiggingInfo(const LLMeshSkinInfo* skin, LLVOAvatar *a { rig_info_tab[joint_num].setIsRiggedTo(true); - const LLMatrix4a& mat = skin->mBindPoseMatrix[joint_index]; + size_t bind_poses_size = skin->mBindPoseMatrix.size(); + const LLMatrix4a& mat = bind_poses_size > joint_index ? skin->mBindPoseMatrix[joint_index] : LLMatrix4a::identity(); LLVector4a pos_joint_space; mat.affineTransform(pos, pos_joint_space); diff --git a/indra/newview/llsky.h b/indra/newview/llsky.h index 32599dcee2..d06f181357 100644 --- a/indra/newview/llsky.h +++ b/indra/newview/llsky.h @@ -28,7 +28,6 @@ #define LL_LLSKY_H #include "llmath.h" -//#include "vmath.h" #include "v3math.h" #include "v4math.h" #include "v4color.h" diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp index 9e567e3262..6238a1145c 100644 --- a/indra/newview/llslurl.cpp +++ b/indra/newview/llslurl.cpp @@ -71,10 +71,10 @@ LLSLURL::LLSLURL(const std::string& slurl) { LLURI slurl_uri; // parse the slurl as a uri - if (slurl.find(':') == std::string::npos) + if (slurl.find("://") == std::string::npos) { - // There may be no scheme ('secondlife:' etc.) passed in. In that case - // we want to normalize the slurl by putting the appropriate scheme + // There may be no scheme ('secondlife://', 'https://' etc.) passed in. In that + // case we want to normalize the slurl by putting the appropriate scheme // in front of the slurl. So, we grab the appropriate slurl base // from the grid manager which may be http://slurl.com/secondlife/ for maingrid, or // https://<hostname>/region/ for Standalone grid (the word region, not the region name) diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp index ea95d71b27..6e5d9a6c77 100644 --- a/indra/newview/llsnapshotlivepreview.cpp +++ b/indra/newview/llsnapshotlivepreview.cpp @@ -238,11 +238,11 @@ void LLSnapshotLivePreview::drawPreviewRect(S32 offset_x, S32 offset_y, LLColor4 { F32 line_width ; glGetFloatv(GL_LINE_WIDTH, &line_width) ; - glLineWidth(2.0f * line_width) ; + //glLineWidth(2.0f * line_width) ; LLColor4 color(0.0f, 0.0f, 0.0f, 1.0f) ; gl_rect_2d( mPreviewRect.mLeft + offset_x, mPreviewRect.mTop + offset_y, mPreviewRect.mRight + offset_x, mPreviewRect.mBottom + offset_y, color, false ) ; - glLineWidth(line_width) ; + //glLineWidth(line_width) ; //draw four alpha rectangles to cover areas outside of the snapshot image if(!mKeepAspectRatio) @@ -694,6 +694,7 @@ bool LLSnapshotLivePreview::onIdle( void* snapshot_preview ) static LLCachedControl<bool> freeze_time(gSavedSettings, "FreezeTime", false); static LLCachedControl<bool> use_freeze_frame(gSavedSettings, "UseFreezeFrame", false); static LLCachedControl<bool> render_ui(gSavedSettings, "RenderUIInSnapshot", false); + static LLCachedControl<bool> render_balance(gSavedSettings, "RenderBalanceInSnapshot", false); static LLCachedControl<bool> render_hud(gSavedSettings, "RenderHUDInSnapshot", false); static LLCachedControl<bool> render_no_post(gSavedSettings, "RenderSnapshotNoPost", false); @@ -750,6 +751,7 @@ bool LLSnapshotLivePreview::onIdle( void* snapshot_preview ) render_hud, false, render_no_post, + render_balance, previewp->mSnapshotBufferType, previewp->getMaxImageSize())) { @@ -1062,11 +1064,11 @@ void LLSnapshotLivePreview::saveTexture(bool outfit_snapshot, std::string name) LLFolderType::EType folder_type = outfit_snapshot ? LLFolderType::FT_NONE : LLFolderType::FT_SNAPSHOT_CATEGORY; LLInventoryType::EType inv_type = outfit_snapshot ? LLInventoryType::IT_NONE : LLInventoryType::IT_SNAPSHOT; - LLResourceUploadInfo::ptr_t assetUploadInfo(new LLResourceUploadInfo( + LLResourceUploadInfo::ptr_t assetUploadInfo = std::make_shared<LLResourceUploadInfo>( tid, LLAssetType::AT_TEXTURE, res_name, res_desc, 0, folder_type, inv_type, PERM_ALL, LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"), - expected_upload_cost, !outfit_snapshot)); + expected_upload_cost, LLUUID::null, !outfit_snapshot); upload_new_resource(assetUploadInfo); diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index a90ff73578..a147cb4657 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -1661,12 +1661,12 @@ void renderOctree(LLSpatialGroup* group) gGL.diffuseColor4f(1,0,0,group->mBuilt); gGL.flush(); - glLineWidth(5.f); + //glLineWidth(5.f); const LLVector4a* bounds = group->getObjectBounds(); drawBoxOutline(bounds[0], bounds[1]); - gGL.flush(); - glLineWidth(1.f); + //gGL.flush(); + //glLineWidth(1.f); gGL.flush(); const LLVOAvatar* lastAvatar = nullptr; @@ -1978,12 +1978,11 @@ void renderBoundingBox(LLDrawable* drawable, bool set_color = true) if (vobj && vobj->onActiveList()) { gGL.flush(); - glLineWidth(llmax(4.f*sinf(gFrameTimeSeconds*2.f)+1.f, 1.f)); - //glLineWidth(4.f*(sinf(gFrameTimeSeconds*2.f)*0.25f+0.75f)); - stop_glerror(); + //glLineWidth(llmax(4.f*sinf(gFrameTimeSeconds*2.f)+1.f, 1.f)); + stop_glerror(); drawBoxOutline(pos,size); gGL.flush(); - glLineWidth(1.f); + //glLineWidth(1.f); } else { @@ -2897,7 +2896,7 @@ public: if (i == 1) { gGL.flush(); - glLineWidth(3.f); + //glLineWidth(3.f); } gGL.begin(LLRender::TRIANGLES); @@ -2916,7 +2915,7 @@ public: if (i == 1) { gGL.flush(); - glLineWidth(1.f); + //glLineWidth(1.f); } } } diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 3aaa3d60e8..d8a94c8835 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -71,16 +71,8 @@ protected: ~LLDrawInfo(); public: - LLDrawInfo(const LLDrawInfo& rhs) - { - *this = rhs; - } - - const LLDrawInfo& operator=(const LLDrawInfo& rhs) - { - LL_ERRS() << "Illegal operation!" << LL_ENDL; - return *this; - } + LLDrawInfo(const LLDrawInfo& rhs) = delete; + const LLDrawInfo& operator=(const LLDrawInfo& rhs) = delete; // return a hash of this LLDrawInfo as a debug color LLColor4U getDebugColor() const; @@ -206,16 +198,8 @@ class LLSpatialGroup : public LLOcclusionCullingGroup friend class LLOctreeStateCheck; public: - LLSpatialGroup(const LLSpatialGroup& rhs) : LLOcclusionCullingGroup(rhs) - { - *this = rhs; - } - - const LLSpatialGroup& operator=(const LLSpatialGroup& rhs) - { - LL_ERRS() << "Illegal operation!" << LL_ENDL; - return *this; - } + LLSpatialGroup(const LLSpatialGroup& rhs) = delete; + const LLSpatialGroup& operator=(const LLSpatialGroup& rhs) = delete; static U32 sNodeCount; static bool sNoDelete; //deletion of spatial groups and draw info not allowed if true diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index 4956c188fb..f079c70c6c 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -76,7 +76,7 @@ void LLSpeaker::lookupName() { if (mDisplayName.empty()) { - LLAvatarNameCache::get(mID, boost::bind(&LLSpeaker::onNameCache, this, _1, _2)); // todo: can be group??? + mAvatarNameCacheConnection = LLAvatarNameCache::get(mID, boost::bind(&LLSpeaker::onNameCache, this, _1, _2)); // todo: can be group??? } } @@ -867,9 +867,9 @@ void LLIMSpeakerMgr::moderationActionCoro(std::string url, LLSD action) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("moderationActionCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("moderationActionCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); httpOpts->setWantHeaders(true); @@ -1026,6 +1026,10 @@ void LLLocalSpeakerMgr::updateSpeakerList() uuid_vec_t avatar_ids; std::vector<LLVector3d> positions; LLWorld::getInstance()->getAvatars(&avatar_ids, &positions, gAgent.getPositionGlobal(), CHAT_NORMAL_RADIUS); +#ifdef LL_DISCORD + if (gSavedSettings.getBOOL("EnableDiscord")) + LLAppViewer::updateDiscordPartyCurrentSize((S32)avatar_ids.size()); +#endif for(U32 i=0; i<avatar_ids.size(); i++) { setSpeaker(avatar_ids[i]); diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h index ad2461f60f..c3773d2c33 100644 --- a/indra/newview/llspeakers.h +++ b/indra/newview/llspeakers.h @@ -80,6 +80,9 @@ public: bool mIsModerator; bool mModeratorMutedVoice; bool mModeratorMutedText; + +private: + boost::signals2::scoped_connection mAvatarNameCacheConnection; }; class LLSpeakerUpdateSpeakerEvent : public LLOldEvents::LLEvent @@ -138,7 +141,7 @@ private: class LLSpeakerActionTimer : public LLEventTimer { public: - typedef boost::function<bool(const LLUUID&)> action_callback_t; + typedef std::function<bool(const LLUUID&)> action_callback_t; typedef std::map<LLUUID, LLSpeakerActionTimer*> action_timers_map_t; typedef action_timers_map_t::value_type action_value_t; typedef action_timers_map_t::const_iterator action_timer_const_iter_t; diff --git a/indra/newview/llspeakingindicatormanager.cpp b/indra/newview/llspeakingindicatormanager.cpp index 532b245ced..06458a9f3c 100644 --- a/indra/newview/llspeakingindicatormanager.cpp +++ b/indra/newview/llspeakingindicatormanager.cpp @@ -200,8 +200,17 @@ void SpeakingIndicatorManager::cleanupSingleton() void SpeakingIndicatorManager::sOnCurrentChannelChanged(const LLUUID& /*session_id*/) { - switchSpeakerIndicators(mSwitchedIndicatorsOn, false); - mSwitchedIndicatorsOn.clear(); + if (LLVoiceChannel::isSuspended()) + { + switchSpeakerIndicators(mSwitchedIndicatorsOn, false); + mSwitchedIndicatorsOn.clear(); + } + else + { + // Multiple onParticipantsChanged can arrive at the same time + // from different sources, might want to filter by some factor. + onParticipantsChanged(); + } } void SpeakingIndicatorManager::onParticipantsChanged() diff --git a/indra/newview/llsplitbutton.cpp b/indra/newview/llsplitbutton.cpp index 6c252ed31f..140b63c84d 100644 --- a/indra/newview/llsplitbutton.cpp +++ b/indra/newview/llsplitbutton.cpp @@ -118,7 +118,7 @@ void LLSplitButton::onItemSelected(LLUICtrl* ctrl) hideButtons(); // call the callback if it exists - if(!mSelectionCallback.empty()) + if(mSelectionCallback != nullptr) { mSelectionCallback(this, ctrl->getName()); } diff --git a/indra/newview/llsprite.h b/indra/newview/llsprite.h index 44439bd30c..d6e8e37ec9 100644 --- a/indra/newview/llsprite.h +++ b/indra/newview/llsprite.h @@ -27,8 +27,6 @@ #ifndef LL_LLSPRITE_H #define LL_LLSPRITE_H -////#include "vmath.h" -//#include "llmath.h" #include "v3math.h" #include "v4math.h" #include "v4color.h" diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 6bf203c140..4ef3bc60ab 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -61,6 +61,7 @@ #include "lllocationhistory.h" #include "llgltfmateriallist.h" #include "llimageworker.h" +#include "llregex.h" #include "llloginflags.h" #include "llmd5.h" @@ -125,6 +126,7 @@ #include "llpanellogin.h" #include "llmutelist.h" #include "llavatarpropertiesprocessor.h" +#include "llpaneldirbrowser.h" #include "llpanelgrouplandmoney.h" #include "llpanelgroupnotices.h" #include "llparcel.h" @@ -209,14 +211,12 @@ #include "threadpool.h" #include "llperfstats.h" +#include "rlvhandler.h" #if LL_WINDOWS #include "lldxhardware.h" #endif -#include "fsfloatersearch.h" - - // // exported globals // @@ -304,8 +304,51 @@ void callback_cache_name(const LLUUID& id, const std::string& full_name, bool is // exported functionality // +void do_startup_frame() +{ + // Until after STATE_AGENT_SEND we don't get very many UDP packets to poll the socket, + // and after STATE_PRECACHE the LLAppViewer::idleNetwork() will do UDP processing, + // so we only bother to process between those two states. + EStartupState state = LLStartUp::getStartupState(); + if (state > STATE_AGENT_SEND && state < STATE_PRECACHE) + { + // drain the UDP socket... + U64 t0 = totalTime(); + constexpr U64 MAX_STARTUP_FRAME_TIME = 2000; // usec + constexpr U64 MAX_STARTUP_FRAME_MESSAGES = 100; + S32 num_messages = 0; + bool needs_drain = false; + LockMessageChecker lmc(gMessageSystem); + while (lmc.checkAllMessages(gFrameCount, gServicePump)) + { + if (gDoDisconnect) + { + // We're disconnecting, don't process any more messages from the server + // We're usually disconnecting due to either network corruption or a + // server going down, so this is OK. + break; + } + if (++num_messages >= MAX_STARTUP_FRAME_MESSAGES + || (totalTime() - t0) > MAX_STARTUP_FRAME_TIME) + { + needs_drain = true; + break; + } + } + if (needs_drain || gMessageSystem->mPacketRing.getNumBufferedPackets() > 0) + { + gMessageSystem->drainUdpSocket(); + } + lmc.processAcks(); + } + // ...then call display_startup() + display_startup(); +} + void pump_idle_startup_network(void) { + // while there are message to process: + // process one then call display_startup() { LockMessageChecker lmc(gMessageSystem); while (lmc.checkAllMessages(gFrameCount, gServicePump)) @@ -314,6 +357,7 @@ void pump_idle_startup_network(void) } lmc.processAcks(); } + // finally call one last display_startup() display_startup(); } @@ -360,6 +404,7 @@ bool idle_startup() LL_WARNS_ONCE() << "gViewerWindow is not initialized" << LL_ENDL; return false; // No world yet } + LL_PROFILE_ZONE_SCOPED; const F32 PRECACHING_DELAY = gSavedSettings.getF32("PrecachingDelay"); static LLTimer timeout; @@ -400,7 +445,52 @@ bool idle_startup() system = osString.substr (begIdx, endIdx - begIdx); system += "Locale"; - LLStringUtil::setLocale (LLTrans::getString(system)); + std::string locale = LLTrans::getString(system); + if (locale != LLStringUtil::getLocale()) // is there a reason to do this on repeat? + { + LLStringUtil::setLocale(locale); + + // Not all locales have AMPM, test it + if (LLStringOps::sAM.empty()) // Might already be overriden from LLAppViewer::init() + { + LLDate datetime(0.0); + std::string val = datetime.toHTTPDateString("%p"); + if (val.empty()) + { + LL_DEBUGS("InitInfo") << "Current locale \"" << locale << "\" " + << "doesn't support AM/PM time format" << LL_ENDL; + // fallback to declarations in strings.xml + LLStringOps::sAM = LLTrans::getString("dateTimeAM"); + LLStringOps::sPM = LLTrans::getString("dateTimePM"); + } + else + { + std::wstring utf16str = ll_convert<std::wstring>(val); + if (utf16str.size() > 4) + { + LL_DEBUGS("InitInfo") << "Current locale \"" << locale << "\" " + << "has impracitcally long AM/PM time format" << LL_ENDL; + // fallback to declarations in strings.xml + LLStringOps::sAM = LLTrans::getString("dateTimeAM"); + LLStringOps::sPM = LLTrans::getString("dateTimePM"); + } + } + } + + // Some locales (as well some of our own dateTimeAM/PM) return long + // strings for AM/PM which aren't practical to display in the UI. + // Hardcode to "AM"/"PM" in those cases. + std::wstring utf16str = ll_convert<std::wstring>(LLStringOps::sAM); + if (utf16str.size() > 4) + { + LLStringOps::sAM = "AM"; + } + utf16str = ll_convert<std::wstring>(LLStringOps::sPM); + if (utf16str.size() > 4) + { + LLStringOps::sPM = "PM"; + } + } //note: Removing this line will cause incorrect button size in the login screen. -- bao. gTextureList.updateImages(0.01f) ; @@ -630,21 +720,6 @@ bool idle_startup() F32 dropPercent = gSavedSettings.getF32("PacketDropPercentage"); msg->mPacketRing.setDropPercentage(dropPercent); - - F32 inBandwidth = gSavedSettings.getF32("InBandwidth"); - F32 outBandwidth = gSavedSettings.getF32("OutBandwidth"); - if (inBandwidth != 0.f) - { - LL_DEBUGS("AppInit") << "Setting packetring incoming bandwidth to " << inBandwidth << LL_ENDL; - msg->mPacketRing.setUseInThrottle(true); - msg->mPacketRing.setInBandwidth(inBandwidth); - } - if (outBandwidth != 0.f) - { - LL_DEBUGS("AppInit") << "Setting packetring outgoing bandwidth to " << outBandwidth << LL_ENDL; - msg->mPacketRing.setUseOutThrottle(true); - msg->mPacketRing.setOutBandwidth(outBandwidth); - } } LL_INFOS("AppInit") << "Message System Initialized." << LL_ENDL; @@ -720,6 +795,10 @@ bool idle_startup() LL_WARNS("AppInit") << "Unreliable timers detected (may be bad PCI chipset)!!" << LL_ENDL; } +#ifdef LL_DISCORD + LLAppViewer::initDiscordSocial(); +#endif + // // Log on to system // @@ -770,7 +849,7 @@ bool idle_startup() LL_DEBUGS("AppInit") << "STATE_BROWSER_INIT" << LL_ENDL; std::string msg = LLTrans::getString("LoginInitializingBrowser"); set_startup_status(0.03f, msg.c_str(), gAgent.mMOTD.c_str()); - display_startup(); + do_startup_frame(); // LLViewerMedia::initBrowser(); LLStartUp::setStartupState( STATE_LOGIN_SHOW ); return false; @@ -835,7 +914,7 @@ bool idle_startup() LL_DEBUGS("AppInit") << "FirstLoginThisInstall off" << LL_ENDL; } } - display_startup(); + do_startup_frame(); LLStartUp::setStartupState( STATE_LOGIN_WAIT ); // Wait for user input } else @@ -866,7 +945,7 @@ bool idle_startup() } LL_DEBUGS("AppInit") << "PeekMessage processed" << LL_ENDL; #endif - display_startup(); + do_startup_frame(); timeout.reset(); return false; } @@ -881,7 +960,7 @@ bool idle_startup() // Don't do anything. Wait for the login view to call the login_callback, // which will push us to the next state. - // display() function will be the one to run display_startup() + // display() function will be the one to run do_startup_frame() // Sleep so we don't spin the CPU ms_sleep(1); return false; @@ -903,6 +982,8 @@ bool idle_startup() return false; } + RlvHandler::setEnabled(gSavedSettings.get<bool>(Rlv::Settings::Main)); + // reset the values that could have come in from a slurl // DEV-42215: Make sure they're not empty -- gUserCredential // might already have been set from gSavedSettings, and it's too bad @@ -1063,7 +1144,7 @@ bool idle_startup() auth_desc = LLTrans::getString("LoginInProgress"); set_startup_status(progress, auth_desc, auth_message); progress += 0.02f; - display_startup(); + do_startup_frame(); // Setting initial values... LLLoginInstance* login = LLLoginInstance::getInstance(); @@ -1100,7 +1181,7 @@ bool idle_startup() emsg << LLTrans::getString("LoginFailedHeader") << "\n"; if(LLLoginInstance::getInstance()->authFailure()) { - LL_INFOS("LLStartup") << "Login failed, LLLoginInstance::getResponse(): " + LL_INFOS("LLStartUp") << "Login failed, LLLoginInstance::getResponse(): " << LLLoginInstance::getInstance()->getResponse() << LL_ENDL; LLSD response = LLLoginInstance::getInstance()->getResponse(); // Still have error conditions that may need some @@ -1172,7 +1253,7 @@ bool idle_startup() // If optional was skipped this case shouldn't // be reached. - LL_INFOS("LLStartup") << "Forcing a quit due to update." << LL_ENDL; + LL_INFOS("LLStartUp") << "Forcing a quit due to update." << LL_ENDL; LLLoginInstance::getInstance()->disconnect(); LLAppViewer::instance()->forceQuit(); } @@ -1200,7 +1281,7 @@ bool idle_startup() } catch (LLCertException &cert_exception) { - LL_WARNS("LLStartup", "SECAPI") << "Caught " << cert_exception.what() << " certificate expception on getCertificate("<< response["certificate"] << ")" << LL_ENDL; + LL_WARNS("LLStartUp", "SECAPI") << "Caught " << cert_exception.what() << " certificate expception on getCertificate("<< response["certificate"] << ")" << LL_ENDL; LLSD args; args["REASON"] = LLTrans::getString(cert_exception.what()); @@ -1252,7 +1333,7 @@ bool idle_startup() // notificatioin message. LLSD args; args["ERROR_MESSAGE"] = emsg.str(); - LL_INFOS("LLStartup") << "Notification: " << args << LL_ENDL; + LL_INFOS("LLStartUp") << "Notification: " << args << LL_ENDL; LLNotificationsUtil::add("ErrorMessage", args, LLSD(), login_alert_done); } } @@ -1275,7 +1356,7 @@ bool idle_startup() { LLSD args; args["ERROR_MESSAGE"] = emsg.str(); - LL_INFOS("LLStartup") << "Notification: " << args << LL_ENDL; + LL_INFOS("LLStartUp") << "Notification: " << args << LL_ENDL; LLNotificationsUtil::add("ErrorMessage", args, LLSD(), login_alert_done); transition_back_to_login_panel(emsg.str()); show_connect_box = true; @@ -1291,71 +1372,71 @@ bool idle_startup() if (STATE_WORLD_INIT == LLStartUp::getStartupState()) { set_startup_status(0.30f, LLTrans::getString("LoginInitializingWorld"), gAgent.mMOTD); - display_startup(); + do_startup_frame(); // We should have an agent id by this point. llassert(!(gAgentID == LLUUID::null)); // Finish agent initialization. (Requires gSavedSettings, builds camera) gAgent.init(); - display_startup(); + do_startup_frame(); gAgentCamera.init(); - display_startup(); - display_startup(); + do_startup_frame(); + do_startup_frame(); // Since we connected, save off the settings so the user doesn't have to // type the name/password again if we crash. gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), true); LLUIColorTable::instance().saveUserSettings(); - display_startup(); + do_startup_frame(); // // Initialize classes w/graphics stuff. // LLSurface::initClasses(); - display_startup(); + do_startup_frame(); - display_startup(); + do_startup_frame(); LLDrawable::initClass(); - display_startup(); + do_startup_frame(); // init the shader managers LLPostProcess::initClass(); - display_startup(); + do_startup_frame(); LLAvatarAppearance::initClass("avatar_lad.xml","avatar_skeleton.xml"); - display_startup(); + do_startup_frame(); LLViewerObject::initVOClasses(); - display_startup(); + do_startup_frame(); // Initialize all our tools. Must be done after saved settings loaded. // NOTE: This also is where gToolMgr used to be instantiated before being turned into a singleton. LLToolMgr::getInstance()->initTools(); - display_startup(); + do_startup_frame(); // Pre-load floaters, like the world map, that are slow to spawn // due to XML complexity. gViewerWindow->initWorldUI(); - display_startup(); + do_startup_frame(); // This is where we used to initialize gWorldp. Original comment said: // World initialization must be done after above window init // User might have overridden far clip LLWorld::getInstance()->setLandFarClip(gAgentCamera.mDrawDistance); - display_startup(); + do_startup_frame(); // Before we create the first region, we need to set the agent's mOriginGlobal // This is necessary because creating objects before this is set will result in a // bad mPositionAgent cache. gAgent.initOriginGlobal(from_region_handle(gFirstSimHandle)); - display_startup(); + do_startup_frame(); LLWorld::getInstance()->addRegion(gFirstSimHandle, gFirstSim); - display_startup(); + do_startup_frame(); LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(gFirstSimHandle); LL_INFOS("AppInit") << "Adding initial simulator " << regionp->getOriginGlobal() << LL_ENDL; @@ -1364,18 +1445,18 @@ bool idle_startup() << gFirstSimSeedCap << LL_ENDL; regionp->setSeedCapability(gFirstSimSeedCap); LL_DEBUGS("AppInit") << "Waiting for seed grant ...." << LL_ENDL; - display_startup(); + do_startup_frame(); // Set agent's initial region to be the one we just created. gAgent.setRegion(regionp); - display_startup(); + do_startup_frame(); // Set agent's initial position, which will be read by LLVOAvatar when the avatar // object is created. I think this must be done after setting the region. JC gAgent.setPositionAgent(agent_start_position_region); - display_startup(); + do_startup_frame(); LLStartUp::initExperiences(); - display_startup(); + do_startup_frame(); // If logging should be enebled, turns it on and loads history from disk // Note: does not happen on init of singleton because preferences can use @@ -1396,7 +1477,7 @@ bool idle_startup() { LLStartUp::multimediaInit(); LLStartUp::setStartupState( STATE_FONT_INIT ); - display_startup(); + do_startup_frame(); return false; } @@ -1405,7 +1486,7 @@ bool idle_startup() { LLStartUp::fontInit(); LLStartUp::setStartupState( STATE_SEED_GRANTED_WAIT ); - display_startup(); + do_startup_frame(); return false; } @@ -1477,7 +1558,7 @@ bool idle_startup() set_startup_status(0.4f, LLTrans::getString("LoginRequestSeedCapGrant"), gAgent.mMOTD.c_str()); } } - display_startup(); + do_startup_frame(); return false; } @@ -1488,7 +1569,7 @@ bool idle_startup() //--------------------------------------------------------------------- if (STATE_SEED_CAP_GRANTED == LLStartUp::getStartupState()) { - display_startup(); + do_startup_frame(); // These textures are not warrantied to be cached, so needs // to hapen with caps granted @@ -1497,9 +1578,9 @@ bool idle_startup() // will init images, should be done with caps, but before gSky.init() LLEnvironment::getInstance()->initSingleton(); - display_startup(); + do_startup_frame(); update_texture_fetch(); - display_startup(); + do_startup_frame(); if ( gViewerWindow != NULL) { // This isn't the first logon attempt, so show the UI @@ -1507,15 +1588,15 @@ bool idle_startup() } gLoginMenuBarView->setVisible( false ); gLoginMenuBarView->setEnabled( false ); - display_startup(); + do_startup_frame(); // direct logging to the debug console's line buffer LLError::logToFixedBuffer(gDebugView->mDebugConsolep); - display_startup(); + do_startup_frame(); // set initial visibility of debug console gDebugView->mDebugConsolep->setVisible(gSavedSettings.getBOOL("ShowDebugConsole")); - display_startup(); + do_startup_frame(); // // Set message handlers @@ -1524,23 +1605,23 @@ bool idle_startup() // register callbacks for messages. . . do this after initial handshake to make sure that we don't catch any unwanted register_viewer_callbacks(gMessageSystem); - display_startup(); + do_startup_frame(); // Debugging info parameters gMessageSystem->setMaxMessageTime( 0.5f ); // Spam if decoding all msgs takes more than 500 ms - display_startup(); + do_startup_frame(); #ifndef LL_RELEASE_FOR_DOWNLOAD gMessageSystem->setTimeDecodes( true ); // Time the decode of each msg gMessageSystem->setTimeDecodesSpamThreshold( 0.05f ); // Spam if a single msg takes over 50ms to decode #endif - display_startup(); + do_startup_frame(); gXferManager->registerCallbacks(gMessageSystem); - display_startup(); + do_startup_frame(); LLStartUp::initNameCache(); - display_startup(); + do_startup_frame(); // update the voice settings *after* gCacheName initialization // so that we can construct voice UI that relies on the name cache @@ -1548,7 +1629,7 @@ bool idle_startup() { LLVoiceClient::getInstance()->updateSettings(); } - display_startup(); + do_startup_frame(); // create a container's instance for start a controlling conversation windows // by the voice's events @@ -1569,12 +1650,12 @@ bool idle_startup() // register null callbacks for audio until the audio system is initialized gMessageSystem->setHandlerFuncFast(_PREHASH_SoundTrigger, null_message_callback, NULL); gMessageSystem->setHandlerFuncFast(_PREHASH_AttachedSound, null_message_callback, NULL); - display_startup(); + do_startup_frame(); //reset statistics LLViewerStats::instance().resetStats(); - display_startup(); + do_startup_frame(); // // Set up region and surface defaults // @@ -1599,7 +1680,7 @@ bool idle_startup() LLViewerCamera::getInstance()->setAspect(gViewerWindow->getWorldViewAspectRatio()); // Initialize FOV LLViewerCamera::getInstance()->setDefaultFOV(gSavedSettings.getF32("CameraAngle")); - display_startup(); + do_startup_frame(); // Move agent to starting location. The position handed to us by // the space server is in global coordinates, but the agent frame @@ -1610,7 +1691,7 @@ bool idle_startup() gAgent.resetAxes(gAgentStartLookAt); gAgentCamera.stopCameraAnimation(); gAgentCamera.resetCamera(); - display_startup(); + do_startup_frame(); // Initialize global class data needed for surfaces (i.e. textures) LL_DEBUGS("AppInit") << "Initializing sky..." << LL_ENDL; @@ -1621,7 +1702,7 @@ bool idle_startup() LLGLState::checkStates(); - display_startup(); + do_startup_frame(); LL_DEBUGS("AppInit") << "Decoding images..." << LL_ENDL; // For all images pre-loaded into viewer cache, init @@ -1635,12 +1716,12 @@ bool idle_startup() { F32 frac = (F32)i / (F32)DECODE_TIME_SEC; set_startup_status(0.45f + frac*0.1f, LLTrans::getString("LoginDecodingImages"), gAgent.mMOTD); - display_startup(); + do_startup_frame(); gTextureList.decodeAllImages(1.f); } LLStartUp::setStartupState( STATE_WORLD_WAIT ); - display_startup(); + do_startup_frame(); // JC - Do this as late as possible to increase likelihood Purify // will run. @@ -1669,7 +1750,7 @@ bool idle_startup() NULL); timeout.reset(); - display_startup(); + do_startup_frame(); return false; } @@ -1696,7 +1777,7 @@ bool idle_startup() { LL_DEBUGS("AppInit") << "Connecting to region..." << LL_ENDL; set_startup_status(0.60f, LLTrans::getString("LoginConnectingToRegion"), gAgent.mMOTD); - display_startup(); + do_startup_frame(); // register with the message system so it knows we're // expecting this message LLMessageSystem* msg = gMessageSystem; @@ -1710,7 +1791,16 @@ bool idle_startup() gAssetStorage->setUpstream(regionp->getHost()); gCacheName->setUpstream(regionp->getHost()); } - display_startup(); + + // It is entirely possible that we may get the friends list _before_ we have the callbacks registered to process that. + // This will lead to the friends list not being processed properly and online statuses not being updated appropriately at login. + // So, we need to make sure that we have the callbacks registered before we get the friends list. + // This appears to crop up on some systems somewhere between STATE_AGENT_SEND and STATE_INVENTORY_SEND. It's happened to me a few times now. + // -Geenz 2025-03-12 + LL_INFOS() << " AvatarTracker" << LL_ENDL; + LLAvatarTracker::instance().registerCallbacks(gMessageSystem); + + do_startup_frame(); // Create login effect // But not on first login, because you can't see your avatar then @@ -1725,7 +1815,7 @@ bool idle_startup() LLStartUp::setStartupState( STATE_AGENT_WAIT ); // Go to STATE_AGENT_WAIT timeout.reset(); - display_startup(); + do_startup_frame(); return false; } @@ -1734,35 +1824,13 @@ bool idle_startup() //--------------------------------------------------------------------- if (STATE_AGENT_WAIT == LLStartUp::getStartupState()) { - { - LockMessageChecker lmc(gMessageSystem); - while (lmc.checkAllMessages(gFrameCount, gServicePump)) - { - if (gAgentMovementCompleted) - { - // Sometimes we have more than one message in the - // queue. break out of this loop and continue - // processing. If we don't, then this could skip one - // or more login steps. - break; - } - else - { - LL_DEBUGS("AppInit") << "Awaiting AvatarInitComplete, got " - << gMessageSystem->getMessageName() << LL_ENDL; - } - display_startup(); - } - lmc.processAcks(); - } - - display_startup(); + do_startup_frame(); if (gAgentMovementCompleted) { LLStartUp::setStartupState( STATE_INVENTORY_SEND ); } - display_startup(); + do_startup_frame(); if (!gAgentMovementCompleted && timeout.getElapsedTimeF32() > STATE_AGENT_WAIT_TIMEOUT) { @@ -1795,7 +1863,7 @@ bool idle_startup() if (STATE_INVENTORY_SEND == LLStartUp::getStartupState()) { LL_PROFILE_ZONE_NAMED("State inventory send") - display_startup(); + do_startup_frame(); // request mute list LL_INFOS() << "Requesting Mute List" << LL_ENDL; @@ -1805,12 +1873,12 @@ bool idle_startup() LL_INFOS() << "Requesting Money Balance" << LL_ENDL; LLStatusBar::sendMoneyBalanceRequest(); - display_startup(); + do_startup_frame(); // Inform simulator of our language preference LLAgentLanguage::update(); - display_startup(); + do_startup_frame(); // unpack thin inventory LLSD response = LLLoginInstance::getInstance()->getResponse(); //bool dump_buffer = false; @@ -1825,7 +1893,7 @@ bool idle_startup() gInventory.setLibraryRootFolderID(id.asUUID()); } } - display_startup(); + do_startup_frame(); LLSD inv_lib_owner = response["inventory-lib-owner"]; if(inv_lib_owner.isDefined()) @@ -1837,9 +1905,9 @@ bool idle_startup() gInventory.setLibraryOwnerID(LLUUID(id.asUUID())); } } - display_startup(); + do_startup_frame(); LLStartUp::setStartupState(STATE_INVENTORY_SKEL); - display_startup(); + do_startup_frame(); return false; } @@ -1858,7 +1926,7 @@ bool idle_startup() LL_WARNS("AppInit") << "Problem loading inventory-skel-lib" << LL_ENDL; } } - display_startup(); + do_startup_frame(); LLSD inv_skeleton = response["inventory-skeleton"]; if (inv_skeleton.isDefined()) @@ -1869,9 +1937,9 @@ bool idle_startup() LL_WARNS("AppInit") << "Problem loading inventory-skel-targets" << LL_ENDL; } } - display_startup(); + do_startup_frame(); LLStartUp::setStartupState(STATE_INVENTORY_SEND2); - display_startup(); + do_startup_frame(); return false; } @@ -1917,7 +1985,7 @@ bool idle_startup() list[agent_id] = new LLRelationship(given_rights, has_rights, false); } LLAvatarTracker::instance().addBuddyList(list); - display_startup(); + do_startup_frame(); } bool show_hud = false; @@ -1945,7 +2013,7 @@ bool idle_startup() //} } } - display_startup(); + do_startup_frame(); // Either we want to show tutorial because this is the first login // to a Linden Help Island or the user quit with the tutorial @@ -1954,21 +2022,21 @@ bool idle_startup() { LLFloaterReg::showInstance("hud", LLSD(), false); } - display_startup(); + do_startup_frame(); LLSD event_notifications = response["event_notifications"]; if(event_notifications.isDefined()) { gEventNotifier.load(event_notifications); } - display_startup(); + do_startup_frame(); LLSD classified_categories = response["classified_categories"]; if(classified_categories.isDefined()) { LLClassifiedInfo::loadCategories(classified_categories); } - display_startup(); + do_startup_frame(); // This method MUST be called before gInventory.findCategoryUUIDForType because of // gInventory.mIsAgentInvUsable is set to true in the gInventory.buildParentChildMap. @@ -1987,7 +2055,7 @@ bool idle_startup() LLInventoryModelBackgroundFetch::instance().start(); gInventory.createCommonSystemCategories(); LLStartUp::setStartupState(STATE_INVENTORY_CALLBACKS ); - display_startup(); + do_startup_frame(); return false; } @@ -1999,7 +2067,7 @@ bool idle_startup() { if (!LLInventoryModel::isSysFoldersReady()) { - display_startup(); + do_startup_frame(); return false; } @@ -2024,29 +2092,27 @@ bool idle_startup() gInventory.addChangedMask(LLInventoryObserver::ALL, LLUUID::null); gInventory.notifyObservers(); - display_startup(); + do_startup_frame(); // set up callbacks LL_INFOS() << "Registering Callbacks" << LL_ENDL; LLMessageSystem* msg = gMessageSystem; LL_INFOS() << " Inventory" << LL_ENDL; LLInventoryModel::registerCallbacks(msg); - LL_INFOS() << " AvatarTracker" << LL_ENDL; - LLAvatarTracker::instance().registerCallbacks(msg); LL_INFOS() << " Landmark" << LL_ENDL; LLLandmark::registerCallbacks(msg); - display_startup(); + do_startup_frame(); // request all group information LL_INFOS() << "Requesting Agent Data" << LL_ENDL; gAgent.sendAgentDataUpdateRequest(); - display_startup(); + do_startup_frame(); // Create the inventory views LL_INFOS() << "Creating Inventory Views" << LL_ENDL; LLFloaterReg::getInstance("inventory"); - display_startup(); + do_startup_frame(); LLStartUp::setStartupState( STATE_MISC ); - display_startup(); + do_startup_frame(); return false; } @@ -2096,7 +2162,7 @@ bool idle_startup() gSavedSettings.setBOOL("ShowStartLocation", true); } - display_startup(); + do_startup_frame(); // Load stored local environment if needed. LLEnvironment::instance().loadFromSettings(); @@ -2104,7 +2170,7 @@ bool idle_startup() // *TODO : Uncomment that line once the whole grid migrated to SLM and suppress it from LLAgent::handleTeleportFinished() (llagent.cpp) //check_merchant_status(); - display_startup(); + do_startup_frame(); if (gSavedSettings.getBOOL("HelpFloaterOpen")) { @@ -2112,21 +2178,18 @@ bool idle_startup() LLViewerHelp::instance().showTopic(""); } - display_startup(); - - // We're successfully logged in. - gSavedSettings.setBOOL("FirstLoginThisInstall", false); + do_startup_frame(); LLFloaterReg::showInitialVisibleInstances(); LLFloaterGridStatus::getInstance()->startGridStatusTimer(); - display_startup(); + do_startup_frame(); - display_startup(); + do_startup_frame(); // JC: Initializing audio requests many sounds for download. init_audio(); - display_startup(); + do_startup_frame(); // JC: Initialize "active" gestures. This may also trigger // many gesture downloads, if this is the user's first @@ -2164,7 +2227,7 @@ bool idle_startup() LLGestureMgr::instance().startFetch(); } gDisplaySwapBuffers = true; - display_startup(); + do_startup_frame(); LLMessageSystem* msg = gMessageSystem; msg->setHandlerFuncFast(_PREHASH_SoundTrigger, process_sound_trigger); @@ -2242,10 +2305,10 @@ bool idle_startup() } } - display_startup(); + do_startup_frame(); //DEV-17797. get null folder. Any items found here moved to Lost and Found LLInventoryModelBackgroundFetch::instance().findLostItems(); - display_startup(); + do_startup_frame(); LLStartUp::setStartupState( STATE_PRECACHE ); timeout.reset(); @@ -2254,7 +2317,7 @@ bool idle_startup() if (STATE_PRECACHE == LLStartUp::getStartupState()) { - display_startup(); + do_startup_frame(); F32 timeout_frac = timeout.getElapsedTimeF32()/PRECACHING_DELAY; // We now have an inventory skeleton, so if this is a user's first @@ -2280,7 +2343,7 @@ bool idle_startup() callAfterCOFFetch(set_flags_and_update_appearance); } - display_startup(); + do_startup_frame(); // wait precache-delay and for agent's avatar or a lot longer. if ((timeout_frac > 1.f) && isAgentAvatarValid()) @@ -2305,7 +2368,7 @@ bool idle_startup() set_startup_status(0.60f + 0.30f * timeout_frac, LLTrans::getString("LoginPrecaching"), gAgent.mMOTD.c_str()); - display_startup(); + do_startup_frame(); } return true; @@ -2333,7 +2396,7 @@ bool idle_startup() LLStartUp::setStartupState( STATE_CLEANUP ); } - display_startup(); + do_startup_frame(); if (gAgent.isOutfitChosen() && (wearables_time > MAX_WEARABLES_TIME)) { @@ -2374,7 +2437,7 @@ bool idle_startup() if (STATE_CLEANUP == LLStartUp::getStartupState()) { set_startup_status(1.0, "", ""); - display_startup(); + do_startup_frame(); if (!mBenefitsSuccessfullyInit) { @@ -2395,7 +2458,7 @@ bool idle_startup() //gViewerWindow->revealIntroPanel(); gViewerWindow->setStartupComplete(); gViewerWindow->setProgressCancelButtonVisible(false); - display_startup(); + do_startup_frame(); // We're not away from keyboard, even though login might have taken // a while. JC @@ -2427,7 +2490,7 @@ bool idle_startup() // LLUserAuth::getInstance()->reset(); LLStartUp::setStartupState( STATE_STARTED ); - display_startup(); + do_startup_frame(); // Unmute audio if desired and setup volumes. // This is a not-uncommon crash site, so surround it with @@ -2443,7 +2506,7 @@ bool idle_startup() LLAgentPicksInfo::getInstance()->requestNumberOfPicks(); - display_startup(); + do_startup_frame(); llassert(LLPathfindingManager::getInstance() != NULL); LLPathfindingManager::getInstance()->initSystem(); @@ -2462,6 +2525,27 @@ bool idle_startup() LLPerfStats::StatsRecorder::setAutotuneInit(); + // Display Avatar Welcome Pack the first time a user logs in + // (or clears their settings....) + if (gSavedSettings.getBOOL("FirstLoginThisInstall")) + { + LLFloater* avatar_welcome_pack_floater = LLFloaterReg::findInstance("avatar_welcome_pack"); + if (avatar_welcome_pack_floater != nullptr) + { + // There is a (very - 1 in ~50 times) hard to repro bug where the login + // page is not hidden when the AWP floater is presented. This (agressive) + // approach to always close it seems like the best fix for now. + LLPanelLogin::closePanel(); + + avatar_welcome_pack_floater->setVisible(true); + } + } + + //// We're successfully logged in. + // 2025-06 Moved lower down in the state machine so the Avatar Welcome Pack + // floater display can be triggered correctly. + gSavedSettings.setBOOL("FirstLoginThisInstall", false); + return true; } @@ -2529,9 +2613,9 @@ void release_notes_coro(const std::string url) LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("releaseNotesCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("releaseNotesCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); httpOpts->setHeadersOnly(true); // only making sure it isn't 404 or something like that @@ -2548,6 +2632,27 @@ void release_notes_coro(const std::string url) LLWeb::loadURLInternal(url); } +void validate_release_notes_coro(const std::string url) +{ + LLVersionInfo& versionInfo(LLVersionInfo::instance()); + const boost::regex version_regex(R"(\b\d+\.\d+\.\d+\.\d+\b)"); + + if (url.find(versionInfo.getVersion()) == std::string::npos // has no our build version + && ll_regex_search(url, version_regex)) // has any version + { + LL_INFOS() << "Received release notes url \"" << url << "\" wwith mismatching build, falling back to locally generated url" << LL_ENDL; + // Updater only provides notes for a most recent version, if it is not + // the current one, fall back to the hardcoded URL. + LLSD info(LLAppViewer::instance()->getViewerInfo()); + std::string alt_url = info["VIEWER_RELEASE_NOTES_URL"].asString(); + release_notes_coro(alt_url); + } + else + { + release_notes_coro(url); + } +} + /** * Check if user is running a new version of the viewer. * Display the Release Notes if it's not overriden by the "UpdaterShowReleaseNotes" setting. @@ -2581,7 +2686,7 @@ void show_release_notes_if_required() "showrelnotes", [](const LLSD& url) { LLCoros::instance().launch("releaseNotesCoro", - boost::bind(&release_notes_coro, url.asString())); + boost::bind(&validate_release_notes_coro, url.asString())); return false; }); } @@ -2820,13 +2925,12 @@ void register_viewer_callbacks(LLMessageSystem* msg) msg->setHandlerFunc("AvatarPickerReply", LLFloaterAvatarPicker::processAvatarPickerReply); - // directory search - msg->setHandlerFuncFast(_PREHASH_DirPeopleReply, FSPanelSearchPeople::processSearchReply); - msg->setHandlerFuncFast(_PREHASH_DirPlacesReply, FSPanelSearchPlaces::processSearchReply); - msg->setHandlerFuncFast(_PREHASH_DirGroupsReply, FSPanelSearchGroups::processSearchReply); - msg->setHandlerFuncFast(_PREHASH_DirEventsReply, FSPanelSearchEvents::processSearchReply); - msg->setHandlerFuncFast(_PREHASH_DirLandReply, FSPanelSearchLand::processSearchReply); - msg->setHandlerFuncFast(_PREHASH_DirClassifiedReply, FSPanelSearchClassifieds::processSearchReply); + msg->setHandlerFunc("DirPlacesReply", LLPanelDirBrowser::processDirPlacesReply); + msg->setHandlerFunc("DirPeopleReply", LLPanelDirBrowser::processDirPeopleReply); + msg->setHandlerFunc("DirEventsReply", LLPanelDirBrowser::processDirEventsReply); + msg->setHandlerFunc("DirGroupsReply", LLPanelDirBrowser::processDirGroupsReply); + msg->setHandlerFunc("DirClassifiedReply", LLPanelDirBrowser::processDirClassifiedReply); + msg->setHandlerFunc("DirLandReply", LLPanelDirBrowser::processDirLandReply); msg->setHandlerFunc("MapBlockReply", LLWorldMapMessage::processMapBlockReply); msg->setHandlerFunc("MapItemReply", LLWorldMapMessage::processMapItemReply); @@ -3056,9 +3160,7 @@ std::string LLStartUp::startupStateToString(EStartupState state) // static void LLStartUp::setStartupState( EStartupState state ) { - LL_INFOS("AppInit") << "Startup state changing from " << - getStartupStateString() << " to " << - startupStateToString(state) << LL_ENDL; + LL_INFOS("AppInit") << getStartupStateString() << " --> " << startupStateToString(state) << LL_ENDL; getPhases().stopPhase(getStartupStateString()); gStartupState = state; @@ -3122,7 +3224,7 @@ void LLStartUp::multimediaInit() LL_DEBUGS("AppInit") << "Initializing Multimedia...." << LL_ENDL; std::string msg = LLTrans::getString("LoginInitializingMultimedia"); set_startup_status(0.42f, msg.c_str(), gAgent.mMOTD.c_str()); - display_startup(); + do_startup_frame(); } void LLStartUp::fontInit() @@ -3130,7 +3232,7 @@ void LLStartUp::fontInit() LL_DEBUGS("AppInit") << "Initializing fonts...." << LL_ENDL; std::string msg = LLTrans::getString("LoginInitializingFonts"); set_startup_status(0.45f, msg.c_str(), gAgent.mMOTD.c_str()); - display_startup(); + do_startup_frame(); LLFontGL::loadDefaultFonts(); } @@ -3587,7 +3689,7 @@ bool process_login_success_response() // Agent id needed for parcel info request in LLUrlEntryParcel // to resolve parcel name. - LLUrlEntryParcel::setAgentID(gAgentID); + LLUrlEntryBase::setAgentID(gAgentID); text = response["session_id"].asString(); if(!text.empty()) gAgentSessionID.set(text); @@ -3827,14 +3929,14 @@ bool process_login_success_response() { // We got an answer from the grid -> use that for map for the current session gSavedSettings.setString("CurrentMapServerURL", map_server_url); - LL_INFOS("LLStartup") << "map-server-url : we got an answer from the grid : " << map_server_url << LL_ENDL; + LL_INFOS("LLStartUp") << "map-server-url : we got an answer from the grid : " << map_server_url << LL_ENDL; } else { // No answer from the grid -> use the default setting for current session map_server_url = gSavedSettings.getString("MapServerURL"); gSavedSettings.setString("CurrentMapServerURL", map_server_url); - LL_INFOS("LLStartup") << "map-server-url : no map-server-url answer, we use the default setting for the map : " << map_server_url << LL_ENDL; + LL_INFOS("LLStartUp") << "map-server-url : no map-server-url answer, we use the default setting for the map : " << map_server_url << LL_ENDL; } // Default male and female avatars allowing the user to choose their avatar on first login. @@ -3905,25 +4007,7 @@ bool process_login_success_response() LLViewerMedia::getInstance()->openIDSetup(openid_url, openid_token); } - - // Only save mfa_hash for future logins if the user wants their info remembered. - if(response.has("mfa_hash") - && gSavedSettings.getBOOL("RememberUser") - && LLLoginInstance::getInstance()->saveMFA()) - { - std::string grid(LLGridManager::getInstance()->getGridId()); - std::string user_id(gUserCredential->userID()); - gSecAPIHandler->addToProtectedMap("mfa_hash", grid, user_id, response["mfa_hash"]); - // TODO(brad) - related to SL-17223 consider building a better interface that sync's automatically - gSecAPIHandler->syncProtectedMap(); - } - else if (!LLLoginInstance::getInstance()->saveMFA()) - { - std::string grid(LLGridManager::getInstance()->getGridId()); - std::string user_id(gUserCredential->userID()); - gSecAPIHandler->removeFromProtectedMap("mfa_hash", grid, user_id); - gSecAPIHandler->syncProtectedMap(); - } + LLLoginInstance::getInstance()->saveMFAHash(response); bool success = false; // JC: gesture loading done below, when we have an asset system diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index 1bab602364..ff7692e5e9 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -41,6 +41,7 @@ #include "llpanelpresetscamerapulldown.h" #include "llpanelpresetspulldown.h" #include "llpanelvolumepulldown.h" +#include "llfloatermarketplace.h" #include "llfloaterregioninfo.h" #include "llfloaterscriptdebug.h" #include "llhints.h" @@ -115,6 +116,8 @@ LLStatusBar::LLStatusBar(const LLRect& rect) mBtnVolume(NULL), mBoxBalance(NULL), mBalance(0), + mBalanceClicked(false), + mObscureBalance(false), mHealth(100), mSquareMetersCredit(0), mSquareMetersCommitted(0), @@ -126,8 +129,6 @@ LLStatusBar::LLStatusBar(const LLRect& rect) // status bar can possible overlay menus? setMouseOpaque(false); - mBalanceTimer = new LLFrameTimer(); - mHealthTimer = new LLFrameTimer(); mFpsUpdateTimer = new LLFrameTimer(); buildFromFile("panel_status_bar.xml"); @@ -135,12 +136,6 @@ LLStatusBar::LLStatusBar(const LLRect& rect) LLStatusBar::~LLStatusBar() { - delete mBalanceTimer; - mBalanceTimer = NULL; - - delete mHealthTimer; - mHealthTimer = NULL; - // LLView destructor cleans up children } @@ -173,10 +168,12 @@ bool LLStatusBar::postBuild() getChild<LLUICtrl>("buyL")->setCommitCallback( boost::bind(&LLStatusBar::onClickBuyCurrency, this)); - getChild<LLUICtrl>("goShop")->setCommitCallback(boost::bind(&LLWeb::loadURL, gSavedSettings.getString("MarketplaceURL"), LLStringUtil::null, LLStringUtil::null)); + getChild<LLUICtrl>("goShop")->setCommitCallback( + boost::bind(&LLStatusBar::onClickShop, this)); mBoxBalance = getChild<LLTextBox>("balance"); - mBoxBalance->setClickedCallback( &LLStatusBar::onClickBalance, this ); + mBoxBalance->setClickedCallback(&LLStatusBar::onClickRefreshBalance, this); + mBoxBalance->setDoubleClickCallback([this](LLUICtrl*, S32 x, S32 y, MASK mask) { onClickToggleBalance(); }); mIconPresetsCamera = getChild<LLIconCtrl>( "presets_icon_camera" ); mIconPresetsCamera->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterPresetsCamera, this)); @@ -196,12 +193,14 @@ bool LLStatusBar::postBuild() gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&LLStatusBar::onVolumeChanged, this, _2)); gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&LLStatusBar::onVoiceChanged, this, _2)); + gSavedSettings.getControl("ObscureBalanceInStatusBar")->getSignal()->connect(boost::bind(&LLStatusBar::onObscureBalanceChanged, this, _2)); if (!gSavedSettings.getBOOL("EnableVoiceChat") && LLAppViewer::instance()->isSecondInstance()) { // Indicate that second instance started without sound mBtnVolume->setImageUnselected(LLUI::getUIImage("VoiceMute_Off")); } + mObscureBalance = gSavedSettings.getBOOL("ObscureBalanceInStatusBar"); // Adding Net Stat Graph S32 x = getRect().getWidth() - 2; @@ -307,9 +306,21 @@ void LLStatusBar::refresh() mFpsUpdateTimer->reset(); S32 fps = (S32) llround(LLTrace::get_frame_recording().getPeriodMedianPerSec(LLStatViewer::FPS, 50)); + if(fps < 1) fps = 1; + + S32 minFps = (S32) llround(LLTrace::get_frame_recording().getPeriodMinPerSec(LLStatViewer::FPS, 50)); + S32 maxFps = (S32) llround(LLTrace::get_frame_recording().getPeriodMaxPerSec(LLStatViewer::FPS, 50)); + + F32 fpsQuality = (F32)minFps / (F32)fps; + std::string fpsStr = std::to_string(fps); - //mTextFps->setText(fpsStr); + mTextFps->setLabel(fpsStr); + + if(fpsQuality < 0.5) mTextFps->setColor(LLColor4(0.6,0.0,0.0)); + else if(fpsQuality < 0.7) mTextFps->setColor(LLColor4(0.7,0.5,0.0)); + else if(fpsQuality < 0.9) mTextFps->setColor(LLColor4(0.5,0.7,0.0)); + else mTextFps->setColor(LLColor4(0.0, 0.7, 0.15)); } // update clock every 10 seconds @@ -322,7 +333,9 @@ void LLStatusBar::refresh() time_t utc_time; utc_time = time_corrected(); - std::string timeStr = getString("time"); + static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); + std::string timeStr = use_24h ? getString("time") : getString("time_ampm"); + LLSD substitution; substitution["datetime"] = (S32) utc_time; LLStringUtil::format (timeStr, substitution); @@ -334,6 +347,12 @@ void LLStatusBar::refresh() mTextTime->setToolTip (dtStr); } + if (mBalanceClicked && mBalanceClickTimer.getElapsedTimeF32() > 1.f) + { + mBalanceClicked = false; + sendMoneyBalanceRequest(); + } + LLRect r; const S32 MENU_RIGHT = gMenuBarView->getRightmostMenuEdge(); @@ -399,9 +418,17 @@ void LLStatusBar::setBalance(S32 balance) std::string money_str = LLResMgr::getInstance()->getMonetaryString( balance ); LLStringUtil::format_map_t string_args; - string_args["[AMT]"] = llformat("%s", money_str.c_str()); + if (mObscureBalance) + { + string_args["[AMT]"] = "****"; + } + else + { + string_args["[AMT]"] = llformat("%s", money_str.c_str()); + } std::string label_str = getString("buycurrencylabel", string_args); mBoxBalance->setValue(label_str); + mBoxBalance->setToolTipArg(LLStringExplicit("[AMT]"), llformat("%s", money_str.c_str())); updateBalancePanelPosition(); @@ -421,8 +448,6 @@ void LLStatusBar::setBalance(S32 balance) if( balance != mBalance ) { - mBalanceTimer->reset(); - mBalanceTimer->setTimerExpirySec( ICON_TIMER_EXPIRY ); mBalance = balance; } } @@ -474,9 +499,6 @@ void LLStatusBar::setHealth(S32 health) } } } - - mHealthTimer->reset(); - mHealthTimer->setTimerExpirySec( ICON_TIMER_EXPIRY ); } mHealth = health; @@ -530,6 +552,15 @@ void LLStatusBar::onClickBuyCurrency() LLFirstUse::receiveLindens(false); } +void LLStatusBar::onClickShop() +{ + LLFloaterReg::showInstanceOrBringToFront("marketplace"); + if (LLFloaterMarketplace* marketplace = LLFloaterReg::getTypedInstance<LLFloaterMarketplace>("marketplace")) + { + marketplace->openMarketplace(); + } +} + void LLStatusBar::onMouseEnterPresetsCamera() { LLView* popup_holder = gViewerWindow->getRootView()->getChildView("popup_holder"); @@ -636,13 +667,27 @@ static void onClickVolume(void* data) } //static -void LLStatusBar::onClickBalance(void* ) +void LLStatusBar::onClickRefreshBalance(void* data) { - // Force a balance request message: - LLStatusBar::sendMoneyBalanceRequest(); + LLStatusBar* status_bar = (LLStatusBar*)data; + + if (!status_bar->mBalanceClicked) + { + // Schedule a balance request message: + status_bar->mBalanceClicked = true; + status_bar->mBalanceClickTimer.reset(); + } // The refresh of the display (call to setBalance()) will be done by process_money_balance_reply() } +void LLStatusBar::onClickToggleBalance() +{ + mObscureBalance = !mObscureBalance; + gSavedSettings.setBOOL("ObscureBalanceInStatusBar", mObscureBalance); + setBalance(mBalance); + mBalanceClicked = false; // supress click +} + //static void LLStatusBar::onClickMediaToggle(void* data) { @@ -678,6 +723,12 @@ void LLStatusBar::onVoiceChanged(const LLSD& newvalue) refresh(); } +void LLStatusBar::onObscureBalanceChanged(const LLSD& newvalue) +{ + mObscureBalance = newvalue.asBoolean(); + setBalance(mBalance); +} + void LLStatusBar::onUpdateFilterTerm() { LLWString searchValue = utf8str_to_wstring( mFilterEdit->getValue() ); @@ -698,7 +749,7 @@ void collectChildren( LLMenuGL *aMenu, ll::statusbar::SearchableItemPtr aParentM { LLMenuItemGL *pMenu = aMenu->getItem( i ); - ll::statusbar::SearchableItemPtr pItem( new ll::statusbar::SearchableItem ); + ll::statusbar::SearchableItemPtr pItem = std::make_shared<ll::statusbar::SearchableItem>(); pItem->mCtrl = pMenu; pItem->mMenu = pMenu; pItem->mLabel = utf8str_to_wstring( pMenu->ll::ui::SearchableControl::getSearchText() ); @@ -714,8 +765,8 @@ void collectChildren( LLMenuGL *aMenu, ll::statusbar::SearchableItemPtr aParentM void LLStatusBar::collectSearchableItems() { - mSearchData.reset( new ll::statusbar::SearchData ); - ll::statusbar::SearchableItemPtr pItem( new ll::statusbar::SearchableItem ); + mSearchData = std::make_unique<ll::statusbar::SearchData>(); + ll::statusbar::SearchableItemPtr pItem = std::make_shared<ll::statusbar::SearchableItem>(); mSearchData->mRootMenu = pItem; collectChildren( gMenuBarView, pItem ); } @@ -759,6 +810,10 @@ void LLStatusBar::updateBalancePanelPosition() balance_bg_view->setShape(balance_bg_rect); } +void LLStatusBar::setBalanceVisible(bool visible) +{ + mBoxBalance->setVisible(visible); +} // Implements secondlife:///app/balance/request to request a L$ balance // update via UDP message system. JC diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h index 7e1ecf08ca..e54ccfe736 100644 --- a/indra/newview/llstatusbar.h +++ b/indra/newview/llstatusbar.h @@ -72,7 +72,8 @@ public: void debitBalance(S32 debit); void creditBalance(S32 credit); - // Request the latest currency balance from the server + // Request the latest currency balance from the server. + // Reply at process_money_balance_reply() static void sendMoneyBalanceRequest(); void setHealth(S32 percent); @@ -93,13 +94,17 @@ public: S32 getSquareMetersCommitted() const; S32 getSquareMetersLeft() const; + void setBalanceVisible(bool visible); + LLPanelNearByMedia* getNearbyMediaPanel() { return mPanelNearByMedia; } private: void onClickBuyCurrency(); + void onClickShop(); void onVolumeChanged(const LLSD& newvalue); void onVoiceChanged(const LLSD& newvalue); + void onObscureBalanceChanged(const LLSD& newvalue); void onMouseEnterPresetsCamera(); void onMouseEnterPresets(); @@ -107,7 +112,8 @@ private: void onMouseEnterNearbyMedia(); static void onClickMediaToggle(void* data); - static void onClickBalance(void* data); + static void onClickRefreshBalance(void* data); + void onClickToggleBalance(); static void onClickFps(void* data); @@ -137,11 +143,12 @@ private: LLFrameTimer *mFpsUpdateTimer; S32 mBalance; + bool mBalanceClicked; + bool mObscureBalance; + LLTimer mBalanceClickTimer; S32 mHealth; S32 mSquareMetersCredit; S32 mSquareMetersCommitted; - LLFrameTimer* mBalanceTimer; - LLFrameTimer* mHealthTimer; LLPanelPresetsCameraPulldown* mPanelPresetsCameraPulldown; LLPanelPresetsPulldown* mPanelPresetsPulldown; LLPanelVolumePulldown* mPanelVolumePulldown; diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp index 1826885069..64359b6cbe 100644 --- a/indra/newview/llsurface.cpp +++ b/indra/newview/llsurface.cpp @@ -28,9 +28,6 @@ #include "llsurface.h" -#include "llrender.h" - -#include "llviewertexturelist.h" #include "llpatchvertexarray.h" #include "patch_dct.h" #include "patch_code.h" @@ -39,28 +36,25 @@ #include "llregionhandle.h" #include "llagent.h" #include "llagentcamera.h" -#include "llappviewer.h" #include "llworld.h" #include "llviewercontrol.h" #include "llviewertexture.h" #include "llsurfacepatch.h" -#include "llvosurfacepatch.h" #include "llvowater.h" #include "pipeline.h" #include "llviewerregion.h" -#include "llvlcomposition.h" -#include "noise.h" -#include "llviewercamera.h" -#include "llglheaders.h" #include "lldrawpoolterrain.h" -#include "lldrawable.h" #include "llworldmipmap.h" extern LLPipeline gPipeline; extern bool gShiftFrame; -LLColor4U MAX_WATER_COLOR(0, 48, 96, 240); +namespace +{ + static constexpr float MIN_TEXTURE_REQUEST_INTERVAL = 5.0f; +} +LLColor4U MAX_WATER_COLOR(0, 48, 96, 240); S32 LLSurface::sTextureSize = 256; @@ -74,18 +68,18 @@ LLSurface::LLSurface(U32 type, LLViewerRegion *regionp) : mType(type), mDetailTextureScale(0.f), mOriginGlobal(0.0, 0.0, 0.0), - mSTexturep(NULL), + mSTexturep(nullptr), mGridsPerPatchEdge(0), mMetersPerGrid(1.0f), mMetersPerEdge(1.0f), mRegionp(regionp) { // Surface data - mSurfaceZ = NULL; - mNorm = NULL; + mSurfaceZ = nullptr; + mNorm = nullptr; // Patch data - mPatchList = NULL; + mPatchList = nullptr; // One of each for each camera mVisiblePatchCount = 0; @@ -95,14 +89,14 @@ LLSurface::LLSurface(U32 type, LLViewerRegion *regionp) : mMinZ = 10000.f; mMaxZ = -10000.f; - mWaterObjp = NULL; + mWaterObjp = nullptr; // In here temporarily. mSurfacePatchUpdateCount = 0; for (S32 i = 0; i < 8; i++) { - mNeighbors[i] = NULL; + mNeighbors[i] = nullptr; } } @@ -110,7 +104,7 @@ LLSurface::LLSurface(U32 type, LLViewerRegion *regionp) : LLSurface::~LLSurface() { delete [] mSurfaceZ; - mSurfaceZ = NULL; + mSurfaceZ = nullptr; delete [] mNorm; @@ -129,7 +123,7 @@ LLSurface::~LLSurface() { gPipeline.removePool(poolp); // Don't enable this until we blitz the draw pool for it as well. -- djs - mSTexturep = NULL; + mSTexturep = nullptr; } else { @@ -144,7 +138,7 @@ void LLSurface::initClasses() void LLSurface::setRegion(LLViewerRegion *regionp) { mRegionp = regionp; - mWaterObjp = NULL; // depends on regionp, needs recreating + mWaterObjp = nullptr; // depends on regionp, needs recreating } // Assumes that arguments are powers of 2, and that @@ -211,16 +205,29 @@ LLViewerTexture* LLSurface::getSTexture() void LLSurface::createSTexture() { - if (!mSTexturep) + if (mSTexturep.isNull()) + { + mTimer.setTimerExpirySec(MIN_TEXTURE_REQUEST_INTERVAL); + } + else if (mSTexturep->hasGLTexture()) { - U64 handle = mRegionp->getHandle(); + // Unexpected: createSTexture() called when a valid texture already exists. + // This may indicate a logic error in the caller, as textures should not be recreated unnecessarily. + LL_WARNS() << "Called LLSurface::createSTexture() while we already have a valid texture!" << LL_ENDL; + return; + } + else if (!mTimer.checkExpirationAndReset(MIN_TEXTURE_REQUEST_INTERVAL)) + { + // We haven't gotten a valid texture yet, but throttle the number of requests to avoid server flooding + return; + } - U32 grid_x, grid_y; + U64 handle = mRegionp->getHandle(); + U32 grid_x, grid_y; - grid_from_region_handle(handle, &grid_x, &grid_y); + grid_from_region_handle(handle, &grid_x, &grid_y); - mSTexturep = LLWorldMipmap::loadObjectsTile(grid_x, grid_y, 1); - } + mSTexturep = LLWorldMipmap::loadObjectsTile(grid_x, grid_y, 1); } void LLSurface::initTextures() @@ -285,7 +292,7 @@ void LLSurface::getNeighboringRegions( std::vector<LLViewerRegion*>& uniqueRegio S32 i; for (i = 0; i < 8; i++) { - if ( mNeighbors[i] != NULL ) + if (mNeighbors[i] != nullptr) { uniqueRegions.push_back( mNeighbors[i]->getRegion() ); } @@ -298,7 +305,7 @@ void LLSurface::getNeighboringRegionsStatus( std::vector<S32>& regions ) S32 i; for (i = 0; i < 8; i++) { - if ( mNeighbors[i] != NULL ) + if (mNeighbors[i] != nullptr) { regions.push_back( i ); } @@ -498,7 +505,7 @@ void LLSurface::disconnectNeighbor(LLSurface *surfacep) { if (surfacep == mNeighbors[i]) { - mNeighbors[i] = NULL; + mNeighbors[i] = nullptr; } } @@ -518,7 +525,7 @@ void LLSurface::disconnectAllNeighbors() if (mNeighbors[i]) { mNeighbors[i]->disconnectNeighbor(this); - mNeighbors[i] = NULL; + mNeighbors[i] = nullptr; } } } @@ -910,7 +917,7 @@ LLSurfacePatch *LLSurface::resolvePatchRegion(const F32 x, const F32 y) const if(0 == mNumberOfPatches) { LL_WARNS() << "No patches for current region!" << LL_ENDL; - return NULL; + return nullptr; } S32 old_index = index; index = llclamp(old_index, 0, (mNumberOfPatches - 1)); @@ -996,7 +1003,7 @@ void LLSurface::createPatchData() } else { - patchp->setNeighborPatch(EAST, NULL); + patchp->setNeighborPatch(EAST, nullptr); } if (j < mPatchesPerEdge-1) @@ -1005,7 +1012,7 @@ void LLSurface::createPatchData() } else { - patchp->setNeighborPatch(NORTH, NULL); + patchp->setNeighborPatch(NORTH, nullptr); } if (i > 0) @@ -1014,7 +1021,7 @@ void LLSurface::createPatchData() } else { - patchp->setNeighborPatch(WEST, NULL); + patchp->setNeighborPatch(WEST, nullptr); } if (j > 0) @@ -1023,7 +1030,7 @@ void LLSurface::createPatchData() } else { - patchp->setNeighborPatch(SOUTH, NULL); + patchp->setNeighborPatch(SOUTH, nullptr); } if (i < (mPatchesPerEdge-1) && j < (mPatchesPerEdge-1)) @@ -1032,7 +1039,7 @@ void LLSurface::createPatchData() } else { - patchp->setNeighborPatch(NORTHEAST, NULL); + patchp->setNeighborPatch(NORTHEAST, nullptr); } if (i > 0 && j < (mPatchesPerEdge-1)) @@ -1041,7 +1048,7 @@ void LLSurface::createPatchData() } else { - patchp->setNeighborPatch(NORTHWEST, NULL); + patchp->setNeighborPatch(NORTHWEST, nullptr); } if (i > 0 && j > 0) @@ -1050,7 +1057,7 @@ void LLSurface::createPatchData() } else { - patchp->setNeighborPatch(SOUTHWEST, NULL); + patchp->setNeighborPatch(SOUTHWEST, nullptr); } if (i < (mPatchesPerEdge-1) && j > 0) @@ -1059,7 +1066,7 @@ void LLSurface::createPatchData() } else { - patchp->setNeighborPatch(SOUTHEAST, NULL); + patchp->setNeighborPatch(SOUTHEAST, nullptr); } LLVector3d origin_global; @@ -1077,7 +1084,7 @@ void LLSurface::destroyPatchData() // Delete all of the cached patch data for these patches. delete [] mPatchList; - mPatchList = NULL; + mPatchList = nullptr; mVisiblePatchCount = 0; } @@ -1105,12 +1112,12 @@ LLSurfacePatch *LLSurface::getPatch(const S32 x, const S32 y) const if ((x < 0) || (x >= mPatchesPerEdge)) { LL_ERRS() << "Asking for patch out of bounds" << LL_ENDL; - return NULL; + return nullptr; } if ((y < 0) || (y >= mPatchesPerEdge)) { LL_ERRS() << "Asking for patch out of bounds" << LL_ENDL; - return NULL; + return nullptr; } return mPatchList + x + y*mPatchesPerEdge; diff --git a/indra/newview/llsurface.h b/indra/newview/llsurface.h index 10a104730b..a599019ca5 100644 --- a/indra/newview/llsurface.h +++ b/indra/newview/llsurface.h @@ -27,17 +27,10 @@ #ifndef LL_LLSURFACE_H #define LL_LLSURFACE_H -//#include "vmath.h" #include "v3math.h" #include "v3dmath.h" -#include "v4math.h" -#include "m3math.h" -#include "m4math.h" -#include "llquaternion.h" - -#include "v4coloru.h" -#include "v4color.h" +#include "lltimer.h" #include "llvowater.h" #include "llpatchvertexarray.h" #include "llviewertexture.h" @@ -66,7 +59,7 @@ class LLGroupHeader; class LLSurface { public: - LLSurface(U32 type, LLViewerRegion *regionp = NULL); + LLSurface(U32 type, LLViewerRegion *regionp = nullptr); virtual ~LLSurface(); static void initClasses(); // Do class initialization for LLSurface and its child classes. @@ -170,14 +163,13 @@ public: F32 mDetailTextureScale; // Number of times to repeat detail texture across this surface -protected: +private: void createSTexture(); void initTextures(); void createPatchData(); // Allocates memory for patches. void destroyPatchData(); // Deallocates memory for patches. -protected: LLVector3d mOriginGlobal; // In absolute frame LLSurfacePatch *mPatchList; // Array of all patches @@ -213,6 +205,7 @@ protected: private: LLViewerRegion *mRegionp; // Patch whose coordinate system this surface is using. static S32 sTextureSize; // Size of the surface texture + LLTimer mTimer; // timer to throttle initial requests until the mSTexture is fully fetched }; extern template bool LLSurface::idleUpdate</*PBR=*/false>(F32 max_update_time); diff --git a/indra/newview/llsurfacepatch.cpp b/indra/newview/llsurfacepatch.cpp index 4315c4c6b0..875af76c10 100644 --- a/indra/newview/llsurfacepatch.cpp +++ b/indra/newview/llsurfacepatch.cpp @@ -201,7 +201,7 @@ LLVector2 LLSurfacePatch::getTexCoords(const U32 x, const U32 y) const void LLSurfacePatch::eval(const U32 x, const U32 y, const U32 stride, LLVector3 *vertex, LLVector3 *normal, - LLVector2 *tex1) const + LLVector2* tex0, LLVector2 *tex1) const { if (!mSurfacep || !mSurfacep->getRegion() || !mSurfacep->getGridsPerEdge() || !mVObjp) { @@ -220,6 +220,12 @@ void LLSurfacePatch::eval(const U32 x, const U32 y, const U32 stride, LLVector3 pos_agent.mV[VZ] = *(mDataZ + point_offset); *vertex = pos_agent-mVObjp->getRegion()->getOriginAgent(); + // tex0 is used for ownership overlay + LLVector3 rel_pos = pos_agent - mSurfacep->getOriginAgent(); + LLVector3 tex_pos = rel_pos * (1.f / (surface_stride * mSurfacep->getMetersPerGrid())); + tex0->mV[0] = tex_pos.mV[0]; + tex0->mV[1] = tex_pos.mV[1]; + tex1->mV[0] = mSurfacep->getRegion()->getCompositionXY(llfloor(mOriginRegion.mV[0])+x, llfloor(mOriginRegion.mV[1])+y); const F32 xyScale = 4.9215f*7.f; //0.93284f; diff --git a/indra/newview/llsurfacepatch.h b/indra/newview/llsurfacepatch.h index f4831487c1..505fc8c24c 100644 --- a/indra/newview/llsurfacepatch.h +++ b/indra/newview/llsurfacepatch.h @@ -116,7 +116,7 @@ public: void calcNormalFlat(LLVector3& normal_out, const U32 x, const U32 y, const U32 index /* 0 or 1 */); void eval(const U32 x, const U32 y, const U32 stride, - LLVector3 *vertex, LLVector3 *normal, LLVector2 *tex1) const; + LLVector3 *vertex, LLVector3 *normal, LLVector2* tex0, LLVector2 *tex1) const; diff --git a/indra/newview/llsyntaxid.cpp b/indra/newview/llsyntaxid.cpp index 5114ee3672..f89ae00c5b 100644 --- a/indra/newview/llsyntaxid.cpp +++ b/indra/newview/llsyntaxid.cpp @@ -120,8 +120,8 @@ void LLSyntaxIdLSL::fetchKeywordsFileCoro(std::string url, std::string fileSpec) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("genericPostCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("fetchKeywordsFileCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); std::pair<std::set<std::string>::iterator, bool> insrt = mInflightFetches.insert(fileSpec); if (!insrt.second) diff --git a/indra/newview/llsyswellitem.h b/indra/newview/llsyswellitem.h index 0a4e26cb98..2ad5de816b 100644 --- a/indra/newview/llsyswellitem.h +++ b/indra/newview/llsyswellitem.h @@ -60,7 +60,7 @@ public: virtual void onMouseLeave(S32 x, S32 y, MASK mask); //callbacks - typedef boost::function<void (LLSysWellItem* item)> syswell_item_callback_t; + typedef std::function<void (LLSysWellItem* item)> syswell_item_callback_t; typedef boost::signals2::signal<void (LLSysWellItem* item)> syswell_item_signal_t; syswell_item_signal_t mOnItemClose; syswell_item_signal_t mOnItemClick; diff --git a/indra/newview/llteleporthistory.h b/indra/newview/llteleporthistory.h index b534b136b0..76bd65e7a9 100644 --- a/indra/newview/llteleporthistory.h +++ b/indra/newview/llteleporthistory.h @@ -29,9 +29,9 @@ #include "llsingleton.h" // for LLSingleton +#include <functional> #include <vector> #include <string> -#include <boost/function.hpp> #include <boost/signals2.hpp> #include "llteleporthistorystorage.h" @@ -80,7 +80,7 @@ class LLTeleportHistory: public LLSingleton<LLTeleportHistory> public: typedef std::vector<LLTeleportHistoryItem> slurl_list_t; - typedef boost::function<void()> history_callback_t; + typedef std::function<void()> history_callback_t; typedef boost::signals2::signal<void()> history_signal_t; /** diff --git a/indra/newview/llteleporthistorystorage.cpp b/indra/newview/llteleporthistorystorage.cpp index dd7c6aa9e3..e02f76711c 100644 --- a/indra/newview/llteleporthistorystorage.cpp +++ b/indra/newview/llteleporthistorystorage.cpp @@ -127,6 +127,12 @@ void LLTeleportHistoryStorage::addItem(const std::string title, const LLVector3d S32 removed_index = -1; if (item_iter != mItems.end()) { + // When teleporting via history it's possible that there can be + // an offset applied to the position, so each new teleport can + // be a meter higher than the last. + // Avoid it by preserving original position. + item.mGlobalPos = item_iter->mGlobalPos; + removed_index = (S32)(item_iter - mItems.begin()); mItems.erase(item_iter); } diff --git a/indra/newview/llteleporthistorystorage.h b/indra/newview/llteleporthistorystorage.h index 643c4a6bfc..07da596aab 100644 --- a/indra/newview/llteleporthistorystorage.h +++ b/indra/newview/llteleporthistorystorage.h @@ -77,7 +77,7 @@ public: typedef std::vector<LLTeleportHistoryPersistentItem> slurl_list_t; // removed_index is index of removed item, which replaced by more recent - typedef boost::function<void(S32 removed_index)> history_callback_t; + typedef std::function<void(S32 removed_index)> history_callback_t; typedef boost::signals2::signal<void(S32 removed_index)> history_signal_t; /** diff --git a/indra/newview/llterrainpaintmap.cpp b/indra/newview/llterrainpaintmap.cpp index 8ccde74c93..eeebab1ddb 100644 --- a/indra/newview/llterrainpaintmap.cpp +++ b/indra/newview/llterrainpaintmap.cpp @@ -86,9 +86,10 @@ bool LLTerrainPaintMap::bakeHeightNoiseIntoPBRPaintMapRGB(const LLViewerRegion& return false; } gGL.getTexUnit(0)->disable(); - stop_glerror(); - scratch_target.bindTarget(); + LOG_GLERROR(""); + + scratch_target.bindTarget("", 1); glClearColor(0, 0, 0, 0); scratch_target.clear(); @@ -107,7 +108,7 @@ bool LLTerrainPaintMap::bakeHeightNoiseIntoPBRPaintMapRGB(const LLViewerRegion& const LLVector3 region_center = LLVector3(region_half_width, region_half_width, 0.0) + region.getOriginAgent(); const LLVector3 camera_origin = LLVector3(0.0f, 0.0f, region_camera_height) + region_center; camera.lookAt(camera_origin, region_center, LLVector3::y_axis); - camera.setAspect(F32(scratch_target.getHeight()) / F32(scratch_target.getWidth())); + camera.setAspect(F32(scratch_target.getWidth()) / F32(scratch_target.getHeight())); const LLRect texture_rect(0, scratch_target.getHeight(), scratch_target.getWidth(), 0); glViewport(texture_rect.mLeft, texture_rect.mBottom, texture_rect.getWidth(), texture_rect.getHeight()); // Manually get modelview matrix from camera orientation. @@ -204,8 +205,9 @@ bool LLTerrainPaintMap::bakeHeightNoiseIntoPBRPaintMapRGB(const LLViewerRegion& { LLVector3 scratch3; LLVector3 pos3; + LLVector2 tex0_temp; LLVector2 tex1_temp; - patch->eval(i, j, stride, &pos3, &scratch3, &tex1_temp); + patch->eval(i, j, stride, &pos3, &scratch3, &tex0_temp, &tex1_temp); (*pos++).set(pos3.mV[VX], pos3.mV[VY], pos3.mV[VZ]); *tex1++ = tex1_temp; vertex_total++; @@ -275,7 +277,7 @@ bool LLTerrainPaintMap::bakeHeightNoiseIntoPBRPaintMapRGB(const LLViewerRegion& LL_WARNS() << "Failed to copy framebuffer to paintmap" << LL_ENDL; } glGenerateMipmap(GL_TEXTURE_2D); - stop_glerror(); + LOG_GLERROR("LLTerrainPainMap::bakeHeightNoiseIntoPBRPaintMapRGB() - glGenerateMipmap"); scratch_target.flush(); diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index be7653c011..1a7ce74ccc 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -1347,27 +1347,40 @@ U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries) } for (U32 idx=0; idx<num_entries; idx++) { - Entry entry; - S32 bytes_read = aprfile->read((void*)(&entry), (S32)sizeof(Entry)); - if (bytes_read < sizeof(Entry)) + try + { + Entry entry; + S32 bytes_read = aprfile->read((void*)(&entry), (S32)sizeof(Entry)); + if (bytes_read < sizeof(Entry)) + { + LL_WARNS() << "Corrupted header entries, failed at " << idx << " / " << num_entries << LL_ENDL; + closeHeaderEntriesFile(); + return 0; + } + entries.push_back(entry); + // LL_INFOS() << "ENTRY: " << entry.mTime << " TEX: " << entry.mID << " IDX: " << idx << " Size: " << entry.mImageSize << LL_ENDL; + if (entry.mImageSize > entry.mBodySize) + { + mHeaderIDMap[entry.mID] = idx; + mTexturesSizeMap[entry.mID] = entry.mBodySize; + mTexturesSizeTotal += entry.mBodySize; + } + else + { + mFreeList.insert(idx); + } + } + catch (std::bad_alloc&) { - LL_WARNS() << "Corrupted header entries, failed at " << idx << " / " << num_entries << LL_ENDL; + // Too little ram yet very large cache? + // Should this actually crash viewer? + entries.clear(); + LL_WARNS() << "Bad alloc trying to read texture entries from cache, mFreeList: " << (S32)mFreeList.size() + << ", added entries: " << idx << ", total entries: " << num_entries << LL_ENDL; closeHeaderEntriesFile(); purgeAllTextures(false); return 0; } - entries.push_back(entry); -// LL_INFOS() << "ENTRY: " << entry.mTime << " TEX: " << entry.mID << " IDX: " << idx << " Size: " << entry.mImageSize << LL_ENDL; - if(entry.mImageSize > entry.mBodySize) - { - mHeaderIDMap[entry.mID] = idx; - mTexturesSizeMap[entry.mID] = entry.mBodySize; - mTexturesSizeTotal += entry.mBodySize; - } - else - { - mFreeList.insert(idx); - } } closeHeaderEntriesFile(); return num_entries; diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 35057a910a..52ec8c17c1 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -88,7 +88,8 @@ bool get_is_predefined_texture(LLUUID asset_id) || asset_id == DEFAULT_OBJECT_NORMAL || asset_id == BLANK_OBJECT_NORMAL || asset_id == IMG_WHITE - || asset_id == LLUUID(SCULPT_DEFAULT_TEXTURE)) + || asset_id == LLUUID(SCULPT_DEFAULT_TEXTURE) + || asset_id == BLANK_MATERIAL_ASSET_ID) { return true; } @@ -163,13 +164,12 @@ LLFloaterTexturePicker::LLFloaterTexturePicker( mFallbackImage(fallback_image), mDefaultImageAssetID(default_image_asset_id), mBlankImageAssetID(blank_image_asset_id), - mTentative(tentative), mAllowNoTexture(allow_no_texture), mLabel(label), - mTentativeLabel(NULL), - mResolutionLabel(NULL), + mTentativeLabel(nullptr), + mResolutionLabel(nullptr), mActive( true ), - mFilterEdit(NULL), + mFilterEdit(nullptr), mImmediateFilterPermMask(immediate_filter_perm_mask), mDnDFilterPermMask(dnd_filter_perm_mask), mContextConeOpacity(0.f), @@ -180,13 +180,16 @@ LLFloaterTexturePicker::LLFloaterTexturePicker( mMaxDim(S32_MAX), mMinDim(0), mPreviewSettingChanged(false), - mOnFloaterCommitCallback(NULL), - mOnFloaterCloseCallback(NULL), - mSetImageAssetIDCallback(NULL), - mOnUpdateImageStatsCallback(NULL), + mOnFloaterCommitCallback(nullptr), + mOnFloaterCloseCallback(nullptr), + mSetImageAssetIDCallback(nullptr), + mOnUpdateImageStatsCallback(nullptr), mBakeTextureEnabled(false), + mLocalTextureEnabled(false), + mNoCopyTextureSelected(false), mInventoryPickType(pick_type) { + setTentative(tentative); mCanApplyImmediately = can_apply_immediately; buildFromFile("floater_texture_ctrl.xml"); setCanMinimize(false); @@ -198,7 +201,7 @@ LLFloaterTexturePicker::~LLFloaterTexturePicker() void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selection /*=true*/) { - if( ((mImageAssetID != image_id) || mTentative) && mActive) + if( ((mImageAssetID != image_id) || getTentative()) && mActive) { mNoCopyTextureSelected = false; mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here? @@ -261,6 +264,7 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti if (set_selection) { + // This is going to cause a callback mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO); } } @@ -276,6 +280,7 @@ void LLFloaterTexturePicker::setImageIDFromItem(const LLInventoryItem* itemp, bo asset_id = BLANK_MATERIAL_ASSET_ID; } setImageID(asset_id, set_selection); + setTentative(false); } void LLFloaterTexturePicker::setActive( bool active ) @@ -524,6 +529,8 @@ bool LLFloaterTexturePicker::handleKeyHere(KEY key, MASK mask) void LLFloaterTexturePicker::onOpen(const LLSD& key) { if (sLastPickerMode != 0 + && (mLocalTextureEnabled || sLastPickerMode != 1) + && (mBakeTextureEnabled || sLastPickerMode != 2) && mModeSelector->selectByValue(sLastPickerMode)) { changeMode(); @@ -592,7 +599,6 @@ bool LLFloaterTexturePicker::postBuild() refreshInventoryFilter(); mInventoryPanel->setFilterPermMask(mImmediateFilterPermMask); - mInventoryPanel->setSelectCallback(boost::bind(&LLFloaterTexturePicker::onSelectionChange, this, _1, _2)); mInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); // Disable auto selecting first filtered item because it takes away @@ -611,8 +617,25 @@ bool LLFloaterTexturePicker::postBuild() if(!mImageAssetID.isNull() || mInventoryPickType == PICK_MATERIAL) { - mInventoryPanel->setSelection(findItemID(mImageAssetID, false), TAKE_FOCUS_NO); + LLViewerInventoryItem* itemp = findInvItem(mImageAssetID, false); + LLUUID item_id; + if (itemp) + { + item_id = itemp->getUUID(); + } + + mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO); + + if (item_id.notNull() && itemp) + { + if (!itemp->getPermissions().allowCopyBy(gAgent.getID())) + { + mNoCopyTextureSelected = true; + } + } } + // Don't call before setSelection, setSelection will mark view as dirty + mInventoryPanel->setSelectCallback(boost::bind(&LLFloaterTexturePicker::onSelectionChange, this, _1, _2)); } childSetAction("l_add_btn", LLFloaterTexturePicker::onBtnAdd, this); @@ -654,7 +677,7 @@ void LLFloaterTexturePicker::draw() bool valid_dims = updateImageStats(); // if we're inactive, gray out "apply immediate" checkbox - mSelectBtn->setEnabled(mActive && mCanApply && valid_dims); + mSelectBtn->setEnabled(mActive && mCanApply && valid_dims && !getTentative()); mPipetteBtn->setEnabled(mActive); mPipetteBtn->setValue(LLToolMgr::getInstance()->getCurrentTool() == LLToolPipette::getInstance()); @@ -719,9 +742,9 @@ void LLFloaterTexturePicker::draw() mTentativeLabel->setVisible( false ); } - mDefaultBtn->setEnabled(mImageAssetID != mDefaultImageAssetID || mTentative); - mBlankBtn->setEnabled((mImageAssetID != mBlankImageAssetID && mBlankImageAssetID.notNull()) || mTentative); - mNoneBtn->setEnabled(mAllowNoTexture && (!mImageAssetID.isNull() || mTentative)); + mDefaultBtn->setEnabled(mImageAssetID != mDefaultImageAssetID || getTentative()); + mBlankBtn->setEnabled((mImageAssetID != mBlankImageAssetID && mBlankImageAssetID.notNull()) || getTentative()); + mNoneBtn->setEnabled(mAllowNoTexture && (!mImageAssetID.isNull() || getTentative())); LLFloater::draw(); @@ -774,7 +797,7 @@ void LLFloaterTexturePicker::draw() } // Draw Tentative Label over the image - if( mTentative && !mViewModel->isDirty() ) + if( getTentative() && !mViewModel->isDirty() ) { mTentativeLabel->setVisible( true ); drawChild(mTentativeLabel); @@ -804,12 +827,12 @@ void LLFloaterTexturePicker::draw() } } -const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, bool copyable_only, bool ignore_library) +LLViewerInventoryItem* LLFloaterTexturePicker::findInvItem(const LLUUID& asset_id, bool copyable_only, bool ignore_library) const { if (asset_id.isNull()) { // null asset id means, no material or texture assigned - return LLUUID::null; + return nullptr; } LLUUID loockup_id = asset_id; @@ -849,30 +872,41 @@ const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, bool co // search for copyable version first for (S32 i = 0; i < items.size(); i++) { - LLInventoryItem* itemp = items[i]; + LLViewerInventoryItem* itemp = items[i]; LLPermissions item_permissions = itemp->getPermissions(); if (item_permissions.allowCopyBy(gAgent.getID(), gAgent.getGroupID())) { - if(!ignore_library || !gInventory.isObjectDescendentOf(itemp->getUUID(),gInventory.getLibraryRootFolderID())) + if (!ignore_library || !gInventory.isObjectDescendentOf(itemp->getUUID(), gInventory.getLibraryRootFolderID())) { - return itemp->getUUID(); + return itemp; } } } // otherwise just return first instance, unless copyable requested if (copyable_only) { - return LLUUID::null; + return nullptr; } else { - if(!ignore_library || !gInventory.isObjectDescendentOf(items[0]->getUUID(),gInventory.getLibraryRootFolderID())) + if (!ignore_library || !gInventory.isObjectDescendentOf(items[0]->getUUID(), gInventory.getLibraryRootFolderID())) { - return items[0]->getUUID(); + return items[0]; } } } + return nullptr; +} + +const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, bool copyable_only, bool ignore_library) const +{ + LLViewerInventoryItem* itemp = findInvItem(asset_id, copyable_only, ignore_library); + if (itemp) + { + return itemp->getUUID(); + } + return LLUUID::null; } @@ -977,6 +1011,9 @@ void LLFloaterTexturePicker::onBtnSetToDefault(void* userdata) if (self->mOwner) { self->setImageID( self->getDefaultImageAssetID() ); + self->setTentative(false); + // Deselect in case inventory has a selected item with the same id + self->mInventoryPanel->getRootFolder()->clearSelection(); } self->commitIfImmediateSet(); } @@ -987,6 +1024,9 @@ void LLFloaterTexturePicker::onBtnBlank(void* userdata) LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata; self->setCanApply(true, true); self->setImageID( self->getBlankImageAssetID() ); + self->setTentative(false); + // Deselect in case inventory has a selected item with the same id + self->mInventoryPanel->getRootFolder()->clearSelection(); self->commitIfImmediateSet(); } @@ -997,21 +1037,12 @@ void LLFloaterTexturePicker::onBtnNone(void* userdata) LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata; self->setCanApply(true, true); self->setImageID( LLUUID::null ); + self->setTentative(false); + // Deselect in case inventory has a selected item with null id + self->mInventoryPanel->getRootFolder()->clearSelection(); self->commitIfImmediateSet(); } -/* -// static -void LLFloaterTexturePicker::onBtnRevert(void* userdata) -{ - LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata; - self->setImageID( self->mOriginalImageAssetID ); - // TODO: Change this to tell the owner to cancel. It needs to be - // smart enough to restore multi-texture selections. - self->mOwner->onFloaterCommit(); - self->mViewModel->resetDirty(); -}*/ - // static void LLFloaterTexturePicker::onBtnCancel(void* userdata) { @@ -1059,7 +1090,7 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem mNoCopyTextureSelected = false; if (itemp) { - if (!mTextureSelectedCallback.empty()) + if (mTextureSelectedCallback != nullptr) { mTextureSelectedCallback(itemp); } @@ -1218,6 +1249,7 @@ void LLFloaterTexturePicker::onLocalScrollCommit(LLUICtrl* ctrl, void* userdata) if (self->mSetImageAssetIDCallback) { self->mSetImageAssetIDCallback(inworld_id); + self->setTentative(false); } if (self->childGetValue("apply_immediate_check").asBoolean()) @@ -1296,6 +1328,7 @@ void LLFloaterTexturePicker::onBakeTextureSelect(LLUICtrl* ctrl, void *user_data } self->setImageID(imageID); + self->setTentative(false); self->mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here? if (!self->mPreviewSettingChanged) @@ -1316,7 +1349,7 @@ void LLFloaterTexturePicker::onBakeTextureSelect(LLUICtrl* ctrl, void *user_data void LLFloaterTexturePicker::setCanApply(bool can_preview, bool can_apply, bool inworld_image) { - mSelectBtn->setEnabled(can_apply); + mSelectBtn->setEnabled(can_apply && !getTentative()); // will be updated on draw getChildRef<LLUICtrl>("preview_disabled").setVisible(!can_preview && inworld_image); getChildRef<LLUICtrl>("apply_immediate_check").setVisible(can_preview); @@ -1490,7 +1523,13 @@ void LLFloaterTexturePicker::refreshInventoryFilter() void LLFloaterTexturePicker::setLocalTextureEnabled(bool enabled) { + mLocalTextureEnabled = enabled; mModeSelector->setEnabledByValue(1, enabled); + if (!enabled && (mModeSelector->getValue().asInteger() == 2)) + { + mModeSelector->selectByValue(0); + onModeSelect(0, this); + } } void LLFloaterTexturePicker::setBakeTextureEnabled(bool enabled) @@ -1617,6 +1656,7 @@ void LLFloaterTexturePicker::onTextureSelect( const LLTextureEntry& te ) else { setImageID(te.getID()); + setTentative(false); } mNoCopyTextureSelected = false; @@ -1643,11 +1683,11 @@ static LLDefaultChildRegistry::Register<LLTextureCtrl> r("texture_picker"); LLTextureCtrl::LLTextureCtrl(const LLTextureCtrl::Params& p) : LLUICtrl(p), - mDragCallback(NULL), - mDropCallback(NULL), - mOnCancelCallback(NULL), - mOnCloseCallback(NULL), - mOnSelectCallback(NULL), + mDragCallback(nullptr), + mDropCallback(nullptr), + mOnCancelCallback(nullptr), + mOnCloseCallback(nullptr), + mOnSelectCallback(nullptr), mBorderColor( p.border_color() ), mAllowNoTexture( p.allow_no_texture ), mAllowLocalTexture( true ), @@ -1664,10 +1704,16 @@ LLTextureCtrl::LLTextureCtrl(const LLTextureCtrl::Params& p) mDefaultImageName(p.default_image_name), mFallbackImage(p.fallback_image) { - - // Default of defaults is white image for diff tex - // - setBlankImageAssetID(IMG_WHITE); + if (mInventoryPickType == PICK_MATERIAL) + { + setBlankImageAssetID(BLANK_MATERIAL_ASSET_ID); + } + else + { + // Default of defaults is white image for diff tex + // + setBlankImageAssetID(IMG_WHITE); + } setAllowNoTexture(p.allow_no_texture); setCanApplyImmediately(p.can_apply_immediately); @@ -1830,6 +1876,17 @@ void LLTextureCtrl::clear() setImageAssetID(LLUUID::null); } +void LLTextureCtrl::setTentative(bool tentative) +{ + LLFloater* floaterp = mFloaterHandle.get(); + + if (floaterp) + { + floaterp->setTentative(tentative); + } + LLUICtrl::setTentative(tentative); +} + void LLTextureCtrl::setLabel(const std::string& label) { mLabel = label; @@ -1877,11 +1934,9 @@ void LLTextureCtrl::showPicker(bool take_focus) if (texture_floaterp) { texture_floaterp->setOnFloaterCommitCallback(boost::bind(&LLTextureCtrl::onFloaterCommit, this, _1, _2, _3, _4, _5)); - } - if (texture_floaterp) - { texture_floaterp->setSetImageAssetIDCallback(boost::bind(&LLTextureCtrl::setImageAssetID, this, _1)); + texture_floaterp->setLocalTextureEnabled(mAllowLocalTexture); texture_floaterp->setBakeTextureEnabled(mBakeTextureEnabled && mInventoryPickType != PICK_MATERIAL); } @@ -1891,12 +1946,6 @@ void LLTextureCtrl::showPicker(bool take_focus) floaterp->openFloater(); } - LLFloaterTexturePicker* picker_floater = dynamic_cast<LLFloaterTexturePicker*>(floaterp); - if (picker_floater) - { - picker_floater->setLocalTextureEnabled(mAllowLocalTexture); - } - if (take_focus) { floaterp->setFocus(true); @@ -2076,7 +2125,17 @@ void LLTextureCtrl::setOnTextureSelectedCallback(texture_selected_callback cb) } } -void LLTextureCtrl::setImageAssetName(const std::string& name) +void LLTextureCtrl::setAllowLocalTexture(bool b) +{ + mAllowLocalTexture = b; + LLFloaterTexturePicker* picker_floater = dynamic_cast<LLFloaterTexturePicker*>(mFloaterHandle.get()); + if (picker_floater) + { + picker_floater->setLocalTextureEnabled(mAllowLocalTexture); + } +} + +void LLTextureCtrl::setImageAssetName(const std::string& name) { LLPointer<LLUIImage> imagep = LLUI::getUIImage(name); if(imagep) @@ -2101,6 +2160,7 @@ void LLTextureCtrl::setImageAssetID( const LLUUID& asset_id ) if( floaterp && getEnabled() ) { floaterp->setImageID( asset_id ); + floaterp->setTentative(getTentative()); floaterp->resetDirty(); } } diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h index df5e763139..e0060474ce 100644 --- a/indra/newview/lltexturectrl.h +++ b/indra/newview/lltexturectrl.h @@ -50,8 +50,8 @@ class LLViewerFetchedTexture; class LLFetchedGLTFMaterial; // used for setting drag & drop callbacks. -typedef boost::function<bool (LLUICtrl*, LLInventoryItem*)> drag_n_drop_callback; -typedef boost::function<void (LLInventoryItem*)> texture_selected_callback; +typedef std::function<bool (LLUICtrl*, LLInventoryItem*)> drag_n_drop_callback; +typedef std::function<void (LLInventoryItem*)> texture_selected_callback; // Helper functions for UI that work with picker bool get_is_predefined_texture(LLUUID asset_id); @@ -167,6 +167,8 @@ public: // LLUICtrl interface void clear() override; + void setTentative(bool b) override; + // Takes a UUID, wraps get/setImageAssetID void setValue(const LLSD& value) override; LLSD getValue() const override; @@ -181,7 +183,7 @@ public: void setAllowNoTexture( bool b ) { mAllowNoTexture = b; } bool getAllowNoTexture() const { return mAllowNoTexture; } - void setAllowLocalTexture(bool b) { mAllowLocalTexture = b; } + void setAllowLocalTexture(bool b); bool getAllowLocalTexture() const { return mAllowLocalTexture; } const LLUUID& getImageItemID() { return mImageItemID; } @@ -297,10 +299,10 @@ private: ////////////////////////////////////////////////////////////////////////////////////////// // LLFloaterTexturePicker -typedef boost::function<void(LLTextureCtrl::ETexturePickOp op, LLPickerSource source, const LLUUID& asset_id, const LLUUID& inventory_id, const LLUUID& tracking_id)> floater_commit_callback; -typedef boost::function<void()> floater_close_callback; -typedef boost::function<void(const LLUUID& asset_id)> set_image_asset_id_callback; -typedef boost::function<void(LLPointer<LLViewerTexture> texture)> set_on_update_image_stats_callback; +typedef std::function<void(LLTextureCtrl::ETexturePickOp op, LLPickerSource source, const LLUUID& asset_id, const LLUUID& inventory_id, const LLUUID& tracking_id)> floater_commit_callback; +typedef std::function<void()> floater_close_callback; +typedef std::function<void(const LLUUID& asset_id)> set_image_asset_id_callback; +typedef std::function<void(LLPointer<LLViewerTexture> texture)> set_on_update_image_stats_callback; class LLFloaterTexturePicker : public LLFloater { @@ -338,7 +340,7 @@ public: void setImageID(const LLUUID& image_asset_id, bool set_selection = true); bool updateImageStats(); // true if within limits const LLUUID& getAssetID() { return mImageAssetID; } - const LLUUID& findItemID(const LLUUID& asset_id, bool copyable_only, bool ignore_library = false); + const LLUUID& findItemID(const LLUUID& asset_id, bool copyable_only, bool ignore_library = false) const; void setCanApplyImmediately(bool b); void setActive(bool active); @@ -395,6 +397,7 @@ protected: void refreshLocalList(); void refreshInventoryFilter(); void setImageIDFromItem(const LLInventoryItem* itemp, bool set_selection = true); + LLViewerInventoryItem* findInvItem(const LLUUID& asset_id, bool copyable_only, bool ignore_library = false) const; LLPointer<LLViewerTexture> mTexturep; LLPointer<LLFetchedGLTFMaterial> mGLTFMaterial; @@ -405,7 +408,6 @@ protected: LLUIImagePtr mFallbackImage; // What to show if currently selected texture is null. LLUUID mDefaultImageAssetID; LLUUID mBlankImageAssetID; - bool mTentative; bool mAllowNoTexture; LLUUID mSpecialCurrentImageAssetID; // Used when the asset id has no corresponding texture in the user's inventory. LLUUID mOriginalImageAssetID; @@ -456,6 +458,7 @@ private: set_on_update_image_stats_callback mOnUpdateImageStatsCallback; bool mBakeTextureEnabled; + bool mLocalTextureEnabled; static S32 sLastPickerMode; }; diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 087761cbd0..51ade60827 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -49,6 +49,7 @@ #include "llviewerregion.h" #include "llviewerstats.h" #include "llviewerstatsrecorder.h" +#include "llviewerthrottle.h" #include "llviewerassetstats.h" #include "llworld.h" #include "llsdparam.h" @@ -742,10 +743,10 @@ public: : LLTextureFetch::TFRequest(), mRegionHandle(region_handle) {} - TFReqSetRegion & operator=(const TFReqSetRegion &); // Not defined + TFReqSetRegion(const TFReqSetRegion&) = delete; + TFReqSetRegion& operator=(const TFReqSetRegion&) = delete; - virtual ~TFReqSetRegion() - {} + virtual ~TFReqSetRegion() = default; virtual bool doWork(LLTextureFetch * fetcher); @@ -792,7 +793,9 @@ public: const LLUUID & session_id, const LLUUID & agent_id, LLSD& stats_sd); - TFReqSendMetrics & operator=(const TFReqSendMetrics &); // Not defined + + TFReqSendMetrics(const TFReqSendMetrics&) = delete; + TFReqSendMetrics& operator=(const TFReqSendMetrics&) = delete; virtual ~TFReqSendMetrics(); @@ -1294,10 +1297,19 @@ bool LLTextureFetchWorker::doWork(S32 param) else { mCanUseCapability = false; - mRegionRetryAttempt++; - mRegionRetryTimer.setTimerExpirySec(CAP_MISSING_EXPIRATION_DELAY); - // ex: waiting for caps - LL_INFOS_ONCE(LOG_TXT) << "Texture not available via HTTP: empty URL." << LL_ENDL; + if (gDisconnected) + { + // We lost connection or are shutting down. + mCanUseHTTP = false; + return true; // abort + } + else + { + // Ex: waiting for caps + mRegionRetryAttempt++; + mRegionRetryTimer.setTimerExpirySec(CAP_MISSING_EXPIRATION_DELAY); + LL_INFOS_ONCE(LOG_TXT) << "Texture not available via HTTP: empty URL." << LL_ENDL; + } } } else @@ -1693,10 +1705,10 @@ bool LLTextureFetchWorker::doWork(S32 param) mHttpReplyOffset = 0; mLoadedDiscard = mRequestedDiscard; - if (mLoadedDiscard < 0) + if (mLoadedDiscard < 0 || (mLoadedDiscard > MAX_DISCARD_LEVEL && mFormattedImage->getCodec() == IMG_CODEC_J2C)) { LL_WARNS(LOG_TXT) << mID << " mLoadedDiscard is " << mLoadedDiscard - << ", should be >=0" << LL_ENDL; + << ", should be >=0 and <=" << MAX_DISCARD_LEVEL << LL_ENDL; } setState(DECODE_IMAGE); if (mWriteToCacheState != NOT_WRITE) @@ -1758,14 +1770,27 @@ bool LLTextureFetchWorker::doWork(S32 param) LL_DEBUGS(LOG_TXT) << mID << " DECODE_IMAGE abort: mLoadedDiscard < 0" << LL_ENDL; return true; } + + llassert_always(mFormattedImage.notNull()); + S32 discard = mHaveAllData && mFormattedImage->getCodec() != IMG_CODEC_J2C ? 0 : mLoadedDiscard; + if (discard > MAX_DISCARD_LEVEL) // only warn for j2c + { + // We encode j2c with fixed amount of discard levels, + // Trying to decode beyound that will fail. + LL_WARNS(LOG_TXT) << "Decode entered with invalid discard. ID = " << mID << LL_ENDL; + + //abort, don't decode + setState(DONE); + LL_DEBUGS(LOG_TXT) << mID << " DECODE_IMAGE abort: mLoadedDiscard > MAX_DISCARD_LEVEL" << LL_ENDL; + return true; + } + mDecodeTimer.reset(); mRawImage = NULL; mAuxImage = NULL; - llassert_always(mFormattedImage.notNull()); // if we have the entire image data (and the image is not J2C), decode the full res image // DO NOT decode a higher res j2c than was requested. This is a waste of time and memory. - S32 discard = mHaveAllData && mFormattedImage->getCodec() != IMG_CODEC_J2C ? 0 : mLoadedDiscard; mDecoded = false; setState(DECODE_IMAGE_UPDATE); LL_DEBUGS(LOG_TXT) << mID << ": Decoding. Bytes: " << mFormattedImage->getDataSize() << " Discard: " << discard @@ -2434,18 +2459,18 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, bool threaded, bool qa_mod mOriginFetchSource(LLTextureFetch::FROM_ALL), mTextureInfoMainThread(false) { - mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS"); + mMaxBandwidth = LLViewerThrottle::getMaxBandwidthKbps(); mTextureInfo.setLogging(true); LLAppCoreHttp & app_core_http(LLAppViewer::instance()->getAppCoreHttp()); mHttpRequest = new LLCore::HttpRequest; - mHttpOptions = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); - mHttpOptionsWithHeaders = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); + mHttpOptions = std::make_shared<LLCore::HttpOptions>(); + mHttpOptionsWithHeaders = std::make_shared<LLCore::HttpOptions>(); mHttpOptionsWithHeaders->setWantHeaders(true); - mHttpHeaders = LLCore::HttpHeaders::ptr_t(new LLCore::HttpHeaders); + mHttpHeaders = std::make_shared<LLCore::HttpHeaders>(); mHttpHeaders->append(HTTP_OUT_HEADER_ACCEPT, HTTP_CONTENT_IMAGE_X_J2C); mHttpPolicyClass = app_core_http.getPolicy(LLAppCoreHttp::AP_TEXTURE); - mHttpMetricsHeaders = LLCore::HttpHeaders::ptr_t(new LLCore::HttpHeaders); + mHttpMetricsHeaders = std::make_shared<LLCore::HttpHeaders>(); mHttpMetricsHeaders->append(HTTP_OUT_HEADER_CONTENT_TYPE, HTTP_CONTENT_LLSD_XML); mHttpMetricsPolicyClass = app_core_http.getPolicy(LLAppCoreHttp::AP_REPORTING); mHttpHighWater = HTTP_NONPIPE_REQUESTS_HIGH_WATER; @@ -2484,7 +2509,7 @@ LLTextureFetch::~LLTextureFetch() } S32 LLTextureFetch::createRequest(FTType f_type, const std::string& url, const LLUUID& id, const LLHost& host, F32 priority, - S32 w, S32 h, S32 c, S32 desired_discard, bool needs_aux, bool can_use_http) + S32 w, S32 h, S32 c, S32 desired_discard, bool needs_aux, bool can_use_http) { LL_PROFILE_ZONE_SCOPED; if (mDebugPause) @@ -2496,13 +2521,13 @@ S32 LLTextureFetch::createRequest(FTType f_type, const std::string& url, const L { LL_DEBUGS("Avatar") << " requesting " << id << " " << w << "x" << h << " discard " << desired_discard << " type " << f_type << LL_ENDL; } - LLTextureFetchWorker* worker = getWorker(id) ; + LLTextureFetchWorker* worker = getWorker(id); if (worker) { if (worker->mHost != host) { LL_WARNS(LOG_TXT) << "LLTextureFetch::createRequest " << id << " called with multiple hosts: " - << host << " != " << worker->mHost << LL_ENDL; + << host << " != " << worker->mHost << LL_ENDL; removeRequest(worker, true); worker = NULL; return CREATE_REQUEST_ERROR_MHOSTS; @@ -2538,7 +2563,7 @@ S32 LLTextureFetch::createRequest(FTType f_type, const std::string& url, const L // we really do get it.) desired_size = MAX_IMAGE_DATA_SIZE; } - else if (w*h*c > 0) + else if (w * h * c > 0) { // If the requester knows the dimensions of the image, // this will calculate how much data we need without having to parse the header @@ -2596,14 +2621,15 @@ S32 LLTextureFetch::createRequest(FTType f_type, const std::string& url, const L worker->lockWorkMutex(); // +Mw worker->mActiveCount++; worker->mNeedsAux = needs_aux; - worker->setCanUseHTTP(can_use_http) ; + worker->setCanUseHTTP(can_use_http); worker->unlockWorkMutex(); // -Mw } LL_DEBUGS(LOG_TXT) << "REQUESTED: " << id << " f_type " << fttype_to_string(f_type) - << " Discard: " << desired_discard << " size " << desired_size << LL_ENDL; + << " Discard: " << desired_discard << " size " << desired_size << LL_ENDL; return desired_discard; } + // Threads: T* // // protected @@ -2952,11 +2978,10 @@ void LLTextureFetch::commonUpdate() size_t LLTextureFetch::update(F32 max_time_ms) { LL_PROFILE_ZONE_SCOPED; - static LLCachedControl<F32> band_width(gSavedSettings,"ThrottleBandwidthKBPS", 3000.0); { mNetworkQueueMutex.lock(); // +Mfnq - mMaxBandwidth = band_width(); + mMaxBandwidth = LLViewerThrottle::getMaxBandwidthKbps(); add(LLStatViewer::TEXTURE_NETWORK_DATA_RECEIVED, mHTTPTextureBits); mHTTPTextureBits = (U32Bits)0; @@ -3549,7 +3574,7 @@ TFReqSendMetrics::TFReqSendMetrics(const std::string & caps_url, mSessionID(session_id), mAgentID(agent_id), mStatsSD(stats_sd), - mHandler(new AssetReportHandler) + mHandler(std::make_shared<AssetReportHandler>()) {} diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h index 8ab90896dc..851d6c11a0 100644 --- a/indra/newview/lltexturefetch.h +++ b/indra/newview/lltexturefetch.h @@ -85,8 +85,9 @@ public: }; // Threads: T* (but Tmain mostly) + // returns discard on success, fail code otherwise S32 createRequest(FTType f_type, const std::string& url, const LLUUID& id, const LLHost& host, F32 priority, - S32 w, S32 h, S32 c, S32 discard, bool needs_aux, bool can_use_http); + S32 w, S32 h, S32 c, S32 discard, bool needs_aux, bool can_use_http); // Requests that a fetch operation be deleted from the queue. // If @cancel is true, also stops any I/O operations pending. diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index bda53f66eb..8cbede8303 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -49,6 +49,7 @@ #include "llviewerobjectlist.h" #include "llviewertexture.h" #include "llviewertexturelist.h" +#include "llviewerthrottle.h" #include "llviewerwindow.h" #include "llwindow.h" #include "llvovolume.h" @@ -559,10 +560,12 @@ void LLGLTexMemBar::draw() gGL.color4f(0.f, 0.f, 0.f, 0.25f); gl_rect_2d(-10, getRect().getHeight() + line_height*2 + 1, getRect().getWidth()+2, getRect().getHeight()+2); - text = llformat("Est. Free: %d MB Sys Free: %d MB FBO: %d MB Bias: %.2f Cache: %.1f/%.1f MB", + text = llformat("Est. Free: %d MB Sys Free: %d MB FBO: %d MB Probe#: %d Probe Mem: %d MB Bias: %.2f Cache: %.1f/%.1f MB", (S32)LLViewerTexture::sFreeVRAMMegabytes, LLMemory::getAvailableMemKB()/1024, LLRenderTarget::sBytesAllocated/(1024*1024), + gPipeline.mReflectionMapManager.probeCount(), + gPipeline.mReflectionMapManager.probeMemory(), discard_bias, cache_usage, cache_max_usage); @@ -631,7 +634,7 @@ void LLGLTexMemBar::draw() LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, &x_right); F32Kilobits bandwidth(LLAppViewer::getTextureFetch()->getTextureBandwidth()); - F32Kilobits max_bandwidth(gSavedSettings.getF32("ThrottleBandwidthKBPS")); + F32Kilobits max_bandwidth(LLViewerThrottle::getMaxBandwidthKbps()); color = bandwidth > max_bandwidth ? LLColor4::red : bandwidth > max_bandwidth*.75f ? LLColor4::yellow : text_color; color[VALPHA] = text_color[VALPHA]; text = llformat("BW:%.0f/%.0f",bandwidth.value(), max_bandwidth.value()); @@ -642,7 +645,7 @@ void LLGLTexMemBar::draw() text = llformat("Mesh: Reqs(Tot/Htp/Big): %u/%u/%u Rtr/Err: %u/%u Cread/Cwrite: %u/%u Low/At/High: %d/%d/%d", LLMeshRepository::sMeshRequestCount, LLMeshRepository::sHTTPRequestCount, LLMeshRepository::sHTTPLargeRequestCount, LLMeshRepository::sHTTPRetryCount, LLMeshRepository::sHTTPErrorCount, - LLMeshRepository::sCacheReads, LLMeshRepository::sCacheWrites, + (U32)LLMeshRepository::sCacheReads, (U32)LLMeshRepository::sCacheWrites, LLMeshRepoThread::sRequestLowWater, LLMeshRepoThread::sRequestWaterLevel, LLMeshRepoThread::sRequestHighWater); LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*2, text_color, LLFontGL::LEFT, LLFontGL::TOP); diff --git a/indra/newview/llthumbnailctrl.cpp b/indra/newview/llthumbnailctrl.cpp index ae21d3e733..b077262f06 100644 --- a/indra/newview/llthumbnailctrl.cpp +++ b/indra/newview/llthumbnailctrl.cpp @@ -111,7 +111,9 @@ void LLThumbnailCtrl::draw() gl_draw_scaled_image( draw_rect.mLeft, draw_rect.mBottom, draw_rect.getWidth(), draw_rect.getHeight(), mTexturep, UI_VERTEX_COLOR % alpha); - mTexturep->setKnownDrawSize(draw_rect.getWidth(), draw_rect.getHeight()); + // Thumbnails are usually 256x256 or smaller, either report that or + // some high value to get image with higher priority + mTexturep->setKnownDrawSize(MAX_IMAGE_SIZE, MAX_IMAGE_SIZE); } else if( mImagep.notNull() ) { @@ -238,12 +240,8 @@ void LLThumbnailCtrl::initImage() { // Should it support baked textures? mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_THUMBNAIL); - mTexturep->forceToSaveRawImage(0); - - S32 desired_draw_width = MAX_IMAGE_SIZE; - S32 desired_draw_height = MAX_IMAGE_SIZE; - mTexturep->setKnownDrawSize(desired_draw_width, desired_draw_height); + mTexturep->setKnownDrawSize(MAX_IMAGE_SIZE, MAX_IMAGE_SIZE); } } else if (tvalue.isString()) diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index 84503e66a5..3c939a88e5 100644 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -117,7 +117,7 @@ LLToast::LLToast(const LLToast::Params& p) mIsFading(false), mIsHovered(false) { - mTimer.reset(new LLToastLifeTimer(this, p.lifetime_secs)); + mTimer = std::make_unique<LLToastLifeTimer>(this, p.lifetime_secs); buildFromFile("panel_toast.xml"); @@ -140,7 +140,7 @@ LLToast::LLToast(const LLToast::Params& p) } // init callbacks if present - if(!p.on_delete_toast().empty()) + if (p.on_delete_toast() != nullptr) { mOnDeleteToastSignal.connect(p.on_delete_toast()); } @@ -421,7 +421,7 @@ void LLToast::setVisible(bool show) if(mHideBtn) mHideBtn->setVisible(show); } - LLFloater::setVisible(show); + LLModalDialog::setVisible(show); if (mPanel && !mPanel->isDead() && mWrapperPanel @@ -436,6 +436,14 @@ void LLToast::setVisible(bool show) void LLToast::updateHoveredState() { + if (!mWrapperPanel) + { + // Shouldn't be happening. + // mWrapperPanel should have been inited in the constructor + // This needs to be figured out and fixed + llassert(false); + return; + } S32 x, y; LLUI::getInstance()->getMousePositionScreen(&x, &y); diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h index cf116bfadf..a73f7820ba 100644 --- a/indra/newview/lltoast.h +++ b/indra/newview/lltoast.h @@ -75,7 +75,7 @@ class LLToast : public LLModalDialog, public LLInstanceTracker<LLToast> friend class LLToastLifeTimer; public: - typedef boost::function<void (LLToast* toast)> toast_callback_t; + typedef std::function<void (LLToast* toast)> toast_callback_t; typedef boost::signals2::signal<void (LLToast* toast)> toast_signal_t; typedef boost::signals2::signal<void (LLToast* toast, bool mouse_enter)> toast_hover_check_signal_t; diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp index 3c3440d41a..95653dc19b 100644 --- a/indra/newview/lltoastgroupnotifypanel.cpp +++ b/indra/newview/lltoastgroupnotifypanel.cpp @@ -87,10 +87,21 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(const LLNotificationPtr& notifi std::string timeStr = "[" + LLTrans::getString("TimeWeek") + "], [" + LLTrans::getString("TimeMonth") + "]/[" + LLTrans::getString("TimeDay") + "]/[" - + LLTrans::getString("TimeYear") + "] [" - + LLTrans::getString("TimeHour") + "]:[" - + LLTrans::getString("TimeMin") + "] [" - + LLTrans::getString("TimeTimezone") + "]"; + + LLTrans::getString("TimeYear") + "] ["; + static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); + if (use_24h) + { + timeStr += LLTrans::getString("TimeHour") + "]:[" + + LLTrans::getString("TimeMin") + "] [" + + LLTrans::getString("TimeTimezone") + "]"; + } + else + { + timeStr += LLTrans::getString("TimeHour12") + "]:[" + + LLTrans::getString("TimeMin") + "] [" + + LLTrans::getString("TimeAMPM") + "] [" + + LLTrans::getString("TimeTimezone") + "]"; + } const LLDate timeStamp = notification->getDate(); LLDate notice_date = timeStamp.notNull() ? timeStamp : payload["received_time"].asDate(); diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp index 0063e0b7fd..c1ec5fa183 100644 --- a/indra/newview/lltoolbarview.cpp +++ b/indra/newview/lltoolbarview.cpp @@ -110,7 +110,7 @@ bool LLToolBarView::postBuild() { mToolbars[i]->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3)); mToolbars[i]->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4)); - mToolbars[i]->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4)); + mToolbars[i]->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4,_5)); mToolbars[i]->setButtonAddCallback(boost::bind(LLToolBarView::onToolBarButtonAdded,_1)); mToolbars[i]->setButtonRemoveCallback(boost::bind(LLToolBarView::onToolBarButtonRemoved,_1)); } @@ -624,8 +624,14 @@ bool LLToolBarView::handleDragTool( S32 x, S32 y, const LLUUID& uuid, LLAssetTyp return false; } -bool LLToolBarView::handleDropTool( void* cargo_data, S32 x, S32 y, LLToolBar* toolbar) +bool LLToolBarView::handleDropTool( void* cargo_data, EDragAndDropType cargo_type, S32 x, S32 y, LLToolBar* toolbar) { + if (cargo_type == DAD_PERSON) + { + // DAD_PERSON means that cargo_data contains an uuid, not an LLInventoryObject + resetDragTool(NULL); + return false; + } bool handled = false; LLInventoryObject* inv_item = static_cast<LLInventoryObject*>(cargo_data); @@ -647,15 +653,18 @@ bool LLToolBarView::handleDropTool( void* cargo_data, S32 x, S32 y, LLToolBar* t if (old_toolbar_loc != LLToolBarEnums::TOOLBAR_NONE) { llassert(gToolBarView->mDragToolbarButton); - old_toolbar = gToolBarView->mDragToolbarButton->getParentByType<LLToolBar>(); - if (old_toolbar->isReadOnly() && toolbar->isReadOnly()) - { - // do nothing - } - else + if (gToolBarView->mDragToolbarButton) { - int old_rank = LLToolBar::RANK_NONE; - gToolBarView->removeCommand(command_id, old_rank); + old_toolbar = gToolBarView->mDragToolbarButton->getParentByType<LLToolBar>(); + if (old_toolbar->isReadOnly() && toolbar->isReadOnly()) + { + // do nothing + } + else + { + int old_rank = LLToolBar::RANK_NONE; + gToolBarView->removeCommand(command_id, old_rank); + } } } diff --git a/indra/newview/lltoolbarview.h b/indra/newview/lltoolbarview.h index 7cecd81052..7212f099b7 100644 --- a/indra/newview/lltoolbarview.h +++ b/indra/newview/lltoolbarview.h @@ -92,7 +92,7 @@ public: static void startDragTool(S32 x, S32 y, LLToolBarButton* toolbarButton); static bool handleDragTool(S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type); - static bool handleDropTool(void* cargo_data, S32 x, S32 y, LLToolBar* toolbar); + static bool handleDropTool(void* cargo_data, EDragAndDropType cargo_type, S32 x, S32 y, LLToolBar* toolbar); static void resetDragTool(LLToolBarButton* toolbarButton); LLInventoryObject* getDragItem(); LLView* getBottomToolbar() { return mBottomToolbarPanel; } diff --git a/indra/newview/lltoolbrush.cpp b/indra/newview/lltoolbrush.cpp index 2fe81df4fb..cf7b123fa7 100644 --- a/indra/newview/lltoolbrush.cpp +++ b/indra/newview/lltoolbrush.cpp @@ -447,7 +447,10 @@ void LLToolBrushLand::handleSelect() { gEditMenuHandler = this; - gFloaterTools->setStatusText("modifyland"); + if (gFloaterTools) + { + gFloaterTools->setStatusText("modifyland"); + } // if (!mBrushSelected) { mBrushSelected = true; diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 4efa289141..f78ff2226c 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -29,6 +29,8 @@ // library headers #include "llnotificationsutil.h" +#include <vector> +#include <tuple> // project headers #include "llagent.h" #include "llagentcamera.h" @@ -574,12 +576,13 @@ bool LLToolDragAndDrop::handleKey(KEY key, MASK mask) bool LLToolDragAndDrop::handleToolTip(S32 x, S32 y, MASK mask) { + const F32 DRAG_N_DROP_TOOLTIP_DELAY = 0.1f; if (!mToolTipMsg.empty()) { LLToolTipMgr::instance().unblockToolTips(); LLToolTipMgr::instance().show(LLToolTip::Params() .message(mToolTipMsg) - .delay_time(gSavedSettings.getF32( "DragAndDropToolTipDelay" ))); + .delay_time(DRAG_N_DROP_TOOLTIP_DELAY)); return true; } return false; @@ -1124,28 +1127,33 @@ void set_texture_to_material(LLViewerObject* hit_obj, case LLGLTFMaterial::GLTF_TEXTURE_INFO_BASE_COLOR: default: { - material->setBaseColorId(asset_id); + material->setBaseColorId(asset_id, true); } break; case LLGLTFMaterial::GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS: { - material->setOcclusionRoughnessMetallicId(asset_id); + material->setOcclusionRoughnessMetallicId(asset_id, true); } break; case LLGLTFMaterial::GLTF_TEXTURE_INFO_EMISSIVE: { - material->setEmissiveId(asset_id); + material->setEmissiveId(asset_id, true); } break; case LLGLTFMaterial::GLTF_TEXTURE_INFO_NORMAL: { - material->setNormalId(asset_id); + material->setNormalId(asset_id, true); } break; } + // Update viewer side, needed for updating mSavedGLTFOverrideMaterials. + // Also for parity, we are immediately setting textures and materials, + // so we should immediate set overrides to. + hit_obj->setTEGLTFMaterialOverride(hit_face, material); + // update server LLGLTFMaterialList::queueModify(hit_obj, hit_face, material); } @@ -1253,6 +1261,7 @@ void LLToolDragAndDrop::dropMaterial(LLViewerObject* hit_obj, // If user dropped a material onto face it implies // applying texture now without cancel, save to selection if (nodep + && gFloaterTools && gFloaterTools->getVisible() && nodep->mSavedGLTFMaterialIds.size() > hit_face) { @@ -1290,7 +1299,89 @@ void LLToolDragAndDrop::dropMaterialOneFace(LLViewerObject* hit_obj, asset_id = BLANK_MATERIAL_ASSET_ID; } - hit_obj->setRenderMaterialID(hit_face, asset_id); + // Preserve existing texture transforms when switching to PBR material + LLTextureEntry* tep = hit_obj->getTE(hit_face); + F32 existing_scale_s = LLGLTFMaterial::TextureTransform().mScale.mV[0]; + F32 existing_scale_t = LLGLTFMaterial::TextureTransform().mScale.mV[1]; + F32 existing_offset_s = LLGLTFMaterial::TextureTransform().mOffset.mV[0]; + F32 existing_offset_t = LLGLTFMaterial::TextureTransform().mOffset.mV[1]; + F32 existing_rotation = LLGLTFMaterial::TextureTransform().mRotation; + bool should_preserve_transforms = false; + LLGLTFMaterial* preserved_override = nullptr; + + if (tep && asset_id.notNull()) + { + // Only preserve transforms from existing GLTF material override + // Do not fall back to texture entry transforms when switching between PBR materials + LLGLTFMaterial* existing_override = tep->getGLTFMaterialOverride(); + if (existing_override) + { + // Check if existing override has non-default transforms + const LLGLTFMaterial::TextureTransform& existing_transform = existing_override->mTextureTransform[0]; + const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform(); + + if (existing_transform.mScale != default_transform.mScale || + existing_transform.mOffset != default_transform.mOffset || + existing_transform.mRotation != default_transform.mRotation) + { + // Preserve non-default transforms from current PBR material + preserved_override = new LLGLTFMaterial(); + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) + { + preserved_override->mTextureTransform[i].mScale = existing_transform.mScale; + preserved_override->mTextureTransform[i].mOffset = existing_transform.mOffset; + preserved_override->mTextureTransform[i].mRotation = existing_transform.mRotation; + } + should_preserve_transforms = true; + } + // If existing override has default transforms, don't preserve anything + } + else + { + // No existing PBR material override - check texture entry transforms + // This handles the case of switching from Blinn-Phong to PBR material + F32 existing_scale_s, existing_scale_t, existing_offset_s, existing_offset_t, existing_rotation; + tep->getScale(&existing_scale_s, &existing_scale_t); + tep->getOffset(&existing_offset_s, &existing_offset_t); + existing_rotation = tep->getRotation(); + + const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform(); + if (existing_scale_s != default_transform.mScale.mV[0] || existing_scale_t != default_transform.mScale.mV[1] || + existing_offset_s != default_transform.mOffset.mV[0] || existing_offset_t != default_transform.mOffset.mV[1] || + existing_rotation != default_transform.mRotation) + { + // Preserve non-default transforms from texture entry + preserved_override = new LLGLTFMaterial(); + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) + { + LLVector2 pbr_scale, pbr_offset; + F32 pbr_rotation; + LLGLTFMaterial::convertTextureTransformToPBR( + existing_scale_s, existing_scale_t, + existing_offset_s, existing_offset_t, + existing_rotation, + pbr_scale, pbr_offset, pbr_rotation); + preserved_override->mTextureTransform[i].mScale = pbr_scale; + preserved_override->mTextureTransform[i].mOffset = pbr_offset; + preserved_override->mTextureTransform[i].mRotation = pbr_rotation; + } + should_preserve_transforms = true; + } + } + } + + if (should_preserve_transforms && preserved_override) + { + // Apply material with preserved transforms + LLGLTFMaterialList::queueApply(hit_obj, hit_face, asset_id, preserved_override); + // Update local state + hit_obj->setRenderMaterialID(hit_face, asset_id, false, true); + tep->setGLTFMaterialOverride(preserved_override); + } + else + { + hit_obj->setRenderMaterialID(hit_face, asset_id); + } dialog_refresh_all(); @@ -1326,7 +1417,134 @@ void LLToolDragAndDrop::dropMaterialAllFaces(LLViewerObject* hit_obj, asset_id = BLANK_MATERIAL_ASSET_ID; } - hit_obj->setRenderMaterialIDs(asset_id); + // Preserve existing texture transforms when switching to PBR material for all faces + std::vector<std::pair<bool, LLGLTFMaterial*>> preserved_transforms(hit_obj->getNumTEs()); + + if (asset_id.notNull()) + { + for (S32 te = 0; te < hit_obj->getNumTEs(); ++te) + { + LLTextureEntry* tep = hit_obj->getTE(te); + if (!tep) continue; + + bool should_preserve = false; + LLGLTFMaterial* preserved_override = nullptr; + + // Only preserve transforms from existing GLTF material override + // Do not fall back to texture entry transforms when switching between PBR materials + LLGLTFMaterial* existing_override = tep->getGLTFMaterialOverride(); + if (existing_override) + { + // Check if existing override has non-default transforms + const LLGLTFMaterial::TextureTransform& existing_transform = existing_override->mTextureTransform[0]; + const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform(); + + if (existing_transform.mScale != default_transform.mScale || + existing_transform.mOffset != default_transform.mOffset || + existing_transform.mRotation != default_transform.mRotation) + { + // Preserve non-default transforms from current PBR material + preserved_override = new LLGLTFMaterial(); + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) + { + preserved_override->mTextureTransform[i].mScale = existing_transform.mScale; + preserved_override->mTextureTransform[i].mOffset = existing_transform.mOffset; + preserved_override->mTextureTransform[i].mRotation = existing_transform.mRotation; + } + should_preserve = true; + } + else + { + // Existing override has default transforms, fall back to texture entry + F32 existing_scale_s, existing_scale_t, existing_offset_s, existing_offset_t, existing_rotation; + tep->getScale(&existing_scale_s, &existing_scale_t); + tep->getOffset(&existing_offset_s, &existing_offset_t); + existing_rotation = tep->getRotation(); + + if (existing_scale_s != default_transform.mScale.mV[0] || existing_scale_t != default_transform.mScale.mV[1] || + existing_offset_s != default_transform.mOffset.mV[0] || existing_offset_t != default_transform.mOffset.mV[1] || + existing_rotation != default_transform.mRotation) + { + // Preserve non-default transforms from texture entry + preserved_override = new LLGLTFMaterial(); + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) + { + LLVector2 pbr_scale, pbr_offset; + F32 pbr_rotation; + LLGLTFMaterial::convertTextureTransformToPBR( + existing_scale_s, existing_scale_t, + existing_offset_s, existing_offset_t, + existing_rotation, + pbr_scale, pbr_offset, pbr_rotation); + preserved_override->mTextureTransform[i].mScale = pbr_scale; + preserved_override->mTextureTransform[i].mOffset = pbr_offset; + preserved_override->mTextureTransform[i].mRotation = pbr_rotation; + } + should_preserve = true; + } + } + } + else + { + // No existing PBR material override - check texture entry transforms + // This handles the case of switching from Blinn-Phong to PBR material + F32 existing_scale_s, existing_scale_t, existing_offset_s, existing_offset_t, existing_rotation; + tep->getScale(&existing_scale_s, &existing_scale_t); + tep->getOffset(&existing_offset_s, &existing_offset_t); + existing_rotation = tep->getRotation(); + + const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform(); + if (existing_scale_s != default_transform.mScale.mV[0] || existing_scale_t != default_transform.mScale.mV[1] || + existing_offset_s != default_transform.mOffset.mV[0] || existing_offset_t != default_transform.mOffset.mV[1] || + existing_rotation != default_transform.mRotation) + { + // Preserve non-default transforms from texture entry + preserved_override = new LLGLTFMaterial(); + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) + { + LLVector2 pbr_scale, pbr_offset; + F32 pbr_rotation; + LLGLTFMaterial::convertTextureTransformToPBR( + existing_scale_s, existing_scale_t, + existing_offset_s, existing_offset_t, + existing_rotation, + pbr_scale, pbr_offset, pbr_rotation); + preserved_override->mTextureTransform[i].mScale = pbr_scale; + preserved_override->mTextureTransform[i].mOffset = pbr_offset; + preserved_override->mTextureTransform[i].mRotation = pbr_rotation; + } + should_preserve = true; + } + } + + preserved_transforms[te] = std::make_pair(should_preserve, preserved_override); + } + } + + // Apply materials with preserved transforms + if (asset_id.notNull()) + { + for (S32 te = 0; te < hit_obj->getNumTEs(); ++te) + { + LLGLTFMaterial* preserved_override = preserved_transforms[te].second; + if (preserved_override) + { + // Apply material with preserved transforms + LLGLTFMaterialList::queueApply(hit_obj, te, asset_id, preserved_override); + // Update local state + hit_obj->setRenderMaterialID(te, asset_id, false, true); + hit_obj->getTE(te)->setGLTFMaterialOverride(preserved_override); + } + else + { + hit_obj->setRenderMaterialID(te, asset_id); + } + } + } + else + { + hit_obj->setRenderMaterialIDs(asset_id); + } dialog_refresh_all(); // send the update to the simulator hit_obj->sendTEUpdate(); @@ -1429,10 +1647,10 @@ void LLToolDragAndDrop::dropTexture(LLViewerObject* hit_obj, // If user dropped a texture onto face it implies // applying texture now without cancel, save to selection - LLPanelFace* panel_face = gFloaterTools->getPanelFace(); + LLPanelFace* panel_face = gFloaterTools ? gFloaterTools->getPanelFace() : nullptr; if (nodep - && gFloaterTools->getVisible() && panel_face + && gFloaterTools->getVisible() && panel_face->getTextureDropChannel() == 0 /*texture*/ && nodep->mSavedTextures.size() > hit_face) { @@ -1488,8 +1706,8 @@ void LLToolDragAndDrop::dropTextureOneFace(LLViewerObject* hit_obj, if (allow_adding_to_override) { LLGLTFMaterial::TextureInfo drop_channel = LLGLTFMaterial::GLTF_TEXTURE_INFO_BASE_COLOR; - LLPanelFace* panel_face = gFloaterTools->getPanelFace(); - if (gFloaterTools->getVisible() && panel_face) + LLPanelFace* panel_face = gFloaterTools ? gFloaterTools->getPanelFace() : nullptr; + if (panel_face && gFloaterTools->getVisible()) { drop_channel = panel_face->getPBRDropChannel(); } @@ -1514,9 +1732,9 @@ void LLToolDragAndDrop::dropTextureOneFace(LLViewerObject* hit_obj, LLTextureEntry* tep = hit_obj->getTE(hit_face); - LLPanelFace* panel_face = gFloaterTools->getPanelFace(); + LLPanelFace* panel_face = gFloaterTools ? gFloaterTools->getPanelFace() : nullptr; - if (gFloaterTools->getVisible() && panel_face) + if (panel_face && gFloaterTools->getVisible()) { tex_channel = (tex_channel > -1) ? tex_channel : panel_face->getTextureDropChannel(); switch (tex_channel) @@ -1611,7 +1829,10 @@ void LLToolDragAndDrop::dropScript(LLViewerObject* hit_obj, } } hit_obj->saveScript(new_script, active, true); - gFloaterTools->dirty(); + if (gFloaterTools) + { + gFloaterTools->dirty(); + } // VEFFECT: SetScript LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, true); @@ -1844,7 +2065,10 @@ void LLToolDragAndDrop::dropInventory(LLViewerObject* hit_obj, effectp->setTargetObject(hit_obj); effectp->setDuration(LL_HUD_DUR_SHORT); effectp->setColor(LLColor4U(gAgent.getEffectColor())); - gFloaterTools->dirty(); + if (gFloaterTools) + { + gFloaterTools->dirty(); + } } // accessor that looks at permissions, copyability, and names of @@ -2148,7 +2372,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv( { if(mSource == SOURCE_LIBRARY) { - LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(rez_attachment_cb, _1, (LLViewerJointAttachment*)0)); + LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(rez_attachment_cb, _1, (LLViewerJointAttachment*)0, false)); copy_inventory_item( gAgent.getID(), item->getPermissions().getOwner(), @@ -2159,7 +2383,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv( } else { - rez_attachment(item, 0); + rez_attachment(item, 0, false); } } return ACCEPT_YES_SINGLE; @@ -2343,6 +2567,47 @@ EAcceptance LLToolDragAndDrop::dad3dRezScript( return rv; } + +bool is_water_exclusion_face(LLViewerObject* obj, S32 face) +{ + LLViewerTexture* image = obj->getTEImage(face); + if (!image) + return false; + + // magic texture and alpha blending + bool exclude_water = (image->getID() == IMG_ALPHA_GRAD) && obj->isImageAlphaBlended(face); + + // transparency + exclude_water &= (obj->getTE(face)->getColor().mV[VALPHA] == 1); + + //absence of normal and specular textures + image = obj->getTENormalMap(face); + if (image && image != LLViewerFetchedTexture::sDefaultImagep) + exclude_water &= image->getID().isNull(); + image = obj->getTESpecularMap(face); + if (image && image != LLViewerFetchedTexture::sDefaultImagep) + exclude_water &= image->getID().isNull(); + + return exclude_water; +} + +bool is_water_exclusion_surface(LLViewerObject* obj, S32 face, bool all_faces) +{ + if (all_faces) + { + bool exclude_water = false; + for (S32 it_face = 0; it_face < obj->getNumTEs(); it_face++) + { + exclude_water |= is_water_exclusion_face(obj, it_face); + } + return exclude_water; + } + else + { + return is_water_exclusion_face(obj, face); + } +} + EAcceptance LLToolDragAndDrop::dad3dApplyToObject( LLViewerObject* obj, S32 face, MASK mask, bool drop, EDragAndDropType cargo_type) { @@ -2433,7 +2698,13 @@ EAcceptance LLToolDragAndDrop::dad3dApplyToObject( else if (cargo_type == DAD_MATERIAL) { bool all_faces = mask & MASK_SHIFT; - if (item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID())) + + if (is_water_exclusion_surface(obj, face, all_faces)) + { + LLNotificationsUtil::add("WaterExclusionNoMaterial"); + return ACCEPT_NO; + } + else if (item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID())) { dropMaterial(obj, face, item, mSource, mSourceID, all_faces); } diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 8cdc2e94f4..0a69be528f 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -72,6 +72,7 @@ #include "llweb.h" #include "pipeline.h" // setHighlightObject #include "lluiusage.h" +#include "llcallingcard.h" extern bool gDebugClicks; @@ -1501,6 +1502,142 @@ static void handle_click_action_play() } } +bool LLToolPie::shouldAllowFirstMediaInteraction(const LLPickInfo& pick, bool moap_flag) +{ + // Early failure cases + if(!pick.getObject()) + { + LL_WARNS() << "pick.getObject() is NULL" << LL_ENDL; + return false; + } + + static LLCachedControl<S32> FirstClickPref(gSavedSettings, "MediaFirstClickInteract", 1); + + // Special / early-exit cases first, then checks get more complex and needy as we go down + // Feature disabled + if(FirstClickPref == MEDIA_FIRST_CLICK_NONE) + { + LL_DEBUGS_ONCE() << "FirstClickPref == MEDIA_FIRST_CLICK_NONE" << LL_ENDL; + return false; + } + // Every check beyond this point requires PRIM_MEDIA_FIRST_CLICK_INTERACT to be TRUE + if(!moap_flag && !(FirstClickPref & MEDIA_FIRST_CLICK_BYPASS_MOAP_FLAG)) + { + LL_DEBUGS_ONCE() << "PRIM_MEDIA_FIRST_CLICK_INTERACT not set" << LL_ENDL; + return false; + } + // Any object with PRIM_MEDIA_FIRST_CLICK_INTERACT set to TRUE + if((FirstClickPref & MEDIA_FIRST_CLICK_ANY) == MEDIA_FIRST_CLICK_ANY) + { + LL_DEBUGS_ONCE() << "FirstClickPref & MEDIA_FIRST_CLICK_ANY" << LL_ENDL; + return true; + } + + // The following checks require some object information so we obtain that + LLPointer<LLViewerObject> object = pick.getObject(); + if(object.isNull()) + { + LL_WARNS() << "pick.getObject() is NULL" << LL_ENDL; + return false; + } + + // HUD attachments + if((FirstClickPref & MEDIA_FIRST_CLICK_HUD) && object->isHUDAttachment()) + { + LL_DEBUGS_ONCE() << "FirstClickPref & MEDIA_FIRST_CLICK_HUD" << LL_ENDL; + return true; + } + + // Further object detail required beyond this point + LLSelectNode* hover_node = LLSelectMgr::instance().getHoverNode(); + if (hover_node == nullptr) + { + LL_WARNS() << "No Hover node" << LL_ENDL; + return false; + } + LLPermissions* perms = hover_node->mPermissions; + if(perms == nullptr) + { + LL_WARNS() << "LLSelectMgr::getInstance()->getHoverNode()->mPermissions is NULL" << LL_ENDL; + return false; + } + LLUUID owner_id = perms->getOwner(); + LLUUID group_id = perms->getGroup(); + if(owner_id.isNull() && group_id.isNull()) + { + LL_WARNS() << "Owner information was not reliably obtained" << LL_ENDL; + return false; + } + + // Own objects + if((FirstClickPref & MEDIA_FIRST_CLICK_OWN) && owner_id == gAgent.getID()) + { + LL_DEBUGS_ONCE() << "FirstClickPref & MEDIA_FIRST_CLICK_OWN" << LL_ENDL; + return true; + } + + // Check if the object is owned by a friend of the agent + if(FirstClickPref & MEDIA_FIRST_CLICK_FRIEND) + { + if(LLAvatarTracker::instance().isBuddy(owner_id)) + { + LL_DEBUGS_ONCE() << "FirstClickPref & MEDIA_FIRST_CLICK_FRIEND. id: " << owner_id << LL_ENDL; + return true; + } + } + + // Check for objects set to or owned by the active group + if(FirstClickPref & MEDIA_FIRST_CLICK_GROUP) + { + if(gAgent.isInGroup(group_id) || gAgent.isInGroup(owner_id)) + { + LL_DEBUGS_ONCE() << "FirstClickPref & MEDIA_FIRST_CLICK_GROUP. group_id:" << group_id << ", owner_id: " << owner_id << LL_ENDL; + return true; + } + } + + // This check ensures that the following conditions are met: + // 1. The object is located in the same parcel as the agent. + // 2. One of the following is true: + // a. The object is owned by the same group as the parcel. + // b. The object is set to the same group as the parcel. + // c. The object is owned by the same owner as the parcel. + // Conditions 2a and 2b are mutually exclusive, our check is the same for both. + if(FirstClickPref & MEDIA_FIRST_CLICK_LAND) + { + LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); + if(parcel == nullptr) + { + LL_WARNS() << "LLViewerParcelMgr::getInstance()->getAgentParcel() is NULL" << LL_ENDL; + return false; + } + + // Same parcel as the agent only + if(!LLViewerParcelMgr::getInstance()->inAgentParcel(object->getPositionGlobal())) + { + LL_WARNS_ONCE() << "Object is not in the same parcel as the agent" << LL_ENDL; + return false; + } + + LLUUID parcel_owner = parcel->getOwnerID(); + LLUUID parcel_group = parcel->getGroupID(); + + // The parcel owner and group can't both be null + if(parcel_owner.isNull() && parcel_group.isNull()) + { + LL_WARNS() << "Parcel owner and group are both null" << LL_ENDL; + return false; + } + + if(owner_id == parcel_owner || group_id == parcel_group) + { + LL_DEBUGS_ONCE() << "FirstClickPref & MEDIA_FIRST_CLICK_LAND. Parcel owner: " << parcel_owner << ", group_id:" << group_id << ", owner_id: " << owner_id << LL_ENDL; + return true; + } + } + return false; +} + bool LLToolPie::handleMediaClick(const LLPickInfo& pick) { //FIXME: how do we handle object in different parcel than us? @@ -1535,6 +1672,16 @@ bool LLToolPie::handleMediaClick(const LLPickInfo& pick) { // It's okay to give this a null impl LLViewerMediaFocus::getInstance()->setFocusFace(pick.getObject(), pick.mObjectFace, media_impl, pick.mNormal); + if (shouldAllowFirstMediaInteraction(pick, mep->getFirstClickInteract())) + { + if (media_impl.notNull()) + { + media_impl->mouseDown(pick.mUVCoords, gKeyboard->currentMask(true)); + mMediaMouseCaptureID = mep->getMediaID(); + setMouseCapture(true); + return true; + } + } } else { @@ -1647,7 +1794,7 @@ bool LLToolPie::handleMediaHover(const LLPickInfo& pick) } // If this is the focused media face, send mouse move events. - if (LLViewerMediaFocus::getInstance()->isFocusedOnFace(objectp, pick.mObjectFace)) + if (LLViewerMediaFocus::getInstance()->isFocusedOnFace(objectp, pick.mObjectFace) || (shouldAllowFirstMediaInteraction(pick, mep->getFirstClickInteract()))) { media_impl->mouseMove(pick.mUVCoords, gKeyboard->currentMask(true)); gViewerWindow->setCursor(media_impl->getLastSetCursor()); diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h index b3884a6bfc..ec54e0207d 100644 --- a/indra/newview/lltoolpie.h +++ b/indra/newview/lltoolpie.h @@ -89,6 +89,22 @@ private: void showVisualContextMenuEffect(); ECursorType cursorFromObject(LLViewerObject* object); + enum MediaFirstClickTypes + { + MEDIA_FIRST_CLICK_NONE = 0, // Special case: Feature is disabled + MEDIA_FIRST_CLICK_HUD = 1 << 0, // 0b00000001 (1) + MEDIA_FIRST_CLICK_OWN = 1 << 1, // 0b00000010 (2) + MEDIA_FIRST_CLICK_FRIEND = 1 << 2, // 0b00000100 (4) + MEDIA_FIRST_CLICK_GROUP = 1 << 3, // 0b00001000 (8) + MEDIA_FIRST_CLICK_LAND = 1 << 4, // 0b00010000 (16) + + // Covers any object with PRIM_MEDIA_FIRST_CLICK_INTERACT (combines all previous flags) + MEDIA_FIRST_CLICK_ANY = (1 << 15) - 1, // 0b0111111111111111 (32767) + + // Covers all media regardless of other rules or PRIM_MEDIA_FIRST_CLICK_INTERACT + MEDIA_FIRST_CLICK_BYPASS_MOAP_FLAG = 1 << 15 // 0b10000000000000000 (32768) + }; + bool shouldAllowFirstMediaInteraction(const LLPickInfo& info, bool moap_flag); bool handleMediaClick(const LLPickInfo& info); bool handleMediaDblClick(const LLPickInfo& info); bool handleMediaHover(const LLPickInfo& info); diff --git a/indra/newview/lltoolpipette.h b/indra/newview/lltoolpipette.h index 0f1574f2d5..6c79674d76 100644 --- a/indra/newview/lltoolpipette.h +++ b/indra/newview/lltoolpipette.h @@ -34,7 +34,6 @@ #include "lltool.h" #include "lltextureentry.h" -#include <boost/function.hpp> #include <boost/signals2.hpp> class LLViewerObject; diff --git a/indra/newview/lltoolplacer.cpp b/indra/newview/lltoolplacer.cpp index b15bb5efd5..0d141d7545 100644 --- a/indra/newview/lltoolplacer.cpp +++ b/indra/newview/lltoolplacer.cpp @@ -527,7 +527,10 @@ bool LLToolPlacer::handleHover(S32 x, S32 y, MASK mask) void LLToolPlacer::handleSelect() { - gFloaterTools->setStatusText("place"); + if (gFloaterTools) + { + gFloaterTools->setStatusText("place"); + } } void LLToolPlacer::handleDeselect() diff --git a/indra/newview/lltoolselectland.cpp b/indra/newview/lltoolselectland.cpp index 88553c7557..331581fd88 100644 --- a/indra/newview/lltoolselectland.cpp +++ b/indra/newview/lltoolselectland.cpp @@ -207,7 +207,10 @@ void LLToolSelectLand::render() void LLToolSelectLand::handleSelect() { - gFloaterTools->setStatusText("selectland"); + if (gFloaterTools) + { + gFloaterTools->setStatusText("selectland"); + } } diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp index 72e30bd765..dcd1582eb9 100644 --- a/indra/newview/lltranslate.cpp +++ b/indra/newview/lltranslate.cpp @@ -155,10 +155,10 @@ void LLTranslationAPIHandler::verifyKeyCoro(LLTranslate::EService service, LLSD { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getMerchantStatusCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); - LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("getMerchantStatusCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); + LLCore::HttpHeaders::ptr_t httpHeaders = std::make_shared<LLCore::HttpHeaders>(); std::string user_agent = stringize( @@ -199,7 +199,7 @@ void LLTranslationAPIHandler::verifyKeyCoro(LLTranslate::EService service, LLSD bOk = false; } - if (!fnc.empty()) + if (fnc != nullptr) { fnc(service, bOk, parseResult); } @@ -210,10 +210,10 @@ void LLTranslationAPIHandler::translateMessageCoro(LanguagePair_t fromTo, std::s { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getMerchantStatusCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); - LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("getMerchantStatusCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); + LLCore::HttpHeaders::ptr_t httpHeaders = std::make_shared<LLCore::HttpHeaders>(); std::string user_agent = stringize( @@ -275,7 +275,7 @@ void LLTranslationAPIHandler::translateMessageCoro(LanguagePair_t fromTo, std::s LLStringUtil::replaceString(translation, "&", "&"); LLStringUtil::replaceString(translation, "'", "'"); - if (!success.empty()) + if (success != nullptr) success(translation, detected_lang); } else @@ -291,7 +291,7 @@ void LLTranslationAPIHandler::translateMessageCoro(LanguagePair_t fromTo, std::s } LL_WARNS() << "Translation request failed: " << err_msg << LL_ENDL; - if (!failure.empty()) + if (failure != nullptr) failure(status, err_msg); } } diff --git a/indra/newview/lltranslate.h b/indra/newview/lltranslate.h index 0ad769b27f..14372cf406 100644 --- a/indra/newview/lltranslate.h +++ b/indra/newview/lltranslate.h @@ -28,10 +28,10 @@ #define LL_LLTRANSLATE_H #include "llbufferstream.h" -#include <boost/function.hpp> - #include "llsingleton.h" +#include <functional> + class LLTranslationAPIHandler; /** * Entry point for machine translation services. @@ -59,9 +59,9 @@ public : SERVICE_DEEPL, } EService; - typedef boost::function<void(EService, bool, S32)> KeyVerificationResult_fn; - typedef boost::function<void(std::string , std::string )> TranslationSuccess_fn; - typedef boost::function<void(int, std::string)> TranslationFailure_fn; + typedef std::function<void(EService, bool, S32)> KeyVerificationResult_fn; + typedef std::function<void(std::string, std::string)> TranslationSuccess_fn; + typedef std::function<void(int, std::string)> TranslationFailure_fn; /** * Translate given text. diff --git a/indra/newview/llurllineeditorctrl.cpp b/indra/newview/llurllineeditorctrl.cpp index de0ed645eb..871bf36ed3 100644 --- a/indra/newview/llurllineeditorctrl.cpp +++ b/indra/newview/llurllineeditorctrl.cpp @@ -84,7 +84,9 @@ void LLURLLineEditor::copyEscapedURLToClipboard() const std::string unescaped_text = wstring_to_utf8str(mText.getWString().substr(left_pos, length)); LLWString text_to_copy; // *HACK: Because LLSLURL is currently broken we cannot use it to check if unescaped_text is a valid SLURL (see EXT-8335). - if (LLStringUtil::startsWith(unescaped_text, "http://") || LLStringUtil::startsWith(unescaped_text, "secondlife://")) // SLURL + if (LLStringUtil::startsWith(unescaped_text, "https://") + || LLStringUtil::startsWith(unescaped_text, "http://") + || LLStringUtil::startsWith(unescaped_text, "secondlife://")) // SLURL text_to_copy = utf8str_to_wstring(LLWeb::escapeURL(unescaped_text)); else // human-readable location text_to_copy = utf8str_to_wstring(unescaped_text); diff --git a/indra/newview/llviewerassetstats.h b/indra/newview/llviewerassetstats.h index de395da285..297d0a70ff 100644 --- a/indra/newview/llviewerassetstats.h +++ b/indra/newview/llviewerassetstats.h @@ -182,7 +182,7 @@ public: LLViewerAssetStats(const LLViewerAssetStats &); // Default destructor is correct. - LLViewerAssetStats & operator=(const LLViewerAssetStats &); // Not defined + LLViewerAssetStats& operator=(const LLViewerAssetStats&) = delete; // Clear all metrics data. This leaves the currently-active region // in place but with zero'd data for all metrics. All other regions diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp index 5ab9f76e47..fd462fb225 100644 --- a/indra/newview/llviewerassetstorage.cpp +++ b/indra/newview/llviewerassetstorage.cpp @@ -42,6 +42,7 @@ #include "llcoproceduremanager.h" #include "lleventcoro.h" #include "llsdutil.h" +#include "llstartup.h" #include "llworld.h" ///---------------------------------------------------------------------------- @@ -68,7 +69,7 @@ public: { } - LLViewerAssetRequest & operator=(const LLViewerAssetRequest &); // Not defined + LLViewerAssetRequest& operator=(const LLViewerAssetRequest&) = delete; // Default assignment operator valid // virtual @@ -402,10 +403,10 @@ void LLViewerAssetStorage::queueRequestHttp( manager->enqueueCoprocedure( VIEWER_ASSET_STORAGE_CORO_POOL, "LLViewerAssetStorage::assetRequestCoro", - [this, req, uuid, atype, callback, user_data] + [this, uuid, atype, callback, user_data] (LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t&, const LLUUID&) { - assetRequestCoro(req, uuid, atype, callback, user_data); + assetRequestCoro(uuid, atype, callback, user_data); }); } } @@ -440,7 +441,6 @@ struct LLScopedIncrement }; void LLViewerAssetStorage::assetRequestCoro( - LLViewerAssetRequest *req, const LLUUID uuid, LLAssetType::EType atype, LLGetAssetCallback callback, @@ -461,28 +461,78 @@ void LLViewerAssetStorage::assetRequestCoro( if (!gAgent.getRegion()) { - LL_WARNS_ONCE("ViewerAsset") << "Asset request fails: no region set" << LL_ENDL; - result_code = LL_ERR_ASSET_REQUEST_FAILED; - ext_status = LLExtStat::NONE; - removeAndCallbackPendingDownloads(uuid, atype, uuid, atype, result_code, ext_status); - return; + if (STATE_WORLD_INIT <= LLStartUp::getStartupState()) + { + // Viewer isn't ready, wait for region to become available + LL_INFOS_ONCE("ViewerAsset") << "Waiting for agent region to be set" << LL_ENDL; + + LLEventStream region_init("waitForRegion", true); + std::string pump_name = region_init.getName(); + + boost::signals2::connection region_conn = + gAgent.addRegionChangedCallback([pump_name]() + { + LLEventPumps::instance().obtain(pump_name).post(LLSD()); + }); + F32Seconds timeout_seconds(LL_ASSET_STORAGE_TIMEOUT); + llcoro::suspendUntilEventOnWithTimeout(region_init, timeout_seconds, LLSDMap("timeout", LLSD::Boolean(true))); + gAgent.removeRegionChangedCallback(region_conn); + region_conn.disconnect(); + + if (LLApp::isExiting() || !gAssetStorage) + { + return; + } + + // recheck region whether suspend ended on timeout or not + if (!gAgent.getRegion()) + { + LL_WARNS_ONCE("ViewerAsset") << "Asset request fails: timeout reached while waiting for region" << LL_ENDL; + result_code = LL_ERR_NO_CAP; + ext_status = LLExtStat::NONE; + removeAndCallbackPendingDownloads(uuid, atype, uuid, atype, result_code, ext_status, 0); + return; + } + } + else + { + LL_WARNS_ONCE("ViewerAsset") << "Asset request fails: no region set" << LL_ENDL; + result_code = LL_ERR_NO_CAP; + ext_status = LLExtStat::NONE; + removeAndCallbackPendingDownloads(uuid, atype, uuid, atype, result_code, ext_status, 0); + return; + } } - else if (!gAgent.getRegion()->capabilitiesReceived()) + + if (!gAgent.getRegion()->capabilitiesReceived()) { LL_WARNS_ONCE("ViewerAsset") << "Waiting for capabilities" << LL_ENDL; LLEventStream capsRecv("waitForCaps", true); - gAgent.getRegion()->setCapabilitiesReceivedCallback( - boost::bind(&LLViewerAssetStorage::capsRecvForRegion, this, _1, capsRecv.getName())); + boost::signals2::connection caps_conn = + gAgent.getRegion()->setCapabilitiesReceivedCallback( + boost::bind(&LLViewerAssetStorage::capsRecvForRegion, this, _1, capsRecv.getName())); - llcoro::suspendUntilEventOn(capsRecv); + F32Seconds timeout_seconds(LL_ASSET_STORAGE_TIMEOUT); // from minutes to seconds, by default 5 minutes + LLSD result = llcoro::suspendUntilEventOnWithTimeout(capsRecv, timeout_seconds, LLSDMap("timeout", LLSD::Boolean(true))); + caps_conn.disconnect(); if (LLApp::isExiting() || !gAssetStorage) { return; } + if (result.has("timeout")) + { + // Caps failed to arrive in 5 minutes + LL_WARNS_ONCE("ViewerAsset") << "Asset " << uuid << " request fails : capabilities took too long to arrive" << LL_ENDL; + result_code = LL_ERR_NO_CAP; + ext_status = LLExtStat::NONE; + removeAndCallbackPendingDownloads(uuid, atype, uuid, atype, result_code, ext_status, 0); + return; + } + LL_WARNS_ONCE("ViewerAsset") << "capsRecv got event" << LL_ENDL; LL_WARNS_ONCE("ViewerAsset") << "region " << gAgent.getRegion() << " mViewerAssetUrl " << mViewerAssetUrl << LL_ENDL; } @@ -493,9 +543,9 @@ void LLViewerAssetStorage::assetRequestCoro( if (mViewerAssetUrl.empty()) { LL_WARNS_ONCE("ViewerAsset") << "asset request fails: caps received but no viewer asset cap found" << LL_ENDL; - result_code = LL_ERR_ASSET_REQUEST_FAILED; + result_code = LL_ERR_NO_CAP; ext_status = LLExtStat::NONE; - removeAndCallbackPendingDownloads(uuid, atype, uuid, atype, result_code, ext_status); + removeAndCallbackPendingDownloads(uuid, atype, uuid, atype, result_code, ext_status, 0); return; } std::string url = getAssetURL(mViewerAssetUrl, uuid,atype); @@ -503,9 +553,9 @@ void LLViewerAssetStorage::assetRequestCoro( LLCore::HttpRequest::policy_t httpPolicy(LLAppCoreHttp::AP_TEXTURE); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("assetRequestCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("assetRequestCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); LLSD result = httpAdapter->getRawAndSuspend(httpRequest, url, httpOpts); @@ -517,6 +567,7 @@ void LLViewerAssetStorage::assetRequestCoro( mCountCompleted++; + S32 bytes_fetched = 0; LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); if (!status) @@ -554,7 +605,7 @@ void LLViewerAssetStorage::assetRequestCoro( LLUUID temp_id; temp_id.generate(); LLFileSystem vf(temp_id, atype, LLFileSystem::WRITE); - req->mBytesFetched = size; + bytes_fetched = size; if (!vf.write(raw.data(),size)) { // TODO asset-http: handle error @@ -583,7 +634,7 @@ void LLViewerAssetStorage::assetRequestCoro( } // Clean up pending downloads and trigger callbacks - removeAndCallbackPendingDownloads(uuid, atype, uuid, atype, result_code, ext_status); + removeAndCallbackPendingDownloads(uuid, atype, uuid, atype, result_code, ext_status, bytes_fetched); } std::string LLViewerAssetStorage::getAssetURL(const std::string& cap_url, const LLUUID& uuid, LLAssetType::EType atype) diff --git a/indra/newview/llviewerassetstorage.h b/indra/newview/llviewerassetstorage.h index fdb8af7457..42dd9d1dd8 100644 --- a/indra/newview/llviewerassetstorage.h +++ b/indra/newview/llviewerassetstorage.h @@ -82,8 +82,7 @@ protected: void capsRecvForRegion(const LLUUID& region_id, std::string pumpname); - void assetRequestCoro(LLViewerAssetRequest *req, - const LLUUID uuid, + void assetRequestCoro(const LLUUID uuid, LLAssetType::EType atype, LLGetAssetCallback callback, void *user_data); diff --git a/indra/newview/llviewerassetupload.cpp b/indra/newview/llviewerassetupload.cpp index 7ef2c8d697..65a69acc88 100644 --- a/indra/newview/llviewerassetupload.cpp +++ b/indra/newview/llviewerassetupload.cpp @@ -62,7 +62,8 @@ LLResourceUploadInfo::LLResourceUploadInfo(LLTransactionID transactId, LLAssetType::EType assetType, std::string name, std::string description, S32 compressionInfo, LLFolderType::EType destinationType, LLInventoryType::EType inventoryType, U32 nextOWnerPerms, - U32 groupPerms, U32 everyonePerms, S32 expectedCost, bool showInventory) : + U32 groupPerms, U32 everyonePerms, S32 expectedCost, + const LLUUID& destFolderId, bool showInventory) : mTransactionId(transactId), mAssetType(assetType), mName(name), @@ -75,7 +76,7 @@ LLResourceUploadInfo::LLResourceUploadInfo(LLTransactionID transactId, mEveryonePerms(everyonePerms), mExpectedUploadCost(expectedCost), mShowInventory(showInventory), - mFolderId(LLUUID::null), + mFolderId(destFolderId), mItemId(LLUUID::null), mAssetId(LLAssetID::null) { } @@ -84,7 +85,8 @@ LLResourceUploadInfo::LLResourceUploadInfo(LLTransactionID transactId, LLResourceUploadInfo::LLResourceUploadInfo(std::string name, std::string description, S32 compressionInfo, LLFolderType::EType destinationType, LLInventoryType::EType inventoryType, - U32 nextOWnerPerms, U32 groupPerms, U32 everyonePerms, S32 expectedCost, bool showInventory) : + U32 nextOWnerPerms, U32 groupPerms, U32 everyonePerms, S32 expectedCost, + const LLUUID& destFolderId, bool showInventory) : mName(name), mDescription(description), mCompressionInfo(compressionInfo), @@ -97,7 +99,7 @@ LLResourceUploadInfo::LLResourceUploadInfo(std::string name, mShowInventory(showInventory), mTransactionId(), mAssetType(LLAssetType::AT_NONE), - mFolderId(LLUUID::null), + mFolderId(destFolderId), mItemId(LLUUID::null), mAssetId(LLAssetID::null) { @@ -298,18 +300,20 @@ void LLResourceUploadInfo::assignDefaults() { mDescription = "(No Description)"; } - - if (mAssetType == LLAssetType::AT_GLTF || - mAssetType == LLAssetType::AT_GLTF_BIN) + if (mFolderId.isNull()) // don't overwrite if destination is already specified { - mFolderId = LLUUID::null; + if (mAssetType == LLAssetType::AT_GLTF || + mAssetType == LLAssetType::AT_GLTF_BIN) + { + mFolderId = LLUUID::null; + } + else + { + mFolderId = gInventory.findUserDefinedCategoryUUIDForType( + (mDestinationFolderType == LLFolderType::FT_NONE) ? + (LLFolderType::EType)mAssetType : mDestinationFolderType); + } } - else - { - mFolderId = gInventory.findUserDefinedCategoryUUIDForType( - (mDestinationFolderType == LLFolderType::FT_NONE) ? - (LLFolderType::EType)mAssetType : mDestinationFolderType); -} } std::string LLResourceUploadInfo::getDisplayName() const @@ -366,10 +370,12 @@ LLNewFileResourceUploadInfo::LLNewFileResourceUploadInfo( U32 groupPerms, U32 everyonePerms, S32 expectedCost, + const LLUUID& destFolderId, bool show_inventory) : LLResourceUploadInfo(name, description, compressionInfo, destinationType, inventoryType, - nextOWnerPerms, groupPerms, everyonePerms, expectedCost, show_inventory), + nextOWnerPerms, groupPerms, everyonePerms, expectedCost, + destFolderId, show_inventory), mFileName(fileName), mMaxImageSize(LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT) { @@ -580,12 +586,13 @@ LLNewBufferedResourceUploadInfo::LLNewBufferedResourceUploadInfo( U32 groupPerms, U32 everyonePerms, S32 expectedCost, + const LLUUID& destFolderId, bool show_inventory, uploadFinish_f finish, uploadFailure_f failure) : LLResourceUploadInfo(name, description, compressionInfo, destinationType, inventoryType, - nextOWnerPerms, groupPerms, everyonePerms, expectedCost, show_inventory) + nextOWnerPerms, groupPerms, everyonePerms, expectedCost, destFolderId, show_inventory) , mBuffer(buffer) , mFinishFn(finish) , mFailureFn(failure) @@ -857,8 +864,8 @@ LLUUID LLViewerAssetUpload::EnqueueInventoryUpload(const std::string &url, const void LLViewerAssetUpload::AssetInventoryUploadCoproc(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter, const LLUUID &id, std::string url, LLResourceUploadInfo::ptr_t uploadInfo) { - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOptions(new LLCore::HttpOptions); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOptions = std::make_shared<LLCore::HttpOptions>(); httpOptions->setTimeout(LL_ASSET_UPLOAD_TIMEOUT_SEC); LLSD result = uploadInfo->prepareUpload(); diff --git a/indra/newview/llviewerassetupload.h b/indra/newview/llviewerassetupload.h index 365436ede0..c627e9dbb8 100644 --- a/indra/newview/llviewerassetupload.h +++ b/indra/newview/llviewerassetupload.h @@ -54,6 +54,7 @@ public: U32 groupPerms, U32 everyonePerms, S32 expectedCost, + const LLUUID &destFolderId = LLUUID::null, bool showInventory = true); virtual ~LLResourceUploadInfo() @@ -104,6 +105,7 @@ protected: U32 groupPerms, U32 everyonePerms, S32 expectedCost, + const LLUUID& destFolderId = LLUUID::null, bool showInventory = true); LLResourceUploadInfo( @@ -155,6 +157,7 @@ public: U32 groupPerms, U32 everyonePerms, S32 expectedCost, + const LLUUID &destFolderId = LLUUID::null, bool show_inventory = true); virtual LLSD prepareUpload(); @@ -193,6 +196,7 @@ public: U32 groupPerms, U32 everyonePerms, S32 expectedCost, + const LLUUID& destFolderId, // use null for default bool show_inventory, uploadFinish_f finish, uploadFailure_f failure); @@ -219,6 +223,7 @@ public: typedef std::function<void(LLUUID itemId, LLUUID taskId, LLUUID newAssetId, LLSD response)> taskUploadFinish_f; typedef std::function<bool(LLUUID itemId, LLUUID taskId, LLSD response, std::string reason)> uploadFailed_f; + // destFolderId is the folder to put the new item in, leave null for default LLBufferedAssetUploadInfo(LLUUID itemId, LLAssetType::EType assetType, std::string buffer, invnUploadFinish_f finish, uploadFailed_f failed); LLBufferedAssetUploadInfo(LLUUID itemId, LLPointer<LLImageFormatted> image, invnUploadFinish_f finish); LLBufferedAssetUploadInfo(LLUUID taskId, LLUUID itemId, LLAssetType::EType assetType, std::string buffer, taskUploadFinish_f finish, uploadFailed_f failed); diff --git a/indra/newview/llviewerattachmenu.cpp b/indra/newview/llviewerattachmenu.cpp index f2557e299c..9828ab1fdf 100644 --- a/indra/newview/llviewerattachmenu.cpp +++ b/indra/newview/llviewerattachmenu.cpp @@ -116,12 +116,12 @@ void LLViewerAttachMenu::attachObjects(const uuid_vec_t& items, const std::strin LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getLinkedItem(id); if(item && gInventory.isObjectDescendentOf(id, gInventory.getRootFolderID())) { - rez_attachment(item, attachmentp); // don't replace if called from an "Attach To..." menu + rez_attachment(item, attachmentp, false); // don't replace if called from an "Attach To..." menu } else if(item && item->isFinished()) { // must be in library. copy it to our inventory and put it on. - LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(rez_attachment_cb, _1, attachmentp)); + LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(rez_attachment_cb, _1, attachmentp, false)); copy_inventory_item(gAgent.getID(), item->getPermissions().getOwner(), item->getUUID(), diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index b3b4f43e57..aa0cbac91f 100644 --- a/indra/newview/llvieweraudio.cpp +++ b/indra/newview/llvieweraudio.cpp @@ -390,6 +390,7 @@ void init_audio() gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowClose"))); gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowOpen"))); gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndRestart"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndChatMention"))); } audio_update_volume(true); @@ -541,8 +542,8 @@ void audio_update_wind(bool force_update) // whereas steady-state avatar walk velocity is only 3.2 m/s. // Without this the world feels desolate on first login when you are // standing still. - const F32 WIND_LEVEL = 0.5f; - LLVector3 scaled_wind_vec = gWindVec * WIND_LEVEL; + static LLUICachedControl<F32> wind_level("AudioLevelWind", 0.5f); + LLVector3 scaled_wind_vec = gWindVec * wind_level; // Mix in the avatar's motion, subtract because when you walk north, // the apparent wind moves south. diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp index 6cf99b68b2..553c8d9b00 100644 --- a/indra/newview/llviewercamera.cpp +++ b/indra/newview/llviewercamera.cpp @@ -73,26 +73,26 @@ LLViewerCamera::LLViewerCamera() : LLCamera() mAverageSpeed = 0.f; mAverageAngularSpeed = 0.f; - mCameraAngleChangedSignal = gSavedSettings.getControl("CameraAngle")->getCommitSignal()->connect(boost::bind(&LLViewerCamera::updateCameraAngle, this, _2)); -} - -LLViewerCamera::~LLViewerCamera() -{ - mCameraAngleChangedSignal.disconnect(); + LLPointer<LLControlVariable> cntrl_ptr = gSavedSettings.getControl("CameraAngle"); + if (cntrl_ptr.notNull()) + { + cntrl_ptr->getCommitSignal()->connect([](LLControlVariable* control, const LLSD& value, const LLSD& previous) + { + LLViewerCamera::getInstance()->setDefaultFOV((F32)value.asReal()); + }); + } } -void LLViewerCamera::updateCameraLocation(const LLVector3 ¢er, const LLVector3 &up_direction, const LLVector3 &point_of_interest) +bool LLViewerCamera::updateCameraLocation(const LLVector3 ¢er, const LLVector3 &up_direction, const LLVector3 &point_of_interest) { // do not update if avatar didn't move if (!LLViewerJoystick::getInstance()->getCameraNeedsUpdate()) { - return; + return true; } - LLVector3 last_position; - LLVector3 last_axis; - last_position = getOrigin(); - last_axis = getAtAxis(); + LLVector3 last_position = getOrigin(); + LLVector3 last_axis = getAtAxis(); mLastPointOfInterest = point_of_interest; @@ -102,30 +102,49 @@ void LLViewerCamera::updateCameraLocation(const LLVector3 ¢er, const LLVecto regp = gAgent.getRegion(); } - F32 water_height = (NULL != regp) ? regp->getWaterHeight() : 0.f; + F32 water_height = regp ? regp->getWaterHeight() : 0.f; LLVector3 origin = center; + // Move origin[VZ] far enough (up or down) from the water surface + static const F32 MIN_DIST_TO_WATER = 0.2f; + F32& zpos = origin.mV[VZ]; + if (zpos < water_height + MIN_DIST_TO_WATER) { - if (origin.mV[2] > water_height) + if (zpos >= water_height) { - origin.mV[2] = llmax(origin.mV[2], water_height + 0.20f); + zpos = water_height + MIN_DIST_TO_WATER; } - else + else if (zpos > water_height - MIN_DIST_TO_WATER) { - origin.mV[2] = llmin(origin.mV[2], water_height - 0.20f); + zpos = water_height - MIN_DIST_TO_WATER; } } - setOriginAndLookAt(origin, up_direction, point_of_interest); + LLVector3 at(point_of_interest - origin); + at.normalize(); + if (at.isNull() || !at.isFinite()) + return false; + + LLVector3 left(up_direction % at); + left.normalize(); + if (left.isNull() || !left.isFinite()) + return false; + + LLVector3 up = at % left; + up.normalize(); + if (up.isNull() || !up.isFinite()) + return false; + + setOrigin(origin); + setAxes(at, left, up); mVelocityDir = origin - last_position ; F32 dpos = mVelocityDir.normVec() ; LLQuaternion rotation; rotation.shortestArc(last_axis, getAtAxis()); - F32 x, y, z; - F32 drot; + F32 drot, x, y, z; rotation.getAngleAxis(&drot, &x, &y, &z); add(sVelocityStat, dpos); @@ -139,13 +158,14 @@ void LLViewerCamera::updateCameraLocation(const LLVector3 ¢er, const LLVecto mPixelMeterRatio = (F32)(getViewHeightInPixels()/ (2.f*tanf(mCameraFOVDefault*0.5f))); // update screen pixel area mScreenPixelArea =(S32)((F32)getViewHeightInPixels() * ((F32)getViewHeightInPixels() * getAspect())); + + return true; } const LLMatrix4 &LLViewerCamera::getProjection() const { calcProjection(getFar()); return mProjectionMatrix; - } const LLMatrix4 &LLViewerCamera::getModelview() const @@ -158,13 +178,12 @@ const LLMatrix4 &LLViewerCamera::getModelview() const void LLViewerCamera::calcProjection(const F32 far_distance) const { - F32 fov_y, z_far, z_near, aspect, f; - fov_y = getView(); - z_far = far_distance; - z_near = getNear(); - aspect = getAspect(); + F32 fov_y = getView(); + F32 z_far = far_distance; + F32 z_near = getNear(); + F32 aspect = getAspect(); - f = 1/tan(fov_y*0.5f); + F32 f = 1 / tan(fov_y * 0.5f); mProjectionMatrix.setZero(); mProjectionMatrix.mMatrix[0][0] = f/aspect; @@ -270,9 +289,9 @@ void LLViewerCamera::updateFrustumPlanes(LLCamera& camera, bool ortho, bool zfli } void LLViewerCamera::setPerspective(bool for_selection, - S32 x, S32 y_from_bot, S32 width, S32 height, - bool limit_select_distance, - F32 z_near, F32 z_far) + S32 x, S32 y_from_bot, S32 width, S32 height, + bool limit_select_distance, + F32 z_near, F32 z_far) { F32 fov_y, aspect; fov_y = getView(); @@ -334,7 +353,7 @@ void LLViewerCamera::setPerspective(bool for_selection, { float offset = mZoomFactor - 1.f; int pos_y = mZoomSubregion / llceil(mZoomFactor); - int pos_x = mZoomSubregion - (pos_y*llceil(mZoomFactor)); + int pos_x = mZoomSubregion - (pos_y * llceil(mZoomFactor)); glm::mat4 translate; translate = glm::translate(glm::vec3(offset - (F32)pos_x * 2.f, offset - (F32)pos_y * 2.f, 0.f)); @@ -347,7 +366,7 @@ void LLViewerCamera::setPerspective(bool for_selection, calcProjection(z_far); // Update the projection matrix cache - proj_mat *= glm::perspective(fov_y,aspect,z_near,z_far); + proj_mat *= glm::perspective(fov_y, aspect, z_near, z_far); gGL.loadMatrix(glm::value_ptr(proj_mat)); @@ -355,7 +374,7 @@ void LLViewerCamera::setPerspective(bool for_selection, gGL.matrixMode(LLRender::MM_MODELVIEW); - glm::mat4 modelview(glm::make_mat4((GLfloat*) OGL_TO_CFR_ROTATION)); + glm::mat4 modelview(glm::make_mat4((GLfloat*)OGL_TO_CFR_ROTATION)); GLfloat ogl_matrix[16]; @@ -371,9 +390,9 @@ void LLViewerCamera::setPerspective(bool for_selection, // however, it is also unused (the GL matricies are used for selection, (see LLCamera::sphereInFrustum())) and so i'm not // comfortable hacking on it. calculateFrustumPlanesFromWindow((F32)(x - width / 2) / (F32)gViewerWindow->getWindowWidthScaled() - 0.5f, - (F32)(y_from_bot - height / 2) / (F32)gViewerWindow->getWindowHeightScaled() - 0.5f, - (F32)(x + width / 2) / (F32)gViewerWindow->getWindowWidthScaled() - 0.5f, - (F32)(y_from_bot + height / 2) / (F32)gViewerWindow->getWindowHeightScaled() - 0.5f); + (F32)(y_from_bot - height / 2) / (F32)gViewerWindow->getWindowHeightScaled() - 0.5f, + (F32)(x + width / 2) / (F32)gViewerWindow->getWindowWidthScaled() - 0.5f, + (F32)(y_from_bot + height / 2) / (F32)gViewerWindow->getWindowHeightScaled() - 0.5f); } @@ -387,7 +406,6 @@ void LLViewerCamera::setPerspective(bool for_selection, updateFrustumPlanes(*this); } - // Uses the last GL matrices set in set_perspective to project a point from // screen coordinates to the agent's region. void LLViewerCamera::projectScreenToPosAgent(const S32 screen_x, const S32 screen_y, LLVector3* pos_agent) const @@ -816,8 +834,3 @@ bool LLViewerCamera::isDefaultFOVChanged() return false; } -void LLViewerCamera::updateCameraAngle(const LLSD& value) -{ - setDefaultFOV((F32)value.asReal()); -} - diff --git a/indra/newview/llviewercamera.h b/indra/newview/llviewercamera.h index a204b85d88..cb0994be0a 100644 --- a/indra/newview/llviewercamera.h +++ b/indra/newview/llviewercamera.h @@ -43,7 +43,6 @@ class alignas(16) LLViewerCamera : public LLCamera, public LLSimpleton<LLViewerC LL_ALIGN_NEW public: LLViewerCamera(); - ~LLViewerCamera(); typedef enum { @@ -61,12 +60,11 @@ public: static eCameraID sCurCameraID; - void updateCameraLocation(const LLVector3 ¢er, + bool updateCameraLocation(const LLVector3 ¢er, const LLVector3 &up_direction, const LLVector3 &point_of_interest); static void updateFrustumPlanes(LLCamera& camera, bool ortho = false, bool zflip = false, bool no_hacks = false); - void updateCameraAngle(const LLSD& value); void setPerspective(bool for_selection, S32 x, S32 y_from_bot, S32 width, S32 height, bool limit_select_distance, F32 z_near = 0, F32 z_far = 0); const LLMatrix4 &getProjection() const; @@ -77,12 +75,12 @@ public: bool projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoordGL &out_point, const bool clamp = true) const; bool projectPosAgentToScreenEdge(const LLVector3 &pos_agent, LLCoordGL &out_point) const; + F32 getCosHalfFov() const { return mCosHalfCameraFOV; } + F32 getAverageSpeed() const { return mAverageSpeed; } + F32 getAverageAngularSpeed() const { return mAverageAngularSpeed; } LLVector3 getVelocityDir() const {return mVelocityDir;} static LLTrace::CountStatHandle<>* getVelocityStat() {return &sVelocityStat; } static LLTrace::CountStatHandle<>* getAngularVelocityStat() {return &sAngularVelocityStat; } - F32 getCosHalfFov() {return mCosHalfCameraFOV;} - F32 getAverageSpeed() {return mAverageSpeed ;} - F32 getAverageAngularSpeed() {return mAverageAngularSpeed;} void getPixelVectors(const LLVector3 &pos_agent, LLVector3 &up, LLVector3 &right); LLVector3 roundToPixel(const LLVector3 &pos_agent); @@ -90,21 +88,21 @@ public: // Sets the current matrix /* virtual */ void setView(F32 vertical_fov_rads); // NOTE: broadcasts to simulator void setViewNoBroadcast(F32 vertical_fov_rads); // set FOV without broadcasting to simulator (for temporary local cameras) + F32 getDefaultFOV() const { return mCameraFOVDefault; } void setDefaultFOV(F32 fov) ; - F32 getDefaultFOV() { return mCameraFOVDefault; } bool isDefaultFOVChanged(); bool cameraUnderWater() const; bool areVertsVisible(LLViewerObject* volumep, bool all_verts); - const LLVector3 &getPointOfInterest() { return mLastPointOfInterest; } + const LLVector3& getPointOfInterest() const { return mLastPointOfInterest; } F32 getPixelMeterRatio() const { return mPixelMeterRatio; } S32 getScreenPixelArea() const { return mScreenPixelArea; } void setZoomParameters(F32 factor, S16 subregion) { mZoomFactor = factor; mZoomSubregion = subregion; } - F32 getZoomFactor() { return mZoomFactor; } - S16 getZoomSubRegion() { return mZoomSubregion; } + F32 getZoomFactor() const { return mZoomFactor; } + S16 getZoomSubRegion() const { return mZoomSubregion; } protected: void calcProjection(const F32 far_distance) const; @@ -126,8 +124,6 @@ protected: F32 mZoomFactor; S16 mZoomSubregion; - boost::signals2::connection mCameraAngleChangedSignal; - public: }; diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp index 8b01c4ef88..2ca2c5c07d 100644 --- a/indra/newview/llviewerchat.cpp +++ b/indra/newview/llviewerchat.cpp @@ -36,6 +36,7 @@ #include "llviewerregion.h" #include "llworld.h" #include "llinstantmessage.h" //SYSTEM_FROM +#include "llurlregistry.h" // LLViewerChat LLViewerChat::font_change_signal_t LLViewerChat::sChatFontChangedSignal; @@ -222,6 +223,13 @@ void LLViewerChat::formatChatMsg(const LLChat& chat, std::string& formated_msg) { std::string tmpmsg = chat.mText; + // show @name instead of slurl for chat mentions + LLUrlMatch match; + while (LLUrlRegistry::instance().findUrl(tmpmsg, match, LLUrlRegistryNullCallback, false, true)) + { + tmpmsg.replace(match.getStart(), match.getEnd() - match.getStart() + 1, match.getLabel()); + } + if(chat.mChatStyle == CHAT_STYLE_IRC) { formated_msg = chat.mFromName + tmpmsg.substr(3); diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 598ad89907..1c6a7a3e79 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -68,6 +68,8 @@ #include "llrender.h" #include "llnavigationbar.h" #include "llnotificationsutil.h" +#include "llfloaterpreference.h" +#include "llfloaterreg.h" #include "llfloatertools.h" #include "llpaneloutfitsinventory.h" #include "llpanellogin.h" @@ -76,6 +78,7 @@ #include "llslurl.h" #include "llstartup.h" #include "llperfstats.h" +#include "rlvcommon.h" #if LL_DARWIN #include "llwindowmacosx.h" @@ -149,6 +152,21 @@ static bool handleDebugAvatarJointsChanged(const LLSD& newvalue) return true; } +static bool handleDebugQualityPerformanceChanged(const LLSD& newvalue) +{ + // control was set directly or after adjusting Preference setting, no need to update + if (gSavedSettings.getU32("RenderQualityPerformance") != gSavedSettings.getU32("DebugQualityPerformance")) + { + LLFloaterPreference* instance = LLFloaterReg::getTypedInstance<LLFloaterPreference>("preferences"); + if (instance) + { + gSavedSettings.setU32("RenderQualityPerformance", newvalue.asInteger()); + instance->onChangeQuality(newvalue); + } + } + return true; +} + static bool handleAvatarHoverOffsetChanged(const LLSD& newvalue) { if (isAgentAvatarValid()) @@ -447,6 +465,7 @@ static bool handleRenderDynamicLODChanged(const LLSD& newvalue) static bool handleReflectionProbeDetailChanged(const LLSD& newvalue) { + gPipeline.mReflectionMapManager.refreshSettings(); if (gPipeline.isInit()) { LLPipeline::refreshCachedSettings(); @@ -459,6 +478,12 @@ static bool handleReflectionProbeDetailChanged(const LLSD& newvalue) return true; } +static bool handleReflectionProbeCountChanged(const LLSD& newvalue) +{ + gPipeline.mReflectionMapManager.refreshSettings(); + return true; +} + #if LL_DARWIN static bool handleAppleUseMultGLChanged(const LLSD& newvalue) { @@ -836,6 +861,7 @@ void settings_setup_listeners() setting_setup_signal_listener(gSavedSettings, "RenderResolutionDivisor", handleRenderResolutionDivisorChanged); setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeLevel", handleReflectionProbeDetailChanged); setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeDetail", handleReflectionProbeDetailChanged); + setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeCount", handleReflectionProbeCountChanged); setting_setup_signal_listener(gSavedSettings, "RenderReflectionsEnabled", handleReflectionProbeDetailChanged); #if LL_DARWIN setting_setup_signal_listener(gSavedSettings, "RenderAppleUseMultGL", handleAppleUseMultGLChanged); @@ -846,6 +872,7 @@ void settings_setup_listeners() setting_setup_signal_listener(gSavedSettings, "RenderShadowDetail", handleSetShaderChanged); setting_setup_signal_listener(gSavedSettings, "RenderDeferredSSAO", handleSetShaderChanged); setting_setup_signal_listener(gSavedSettings, "RenderPerformanceTest", handleRenderPerfTestChanged); + setting_setup_signal_listener(gSavedSettings, "RenderAvatarCloth", handleSetShaderChanged); setting_setup_signal_listener(gSavedSettings, "ChatFontSize", handleChatFontSizeChanged); setting_setup_signal_listener(gSavedSettings, "ConsoleMaxLines", handleConsoleMaxLinesChanged); setting_setup_signal_listener(gSavedSettings, "UploadBakedTexOld", handleUploadBakedTexOldChanged); @@ -938,6 +965,7 @@ void settings_setup_listeners() setting_setup_signal_listener(gSavedSettings, "SpellCheckDictionary", handleSpellCheckChanged); setting_setup_signal_listener(gSavedSettings, "LoginLocation", handleLoginLocationChanged); setting_setup_signal_listener(gSavedSettings, "DebugAvatarJoints", handleDebugAvatarJointsChanged); + setting_setup_signal_listener(gSavedSettings, "DebugQualityPerformance", handleDebugQualityPerformanceChanged); setting_setup_signal_listener(gSavedSettings, "TargetFPS", handleTargetFPSChanged); setting_setup_signal_listener(gSavedSettings, "AutoTuneFPS", handleAutoTuneFPSChanged); @@ -972,6 +1000,8 @@ void settings_setup_listeners() setting_setup_signal_listener(gSavedSettings, "TerrainPaintBitDepth", handleSetShaderChanged); setting_setup_signal_listener(gSavedPerAccountSettings, "AvatarHoverOffsetZ", handleAvatarHoverOffsetChanged); + + setting_setup_signal_listener(gSavedSettings, Rlv::Settings::TopLevelMenu, Rlv::Util::menuToggleVisible); } #if TEST_CACHED_CONTROL diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 24f1be3d1c..314e32bffd 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -100,13 +100,13 @@ extern LLPointer<LLViewerTexture> gStartTexture; extern bool gShiftFrame; -LLPointer<LLViewerTexture> gDisconnectedImagep = NULL; +LLPointer<LLViewerTexture> gDisconnectedImagep = nullptr; // used to toggle renderer back on after teleport bool gTeleportDisplay = false; LLFrameTimer gTeleportDisplayTimer; LLFrameTimer gTeleportArrivalTimer; -const F32 RESTORE_GL_TIME = 5.f; // Wait this long while reloading textures before we raise the curtain +constexpr F32 RESTORE_GL_TIME = 5.f; // Wait this long while reloading textures before we raise the curtain bool gForceRenderLandFence = false; bool gDisplaySwapBuffers = false; @@ -120,9 +120,9 @@ bool gSnapshotNoPost = false; bool gShaderProfileFrame = false; // This is how long the sim will try to teleport you before giving up. -const F32 TELEPORT_EXPIRY = 15.0f; +constexpr F32 TELEPORT_EXPIRY = 15.0f; // Additional time (in seconds) to wait per attachment -const F32 TELEPORT_EXPIRY_PER_ATTACHMENT = 3.f; +constexpr F32 TELEPORT_EXPIRY_PER_ATTACHMENT = 3.f; U32 gRecentFrameCount = 0; // number of 'recent' frames LLFrameTimer gRecentFPSTime; @@ -130,8 +130,6 @@ LLFrameTimer gRecentMemoryTime; LLFrameTimer gAssetStorageLogTime; // Rendering stuff -void pre_show_depth_buffer(); -void post_show_depth_buffer(); void render_ui(F32 zoom_factor = 1.f, int subfield = 0); void swap(); void render_hud_attachments(); @@ -212,14 +210,19 @@ void display_update_camera() F32 final_far = gAgentCamera.mDrawDistance; if (gCubeSnapshot) { - final_far = gSavedSettings.getF32("RenderReflectionProbeDrawDistance"); + static LLCachedControl<F32> reflection_probe_draw_distance(gSavedSettings, "RenderReflectionProbeDrawDistance", 64.f); + final_far = reflection_probe_draw_distance(); } else if (CAMERA_MODE_CUSTOMIZE_AVATAR == gAgentCamera.getCameraMode()) - { final_far *= 0.5f; } + else if (LLViewerTexture::sDesiredDiscardBias > 2.f) + { + final_far = llmax(32.f, final_far / (LLViewerTexture::sDesiredDiscardBias - 1.f)); + } LLViewerCamera::getInstance()->setFar(final_far); + LLVOAvatar::sRenderDistance = llclamp(final_far, 16.f, 256.f); gViewerWindow->setup3DRender(); if (!gCubeSnapshot) @@ -233,16 +236,19 @@ void display_update_camera() void display_stats() { LL_PROFILE_ZONE_SCOPED; - const F32 FPS_LOG_FREQUENCY = 10.f; + constexpr F32 FPS_LOG_FREQUENCY = 10.f; if (gRecentFPSTime.getElapsedTimeF32() >= FPS_LOG_FREQUENCY) { LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("DS - FPS"); + LLTrace::Recording& recording = LLTrace::get_frame_recording().getLastRecording(); + F64 normalized_session_jitter = recording.getLastValue(LLStatViewer::NOTRMALIZED_FRAMETIME_JITTER_SESSION); + F64 normalized_period_jitter = recording.getLastValue(LLStatViewer::NORMALIZED_FRAMTIME_JITTER_PERIOD); F32 fps = gRecentFrameCount / FPS_LOG_FREQUENCY; - LL_INFOS() << llformat("FPS: %.02f", fps) << LL_ENDL; + LL_INFOS() << llformat("FPS: %.02f SESSION JITTER: %.4f PERIOD JITTER: %.4f", fps, normalized_session_jitter, normalized_period_jitter) << LL_ENDL; gRecentFrameCount = 0; gRecentFPSTime.reset(); } - F32 mem_log_freq = gSavedSettings.getF32("MemoryLogFrequency"); + static LLCachedControl<F32> mem_log_freq(gSavedSettings, "MemoryLogFrequency", 600.f); if (mem_log_freq > 0.f && gRecentMemoryTime.getElapsedTimeF32() >= mem_log_freq) { LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("DS - Memory"); @@ -252,7 +258,7 @@ void display_stats() LLMemory::logMemoryInfo(true) ; gRecentMemoryTime.reset(); } - const F32 ASSET_STORAGE_LOG_FREQUENCY = 60.f; + constexpr F32 ASSET_STORAGE_LOG_FREQUENCY = 60.f; if (gAssetStorageLogTime.getElapsedTimeF32() >= ASSET_STORAGE_LOG_FREQUENCY) { LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("DS - Asset Storage"); @@ -407,6 +413,7 @@ static void update_tp_display(bool minimized) void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot) { LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("Render"); + LL_PROFILE_GPU_ZONE("Render"); LLPerfStats::RecordSceneTime T (LLPerfStats::StatType_t::RENDER_DISPLAY); // render time capture - This is the main stat for overall rendering. @@ -568,8 +575,10 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot) LLImageGL::updateStats(gFrameTimeSeconds); - LLVOAvatar::sRenderName = gSavedSettings.getS32("AvatarNameTagMode"); - LLVOAvatar::sRenderGroupTitles = (gSavedSettings.getBOOL("NameTagShowGroupTitles") && gSavedSettings.getS32("AvatarNameTagMode")); + static LLCachedControl<S32> avatar_name_tag_mode(gSavedSettings, "AvatarNameTagMode", 1); + static LLCachedControl<bool> name_tag_show_group_titles(gSavedSettings, "NameTagShowGroupTitles", true); + LLVOAvatar::sRenderName = avatar_name_tag_mode; + LLVOAvatar::sRenderGroupTitles = name_tag_show_group_titles && avatar_name_tag_mode > 0; gPipeline.mBackfaceCull = true; gFrameCount++; @@ -704,11 +713,14 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot) if (!gDisconnected && !LLApp::isExiting()) { + // =========== MIRRORS ============= + // Render mirrors and associated hero probes before we render the rest of the scene. // This ensures the scene state in the hero probes are exactly the same as the rest of the scene before we render it. if (gPipeline.RenderMirrors && !gSnapshot) { LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("Update hero probes"); + LL_PROFILE_GPU_ZONE("hero manager") gPipeline.mHeroProbeManager.update(); gPipeline.mHeroProbeManager.renderProbes(); } @@ -729,12 +741,14 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot) display_update_camera(); stop_glerror(); + // =========== ENV: SKY, WATER ============= { LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("Env Update"); // update all the sky/atmospheric/water settings LLEnvironment::instance().update(LLViewerCamera::getInstance()); } + // =========== EFFECTS (?) ============= // *TODO: merge these two methods { LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("HUD Update"); @@ -743,6 +757,7 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot) stop_glerror(); } + // =========== GEOMETRY ============= { LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("Update Geom"); const F32 max_geom_update_time = 0.005f*10.f*gFrameIntervalSeconds.value(); // 50 ms/second update time @@ -773,6 +788,8 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot) LLGLState::checkStates(); + // =========== OCCLUSION ============= + static LLCullResult result; LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD; LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater(); @@ -792,18 +809,24 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot) } gGL.setColorMask(true, true); - glClearColor(0,0,0,0); + glClearColor(0.f, 0.f, 0.f, 0.f); LLGLState::checkStates(); if (!for_snapshot) { - if (gFrameCount > 1 && !for_snapshot) - { //for some reason, ATI 4800 series will error out if you - //try to generate a shadow before the first frame is through + + // =========== SHADOWS ============= + + S32 RenderShadowDetail = gSavedSettings.getS32("RenderShadowDetail"); + + if(RenderShadowDetail > 0 && gFrameCount > 1) + { gPipeline.generateSunShadow(*LLViewerCamera::getInstance()); } + // =========== IMPOSTORS ============= + LLVertexBuffer::unbind(); LLGLState::checkStates(); @@ -827,6 +850,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot) glClear(GL_DEPTH_BUFFER_BIT); } + + // =========== IMAGES ============= + ////////////////////////////////////// // // Update images, using the image stats generated during object update/culling @@ -865,6 +891,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot) LLGLState::checkStates(); + + // =========== SORTING OBJECTS ============= + /////////////////////////////////// // // StateSort @@ -898,6 +927,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot) LLPipeline::sUseOcclusion = occlusion; + + // =========== SKY ============= + { LLAppViewer::instance()->pingMainloopTimeout("Display:Sky"); LL_PROFILE_ZONE_NAMED_CATEGORY_ENVIRONMENT("update sky"); //LL_RECORD_BLOCK_TIME(FTM_UPDATE_SKY); @@ -949,6 +981,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot) // gGL.popMatrix(); //} + + // =========== DEFERRED ============= + LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater(); LLGLState::checkStates(); @@ -957,10 +992,10 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot) gGL.setColorMask(true, true); - gPipeline.mRT->deferredScreen.bindTarget(); + gPipeline.mRT->deferredScreen.bindTarget("", 1); if (gUseWireframe) { - F32 g = 0.5f; + constexpr F32 g = 0.5f; glClearColor(g, g, g, 1.f); } else @@ -969,6 +1004,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot) } gPipeline.mRT->deferredScreen.clear(); + + // =========== RENDER GEOMETRY ============= + gGL.setColorMask(true, false); LLAppViewer::instance()->pingMainloopTimeout("Display:RenderGeom"); @@ -979,11 +1017,16 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot) LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("display - 5") LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD; - if (gSavedSettings.getBOOL("RenderDepthPrePass")) + + // =========== RENDER DEPTH PREPASS (UNUSED) ============= + + static LLCachedControl<bool> render_depth_pre_pass(gSavedSettings, "RenderDepthPrePass", false); + + if (render_depth_pre_pass) { gGL.setColorMask(false, false); - static const U32 types[] = { + constexpr U32 types[] = { LLRenderPass::PASS_SIMPLE, LLRenderPass::PASS_FULLBRIGHT, LLRenderPass::PASS_SHINY @@ -1004,6 +1047,8 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot) gPipeline.renderGeomDeferred(*LLViewerCamera::getInstance(), true); } + // =========== UNBIND TEXTURES ============= + { LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("Texture Unbind"); for (S32 i = 0; i < gGLManager.mNumTextureImageUnits; i++) @@ -1016,11 +1061,15 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot) } } + // =========== FLUSH ============= + LLAppViewer::instance()->pingMainloopTimeout("Display:RenderFlush"); LLRenderTarget &rt = (gPipeline.sRenderDeferred ? gPipeline.mRT->deferredScreen : gPipeline.mRT->screen); rt.flush(); + // =========== RENDER DEFERRED ============= + if (LLPipeline::sRenderDeferred) { gPipeline.renderDeferredLighting(); @@ -1033,10 +1082,14 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot) LLSceneMonitor::getInstance()->capture(); } + // =========== RENDER UI ============= + LLAppViewer::instance()->pingMainloopTimeout("Display:RenderUI"); if (!for_snapshot) { + gGL.flush(); render_ui(); + gGL.flush(); swap(); } @@ -1047,8 +1100,6 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot) LLAppViewer::instance()->pingMainloopTimeout("Display:FrameStats"); - stop_glerror(); - display_stats(); LLAppViewer::instance()->pingMainloopTimeout("Display:Done"); @@ -1197,8 +1248,8 @@ void display_cube_face() gGL.setColorMask(true, true); - glClearColor(0, 0, 0, 0); - gPipeline.generateSunShadow(*LLViewerCamera::getInstance()); + glClearColor(0.f, 0.f, 0.f, 0.f); + //gPipeline.generateSunShadow(*LLViewerCamera::getInstance()); glClear(GL_DEPTH_BUFFER_BIT); // | GL_STENCIL_BUFFER_BIT); @@ -1226,14 +1277,14 @@ void display_cube_face() gGL.setColorMask(true, true); - gPipeline.mRT->deferredScreen.bindTarget(); + gPipeline.mRT->deferredScreen.bindTarget("", 1); if (gUseWireframe) { glClearColor(0.5f, 0.5f, 0.5f, 1.f); } else { - glClearColor(1, 0, 1, 1); + glClearColor(1.f, 0.f, 1.f, 1.f); } gPipeline.mRT->deferredScreen.clear(); @@ -1274,11 +1325,12 @@ void render_hud_attachments() { LLPipeline::sRenderingHUDs = true; LLCamera hud_cam = *LLViewerCamera::getInstance(); - hud_cam.setOrigin(-1.f,0,0); - hud_cam.setAxes(LLVector3(1,0,0), LLVector3(0,1,0), LLVector3(0,0,1)); + hud_cam.setOrigin(-1.f, 0.f, 0.f); + hud_cam.setAxes(LLVector3(1.f, 0.f, 0.f), LLVector3(0.f, 1.f, 0.f), LLVector3(0.f, 0.f, 1.f)); LLViewerCamera::updateFrustumPlanes(hud_cam, true); - bool render_particles = gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_PARTICLES) && gSavedSettings.getBOOL("RenderHUDParticles"); + static LLCachedControl<bool> render_hud_particles(gSavedSettings, "RenderHUDParticles", false); + bool render_particles = gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_PARTICLES) && render_hud_particles; //only render hud objects gPipeline.pushRenderTypeMask(); @@ -1341,7 +1393,7 @@ void render_hud_attachments() gPipeline.stateSort(hud_cam, result); - gPipeline.renderGeomPostDeferred(hud_cam); + gPipeline.renderGeomPostDeferredOnlyHud(hud_cam); LLSpatialGroup::sNoDelete = false; //gPipeline.clearReferences(); @@ -1486,6 +1538,7 @@ void render_ui(F32 zoom_factor, int subfield) { LLGLState::checkStates(); + gPipeline.disableLights(); LL_PROFILE_ZONE_NAMED_CATEGORY_UI("HUD"); render_hud_elements(); @@ -1505,7 +1558,8 @@ void render_ui(F32 zoom_factor, int subfield) { if (!gDisconnected) { - LL_PROFILE_ZONE_NAMED_CATEGORY_UI("UI 3D"); //LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_3D); + LL_PROFILE_ZONE_NAMED_CATEGORY_UI("UI 3D"); + LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_3D); LLGLState::checkStates(); render_ui_3d(); LLGLState::checkStates(); @@ -1515,10 +1569,16 @@ void render_ui(F32 zoom_factor, int subfield) render_disconnected_background(); } } + else + { + // Make sure particle effects disappear + LLHUDObject::renderAllForTimer(); + } if (render_ui) { - LL_PROFILE_ZONE_NAMED_CATEGORY_UI("UI 2D"); //LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_2D); + LL_PROFILE_ZONE_NAMED_CATEGORY_UI("UI 2D"); + LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_2D); LLHUDObject::renderAll(); render_ui_2d(); } @@ -1638,10 +1698,11 @@ void render_ui_3d() stop_glerror(); gUIProgram.bind(); - gGL.color4f(1, 1, 1, 1); + gGL.color4f(1.f, 1.f, 1.f, 1.f); // Coordinate axes - if (gSavedSettings.getBOOL("ShowAxes")) + static LLCachedControl<bool> show_axes(gSavedSettings, "ShowAxes"); + if (show_axes()) { draw_axes(); } @@ -1661,7 +1722,7 @@ void render_ui_3d() LLHUDObject::renderAllForTimer(); } - stop_glerror(); + LOG_GLERROR("render_ui_3d()"); } void render_ui_2d() @@ -1703,7 +1764,7 @@ void render_ui_2d() gGL.pushMatrix(); S32 half_width = (gViewerWindow->getWorldViewWidthScaled() / 2); S32 half_height = (gViewerWindow->getWorldViewHeightScaled() / 2); - gGL.scalef(LLUI::getScaleFactor().mV[0], LLUI::getScaleFactor().mV[1], 1.f); + gGL.scalef(LLUI::getScaleFactor().mV[VX], LLUI::getScaleFactor().mV[VY], 1.f); gGL.translatef((F32)half_width, (F32)half_height, 0.f); F32 zoom = gAgentCamera.mHUDCurZoom; gGL.scalef(zoom,zoom,1.f); @@ -1711,7 +1772,7 @@ void render_ui_2d() gl_rect_2d(-half_width, half_height, half_width, -half_height, false); gGL.popMatrix(); gUIProgram.unbind(); - stop_glerror(); + LOG_GLERROR(""); } @@ -1722,10 +1783,10 @@ void render_ui_2d() LLView::sIsRectDirty = false; LLRect t_rect; - gPipeline.mUIScreen.bindTarget(); + gPipeline.mUIScreen.bindTarget("", 1); gGL.setColorMask(true, true); { - static const S32 pad = 8; + constexpr S32 pad = 8; LLView::sDirtyRect.mLeft -= pad; LLView::sDirtyRect.mRight += pad; @@ -1778,17 +1839,17 @@ void render_ui_2d() gViewerWindow->draw(); } - - // reset current origin for font rendering, in case of tiling render LLFontGL::sCurOrigin.set(0, 0); + + LOG_GLERROR("render_ui_2d()"); } void render_disconnected_background() { gUIProgram.bind(); - gGL.color4f(1,1,1,1); + gGL.color4f(1.f, 1.f, 1.f, 1.f); if (!gDisconnectedImagep && gDisconnected) { LL_INFOS() << "Loading last bitmap..." << LL_ENDL; @@ -1828,7 +1889,7 @@ void render_disconnected_background() raw->expandToPowerOfTwo(); - gDisconnectedImagep = LLViewerTextureManager::getLocalTexture(raw.get(), false ); + gDisconnectedImagep = LLViewerTextureManager::getLocalTexture(raw.get(), false); gStartTexture = gDisconnectedImagep; gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } @@ -1863,6 +1924,5 @@ void render_disconnected_background() void display_cleanup() { - gDisconnectedImagep = NULL; + gDisconnectedImagep = nullptr; } - diff --git a/indra/newview/llviewerdisplayname.cpp b/indra/newview/llviewerdisplayname.cpp index 243d4dec0e..c174c495ec 100644 --- a/indra/newview/llviewerdisplayname.cpp +++ b/indra/newview/llviewerdisplayname.cpp @@ -104,9 +104,9 @@ void LLViewerDisplayName::setDisplayNameCoro(const std::string& cap_url, const L { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("SetDisplayNameCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("SetDisplayNameCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpHeaders::ptr_t httpHeaders = std::make_shared<LLCore::HttpHeaders>(); // People API can return localized error messages. Indicate our // language preference via header. diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index c56b7073b7..fca15d2e79 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -21,6 +21,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -38,8 +39,8 @@ #include "llfloateraddpaymentmethod.h" #include "llfloaterauction.h" #include "llfloaterautoreplacesettings.h" -#include "llfloateravatar.h" #include "llfloateravatarpicker.h" +#include "llfloateravatarwelcomepack.h" #include "llfloateravatarrendersettings.h" #include "llfloateravatartextures.h" #include "llfloaterbanduration.h" @@ -58,6 +59,7 @@ #include "llfloatercamera.h" #include "llfloatercamerapresets.h" #include "llfloaterchangeitemthumbnail.h" +#include "llfloaterchatmentionpicker.h" #include "llfloaterchatvoicevolume.h" #include "llfloaterclassified.h" #include "llfloaterconversationlog.h" @@ -65,6 +67,7 @@ #include "llfloatercreatelandmark.h" #include "llfloaterdeleteprefpreset.h" #include "llfloaterdestinations.h" +#include "llfloaterdirectory.h" #include "llfloaterdisplayname.h" #include "llfloatereditextdaycycle.h" #include "llfloateremojipicker.h" @@ -98,6 +101,7 @@ #include "llfloaterlinkreplace.h" #include "llfloaterloadprefpreset.h" #include "llfloatermap.h" +#include "llfloatermarketplace.h" #include "llfloatermarketplacelistings.h" #include "llfloatermediasettings.h" #include "llfloatermemleak.h" @@ -138,6 +142,7 @@ #include "llfloatersettingscolor.h" #include "llfloatersettingsdebug.h" #include "llfloatersidepanelcontainer.h" +#include "llfloaterslapptest.h" #include "llfloatersnapshot.h" #include "llfloatersounddevices.h" #include "llfloaterspellchecksettings.h" @@ -176,8 +181,7 @@ #include "llpreviewtexture.h" #include "llscriptfloater.h" #include "llsyswellwindow.h" - -#include "fsfloatersearch.h" +#include "rlvfloaters.h" // *NOTE: Please add files in alphabetical order to keep merges easy. @@ -230,7 +234,8 @@ public: "upload_model", "upload_script", "upload_sound", - "bulk_upload" + "bulk_upload", + "legacy_search" }; return std::find(blacklist_clicked.begin(), blacklist_clicked.end(), fl_name) == blacklist_clicked.end(); } @@ -281,7 +286,9 @@ public: "upload_model", "upload_script", "upload_sound", - "bulk_upload" + "bulk_upload", + "slapp_test", + "legacy_search" }; return std::find(blacklist_untrusted.begin(), blacklist_untrusted.end(), fl_name) == blacklist_untrusted.end(); } @@ -331,8 +338,8 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("appearance", "floater_my_appearance.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>); LLFloaterReg::add("associate_listing", "floater_associate_listing.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAssociateListing>); LLFloaterReg::add("auction", "floater_auction.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAuction>); - LLFloaterReg::add("avatar", "floater_avatar.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatar>); LLFloaterReg::add("avatar_picker", "floater_avatar_picker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarPicker>); + LLFloaterReg::add("avatar_welcome_pack", "floater_avatar_welcome_pack.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarWelcomePack>); LLFloaterReg::add("avatar_render_settings", "floater_avatar_render_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarRenderSettings>); LLFloaterReg::add("avatar_textures", "floater_avatar_textures.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarTextures>); @@ -354,6 +361,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("chat_voice", "floater_voice_chat_volume.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChatVoiceVolume>); LLFloaterReg::add("change_item_thumbnail", "floater_change_item_thumbnail.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChangeItemThumbnail>); LLFloaterReg::add("nearby_chat", "floater_im_session.xml", (LLFloaterBuildFunc)&LLFloaterIMNearbyChat::buildFloater); + LLFloaterReg::add("chat_mention_picker", "floater_chat_mention_picker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChatMentionPicker>); LLFloaterReg::add("classified", "floater_classified.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterClassified>); LLFloaterReg::add("compile_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCompileQueue>); LLFloaterReg::add("conversation", "floater_conversation_log.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterConversationLog>); @@ -421,6 +429,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("mem_leaking", "floater_mem_leaking.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMemLeak>); LLFloaterReg::add("media_settings", "floater_media_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMediaSettings>); + LLFloaterReg::add("marketplace", "floater_marketplace.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMarketplace>); LLFloaterReg::add("marketplace_listings", "floater_marketplace_listings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMarketplaceListings>); LLFloaterReg::add("marketplace_validation", "floater_marketplace_validation.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMarketplaceValidation>); LLFloaterReg::add("message_critical", "floater_critical.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTOS>); @@ -486,6 +495,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("region_debug_console", "floater_region_debug_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRegionDebugConsole>); LLFloaterReg::add("region_info", "floater_region_info.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRegionInfo>); LLFloaterReg::add("region_restarting", "floater_region_restarting.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRegionRestarting>); + LLFloaterReg::add("rlv_console", "floater_rlv_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<Rlv::FloaterConsole>); LLFloaterReg::add("script_debug", "floater_script_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebug>); LLFloaterReg::add("script_debug_output", "floater_script_debug_panel.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebugOutput>); @@ -502,10 +512,11 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("stop_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotRunQueue>); LLFloaterReg::add("snapshot", "floater_snapshot.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSnapshot>); LLFloaterReg::add("simple_snapshot", "floater_simple_snapshot.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSimpleSnapshot>); - LLFloaterReg::add("search", "floater_fs_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterSearch>); - //LLFloaterReg::add("search", "floater_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSearch>); + LLFloaterReg::add("search", "floater_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSearch>); + LLFloaterReg::add("legacy_search", "floater_directory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDirectory>); LLFloaterReg::add("profile", "floater_profile.xml",(LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterProfile>); LLFloaterReg::add("guidebook", "floater_how_to.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHowTo>); + LLFloaterReg::add("slapp_test", "floater_test_slapp.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSLappTest>); LLFloaterReg::add("big_preview", "floater_big_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBigPreview>); diff --git a/indra/newview/llviewerinput.cpp b/indra/newview/llviewerinput.cpp index ffcbd1b4d8..3c79f0b21c 100644 --- a/indra/newview/llviewerinput.cpp +++ b/indra/newview/llviewerinput.cpp @@ -48,9 +48,6 @@ #include "llinitparam.h" #include "llselectmgr.h" -#include "llfloaterwebcontent.h" -#include "fsfloatersearch.h" - // // Constants // @@ -66,13 +63,13 @@ const LLKeyData agent_control_lbutton(CLICK_LEFT, KEY_NONE, MASK_NONE, true); struct LLKeybindFunctionData { - LLKeybindFunctionData(boost::function<bool(EKeystate keystate)> function, bool global) + LLKeybindFunctionData(std::function<bool(EKeystate keystate)> function, bool global) : mFunction(function), mIsGlobal(global) { } - boost::function<bool(EKeystate keystate)> mFunction; + std::function<bool(EKeystate keystate)> mFunction; // todo: might be good idea to make this into enum, like: global/inworld/menu bool mIsGlobal; }; @@ -651,12 +648,6 @@ bool start_chat( EKeystate s ) bool start_gesture( EKeystate s ) { - LLFloater* focused_floater = gFloaterView->getFocusedFloater(); - if (focused_floater && (dynamic_cast<LLFloaterWebContent*>(focused_floater) || dynamic_cast<FSFloaterSearch*>(focused_floater))) - { - return true; - } - LLUICtrl* focus_ctrlp = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus()); if (KEYSTATE_UP == s && ! (focus_ctrlp && focus_ctrlp->acceptsTextInput())) @@ -1174,8 +1165,8 @@ bool LLViewerInput::handleGlobalBindsMouse(EMouseClickType clicktype, MASK mask, bool LLViewerInput::bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name) { size_t index; - typedef boost::function<bool(EKeystate)> function_t; - function_t function = NULL; + typedef std::function<bool(EKeystate)> function_t; + function_t function = nullptr; std::string name; // Allow remapping of F2-F12 @@ -1264,8 +1255,8 @@ bool LLViewerInput::bindKey(const S32 mode, const KEY key, const MASK mask, cons bool LLViewerInput::bindMouse(const S32 mode, const EMouseClickType mouse, const MASK mask, const std::string& function_name) { size_t index; - typedef boost::function<bool(EKeystate)> function_t; - function_t function = NULL; + typedef std::function<bool(EKeystate)> function_t; + function_t function = nullptr; if (mouse == CLICK_LEFT && mask == MASK_NONE diff --git a/indra/newview/llviewerinput.h b/indra/newview/llviewerinput.h index 50b2c4ab9f..80ba99e201 100644 --- a/indra/newview/llviewerinput.h +++ b/indra/newview/llviewerinput.h @@ -38,7 +38,7 @@ class LLWindow; class LLNamedFunction { public: - LLNamedFunction() : mFunction(NULL) { }; + LLNamedFunction() : mFunction(nullptr) { }; ~LLNamedFunction() { }; std::string mName; diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index e2022cae37..efa3f5cd1e 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -71,6 +71,9 @@ #include "llclipboard.h" #include "llhttpretrypolicy.h" #include "llsettingsvo.h" +#include "llinventorylistener.h" + +LLInventoryListener sInventoryListener; // do-nothing ops for use in callbacks. void no_op_inventory_func(const LLUUID&) {} @@ -416,7 +419,9 @@ void LLViewerInventoryItem::updateServer(bool is_new) const << LL_ENDL; return; } - if(gAgent.getID() != mPermissions.getOwner()) + LLUUID owner = mPermissions.getOwner(); + if(gAgent.getID() != owner + && owner.notNull()) // incomplete? { // *FIX: deal with this better. LL_WARNS(LOG_INV) << "LLViewerInventoryItem::updateServer() - for unowned item " @@ -486,7 +491,7 @@ void LLViewerInventoryItem::fetchFromServer(void) const body["items"][0]["owner_id"] = mPermissions.getOwner(); body["items"][0]["item_id"] = mUUID; - LLCore::HttpHandler::ptr_t handler(new LLInventoryModel::FetchItemHttpHandler(body)); + LLCore::HttpHandler::ptr_t handler = std::make_shared<LLInventoryModel::FetchItemHttpHandler>(body); gInventory.requestPost(true, url, body, handler, "Inventory Item"); } } @@ -751,27 +756,30 @@ S32 LLViewerInventoryCategory::getViewerDescendentCount() const return descendents_actual; } -LLSD LLViewerInventoryCategory::exportLLSD() const +void LLViewerInventoryCategory::exportLLSD(LLSD & cat_data) const { - LLSD cat_data = LLInventoryCategory::exportLLSD(); + LLInventoryCategory::exportLLSD(cat_data); cat_data[INV_OWNER_ID] = mOwnerID; cat_data[INV_VERSION] = mVersion; - - return cat_data; } -bool LLViewerInventoryCategory::importLLSD(const LLSD& cat_data) +bool LLViewerInventoryCategory::importLLSD(const std::string& label, const LLSD& value) { - LLInventoryCategory::importLLSD(cat_data); - if (cat_data.has(INV_OWNER_ID)) + if (LLInventoryCategory::importLLSD(label, value)) { - mOwnerID = cat_data[INV_OWNER_ID].asUUID(); + return true; } - if (cat_data.has(INV_VERSION)) + else if (label == INV_OWNER_ID) { - setVersion(cat_data[INV_VERSION].asInteger()); + mOwnerID = value.asUUID(); + return true; } - return true; + else if (label == INV_VERSION) + { + setVersion(value.asInteger()); + return true; + } + return false; } bool LLViewerInventoryCategory::acceptItem(LLInventoryItem* inv_item) @@ -966,7 +974,7 @@ void LLInventoryCallbackManager::fire(U32 callback_id, const LLUUID& item_id) } } -void rez_attachment_cb(const LLUUID& inv_item, LLViewerJointAttachment *attachmentp) +void rez_attachment_cb(const LLUUID& inv_item, LLViewerJointAttachment *attachmentp, bool replace) { if (inv_item.isNull()) return; @@ -974,7 +982,7 @@ void rez_attachment_cb(const LLUUID& inv_item, LLViewerJointAttachment *attachme LLViewerInventoryItem *item = gInventory.getItem(inv_item); if (item) { - rez_attachment(item, attachmentp); + rez_attachment(item, attachmentp, replace); } } @@ -1436,7 +1444,8 @@ void update_inventory_category( if(obj) { if (LLFolderType::lookupIsProtectedType(obj->getPreferredType()) - && (updates.size() != 1 || !updates.has("thumbnail"))) + && (updates.size() != 1 + || !(updates.has("thumbnail") || updates.has("favorite")))) { LLNotificationsUtil::add("CannotModifyProtectedCategories"); return; @@ -1703,7 +1712,7 @@ void create_new_item(const std::string& name, LLAssetType::EType asset_type, LLInventoryType::EType inv_type, U32 next_owner_perm, - std::function<void(const LLUUID&)> created_cb = NULL) + std::function<void(const LLUUID&)> created_cb = nullptr) { std::string desc; LLViewerAssetType::generateDescriptionFor(asset_type, desc); @@ -1827,7 +1836,7 @@ void menu_create_inventory_item(LLInventoryPanel* panel, LLUUID dest_id, const L parent_id = gInventory.getRootFolderID(); } - std::function<void(const LLUUID&)> callback_cat_created = NULL; + std::function<void(const LLUUID&)> callback_cat_created = nullptr; if (panel) { LLHandle<LLPanel> handle = panel->getHandle(); diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 21a6606253..a42bdaa2b0 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -232,8 +232,8 @@ public: // How many descendents do we currently have information for in the InventoryModel? S32 getViewerDescendentCount() const; - LLSD exportLLSD() const; - bool importLLSD(const LLSD& cat_data); + virtual void exportLLSD(LLSD &sd) const; + virtual bool importLLSD(const std::string& label, const LLSD& value); void determineFolderType(); void changeType(LLFolderType::EType new_folder_type); @@ -264,7 +264,7 @@ public: class LLViewerJointAttachment; -void rez_attachment_cb(const LLUUID& inv_item, LLViewerJointAttachment *attachmentp); +void rez_attachment_cb(const LLUUID& inv_item, LLViewerJointAttachment *attachmentp, bool replace); void activate_gesture_cb(const LLUUID& inv_item); @@ -284,9 +284,9 @@ private: LLUUID mTargetLandmarkId; }; -typedef boost::function<void(const LLUUID&)> inventory_func_type; -typedef boost::function<void(const LLSD&)> llsd_func_type; -typedef boost::function<void()> nullary_func_type; +typedef std::function<void(const LLUUID&)> inventory_func_type; +typedef std::function<void(const LLSD&)> llsd_func_type; +typedef std::function<void()> nullary_func_type; void no_op_inventory_func(const LLUUID&); // A do-nothing inventory_func void no_op_llsd_func(const LLSD&); // likewise for LLSD @@ -470,7 +470,7 @@ void menu_create_inventory_item(LLInventoryPanel* root, const LLSD& userdata, const LLUUID& default_parent_uuid = LLUUID::null); -void menu_create_inventory_item(LLInventoryPanel* panel, LLUUID dest_id, const LLSD& userdata, const LLUUID& default_parent_uuid = LLUUID::null, std::function<void(const LLUUID&)> folder_created_cb = NULL); +void menu_create_inventory_item(LLInventoryPanel* panel, LLUUID dest_id, const LLSD& userdata, const LLUUID& default_parent_uuid = LLUUID::null, std::function<void(const LLUUID&)> folder_created_cb = nullptr); void slam_inventory_folder(const LLUUID& folder_id, const LLSD& contents, diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp index 7543fb3743..c4d87d7e16 100644 --- a/indra/newview/llviewerjoystick.cpp +++ b/indra/newview/llviewerjoystick.cpp @@ -36,7 +36,6 @@ #include "lltoolmgr.h" #include "llselectmgr.h" #include "llviewermenu.h" -#include "llviewerwindow.h" #include "llwindow.h" #include "llagent.h" #include "llagentcamera.h" @@ -144,7 +143,7 @@ BOOL CALLBACK di8_devices_callback(LPCDIDEVICEINSTANCE device_instance_ptr, LPVO // Capable of detecting devices like Oculus Rift if (device_instance_ptr) { - std::string product_name = utf16str_to_utf8str(llutf16string(device_instance_ptr->tszProductName)); + std::string product_name = ll_convert<std::string>(std::wstring(device_instance_ptr->tszProductName)); LLSD guid = LLViewerJoystick::getInstance()->getDeviceUUID(); @@ -211,7 +210,7 @@ BOOL CALLBACK di8_devices_callback(LPCDIDEVICEINSTANCE device_instance_ptr, LPVO // This is GUID2 so teoretically it can be memcpy copied into LLUUID void guid_from_string(GUID &guid, const std::string &input) { - CLSIDFromString(utf8str_to_utf16str(input).c_str(), &guid); + CLSIDFromString(ll_convert<std::wstring>(input).c_str(), &guid); } std::string string_from_guid(const GUID &guid) @@ -221,7 +220,7 @@ std::string string_from_guid(const GUID &guid) // use guidString... - std::string res = utf16str_to_utf8str(llutf16string(guidString)); + std::string res = ll_convert<std::string>(std::wstring(guidString)); // ensure memory is freed ::CoTaskMemFree(guidString); @@ -881,6 +880,10 @@ void LLViewerJoystick::moveObjects(bool reset) { gAgent.clearAFK(); } + else + { + gAwayTriggerTimer.reset(); + } if (sDelta[0] || sDelta[1] || sDelta[2]) { @@ -1055,6 +1058,10 @@ void LLViewerJoystick::moveAvatar(bool reset) { gAgent.clearAFK(); } + else + { + gAwayTriggerTimer.reset(); + } setCameraNeedsUpdate(true); } @@ -1153,7 +1160,7 @@ void LLViewerJoystick::moveAvatar(bool reset) void LLViewerJoystick::moveFlycam(bool reset) { static LLQuaternion sFlycamRotation; - static LLVector3 sFlycamPosition; + static LLVector3d sFlycamPosition; static F32 sFlycamZoom; if (!gFocusMgr.getAppHasFocus() || mDriverState != JDS_INITIALIZED @@ -1176,7 +1183,7 @@ void LLViewerJoystick::moveFlycam(bool reset) bool in_build_mode = LLToolMgr::getInstance()->inBuildMode(); if (reset || mResetFlag) { - sFlycamPosition = LLViewerCamera::getInstance()->getOrigin(); + sFlycamPosition = gAgentCamera.getCameraPositionGlobal(); sFlycamRotation = LLViewerCamera::getInstance()->getQuaternion(); sFlycamZoom = LLViewerCamera::getInstance()->getView(); @@ -1267,12 +1274,19 @@ void LLViewerJoystick::moveFlycam(bool reset) } // Clear AFK state if moved beyond the deadzone - if (!is_zero && gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME) + if (!is_zero) + { + if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME) { gAgent.clearAFK(); } + else + { + gAwayTriggerTimer.reset(); + } + } - sFlycamPosition += LLVector3(sDelta) * sFlycamRotation; + sFlycamPosition += LLVector3d(sDelta[VX], sDelta[VY], sDelta[VZ]) * sFlycamRotation; LLMatrix3 rot_mat(sDelta[3], sDelta[4], sDelta[5]); sFlycamRotation = LLQuaternion(rot_mat)*sFlycamRotation; @@ -1307,7 +1321,8 @@ void LLViewerJoystick::moveFlycam(bool reset) LLMatrix3 mat(sFlycamRotation); LLViewerCamera::getInstance()->setView(sFlycamZoom); - LLViewerCamera::getInstance()->setOrigin(sFlycamPosition); + LLVector3 new_camera_pos = gAgent.getPosAgentFromGlobal(sFlycamPosition); + LLViewerCamera::getInstance()->setOrigin(new_camera_pos); LLViewerCamera::getInstance()->mXAxis = LLVector3(mat.mMatrix[0]); LLViewerCamera::getInstance()->mYAxis = LLVector3(mat.mMatrix[1]); LLViewerCamera::getInstance()->mZAxis = LLVector3(mat.mMatrix[2]); @@ -1331,6 +1346,10 @@ bool LLViewerJoystick::toggleFlycam() { gAgent.clearAFK(); } + else + { + gAwayTriggerTimer.reset(); + } mOverrideCamera = !mOverrideCamera; if (mOverrideCamera) diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 569924298f..330aa7c368 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -83,6 +83,8 @@ extern bool gCubeSnapshot; // *TODO: Consider enabling mipmaps (they have been disabled for a long time). Likely has a significant performance impact for tiled/high texture repeat media. Mip generation in a shader may also be an option if necessary. constexpr bool USE_MIPMAPS = false; +constexpr S32 MAX_MEDIA_INSTANCES_DEFAULT = 8; +constexpr S32 MEDIA_INSTANCES_MIN_LIMIT = 6; // 4 'permanent' floaters plus reserve for dynamic ones void init_threaded_picker_load_dialog(LLPluginClassMedia* plugin, LLFilePicker::ELoadFilter filter, bool get_multiple) { @@ -214,6 +216,7 @@ static bool sViewerMediaMuteListObserverInitialized = false; LLViewerMedia::LLViewerMedia(): mAnyMediaShowing(false), mAnyMediaPlaying(false), +mMaxIntances(MAX_MEDIA_INSTANCES_DEFAULT), mSpareBrowserMediaSource(NULL) { } @@ -222,6 +225,7 @@ LLViewerMedia::~LLViewerMedia() { gIdleCallbacks.deleteFunction(LLViewerMedia::onIdle, NULL); mTeleportFinishConnection.disconnect(); + mMaxInstancesConnection.disconnect(); if (mSpareBrowserMediaSource != NULL) { delete mSpareBrowserMediaSource; @@ -235,6 +239,35 @@ void LLViewerMedia::initSingleton() gIdleCallbacks.addFunction(LLViewerMedia::onIdle, NULL); mTeleportFinishConnection = LLViewerParcelMgr::getInstance()-> setTeleportFinishedCallback(boost::bind(&LLViewerMedia::onTeleportFinished, this)); + + LLControlVariable* ctrl = gSavedSettings.getControl("PluginInstancesTotal"); + if (ctrl) + { + setMaxInstances(ctrl->getValue().asInteger()); + mMaxInstancesConnection = ctrl->getSignal()->connect([this](LLControlVariable* control, const LLSD& new_val, const LLSD& old_val) + { + setMaxInstances(new_val.asInteger()); + }); + } + else + { + setMaxInstances(MAX_MEDIA_INSTANCES_DEFAULT); + } +} + +void LLViewerMedia::setMaxInstances(S32 max_instances) +{ + const F32Gigabytes MIN_PHYSICAL_MEMORY(8); + LLMemory::updateMemoryInfo(); + F32Gigabytes physical_mem = LLMemory::getMaxMemKB(); + if (MIN_PHYSICAL_MEMORY > physical_mem) + { + mMaxIntances = llmax(max_instances - 2, MEDIA_INSTANCES_MIN_LIMIT); + } + else + { + mMaxIntances = llmax(max_instances, MEDIA_INSTANCES_MIN_LIMIT); + } } ////////////////////////////////////////////////////////////////////////////////////////// @@ -397,7 +430,7 @@ std::string LLViewerMedia::getCurrentUserAgent() // This was also helpful: // http://www.mozilla.org/build/revised-user-agent-strings.html std::ostringstream codec; - codec << "Megapahit/"; + codec << "SecondLife/"; codec << LLVersionInfo::instance().getVersion(); codec << " (" << channel << "; " << skin_name << " skin)"; LL_INFOS() << codec.str() << LL_ENDL; @@ -688,7 +721,6 @@ void LLViewerMedia::updateMedia(void *dummy_arg) static LLCachedControl<bool> inworld_media_enabled(gSavedSettings, "AudioStreamingMedia", true); static LLCachedControl<bool> inworld_audio_enabled(gSavedSettings, "AudioStreamingMusic", true); - static LLCachedControl<U32> max_instances(gSavedSettings, "PluginInstancesTotal", 8); static LLCachedControl<U32> max_normal(gSavedSettings, "PluginInstancesNormal", 2); static LLCachedControl<U32> max_low(gSavedSettings, "PluginInstancesLow", 4); static LLCachedControl<F32> max_cpu(gSavedSettings, "PluginInstancesCPULimit", 0.9); @@ -709,7 +741,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg) LLPluginClassMedia::EPriority new_priority = LLPluginClassMedia::PRIORITY_NORMAL; - if(pimpl->isForcedUnloaded() || (impl_count_total >= (int)max_instances)) + if(pimpl->isForcedUnloaded() || (impl_count_total >= mMaxIntances)) { // Never load muted or failed impls. // Hard limit on the number of instances that will be loaded at one time @@ -869,7 +901,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg) sLowestLoadableImplInterest = 0.0f; // Only do this calculation if we've hit the impl count limit -- up until that point we always need to load media data. - if(lowest_interest_loadable && (impl_count_total >= (int)max_instances)) + if(lowest_interest_loadable && (impl_count_total >= mMaxIntances)) { // Get the interest value of this impl's object for use by isInterestingEnough LLVOVolume *object = lowest_interest_loadable->getSomeObject(); @@ -1191,7 +1223,7 @@ bool LLViewerMedia::parseRawCookie(const std::string raw_cookie, std::string& na ///////////////////////////////////////////////////////////////////////////////////////// LLCore::HttpHeaders::ptr_t LLViewerMedia::getHttpHeaders() { - LLCore::HttpHeaders::ptr_t headers(new LLCore::HttpHeaders); + LLCore::HttpHeaders::ptr_t headers = std::make_shared<LLCore::HttpHeaders>(); headers->append(HTTP_OUT_HEADER_ACCEPT, "*/*"); headers->append(HTTP_OUT_HEADER_CONTENT_TYPE, HTTP_CONTENT_XML); @@ -1201,6 +1233,54 @@ LLCore::HttpHeaders::ptr_t LLViewerMedia::getHttpHeaders() return headers; } +bool LLViewerMedia::getOpenIDCookie(LLMediaCtrl* media_instance) const +{ + if (mOpenIDCookie.empty()) + { + return false; + } + + std::string authority = mOpenIDURL.mAuthority; + std::string::size_type hostStart = authority.find('@'); + if (hostStart == std::string::npos) + { + // no username/password + hostStart = 0; + } + else + { + // Hostname starts after the @. + // (If the hostname part is empty, this may put host_start at the end of the string. In that case, it will end up passing through an empty hostname, which is correct.) + ++hostStart; + } + std::string::size_type hostEnd = authority.rfind(':'); + if ((hostEnd == std::string::npos) || (hostEnd < hostStart)) + { + // no port + hostEnd = authority.size(); + } + + std::string cookie_host = authority.substr(hostStart, hostEnd - hostStart); + std::string cookie_name = ""; + std::string cookie_value = ""; + std::string cookie_path = ""; + bool httponly = true; + bool secure = true; + if (!parseRawCookie(mOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure)) + { + return false; + } + std::string cefUrl(std::string(mOpenIDURL.mURI) + "://" + std::string(mOpenIDURL.mAuthority)); + if (media_instance && media_instance->getMediaPlugin()) + { + media_instance->getMediaPlugin()->setCookie(cefUrl, cookie_name, cookie_value, cookie_host, + cookie_path, httponly, secure); + + media_instance->getMediaPlugin()->storeOpenIDCookie(cefUrl, cookie_name, cookie_value, + cookie_host, cookie_path, httponly, secure); + } + return true; +} ///////////////////////////////////////////////////////////////////////////////////////// void LLViewerMedia::setOpenIDCookie(const std::string& url) @@ -1219,10 +1299,10 @@ void LLViewerMedia::getOpenIDCookieCoro(std::string url) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getOpenIDCookieCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); - LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("getOpenIDCookieCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); + LLCore::HttpHeaders::ptr_t httpHeaders = std::make_shared<LLCore::HttpHeaders>(); httpOpts->setFollowRedirects(true); httpOpts->setWantHeaders(true); @@ -1259,35 +1339,50 @@ void LLViewerMedia::getOpenIDCookieCoro(std::string url) { LLAppViewer::instance()->postToMainCoro([=]() { - LLMediaCtrl* media_instance = LLFloaterReg::getInstance("destinations")->getChild<LLMediaCtrl>("destination_guide_contents"); - if (media_instance) + std::string cookie_host = authority.substr(hostStart, hostEnd - hostStart); + std::string cookie_name = ""; + std::string cookie_value = ""; + std::string cookie_path = ""; + bool httponly = true; + bool secure = true; + + LLViewerMedia* inst = getInstance(); + if (parseRawCookie(inst->mOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure)) { - LLViewerMedia* inst = getInstance(); - std::string cookie_host = authority.substr(hostStart, hostEnd - hostStart); - std::string cookie_name = ""; - std::string cookie_value = ""; - std::string cookie_path = ""; - bool httponly = true; - bool secure = true; - if (inst->parseRawCookie(inst->mOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure) && - media_instance->getMediaPlugin()) - { - // MAINT-5711 - inexplicably, the CEF setCookie function will no longer set the cookie if the - // url and domain are not the same. This used to be my.sl.com and id.sl.com respectively and worked. - // For now, we use the URL for the OpenID POST request since it will have the same authority - // as the domain field. - // (Feels like there must be a less dirty way to construct a URL from component LLURL parts) - // MAINT-6392 - Rider: Do not change, however, the original URI requested, since it is used further - // down. - std::string cefUrl(std::string(inst->mOpenIDURL.mURI) + "://" + std::string(inst->mOpenIDURL.mAuthority)); + // MAINT-5711 - inexplicably, the CEF setCookie function will no longer set the cookie if the + // url and domain are not the same. This used to be my.sl.com and id.sl.com respectively and worked. + // For now, we use the URL for the OpenID POST request since it will have the same authority + // as the domain field. + // (Feels like there must be a less dirty way to construct a URL from component LLURL parts) + // MAINT-6392 - Rider: Do not change, however, the original URI requested, since it is used further + // down. + std::string cefUrl(std::string(inst->mOpenIDURL.mURI) + "://" + std::string(inst->mOpenIDURL.mAuthority)); - media_instance->getMediaPlugin()->setCookie(cefUrl, cookie_name, cookie_value, cookie_host, - cookie_path, httponly, secure); + // list of floater names and webbrowser therein to set the cookie that arrived via login into + struct MediaCookieInstance { + std::string floater_name; + std::string browser_name; + }; + struct MediaCookieInstance media_cookie_instances[] = { + {"search", "webbrowser" }, + {"marketplace", "webbrowser" }, + {"destinations", "destination_guide_contents" }, + }; + for (MediaCookieInstance mci : media_cookie_instances) + { + LLFloater *floaterp = LLFloaterReg::findInstance(mci.floater_name); + if (floaterp) + { + LLMediaCtrl* media_instance = floaterp->getChild<LLMediaCtrl>(mci.browser_name); + if (media_instance && media_instance->getMediaPlugin()) + { + media_instance->getMediaPlugin()->setCookie(cefUrl, cookie_name, cookie_value, cookie_host, + cookie_path, httponly, secure); - // Now that we have parsed the raw cookie, we must store it so that each new media instance - // can also get a copy and faciliate logging into internal SL sites. - media_instance->getMediaPlugin()->storeOpenIDCookie(cefUrl, cookie_name, cookie_value, - cookie_host, cookie_path, httponly, secure); + media_instance->getMediaPlugin()->storeOpenIDCookie(cefUrl, cookie_name, cookie_value, + cookie_host, cookie_path, httponly, secure); + } + } } } }); @@ -1346,10 +1441,10 @@ void LLViewerMedia::openIDSetupCoro(std::string openidUrl, std::string openidTok { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("openIDSetupCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); - LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("openIDSetupCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); + LLCore::HttpHeaders::ptr_t httpHeaders = std::make_shared<LLCore::HttpHeaders>(); httpOpts->setWantHeaders(true); @@ -2637,10 +2732,10 @@ void LLViewerMediaImpl::mimeDiscoveryCoro(std::string url) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("mimeDiscoveryCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); - LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("mimeDiscoveryCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); + LLCore::HttpHeaders::ptr_t httpHeaders = std::make_shared<LLCore::HttpHeaders>(); // Increment our refcount so that we do not go away while the coroutine is active. this->ref(); @@ -3007,7 +3102,10 @@ void LLViewerMediaImpl::doMediaTexUpdate(LLViewerMediaTexture* media_tex, U8* da // -Cosmic,2023-04-04 // Allocate GL texture based on LLImageRaw but do NOT copy to GL LLGLuint tex_name = 0; - media_tex->createGLTexture(0, raw, 0, true, LLGLTexture::OTHER, true, &tex_name); + if (!media_tex->createGLTexture(0, raw, 0, true, LLGLTexture::OTHER, true, &tex_name)) + { + LL_WARNS("Media") << "Failed to create media texture" << LL_ENDL; + } // copy just the subimage covered by the image raw to GL media_tex->setSubImage(data, data_width, data_height, x_pos, y_pos, width, height, tex_name); @@ -3076,7 +3174,10 @@ LLViewerMediaTexture* LLViewerMediaImpl::updateMediaImage() mMediaSource->getTextureFormatSwapBytes()); int discard_level = 0; - media_tex->createGLTexture(discard_level, raw); + if (!media_tex->createGLTexture(discard_level, raw)) + { + LL_WARNS("Media") << "Failed to create media texture" << LL_ENDL; + } // MEDIAOPT: set this dynamically on play/stop // FIXME @@ -3517,6 +3618,46 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla //////////////////////////////////////////////////////////////////////////////// // virtual void +LLViewerMediaImpl::undo() +{ + if (mMediaSource) + mMediaSource->undo(); +} + +//////////////////////////////////////////////////////////////////////////////// +// virtual +bool +LLViewerMediaImpl::canUndo() const +{ + if (mMediaSource) + return mMediaSource->canUndo(); + else + return FALSE; +} + +//////////////////////////////////////////////////////////////////////////////// +// virtual +void +LLViewerMediaImpl::redo() +{ + if (mMediaSource) + mMediaSource->redo(); +} + +//////////////////////////////////////////////////////////////////////////////// +// virtual +bool +LLViewerMediaImpl::canRedo() const +{ + if (mMediaSource) + return mMediaSource->canRedo(); + else + return FALSE; +} + +//////////////////////////////////////////////////////////////////////////////// +// virtual +void LLViewerMediaImpl::cut() { if (mMediaSource) @@ -3574,6 +3715,46 @@ LLViewerMediaImpl::canPaste() const return false; } +//////////////////////////////////////////////////////////////////////////////// +// virtual +void +LLViewerMediaImpl::doDelete() +{ + if (mMediaSource) + mMediaSource->doDelete(); +} + +//////////////////////////////////////////////////////////////////////////////// +// virtual +bool +LLViewerMediaImpl::canDoDelete() const +{ + if (mMediaSource) + return mMediaSource->canDoDelete(); + else + return FALSE; +} + +//////////////////////////////////////////////////////////////////////////////// +// virtual +void +LLViewerMediaImpl::selectAll() +{ + if (mMediaSource) + mMediaSource->selectAll(); +} + +//////////////////////////////////////////////////////////////////////////////// +// virtual +bool +LLViewerMediaImpl::canSelectAll() const +{ + if (mMediaSource) + return mMediaSource->canSelectAll(); + else + return FALSE; +} + void LLViewerMediaImpl::setUpdated(bool updated) { mIsUpdated = updated ; diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index 5753615a43..1fc5bbc9e0 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -69,6 +69,7 @@ private: }; class LLViewerMediaImpl; +class LLMediaCtrl; class LLViewerMedia: public LLSingleton<LLViewerMedia> { @@ -162,22 +163,26 @@ public: LLSD getHeaders(); LLCore::HttpHeaders::ptr_t getHttpHeaders(); + bool getOpenIDCookie(LLMediaCtrl* media_instance) const; private: void onAuthSubmit(const LLSD& notification, const LLSD& response); - bool parseRawCookie(const std::string raw_cookie, std::string& name, std::string& value, std::string& path, bool& httponly, bool& secure); + static bool parseRawCookie(const std::string raw_cookie, std::string& name, std::string& value, std::string& path, bool& httponly, bool& secure); void setOpenIDCookie(const std::string& url); void onTeleportFinished(); static void openIDSetupCoro(std::string openidUrl, std::string openidToken); static void getOpenIDCookieCoro(std::string url); + void setMaxInstances(S32 max_instances); bool mAnyMediaShowing; bool mAnyMediaPlaying; + S32 mMaxIntances = 8; LLURL mOpenIDURL; std::string mOpenIDCookie; LLPluginClassMedia* mSpareBrowserMediaSource; boost::signals2::connection mTeleportFinishConnection; + boost::signals2::connection mMaxInstancesConnection; }; // Implementation functions not exported into header file @@ -341,6 +346,12 @@ public: /*virtual*/ void handleMediaEvent(LLPluginClassMedia* plugin, LLPluginClassMediaOwner::EMediaEvent); // LLEditMenuHandler overrides + /*virtual*/ void undo(); + /*virtual*/ bool canUndo() const; + + /*virtual*/ void redo(); + /*virtual*/ bool canRedo() const; + /*virtual*/ void cut(); /*virtual*/ bool canCut() const; @@ -350,6 +361,12 @@ public: /*virtual*/ void paste(); /*virtual*/ bool canPaste() const; + /*virtual*/ void doDelete(); + /*virtual*/ bool canDoDelete() const; + + /*virtual*/ void selectAll(); + /*virtual*/ bool canSelectAll() const; + void addObject(LLVOVolume* obj) ; void removeObject(LLVOVolume* obj) ; const std::list< LLVOVolume* >* getObjectList() const ; diff --git a/indra/newview/llviewermedia_streamingaudio.cpp b/indra/newview/llviewermedia_streamingaudio.cpp index 21f5ba64d7..959de38364 100644 --- a/indra/newview/llviewermedia_streamingaudio.cpp +++ b/indra/newview/llviewermedia_streamingaudio.cpp @@ -61,13 +61,26 @@ void LLStreamingAudio_MediaPlugins::start(const std::string& url) if(!mMediaPlugin) return; - if (!url.empty()) { + if (!url.empty()) + { LL_INFOS() << "Starting internet stream: " << url << LL_ENDL; - mURL = url; - mMediaPlugin->loadURI ( url ); + + mURL = url; // keep original url here for comparison purposes + std::string snt_url = url; + LLStringUtil::trim(snt_url); + size_t pos = snt_url.find(' '); + if (pos != std::string::npos) + { + // fmod permited having names after the url and people were using it. + // People label their streams this way, ignore the 'label'. + snt_url = snt_url.substr(0, pos); + } + mMediaPlugin->loadURI(snt_url); mMediaPlugin->start(); LL_INFOS() << "Playing stream..." << LL_ENDL; - } else { + } + else + { LL_INFOS() << "setting stream to NULL"<< LL_ENDL; mURL.clear(); mMediaPlugin->stop(); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index bdae400f1d..5ea64a7824 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -77,7 +77,6 @@ #include "llfloaterpay.h" #include "llfloaterreporter.h" #include "llfloatersearch.h" -#include "fsfloatersearch.h" #include "llfloaterscriptdebug.h" #include "llfloatersnapshot.h" #include "llfloatertools.h" @@ -90,6 +89,7 @@ #include "lltoolface.h" #include "llhints.h" #include "llhudeffecttrail.h" +#include "llhudeffectresetskeleton.h" #include "llhudmanager.h" #include "llimview.h" #include "llinventorybridge.h" @@ -152,6 +152,7 @@ #include "llviewershadermgr.h" #include "gltfscenemanager.h" #include "gltf/asset.h" +#include "rlvcommon.h" using namespace LLAvatarAppearanceDefines; @@ -291,7 +292,10 @@ void force_error_software_exception(); void force_error_os_exception(); void force_error_driver_crash(); void force_error_coroutine_crash(); +void force_error_coroprocedure_crash(); +void force_error_work_queue_crash(); void force_error_thread_crash(); +void force_exception_thread_crash(); void handle_force_delete(); void print_object_info(); @@ -1849,7 +1853,6 @@ class LLAdvancedAppearanceToXML : public view_listener_t { bool handleEvent(const LLSD& userdata) { - std::string emptyname; LLViewerObject *obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); LLVOAvatar *avatar = NULL; if (obj) @@ -1876,7 +1879,7 @@ class LLAdvancedAppearanceToXML : public view_listener_t } if (avatar) { - avatar->dumpArchetypeXML(emptyname); + avatar->dumpArchetypeXML(LLStringUtil::null); } return true; } @@ -2646,6 +2649,24 @@ class LLAdvancedForceErrorCoroutineCrash : public view_listener_t } }; +class LLAdvancedForceErrorCoroprocedureCrash : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + force_error_coroprocedure_crash(); + return true; + } +}; + +class LLAdvancedForceErrorWorkQueueCrash : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + force_error_work_queue_crash(); + return true; + } +}; + class LLAdvancedForceErrorThreadCrash : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -2655,6 +2676,15 @@ class LLAdvancedForceErrorThreadCrash : public view_listener_t } }; +class LLAdvancedForceExceptionThreadCrash : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + force_exception_thread_crash(); + return true; + } +}; + class LLAdvancedForceErrorDisconnectViewer : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -3169,7 +3199,11 @@ void handle_object_edit() LLFloaterReg::showInstance("build"); LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset); - gFloaterTools->setEditTool( LLToolCompTranslate::getInstance() ); + + if (gFloaterTools) + { + gFloaterTools->setEditTool( LLToolCompTranslate::getInstance() ); + } LLViewerJoystick::getInstance()->moveObjects(true); LLViewerJoystick::getInstance()->setNeedsReset(true); @@ -4332,13 +4366,6 @@ void set_god_level(U8 god_level) // changing god-level can affect which menus we see show_debug_menus(); - - // changing god-level can invalidate search results - LLFloaterSearch *search = dynamic_cast<LLFloaterSearch*>(LLFloaterReg::getInstance("search")); - if (search) - { - search->godLevelChanged(god_level); - } } #ifdef TOGGLE_HACKED_GODLIKE_VIEWER @@ -4481,7 +4508,7 @@ void handle_object_sit(LLViewerObject* object, const LLVector3& offset) { // get object selection offset - if (object && object->getPCode() == LL_PCODE_VOLUME) + if (gAgent.isAllowedToSit() && object && object->getPCode() == LL_PCODE_VOLUME) { gMessageSystem->newMessageFast(_PREHASH_AgentRequestSit); @@ -5622,6 +5649,38 @@ class LLToolsEnablePathfindingRebakeRegion : public view_listener_t } }; +class LLToolsCheckSelectionLODMode : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + std::string param = userdata.asString(); + static LLCachedControl<S32> debug_selection_lods(gSavedSettings, "DebugSelectionLODs", 0); + if ("default" == param) + { + return debug_selection_lods() < 0; + } + else if ("high" == param) + { + return debug_selection_lods() == 3; + } + else if ("medium" == param) + { + return debug_selection_lods() == 2; + } + else if ("low" == param) + { + return debug_selection_lods() == 1; + } + else if ("lowest" == param) + { + return debug_selection_lods() == 0; + } + + return false; + } +}; + + // Round the position of all root objects to the grid class LLToolsSnapObjectXY : public view_listener_t { @@ -6260,6 +6319,8 @@ void show_debug_menus() gMenuBarView->setItemVisible("Advanced", debug); // gMenuBarView->setItemEnabled("Advanced", debug); // Don't disable Advanced keyboard shortcuts when hidden + Rlv::Util::menuToggleVisible(); + gMenuBarView->setItemVisible("Debug", qamode); gMenuBarView->setItemEnabled("Debug", qamode); @@ -6463,13 +6524,13 @@ void handle_look_at_selection(const LLSD& param) } } -void handle_zoom_to_object(const LLUUID& object_id) +bool handle_zoom_to_object(const LLUUID& object_id) { const F32 PADDING_FACTOR = 2.f; LLViewerObject* object = gObjectList.findObject(object_id); - if (object) + if (object && object->isReachable()) { gAgentCamera.setFocusOnAvatar(false, ANIMATE); @@ -6481,12 +6542,14 @@ void handle_zoom_to_object(const LLUUID& object_id) obj_to_cam.normVec(); - LLVector3d object_center_global = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent()); + LLVector3d object_center_global = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent()); - gAgentCamera.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance), + gAgentCamera.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance), object_center_global, object_id ); + return true; } + return false; } void handle_teleport_to_object(LLUUID object_id) @@ -6646,8 +6709,18 @@ class LLAvatarResetSkeleton : public view_listener_t { if (LLVOAvatar* avatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject())) { + if(avatar->getID() == gAgentID) + { + LLHUDEffectResetSkeleton* effectp = (LLHUDEffectResetSkeleton*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_RESET_SKELETON, true); + effectp->setSourceObject(gAgentAvatarp); + effectp->setTargetObject((LLViewerObject*)avatar); + effectp->setResetAnimations(false); + } + else + { avatar->resetSkeleton(false); } + } return true; } }; @@ -6656,11 +6729,8 @@ class LLAvatarEnableResetSkeleton : public view_listener_t { bool handleEvent(const LLSD& userdata) { - if (LLVOAvatar* avatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject())) - { - return true; - } - return false; + LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); + return obj && obj->getAvatar(); } }; @@ -6670,8 +6740,18 @@ class LLAvatarResetSkeletonAndAnimations : public view_listener_t { if (LLVOAvatar* avatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject())) { + if(avatar->getID() == gAgentID) + { + LLHUDEffectResetSkeleton* effectp = (LLHUDEffectResetSkeleton*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_RESET_SKELETON, true); + effectp->setSourceObject(gAgentAvatarp); + effectp->setTargetObject((LLViewerObject*)avatar); + effectp->setResetAnimations(true); + } + else + { avatar->resetSkeleton(true); } + } return true; } }; @@ -6698,11 +6778,24 @@ class LLAvatarResetSelfSkeletonAndAnimations : public view_listener_t { if (LLVOAvatar* avatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject())) { - avatar->resetSkeleton(true); + if(avatar->getID() == gAgentID) + { + LLHUDEffectResetSkeleton* effectp = (LLHUDEffectResetSkeleton*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_RESET_SKELETON, true); + effectp->setSourceObject(gAgentAvatarp); + effectp->setTargetObject((LLViewerObject*)avatar); + effectp->setResetAnimations(true); + } + else + { + avatar->resetSkeleton(true); + } } else { - gAgentAvatarp->resetSkeleton(true); + LLHUDEffectResetSkeleton* effectp = (LLHUDEffectResetSkeleton*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_RESET_SKELETON, true); + effectp->setSourceObject(gAgentAvatarp); + effectp->setTargetObject(gAgentAvatarp); + effectp->setResetAnimations(true); } return true; } @@ -7673,6 +7766,7 @@ bool enable_detach(const LLSD&) // Only enable detach if all faces of object are selected if (!object || !object->isAttachment() || + object->isLocked() || !LLSelectMgr::getInstance()->getSelection()->contains(object,SELECT_ALL_TES )) { return false; @@ -8548,6 +8642,36 @@ class LLToolsSelectBySurrounding : public view_listener_t } }; +class LLToolsSelectionLODMode : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + std::string param = userdata.asString(); + if ("default" == param) + { + gSavedSettings.setS32("DebugSelectionLODs", -1); + } + else if ("high" == param) + { + gSavedSettings.setS32("DebugSelectionLODs", 3); + } + else if ("medium" == param) + { + gSavedSettings.setS32("DebugSelectionLODs", 2); + } + else if ("low" == param) + { + gSavedSettings.setS32("DebugSelectionLODs", 1); + } + else if ("lowest" == param) + { + gSavedSettings.setS32("DebugSelectionLODs", 0); + } + + return true; + } +}; + class LLToolsShowHiddenSelection : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -8705,6 +8829,12 @@ LLVOAvatar* find_avatar_from_object(LLViewerObject* object) } else if( !object->isAvatar() ) { + // Check for animesh objects (animated objects with a control avatar) + LLVOAvatar* avatar = object->getAvatar(); + if (avatar) + { + return avatar; + } object = NULL; } } @@ -8771,11 +8901,26 @@ void force_error_coroutine_crash() LLAppViewer::instance()->forceErrorCoroutineCrash(); } +void force_error_coroprocedure_crash() +{ + LLAppViewer::instance()->forceErrorCoroprocedureCrash(); +} + +void force_error_work_queue_crash() +{ + LLAppViewer::instance()->forceErrorWorkQueueCrash(); +} + void force_error_thread_crash() { LLAppViewer::instance()->forceErrorThreadCrash(); } +void force_exception_thread_crash() +{ + LLAppViewer::instance()->forceExceptionThreadCrash(); +} + class LLToolsUseSelectionForGrid : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -8974,6 +9119,17 @@ class LLViewHighlightTransparent : public view_listener_t } }; +class LLViewHighlightTransparentProbe : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + gSavedSettings.setBOOL("RenderReflectionProbeShowTransparent", !gSavedSettings.getBOOL("RenderReflectionProbeShowTransparent")); + // invisible objects skip building their render batches unless sShowDebugAlpha is true, so rebuild batches whenever toggling this flag + gPipeline.rebuildDrawInfo(); + return true; + } +}; + class LLViewCheckHighlightTransparent : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -9717,6 +9873,7 @@ void initialize_menus() view_listener_t::addMenu(new LLViewLookAtLastChatter(), "View.LookAtLastChatter"); view_listener_t::addMenu(new LLViewShowHoverTips(), "View.ShowHoverTips"); view_listener_t::addMenu(new LLViewHighlightTransparent(), "View.HighlightTransparent"); + view_listener_t::addMenu(new LLViewHighlightTransparentProbe(), "View.HighlightTransparentProbe"); view_listener_t::addMenu(new LLViewToggleRenderType(), "View.ToggleRenderType"); view_listener_t::addMenu(new LLViewShowHUDAttachments(), "View.ShowHUDAttachments"); view_listener_t::addMenu(new LLZoomer(1.2f), "View.ZoomOut"); @@ -9772,6 +9929,7 @@ void initialize_menus() view_listener_t::addMenu(new LLToolsSelectInvisibleObjects(), "Tools.SelectInvisibleObjects"); view_listener_t::addMenu(new LLToolsSelectReflectionProbes(), "Tools.SelectReflectionProbes"); view_listener_t::addMenu(new LLToolsSelectBySurrounding(), "Tools.SelectBySurrounding"); + view_listener_t::addMenu(new LLToolsSelectionLODMode(), "Tools.SelectionLODMode"); view_listener_t::addMenu(new LLToolsShowHiddenSelection(), "Tools.ShowHiddenSelection"); view_listener_t::addMenu(new LLToolsShowSelectionLightRadius(), "Tools.ShowSelectionLightRadius"); view_listener_t::addMenu(new LLToolsEditLinkedParts(), "Tools.EditLinkedParts"); @@ -9804,6 +9962,7 @@ void initialize_menus() view_listener_t::addMenu(new LLToolsEnablePathfindingView(), "Tools.EnablePathfindingView"); view_listener_t::addMenu(new LLToolsDoPathfindingRebakeRegion(), "Tools.DoPathfindingRebakeRegion"); view_listener_t::addMenu(new LLToolsEnablePathfindingRebakeRegion(), "Tools.EnablePathfindingRebakeRegion"); + view_listener_t::addMenu(new LLToolsCheckSelectionLODMode(), "Tools.ToolsCheckSelectionLODMode"); // Help menu // most items use the ShowFloater method @@ -9978,7 +10137,10 @@ void initialize_menus() view_listener_t::addMenu(new LLAdvancedForceErrorSoftwareExceptionCoro(), "Advanced.ForceErrorSoftwareExceptionCoro"); view_listener_t::addMenu(new LLAdvancedForceErrorDriverCrash(), "Advanced.ForceErrorDriverCrash"); view_listener_t::addMenu(new LLAdvancedForceErrorCoroutineCrash(), "Advanced.ForceErrorCoroutineCrash"); + view_listener_t::addMenu(new LLAdvancedForceErrorCoroprocedureCrash(), "Advanced.ForceErrorCoroprocedureCrash"); + view_listener_t::addMenu(new LLAdvancedForceErrorWorkQueueCrash(), "Advanced.ForceErrorWorkQueueCrash"); view_listener_t::addMenu(new LLAdvancedForceErrorThreadCrash(), "Advanced.ForceErrorThreadCrash"); + view_listener_t::addMenu(new LLAdvancedForceExceptionThreadCrash(), "Advanced.ForceExceptionThreadCrash"); view_listener_t::addMenu(new LLAdvancedForceErrorDisconnectViewer(), "Advanced.ForceErrorDisconnectViewer"); // Advanced (toplevel) diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index 68ba740f67..6c9d56cffb 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -73,7 +73,7 @@ void handle_buy(); void handle_take(bool take_separate = false); void handle_take_copy(); void handle_look_at_selection(const LLSD& param); -void handle_zoom_to_object(const LLUUID& object_id); +bool handle_zoom_to_object(const LLUUID& object_id); void handle_teleport_to_object(LLUUID object_id); void handle_object_return(); void handle_object_delete(); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index ce66dbc03f..772abb0373 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -69,6 +69,7 @@ #include "llviewerassetupload.h" // linden libraries +#include "llfilesystem.h" #include "llnotificationsutil.h" #include "llsdserialize.h" #include "llsdutil.h" @@ -94,7 +95,7 @@ class LLFileEnableUploadModel : public view_listener_t bool handleEvent(const LLSD& userdata) { LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) LLFloaterReg::findInstance("upload_model"); - if (fmp && fmp->isModelLoading()) + if (fmp && !fmp->isDead() && fmp->isModelLoading()) { return false; } @@ -478,13 +479,19 @@ const bool check_file_extension(const std::string& filename, LLFilePicker::ELoad return true; } -const void upload_single_file(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type) +void upload_single_file( + const std::vector<std::string>& filenames, + LLFilePicker::ELoadFilter type, + const LLUUID& dest) { std::string filename = filenames[0]; if (!check_file_extension(filename, type)) return; if (!filename.empty()) { + LLSD args; + args["filename"] = filename; + args["dest"] = dest; if (type == LLFilePicker::FFLOAD_WAV) { // pre-qualify wavs to make sure the format is acceptable @@ -499,12 +506,12 @@ const void upload_single_file(const std::vector<std::string>& filenames, LLFileP } else { - LLFloaterReg::showInstance("upload_sound", LLSD(filename)); + LLFloaterReg::showInstance("upload_sound", args); } } if (type == LLFilePicker::FFLOAD_IMAGE) { - LLFloaterReg::showInstance("upload_image", LLSD(filename)); + LLFloaterReg::showInstance("upload_image", args); } if (type == LLFilePicker::FFLOAD_ANIM) { @@ -512,18 +519,18 @@ const void upload_single_file(const std::vector<std::string>& filenames, LLFileP LLStringUtil::toLower(filename_lc); if (filename_lc.rfind(".anim") != std::string::npos) { - LLFloaterReg::showInstance("upload_anim_anim", LLSD(filename)); + LLFloaterReg::showInstance("upload_anim_anim", args); } else { - LLFloaterReg::showInstance("upload_anim_bvh", LLSD(filename)); + LLFloaterReg::showInstance("upload_anim_bvh", args); } } } return; } -void do_bulk_upload(std::vector<std::string> filenames, bool allow_2k) +void do_bulk_upload(std::vector<std::string> filenames, bool allow_2k, const LLUUID& dest) { for (std::vector<std::string>::const_iterator in_iter = filenames.begin(); in_iter != filenames.end(); ++in_iter) { @@ -544,16 +551,9 @@ void do_bulk_upload(std::vector<std::string> filenames, bool allow_2k) if (LLResourceUploadInfo::findAssetTypeAndCodecOfExtension(ext, asset_type, codec)) { bool resource_upload = false; - if (asset_type == LLAssetType::AT_TEXTURE && allow_2k) + if (asset_type == LLAssetType::AT_TEXTURE) { - LLPointer<LLImageFormatted> image_frmted = LLImageFormatted::createFromType(codec); - if (gDirUtilp->fileExists(filename) && image_frmted && image_frmted->load(filename)) - { - S32 biased_width = LLImageRaw::biasedDimToPowerOfTwo(image_frmted->getWidth(), LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT); - S32 biased_height = LLImageRaw::biasedDimToPowerOfTwo(image_frmted->getHeight(), LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT); - expected_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost(biased_width, biased_height); - resource_upload = true; - } + resource_upload = true; } else if (LLAgentBenefitsMgr::current().findUploadCost(asset_type, expected_upload_cost)) { @@ -562,23 +562,116 @@ void do_bulk_upload(std::vector<std::string> filenames, bool allow_2k) if (resource_upload) { - LLNewFileResourceUploadInfo* info_p = new LLNewFileResourceUploadInfo( - filename, - asset_name, - asset_name, 0, - LLFolderType::FT_NONE, LLInventoryType::IT_NONE, - LLFloaterPerms::getNextOwnerPerms("Uploads"), - LLFloaterPerms::getGroupPerms("Uploads"), - LLFloaterPerms::getEveryonePerms("Uploads"), - expected_upload_cost); - - if (!allow_2k) + if (asset_type == LLAssetType::AT_TEXTURE) { - info_p->setMaxImageSize(1024); + std::string exten = gDirUtilp->getExtension(filename); + U32 codec = LLImageBase::getCodecFromExtension(exten); + + // Load the image + LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec); + if (image.isNull()) + { + LL_WARNS() << "Failed to create image container for " << filename << LL_ENDL; + continue; + } + if (!image->load(filename)) + { + LL_WARNS() << "Failed to load image: " << filename << LL_ENDL; + continue; + } + // Decompress or expand it in a raw image structure + LLPointer<LLImageRaw> raw_image = new LLImageRaw; + if (!image->decode(raw_image, 0.0f)) + { + LL_WARNS() << "Failed to decode image: " << filename << LL_ENDL; + continue; + } + // Check the image constraints + if ((image->getComponents() != 3) && (image->getComponents() != 4)) + { + LL_WARNS() << "Attempted to upload a texture that has " << image->getComponents() + << " components, but only 3 (RGB) or 4 (RGBA) are allowed." << LL_ENDL; + continue; + } + // Downscale images to fit the max_texture_dimensions_*, or 1024 if allow_2k is false + S32 max_width = allow_2k ? gSavedSettings.getS32("max_texture_dimension_X") : 1024; + S32 max_height = allow_2k ? gSavedSettings.getS32("max_texture_dimension_Y") : 1024; + + S32 orig_width = raw_image->getWidth(); + S32 orig_height = raw_image->getHeight(); + + if (orig_width > max_width || orig_height > max_height) + { + // Calculate scale factors + F32 width_scale = (F32)max_width / (F32)orig_width; + F32 height_scale = (F32)max_height / (F32)orig_height; + F32 scale = llmin(width_scale, height_scale); + + // Calculate new dimensions, preserving aspect ratio + S32 new_width = LLImageRaw::contractDimToPowerOfTwo(llclamp((S32)llroundf(orig_width * scale), 4, max_width)); + S32 new_height = LLImageRaw::contractDimToPowerOfTwo(llclamp((S32)llroundf(orig_height * scale), 4, max_height)); + + if (!raw_image->scale(new_width, new_height)) + { + LL_WARNS() << "Failed to scale image from " << orig_width << "x" << orig_height << " to " << new_width << "x" + << new_height << LL_ENDL; + continue; + } + + // Inform the resident about the resized image + LLSD subs; + subs["[ORIGINAL_WIDTH]"] = orig_width; + subs["[ORIGINAL_HEIGHT]"] = orig_height; + subs["[NEW_WIDTH]"] = new_width; + subs["[NEW_HEIGHT]"] = new_height; + subs["[MAX_WIDTH]"] = max_width; + subs["[MAX_HEIGHT]"] = max_height; + LLNotificationsUtil::add("ImageUploadResized", subs); + } + + raw_image->biasedScaleToPowerOfTwo(LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT); + + LLTransactionID tid; + tid.generate(); + LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); + + LLPointer<LLImageJ2C> formatted = new LLImageJ2C; + + if (formatted->encode(raw_image, 0.0f)) + { + LLFileSystem fmt_file(new_asset_id, LLAssetType::AT_TEXTURE, LLFileSystem::WRITE); + fmt_file.write(formatted->getData(), formatted->getDataSize()); + + LLResourceUploadInfo::ptr_t assetUploadInfo = std::make_shared<LLResourceUploadInfo>( + tid, LLAssetType::AT_TEXTURE, + asset_name, + asset_name, 0, + LLFolderType::FT_NONE, LLInventoryType::IT_NONE, + LLFloaterPerms::getNextOwnerPerms("Uploads"), + LLFloaterPerms::getGroupPerms("Uploads"), + LLFloaterPerms::getEveryonePerms("Uploads"), + LLAgentBenefitsMgr::current().getTextureUploadCost(raw_image->getWidth(), raw_image->getHeight()), + dest + ); + + upload_new_resource(assetUploadInfo); + } } - LLResourceUploadInfo::ptr_t uploadInfo(info_p); + else + { + LLResourceUploadInfo::ptr_t uploadInfo = std::make_shared<LLNewFileResourceUploadInfo>( + filename, + asset_name, + asset_name, 0, + LLFolderType::FT_NONE, LLInventoryType::IT_NONE, + LLFloaterPerms::getNextOwnerPerms("Uploads"), + LLFloaterPerms::getGroupPerms("Uploads"), + LLFloaterPerms::getEveryonePerms("Uploads"), + expected_upload_cost, + dest); - upload_new_resource(uploadInfo); + upload_new_resource(uploadInfo); + } } } @@ -595,14 +688,14 @@ void do_bulk_upload(std::vector<std::string> filenames, bool allow_2k) // Todo: // 1. Decouple bulk upload from material editor // 2. Take into account possiblity of identical textures - LLMaterialEditor::uploadMaterialFromModel(filename, model, i); + LLMaterialEditor::uploadMaterialFromModel(filename, model, i, dest); } } } } } -void do_bulk_upload(std::vector<std::string> filenames, bool allow_2k, const LLSD& notification, const LLSD& response) +void do_bulk_upload(std::vector<std::string> filenames, bool allow_2k, const LLSD& notification, const LLSD& response, const LLUUID& dest) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); if (option != 0) @@ -611,7 +704,7 @@ void do_bulk_upload(std::vector<std::string> filenames, bool allow_2k, const LLS return; } - do_bulk_upload(filenames, allow_2k); + do_bulk_upload(filenames, allow_2k, dest); } bool get_bulk_upload_expected_cost( @@ -647,8 +740,31 @@ bool get_bulk_upload_expected_cost( LLPointer<LLImageFormatted> image_frmted = LLImageFormatted::createFromType(codec); if (gDirUtilp->fileExists(filename) && image_frmted && image_frmted->load(filename)) { - S32 biased_width = LLImageRaw::biasedDimToPowerOfTwo(image_frmted->getWidth(), LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT); - S32 biased_height = LLImageRaw::biasedDimToPowerOfTwo(image_frmted->getHeight(), LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT); + S32 biased_width, biased_height; + + S32 max_width = allow_2k ? gSavedSettings.getS32("max_texture_dimension_X") : 1024; + S32 max_height = allow_2k ? gSavedSettings.getS32("max_texture_dimension_Y") : 1024; + + S32 orig_width = image_frmted->getWidth(); + S32 orig_height = image_frmted->getHeight(); + + if (orig_width > max_width || orig_height > max_height) + { + // Calculate scale factors + F32 width_scale = (F32)max_width / (F32)orig_width; + F32 height_scale = (F32)max_height / (F32)orig_height; + F32 scale = llmin(width_scale, height_scale); + + // Calculate new dimensions, preserving aspect ratio + biased_width = LLImageRaw::contractDimToPowerOfTwo(llclamp((S32)llroundf(orig_width * scale), 4, max_width)); + biased_height = LLImageRaw::contractDimToPowerOfTwo(llclamp((S32)llroundf(orig_height * scale), 4, max_height)); + } + else + { + biased_width = LLImageRaw::biasedDimToPowerOfTwo(orig_width, LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT); + biased_height = LLImageRaw::biasedDimToPowerOfTwo(orig_height, LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT); + } + total_cost += LLAgentBenefitsMgr::current().getTextureUploadCost(biased_width, biased_height); S32 area = biased_width * biased_height; if (area >= LLAgentBenefits::MIN_2K_TEXTURE_AREA) @@ -709,7 +825,7 @@ bool get_bulk_upload_expected_cost( return file_count > 0; } -const void upload_bulk(const std::vector<std::string>& filtered_filenames, bool allow_2k) +void upload_bulk(const std::vector<std::string>& filtered_filenames, bool allow_2k, const LLUUID& dest) { S32 expected_upload_cost; S32 expected_upload_count; @@ -721,6 +837,7 @@ const void upload_bulk(const std::vector<std::string>& filtered_filenames, bool key["upload_cost"] = expected_upload_cost; key["upload_count"] = expected_upload_count; key["has_2k_textures"] = (textures_2k_count > 0); + key["dest"] = dest; LLSD array; for (const std::string& str : filtered_filenames) @@ -754,7 +871,7 @@ const void upload_bulk(const std::vector<std::string>& filtered_filenames, bool } -const void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type, bool allow_2k) +void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type, bool allow_2k, const LLUUID& dest) { // TODO: // Check user balance for entire cost @@ -776,7 +893,7 @@ const void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker:: filtered_filenames.push_back(filename); } } - upload_bulk(filtered_filenames, allow_2k); + upload_bulk(filtered_filenames, allow_2k, dest); } class LLFileUploadImage : public view_listener_t @@ -787,7 +904,7 @@ class LLFileUploadImage : public view_listener_t { gAgentCamera.changeCameraToDefault(); } - LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2), LLFilePicker::FFLOAD_IMAGE, false); + LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2, LLUUID::null), LLFilePicker::FFLOAD_IMAGE, false); return true; } }; @@ -796,7 +913,23 @@ class LLFileUploadModel : public view_listener_t { bool handleEvent(const LLSD& userdata) { - LLFloaterModelPreview::showModelPreview(); + if (LLConvexDecomposition::isFunctional()) + { + LLFloaterModelPreview::showModelPreview(); + } + else + { + if (gGLManager.mIsApple) + { + LLNotificationsUtil::add("ModelUploaderMissingPhysicsApple"); + } + else + { + // TPV? + LLNotificationsUtil::add("ModelUploaderMissingPhysics"); + LLFloaterModelPreview::showModelPreview(); + } + } return true; } }; @@ -818,7 +951,7 @@ class LLFileUploadSound : public view_listener_t { gAgentCamera.changeCameraToDefault(); } - LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2), LLFilePicker::FFLOAD_WAV, false); + LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2, LLUUID::null), LLFilePicker::FFLOAD_WAV, false); return true; } }; @@ -831,7 +964,7 @@ class LLFileUploadAnim : public view_listener_t { gAgentCamera.changeCameraToDefault(); } - LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2), LLFilePicker::FFLOAD_ANIM, false); + LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2, LLUUID::null), LLFilePicker::FFLOAD_ANIM, false); return true; } }; @@ -844,7 +977,7 @@ class LLFileUploadBulk : public view_listener_t { gAgentCamera.changeCameraToDefault(); } - LLFilePickerReplyThread::startPicker(boost::bind(&upload_bulk, _1, _2, true), LLFilePicker::FFLOAD_ALL, true); + LLFilePickerReplyThread::startPicker(boost::bind(&upload_bulk, _1, _2, true, LLUUID::null), LLFilePicker::FFLOAD_ALL, true); return true; } }; @@ -932,6 +1065,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t bool render_ui = gSavedSettings.getBOOL("RenderUIInSnapshot"); bool render_hud = gSavedSettings.getBOOL("RenderHUDInSnapshot"); bool render_no_post = gSavedSettings.getBOOL("RenderSnapshotNoPost"); + bool render_balance = gSavedSettings.getBOOL("RenderBalanceInSnapshot"); bool high_res = gSavedSettings.getBOOL("HighResSnapshot"); if (high_res) @@ -952,6 +1086,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t render_hud, false, render_no_post, + render_balance, LLSnapshotModel::SNAPSHOT_TYPE_COLOR, high_res ? S32_MAX : MAX_SNAPSHOT_IMAGE_SIZE)) //per side { @@ -1132,7 +1267,7 @@ LLUUID upload_new_resource( name, desc, compression_info, destination_folder_type, inv_type, next_owner_perms, group_perms, everyone_perms, - expected_upload_cost, show_inventory)); + expected_upload_cost, LLUUID::null, show_inventory)); upload_new_resource(uploadInfo, callback, userdata); return LLUUID::null; diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h index d99f9dc4c6..e40dd84bc9 100644 --- a/indra/newview/llviewermenufile.h +++ b/indra/newview/llviewermenufile.h @@ -72,7 +72,18 @@ bool get_bulk_upload_expected_cost( S32& bvh_count, S32& textures_2k_count); -void do_bulk_upload(std::vector<std::string> filenames, bool allow_2k); +void do_bulk_upload(std::vector<std::string> filenames, bool allow_2k, const LLUUID &dest_folder); + +void upload_single_file( + const std::vector<std::string>& filenames, + LLFilePicker::ELoadFilter type, + const LLUUID& dest); + +void upload_bulk( + const std::vector<std::string>& filenames, + LLFilePicker::ELoadFilter type, + bool allow_2k, + const LLUUID& dest); //consider moving all file pickers below to more suitable place class LLFilePickerThread : public LLThread diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 1d4828fd33..494a11d94f 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -118,6 +118,8 @@ #include "llpanelplaceprofile.h" #include "llviewerregion.h" #include "llfloaterregionrestarting.h" +#include "rlvactions.h" +#include "rlvhandler.h" #include "llnotificationmanager.h" // #include "llexperiencecache.h" @@ -162,8 +164,8 @@ void accept_friendship_coro(std::string url, LLSD notification) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("friendshipResponceErrorProcessing", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("friendshipResponceErrorProcessing", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); if (url.empty()) { LL_WARNS("Friendship") << "Empty capability!" << LL_ENDL; @@ -212,8 +214,8 @@ void decline_friendship_coro(std::string url, LLSD notification, S32 option) } LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("friendshipResponceErrorProcessing", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("friendshipResponceErrorProcessing", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD payload = notification["payload"]; url += "?from=" + payload["from_id"].asString(); @@ -570,8 +572,8 @@ void response_group_invitation_coro(std::string url, LLUUID group_id, bool notif LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("responseGroupInvitation", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("responseGroupInvitation", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD payload; payload["group"] = group_id; @@ -1558,6 +1560,7 @@ void LLOfferInfo::sendReceiveResponse(bool accept, const LLUUID &destination_fol if (mTransactionID.isNull()) { // Not provided, message won't work + LL_WARNS("Messaging") << "Missing transaction id, response for " << mIM << " won't work" << LL_ENDL; return; } @@ -1600,6 +1603,8 @@ void LLOfferInfo::sendReceiveResponse(bool accept, const LLUUID &destination_fol msg->addU8Fast(_PREHASH_Dialog, (U8)(im + 1)); msg->addBinaryDataFast(_PREHASH_BinaryBucket, &(destination_folder_id.mData), sizeof(destination_folder_id.mData)); + + LL_DEBUGS("Messaging") << "Processing" << (U8)(im + 1) << " with transaction id " << mTransactionID << LL_ENDL; } else { @@ -2014,7 +2019,7 @@ bool lure_callback(const LLSD& notification, const LLSD& response) if (notification_ptr) { - LLNotificationFormPtr modified_form(new LLNotificationForm(*notification_ptr->getForm())); + LLNotificationFormPtr modified_form = std::make_shared<LLNotificationForm>(*notification_ptr->getForm()); modified_form->setElementEnabled("Teleport", false); modified_form->setElementEnabled("Cancel", false); notification_ptr->updateForm(modified_form); @@ -2137,6 +2142,21 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) EInstantMessage dialog = (EInstantMessage)d; LLHost sender = msg->getSender(); + LLSD metadata; + if (msg->getNumberOfBlocksFast(_PREHASH_MetaData) > 0) + { + S32 metadata_size = msg->getSizeFast(_PREHASH_MetaData, 0, _PREHASH_Data); + std::string metadata_buffer; + metadata_buffer.resize(metadata_size, 0); + + msg->getBinaryDataFast(_PREHASH_MetaData, _PREHASH_Data, &metadata_buffer[0], metadata_size, 0, metadata_size ); + std::stringstream metadata_stream(metadata_buffer); + if (LLSDSerialize::fromBinary(metadata, metadata_stream, metadata_size) == LLSDParser::PARSE_FAILURE) + { + metadata.clear(); + } + } + LLIMProcessing::processNewMessage(from_id, from_group, to_id, @@ -2151,7 +2171,8 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) position, binary_bucket, binary_bucket_size, - sender); + sender, + metadata); } void send_do_not_disturb_message (LLMessageSystem* msg, const LLUUID& from_id, const LLUUID& session_id) @@ -2382,15 +2403,16 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) } bool is_audible = (CHAT_AUDIBLE_FULLY == chat.mAudible); + bool show_script_chat_particles = chat.mSourceType == CHAT_SOURCE_OBJECT + && chat.mChatType != CHAT_TYPE_DEBUG_MSG + && gSavedSettings.getBOOL("EffectScriptChatParticles"); chatter = gObjectList.findObject(from_id); if (chatter) { chat.mPosAgent = chatter->getPositionAgent(); // Make swirly things only for talking objects. (not script debug messages, though) - if (chat.mSourceType == CHAT_SOURCE_OBJECT - && chat.mChatType != CHAT_TYPE_DEBUG_MSG - && gSavedSettings.getBOOL("EffectScriptChatParticles") ) + if (show_script_chat_particles && (!RlvActions::isRlvEnabled() || CHAT_TYPE_OWNER != chat.mChatType) ) { LLPointer<LLViewerPartSourceChat> psc = new LLViewerPartSourceChat(chatter->getPositionAgent()); psc->setSourceObject(chatter); @@ -2470,8 +2492,25 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) case CHAT_TYPE_WHISPER: chat.mText = LLTrans::getString("whisper") + " "; break; - case CHAT_TYPE_DEBUG_MSG: case CHAT_TYPE_OWNER: + if (RlvActions::isRlvEnabled()) + { + if (RlvHandler::instance().handleSimulatorChat(mesg, chat, chatter)) + { + break; + } + else if (show_script_chat_particles) + { + LLPointer<LLViewerPartSourceChat> psc = new LLViewerPartSourceChat(chatter->getPositionAgent()); + psc->setSourceObject(chatter); + psc->setColor(color); + //We set the particles to be owned by the object's owner, + //just in case they should be muted by the mute list + psc->setOwnerUUID(owner_id); + LLViewerPartSim::getInstance()->addPartSource(psc); + } + } + case CHAT_TYPE_DEBUG_MSG: case CHAT_TYPE_NORMAL: case CHAT_TYPE_DIRECT: break; @@ -2567,6 +2606,8 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) msg_notify["session_id"] = LLUUID(); msg_notify["from_id"] = chat.mFromID; msg_notify["source_type"] = chat.mSourceType; + // used to check if there is agent mention in the message + msg_notify["message"] = mesg; on_new_message(msg_notify); } @@ -3034,6 +3075,11 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) } } +#ifdef LL_DISCORD + if (gSavedSettings.getBOOL("EnableDiscord")) + LLAppViewer::updateDiscordActivity(); +#endif + if ( LLTracker::isTracking(NULL) ) { // Check distance to beacon, if < 5m, remove beacon @@ -3116,7 +3162,10 @@ void process_crossed_region(LLMessageSystem* msg, void**) return; } LL_INFOS("Messaging") << "process_crossed_region()" << LL_ENDL; - gAgentAvatarp->resetRegionCrossingTimer(); + if (isAgentAvatarValid()) + { + gAgentAvatarp->resetRegionCrossingTimer(); + } U32 sim_ip; msg->getIPAddrFast(_PREHASH_RegionData, _PREHASH_SimIP, sim_ip); @@ -3147,7 +3196,9 @@ void send_agent_update(bool force_send, bool send_reliable) LL_PROFILE_ZONE_SCOPED; llassert(!gCubeSnapshot); - if (gAgent.getTeleportState() != LLAgent::TELEPORT_NONE) + LLAgent::ETeleportState tp_state = gAgent.getTeleportState(); + if (tp_state != LLAgent::TELEPORT_NONE + && tp_state != LLAgent::TELEPORT_ARRIVING) { // We don't care if they want to send an agent update, they're not allowed // until the target simulator is ready to receive them @@ -3169,6 +3220,7 @@ void send_agent_update(bool force_send, bool send_reliable) static F64 last_send_time = 0.0; static U32 last_control_flags = 0; + static bool control_flags_follow_up = false; static U8 last_render_state = 0; static U8 last_flags = AU_FLAGS_NONE; static LLQuaternion last_body_rot, @@ -3246,6 +3298,20 @@ void send_agent_update(bool force_send, bool send_reliable) break; } + // example: + // user taps crouch (control_flags 4128), viewer sends 4128 then immediately 0 + // server starts crouching motion but does not stop it, only once viewer sends 0 + // second time will server stop the motion. follow_up exists to make sure all + // states like 'crouch' motion are properly cleared server side. + // + // P.S. Server probably shouldn't require a reminder to stop a motion, + // but at the moment it does. + if (control_flags_follow_up) + { + send_update = true; + break; + } + // check translation constexpr F32 TRANSLATE_THRESHOLD = 0.01f; if ((last_camera_pos_agent - camera_pos_agent).magVec() > TRANSLATE_THRESHOLD) @@ -3322,7 +3388,44 @@ void send_agent_update(bool force_send, bool send_reliable) msg->addVector3Fast(_PREHASH_CameraAtAxis, camera_at); msg->addVector3Fast(_PREHASH_CameraLeftAxis, LLViewerCamera::getInstance()->getLeftAxis()); msg->addVector3Fast(_PREHASH_CameraUpAxis, LLViewerCamera::getInstance()->getUpAxis()); - msg->addF32Fast(_PREHASH_Far, gAgentCamera.mDrawDistance); + + static F32 last_draw_disatance_step = 1024; + F32 memory_limited_draw_distance = gAgentCamera.mDrawDistance; + + if (LLViewerTexture::isSystemMemoryCritical()) + { + // If we are low on memory, reduce requested draw distance + memory_limited_draw_distance = llmax(gAgentCamera.mDrawDistance / LLViewerTexture::getSystemMemoryBudgetFactor(), gAgentCamera.mDrawDistance / 2.f); + } + + if (tp_state == LLAgent::TELEPORT_ARRIVING || LLStartUp::getStartupState() < STATE_MISC) + { + // Inform interest list, prioritize closer area. + // Reason: currently server doesn't distance sort attachments, by restricting range + // we reduce the number of attachments sent to the viewer, thus prioritizing + // closer ones. + // Todo: revise and remove once server gets distance sorting. + last_draw_disatance_step = llmax((F32)(gAgentCamera.mDrawDistance / 2.f), 50.f); + last_draw_disatance_step = llmin(last_draw_disatance_step, memory_limited_draw_distance); + msg->addF32Fast(_PREHASH_Far, last_draw_disatance_step); + } + else if (last_draw_disatance_step < memory_limited_draw_distance) + { + static LLFrameTimer last_step_time; + if (last_step_time.getElapsedTimeF32() > 1.f) + { + // gradually increase draw distance + last_step_time.reset(); + F32 step = memory_limited_draw_distance * 0.1f; + last_draw_disatance_step = llmin(last_draw_disatance_step + step, memory_limited_draw_distance); + } + msg->addF32Fast(_PREHASH_Far, last_draw_disatance_step); + } + else + { + last_draw_disatance_step = memory_limited_draw_distance; + msg->addF32Fast(_PREHASH_Far, memory_limited_draw_distance); + } msg->addU32Fast(_PREHASH_ControlFlags, control_flags); @@ -3350,6 +3453,7 @@ void send_agent_update(bool force_send, bool send_reliable) // remember last update data last_send_time = now; + control_flags_follow_up = last_control_flags != control_flags; last_control_flags = control_flags; last_render_state = render_state; last_flags = flags; @@ -3599,7 +3703,7 @@ void process_kill_object(LLMessageSystem *mesgsys, void **user_data) gObjectList.killObject(objectp); } - if(delete_object) + if(delete_object && regionp) { regionp->killCacheEntry(local_id); } @@ -4143,6 +4247,8 @@ void process_avatar_sit_response(LLMessageSystem *mesgsys, void **user_data) { LL_WARNS("Messaging") << "Received sit approval for unknown object " << sitObjectID << LL_ENDL; } + + gAgent.setSitObjectID(sitObjectID); } void process_clear_follow_cam_properties(LLMessageSystem *mesgsys, void **user_data) @@ -5008,6 +5114,7 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem) false, //UI gSavedSettings.getBOOL("RenderHUDInSnapshot"), false, + false, LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::SNAPSHOT_FORMAT_PNG); } @@ -5113,6 +5220,7 @@ static void process_special_alert_messages(const std::string & message) false, gSavedSettings.getBOOL("RenderHUDInSnapshot"), false, + false, LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::SNAPSHOT_FORMAT_PNG); } @@ -6610,7 +6718,6 @@ void process_initiate_download(LLMessageSystem* msg, void**) (void**)new std::string(viewer_filename)); } - void process_script_teleport_request(LLMessageSystem* msg, void**) { if (!gSavedSettings.getBOOL("ScriptsCanShowUI")) return; @@ -6624,6 +6731,11 @@ void process_script_teleport_request(LLMessageSystem* msg, void**) msg->getString("Data", "SimName", sim_name); msg->getVector3("Data", "SimPosition", pos); msg->getVector3("Data", "LookAt", look_at); + U32 flags = (BEACON_SHOW_MAP | BEACON_FOCUS_MAP); + if (msg->has("Options")) + { + msg->getU32("Options", "Flags", flags); + } LLFloaterWorldMap* instance = LLFloaterWorldMap::getInstance(); if(instance) @@ -6634,7 +6746,13 @@ void process_script_teleport_request(LLMessageSystem* msg, void**) << LL_ENDL; instance->trackURL(sim_name, (S32)pos.mV[VX], (S32)pos.mV[VY], (S32)pos.mV[VZ]); - LLFloaterReg::showInstance("world_map", "center"); + if (flags & BEACON_SHOW_MAP) + { + bool old_auto_focus = instance->getAutoFocus(); + instance->setAutoFocus(flags & BEACON_FOCUS_MAP); + instance->openFloater("center"); + instance->setAutoFocus(old_auto_focus); + } } // remove above two lines and replace with below line diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h index 52f383faa9..00743909f0 100644 --- a/indra/newview/llviewermessage.h +++ b/indra/newview/llviewermessage.h @@ -36,9 +36,10 @@ #include "llnotifications.h" #include "llextendedstatus.h" -#include <boost/function.hpp> #include <boost/signals2.hpp> +#include <functional> + // // Forward declarations // @@ -216,7 +217,7 @@ class LLViewerMessage : public LLSingleton<LLViewerMessage> { LLSINGLETON_EMPTY_CTOR(LLViewerMessage); public: - typedef boost::function<void()> teleport_started_callback_t; + typedef std::function<void()> teleport_started_callback_t; typedef boost::signals2::signal<void()> teleport_started_signal_t; boost::signals2::connection setTeleportStartedCallback(teleport_started_callback_t cb); @@ -264,7 +265,7 @@ private: std::string getSanitizedDescription(); void sendReceiveResponse(bool accept, const LLUUID &destination_folder_id); - typedef boost::function<bool (const LLSD&, const LLSD&)> respond_function_t; + typedef std::function<bool (const LLSD&, const LLSD&)> respond_function_t; typedef std::map<std::string, respond_function_t> respond_function_map_t; respond_function_map_t mRespondFunctions; diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp index b8c9594aa7..890580ddff 100644 --- a/indra/newview/llviewernetwork.cpp +++ b/indra/newview/llviewernetwork.cpp @@ -69,7 +69,7 @@ const std::string MAIN_GRID_LOGIN_URI = "https://login.agni.lindenlab.com/cgi-bi const std::string SL_UPDATE_QUERY_URL = "https://update.secondlife.com/update"; -const std::string MAIN_GRID_SLURL_BASE = "http://maps.secondlife.com/secondlife/"; +const std::string MAIN_GRID_SLURL_BASE = "https://maps.secondlife.com/secondlife/"; const std::string SYSTEM_GRID_APP_SLURL_BASE = "secondlife:///app"; const std::string MAIN_GRID_WEB_PROFILE_URL = "https://my.secondlife.com/"; @@ -281,7 +281,7 @@ bool LLGridManager::addGrid(LLSD& grid_data) // Populate to the default values if (!grid_data.has(GRID_LOGIN_PAGE_VALUE)) { - grid_data[GRID_LOGIN_PAGE_VALUE] = std::string("http://") + grid + "/app/login/"; + grid_data[GRID_LOGIN_PAGE_VALUE] = std::string("https://") + grid + "/app/login/"; } if (!grid_data.has(GRID_HELPER_URI_VALUE)) { @@ -450,7 +450,7 @@ std::string LLGridManager::getGridLabel(const std::string& grid) { std::string grid_label; std::string grid_name = getGrid(grid); - if (!grid.empty()) + if (!grid_name.empty()) { grid_label = mGridList[grid_name][GRID_LABEL_VALUE].asString(); } @@ -466,7 +466,7 @@ std::string LLGridManager::getGridId(const std::string& grid) { std::string grid_id; std::string grid_name = getGrid(grid); - if (!grid.empty()) + if (!grid_name.empty()) { grid_id = mGridList[grid_name][GRID_ID_VALUE].asString(); } @@ -629,18 +629,6 @@ bool LLGridManager::isInProductionGrid() return mIsInProductionGrid; } -bool LLGridManager::isInSecondlife() -{ - //return (isInSLMain() || isInSLBeta()); - return true; -} - -bool LLGridManager::isInOpenSim() -{ - // FIX THIS TO SUPPORT OPENSIM - return false; -} - bool LLGridManager::isSystemGrid(const std::string& grid) { std::string grid_name = getGrid(grid); diff --git a/indra/newview/llviewernetwork.h b/indra/newview/llviewernetwork.h index 7d9c70994c..2ed663e038 100644 --- a/indra/newview/llviewernetwork.h +++ b/indra/newview/llviewernetwork.h @@ -174,20 +174,6 @@ class LLGridManager : public LLSingleton<LLGridManager> //@} - typedef enum e_grid_platform { - NOPLATFORM = 0, - SLMAIN, - SLBETA, - OPENSIM, - HALCYON - } EGridPlatform; - - typedef enum e_add_grid { - ADD_MANUAL = 0, - ADD_HYPERGRID, - ADD_LINK - } EAddGridType; - /* ================================================================ * @name Selecting the current grid * @{ @@ -212,11 +198,6 @@ class LLGridManager : public LLSingleton<LLGridManager> /// Is the selected grid one of the hard-coded default grids (Agni or Aditi) bool isSystemGrid() { return isSystemGrid(mGrid); } - /// Is the selected grid Second Life? - bool isInSecondlife(); - - bool isInOpenSim(); - /// Is the selected grid a production grid? bool isInProductionGrid(); /** diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 41b2c4b44b..f7b1fb004f 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -310,6 +310,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe mAttachmentItemID(LLUUID::null), mLastUpdateType(OUT_UNKNOWN), mLastUpdateCached(false), + mLocked(false), mCachedMuteListUpdateTime(0), mCachedOwnerInMuteList(false), mRiggedAttachedWarned(false) @@ -1290,7 +1291,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, #endif //clear cost and linkset cost setObjectCostStale(); - if (isSelected()) + if (isSelected() && gFloaterTools) { gFloaterTools->dirty(); } @@ -1729,7 +1730,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, #endif setObjectCostStale(); - if (isSelected()) + if (isSelected() && gFloaterTools) { gFloaterTools->dirty(); } @@ -2325,6 +2326,12 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, // Set the rotation of the object followed by adjusting for the accumulated angular velocity (llSetTargetOmega) setRotation(new_rot * mAngularVelocityRot); + if ((mFlags & FLAGS_SERVER_AUTOPILOT) && asAvatar() && asAvatar()->isSelf()) + { + gAgent.resetAxes(); + gAgent.rotate(new_rot); + gAgentCamera.resetView(); + } setChanged(ROTATED | SILHOUETTE); } @@ -2928,15 +2935,15 @@ void LLViewerObject::fetchInventoryFromServer() else { LL_WARNS() << "Using old task inventory path!" << LL_ENDL; - // Results in processTaskInv - 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()); + // Results in processTaskInv + 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()); } } } @@ -2982,8 +2989,8 @@ void LLViewerObject::fetchInventoryFromCapCoro(const LLUUID task_inv) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("TaskInventoryRequest", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("TaskInventoryRequest", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); std::string url = obj->mRegionp->getCapability("RequestTaskInventory") + "?task_id=" + obj->mID.asString(); // If we already have a copy of the inventory then add it so the server won't re-send something we already have. // We expect this case to crop up in the case of failed inventory mutations, but it might happen otherwise as well. @@ -3885,7 +3892,7 @@ void LLViewerObject::setObjectCost(F32 cost) mObjectCost = cost; mCostStale = false; - if (isSelected()) + if (isSelected() && gFloaterTools) { gFloaterTools->dirty(); } @@ -3905,7 +3912,7 @@ void LLViewerObject::setLinksetCost(F32 cost) iter++; } - if (needs_refresh) + if (needs_refresh && gFloaterTools) { gFloaterTools->dirty(); } @@ -3916,7 +3923,7 @@ void LLViewerObject::setPhysicsCost(F32 cost) mPhysicsCost = cost; mCostStale = false; - if (isSelected()) + if (isSelected() && gFloaterTools) { gFloaterTools->dirty(); } @@ -3927,7 +3934,7 @@ void LLViewerObject::setLinksetPhysicsCost(F32 cost) mLinksetPhysicsCost = cost; mCostStale = false; - if (isSelected()) + if (isSelected() && gFloaterTools) { gFloaterTools->dirty(); } @@ -4178,8 +4185,11 @@ void LLViewerObject::boostTexturePriority(bool boost_children /* = true */) if (isSculpted() && !isMesh()) { LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); - LLUUID sculpt_id = sculpt_params->getSculptTexture(); - LLViewerTextureManager::getFetchedTexture(sculpt_id, FTT_DEFAULT, true, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLGLTexture::BOOST_SELECTED); + if (sculpt_params) + { + LLUUID sculpt_id = sculpt_params->getSculptTexture(); + LLViewerTextureManager::getFetchedTexture(sculpt_id, FTT_DEFAULT, true, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLGLTexture::BOOST_SELECTED); + } } if (boost_children) @@ -4820,6 +4830,18 @@ void LLViewerObject::setPositionParent(const LLVector3 &pos_parent, bool damped) else { setPositionRegion(pos_parent, damped); + + // #1964 mark reflection probe in the linkset to update position after moving via script + for (LLViewerObject* child : mChildList) + { + if (child && child->isReflectionProbe()) + { + if (LLDrawable* drawablep = child->mDrawable) + { + gPipeline.markMoved(drawablep); + } + } + } } } @@ -5069,11 +5091,10 @@ void LLViewerObject::setNumTEs(const U8 num_tes) if (base_material && override_material) { tep->setGLTFMaterialOverride(new LLGLTFMaterial(*override_material)); - - LLGLTFMaterial* render_material = new LLFetchedGLTFMaterial(); - *render_material = *base_material; - render_material->applyOverride(*override_material); - tep->setGLTFRenderMaterial(render_material); + } + if (base_material) + { + initRenderMaterial(i); } } } @@ -5249,6 +5270,9 @@ void LLViewerObject::updateTEMaterialTextures(U8 te) }); } getTE(te)->setGLTFMaterial(mat); + initRenderMaterial(te); + mat = (LLFetchedGLTFMaterial*) getTE(te)->getGLTFRenderMaterial(); + llassert(mat == nullptr || dynamic_cast<LLFetchedGLTFMaterial*>(getTE(te)->getGLTFRenderMaterial()) != nullptr); } else if (mat_id.isNull() && mat != nullptr) { @@ -5638,6 +5662,42 @@ S32 LLViewerObject::setTEMaterialParams(const U8 te, const LLMaterialPtr pMateri return retval; } +// Set render material if there are overrides or if the base material is has a +// baked texture. Otherwise, set it to null. +// If you are setting the material override and not sending an update message, +// you should probably call this function. +S32 LLViewerObject::initRenderMaterial(U8 te) +{ + LL_PROFILE_ZONE_SCOPED; + + LLTextureEntry* tep = getTE(te); + if (!tep) { return 0; } + const LLFetchedGLTFMaterial* base_material = static_cast<LLFetchedGLTFMaterial*>(tep->getGLTFMaterial()); + llassert(base_material); + if (!base_material) { return 0; } + const LLGLTFMaterial* override_material = tep->getGLTFMaterialOverride(); + LLFetchedGLTFMaterial* render_material = nullptr; + bool need_render_material = override_material; + if (!need_render_material) + { + for (const LLUUID& texture_id : base_material->mTextureId) + { + if (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(texture_id)) + { + need_render_material = true; + break; + } + } + } + if (need_render_material) + { + render_material = new LLFetchedGLTFMaterial(*base_material); + if (override_material) { render_material->applyOverride(*override_material); } + render_material->clearFetchedTextures(); + } + return tep->setGLTFRenderMaterial(render_material); +} + S32 LLViewerObject::setTEGLTFMaterialOverride(U8 te, LLGLTFMaterial* override_mat) { LL_PROFILE_ZONE_SCOPED; @@ -5671,22 +5731,13 @@ S32 LLViewerObject::setTEGLTFMaterialOverride(U8 te, LLGLTFMaterial* override_ma if (retval) { + retval = initRenderMaterial(te) | retval; if (override_mat) { - LLFetchedGLTFMaterial* render_mat = new LLFetchedGLTFMaterial(*src_mat); - render_mat->applyOverride(*override_mat); - tep->setGLTFRenderMaterial(render_mat); - retval = TEM_CHANGE_TEXTURE; - for (LLGLTFMaterial::local_tex_map_t::value_type &val : override_mat->mTrackingIdToLocalTexture) { LLLocalBitmapMgr::getInstance()->associateGLTFMaterial(val.first, override_mat); } - - } - else if (tep->setGLTFRenderMaterial(nullptr)) - { - retval = TEM_CHANGE_TEXTURE; } } @@ -7185,7 +7236,7 @@ void LLAlphaObject::getBlendFunc(S32 face, LLRender::eBlendFactor& src, LLRender void LLStaticViewerObject::updateDrawable(bool force_damped) { // Force an immediate rebuild on any update - if (mDrawable.notNull()) + if (mDrawable.notNull() && mDrawable->getVObj()) { mDrawable->updateXform(true); gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL); @@ -7556,25 +7607,15 @@ void LLViewerObject::setRenderMaterialID(S32 te_in, const LLUUID& id, bool updat // the overrides have not changed due to being only texture // transforms. Re-apply the overrides to the render material here, // if present. - const LLGLTFMaterial* override_material = tep->getGLTFMaterialOverride(); - if (override_material) + // Also, sometimes, the material has baked textures, which requires + // a copy unique to this object. + // Currently, we do not deduplicate render materials. + new_material->onMaterialComplete([obj_id = getID(), te]() { - new_material->onMaterialComplete([obj_id = getID(), te]() - { - LLViewerObject* obj = gObjectList.findObject(obj_id); - if (!obj) { return; } - LLTextureEntry* tep = obj->getTE(te); - if (!tep) { return; } - const LLGLTFMaterial* new_material = tep->getGLTFMaterial(); - if (!new_material) { return; } - const LLGLTFMaterial* override_material = tep->getGLTFMaterialOverride(); - if (!override_material) { return; } - LLGLTFMaterial* render_material = new LLFetchedGLTFMaterial(); - *render_material = *new_material; - render_material->applyOverride(*override_material); - tep->setGLTFRenderMaterial(render_material); - }); - } + LLViewerObject* obj = gObjectList.findObject(obj_id); + if (!obj) { return; } + obj->initRenderMaterial(te); + }); } } @@ -7670,6 +7711,76 @@ void LLViewerObject::setGLTFAsset(const LLUUID& id) updateVolume(volume_params); } +void LLViewerObject::clearTEWaterExclusion(const U8 te) +{ + if (permModify()) + { + LLViewerTexture* image = getTEImage(te); + if (image && (IMG_ALPHA_GRAD == image->getID())) + { + // reset texture to default plywood + setTEImage(te, LLViewerTextureManager::getFetchedTexture(DEFAULT_OBJECT_TEXTURE, FTT_DEFAULT, true, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); + + // reset texture repeats, that might be altered by invisiprim script from wiki + U32 s_axis, t_axis; + if (!LLPrimitive::getTESTAxes(te, &s_axis, &t_axis)) + { + return; + } + F32 DEFAULT_REPEATS = 2.f; + F32 new_s = getScale().mV[s_axis] * DEFAULT_REPEATS; + F32 new_t = getScale().mV[t_axis] * DEFAULT_REPEATS; + + setTEScale(te, new_s, new_t); + sendTEUpdate(); + } + } +} + +bool LLViewerObject::isReachable() +{ + LLViewerRegion* agent_region = gAgent.getRegion(); + LLViewerRegion* object_region = getRegion(); + + if (!agent_region || !object_region) + { + return false; + } + if (agent_region == object_region) + { + return true; + } + + std::unordered_set<LLViewerRegion*> visited; + std::queue<LLViewerRegion*> pending; + visited.insert(agent_region); + pending.push(agent_region); + + while (!pending.empty()) + { + LLViewerRegion* current = pending.front(); + pending.pop(); + + std::vector<LLViewerRegion*> neighbors; + current->getNeighboringRegions(neighbors); + + for (LLViewerRegion* neighbor : neighbors) + { + if (!neighbor) continue; + + if (neighbor == object_region) + { + return true; + } + // region's neighbors were not checked + if (visited.insert(neighbor).second) + { + pending.push(neighbor); + } + } + } + return false; +} class ObjectPhysicsProperties : public LLHTTPNode { diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 63458e60ea..6e26da74e7 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -249,6 +249,9 @@ public: // Accessor functions LLViewerRegion* getRegion() const { return mRegionp; } + // Check if object is reachable from agent region by traversing loaded neighboring regions + bool isReachable(); + bool isSelected() const { return mUserSelected; } // Check whole linkset bool isAnySelected() const; @@ -389,6 +392,7 @@ public: /*virtual*/ S32 setTEGlow(const U8 te, const F32 glow); /*virtual*/ S32 setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID); /*virtual*/ S32 setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams); + S32 initRenderMaterial(const U8 te); virtual S32 setTEGLTFMaterialOverride(U8 te, LLGLTFMaterial* mat); // Used by Materials update functions to properly kick off rebuilds @@ -405,6 +409,8 @@ public: LLViewerTexture *getTENormalMap(const U8 te) const; LLViewerTexture *getTESpecularMap(const U8 te) const; + void clearTEWaterExclusion(const U8 te); + bool isImageAlphaBlended(const U8 te) const; void fitFaceTexture(const U8 face); @@ -972,10 +978,14 @@ public: LLJointRiggingInfoTab mJointRiggingInfoTab; + bool isLocked() const { return mLocked; } + void setLocked(bool locked) { mLocked = locked; } + private: LLUUID mAttachmentItemID; // ItemID of the associated object is in user inventory. EObjectUpdateType mLastUpdateType; bool mLastUpdateCached; + bool mLocked; public: // reflection probe state diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index d72d428c08..e41f5bc206 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -68,7 +68,7 @@ #include "u64.h" #include "llviewertexturelist.h" #include "lldatapacker.h" -#ifdef LL_USESYSTEMLIBS +#if 1 #include <zlib.h> #else #include "zlib-ng/zlib.h" @@ -1055,8 +1055,8 @@ void LLViewerObjectList::fetchObjectCostsCoro(std::string url) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("genericPostCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("fetchObjectCostsCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); @@ -1070,7 +1070,7 @@ void LLViewerObjectList::fetchObjectCostsCoro(std::string url) if (diff.empty()) { - LL_INFOS() << "No outstanding object IDs to request. Pending count: " << mPendingObjectCost.size() << LL_ENDL; + LL_DEBUGS() << "No outstanding object IDs to request. Pending count: " << mPendingObjectCost.size() << LL_ENDL; return; } @@ -1179,8 +1179,8 @@ void LLViewerObjectList::fetchPhisicsFlagsCoro(std::string url) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("genericPostCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("fetchPhisicsFlagsCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD idList; U32 objectIndex = 0; @@ -1205,7 +1205,7 @@ void LLViewerObjectList::fetchPhisicsFlagsCoro(std::string url) if (idList.size() < 1) { - LL_INFOS() << "No outstanding object physics flags to request." << LL_ENDL; + LL_DEBUGS() << "No outstanding object physics flags to request." << LL_ENDL; return; } diff --git a/indra/newview/llviewerparcelaskplay.h b/indra/newview/llviewerparcelaskplay.h index 720daa2e5d..563fb13011 100644 --- a/indra/newview/llviewerparcelaskplay.h +++ b/indra/newview/llviewerparcelaskplay.h @@ -38,7 +38,7 @@ class LLViewerParcelAskPlay : public LLSingleton<LLViewerParcelAskPlay> void cleanupSingleton() override; public: // functor expects functor(region_id, parcel_id, url, play/stop) - typedef boost::function<void(const LLUUID&, const S32&, const std::string&, const bool&)> ask_callback; + typedef std::function<void(const LLUUID&, const S32&, const std::string&, const bool&)> ask_callback; void askToPlay(const LLUUID ®ion_id, const S32 &parcel_id, const std::string &url, ask_callback cb); void cancelNotification(); diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 8e6657b4b9..432da2e990 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -42,6 +42,7 @@ // Viewer includes #include "llagent.h" #include "llagentaccess.h" +#include "llcallbacklist.h" #include "llviewerparcelaskplay.h" #include "llviewerwindow.h" #include "llviewercontrol.h" @@ -1327,12 +1328,12 @@ const S32 LLViewerParcelMgr::getAgentParcelId() const return INVALID_PARCEL_ID; } -void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel, bool use_agent_region) +void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel) { if(!parcel) return; - LLViewerRegion *region = use_agent_region ? gAgent.getRegion() : LLWorld::getInstance()->getRegionFromPosGlobal( mWestSouth ); + LLViewerRegion *region = LLWorld::getInstance()->getRegionFromID(parcel->getRegionID()); if (!region) return; @@ -1676,10 +1677,16 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use // Actually extract the data. if (parcel) { + // store region_id in the parcel so we can find it again later + LLViewerRegion* parcel_region = LLWorld::getInstance()->getRegion(msg->getSender()); + if (parcel_region) + { + parcel->setRegionID(parcel_region->getRegionID()); + } + if (local_id == parcel_mgr.mAgentParcel->getLocalID()) { // Parcels in different regions can have same ids. - LLViewerRegion* parcel_region = LLWorld::getInstance()->getRegion(msg->getSender()); LLViewerRegion* agent_region = gAgent.getRegion(); if (parcel_region && agent_region && parcel_region->getRegionID() == agent_region->getRegionID()) { @@ -1750,6 +1757,8 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use { instance->mTeleportFinishedSignal(instance->mTeleportInProgressPosition, false); } + instance->postTeleportFinished(instance->mTeleportWithinRegion); + instance->mTeleportWithinRegion = false; } parcel->setParcelEnvironmentVersion(parcel_environment_version); LL_DEBUGS("ENVIRONMENT") << "Parcel environment version is " << parcel->getParcelEnvironmentVersion() << LL_ENDL; @@ -2719,6 +2728,8 @@ void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos // Local teleport. We already have the agent parcel data. // Emit the signal immediately. getInstance()->mTeleportFinishedSignal(new_pos, local); + + postTeleportFinished(true); } else { @@ -2727,12 +2738,14 @@ void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos // Let's wait for the update and then emit the signal. mTeleportInProgressPosition = new_pos; mTeleportInProgress = true; + mTeleportWithinRegion = local; } } void LLViewerParcelMgr::onTeleportFailed() { mTeleportFailedSignal(); + LLEventPumps::instance().obtain("LLTeleport").post(llsd::map("success", false)); } bool LLViewerParcelMgr::getTeleportInProgress() @@ -2740,3 +2753,20 @@ bool LLViewerParcelMgr::getTeleportInProgress() return mTeleportInProgress // case where parcel data arrives after teleport || gAgent.getTeleportState() > LLAgent::TELEPORT_NONE; // For LOCAL, no mTeleportInProgress } + +void LLViewerParcelMgr::postTeleportFinished(bool local) +{ + auto post = []() + { + LLEventPumps::instance().obtain("LLTeleport").post(llsd::map("success", true)); + }; + if (local) + { + static LLCachedControl<F32> teleport_local_delay(gSavedSettings, "TeleportLocalDelay"); + doAfterInterval(post, teleport_local_delay + 0.5f); + } + else + { + post(); + } +} diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h index 974ea39359..8439283eb0 100644 --- a/indra/newview/llviewerparcelmgr.h +++ b/indra/newview/llviewerparcelmgr.h @@ -33,9 +33,10 @@ #include "llparcelselection.h" #include "llui.h" -#include <boost/function.hpp> #include <boost/signals2.hpp> +#include <functional> + class LLUUID; class LLMessageSystem; class LLParcel; @@ -79,9 +80,9 @@ class LLViewerParcelMgr : public LLSingleton<LLViewerParcelMgr> ~LLViewerParcelMgr(); public: - typedef boost::function<void (const LLVector3d&, const bool& local)> teleport_finished_callback_t; + typedef std::function<void (const LLVector3d&, const bool& local)> teleport_finished_callback_t; typedef boost::signals2::signal<void (const LLVector3d&, const bool&)> teleport_finished_signal_t; - typedef boost::function<void()> teleport_failed_callback_t; + typedef std::function<void()> teleport_failed_callback_t; typedef boost::signals2::signal<void()> teleport_failed_signal_t; static void cleanupGlobals(); @@ -219,7 +220,7 @@ public: // containing the southwest corner of the selection. // If want_reply_to_update, simulator will send back a ParcelProperties // message. - void sendParcelPropertiesUpdate(LLParcel* parcel, bool use_agent_region = false); + void sendParcelPropertiesUpdate(LLParcel* parcel); // Takes an Access List flag, like AL_ACCESS or AL_BAN void sendParcelAccessListUpdate(U32 which); @@ -295,6 +296,8 @@ public: void onTeleportFailed(); bool getTeleportInProgress(); + void postTeleportFinished(bool local); + static bool isParcelOwnedByAgent(const LLParcel* parcelp, U64 group_proxy_power); static bool isParcelModifiableByAgent(const LLParcel* parcelp, U64 group_proxy_power); @@ -344,7 +347,9 @@ private: std::vector<LLParcelObserver*> mObservers; + // Used to communicate between onTeleportFinished() and processParcelProperties() bool mTeleportInProgress; + bool mTeleportWithinRegion{ false }; LLVector3d mTeleportInProgressPosition; teleport_finished_signal_t mTeleportFinishedSignal; teleport_failed_signal_t mTeleportFailedSignal; diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp index 2e9b5de72b..0bb03cdd60 100755 --- a/indra/newview/llviewerparceloverlay.cpp +++ b/indra/newview/llviewerparceloverlay.cpp @@ -33,6 +33,7 @@ #include "llfloaterreg.h" #include "llgl.h" #include "llrender.h" +#include "lluicolor.h" #include "v4color.h" #include "v2math.h" @@ -50,8 +51,8 @@ #include "pipeline.h" -static const U8 OVERLAY_IMG_COMPONENTS = 4; -static const F32 LINE_WIDTH = 0.0625f; +static constexpr U8 OVERLAY_IMG_COMPONENTS = 4; +static constexpr F32 LINE_WIDTH = 0.0625f; bool LLViewerParcelOverlay::sColorSetInitialized = false; LLUIColor LLViewerParcelOverlay::sAvailColor; @@ -91,7 +92,7 @@ LLViewerParcelOverlay::LLViewerParcelOverlay(LLViewerRegion* region, F32 region_ // Initialize the GL texture with empty data. // // Create the base texture. - U8 *raw = mImageRaw->getData(); + U8* raw = mImageRaw->getData(); const S32 COUNT = mParcelGridsPerEdge * mParcelGridsPerEdge * OVERLAY_IMG_COMPONENTS; for (S32 i = 0; i < COUNT; i++) { @@ -158,10 +159,10 @@ bool LLViewerParcelOverlay::encroachesOwned(const std::vector<LLBBox>& boxes) co LLVector3 min = boxes[i].getMinAgent(); LLVector3 max = boxes[i].getMaxAgent(); - S32 left = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); - S32 right = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); - S32 top = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); - S32 bottom = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); + S32 left = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f)); + S32 right = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f)); + S32 top = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f)); + S32 bottom = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f)); for (S32 row = top; row <= bottom; row++) { @@ -186,10 +187,10 @@ bool LLViewerParcelOverlay::encroachesOnUnowned(const std::vector<LLBBox>& boxes LLVector3 min = boxes[i].getMinAgent(); LLVector3 max = boxes[i].getMaxAgent(); - S32 left = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); - S32 right = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); - S32 top = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); - S32 bottom = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); + S32 left = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f)); + S32 right = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f)); + S32 top = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f)); + S32 bottom = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f)); for (S32 row = top; row <= bottom; row++) { @@ -223,10 +224,10 @@ bool LLViewerParcelOverlay::encroachesOnNearbyParcel(const std::vector<LLBBox>& return true; } - S32 left = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); - S32 right = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); - S32 bottom = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); - S32 top = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); + S32 left = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f)); + S32 right = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f)); + S32 bottom = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f)); + S32 top = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1.f)); const S32 GRIDS_PER_EDGE = mParcelGridsPerEdge; @@ -348,11 +349,11 @@ void LLViewerParcelOverlay::updateOverlayTexture() const LLColor4U auction = sAuctionColor.get(); // Create the base texture. - U8 *raw = mImageRaw->getData(); + U8* raw = mImageRaw->getData(); const S32 COUNT = mParcelGridsPerEdge * mParcelGridsPerEdge; S32 max = mOverlayTextureIdx + mParcelGridsPerEdge; if (max > COUNT) max = COUNT; - S32 pixel_index = mOverlayTextureIdx*OVERLAY_IMG_COMPONENTS; + S32 pixel_index = mOverlayTextureIdx * OVERLAY_IMG_COMPONENTS; S32 i; for (i = mOverlayTextureIdx; i < max; i++) { @@ -361,7 +362,7 @@ void LLViewerParcelOverlay::updateOverlayTexture() U8 r,g,b,a; // Color stored in low three bits - switch( ownership & 0x7 ) + switch (ownership & 0x7) { case PARCEL_PUBLIC: r = avail.mV[VRED]; @@ -407,10 +408,10 @@ void LLViewerParcelOverlay::updateOverlayTexture() break; } - raw[pixel_index + 0] = (U8)r; - raw[pixel_index + 1] = (U8)g; - raw[pixel_index + 2] = (U8)b; - raw[pixel_index + 3] = (U8)a; + raw[pixel_index + VRED] = (U8)r; + raw[pixel_index + VGREEN] = (U8)g; + raw[pixel_index + VBLUE] = (U8)b; + raw[pixel_index + VALPHA] = (U8)a; pixel_index += OVERLAY_IMG_COMPONENTS; } @@ -431,11 +432,10 @@ void LLViewerParcelOverlay::updateOverlayTexture() } } - -void LLViewerParcelOverlay::uncompressLandOverlay(S32 chunk, U8 *packed_overlay) +void LLViewerParcelOverlay::uncompressLandOverlay(S32 chunk, U8* packed_overlay) { // Unpack the message data into the ownership array - S32 size = mParcelGridsPerEdge * mParcelGridsPerEdge; + S32 size = mParcelGridsPerEdge * mParcelGridsPerEdge; S32 chunk_size = size / PARCEL_OVERLAY_CHUNKS; memcpy(mOwnership + chunk*chunk_size, packed_overlay, chunk_size); /*Flawfinder: ignore*/ @@ -460,7 +460,7 @@ void LLViewerParcelOverlay::updatePropertyLines() mEdges.clear(); - const F32 GRID_STEP = PARCEL_GRID_STEP_METERS; + constexpr F32 GRID_STEP = PARCEL_GRID_STEP_METERS; const S32 GRIDS_PER_EDGE = mParcelGridsPerEdge; for (S32 row = 0; row < GRIDS_PER_EDGE; row++) @@ -537,16 +537,16 @@ void LLViewerParcelOverlay::addPropertyLine(F32 start_x, F32 start_y, F32 dx, F3 auto split = [&](const LLVector3& start, F32 x, F32 y, F32 z, F32 part) { - F32 new_x = start.mV[0] + (x - start.mV[0]) * part; - F32 new_y = start.mV[1] + (y - start.mV[1]) * part; - F32 new_z = start.mV[2] + (z - start.mV[2]) * part; + F32 new_x = start.mV[VX] + (x - start.mV[VX]) * part; + F32 new_y = start.mV[VY] + (y - start.mV[VY]) * part; + F32 new_z = start.mV[VZ] + (z - start.mV[VZ]) * part; edge.vertices.emplace_back(new_x, new_y, new_z); }; auto checkForSplit = [&]() { const LLVector3& last_outside = edge.vertices.back(); - F32 z0 = last_outside.mV[2]; + F32 z0 = last_outside.mV[VZ]; F32 z1 = outside_z; if ((z0 >= water_z && z1 >= water_z) || (z0 < water_z && z1 < water_z)) return; @@ -581,7 +581,7 @@ void LLViewerParcelOverlay::addPropertyLine(F32 start_x, F32 start_y, F32 dx, F3 outside_y += dy * (dy - LINE_WIDTH); // Middle part, full width - const S32 GRID_STEP = S32( PARCEL_GRID_STEP_METERS ); + constexpr S32 GRID_STEP = (S32)PARCEL_GRID_STEP_METERS; for (S32 i = 1; i < GRID_STEP; i++) { inside_z = land.resolveHeightRegion( inside_x, inside_y ); @@ -666,7 +666,9 @@ void LLViewerParcelOverlay::renderPropertyLines() return; LLSurface& land = mRegion->getLand(); - F32 water_z = land.getWaterHeight() + 0.01f; + + bool render_water = gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_WATER); + F32 water_z = render_water ? land.getWaterHeight() + 0.01f : 0; LLGLSUIDefault gls_ui; // called from pipeline gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); @@ -709,7 +711,7 @@ void LLViewerParcelOverlay::renderPropertyLines() bool render_hidden = LLSelectMgr::sRenderHiddenSelections && LLFloaterReg::instanceVisible("build"); - const F32 PROPERTY_LINE_CLIP_DIST_SQUARED = 256.f * 256.f; + constexpr F32 PROPERTY_LINE_CLIP_DIST_SQUARED = 256.f * 256.f; for (const Edge& edge : mEdges) { @@ -742,7 +744,7 @@ void LLViewerParcelOverlay::renderPropertyLines() else { LLVector3 visible = vertex; - visible.mV[2] = water_z; + visible.mV[VZ] = water_z; gGL.vertex3fv(visible.mV); } } @@ -756,7 +758,7 @@ void LLViewerParcelOverlay::renderPropertyLines() gGL.begin(LLRender::TRIANGLE_STRIP); LLColor4U color = edge.color; - color.mV[3] /= 4; + color.mV[VALPHA] /= 4; gGL.color4ubv(color.mV); for (const LLVector3& vertex : edge.vertices) @@ -790,7 +792,7 @@ void grid_2d_part_lines(const F32 left, const F32 top, const F32 right, const F3 gGL.end(); } -void LLViewerParcelOverlay::renderPropertyLinesOnMinimap(F32 scale_pixels_per_meter, const F32 *parcel_outline_color) +void LLViewerParcelOverlay::renderPropertyLinesOnMinimap(F32 scale_pixels_per_meter, const F32* parcel_outline_color) { static LLCachedControl<bool> show(gSavedSettings, "MiniMapShowPropertyLines"); @@ -801,13 +803,13 @@ void LLViewerParcelOverlay::renderPropertyLinesOnMinimap(F32 scale_pixels_per_me LLVector3 origin_agent = mRegion->getOriginAgent(); LLVector3 rel_region_pos = origin_agent - gAgentCamera.getCameraPositionAgent(); - F32 region_left = rel_region_pos.mV[0] * scale_pixels_per_meter; - F32 region_bottom = rel_region_pos.mV[1] * scale_pixels_per_meter; + F32 region_left = rel_region_pos.mV[VX] * scale_pixels_per_meter; + F32 region_bottom = rel_region_pos.mV[VY] * scale_pixels_per_meter; F32 map_parcel_width = PARCEL_GRID_STEP_METERS * scale_pixels_per_meter; const S32 GRIDS_PER_EDGE = mParcelGridsPerEdge; gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - glLineWidth(1.0f); + //glLineWidth(1.0f); gGL.color4fv(parcel_outline_color); for (S32 i = 0; i <= GRIDS_PER_EDGE; i++) { diff --git a/indra/newview/llviewerparceloverlay.h b/indra/newview/llviewerparceloverlay.h index 03ae464cb8..50bef02ddf 100644 --- a/indra/newview/llviewerparceloverlay.h +++ b/indra/newview/llviewerparceloverlay.h @@ -34,12 +34,11 @@ #include "llframetimer.h" #include "lluuid.h" #include "llviewertexture.h" -#include "llgl.h" -#include "lluicolor.h" class LLViewerRegion; class LLVector3; class LLColor4U; +class LLUIColor; class LLVector2; class LLViewerParcelOverlay : public LLGLUpdate @@ -65,19 +64,18 @@ public: bool isSoundLocal(const LLVector3& pos) const; - bool isBuildCameraAllowed(const LLVector3& pos) const; F32 getOwnedRatio() const; // Returns the number of vertices drawn void renderPropertyLines(); void renderPropertyLinesOnMinimap(F32 scale_pixels_per_meter, const F32* parcel_outline_color); - U8 ownership( const LLVector3& pos) const; - U8 parcelLineFlags( const LLVector3& pos) const; + U8 ownership(const LLVector3& pos) const; + U8 parcelLineFlags(const LLVector3& pos) const; U8 parcelLineFlags(S32 row, S32 col) const; // MANIPULATE - void uncompressLandOverlay(S32 chunk, U8 *compressed_overlay); + void uncompressLandOverlay(S32 chunk, U8* compressed_overlay); // Indicate property lines and overlay texture need to be rebuilt. void setDirty(); @@ -88,8 +86,7 @@ public: private: // This is in parcel rows and columns, not grid rows and columns // Stored in bottom three bits. - U8 ownership(S32 row, S32 col) const - { return parcelFlags(row, col, (U8)0x7); } + U8 ownership(S32 row, S32 col) const { return parcelFlags(row, col, (U8)0x7); } U8 parcelFlags(S32 row, S32 col, U8 flags) const; diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp index b556aef768..6dead0cf82 100644 --- a/indra/newview/llviewerpartsim.cpp +++ b/indra/newview/llviewerpartsim.cpp @@ -76,12 +76,12 @@ LLViewerPart::LLViewerPart() : mPartID(0), mLastUpdateTime(0.f), mSkipOffset(0.f), - mVPCallback(NULL), - mImagep(NULL) + mVPCallback(nullptr), + mImagep(nullptr) { - mPartSourcep = NULL; - mParent = NULL; - mChild = NULL; + mPartSourcep = nullptr; + mParent = nullptr; + mChild = nullptr; ++LLViewerPartSim::sParticleCount2 ; } diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h index a857887247..f6ee00cb25 100644 --- a/indra/newview/llviewerprecompiledheaders.h +++ b/indra/newview/llviewerprecompiledheaders.h @@ -29,22 +29,28 @@ #ifndef LL_LLVIEWERPRECOMPILEDHEADERS_H #define LL_LLVIEWERPRECOMPILEDHEADERS_H -#include "llwin32headers.h" - // This file MUST be the first one included by each .cpp file // in viewer. // It is used to precompile headers for improved build speed. #include "linden_common.h" +#include "llwin32headers.h" + #include <algorithm> #include <deque> #include <functional> +#include <list> #include <map> #include <set> #include <vector> +#include <string_view> +#include <unordered_map> +#include <unordered_set> // Library headers from llcommon project: +#include "apply.h" +#include "function_types.h" #include "indra_constants.h" #include "llinitparam.h" #include "llapp.h" @@ -54,8 +60,10 @@ #include "llerror.h" #include "llfasttimer.h" #include "llframetimer.h" +#include "llinstancetracker.h" #include "llpointer.h" #include "llprocessor.h" +#include "llrand.h" #include "llrefcount.h" #include "llsafehandle.h" #include "llsd.h" @@ -65,11 +73,13 @@ #include "llstring.h" #include "llsys.h" #include "lltimer.h" +#include "lluuid.h" #include "stdtypes.h" #include "u64.h" // Library includes from llmath project #include "llmath.h" +#include "llbbox.h" #include "llbboxlocal.h" #include "llcamera.h" #include "llcoord.h" @@ -77,9 +87,7 @@ #include "llcrc.h" #include "llplane.h" #include "llquantize.h" -#include "llrand.h" #include "llrect.h" -#include "lluuid.h" #include "m3math.h" #include "m4math.h" #include "llquaternion.h" @@ -91,11 +99,41 @@ #include "v4coloru.h" #include "v4math.h" #include "xform.h" +#include "llvector4a.h" +#include "llmatrix4a.h" +#include "lloctree.h" +#include "llvolume.h" +// Library includes from llfilesystem project #include "lldir.h" // Library includes from llmessage project +#include "llassetstorage.h" +#include "llavatarnamecache.h" #include "llcachename.h" +#include "llcorehttputil.h" + +// Library includes from llrender project +#include "llgl.h" +#include "llrender.h" + +// Library includes from llrender project +#include "llcharacter.h" + +// Library includes from llui project +#include "llnotifications.h" +#include "llpanel.h" +#include "llfloater.h" + +#include <boost/signals2.hpp> +#include <boost/unordered_set.hpp> +#include <boost/unordered_map.hpp> +#include <boost/json.hpp> +#include "glm/glm.hpp" +#include "glm/gtc/type_ptr.hpp" +#include "glm/ext/quaternion_float.hpp" +#include "glm/gtx/quaternion.hpp" +#include "glm/gtx/matrix_decompose.hpp" #endif diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 697433148b..cd70f8f9b9 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -38,7 +38,6 @@ #include "llregionhandle.h" #include "llsurface.h" #include "message.h" -//#include "vmath.h" #include "v3math.h" #include "v4math.h" @@ -253,8 +252,8 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("BaseCapabilitiesRequest", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("BaseCapabilitiesRequest", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD result; LLViewerRegion *regionp = NULL; @@ -407,8 +406,8 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCompleteCoro(U64 regionHandle) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("BaseCapabilitiesRequest", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("BaseCapabilitiesRequest", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD result; LLViewerRegion *regionp = NULL; @@ -541,8 +540,8 @@ void LLViewerRegionImpl::requestSimulatorFeatureCoro(std::string url, U64 region { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("BaseCapabilitiesRequest", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("requestSimulatorFeatureCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLViewerRegion *regionp = NULL; S32 attemptNumber = 0; @@ -3720,12 +3719,6 @@ bool LLViewerRegion::bakesOnMeshEnabled() const mSimulatorFeatures["BakesOnMeshEnabled"].asBoolean()); } -bool LLViewerRegion::meshRezEnabled() const -{ - return (mSimulatorFeatures.has("MeshRezEnabled") && - mSimulatorFeatures["MeshRezEnabled"].asBoolean()); -} - bool LLViewerRegion::dynamicPathfindingEnabled() const { return ( mSimulatorFeatures.has("DynamicPathfindingEnabled") && diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index d0ec1fe877..9c5a63e23a 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -43,6 +43,7 @@ #include "m4math.h" // LLMatrix4 #include "llframetimer.h" #include "llreflectionmap.h" +#include "llviewerobject.h" #include "llpointer.h" // Surface id's @@ -295,10 +296,10 @@ public: typedef LLCoreHttpUtil::HttpCoroutineAdapter::completionCallback_t httpCallback_t; bool requestPostCapability(const std::string &capName, LLSD &postData, - httpCallback_t cbSuccess = NULL, - httpCallback_t cbFailure = NULL); - bool requestGetCapability(const std::string &capName, httpCallback_t cbSuccess = NULL, httpCallback_t cbFailure = NULL); - bool requestDelCapability(const std::string &capName, httpCallback_t cbSuccess = NULL, httpCallback_t cbFailure = NULL); + httpCallback_t cbSuccess = nullptr, + httpCallback_t cbFailure = nullptr); + bool requestGetCapability(const std::string& capName, httpCallback_t cbSuccess = nullptr, httpCallback_t cbFailure = nullptr); + bool requestDelCapability(const std::string& capName, httpCallback_t cbSuccess = nullptr, httpCallback_t cbFailure = nullptr); /// implements LLCapabilityProvider /*virtual*/ const LLHost& getHost() const; @@ -333,7 +334,6 @@ public: void getInfo(LLSD& info); - bool meshRezEnabled() const; bool meshUploadEnabled() const; bool bakesOnMeshEnabled() const; diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 7ef13c3a35..eea0b37c43 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -37,7 +37,6 @@ #include "llrender.h" #include "llenvironment.h" #include "llerrorcontrol.h" -#include "llatmosphere.h" #include "llworld.h" #include "llsky.h" @@ -137,6 +136,10 @@ LLGLSLShader gGlowProgram; LLGLSLShader gGlowExtractProgram; LLGLSLShader gPostScreenSpaceReflectionProgram; +LLGLSLShader gBloomExtractProgram; +LLGLSLShader gBloomBlurProgram; +LLGLSLShader gBloomCombineProgram; + // Deferred rendering shaders LLGLSLShader gDeferredImpostorProgram; LLGLSLShader gDeferredDiffuseProgram; @@ -196,8 +199,13 @@ LLGLSLShader gDeferredCoFProgram; LLGLSLShader gDeferredDoFCombineProgram; LLGLSLShader gDeferredPostTonemapProgram; LLGLSLShader gNoPostTonemapProgram; +LLGLSLShader gDeferredPostTonemapGammaCorrectProgram; +LLGLSLShader gNoPostTonemapGammaCorrectProgram; +LLGLSLShader gDeferredPostTonemapLegacyGammaCorrectProgram; +LLGLSLShader gNoPostTonemapLegacyGammaCorrectProgram; LLGLSLShader gDeferredPostGammaCorrectProgram; LLGLSLShader gLegacyPostGammaCorrectProgram; +LLGLSLShader gHDRGammaCorrectProgram; LLGLSLShader gExposureProgram; LLGLSLShader gExposureProgramNoFade; LLGLSLShader gLuminanceProgram; @@ -206,6 +214,7 @@ LLGLSLShader gSMAAEdgeDetectProgram[4]; LLGLSLShader gSMAABlendWeightsProgram[4]; LLGLSLShader gSMAANeighborhoodBlendProgram[4]; LLGLSLShader gCASProgram; +LLGLSLShader gCASLegacyGammaProgram; LLGLSLShader gDeferredPostNoDoFProgram; LLGLSLShader gDeferredPostNoDoFNoiseProgram; LLGLSLShader gDeferredWLSkyProgram; @@ -443,8 +452,14 @@ void LLViewerShaderMgr::finalizeShaderList() mShaderList.push_back(&gHUDPBRAlphaProgram); mShaderList.push_back(&gDeferredPostTonemapProgram); mShaderList.push_back(&gNoPostTonemapProgram); + mShaderList.push_back(&gDeferredPostTonemapGammaCorrectProgram); + mShaderList.push_back(&gNoPostTonemapGammaCorrectProgram); + mShaderList.push_back(&gDeferredPostTonemapLegacyGammaCorrectProgram); + mShaderList.push_back(&gNoPostTonemapLegacyGammaCorrectProgram); + mShaderList.push_back(&gCASLegacyGammaProgram); mShaderList.push_back(&gDeferredPostGammaCorrectProgram); // for gamma mShaderList.push_back(&gLegacyPostGammaCorrectProgram); + mShaderList.push_back(&gHDRGammaCorrectProgram); mShaderList.push_back(&gDeferredDiffuseProgram); mShaderList.push_back(&gDeferredBumpProgram); mShaderList.push_back(&gDeferredPBROpaqueProgram); @@ -545,7 +560,11 @@ void LLViewerShaderMgr::setShaders() gSavedSettings.setString("RenderShaderCacheVersion", current_cache_version.asString()); } - initShaderCache(shader_cache_enabled, old_cache_version, current_cache_version); + initShaderCache( + shader_cache_enabled, + old_cache_version, + current_cache_version, + LLAppViewer::instance()->isSecondInstance()); } static LLCachedControl<U32> max_texture_index(gSavedSettings, "RenderMaxTextureIndex", 16); @@ -568,6 +587,7 @@ void LLViewerShaderMgr::setShaders() unloadShaders(); LLPipeline::sRenderGlow = gSavedSettings.getBOOL("RenderGlow"); + LLPipeline::RenderAvatarCloth = gSavedSettings.getBOOL("RenderAvatarCloth"); if (gViewerWindow) { @@ -703,7 +723,10 @@ void LLViewerShaderMgr::setShaders() loaded = loaded && loadShadersDeferred(); llassert(loaded); - persistShaderCacheMetadata(); + if (!LLAppViewer::instance()->isSecondInstance()) + { + persistShaderCacheMetadata(); + } if (gViewerWindow) { @@ -802,9 +825,12 @@ std::string LLViewerShaderMgr::loadBasicShaders() if (shadow_detail >= 1) { - attribs["SUN_SHADOW"] = "1"; + if(shadow_detail < 3) + { + attribs["SUN_SHADOW"] = "1"; + } - if (shadow_detail >= 2) + if (shadow_detail > 1) { attribs["SPOT_SHADOW"] = "1"; } @@ -864,7 +890,7 @@ std::string LLViewerShaderMgr::loadBasicShaders() std::vector<S32> index_channels; index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsVarsF.glsl", mShaderLevel[SHADER_WINDLIGHT] ) ); index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsHelpersF.glsl", mShaderLevel[SHADER_WINDLIGHT] ) ); - index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/gammaF.glsl", mShaderLevel[SHADER_WINDLIGHT]) ); + //index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/gammaF.glsl", mShaderLevel[SHADER_WINDLIGHT]) ); index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsFuncs.glsl", mShaderLevel[SHADER_WINDLIGHT] ) ); index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsF.glsl", mShaderLevel[SHADER_WINDLIGHT] ) ); index_channels.push_back(-1); shaders.push_back( make_pair( "environment/waterFogF.glsl", mShaderLevel[SHADER_WATER] ) ); @@ -902,8 +928,9 @@ bool LLViewerShaderMgr::loadShadersWater() bool success = true; bool terrainWaterSuccess = true; + S32 shadow_detail = gSavedSettings.getS32("RenderShadowDetail"); bool use_sun_shadow = mShaderLevel[SHADER_DEFERRED] > 1 && - gSavedSettings.getS32("RenderShadowDetail") > 0; + shadow_detail > 0 && shadow_detail < 3; if (mShaderLevel[SHADER_WATER] == 0) { @@ -1003,6 +1030,52 @@ bool LLViewerShaderMgr::loadShadersEffects() if (success) { + gBloomExtractProgram.mName = "Bloom Extract Shader"; + gBloomExtractProgram.mShaderFiles.clear(); + gBloomExtractProgram.mShaderFiles.push_back(make_pair("effects/bloomExtractV.glsl", GL_VERTEX_SHADER)); + gBloomExtractProgram.mShaderFiles.push_back(make_pair("effects/bloomExtractF.glsl", GL_FRAGMENT_SHADER)); + gBloomExtractProgram.mShaderLevel = mShaderLevel[SHADER_EFFECT]; + + success = gBloomExtractProgram.createShader(); + if (!success) + { + LL_WARNS() << "gBloomExtractProgram creation ERROR" << LL_ENDL; + //LLPipeline::sRenderGlow = false; + } + } + + if (success) + { + gBloomBlurProgram.mName = "Bloom Blur Shader"; + gBloomBlurProgram.mShaderFiles.clear(); + gBloomBlurProgram.mShaderFiles.push_back(make_pair("effects/bloomBlurV.glsl", GL_VERTEX_SHADER)); + gBloomBlurProgram.mShaderFiles.push_back(make_pair("effects/bloomBlurF.glsl", GL_FRAGMENT_SHADER)); + gBloomBlurProgram.mShaderLevel = mShaderLevel[SHADER_EFFECT]; + + success = gBloomBlurProgram.createShader(); + if(!success) + { + LL_WARNS() << "gBloomBlurProgram creation ERROR" << LL_ENDL; + } + } + + if (success) + { + gBloomCombineProgram.mName = "Bloom Combine Shader"; + gBloomCombineProgram.mShaderFiles.clear(); + gBloomCombineProgram.mShaderFiles.push_back(make_pair("effects/bloomCombineV.glsl", GL_VERTEX_SHADER)); + gBloomCombineProgram.mShaderFiles.push_back(make_pair("effects/bloomCombineF.glsl", GL_FRAGMENT_SHADER)); + gBloomCombineProgram.mShaderLevel = mShaderLevel[SHADER_EFFECT]; + + success = gBloomCombineProgram.createShader(); + if(!success) + { + LL_WARNS() << "gBloomCombineProgram creation ERROR" << LL_ENDL; + } + } + + if (success) + { gGlowProgram.mName = "Glow Shader (Post)"; gGlowProgram.mShaderFiles.clear(); gGlowProgram.mShaderFiles.push_back(make_pair("effects/glowV.glsl", GL_VERTEX_SHADER)); @@ -1107,8 +1180,14 @@ bool LLViewerShaderMgr::loadShadersDeferred() gLuminanceProgram.unload(); gDeferredPostGammaCorrectProgram.unload(); gLegacyPostGammaCorrectProgram.unload(); + gHDRGammaCorrectProgram.unload(); gDeferredPostTonemapProgram.unload(); gNoPostTonemapProgram.unload(); + gDeferredPostTonemapGammaCorrectProgram.unload(); + gNoPostTonemapGammaCorrectProgram.unload(); + gDeferredPostTonemapLegacyGammaCorrectProgram.unload(); + gNoPostTonemapLegacyGammaCorrectProgram.unload(); + for (auto i = 0; i < 4; ++i) { gFXAAProgram[i].unload(); @@ -1117,6 +1196,7 @@ bool LLViewerShaderMgr::loadShadersDeferred() gSMAANeighborhoodBlendProgram[i].unload(); } gCASProgram.unload(); + gCASLegacyGammaProgram.unload(); gEnvironmentMapProgram.unload(); gDeferredWLSkyProgram.unload(); gDeferredWLCloudProgram.unload(); @@ -2334,7 +2414,9 @@ bool LLViewerShaderMgr::loadShadersDeferred() gDeferredAvatarProgram.mShaderFiles.push_back(make_pair("deferred/avatarF.glsl", GL_FRAGMENT_SHADER)); gDeferredAvatarProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; + gDeferredAvatarProgram.clearPermutations(); add_common_permutations(&gDeferredAvatarProgram); + gDeferredAvatarProgram.addPermutation("AVATAR_CLOTH", LLPipeline::RenderAvatarCloth ? "1" : "0"); success = gDeferredAvatarProgram.createShader(); llassert(success); @@ -2450,6 +2532,21 @@ bool LLViewerShaderMgr::loadShadersDeferred() if (success) { + gHDRGammaCorrectProgram.mName = "HDR Gamma Correction Post Process"; + gHDRGammaCorrectProgram.mFeatures.hasSrgb = true; + gHDRGammaCorrectProgram.mFeatures.isDeferred = true; + gHDRGammaCorrectProgram.mShaderFiles.clear(); + gHDRGammaCorrectProgram.clearPermutations(); + //gHDRGammaCorrectProgram.addPermutation("HDR_GAMMA", "1"); + gHDRGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER)); + gHDRGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/MPHDRDisplayGammaF.glsl", GL_FRAGMENT_SHADER)); + gHDRGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; + success = gHDRGammaCorrectProgram.createShader(); + llassert(success); + } + + if (success) + { gDeferredPostTonemapProgram.mName = "Deferred Tonemap Post Process"; gDeferredPostTonemapProgram.mFeatures.hasSrgb = true; gDeferredPostTonemapProgram.mFeatures.isDeferred = true; @@ -2479,6 +2576,74 @@ bool LLViewerShaderMgr::loadShadersDeferred() llassert(success); } + if (success) + { + gDeferredPostTonemapGammaCorrectProgram.mName = "Deferred Tonemap Gamma Post Process"; + gDeferredPostTonemapGammaCorrectProgram.mFeatures.hasSrgb = true; + gDeferredPostTonemapGammaCorrectProgram.mFeatures.isDeferred = true; + gDeferredPostTonemapGammaCorrectProgram.mFeatures.hasTonemap = true; + gDeferredPostTonemapGammaCorrectProgram.mShaderFiles.clear(); + gDeferredPostTonemapGammaCorrectProgram.clearPermutations(); + gDeferredPostTonemapGammaCorrectProgram.addPermutation("GAMMA_CORRECT", "1"); + gDeferredPostTonemapGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER)); + gDeferredPostTonemapGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredTonemap.glsl", GL_FRAGMENT_SHADER)); + gDeferredPostTonemapGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; + success = gDeferredPostTonemapGammaCorrectProgram.createShader(); + llassert(success); + } + + if (success) + { + gNoPostTonemapGammaCorrectProgram.mName = "No Post Tonemap Gamma Post Process"; + gNoPostTonemapGammaCorrectProgram.mFeatures.hasSrgb = true; + gNoPostTonemapGammaCorrectProgram.mFeatures.isDeferred = true; + gNoPostTonemapGammaCorrectProgram.mFeatures.hasTonemap = true; + gNoPostTonemapGammaCorrectProgram.mShaderFiles.clear(); + gNoPostTonemapGammaCorrectProgram.clearPermutations(); + gNoPostTonemapGammaCorrectProgram.addPermutation("GAMMA_CORRECT", "1"); + gNoPostTonemapGammaCorrectProgram.addPermutation("NO_POST", "1"); + gNoPostTonemapGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER)); + gNoPostTonemapGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredTonemap.glsl", GL_FRAGMENT_SHADER)); + gNoPostTonemapGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; + success = gNoPostTonemapGammaCorrectProgram.createShader(); + llassert(success); + } + + if (success) + { + gDeferredPostTonemapLegacyGammaCorrectProgram.mName = "Deferred Tonemap Legacy Gamma Post Process"; + gDeferredPostTonemapLegacyGammaCorrectProgram.mFeatures.hasSrgb = true; + gDeferredPostTonemapProgram.mFeatures.isDeferred = true; + gDeferredPostTonemapLegacyGammaCorrectProgram.mFeatures.hasTonemap = true; + gDeferredPostTonemapLegacyGammaCorrectProgram.mShaderFiles.clear(); + gDeferredPostTonemapLegacyGammaCorrectProgram.clearPermutations(); + gDeferredPostTonemapLegacyGammaCorrectProgram.addPermutation("GAMMA_CORRECT", "1"); + gDeferredPostTonemapLegacyGammaCorrectProgram.addPermutation("LEGACY_GAMMA", "1"); + gDeferredPostTonemapLegacyGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER)); + gDeferredPostTonemapLegacyGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredTonemap.glsl", GL_FRAGMENT_SHADER)); + gDeferredPostTonemapLegacyGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; + success = gDeferredPostTonemapLegacyGammaCorrectProgram.createShader(); + llassert(success); + } + + if (success) + { + gNoPostTonemapLegacyGammaCorrectProgram.mName = "No Post Tonemap Legacy Gamma Post Process"; + gNoPostTonemapLegacyGammaCorrectProgram.mFeatures.hasSrgb = true; + gNoPostTonemapLegacyGammaCorrectProgram.mFeatures.isDeferred = true; + gNoPostTonemapLegacyGammaCorrectProgram.mFeatures.hasTonemap = true; + gNoPostTonemapLegacyGammaCorrectProgram.mShaderFiles.clear(); + gNoPostTonemapLegacyGammaCorrectProgram.clearPermutations(); + gNoPostTonemapLegacyGammaCorrectProgram.addPermutation("NO_POST", "1"); + gNoPostTonemapLegacyGammaCorrectProgram.addPermutation("GAMMA_CORRECT", "1"); + gNoPostTonemapLegacyGammaCorrectProgram.addPermutation("LEGACY_GAMMA", "1"); + gNoPostTonemapLegacyGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER)); + gNoPostTonemapLegacyGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredTonemap.glsl", GL_FRAGMENT_SHADER)); + gNoPostTonemapLegacyGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; + success = gNoPostTonemapLegacyGammaCorrectProgram.createShader(); + llassert(success); + } + if (success && gGLManager.mGLVersion > 3.9f) { std::vector<std::pair<std::string, std::string>> quality_levels = { {"12", "Low"}, @@ -2662,6 +2827,27 @@ bool LLViewerShaderMgr::loadShadersDeferred() } } + if (success && gGLManager.mGLVersion > 4.05f) + { + gCASLegacyGammaProgram.mName = "Contrast Adaptive Sharpening Legacy Gamma Shader"; + gCASLegacyGammaProgram.mFeatures.hasSrgb = true; + gCASLegacyGammaProgram.mShaderFiles.clear(); + gCASLegacyGammaProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER)); + gCASLegacyGammaProgram.mShaderFiles.push_back(make_pair("deferred/CASF.glsl", GL_FRAGMENT_SHADER)); + gCASLegacyGammaProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; + gCASLegacyGammaProgram.clearPermutations(); + gCASLegacyGammaProgram.addPermutation("GAMMA_CORRECT", "1"); + gCASLegacyGammaProgram.addPermutation("LEGACY_GAMMA", "1"); + success = gCASLegacyGammaProgram.createShader(); + // llassert(success); + if (!success) + { + LL_WARNS() << "Failed to create shader '" << gCASProgram.mName << "', disabling!" << LL_ENDL; + // continue as if this shader never happened + success = true; + } + } + if (success) { gDeferredPostProgram.mName = "Deferred Post Shader"; @@ -3450,7 +3636,7 @@ bool LLViewerShaderMgr::loadShadersInterface() std::string LLViewerShaderMgr::getShaderDirPrefix(void) { - return gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "shaders/class"); + return gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "shaders", "class"); } void LLViewerShaderMgr::updateShaderUniforms(LLGLSLShader * shader) diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index 7ad2da9464..f503401510 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -250,12 +250,18 @@ extern LLGLSLShader gSMAAEdgeDetectProgram[4]; extern LLGLSLShader gSMAABlendWeightsProgram[4]; extern LLGLSLShader gSMAANeighborhoodBlendProgram[4]; extern LLGLSLShader gCASProgram; +extern LLGLSLShader gCASLegacyGammaProgram; extern LLGLSLShader gDeferredPostNoDoFProgram; extern LLGLSLShader gDeferredPostNoDoFNoiseProgram; extern LLGLSLShader gDeferredPostGammaCorrectProgram; extern LLGLSLShader gLegacyPostGammaCorrectProgram; +extern LLGLSLShader gHDRGammaCorrectProgram; extern LLGLSLShader gDeferredPostTonemapProgram; extern LLGLSLShader gNoPostTonemapProgram; +extern LLGLSLShader gDeferredPostTonemapGammaCorrectProgram; +extern LLGLSLShader gNoPostTonemapGammaCorrectProgram; +extern LLGLSLShader gDeferredPostTonemapLegacyGammaCorrectProgram; +extern LLGLSLShader gNoPostTonemapLegacyGammaCorrectProgram; extern LLGLSLShader gExposureProgram; extern LLGLSLShader gExposureProgramNoFade; extern LLGLSLShader gLuminanceProgram; @@ -298,6 +304,10 @@ extern LLGLSLShader gHUDPBRAlphaProgram; // GLTF shaders extern LLGLSLShader gGLTFPBRMetallicRoughnessProgram; +extern LLGLSLShader gBloomExtractProgram; +extern LLGLSLShader gBloomBlurProgram; +extern LLGLSLShader gBloomCombineProgram; + // Encodes detail level for dropping textures, in accordance with the GLTF spec where possible // 0 is highest detail, -1 drops emissive, etc // Dropping metallic roughness is off-spec - Reserve for potato machines as needed diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index ad503cbac7..59bb78f8f4 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -220,7 +220,22 @@ SimMeasurement<F64Megabytes > SIM_PHYSICS_MEM("physicsmemoryallocated", "", LL LLTrace::SampleStatHandle<F64Milliseconds > FRAMETIME_JITTER("frametimejitter", "Average delta between successive frame times"), FRAMETIME("frametime", "Measured frame time"), - SIM_PING("simpingstat"); + SIM_PING("simpingstat"), + FRAMETIME_JITTER_99TH("frametimejitter99", "99th percentile of frametime jitter over the last 5 seconds."), + FRAMETIME_JITTER_95TH("frametimejitter95", "99th percentile of frametime jitter over the last 5 seconds."), + FRAMETIME_99TH("frametime99", "99th percentile of frametime over the last 5 seconds."), + FRAMETIME_95TH("frametime95", "99th percentile of frametime over the last 5 seconds."), + FRAMETIME_JITTER_CUMULATIVE("frametimejitcumulative", "Cumulative frametime jitter over the session."), + FRAMETIME_JITTER_STDDEV("frametimejitterstddev", "Standard deviation of frametime jitter in a 5 second period."), + FRAMETIME_STDDEV("frametimestddev", "Standard deviation of frametime in a 5 second period."); + +LLTrace::SampleStatHandle<U32> FRAMETIME_JITTER_EVENTS("frametimeevents", "Number of frametime events in the session. Applies when jitter exceeds 10% of the previous frame."), + FRAMETIME_JITTER_EVENTS_PER_MINUTE("frametimeeventspm", "Average number of frametime events per minute."), + FRAMETIME_JITTER_EVENTS_LAST_MINUTE("frametimeeventslastmin", "Number of frametime events in the last minute."); + +LLTrace::SampleStatHandle<F64> NOTRMALIZED_FRAMETIME_JITTER_SESSION("normalizedframetimejitter", "Normalized frametime jitter over the session."); +LLTrace::SampleStatHandle<F64> NFTV("nftv", "Normalized frametime variation."); +LLTrace::SampleStatHandle<F64> NORMALIZED_FRAMTIME_JITTER_PERIOD("normalizedframetimejitterperiod", "Normalized frametime jitter over the last 5 seconds."); LLTrace::EventStatHandle<LLUnit<F64, LLUnits::Meters> > AGENT_POSITION_SNAP("agentpositionsnap", "agent position corrections"); @@ -264,16 +279,128 @@ void LLViewerStats::resetStats() getRecording().reset(); } +// Helper for calculating Nth percentile with linear interpolation +template<typename T> +T calcPercentile(const std::vector<T>& sorted, double percent) +{ + if (sorted.empty()) + return T(0); + double idx = percent * (sorted.size() - 1); + size_t idx_below = static_cast<size_t>(std::floor(idx)); + size_t idx_above = static_cast<size_t>(std::ceil(idx)); + if (idx_below == idx_above) + return sorted[idx_below]; + double weight_above = idx - idx_below; + return sorted[idx_below] * (1.0 - weight_above) + sorted[idx_above] * weight_above; +} + +template<typename T> +T calcStddev(const std::vector<T>& values) +{ + if (values.size() < 2) + return T(0); + double sum = 0, sq_sum = 0; + for (const auto& v : values) + { + double d = v.value(); + sum += d; + sq_sum += d * d; + } + double mean = sum / values.size(); + double variance = (sq_sum / values.size()) - (mean * mean); + return T(std::sqrt(variance)); +} + void LLViewerStats::updateFrameStats(const F64Seconds time_diff) { if (gFrameCount && mLastTimeDiff > (F64Seconds)0.0) { + mTotalTime += time_diff; sample(LLStatViewer::FRAMETIME, time_diff); // old stats that were never really used F64Seconds jit = (F64Seconds)std::fabs((mLastTimeDiff - time_diff)); sample(LLStatViewer::FRAMETIME_JITTER, jit); - } + mTotalFrametimeJitter += jit; + sample(LLStatViewer::FRAMETIME_JITTER_CUMULATIVE, mTotalFrametimeJitter); + sample(LLStatViewer::NOTRMALIZED_FRAMETIME_JITTER_SESSION, mTotalFrametimeJitter / mTotalTime); + + mLastNoramlizedSessionJitter = mTotalFrametimeJitter / mTotalTime; + + static LLCachedControl<F32> frameTimeEventThreshold(gSavedSettings, "StatsFrametimeEventThreshold", 0.1f); + + if (time_diff - mLastTimeDiff > mLastTimeDiff * frameTimeEventThreshold()) + { + sample(LLStatViewer::FRAMETIME_JITTER_EVENTS, mFrameJitterEvents++); + mFrameJitterEventsLastMinute++; + } + + mFrameTimes.push_back(time_diff); + mFrameTimesJitter.push_back(jit); + + mLastFrameTimeSample += time_diff; + mTimeSinceLastEventSample += time_diff; + + static LLCachedControl<S32> frameTimeSampleSeconds(gSavedSettings, "StatsFrametimeSampleSeconds", 5); + + if (mLastFrameTimeSample >= frameTimeSampleSeconds()) + { + std::sort(mFrameTimes.begin(), mFrameTimes.end()); + std::sort(mFrameTimesJitter.begin(), mFrameTimesJitter.end()); + // Use new helpers for calculations + F64Seconds frame_time_stddev = calcStddev(mFrameTimes); + sample(LLStatViewer::FRAMETIME_STDDEV, frame_time_stddev); + + F64Seconds ninety_ninth_percentile = calcPercentile(mFrameTimes, 0.99); + F64Seconds ninety_fifth_percentile = calcPercentile(mFrameTimes, 0.95); + sample(LLStatViewer::FRAMETIME_99TH, ninety_ninth_percentile); + sample(LLStatViewer::FRAMETIME_95TH, ninety_fifth_percentile); + + frame_time_stddev = calcStddev(mFrameTimesJitter); + sample(LLStatViewer::FRAMETIME_JITTER_STDDEV, frame_time_stddev); + + ninety_ninth_percentile = calcPercentile(mFrameTimesJitter, 0.99); + ninety_fifth_percentile = calcPercentile(mFrameTimesJitter, 0.95); + sample(LLStatViewer::FRAMETIME_JITTER_99TH, ninety_ninth_percentile); + sample(LLStatViewer::FRAMETIME_JITTER_95TH, ninety_fifth_percentile); + + F64 averageFrameTime = 0; + for (const auto& frame_time : mFrameTimes) + { + averageFrameTime += frame_time.value(); + } + averageFrameTime /= mFrameTimes.size(); + + sample(LLStatViewer::NFTV, frame_time_stddev / averageFrameTime); + mLastNormalizedFrametimeVariance = frame_time_stddev / averageFrameTime; + + // Add up all of the jitter values. + F64 totalJitter = 0; + for (const auto& frame_jitter : mFrameTimesJitter) + { + totalJitter += frame_jitter.value(); + } + + mLastNormalizedPeriodJitter = totalJitter / mLastFrameTimeSample; + + sample(LLStatViewer::NORMALIZED_FRAMTIME_JITTER_PERIOD, mLastNormalizedPeriodJitter); + + mFrameTimes.clear(); + mFrameTimesJitter.clear(); + mLastFrameTimeSample = F64Seconds(0); + } + + if (mTimeSinceLastEventSample >= 60) + { + mEventMinutes++; + // Calculate average events per minute + U64 frame_time_events_per_minute = (U64)mFrameJitterEvents / mEventMinutes; + sample(LLStatViewer::FRAMETIME_JITTER_EVENTS_PER_MINUTE, frame_time_events_per_minute); + sample(LLStatViewer::FRAMETIME_JITTER_EVENTS_LAST_MINUTE, mFrameJitterEventsLastMinute); + mFrameJitterEventsLastMinute = 0; + mTimeSinceLastEventSample = F64Seconds(0); + } + } mLastTimeDiff = time_diff; } @@ -546,6 +673,11 @@ void send_viewer_stats(bool include_preferences) // send fps only for time app spends in foreground agent["fps"] = (F32)gForegroundFrameCount / gForegroundTime.getElapsedTimeF32(); + + agent["normalized_session_jitter"] = LLViewerStats::instance().getLastNormalizedSessionJitter(); + agent["normalized_frametime_variance"] = LLViewerStats::instance().getLastNormalizedFrametimeVariance(); + agent["normalized_period_jitter"] = LLViewerStats::instance().getLastNormalizedPeriodJitter(); + agent["version"] = LLVersionInfo::instance().getChannelAndVersion(); std::string language = LLUI::getLanguage(); agent["language"] = language; diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h index 8aed1c537e..1ac8b2f66b 100644 --- a/indra/newview/llviewerstats.h +++ b/indra/newview/llviewerstats.h @@ -229,6 +229,9 @@ extern LLTrace::EventStatHandle<F64Seconds > AVATAR_EDIT_TIME, extern LLTrace::EventStatHandle<LLUnit<F32, LLUnits::Percent> > OBJECT_CACHE_HIT_RATE; +extern LLTrace::SampleStatHandle<F64> NOTRMALIZED_FRAMETIME_JITTER_SESSION; +extern LLTrace::SampleStatHandle<F64> NORMALIZED_FRAMTIME_JITTER_PERIOD; + } class LLViewerStats : public LLSingleton<LLViewerStats> @@ -271,10 +274,30 @@ public: LLTrace::Recording& getRecording() { return mRecording; } const LLTrace::Recording& getRecording() const { return mRecording; } + F64 getLastNormalizedSessionJitter() const { return mLastNoramlizedSessionJitter; } + F64 getLastNormalizedFrametimeVariance() const { return mLastNormalizedFrametimeVariance; } + F64 getLastNormalizedPeriodJitter() const { return mLastNormalizedPeriodJitter; } + private: LLTrace::Recording mRecording; F64Seconds mLastTimeDiff; // used for time stat updates + F64Seconds mTotalFrametimeJitter; + + U32 mFrameJitterEvents = 0; + U32 mFrameJitterEventsLastMinute = 0; + U32 mEventMinutes = 0; + F64Seconds mTotalTime; + + F64Seconds mLastFrameTimeSample; // used for frame time stats + F64Seconds mTimeSinceLastEventSample; + std::vector<F64Seconds> mFrameTimes; // used for frame time stats + std::vector<F64Seconds> mFrameTimesJitter; // used for frame time jitter stats + + F64 mLastNoramlizedSessionJitter; // used for frame time jitter stats + F64 mLastNormalizedFrametimeVariance; // Used when submitting jitter stats + F64 mLastNormalizedPeriodJitter; + }; static const F32 SEND_STATS_PERIOD = 300.0f; diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 609ad38e96..c7513ded62 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -406,7 +406,10 @@ void LLViewerTextureManager::init() } } } - imagep->createGLTexture(0, image_raw); + if (!imagep->createGLTexture(0, image_raw)) + { + LL_WARNS() << "Failed to create default texture " << IMG_DEFAULT << LL_ENDL; + } image_raw = NULL; #else LLViewerFetchedTexture::sDefaultImagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, true, LLGLTexture::BOOST_UI); @@ -489,7 +492,12 @@ void LLViewerTexture::updateClass() } LLViewerMediaTexture::updateClass(); - + // This is a divisor used to determine how much VRAM from our overall VRAM budget to use. + // This is **cumulative** on whatever the detected or manually set VRAM budget is. + // If we detect 2048MB of VRAM, this will, by default, only use 1024. + // If you set 1024MB of VRAM, this will, by default, use 512. + // -Geenz 2025-03-03 + static LLCachedControl<U32> tex_vram_divisor(gSavedSettings, "RenderTextureVRAMDivisor", 2); static LLCachedControl<U32> max_vram_budget(gSavedSettings, "RenderMaxVRAMBudget", 0); F64 texture_bytes_alloc = LLImageGL::getTextureBytesAllocated() / 1024.0 / 512.0; @@ -499,7 +507,11 @@ void LLViewerTexture::updateClass() // NOTE: our metrics miss about half the vram we use, so this biases high but turns out to typically be within 5% of the real number F32 used = (F32)ll_round(texture_bytes_alloc + vertex_bytes_alloc); - F32 budget = max_vram_budget == 0 ? (F32)gGLManager.mVRAM : (F32)max_vram_budget; + // For debugging purposes, it's useful to be able to set the VRAM budget manually. + // But when manual control is not enabled, use the VRAM divisor. + // While we're at it, assume we have 1024 to play with at minimum when the divisor is in use. Works more elegantly with the logic below this. + // -Geenz 2025-03-21 + F32 budget = max_vram_budget == 0 ? llmax(1024, (F32)gGLManager.mVRAM / tex_vram_divisor) : (F32)max_vram_budget; // Try to leave at least half a GB for everyone else and for bias, // but keep at least 768MB for ourselves @@ -513,15 +525,21 @@ void LLViewerTexture::updateClass() bool is_sys_low = isSystemMemoryLow(); bool is_low = is_sys_low || over_pct > 0.f; - F32 discard_bias = sDesiredDiscardBias; static bool was_low = false; - static bool was_sys_low = false; if (is_low && !was_low) { - // slam to 1.5 bias the moment we hit low memory (discards off screen textures immediately) - sDesiredDiscardBias = llmax(sDesiredDiscardBias, 1.5f); + if (is_sys_low) + { + // Not having system memory is more serious, so discard harder + sDesiredDiscardBias = llmax(sDesiredDiscardBias, 1.5f * getSystemMemoryBudgetFactor()); + } + else + { + // Slam to 1.5 bias the moment we hit low memory (discards off screen textures immediately) + sDesiredDiscardBias = llmax(sDesiredDiscardBias, 1.5f); + } if (is_sys_low || over_pct > 2.f) { // if we're low on system memory, emergency purge off screen textures to avoid a death spiral @@ -534,7 +552,6 @@ void LLViewerTexture::updateClass() } was_low = is_low; - was_sys_low = is_sys_low; if (is_low) { @@ -553,8 +570,13 @@ void LLViewerTexture::updateClass() sEvaluationTimer.reset(); // lower discard bias over time when at least 10% of budget is free - const F32 FREE_PERCENTAGE_TRESHOLD = -0.1f; - if (sDesiredDiscardBias > 1.f && over_pct < FREE_PERCENTAGE_TRESHOLD) + constexpr F32 FREE_PERCENTAGE_TRESHOLD = -0.1f; + constexpr U32 FREE_SYS_MEM_TRESHOLD = 100; + static LLCachedControl<U32> min_free_main_memory(gSavedSettings, "RenderMinFreeMainMemoryThreshold", 512); + const S32Megabytes MIN_FREE_MAIN_MEMORY(min_free_main_memory() + FREE_SYS_MEM_TRESHOLD); + if (sDesiredDiscardBias > 1.f + && over_pct < FREE_PERCENTAGE_TRESHOLD + && getFreeSystemMemory() > MIN_FREE_MAIN_MEMORY) { static LLCachedControl<F32> high_mem_discard_decrement(gSavedSettings, "RenderHighMemMinDiscardDecrement", .1f); @@ -565,6 +587,7 @@ void LLViewerTexture::updateClass() // set to max discard bias if the window has been backgrounded for a while static F32 last_desired_discard_bias = 1.f; + static F32 last_texture_update_count_bias = 1.f; static bool was_backgrounded = false; static LLFrameTimer backgrounded_timer; static LLCachedControl<F32> minimized_discard_time(gSavedSettings, "TextureDiscardMinimizedTime", 1.f); @@ -600,35 +623,74 @@ void LLViewerTexture::updateClass() } sDesiredDiscardBias = llclamp(sDesiredDiscardBias, 1.f, 4.f); - if (discard_bias != sDesiredDiscardBias) + if (last_texture_update_count_bias < sDesiredDiscardBias) { - // bias changed, reset texture update counter to + // bias increased, reset texture update counter to // let updates happen at an increased rate. + last_texture_update_count_bias = sDesiredDiscardBias; sBiasTexturesUpdated = 0; } + else if (last_texture_update_count_bias > sDesiredDiscardBias + 0.1f) + { + // bias decreased, 0.1f is there to filter out small fluctuations + // and not reset sBiasTexturesUpdated too often. + // Bias jumps to 1.5 at low memory, so getting stuck at 1.1 is not + // a problem. + last_texture_update_count_bias = sDesiredDiscardBias; + } LLViewerTexture::sFreezeImageUpdates = false; } //static -bool LLViewerTexture::isSystemMemoryLow() +U32Megabytes LLViewerTexture::getFreeSystemMemory() { static LLFrameTimer timer; static U32Megabytes physical_res = U32Megabytes(U32_MAX); - static LLCachedControl<U32> min_free_main_memory(gSavedSettings, "RenderMinFreeMainMemoryThreshold", 512); - const U32Megabytes MIN_FREE_MAIN_MEMORY(min_free_main_memory); - if (timer.getElapsedTimeF32() < MEMORY_CHECK_WAIT_TIME) //call this once per second. { - return physical_res < MIN_FREE_MAIN_MEMORY; + return physical_res; } timer.reset(); LLMemory::updateMemoryInfo(); physical_res = LLMemory::getAvailableMemKB(); - return physical_res < MIN_FREE_MAIN_MEMORY; + return physical_res; +} + +S32Megabytes get_render_free_main_memory_treshold() +{ + static LLCachedControl<U32> min_free_main_memory(gSavedSettings, "RenderMinFreeMainMemoryThreshold", 512); + const U32Megabytes MIN_FREE_MAIN_MEMORY(min_free_main_memory); + return MIN_FREE_MAIN_MEMORY; +} + +//static +bool LLViewerTexture::isSystemMemoryLow() +{ + return getFreeSystemMemory() < get_render_free_main_memory_treshold(); +} + +//static +bool LLViewerTexture::isSystemMemoryCritical() +{ + return getFreeSystemMemory() < get_render_free_main_memory_treshold() / 2; +} + +F32 LLViewerTexture::getSystemMemoryBudgetFactor() +{ + const S32Megabytes MIN_FREE_MAIN_MEMORY(get_render_free_main_memory_treshold() / 2); + S32 free_budget = (S32Megabytes)getFreeSystemMemory() - MIN_FREE_MAIN_MEMORY; + if (free_budget < 0) + { + // Leave some padding, otherwise we will crash out of memory before hitting factor 2. + const S32Megabytes PAD_BUFFER(32); + // Result should range from 1 at 0 free budget to 2 at -224 free budget, 2.14 at -256MB + return 1.f - free_budget / (MIN_FREE_MAIN_MEMORY - PAD_BUFFER); + } + return 1.f; } //end of static functions @@ -1089,6 +1151,7 @@ void LLViewerFetchedTexture::init(bool firstinit) mOrigHeight = 0; mHasAux = false; mNeedsAux = false; + mLastWorkerDiscardLevel = -1; mRequestedDiscardLevel = -1; mRequestedDownloadPriority = 0.f; mFullyLoaded = false; @@ -1241,12 +1304,11 @@ void LLViewerFetchedTexture::loadFromFastCache() if (mBoostLevel == LLGLTexture::BOOST_THUMBNAIL) { - S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_THUMBNAIL_DIMENSIONS; - S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_THUMBNAIL_DIMENSIONS; - if (mRawImage && (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height)) + if (mRawImage && (mRawImage->getWidth() > DEFAULT_THUMBNAIL_DIMENSIONS || mRawImage->getHeight() > DEFAULT_THUMBNAIL_DIMENSIONS)) { - // scale oversized icon, no need to give more work to gl - mRawImage->scale(expected_width, expected_height); + // Scale oversized thumbnail + // thumbnails aren't supposed to go over DEFAULT_THUMBNAIL_DIMENSIONS + mRawImage->scale(DEFAULT_THUMBNAIL_DIMENSIONS, DEFAULT_THUMBNAIL_DIMENSIONS); } } @@ -1939,9 +2001,9 @@ bool LLViewerFetchedTexture::processFetchResults(S32& desired_discard, S32 curre bool LLViewerFetchedTexture::updateFetch() { LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE; - static LLCachedControl<bool> textures_decode_disabled(gSavedSettings,"TextureDecodeDisabled", false); + static LLCachedControl<bool> textures_decode_disabled(gSavedSettings, "TextureDecodeDisabled", false); - if(textures_decode_disabled) // don't fetch the surface textures in wireframe mode + if (textures_decode_disabled) // don't fetch the surface textures in wireframe mode { return false; } @@ -1976,7 +2038,7 @@ bool LLViewerFetchedTexture::updateFetch() LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("vftuf - callback pending"); return false; // process any raw image data in callbacks before replacing } - if(mInFastCacheList) + if (mInFastCacheList) { LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("vftuf - in fast cache"); return false; @@ -2001,7 +2063,7 @@ bool LLViewerFetchedTexture::updateFetch() if (mAuxRawImage.notNull()) sAuxCount--; // keep in mind that fetcher still might need raw image, don't modify original bool finished = LLAppViewer::getTextureFetch()->getRequestFinished(getID(), fetch_discard, mFetchState, mRawImage, mAuxRawImage, - mLastHttpGetStatus); + mLastHttpGetStatus); if (mRawImage.notNull()) sRawCount++; if (mAuxRawImage.notNull()) { @@ -2017,7 +2079,7 @@ bool LLViewerFetchedTexture::updateFetch() else { mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority, - mFetchPriority, mFetchDeltaTime, mRequestDeltaTime, mCanUseHTTP); + mFetchPriority, mFetchDeltaTime, mRequestDeltaTime, mCanUseHTTP); } if (!processFetchResults(desired_discard, current_discard, fetch_discard, decode_priority)) @@ -2028,7 +2090,7 @@ bool LLViewerFetchedTexture::updateFetch() if (mIsFetching) { static const F32 MAX_HOLD_TIME = 5.0f; //seconds to wait before canceling fecthing if decode_priority is 0.f. - if(decode_priority > 0.0f || mStopFetchingTimer.getElapsedTimeF32() > MAX_HOLD_TIME) + if (decode_priority > 0.0f || mStopFetchingTimer.getElapsedTimeF32() > MAX_HOLD_TIME) { mStopFetchingTimer.reset(); LLAppViewer::getTextureFetch()->updateRequestPriority(mID, decode_priority); @@ -2044,7 +2106,7 @@ bool LLViewerFetchedTexture::updateFetch() LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("vftuf - priority <= 0"); make_request = false; } - else if(mDesiredDiscardLevel > getMaxDiscardLevel()) + else if (mDesiredDiscardLevel > getMaxDiscardLevel()) { LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("vftuf - desired > max"); make_request = false; @@ -2085,7 +2147,7 @@ bool LLViewerFetchedTexture::updateFetch() if (make_request) { LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("vftuf - make request"); - S32 w=0, h=0, c=0; + S32 w = 0, h = 0, c = 0; if (getDiscardLevel() >= 0) { w = mGLTexturep->getWidth(0); @@ -2094,7 +2156,7 @@ bool LLViewerFetchedTexture::updateFetch() } const U32 override_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel"); - if (override_tex_discard_level != 0) + if (override_tex_discard_level != 0 && override_tex_discard_level <= MAX_DISCARD_LEVEL) { desired_discard = override_tex_discard_level; } @@ -2103,18 +2165,19 @@ bool LLViewerFetchedTexture::updateFetch() S32 fetch_request_response = -1; S32 worker_discard = -1; fetch_request_response = LLAppViewer::getTextureFetch()->createRequest(mFTType, mUrl, getID(), getTargetHost(), decode_priority, - w, h, c, desired_discard, needsAux(), mCanUseHTTP); + w, h, c, desired_discard, needsAux(), mCanUseHTTP); if (fetch_request_response >= 0) // positive values and 0 are discard values { LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("vftuf - request created"); mHasFetcher = true; mIsFetching = true; + mLastWorkerDiscardLevel = worker_discard; // in some cases createRequest can modify discard, as an example // bake textures are always at discard 0 mRequestedDiscardLevel = llmin(desired_discard, fetch_request_response); mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority, - mFetchPriority, mFetchDeltaTime, mRequestDeltaTime, mCanUseHTTP); + mFetchPriority, mFetchDeltaTime, mRequestDeltaTime, mCanUseHTTP); } else if (fetch_request_response == LLTextureFetch::CREATE_REQUEST_ERROR_TRANSITION) { @@ -2128,7 +2191,7 @@ bool LLViewerFetchedTexture::updateFetch() S32 decoded_discard; bool decoded; S32 fetch_state = LLAppViewer::getTextureFetch()->getLastFetchState(mID, desired_discard, decoded_discard, decoded); - if (fetch_state > 1 && decoded && decoded_discard >=0 && decoded_discard <= desired_discard) + if (fetch_state > 1 && decoded && decoded_discard >= 0 && decoded_discard <= desired_discard) { // worker actually has the image if (mRawImage.notNull()) sRawCount--; @@ -2752,11 +2815,9 @@ void LLViewerFetchedTexture::saveRawImage() } else if (mBoostLevel == LLGLTexture::BOOST_THUMBNAIL) { - S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_THUMBNAIL_DIMENSIONS; - S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_THUMBNAIL_DIMENSIONS; - if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height) + if (mRawImage->getWidth() > DEFAULT_THUMBNAIL_DIMENSIONS || mRawImage->getHeight() > DEFAULT_THUMBNAIL_DIMENSIONS) { - mSavedRawImage = new LLImageRaw(expected_width, expected_height, mRawImage->getComponents()); + mSavedRawImage = new LLImageRaw(DEFAULT_THUMBNAIL_DIMENSIONS, DEFAULT_THUMBNAIL_DIMENSIONS, mRawImage->getComponents()); mSavedRawImage->copyScaled(mRawImage); } else @@ -2955,7 +3016,7 @@ void LLViewerLODTexture::processTextureStats() // restrict texture resolution to download based on RenderMaxTextureResolution static LLCachedControl<U32> max_texture_resolution(gSavedSettings, "RenderMaxTextureResolution", 2048); // sanity clamp debug setting to avoid settings hack shenanigans - max_tex_res = (F32)llclamp((S32)max_texture_resolution, 512, MAX_IMAGE_SIZE_DEFAULT); + max_tex_res = (F32)llclamp((S32)max_texture_resolution, 128, MAX_IMAGE_SIZE_DEFAULT); mMaxVirtualSize = llmin(mMaxVirtualSize, max_tex_res * max_tex_res); } diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index e1582c74bd..2937651995 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -115,6 +115,8 @@ public: static void initClass(); static void updateClass(); static bool isSystemMemoryLow(); + static bool isSystemMemoryCritical(); + static F32 getSystemMemoryBudgetFactor(); LLViewerTexture(bool usemipmaps = true); LLViewerTexture(const LLUUID& id, bool usemipmaps) ; @@ -189,6 +191,8 @@ private: friend class LLBumpImageList; friend class LLUIImageList; + static U32Megabytes getFreeSystemMemory(); + protected: friend class LLViewerTextureList; LLUUID mID; @@ -444,6 +448,7 @@ protected: bool mKnownDrawSizeChanged ; std::string mUrl; + S32 mLastWorkerDiscardLevel; S32 mRequestedDiscardLevel; F32 mRequestedDownloadPriority; S32 mFetchState; diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index a4a001eceb..6f62d13d51 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -30,6 +30,7 @@ #include "llviewertexturelist.h" +#include "llagent.h" #include "llgl.h" // fot gathering stats from GL #include "llimagegl.h" #include "llimagebmp.h" @@ -825,10 +826,19 @@ void LLViewerTextureList::updateImages(F32 max_time) clearFetchingRequests(); gPipeline.clearRebuildGroups(); cleared = true; + return; + } + // ARRIVING is a delay to let things decode, cache and process, + // so process textures like normal despite gTeleportDisplay + if (gAgent.getTeleportState() != LLAgent::TELEPORT_ARRIVING) + { + return; } - return; } - cleared = false; + else + { + cleared = false; + } LLAppViewer::getTextureFetch()->setTextureBandwidth((F32)LLTrace::get_frame_recording().getPeriodMeanPerSec(LLStatViewer::TEXTURE_NETWORK_DATA_RECEIVED).value()); @@ -899,18 +909,23 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag { llassert(!gCubeSnapshot); + constexpr F32 BIAS_TRS_OUT_OF_SCREEN = 1.5f; + constexpr F32 BIAS_TRS_ON_SCREEN = 1.f; + if (imagep->getBoostLevel() < LLViewerFetchedTexture::BOOST_HIGH) // don't bother checking face list for boosted textures { - static LLCachedControl<F32> texture_scale_min(gSavedSettings, "TextureScaleMinAreaFactor", 0.04f); + static LLCachedControl<F32> texture_scale_min(gSavedSettings, "TextureScaleMinAreaFactor", 0.0095f); static LLCachedControl<F32> texture_scale_max(gSavedSettings, "TextureScaleMaxAreaFactor", 25.f); F32 max_vsize = 0.f; bool on_screen = false; U32 face_count = 0; + U32 max_faces_to_check = 1024; // get adjusted bias based on image resolution - F32 max_discard = F32(imagep->getMaxDiscardLevel()); + LLImageGL* img = imagep->getGLTexture(); + F32 max_discard = F32(img ? img->getMaxDiscardLevel() : MAX_DISCARD_LEVEL); F32 bias = llclamp(max_discard - 2.f, 1.f, LLViewerTexture::sDesiredDiscardBias); // convert bias into a vsize scaler @@ -919,13 +934,15 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE; for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i) { - for (S32 fi = 0; fi < imagep->getNumFaces(i); ++fi) + face_count += imagep->getNumFaces(i); + S32 faces_to_check = (face_count > max_faces_to_check) ? 0 : imagep->getNumFaces(i); + + for (S32 fi = 0; fi < faces_to_check; ++fi) { LLFace* face = (*(imagep->getFaceList(i)))[fi]; if (face && face->getViewerObject()) { - ++face_count; F32 radius; F32 cos_angle_to_view_dir; @@ -939,12 +956,13 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag F32 vsize = face->getPixelArea(); - on_screen = face->mInFrustum; + on_screen |= face->mInFrustum; // Scale desired texture resolution higher or lower depending on texture scale // - // Minimum usage examples: a 1024x1024 texture with aplhabet, runing string - // shows one letter at a time + // Minimum usage examples: a 1024x1024 texture with aplhabet (texture atlas), + // runing string shows one letter at a time. If texture has ten 100px symbols + // per side, minimal scale is (100/1024)^2 = 0.0095 // // Maximum usage examples: huge chunk of terrain repeats texture // TODO: make this work with the GLTF texture transforms @@ -956,7 +974,8 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag vsize /= min_scale; // apply bias to offscreen faces all the time, but only to onscreen faces when bias is large - if (!face->mInFrustum || LLViewerTexture::sDesiredDiscardBias > 2.f) + // use mImportanceToCamera to make bias switch a bit more gradual + if (!face->mInFrustum || LLViewerTexture::sDesiredDiscardBias > 1.9f + face->mImportanceToCamera / 2.f) { vsize /= bias; } @@ -969,14 +988,27 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag } max_vsize = llmax(max_vsize, vsize); + + // addTextureStats limits size to sMaxVirtualSize + if (max_vsize >= LLViewerFetchedTexture::sMaxVirtualSize + && (on_screen || LLViewerTexture::sDesiredDiscardBias <= BIAS_TRS_ON_SCREEN)) + { + break; + } } } + + if (max_vsize >= LLViewerFetchedTexture::sMaxVirtualSize + && (on_screen || LLViewerTexture::sDesiredDiscardBias <= BIAS_TRS_ON_SCREEN)) + { + break; + } } - if (face_count > 1024) + if (face_count > max_faces_to_check) { // this texture is used in so many places we should just boost it and not bother checking its vsize // this is especially important because the above is not time sliced and can hit multiple ms for a single texture - imagep->setBoostLevel(LLViewerFetchedTexture::BOOST_HIGH); + max_vsize = MAX_IMAGE_AREA; } if (imagep->getType() == LLViewerTexture::LOD_TEXTURE && imagep->getBoostLevel() == LLViewerTexture::BOOST_NONE) @@ -984,8 +1016,8 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag // this is an alternative to decaying mMaxVirtualSize over time // that keeps textures from continously downrezzing and uprezzing in the background - if (LLViewerTexture::sDesiredDiscardBias > 1.5f || - (!on_screen && LLViewerTexture::sDesiredDiscardBias > 1.f)) + if (LLViewerTexture::sDesiredDiscardBias > BIAS_TRS_OUT_OF_SCREEN || + (!on_screen && LLViewerTexture::sDesiredDiscardBias > BIAS_TRS_ON_SCREEN)) { imagep->mMaxVirtualSize = 0.f; } @@ -1089,7 +1121,6 @@ F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time) imagep->postCreateTexture(); imagep->mCreatePending = false; - mCreateTextureList.pop(); if (imagep->hasGLTexture() && imagep->getDiscardLevel() < imagep->getDesiredDiscardLevel() && (imagep->getDesiredDiscardLevel() <= MAX_DISCARD_LEVEL)) @@ -1101,6 +1132,8 @@ F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time) imagep->scaleDown(); } + mCreateTextureList.pop(); + if (create_timer.getElapsedTimeF32() > max_time) { break; @@ -1114,6 +1147,8 @@ F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time) // just in case we downres textures, bind downresmap and copy program gPipeline.mDownResMap.bindTarget(); + //gPipeline.mDownResMap.clear(); + gCopyProgram.bind(); gPipeline.mScreenTriangleVB->setBuffer(); @@ -1123,7 +1158,7 @@ F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time) // do at least 5 and make sure we don't get too far behind even if it violates // the time limit. If we don't downscale quickly the viewer will hit swap and may // freeze. - S32 min_count = (S32)mCreateTextureList.size() / 20 + 5; + S32 min_count = (S32)mCreateTextureList.size() / 20 + 3; create_timer.reset(); while (!mDownScaleQueue.empty()) @@ -1175,6 +1210,8 @@ F32 LLViewerTextureList::updateImagesLoadingFastCache(F32 max_time) enditer = iter; LLViewerFetchedTexture *imagep = *curiter; imagep->loadFromFastCache(); + if (timer.getElapsedTimeF32() > max_time) + break; } mFastCacheList.erase(mFastCacheList.begin(), enditer); return timer.getElapsedTimeF32(); @@ -1286,7 +1323,7 @@ void LLViewerTextureList::decodeAllImages(F32 max_time) LLTimer timer; //loading from fast cache - updateImagesLoadingFastCache(max_time); + max_time -= updateImagesLoadingFastCache(max_time); // Update texture stats and priorities std::vector<LLPointer<LLViewerFetchedTexture> > image_list; @@ -1417,6 +1454,15 @@ bool LLViewerTextureList::createUploadFile(const std::string& filename, image->setLastError("Couldn't load the image to be uploaded."); return false; } + + // calcDataSizeJ2C assumes maximum size is 2048 and for bigger images can + // assign discard to bring imige to needed size, but upload does the scaling + // as needed, so just reset discard. + // Assume file is full and has 'discard' 0 data. + // Todo: probably a better idea to have some setMaxDimentions in J2C + // called when loading from a local file + image->setDiscardLevel(0); + // Decompress or expand it in a raw image structure LLPointer<LLImageRaw> raw_image = new LLImageRaw; if (!image->decode(raw_image, 0.0f)) diff --git a/indra/newview/llviewerthrottle.cpp b/indra/newview/llviewerthrottle.cpp index b0a00c29a4..3ccfbea6e2 100644 --- a/indra/newview/llviewerthrottle.cpp +++ b/indra/newview/llviewerthrottle.cpp @@ -48,6 +48,8 @@ const F32 MIN_FRACTIONAL = 0.2f; const F32 MIN_BANDWIDTH = 50.f; const F32 MAX_BANDWIDTH = 6000.f; const F32 STEP_FRACTIONAL = 0.1f; +const F32 HIGH_BUFFER_LOAD_TRESHOLD = 1.f; +const F32 LOW_BUFFER_LOAD_TRESHOLD = 0.8f; const LLUnit<F32, LLUnits::Percent> TIGHTEN_THROTTLE_THRESHOLD(3.0f); // packet loss % per s const LLUnit<F32, LLUnits::Percent> EASE_THROTTLE_THRESHOLD(0.5f); // packet loss % per s const F32 DYNAMIC_UPDATE_DURATION = 5.0f; // seconds @@ -146,7 +148,7 @@ LLViewerThrottleGroup LLViewerThrottleGroup::operator-(const LLViewerThrottleGro void LLViewerThrottleGroup::sendToSim() const { - LL_INFOS() << "Sending throttle settings, total BW " << mThrottleTotal << LL_ENDL; + LL_DEBUGS("Throttle") << "Sending throttle settings, total BW " << mThrottleTotal << LL_ENDL; LLMessageSystem* msg = gMessageSystem; msg->newMessageFast(_PREHASH_AgentThrottle); @@ -223,7 +225,7 @@ void LLViewerThrottle::setMaxBandwidth(F32 kbits_per_second, bool from_event) void LLViewerThrottle::load() { - mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS")*1024; + mMaxBandwidth = getMaxBandwidthKbps() * 1024; resetDynamicThrottle(); mCurrent.dump(); } @@ -240,6 +242,15 @@ void LLViewerThrottle::sendToSim() const mCurrent.sendToSim(); } +F32 LLViewerThrottle::getMaxBandwidthKbps() +{ + constexpr F32 MIN_BANDWIDTH = 100.0f; // 100 Kbps + constexpr F32 MAX_BANDWIDTH = 10000.0f; // 10 Mbps + + static LLCachedControl<F32> bandwidth(gSavedSettings, "ThrottleBandwidthKBPS", 3000.0); + return llclamp(bandwidth(), MIN_BANDWIDTH, MAX_BANDWIDTH); +} + LLViewerThrottleGroup LLViewerThrottle::getThrottleGroup(const F32 bandwidth_kbps) { @@ -305,7 +316,10 @@ void LLViewerThrottle::updateDynamicThrottle() mUpdateTimer.reset(); LLUnit<F32, LLUnits::Percent> mean_packets_lost = LLViewerStats::instance().getRecording().getMean(LLStatViewer::PACKETS_LOST_PERCENT); - if (mean_packets_lost > TIGHTEN_THROTTLE_THRESHOLD) + if ( + mean_packets_lost > TIGHTEN_THROTTLE_THRESHOLD // already losing packets + || mBufferLoadRate >= HIGH_BUFFER_LOAD_TRESHOLD // let viewer sort through the backlog before it starts dropping packets + ) { if (mThrottleFrac <= MIN_FRACTIONAL || mCurrentBandwidth / 1024.0f <= MIN_BANDWIDTH) { @@ -318,7 +332,8 @@ void LLViewerThrottle::updateDynamicThrottle() mCurrent.sendToSim(); LL_INFOS() << "Tightening network throttle to " << mCurrentBandwidth << LL_ENDL; } - else if (mean_packets_lost <= EASE_THROTTLE_THRESHOLD) + else if (mean_packets_lost <= EASE_THROTTLE_THRESHOLD + && mBufferLoadRate < LOW_BUFFER_LOAD_TRESHOLD) { if (mThrottleFrac >= MAX_FRACTIONAL || mCurrentBandwidth / 1024.0f >= MAX_BANDWIDTH) { @@ -331,4 +346,6 @@ void LLViewerThrottle::updateDynamicThrottle() mCurrent.sendToSim(); LL_INFOS() << "Easing network throttle to " << mCurrentBandwidth << LL_ENDL; } + + mBufferLoadRate = 0; } diff --git a/indra/newview/llviewerthrottle.h b/indra/newview/llviewerthrottle.h index 28a24d04fc..ef898a97d7 100644 --- a/indra/newview/llviewerthrottle.h +++ b/indra/newview/llviewerthrottle.h @@ -64,18 +64,22 @@ public: void save() const; void sendToSim() const; + static F32 getMaxBandwidthKbps(); F32 getMaxBandwidth()const { return mMaxBandwidth; } F32 getCurrentBandwidth() const { return mCurrentBandwidth; } void updateDynamicThrottle(); void resetDynamicThrottle(); + void setBufferLoadRate(F32 rate) { mBufferLoadRate = llmax(mBufferLoadRate, rate); } + LLViewerThrottleGroup getThrottleGroup(const F32 bandwidth_kbps); static const std::string sNames[TC_EOF]; protected: F32 mMaxBandwidth; F32 mCurrentBandwidth; + F32 mBufferLoadRate = 0; LLViewerThrottleGroup mCurrent; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 82a67d50dc..9788fc5f4d 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -66,6 +66,7 @@ #include "llchatentry.h" #include "indra_constants.h" #include "llassetstorage.h" +#include "lldate.h" #include "llerrorcontrol.h" #include "llfontgl.h" #include "llmousehandler.h" @@ -79,14 +80,13 @@ #include "message.h" #include "object_flags.h" #include "lltimer.h" -#include "llviewermenu.h" #include "lltooltip.h" #include "llmediaentry.h" #include "llurldispatcher.h" #include "raytrace.h" // newview includes -#include "llagent.h" +#include "llaccordionctrl.h" #include "llbox.h" #include "llchicletbar.h" #include "llconsole.h" @@ -118,7 +118,6 @@ #include "llfontfreetype.h" #include "llgesturemgr.h" #include "llglheaders.h" -#include "lltooltip.h" #include "llhudmanager.h" #include "llhudobject.h" #include "llhudview.h" @@ -133,7 +132,6 @@ #include "llmorphview.h" #include "llmoveview.h" #include "llnavigationbar.h" -#include "llnotificationhandler.h" #include "llpaneltopinfobar.h" #include "llpopupview.h" #include "llpreviewtexture.h" @@ -166,17 +164,13 @@ #include "lltoolselectland.h" #include "lltrans.h" #include "lluictrlfactory.h" -#include "llurldispatcher.h" // SLURL from other app instance #include "llversioninfo.h" #include "llvieweraudio.h" -#include "llviewercamera.h" #include "llviewergesture.h" #include "llviewertexturelist.h" #include "llviewerinventory.h" -#include "llviewerinput.h" #include "llviewermedia.h" #include "llviewermediafocus.h" -#include "llviewermenu.h" #include "llviewermessage.h" #include "llviewerobjectlist.h" #include "llviewerparcelmgr.h" @@ -210,7 +204,6 @@ #include "llwindowlistener.h" #include "llviewerwindowlistener.h" -#include "llpaneltopinfobar.h" #include "llcleanup.h" #if LL_WINDOWS @@ -269,9 +262,6 @@ static const F32 MIN_DISPLAY_SCALE = 0.75f; static const char KEY_MOUSELOOK = 'M'; -static LLCachedControl<std::string> sSnapshotBaseName(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseName", "Snapshot")); -static LLCachedControl<std::string> sSnapshotDir(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseDir", "")); - LLTrace::SampleStatHandle<> LLViewerWindow::sMouseVelocityStat("Mouse Velocity"); @@ -497,7 +487,8 @@ public: clearText(); - if (gSavedSettings.getBOOL("DebugShowTime")) + static LLCachedControl<bool> debug_show_time(gSavedSettings, "DebugShowTime", false); + if (debug_show_time()) { F32 time = gFrameTimeSeconds; S32 hours = (S32)(time / (60*60)); @@ -506,7 +497,8 @@ public: addText(xpos, ypos, llformat("Time: %d:%02d:%02d", hours,mins,secs)); ypos += y_inc; } - if (gSavedSettings.getBOOL("DebugShowMemory")) + static LLCachedControl<bool> debug_show_memory(gSavedSettings, "DebugShowMemory", false); + if (debug_show_memory()) { addText(xpos, ypos, STRINGIZE("Memory: " << (LLMemory::getCurrentRSS() / 1024) << " (KB)")); @@ -599,7 +591,8 @@ public: ypos += y_inc; }*/ - if (gSavedSettings.getBOOL("DebugShowRenderInfo")) + static LLCachedControl<bool> debug_show_render_info(gSavedSettings, "DebugShowRenderInfo", false); + if (debug_show_render_info()) { LLTrace::Recording& last_frame_recording = LLTrace::get_frame_recording().getLastRecording(); @@ -738,7 +731,8 @@ public: gPipeline.mNumVisibleNodes = LLPipeline::sVisibleLightCount = 0; } - if (gSavedSettings.getBOOL("DebugShowAvatarRenderInfo")) + static LLCachedControl<bool> debug_show_avatar_render_info(gSavedSettings, "DebugShowAvatarRenderInfo", false); + if (debug_show_avatar_render_info()) { std::map<std::string, LLVOAvatar*> sorted_avs; { @@ -771,7 +765,8 @@ public: av_iter++; } } - if (gSavedSettings.getBOOL("DebugShowRenderMatrices")) + static LLCachedControl<bool> debug_show_render_matrices(gSavedSettings, "DebugShowRenderMatrices", false); + if (debug_show_render_matrices()) { char camera_lines[8][32]; memset(camera_lines, ' ', sizeof(camera_lines)); @@ -787,8 +782,16 @@ public: addText(xpos, ypos, "Projection Matrix"); ypos += y_inc; +#if LL_DARWIN +// For sprintf deprecation +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif // View last column is always <0,0,0,1> MATRIX_ROW_F32_TO_STR(gGLModelView, 12,camera_lines[3]); addText(xpos, ypos, std::string(camera_lines[3])); ypos += y_inc; +#if LL_DARWIN +#pragma clang diagnostic pop +#endif MATRIX_ROW_N32_TO_STR(gGLModelView, 8,camera_lines[2]); addText(xpos, ypos, std::string(camera_lines[2])); ypos += y_inc; MATRIX_ROW_N32_TO_STR(gGLModelView, 4,camera_lines[1]); addText(xpos, ypos, std::string(camera_lines[1])); ypos += y_inc; mBackRectCamera2.mTop = ypos + 2; MATRIX_ROW_N32_TO_STR(gGLModelView, 0,camera_lines[0]); addText(xpos, ypos, std::string(camera_lines[0])); ypos += y_inc; @@ -797,7 +800,8 @@ public: ypos += y_inc; } // disable use of glReadPixels which messes up nVidia nSight graphics debugging - if (gSavedSettings.getBOOL("DebugShowColor") && !LLRender::sNsightDebugSupport) + static LLCachedControl<bool> debug_show_color(gSavedSettings, "DebugShowColor", false); + if (debug_show_color() && !LLRender::sNsightDebugSupport) { U8 color[4]; LLCoordGL coord = gViewerWindow->getCurrentMouse(); @@ -889,7 +893,8 @@ public: } } - if (gSavedSettings.getBOOL("DebugShowTextureInfo")) + static LLCachedControl<bool> debug_show_texture_info(gSavedSettings, "DebugShowTextureInfo", false); + if (debug_show_texture_info()) { LLViewerObject* objectp = NULL ; @@ -1425,11 +1430,17 @@ void LLViewerWindow::handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask mWindow->showCursorFromMouseMove(); - if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME - && !gDisconnected) + if (!gDisconnected) + { + if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME) { gAgent.clearAFK(); } + else + { + gAwayTriggerTimer.reset(); + } + } } void LLViewerWindow::handleMouseDragged(LLWindow *window, LLCoordGL pos, MASK mask) @@ -1456,15 +1467,43 @@ void LLViewerWindow::handleMouseLeave(LLWindow *window) LLToolTipMgr::instance().blockToolTips(); } -bool LLViewerWindow::handleCloseRequest(LLWindow *window) +bool LLViewerWindow::handleCloseRequest(LLWindow *window, bool from_user) { - // User has indicated they want to close, but we may need to ask - // about modified documents. - LLAppViewer::instance()->userQuit(); - // Don't quit immediately + if (!LLApp::isExiting() && !LLApp::isStopped()) + { + if (from_user) + { + // User has indicated they want to close, but we may need to ask + // about modified documents. + LLAppViewer::instance()->userQuit(); + // Don't quit immediately + } + else + { + // OS is asking us to quit, assume we have time and start cleanup + LLAppViewer::instance()->requestQuit(); + } + } return false; } +bool LLViewerWindow::handleSessionExit(LLWindow* window) +{ + if (!LLApp::isExiting() && !LLApp::isStopped()) + { + // Viewer received WM_ENDSESSION and app will be killed soon if it doesn't respond + LLAppViewer* app = LLAppViewer::instance(); + app->sendSimpleLogoutRequest(); + app->earlyExitNoNotify(); + + // Not viewer's fault, remove marker files so + // that statistics won't consider this to be a crash + app->removeMarkerFiles(); + return false; + } + return true; +} + void LLViewerWindow::handleQuit(LLWindow *window) { if (gNonInteractive) @@ -1545,6 +1584,10 @@ bool LLViewerWindow::handleTranslatedKeyDown(KEY key, MASK mask, bool repeated) { gAgent.clearAFK(); } + else + { + gAwayTriggerTimer.reset(); + } // *NOTE: We want to interpret KEY_RETURN later when it arrives as // a Unicode char, not as a keydown. Otherwise when client frame @@ -1605,7 +1648,8 @@ bool LLViewerWindow::handleActivate(LLWindow *window, bool activated) mActive = false; // if the user has chosen to go Away automatically after some time, then go Away when minimizing - if (gSavedSettings.getS32("AFKTimeout")) + static LLCachedControl<S32> afk_time(gSavedSettings, "AFKTimeout", 300); + if (afk_time()) { gAgent.setAFK(); } @@ -1840,8 +1884,9 @@ LLViewerWindow::LLViewerWindow(const Params& p) // pass its value right now. Instead, pass it a nullary function that // will, when we later need it, return the value of gKeyboard. // boost::lambda::var() constructs such a functor on the fly. - mWindowListener.reset(new LLWindowListener(this, boost::lambda::var(gKeyboard))); - mViewerWindowListener.reset(new LLViewerWindowListener(this)); + LLWindowListener::KeyboardGetter getter = [](){ return gKeyboard; }; + mWindowListener = std::make_unique<LLWindowListener>(this, getter); + mViewerWindowListener = std::make_unique<LLViewerWindowListener>(this); mSystemChannel.reset(new LLNotificationChannel("System", "Visible", LLNotificationFilters::includeEverything)); mCommunicationChannel.reset(new LLCommunicationChannel("Communication", "Visible")); @@ -1879,7 +1924,7 @@ LLViewerWindow::LLViewerWindow(const Params& p) p.ignore_pixel_depth, 0, max_core_count, - max_gl_version); //don't use window level anti-aliasing + max_gl_version); //don't use window level anti-aliasing, windows only if (NULL == mWindow) { @@ -1964,7 +2009,7 @@ LLViewerWindow::LLViewerWindow(const Params& p) LL_DEBUGS("Window") << "Loading feature tables." << LL_ENDL; // Initialize OpenGL Renderer - LLVertexBuffer::initClass(mWindow); + LLVertexBuffer::initClass(mWindow, gSavedSettings.getU32("MPVertexBufferMode")); LL_INFOS("RenderInit") << "LLVertexBuffer initialization done." << LL_ENDL ; if (!gGL.init(true)) { @@ -2023,6 +2068,7 @@ LLViewerWindow::LLViewerWindow(const Params& p) std::string LLViewerWindow::getLastSnapshotDir() { + static LLCachedControl<std::string> sSnapshotDir(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseDir", "")); return sSnapshotDir; } @@ -2280,24 +2326,23 @@ void LLViewerWindow::initWorldUI() gToolBarView->setVisible(true); } - if (!gNonInteractive) + // Don't preload cef instances on low end hardware + const F32Gigabytes MIN_PHYSICAL_MEMORY(8); + F32Gigabytes physical_mem = LLMemory::getMaxMemKB(); + if (physical_mem <= 0) { - LLMediaCtrl* destinations = LLFloaterReg::getInstance("destinations")->getChild<LLMediaCtrl>("destination_guide_contents"); - if (destinations) - { - destinations->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL")); - std::string url = gSavedSettings.getString("DestinationGuideURL"); - url = LLWeb::expandURLSubstitutions(url, LLSD()); - destinations->navigateTo(url, HTTP_CONTENT_TEXT_HTML); - } - LLMediaCtrl* avatar_picker = LLFloaterReg::getInstance("avatar")->findChild<LLMediaCtrl>("avatar_picker_contents"); - if (avatar_picker) - { - avatar_picker->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL")); - std::string url = gSavedSettings.getString("AvatarPickerURL"); - url = LLWeb::expandURLSubstitutions(url, LLSD()); - avatar_picker->navigateTo(url, HTTP_CONTENT_TEXT_HTML); - } + LLMemory::updateMemoryInfo(); + physical_mem = LLMemory::getMaxMemKB(); + } + + if (!gNonInteractive && physical_mem > MIN_PHYSICAL_MEMORY) + { + LL_INFOS() << "Preloading cef instances" << LL_ENDL; + + LLFloaterReg::getInstance("destinations"); + LLFloaterReg::getInstance("avatar_welcome_pack"); + LLFloaterReg::getInstance("search"); + LLFloaterReg::getInstance("marketplace"); } } @@ -3014,7 +3059,8 @@ bool LLViewerWindow::handleKey(KEY key, MASK mask) { if ((focusedFloaterName == "nearby_chat") || (focusedFloaterName == "im_container") || (focusedFloaterName == "impanel")) { - if (gSavedSettings.getBOOL("ArrowKeysAlwaysMove")) + LLCachedControl<bool> key_move(gSavedSettings, "ArrowKeysAlwaysMove"); + if (key_move()) { // let Control-Up and Control-Down through for chat line history, if (!(key == KEY_UP && mask == MASK_CONTROL) @@ -3028,10 +3074,9 @@ bool LLViewerWindow::handleKey(KEY key, MASK mask) case KEY_RIGHT: case KEY_UP: case KEY_DOWN: - case KEY_PAGE_UP: - case KEY_PAGE_DOWN: - case KEY_HOME: - case KEY_END: + case KEY_PAGE_UP: //jump + case KEY_PAGE_DOWN: // down + case KEY_HOME: // toggle fly // when chatbar is empty or ArrowKeysAlwaysMove set, // pass arrow keys on to avatar... return false; @@ -3286,7 +3331,31 @@ void LLViewerWindow::clearPopups() void LLViewerWindow::moveCursorToCenter() { - if (! gSavedSettings.getBOOL("DisableMouseWarp")) + bool mouse_warp = false; + LLCachedControl<S32> mouse_warp_mode(gSavedSettings, "MouseWarpMode", 1); + + switch (mouse_warp_mode()) + { + case 0: + // For Windows: + // Mouse usually uses 'delta' position since it isn't aware of own location, keep it centered. + // Touch screen reports absolute or virtual absolute position and warping a physical + // touch is pointless, so don't move it. + // + // MacOS + // If 'decoupled', CGAssociateMouseAndMouseCursorPosition can make mouse stay in + // one place and not move, do not move it (needs testing). + mouse_warp = mWindow->isWrapMouse(); + break; + case 1: + mouse_warp = true; + break; + default: + mouse_warp = false; + break; + } + + if (mouse_warp) { S32 x = getWorldViewWidthScaled() / 2; S32 y = getWorldViewHeightScaled() / 2; @@ -3362,6 +3431,8 @@ void LLViewerWindow::updateUI() LLConsole::updateClass(); + // execute postponed arrange calls + LLAccordionCtrl::updateClass(); // animate layout stacks so we have up to date rect for world view LLLayoutStack::updateClass(); @@ -3845,7 +3916,7 @@ void LLViewerWindow::updateLayout() void LLViewerWindow::updateMouseDelta() { -#if LL_WINDOWS +#if LL_WINDOWS && !LL_SDL LLCoordCommon delta; mWindow->getCursorDelta(&delta); S32 dx = delta.mX; @@ -4721,6 +4792,7 @@ void LLViewerWindow::saveImageNumbered(LLImageFormatted *image, bool force_picke // Get a base file location if needed. if (force_picker || !isSnapshotLocSet()) { + static LLCachedControl<std::string> sSnapshotBaseName(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseName", "Snapshot")); std::string proposed_name(sSnapshotBaseName); // getSaveFile will append an appropriate extension to the proposed name, based on the ESaveFilter constant passed in. @@ -4775,11 +4847,22 @@ void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_save // Check if there is enough free space to save snapshot #ifdef LL_WINDOWS - boost::filesystem::path b_path(utf8str_to_utf16str(lastSnapshotDir)); + boost::filesystem::path b_path(ll_convert<std::wstring>(lastSnapshotDir)); #else boost::filesystem::path b_path(lastSnapshotDir); #endif - if (!boost::filesystem::is_directory(b_path)) + boost::system::error_code ec; + if (!boost::filesystem::is_directory(b_path, ec) || ec.failed()) + { + LLSD args; + args["PATH"] = lastSnapshotDir; + LLNotificationsUtil::add("SnapshotToLocalDirNotExist", args); + resetSnapshotLoc(); + failure_cb(); + return; + } + boost::filesystem::space_info b_space = boost::filesystem::space(b_path, ec); + if (ec.failed()) { LLSD args; args["PATH"] = lastSnapshotDir; @@ -4788,7 +4871,6 @@ void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_save failure_cb(); return; } - boost::filesystem::space_info b_space = boost::filesystem::space(b_path); if (b_space.free < image->getDataSize()) { LLSD args; @@ -4805,29 +4887,39 @@ void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_save LLNotificationsUtil::add("SnapshotToComputerFailed", args); failure_cb(); + + // Shouldn't there be a return here? } + static LLCachedControl<std::string> sSnapshotBaseName(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseName", "Snapshot")); + static LLCachedControl<std::string> sSnapshotDir(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseDir", "")); + // Look for an unused file name - bool is_snapshot_name_loc_set = isSnapshotLocSet(); + auto is_snapshot_name_loc_set = isSnapshotLocSet(); std::string filepath; - S32 i = 1; - S32 err = 0; - std::string extension("." + image->getExtension()); + auto i = 1; + auto err = 0; + auto extension("." + image->getExtension()); + auto now = LLDate::now(); + static LLCachedControl<bool> snapshot_timestamp(gSavedSettings, "SnapshotTimestamp", true); do { filepath = sSnapshotDir; filepath += gDirUtilp->getDirDelimiter(); filepath += sSnapshotBaseName; - - if (is_snapshot_name_loc_set) + if (snapshot_timestamp) { - filepath += llformat("_%.3d",i); + filepath += now.toLocalDateString("_%Y-%m-%d_%H%M%S"); + filepath += llformat("%.2d", i); + } + else if (is_snapshot_name_loc_set) + { + filepath += llformat("_%.3d", i); } - filepath += extension; llstat stat_info; - err = LLFile::stat( filepath, &stat_info ); + err = LLFile::stat(filepath, &stat_info); i++; } while( -1 != err // Search until the file is not found (i.e., stat() gives an error). @@ -4862,12 +4954,12 @@ void LLViewerWindow::movieSize(S32 new_width, S32 new_height) } } -bool LLViewerWindow::saveSnapshot(const std::string& filepath, S32 image_width, S32 image_height, bool show_ui, bool show_hud, bool do_rebuild, LLSnapshotModel::ESnapshotLayerType type, LLSnapshotModel::ESnapshotFormat format) +bool LLViewerWindow::saveSnapshot(const std::string& filepath, S32 image_width, S32 image_height, bool show_ui, bool show_hud, bool do_rebuild, bool show_balance, LLSnapshotModel::ESnapshotLayerType type, LLSnapshotModel::ESnapshotFormat format) { LL_INFOS() << "Saving snapshot to: " << filepath << LL_ENDL; LLPointer<LLImageRaw> raw = new LLImageRaw; - bool success = rawSnapshot(raw, image_width, image_height, true, false, show_ui, show_hud, do_rebuild); + bool success = rawSnapshot(raw, image_width, image_height, true, false, show_ui, show_hud, do_rebuild, show_balance); if (success) { @@ -4917,8 +5009,8 @@ void LLViewerWindow::playSnapshotAnimAndSound() bool LLViewerWindow::isSnapshotLocSet() const { - std::string snapshot_dir = sSnapshotDir; - return !snapshot_dir.empty(); + static LLCachedControl<std::string> sSnapshotDir(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseDir", "")); + return !sSnapshotDir().empty(); } void LLViewerWindow::resetSnapshotLoc() const @@ -4928,14 +5020,14 @@ void LLViewerWindow::resetSnapshotLoc() const bool LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, bool show_ui, bool show_hud, bool do_rebuild, bool no_post, LLSnapshotModel::ESnapshotLayerType type) { - return rawSnapshot(raw, preview_width, preview_height, false, false, show_ui, show_hud, do_rebuild, no_post, type); + return rawSnapshot(raw, preview_width, preview_height, false, false, show_ui, show_hud, do_rebuild, no_post, gSavedSettings.getBOOL("RenderBalanceInSnapshot"), type); } // Saves the image from the screen to a raw image // Since the required size might be bigger than the available screen, this method rerenders the scene in parts (called subimages) and copy // the results over to the final raw image. bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, - bool keep_window_aspect, bool is_texture, bool show_ui, bool show_hud, bool do_rebuild, bool no_post, LLSnapshotModel::ESnapshotLayerType type, S32 max_size) + bool keep_window_aspect, bool is_texture, bool show_ui, bool show_hud, bool do_rebuild, bool no_post, bool show_balance, LLSnapshotModel::ESnapshotLayerType type, S32 max_size) { if (!raw) { @@ -4993,6 +5085,8 @@ bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei // If the user wants the UI, limit the output size to the available screen size image_width = llmin(image_width, window_width); image_height = llmin(image_height, window_height); + + setBalanceVisible(show_balance); } S32 original_width = 0; @@ -5070,11 +5164,13 @@ bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei } else { + setBalanceVisible(true); return false; } if (raw->isBufferInvalid()) { + setBalanceVisible(true); return false; } @@ -5161,7 +5257,7 @@ bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei glReadPixels( subimage_x_offset, out_y + subimage_y_offset, read_width, 1, - GL_DEPTH_COMPONENT, GL_FLOAT, + GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, depth_line_buffer->getData()// current output pixel is beginning of buffer... ); @@ -5250,6 +5346,7 @@ bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei { send_agent_resume(); } + setBalanceVisible(true); return ret; } @@ -5715,6 +5812,14 @@ void LLViewerWindow::setProgressCancelButtonVisible( bool b, const std::string& } } +void LLViewerWindow::setBalanceVisible(bool visible) +{ + if (gStatusBar) + { + gStatusBar->setBalanceVisible(visible); + } +} + LLProgressView *LLViewerWindow::getProgressView() const { return mProgressView; @@ -6035,7 +6140,7 @@ bool LLViewerWindow::getUIVisibility() // LLPickInfo::LLPickInfo() : mKeyMask(MASK_NONE), - mPickCallback(NULL), + mPickCallback(nullptr), mPickType(PICK_INVALID), mWantSurfaceInfo(false), mObjectFace(-1), @@ -6046,7 +6151,7 @@ LLPickInfo::LLPickInfo() mNormal(), mTangent(), mBinormal(), - mHUDIcon(NULL), + mHUDIcon(nullptr), mPickTransparent(false), mPickRigged(false), mPickParticle(false) @@ -6180,7 +6285,7 @@ void LLPickInfo::fetchResults() mObjectOffset = gAgentCamera.calcFocusOffset(objectp, v_intersection, mPickPt.mX, mPickPt.mY); mObjectID = objectp->mID; mObjectFace = (te_offset == NO_FACE) ? -1 : (S32)te_offset; - + mPickHUD = objectp->isHUDAttachment(); mPosGlobal = gAgent.getPosGlobalFromAgent(v_intersection); diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index fbc2c58fbf..f3c7ef3289 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -48,9 +48,10 @@ #include "lltrace.h" #include "llsnapshotmodel.h" -#include <boost/function.hpp> #include <boost/signals2.hpp> +#include <functional> + class LLView; class LLViewerObject; class LLUUID; @@ -133,6 +134,7 @@ public: bool mPickParticle; bool mPickUnselectable; bool mPickReflectionProbe = false; + bool mPickHUD{ false }; void getSurfaceInfo(); private: @@ -196,7 +198,8 @@ public: /*virtual*/ bool handleUnicodeChar(llwchar uni_char, MASK mask); // NOT going to handle extended /*virtual*/ bool handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask); /*virtual*/ bool handleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask); - /*virtual*/ bool handleCloseRequest(LLWindow *window); + /*virtual*/ bool handleCloseRequest(LLWindow *window, bool from_user); + /*virtual*/ bool handleSessionExit(LLWindow* window); /*virtual*/ void handleQuit(LLWindow *window); /*virtual*/ bool handleRightMouseDown(LLWindow *window, LLCoordGL pos, MASK mask); /*virtual*/ bool handleRightMouseUp(LLWindow *window, LLCoordGL pos, MASK mask); @@ -236,7 +239,7 @@ public: const std::map<std::string, std::string>& args); // signal on update of WorldView rect - typedef boost::function<void (LLRect old_world_rect, LLRect new_world_rect)> world_rect_callback_t; + typedef std::function<void (LLRect old_world_rect, LLRect new_world_rect)> world_rect_callback_t; typedef boost::signals2::signal<void (LLRect old_world_rect, LLRect new_world_rect)> world_rect_signal_t; world_rect_signal_t mOnWorldViewRectUpdated; boost::signals2::connection setOnWorldViewRectUpdated(world_rect_callback_t cb) { return mOnWorldViewRectUpdated.connect(cb); } @@ -363,9 +366,11 @@ public: // snapshot functionality. // perhaps some of this should move to llfloatershapshot? -MG - bool saveSnapshot(const std::string& filename, S32 image_width, S32 image_height, bool show_ui = true, bool show_hud = true, bool do_rebuild = false, LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::ESnapshotFormat format = LLSnapshotModel::SNAPSHOT_FORMAT_BMP); - bool rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, bool keep_window_aspect = true, bool is_texture = false, - bool show_ui = true, bool show_hud = true, bool do_rebuild = false, bool no_post = false, LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_SNAPSHOT_IMAGE_SIZE); + bool saveSnapshot(const std::string& filename, S32 image_width, S32 image_height, bool show_ui = true, bool show_hud = true, bool do_rebuild = false, bool show_balance = true, + LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::ESnapshotFormat format = LLSnapshotModel::SNAPSHOT_FORMAT_BMP); + bool rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, bool keep_window_aspect = true, bool is_texture = false, + bool show_ui = true, bool show_hud = true, bool do_rebuild = false, bool no_post = false, bool show_balance = true, + LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_SNAPSHOT_IMAGE_SIZE); bool simpleSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, const int num_render_passes); @@ -461,6 +466,8 @@ public: void calcDisplayScale(); static LLRect calcScaledRect(const LLRect & rect, const LLVector2& display_scale); + void setBalanceVisible(bool visible); + static std::string getLastSnapshotDir(); LLView* getFloaterSnapRegion() { return mFloaterSnapRegion; } diff --git a/indra/newview/llviewerwindowlistener.cpp b/indra/newview/llviewerwindowlistener.cpp index da7e18af5c..3119c31613 100644 --- a/indra/newview/llviewerwindowlistener.cpp +++ b/indra/newview/llviewerwindowlistener.cpp @@ -100,7 +100,7 @@ void LLViewerWindowListener::saveSnapshot(const LLSD& event) const } type = found->second; } - bool ok = mViewerWindow->saveSnapshot(event["filename"], width, height, showui, showhud, rebuild, type); + bool ok = mViewerWindow->saveSnapshot(event["filename"], width, height, showui, showhud, rebuild, true /*L$ Balance*/, type); sendReply(LLSDMap("ok", ok), event); } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index f5dfcca873..e2cafffb51 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -123,8 +123,8 @@ extern F32 ANIM_SPEED_MAX; extern F32 ANIM_SPEED_MIN; extern U32 JOINT_COUNT_REQUIRED_FOR_FULLRIG; -const F32 MAX_HOVER_Z = 2.0; -const F32 MIN_HOVER_Z = -2.0; +const F32 MAX_HOVER_Z = 3.0; +const F32 MIN_HOVER_Z = -3.0; const F32 MIN_ATTACHMENT_COMPLEXITY = 0.f; const F32 DEFAULT_MAX_ATTACHMENT_COMPLEXITY = 1.0e6f; @@ -576,7 +576,7 @@ private: // joint states to be animated //------------------------------------------------------------------------- LLPointer<LLJointState> mPelvisState; - LLCharacter* mCharacter; + LLCharacter* mCharacter; }; /** @@ -679,11 +679,13 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mVisuallyMuteSetting(AV_RENDER_NORMALLY), mMutedAVColor(LLColor4::white /* used for "uninitialize" */), mFirstFullyVisible(true), + mWaitingForMeshes(false), mFirstDecloudTime(-1.f), mFullyLoaded(false), mPreviousFullyLoaded(false), mFullyLoadedInitialized(false), - mLastCloudAttachmentCount(0), + mLastCloudAttachmentCount(-1), + mFullyLoadedFrameCounter(0), mVisualComplexity(VISUAL_COMPLEXITY_UNKNOWN), mLoadedCallbacksPaused(false), mLoadedCallbackTextures(0), @@ -777,11 +779,9 @@ std::string LLVOAvatar::avString() const { return " " + getFullname() + " "; } - else - { - std::string viz_string = LLVOAvatar::rezStatusToString(getRezzedStatus()); - return " Avatar '" + getFullname() + "' " + viz_string + " "; - } + + std::string status = LLVOAvatar::rezStatusToString(getRezzedStatus()); + return " Avatar '" + getDebugName() + "' " + status + " "; } void LLVOAvatar::debugAvatarRezTime(std::string notification_name, std::string comment) @@ -804,10 +804,10 @@ void LLVOAvatar::debugAvatarRezTime(std::string notification_name, std::string c if (gSavedSettings.getBOOL("DebugAvatarRezTime")) { LLSD args; - args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32()); - args["TIME"] = llformat("%d",(U32)mRuthDebugTimer.getElapsedTimeF32()); + args["EXISTENCE"] = llformat("%d", (U32)mDebugExistenceTimer.getElapsedTimeF32()); + args["TIME"] = llformat("%d", (U32)mRuthDebugTimer.getElapsedTimeF32()); args["NAME"] = getFullname(); - LLNotificationsUtil::add(notification_name,args); + LLNotificationsUtil::add(notification_name, args); } } @@ -818,15 +818,14 @@ LLVOAvatar::~LLVOAvatar() { sInstances.remove(this); - if (gSavedSettings.getBOOL("IMShowArrivalsDepartures")) + static LLCachedControl<bool> show_arrival_departures(gSavedSettings, "IMShowArrivalsDepartures", false); + if (show_arrival_departures && !isSelf()) { - LLAvatarName av_name; - LLAvatarNameCache::get(getID(), &av_name); - auto display_name = av_name.getDisplayName(); - if (!display_name.empty()) + auto full_name = getFullname(); + if (!full_name.empty()) { - LLChat chat{llformat("%s left.", display_name.c_str())}; - chat.mFromName = display_name; + LLChat chat{llformat("%s left.", full_name.c_str())}; + chat.mFromName = full_name; chat.mFromID = getID(); LLSD args; args["COLOR"] = "ChatHistoryTextColor"; @@ -835,14 +834,14 @@ LLVOAvatar::~LLVOAvatar() } if (!mFullyLoaded) { - debugAvatarRezTime("AvatarRezLeftCloudNotification","left after ruth seconds as cloud"); + debugAvatarRezTime("AvatarRezLeftCloudNotification", "left after ruth seconds as cloud"); } else { - debugAvatarRezTime("AvatarRezLeftNotification","left sometime after declouding"); + debugAvatarRezTime("AvatarRezLeftNotification", "left sometime after declouding"); } - if(mTuned) + if (mTuned) { LLPerfStats::tunedAvatars--; mTuned = false; @@ -936,12 +935,12 @@ bool LLVOAvatar::isFullyTextured() const bool LLVOAvatar::hasGray() const { - return !getIsCloud() && !isFullyTextured(); + return !getHasMissingParts() && !isFullyTextured(); } S32 LLVOAvatar::getRezzedStatus() const { - if (getIsCloud()) return 0; + if (getHasMissingParts()) return 0; bool textured = isFullyTextured(); bool all_baked_loaded = allBakedTexturesCompletelyDownloaded(); if (textured && all_baked_loaded && getAttachmentCount() == mSimAttachments.size()) return 4; @@ -984,34 +983,49 @@ bool LLVOAvatar::areAllNearbyInstancesBaked(S32& grey_avatars) ++grey_avatars; } } - return !grey_avatars; + return grey_avatars == 0; } // static -void LLVOAvatar::getNearbyRezzedStats(std::vector<S32>& counts, F32& avg_cloud_time, S32& cloud_avatars) +void LLVOAvatar::getNearbyRezzedStats(std::vector<S32>& counts, F32& avg_cloud_time, S32& cloud_avatars, S32& pending_meshes, S32& control_avatars) { counts.clear(); counts.resize(5); avg_cloud_time = 0; cloud_avatars = 0; + pending_meshes = 0; + control_avatars = 0; S32 count_avg = 0; for (LLCharacter* character : LLCharacter::sInstances) { - if (LLVOAvatar* inst = (LLVOAvatar*)character) + LLVOAvatar* inst = (LLVOAvatar*)character; + if (inst && !inst->isUIAvatar() && !inst->isSelf()) { - S32 rez_status = inst->getRezzedStatus(); - counts[rez_status]++; - F32 time = inst->getFirstDecloudTime(); - if (time >= 0) + if (inst->isControlAvatar()) { - avg_cloud_time+=time; - count_avg++; + control_avatars++; } - if (!inst->isFullyLoaded() || time < 0) + else { - // still renders as cloud - cloud_avatars++; + S32 rez_status = inst->getRezzedStatus(); + counts[rez_status]++; + F32 time = inst->getFirstDecloudTime(); + if (time >= 0) + { + avg_cloud_time += time; + count_avg++; + } + if (!inst->isFullyLoaded() || time < 0) + { + // still renders as cloud + cloud_avatars++; + if (rez_status >= 4 + && inst->mWaitingForMeshes) + { + pending_meshes++; + } + } } } } @@ -1028,7 +1042,7 @@ std::string LLVOAvatar::rezStatusToString(S32 rez_status) switch (rez_status) { case 0: - return "cloud"; + return "missing parts"; case 1: return "gray"; case 2: @@ -1191,7 +1205,7 @@ void LLVOAvatar::initClass() LLControlAvatar::sRegionChangedSlot = gAgent.addRegionChangedCallback(&LLControlAvatar::onRegionChanged); - sCloudTexture = LLViewerTextureManager::getFetchedTextureFromFile("cloud-particle.j2c"); + sCloudTexture = LLViewerTextureManager::getFetchedTextureFromFile("cloud-particle.png"); } @@ -2583,31 +2597,21 @@ U32 LLVOAvatar::processUpdateMessage(LLMessageSystem *mesgsys, { mDebugExistenceTimer.reset(); debugAvatarRezTime("AvatarRezArrivedNotification", "avatar arrived"); - if (gSavedSettings.getBOOL("IMShowArrivalsDepartures")) + static LLCachedControl<bool> show_arrival_departures(gSavedSettings, "IMShowArrivalsDepartures", false); + if (show_arrival_departures && !isSelf()) { - uuid_vec_t uuids; - std::vector<LLVector3d> positions; - LLWorld::getInstance()->getAvatars(&uuids, &positions, gAgent.getPositionGlobal(), gSavedSettings.getF32("MPVNearMeRange")); - auto pos_it = positions.begin(); - auto id_it = uuids.begin(); - for (;pos_it != positions.end() && id_it != uuids.end(); ++pos_it, ++id_it) + auto full_name = getFullname(); + if (!full_name.empty()) { - if (*id_it == getID() && !isSelf()) - { - LLAvatarName av_name; - LLAvatarNameCache::get(getID(), &av_name); - auto display_name = av_name.getDisplayName(); - if (!display_name.empty()) - { - LLChat chat{llformat("%s arrived (%.1f m).", display_name.c_str(), dist_vec(*pos_it, gAgent.getPositionGlobal()))}; - chat.mFromName = display_name; - chat.mFromID = getID(); - LLSD args; - args["COLOR"] = "ChatHistoryTextColor"; - LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args); - } - break; - } + auto avatarsPositions = gAgent.getAvatarsPositions(); + auto id = getID(); + auto avatarPosition = avatarsPositions[id]; + LLChat chat{std::string{full_name + " arrived" + (avatarPosition.isExactlyZero() ? "" : llformat(" (%.1f m)", dist_vec(avatarPosition, gAgent.getPositionGlobal()))) + "."}}; + chat.mFromName = full_name; + chat.mFromID = id; + LLSD args; + args["COLOR"] = "ChatHistoryTextColor"; + LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args); } } } @@ -2837,7 +2841,10 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time) } // attach objects that were waiting for a drawable - lazyAttach(); + if (!mPendingAttachment.empty()) + { + lazyAttach(); + } // animate the character // store off last frame's root position to be consistent with camera position @@ -3007,7 +3014,7 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update) LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR; if (LLVOAvatar::sJointDebug) { - LL_INFOS() << getFullname() << ": joint touches: " << LLJoint::sNumTouches << " updates: " << LLJoint::sNumUpdates << LL_ENDL; + LL_INFOS() << getDebugName() << ": joint touches: " << LLJoint::sNumTouches << " updates: " << LLJoint::sNumUpdates << LL_ENDL; } LLJoint::sNumUpdates = 0; @@ -3227,17 +3234,17 @@ F32 LLVOAvatar::calcMorphAmount() const void LLVOAvatar::idleUpdateLipSync(bool voice_enabled) { // Use the Lipsync_Ooh and Lipsync_Aah morphs for lip sync - if ( voice_enabled + if (voice_enabled && mLastRezzedStatus > 0 // no point updating lip-sync for clouds && LLVoiceVisualizer::getLipSyncEnabled() - && LLVoiceClient::getInstance()->getIsSpeaking( mID ) ) + && LLVoiceClient::getInstance()->getIsSpeaking(mID)) { F32 ooh_morph_amount = 0.0f; F32 aah_morph_amount = 0.0f; mVoiceVisualizer->lipSyncOohAah( ooh_morph_amount, aah_morph_amount ); - if( mOohMorph ) + if (mOohMorph) { F32 ooh_weight = mOohMorph->getMinWeight() + ooh_morph_amount * (mOohMorph->getMaxWeight() - mOohMorph->getMinWeight()); @@ -3245,7 +3252,7 @@ void LLVOAvatar::idleUpdateLipSync(bool voice_enabled) mOohMorph->setWeight( ooh_weight); } - if( mAahMorph ) + if (mAahMorph) { F32 aah_weight = mAahMorph->getMinWeight() + aah_morph_amount * (mAahMorph->getMaxWeight() - mAahMorph->getMinWeight()); @@ -3269,6 +3276,7 @@ void LLVOAvatar::idleUpdateLoadingEffect() if (mFirstFullyVisible) { mFirstFullyVisible = false; + mLastCloudAttachmentCount = (S32)mSimAttachments.size(); mFirstDecloudTime = mFirstAppearanceMessageTimer.getElapsedTimeF32(); if (isSelf()) { @@ -3324,7 +3332,7 @@ void LLVOAvatar::idleUpdateLoadingEffect() void LLVOAvatar::idleUpdateWindEffect() { // update wind effect - if ((LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH)) + if (LLPipeline::RenderAvatarCloth) { F32 hover_strength = 0.f; F32 time_delta = mRippleTimer.getElapsedTimeF32() - mRippleTimeLast; @@ -3513,7 +3521,7 @@ void LLVOAvatar::idleUpdateNameTagText(bool new_name) is_muted = isInMuteList(); } bool is_friend = isBuddy(); - bool is_cloud = getIsCloud(); + bool is_cloud = getHasMissingParts(); if (is_appearance != mNameAppearance) { @@ -4331,8 +4339,8 @@ void LLVOAvatar::computeUpdatePeriod() { const LLVector4a* ext = mDrawable->getSpatialExtents(); LLVector4a size; - size.setSub(ext[1],ext[0]); - F32 mag = size.getLength3().getF32()*0.5f; + size.setSub(ext[1], ext[0]); + F32 mag = size.getLength3().getF32() * 0.5f; const S32 UPDATE_RATE_SLOW = 64; const S32 UPDATE_RATE_MED = 48; @@ -4342,14 +4350,14 @@ void LLVOAvatar::computeUpdatePeriod() { // visually muted avatars update at lowest rate mUpdatePeriod = UPDATE_RATE_SLOW; } - else if (! shouldImpostor() - || mDrawable->mDistanceWRTCamera < 1.f + mag) + else if (!shouldImpostor() + || mDrawable->mDistanceWRTCamera < 1.f + mag) { // first 25% of max visible avatars are not impostored // also, don't impostor avatars whose bounding box may be penetrating the // impostor camera near clip plane mUpdatePeriod = 1; } - else if ( shouldImpostor(4.0) ) + else if (shouldImpostor(4.0)) { //background avatars are REALLY slow updating impostors mUpdatePeriod = UPDATE_RATE_SLOW; } @@ -4358,7 +4366,7 @@ void LLVOAvatar::computeUpdatePeriod() // Don't update cloud avatars too often mUpdatePeriod = UPDATE_RATE_SLOW; } - else if ( shouldImpostor(3.0) ) + else if (shouldImpostor(3.0)) { //back 25% of max visible avatars are slow updating impostors mUpdatePeriod = UPDATE_RATE_MED; } @@ -4446,10 +4454,10 @@ void LLVOAvatar::updateOrientation(LLAgent& agent, F32 speed, F32 delta_time) LLVector3 pelvisDir( mRoot->getWorldMatrix().getFwdRow4().mV ); - const F32 AVATAR_PELVIS_ROTATE_THRESHOLD_SLOW = 60.0f; - const F32 AVATAR_PELVIS_ROTATE_THRESHOLD_FAST = 2.0f; + static LLCachedControl<F32> s_pelvis_rot_threshold_slow(gSavedSettings, "AvatarRotateThresholdSlow", 60.0); + static LLCachedControl<F32> s_pelvis_rot_threshold_fast(gSavedSettings, "AvatarRotateThresholdFast", 2.0); - F32 pelvis_rot_threshold = clamp_rescale(speed, 0.1f, 1.0f, AVATAR_PELVIS_ROTATE_THRESHOLD_SLOW, AVATAR_PELVIS_ROTATE_THRESHOLD_FAST); + F32 pelvis_rot_threshold = clamp_rescale(speed, 0.1f, 1.0f, s_pelvis_rot_threshold_slow, s_pelvis_rot_threshold_fast); if (self_in_mouselook) { @@ -4789,14 +4797,6 @@ bool LLVOAvatar::updateCharacter(LLAgent &agent) } bool visible = isVisible(); - bool is_control_avatar = isControlAvatar(); // capture state to simplify tracing - bool is_attachment = false; - - if (is_control_avatar) - { - LLControlAvatar *cav = dynamic_cast<LLControlAvatar*>(this); - is_attachment = cav && cav->mRootVolp && cav->mRootVolp->isAttachment(); // For attached animated objects - } // For fading out the names above heads, only let the timer // run if we're visible. @@ -5470,7 +5470,7 @@ U32 LLVOAvatar::renderImpostor(LLColor4U color, S32 diffuse_channel) gGL.begin(LLRender::LINES); gGL.color4f(1.f,1.f,1.f,1.f); F32 thickness = llmax(F32(5.0f-5.0f*(gFrameTimeSeconds-mLastImpostorUpdateFrameTime)),1.0f); - glLineWidth(thickness); + //glLineWidth(thickness); gGL.vertex3fv((pos+left-up).mV); gGL.vertex3fv((pos-left-up).mV); gGL.vertex3fv((pos-left-up).mV); @@ -6207,8 +6207,11 @@ void LLVOAvatar::resetAnimations() flushAllMotions(); } -// Override selectively based on avatar sex and whether we're using new -// animations. +//----------------------------------------------------------------------------- +// remapMotionID() +// Override selectively based on avatar sex and whether we're using new animations. +//----------------------------------------------------------------------------- +// virtual LLUUID LLVOAvatar::remapMotionID(const LLUUID& id) { static LLCachedControl<bool> use_new_walk_run(gSavedSettings, "UseNewWalkRun"); @@ -6258,7 +6261,6 @@ LLUUID LLVOAvatar::remapMotionID(const LLUUID& id) } return result; - } //----------------------------------------------------------------------------- @@ -6266,6 +6268,7 @@ LLUUID LLVOAvatar::remapMotionID(const LLUUID& id) // id is the asset if of the animation to start // time_offset is the offset into the animation at which to start playing //----------------------------------------------------------------------------- +// virtual bool LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset) { LL_DEBUGS("Motion") << "motion requested " << id.asString() << " " << gAnimLibrary.animationName(id) << LL_ENDL; @@ -6288,6 +6291,7 @@ bool LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset) //----------------------------------------------------------------------------- // stopMotion() //----------------------------------------------------------------------------- +// virtual bool LLVOAvatar::stopMotion(const LLUUID& id, bool stop_immediate) { LL_DEBUGS("Motion") << "Motion requested " << id.asString() << " " << gAnimLibrary.animationName(id) << LL_ENDL; @@ -6327,6 +6331,7 @@ void LLVOAvatar::stopMotionFromSource(const LLUUID& source_id) //----------------------------------------------------------------------------- // addDebugText() //----------------------------------------------------------------------------- +// virtual void LLVOAvatar::addDebugText(const std::string& text) { mDebugText.append(1, '\n'); @@ -6334,8 +6339,22 @@ void LLVOAvatar::addDebugText(const std::string& text) } //----------------------------------------------------------------------------- +// getDebugName() +//----------------------------------------------------------------------------- +// virtual +std::string LLVOAvatar::getDebugName() const +{ +#if LL_RELEASE_WITH_DEBUG_INFO + return getFullname(); +#else + return getID().asString(); +#endif // LL_RELEASE_WITH_DEBUG_INFO +} + +//----------------------------------------------------------------------------- // getID() //----------------------------------------------------------------------------- +// virtual const LLUUID& LLVOAvatar::getID() const { return mID; @@ -6345,13 +6364,14 @@ const LLUUID& LLVOAvatar::getID() const // getJoint() //----------------------------------------------------------------------------- // RN: avatar joints are multi-rooted to include screen-based attachments -LLJoint *LLVOAvatar::getJoint( const std::string &name ) +// virtual +LLJoint* LLVOAvatar::getJoint(std::string_view name) { joint_map_t::iterator iter = mJointMap.find(name); - LLJoint* jointp = NULL; + LLJoint* jointp = nullptr; - if (iter == mJointMap.end() || iter->second == NULL) + if (iter == mJointMap.end() || iter->second == nullptr) { //search for joint and cache found joint in lookup table if (mJointAliasMap.empty()) { @@ -6368,7 +6388,7 @@ LLJoint *LLVOAvatar::getJoint( const std::string &name ) canonical_name = name; } jointp = mRoot->findJoint(canonical_name); - mJointMap[name] = jointp; + mJointMap[std::string(name)] = jointp; } else { //return cached pointer @@ -6414,6 +6434,16 @@ LLJoint *LLVOAvatar::getJoint( S32 joint_num ) return pJoint; } +void LLVOAvatar::initAllJoints() +{ + getJointAliases(); + for (auto& alias : mJointAliasMap) + { + mJointMap[alias.first] = mRoot->findJoint(alias.second); + } + // ignore mScreen and mRoot +} + //----------------------------------------------------------------------------- // getRiggedMeshID // @@ -6460,6 +6490,7 @@ bool LLVOAvatar::jointIsRiggedTo(const LLJoint *joint) const void LLVOAvatar::clearAttachmentOverrides() { + for (S32 i=0; i<LL_CHARACTER_MAX_ANIMATED_JOINTS; i++) { LLJoint *pJoint = getJoint(i); @@ -6490,6 +6521,7 @@ void LLVOAvatar::clearAttachmentOverrides() //----------------------------------------------------------------------------- void LLVOAvatar::rebuildAttachmentOverrides() { + LL_DEBUGS("AnimatedObjects") << "rebuilding" << LL_ENDL; clearAttachmentOverrides(); @@ -6538,6 +6570,7 @@ void LLVOAvatar::rebuildAttachmentOverrides() // ----------------------------------------------------------------------------- void LLVOAvatar::updateAttachmentOverrides() { + LL_DEBUGS("AnimatedObjects") << "updating" << LL_ENDL; std::set<LLUUID> meshes_seen; @@ -6613,11 +6646,11 @@ void LLVOAvatar::updateAttachmentOverrides() } } pelvis_fixups = mPelvisFixups; - //dumpArchetypeXML(getFullname() + "_paranoid_updated"); + //dumpArchetypeXML(getDebugName() + "_paranoid_updated"); // Rebuild and compare rebuildAttachmentOverrides(); - //dumpArchetypeXML(getFullname() + "_paranoid_rebuilt"); + //dumpArchetypeXML(getDebugName() + "_paranoid_rebuilt"); bool mismatched = false; for (S32 joint_num = 0; joint_num < LL_CHARACTER_MAX_ANIMATED_JOINTS; joint_num++) { @@ -6846,22 +6879,22 @@ void LLVOAvatar::showAttachmentOverrides(bool verbose) const { std::stringstream ss; std::copy(pos_names.begin(), pos_names.end(), std::ostream_iterator<std::string>(ss, ",")); - LL_INFOS() << getFullname() << " attachment positions defined for joints: " << ss.str() << "\n" << LL_ENDL; + LL_INFOS() << avString() << " attachment positions defined for joints: " << ss.str() << "\n" << LL_ENDL; } else { - LL_DEBUGS("Avatar") << getFullname() << " no attachment positions defined for any joints" << "\n" << LL_ENDL; + LL_DEBUGS("Avatar") << avString() << " no attachment positions defined for any joints" << "\n" << LL_ENDL; } if (scale_names.size()) { std::stringstream ss; std::copy(scale_names.begin(), scale_names.end(), std::ostream_iterator<std::string>(ss, ",")); - LL_INFOS() << getFullname() << " attachment scales defined for joints: " << ss.str() << "\n" << LL_ENDL; + LL_INFOS() << getDebugName() << " attachment scales defined for joints: " << ss.str() << "\n" << LL_ENDL; } else { - LL_INFOS() << getFullname() << " no attachment scales defined for any joints" << "\n" << LL_ENDL; + LL_INFOS() << getDebugName() << " no attachment scales defined for any joints" << "\n" << LL_ENDL; } if (!verbose) @@ -7753,6 +7786,64 @@ void LLVOAvatar::cleanupAttachedMesh( LLViewerObject* pVO ) } } +bool check_object_for_mesh_loading(LLViewerObject* objectp) +{ + if (!objectp || !objectp->getVolume()) + { + return false; + } + LLVolume* volp = objectp->getVolume(); + const LLUUID& mesh_id = volp->getParams().getSculptID(); + if (mesh_id.isNull()) + { + // No mesh nor skin info needed + return false; + } + + if (volp->isMeshAssetUnavaliable()) + { + // Mesh failed to load, do not expect it + return false; + } + + if (!objectp->mDrawable) + { + return false; + } + + LLVOVolume* pvobj = objectp->mDrawable->getVOVolume(); + if (pvobj) + { + if (!pvobj->isMesh()) + { + // Not a mesh + return false; + } + + if (!volp->isMeshAssetLoaded()) + { + // Waiting for mesh + return true; + } + + const LLMeshSkinInfo* skin_data = pvobj->getSkinInfo(); + if (skin_data) + { + // Skin info present, done + return false; + } + + if (pvobj->isSkinInfoUnavaliable()) + { + // Load failed or info not present, don't expect it + return false; + } + } + + // object is not ready + return true; +} + bool LLVOAvatar::hasPendingAttachedMeshes() { for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); @@ -7767,62 +7858,20 @@ bool LLVOAvatar::hasPendingAttachedMeshes() ++attachment_iter) { LLViewerObject* objectp = attachment_iter->get(); - if (objectp) + if (objectp && !objectp->isDead()) { + if (check_object_for_mesh_loading(objectp)) + { + return true; + } LLViewerObject::const_child_list_t& child_list = objectp->getChildren(); for (LLViewerObject::child_list_t::const_iterator iter1 = child_list.begin(); iter1 != child_list.end(); ++iter1) { LLViewerObject* objectchild = *iter1; - if (objectchild && objectchild->getVolume()) + if (check_object_for_mesh_loading(objectchild)) { - const LLUUID& mesh_id = objectchild->getVolume()->getParams().getSculptID(); - if (mesh_id.isNull()) - { - // No mesh nor skin info needed - continue; - } - - if (objectchild->getVolume()->isMeshAssetUnavaliable()) - { - // Mesh failed to load, do not expect it - continue; - } - - if (objectchild->mDrawable) - { - LLVOVolume* pvobj = objectchild->mDrawable->getVOVolume(); - if (pvobj) - { - if (!pvobj->isMesh()) - { - // Not a mesh - continue; - } - - if (!objectchild->getVolume()->isMeshAssetLoaded()) - { - // Waiting for mesh - return true; - } - - const LLMeshSkinInfo* skin_data = pvobj->getSkinInfo(); - if (skin_data) - { - // Skin info present, done - continue; - } - - if (pvobj->isSkinInfoUnavaliable()) - { - // Load failed or info not present, don't expect it - continue; - } - } - - // objectchild is not ready - return true; - } + return true; } } } @@ -8214,7 +8263,7 @@ bool LLVOAvatar::isVisible() const } // Determine if we have enough avatar data to render -bool LLVOAvatar::getIsCloud() const +bool LLVOAvatar::getHasMissingParts() const { if (mIsDummy) { @@ -8232,7 +8281,7 @@ bool LLVOAvatar::getIsCloud() const void LLVOAvatar::updateRezzedStatusTimers(S32 rez_status) { // State machine for rezzed status. Statuses are -1 on startup, 0 - // = cloud, 1 = gray, 2 = downloading, 3 = waiting for attachments, 4 = full. + // Statuses are -1 on startup, 0 = cloud, 1 = gray, 2 = downloading, 3 = waiting for attachments, 4 = full. // Purpose is to collect time data for each it takes avatar to reach // various loading landmarks: gray, textured (partial), textured fully. @@ -8252,7 +8301,7 @@ void LLVOAvatar::updateRezzedStatusTimers(S32 rez_status) if (rez_status < mLastRezzedStatus) { // load level has decreased. start phase timers for higher load levels. - for (S32 i = rez_status+1; i <= mLastRezzedStatus; i++) + for (S32 i = rez_status + 1; i <= mLastRezzedStatus; i++) { startPhase("load_" + LLVOAvatar::rezStatusToString(i)); } @@ -8260,7 +8309,7 @@ void LLVOAvatar::updateRezzedStatusTimers(S32 rez_status) else if (rez_status > mLastRezzedStatus) { // load level has increased. stop phase timers for lower and equal load levels. - for (S32 i = llmax(mLastRezzedStatus+1,1); i <= rez_status; i++) + for (S32 i = llmax(mLastRezzedStatus + 1, 1); i <= rez_status; i++) { stopPhase("load_" + LLVOAvatar::rezStatusToString(i)); stopPhase("first_load_" + LLVOAvatar::rezStatusToString(i), false); @@ -8421,11 +8470,15 @@ bool LLVOAvatar::updateIsFullyLoaded() || (mLoadedCallbackTextures < mCallbackTextureList.size() && mLastTexCallbackAddedTime.getElapsedTimeF32() < MAX_TEXTURE_WAIT_TIME_SEC) || !mPendingAttachment.empty() || (rez_status < 3 && !isFullyBaked()) - || hasPendingAttachedMeshes() ); + if (!loading) + { + mWaitingForMeshes = hasPendingAttachedMeshes(); + loading = mWaitingForMeshes; + } // compare amount of attachments to one reported by simulator - if (!loading && !isSelf() && rez_status < 4 && mLastCloudAttachmentCount < mSimAttachments.size()) + if (!isSelf() && mLastCloudAttachmentCount < mSimAttachments.size() && mSimAttachments.size() > 0) { S32 attachment_count = getAttachmentCount(); if (mLastCloudAttachmentCount != attachment_count) @@ -8443,6 +8496,11 @@ bool LLVOAvatar::updateIsFullyLoaded() // waiting loading = true; } + else if (!loading) + { + // for hasFirstFullAttachmentData + mLastCloudAttachmentCount = (S32)mSimAttachments.size(); + } } } updateRezzedStatusTimers(rez_status); @@ -8496,19 +8554,19 @@ bool LLVOAvatar::processFullyLoadedChange(bool loading) F32 first_use_delay = FIRST_APPEARANCE_CLOUD_MIN_DELAY; if (!isSelf() && loading) { - // Note that textures can causes 60s delay on thier own - // so this delay might end up on top of textures' delay - first_use_delay = llclamp( - mFirstAppearanceMessageTimer.getElapsedTimeF32(), - FIRST_APPEARANCE_CLOUD_MIN_DELAY, - FIRST_APPEARANCE_CLOUD_MAX_DELAY); + // Note that textures can causes 60s delay on thier own + // so this delay might end up on top of textures' delay + first_use_delay = llclamp( + mFirstAppearanceMessageTimer.getElapsedTimeF32(), + FIRST_APPEARANCE_CLOUD_MIN_DELAY, + FIRST_APPEARANCE_CLOUD_MAX_DELAY); - if (shouldImpostor()) - { - // Impostors are less of a priority, - // let them stay cloud longer - first_use_delay *= FIRST_APPEARANCE_CLOUD_IMPOSTOR_MODIFIER; - } + if (shouldImpostor()) + { + // Impostors are less of a priority, + // let them stay cloud longer + first_use_delay *= FIRST_APPEARANCE_CLOUD_IMPOSTOR_MODIFIER; + } } mFullyLoaded = (mFullyLoadedTimer.getElapsedTimeF32() > first_use_delay); } @@ -8525,12 +8583,12 @@ bool LLVOAvatar::processFullyLoadedChange(bool loading) // did our loading state "change" from last call? // FIXME runway - why are we updating every 30 calls even if nothing has changed? // This causes updateLOD() to run every 30 frames, among other things. + bool fully_loaded_changed = (mFullyLoaded != mPreviousFullyLoaded); const S32 UPDATE_RATE = 30; bool changed = ((mFullyLoaded != mPreviousFullyLoaded) || // if the value is different from the previous call - (!mFullyLoadedInitialized) || // if we've never been called before - (mFullyLoadedFrameCounter % UPDATE_RATE == 0)); // every now and then issue a change - bool fully_loaded_changed = (mFullyLoaded != mPreviousFullyLoaded); + (!mFullyLoadedInitialized) || // if we've never been called before + (mFullyLoadedFrameCounter % UPDATE_RATE == 0)); // every now and then issue a change mPreviousFullyLoaded = mFullyLoaded; mFullyLoadedInitialized = true; @@ -8548,6 +8606,7 @@ bool LLVOAvatar::processFullyLoadedChange(bool loading) mNeedsImpostorUpdate = true; mLastImpostorUpdateReason = 6; } + return changed; } @@ -8556,6 +8615,12 @@ bool LLVOAvatar::isFullyLoaded() const return (mRenderUnloadedAvatar || mFullyLoaded); } +bool LLVOAvatar::hasFirstFullAttachmentData() const +{ + return !mFirstFullyVisible // Avatar is fully visible, have all data + || mLastCloudAttachmentCount >= (S32)mSimAttachments.size(); +} + bool LLVOAvatar::isTooComplex() const { bool too_complex; @@ -8897,6 +8962,7 @@ void LLVOAvatar::updateMeshTextures() bool is_ltda = layerset && layerset->getViewerComposite()->isInitialized() && layerset->isLocalTextureDataAvailable(); +#ifndef __aarch64__ mBakedTextureDebugText += llformat("%4d %4s %4d %4d %4d %4d %4s\n", i, (layerset?"*":"0"), @@ -8905,6 +8971,7 @@ void LLVOAvatar::updateMeshTextures() is_layer_baked[i], use_lkg_baked_layer[i], last_id_string.c_str()); +#endif } for (U32 i=0; i < mBakedTextureDatas.size(); i++) @@ -9436,12 +9503,12 @@ void dump_visual_param(apr_file_t* file, LLVisualParam* viewer_param, F32 value) void LLVOAvatar::dumpAppearanceMsgParams( const std::string& dump_prefix, const LLAppearanceMessageContents& contents) { - std::string outfilename = get_sequential_numbered_file_name(dump_prefix,".xml"); + std::string outfilename = get_sequential_numbered_file_name(dump_prefix, ".xml"); const std::vector<F32>& params_for_dump = contents.mParamWeights; const LLTEContents& tec = contents.mTEContents; LLAPRFile outfile; - std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,outfilename); + std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, outfilename); outfile.open(fullpath, LL_APR_WB ); apr_file_t* file = outfile.getFileHandle(); if (!file) @@ -9654,7 +9721,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) static LLCachedControl<bool> enable_verbose_dumps(gSavedSettings, "DebugAvatarAppearanceMessage"); static LLCachedControl<bool> block_avatar_appearance_messages(gSavedSettings, "BlockAvatarAppearanceMessages"); - std::string dump_prefix = getFullname() + "_" + (isSelf()?"s":"o") + "_"; + std::string dump_prefix = getDebugName() + (isSelf() ? "_s_" : "_o_"); if (block_avatar_appearance_messages) { LL_WARNS() << "Blocking AvatarAppearance message" << LL_ENDL; @@ -10288,17 +10355,13 @@ void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_weara std::string outprefix(prefix); if (outprefix.empty()) { - outprefix = getFullname() + (isSelf()?"_s":"_o"); - } - if (outprefix.empty()) - { - outprefix = std::string("new_archetype"); + outprefix = getDebugName() + (isSelf() ? "_s" : "_o"); } - std::string outfilename = get_sequential_numbered_file_name(outprefix,".xml"); + std::string outfilename = get_sequential_numbered_file_name(outprefix, ".xml"); LLAPRFile outfile; LLWearableType *wr_inst = LLWearableType::getInstance(); - std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,outfilename); + std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, outfilename); if (APR_SUCCESS == outfile.open(fullpath, LL_APR_WB )) { apr_file_t* file = outfile.getFileHandle(); @@ -10784,7 +10847,7 @@ void LLVOAvatar::updateRiggingInfo() { LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR; - LL_DEBUGS("RigSpammish") << getFullname() << " updating rig tab" << LL_ENDL; + LL_DEBUGS("RigSpammish") << getDebugName() << " updating rig tab" << LL_ENDL; // use a local static for scratch space to avoid reallocation here static std::vector<LLVOVolume*> volumes; @@ -10975,8 +11038,7 @@ void LLVOAvatar::idleUpdateRenderComplexity() bool autotune = LLPerfStats::tunables.userAutoTuneEnabled && !mIsControlAvatar && !isSelf(); if (autotune && !isDead()) { - static LLCachedControl<F32> render_far_clip(gSavedSettings, "RenderFarClip", 64); - F32 radius = render_far_clip * render_far_clip; + F32 radius = sRenderDistance * sRenderDistance; bool is_nearby = true; if ((dist_vec_squared(getPositionGlobal(), gAgent.getPositionGlobal()) > radius) && @@ -11008,8 +11070,7 @@ void LLVOAvatar::updateNearbyAvatarCount() if (agent_update_timer.getElapsedTimeF32() > 1.0f) { S32 avs_nearby = 0; - static LLCachedControl<F32> render_far_clip(gSavedSettings, "RenderFarClip", 64); - F32 radius = render_far_clip * render_far_clip; + F32 radius = sRenderDistance * sRenderDistance; for (LLCharacter* character : LLCharacter::sInstances) { LLVOAvatar* avatar = (LLVOAvatar*)character; @@ -11781,16 +11842,24 @@ void LLVOAvatar::readProfileQuery(S32 retries) } else - { // wait until next frame - LLUUID id = getID(); + { + // wait until next frame + const LLUUID id = getID(); - LL::WorkQueue::getInstance("mainloop")->post([id, retries] { - LLVOAvatar* avatar = (LLVOAvatar*) gObjectList.findObject(id); - if(avatar) + LL::WorkQueue::getInstance("mainloop")->post([id, retries] + { + LLViewerObject* object = gObjectList.findObject(id); + if (object + && !object->isDead() + && object->isAvatar()) // probably excessive, pcode isn't supposed to change { - avatar->readProfileQuery(retries); + LLVOAvatar* avatar = (LLVOAvatar*)object; + if (avatar) + { + avatar->readProfileQuery(retries); + } } - }); + }); } } diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index dd1725c322..1e563c4869 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -202,8 +202,9 @@ public: void startDefaultMotions(); void dumpAnimationState(); - virtual LLJoint* getJoint(const std::string &name); + virtual LLJoint* getJoint(std::string_view name); LLJoint* getJoint(S32 num); + void initAllJoints(); //if you KNOW joint_num is a valid animated joint index, use getSkeletonJoint for efficiency inline LLJoint* getSkeletonJoint(S32 joint_num) { return mSkeleton[joint_num]; } @@ -232,6 +233,7 @@ public: virtual void onActiveOverrideMeshesChanged(); /*virtual*/ const LLUUID& getID() const; + /*virtual*/ std::string getDebugName() const; /*virtual*/ void addDebugText(const std::string& text); /*virtual*/ F32 getTimeDilation(); /*virtual*/ void getGround(const LLVector3 &inPos, LLVector3 &outPos, LLVector3 &outNorm); @@ -329,16 +331,16 @@ public: // avatar render cost - U32 getVisualComplexity() { return mVisualComplexity; }; + U32 getVisualComplexity() { return mVisualComplexity; }; // surface area calculation - F32 getAttachmentSurfaceArea() { return mAttachmentSurfaceArea; }; + F32 getAttachmentSurfaceArea() { return mAttachmentSurfaceArea; }; - U32 getReportedVisualComplexity() { return mReportedVisualComplexity; }; // Numbers as reported by the SL server - void setReportedVisualComplexity(U32 value) { mReportedVisualComplexity = value; }; + U32 getReportedVisualComplexity() { return mReportedVisualComplexity; }; // Numbers as reported by the SL server + void setReportedVisualComplexity(U32 value) { mReportedVisualComplexity = value; }; - S32 getUpdatePeriod() { return mUpdatePeriod; }; - const LLColor4 & getMutedAVColor() { return mMutedAVColor; }; + S32 getUpdatePeriod() { return mUpdatePeriod; }; + const LLColor4 & getMutedAVColor() { return mMutedAVColor; }; static void updateImpostorRendering(U32 newMaxNonImpostorsValue); void idleUpdateBelowWater(); @@ -385,6 +387,7 @@ public: //-------------------------------------------------------------------- public: bool isFullyLoaded() const; + bool hasFirstFullAttachmentData() const; F32 getFirstDecloudTime() const {return mFirstDecloudTime;} // check and return current state relative to limits @@ -398,15 +401,14 @@ public: bool isTooComplex() const; bool visualParamWeightsAreDefault(); - virtual bool getIsCloud() const; + virtual bool getHasMissingParts() const; bool isFullyTextured() const; bool hasGray() const; - S32 getRezzedStatus() const; // 0 = cloud, 1 = gray, 2 = textured, 3 = textured and fully downloaded. + S32 getRezzedStatus() const; // 0 = cloud, 1 = gray, 2 = textured, 3 = waiting for attachments, 4 = full. void updateRezzedStatusTimers(S32 status); S32 mLastRezzedStatus; - void startPhase(const std::string& phase_name); void stopPhase(const std::string& phase_name, bool err_check = true); void clearPhases(); @@ -425,6 +427,7 @@ protected: private: bool mFirstFullyVisible; + bool mWaitingForMeshes; F32 mFirstDecloudTime; LLFrameTimer mFirstAppearanceMessageTimer; @@ -546,7 +549,7 @@ public: U32 renderTransparent(bool first_pass); void renderCollisionVolumes(); void renderBones(const std::string &selected_joint = std::string()); - void renderJoints(); + virtual void renderJoints(); static void deleteCachedImages(bool clearAll=true); static void destroyGL(); static void restoreGL(); @@ -721,7 +724,7 @@ public: bool isFullyBaked(); static bool areAllNearbyInstancesBaked(S32& grey_avatars); - static void getNearbyRezzedStats(std::vector<S32>& counts, F32& avg_cloud_time, S32& cloud_avatars); + static void getNearbyRezzedStats(std::vector<S32>& counts, F32& avg_cloud_time, S32& cloud_avatars, S32& pending_meshes, S32& control_avatars); static std::string rezStatusToString(S32 status); //-------------------------------------------------------------------- @@ -740,7 +743,7 @@ protected: LLViewerTexLayerSet* getTexLayerSet(const U32 index) const { return dynamic_cast<LLViewerTexLayerSet*>(mBakedTextureDatas[index].mTexLayerSet); } - LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ; + LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList; bool mLoadedCallbacksPaused; S32 mLoadedCallbackTextures; // count of 'loaded' baked textures, filled from mCallbackTextureList LLFrameTimer mLastTexCallbackAddedTime; diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 746ef7cacb..e5c14a34a5 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -225,6 +225,8 @@ void LLVOAvatarSelf::initInstance() doPeriodically(update_avatar_rez_metrics, 5.0); doPeriodically(boost::bind(&LLVOAvatarSelf::checkStuckAppearance, this), 30.0); + initAllJoints(); // mesh thread uses LLVOAvatarSelf as a joint source + mInitFlags |= 1<<2; } @@ -695,16 +697,17 @@ void LLVOAvatarSelf::idleUpdate(LLAgent &agent, const F64 &time) } // virtual -LLJoint *LLVOAvatarSelf::getJoint(const std::string &name) +LLJoint* LLVOAvatarSelf::getJoint(std::string_view name) { - LLJoint *jointp = NULL; + std::lock_guard lock(mJointMapMutex); + LLJoint* jointp = nullptr; jointp = LLVOAvatar::getJoint(name); if (!jointp && mScreenp) { jointp = mScreenp->findJoint(name); if (jointp) { - mJointMap[name] = jointp; + mJointMap[std::string(name)] = jointp; } } if (jointp && jointp != mScreenp && jointp != mRoot) @@ -714,6 +717,14 @@ LLJoint *LLVOAvatarSelf::getJoint(const std::string &name) return jointp; } + +//virtual +void LLVOAvatarSelf::renderJoints() +{ + std::lock_guard lock(mJointMapMutex); + LLVOAvatar::renderJoints(); +} + // virtual bool LLVOAvatarSelf::setVisualParamWeight(const LLVisualParam *which_param, F32 weight) { @@ -1916,7 +1927,7 @@ void LLVOAvatarSelf::dumpTotalLocalTextureByteCount() LL_INFOS() << "Total Avatar LocTex GL:" << (gl_bytes/1024) << "KB" << LL_ENDL; } -bool LLVOAvatarSelf::getIsCloud() const +bool LLVOAvatarSelf::getHasMissingParts() const { // Let people know why they're clouded without spamming them into oblivion. bool do_warn = false; @@ -2200,9 +2211,9 @@ void LLVOAvatarSelf::appearanceChangeMetricsCoro(std::string url) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("appearanceChangeMetrics", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("appearanceChangeMetrics", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); S32 currentSequence = mMetricSequence; if (S32_MAX == ++mMetricSequence) @@ -2226,14 +2237,18 @@ void LLVOAvatarSelf::appearanceChangeMetricsCoro(std::string url) std::vector<S32> rez_counts; F32 avg_time; S32 total_cloud_avatars; - LLVOAvatar::getNearbyRezzedStats(rez_counts, avg_time, total_cloud_avatars); + S32 waiting_for_meshes; + S32 control_avatars; + LLVOAvatar::getNearbyRezzedStats(rez_counts, avg_time, total_cloud_avatars, waiting_for_meshes, control_avatars); for (S32 rez_stat = 0; rez_stat < rez_counts.size(); ++rez_stat) { std::string rez_status_name = LLVOAvatar::rezStatusToString(rez_stat); msg["nearby"][rez_status_name] = rez_counts[rez_stat]; } + msg["nearby"]["waiting_for_meshes"] = waiting_for_meshes; msg["nearby"]["avg_decloud_time"] = avg_time; msg["nearby"]["cloud_total"] = total_cloud_avatars; + msg["nearby"]["animeshes"] = control_avatars; // std::vector<std::string> bucket_fields("timer_name","is_self","grid_x","grid_y","is_using_server_bake"); std::vector<std::string> by_fields; @@ -2720,7 +2735,7 @@ void LLVOAvatarSelf::onCustomizeEnd(bool disable_camera_switch) // Dereferencing the previous callback will cause // updateAppearanceFromCOF to be called, whenever all refs // have resolved. - gAgentAvatarp->mEndCustomizeCallback = NULL; + gAgentAvatarp->mEndCustomizeCallback = nullptr; } } @@ -2815,6 +2830,12 @@ void LLVOAvatarSelf::setHoverOffset(const LLVector3& hover_offset, bool send_upd //------------------------------------------------------------------------ bool LLVOAvatarSelf::needsRenderBeam() { + static LLCachedControl<bool> enable_selection_hints(gSavedSettings, "EnableSelectionHints", true); + if (!enable_selection_hints) + { + return false; + } + LLTool *tool = LLToolMgr::getInstance()->getCurrentTool(); bool is_touching_or_grabbing = (tool == LLToolGrab::getInstance() && LLToolGrab::getInstance()->isEditing()); diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 051ac791c0..45985b2a80 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -90,7 +90,9 @@ public: /*virtual*/ bool hasMotionFromSource(const LLUUID& source_id); /*virtual*/ void stopMotionFromSource(const LLUUID& source_id); /*virtual*/ void requestStopMotion(LLMotion* motion); - /*virtual*/ LLJoint* getJoint(const std::string &name); + /*virtual*/ LLJoint* getJoint(std::string_view name); + + /*virtual*/ void renderJoints(); /*virtual*/ bool setVisualParamWeight(const LLVisualParam *which_param, F32 weight); /*virtual*/ bool setVisualParamWeight(const char* param_name, F32 weight); @@ -103,6 +105,8 @@ private: // helper function. Passed in param is assumed to be in avatar's parameter list. bool setParamWeight(const LLViewerVisualParam *param, F32 weight); + std::mutex mJointMapMutex; // getJoint gets used from mesh thread + /******************************************************************************** ** ** ** STATE @@ -125,7 +129,7 @@ public: // Loading state //-------------------------------------------------------------------- public: - /*virtual*/ bool getIsCloud() const; + /*virtual*/ bool getHasMissingParts() const; //-------------------------------------------------------------------- // Region state diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index 27c105c8d6..5d456b1a19 100644 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -486,14 +486,21 @@ void LLVOCacheEntry::updateDebugSettings() //min radius: all objects within this radius remain loaded in memory static LLCachedControl<F32> min_radius(gSavedSettings,"SceneLoadMinRadius"); static const F32 MIN_RADIUS = 1.0f; - const F32 draw_radius = gAgentCamera.mDrawDistance; + + F32 draw_radius = gAgentCamera.mDrawDistance; + if (LLViewerTexture::isSystemMemoryCritical()) + { + // Factor is intended to go from 1.0 to 2.0 + // For safety cap reduction at 50%, we don't want to go below half of draw distance + draw_radius = llmax(draw_radius / LLViewerTexture::getSystemMemoryBudgetFactor(), draw_radius / 2.f); + } const F32 clamped_min_radius = llclamp((F32) min_radius, MIN_RADIUS, draw_radius); // [1, mDrawDistance] sNearRadius = MIN_RADIUS + ((clamped_min_radius - MIN_RADIUS) * adjust_factor); // a percentage of draw distance beyond which all objects outside of view frustum will be unloaded, regardless of pixel threshold - static LLCachedControl<F32> rear_max_radius_frac(gSavedSettings,"SceneLoadRearMaxRadiusFraction"); + static LLCachedControl<F32> rear_max_radius_frac(gSavedSettings,"SceneLoadRearMaxRadiusFraction", .75f); const F32 min_radius_plus_one = sNearRadius + 1.f; - const F32 max_radius = rear_max_radius_frac * gAgentCamera.mDrawDistance; + const F32 max_radius = rear_max_radius_frac * draw_radius; const F32 clamped_max_radius = llclamp(max_radius, min_radius_plus_one, draw_radius); // [sNearRadius, mDrawDistance] sRearFarRadius = min_radius_plus_one + ((clamped_max_radius - min_radius_plus_one) * adjust_factor); @@ -1875,11 +1882,11 @@ void LLVOCache::removeGenericExtrasForHandle(U64 handle) } // NOTE: when removing the extras, we must also remove the objects so the simulator will send us a full upddate with the valid overrides - auto* entry = mHandleEntryMap[handle]; - if (entry) + handle_entry_map_t::iterator iter = mHandleEntryMap.find(handle); + if (iter != mHandleEntryMap.end()) { - LL_WARNS("GLTF", "VOCache") << "Removing generic extras for handle " << entry->mHandle << "Filename: " << getObjectCacheExtrasFilename(handle) << LL_ENDL; - removeEntry(entry); + LL_WARNS("GLTF", "VOCache") << "Removing generic extras for handle " << handle << "Filename: " << getObjectCacheExtrasFilename(handle) << LL_ENDL; + removeEntry(iter->second); } else { diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp index fdd39a0e30..86d08b8658 100644 --- a/indra/newview/llvograss.cpp +++ b/indra/newview/llvograss.cpp @@ -736,7 +736,7 @@ void LLGrassPartition::getGeometry(LLSpatialGroup* group) void LLVOGrass::updateDrawable(bool force_damped) { // Force an immediate rebuild on any update - if (mDrawable.notNull()) + if (mDrawable.notNull() && mDrawable->getVObj()) { mDrawable->updateXform(true); gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL); diff --git a/indra/newview/llvoicecallhandler.cpp b/indra/newview/llvoicecallhandler.cpp index 25b0e69436..d2c947fef2 100644 --- a/indra/newview/llvoicecallhandler.cpp +++ b/indra/newview/llvoicecallhandler.cpp @@ -38,6 +38,11 @@ public: { } + virtual bool canHandleUntrusted(const LLSD ¶ms, const LLSD &query_map, LLMediaCtrl *web, const std::string &nav_type) + { + return (nav_type == NAV_TYPE_CLICKED || nav_type == NAV_TYPE_EXTERNAL); + } + bool handle(const LLSD& params, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web) { //Make sure we have some parameters diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index cf128f381a..b941d356a1 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -357,6 +357,8 @@ void LLVoiceChannel::suspend() { sSuspendedVoiceChannel = sCurrentVoiceChannel; sSuspended = true; + + sCurrentVoiceChannelChangedSignal(sSuspendedVoiceChannel->mSessionID); } } @@ -365,10 +367,17 @@ void LLVoiceChannel::resume() { if (sSuspended) { + sSuspended = false; // needs to be before activate() so that observers will be able to read state if (LLVoiceClient::getInstance()->voiceEnabled()) { if (sSuspendedVoiceChannel) { + if (sSuspendedVoiceChannel->callStarted()) + { + // should have channel data already, restart + sSuspendedVoiceChannel->setState(STATE_READY); + } + // won't do anything if call is already started sSuspendedVoiceChannel->activate(); } else @@ -376,7 +385,6 @@ void LLVoiceChannel::resume() LLVoiceChannelProximal::getInstance()->activate(); } } - sSuspended = false; } } @@ -602,8 +610,8 @@ void LLVoiceChannelGroup::voiceCallCapCoro(std::string url) { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("voiceCallCapCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("voiceCallCapCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD postData; postData["method"] = "call"; diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h index 4d7bf551e1..18e1d60987 100644 --- a/indra/newview/llvoicechannel.h +++ b/indra/newview/llvoicechannel.h @@ -57,7 +57,7 @@ public: typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state, const EDirection& direction, bool ended_by_agent, const LLUUID& session_id)> state_changed_signal_t; // on current channel changed signal - typedef boost::function<void(const LLUUID& session_id)> channel_changed_callback_t; + typedef std::function<void(const LLUUID& session_id)> channel_changed_callback_t; typedef boost::signals2::signal<void(const LLUUID& session_id)> channel_changed_signal_t; static channel_changed_signal_t sCurrentVoiceChannelChangedSignal; static boost::signals2::connection setCurrentVoiceChannelChangedCallback(channel_changed_callback_t cb, bool at_front = false); @@ -103,6 +103,7 @@ public: static void suspend(); static void resume(); + static bool isSuspended() { return sSuspended; } protected: virtual void setState(EState state); diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index e5eb2f8008..59e8db7752 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -26,7 +26,7 @@ #include "llvoiceclient.h" #include "llvoicevivox.h" -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 #include "llvoicewebrtc.h" #endif #include "llviewernetwork.h" @@ -122,7 +122,7 @@ LLVoiceModuleInterface *getVoiceModule(const std::string &voice_server_type) { return (LLVoiceModuleInterface *) LLVivoxVoiceClient::getInstance(); } -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 else if (voice_server_type == WEBRTC_VOICE_SERVER_TYPE) { return (LLVoiceModuleInterface *) LLWebRTCVoiceClient::getInstance(); @@ -169,7 +169,7 @@ void LLVoiceClient::init(LLPumpIO *pump) { // Initialize all of the voice modules m_servicePump = pump; -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 LLWebRTCVoiceClient::getInstance()->init(pump); #endif LLVivoxVoiceClient::getInstance()->init(pump); @@ -182,7 +182,7 @@ void LLVoiceClient::userAuthorized(const std::string& user_id, const LLUUID &age mRegionChangedCallbackSlot.disconnect(); } mRegionChangedCallbackSlot = gAgent.addRegionChangedCallback(boost::bind(&LLVoiceClient::onRegionChanged, this)); -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 LLWebRTCVoiceClient::getInstance()->userAuthorized(user_id, agentID); #endif LLVivoxVoiceClient::getInstance()->userAuthorized(user_id, agentID); @@ -294,7 +294,7 @@ void LLVoiceClient::setNonSpatialVoiceModule(const std::string &voice_server_typ void LLVoiceClient::setHidden(bool hidden) { LL_INFOS("Voice") << "( " << (hidden ? "true" : "false") << " )" << LL_ENDL; -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 LLWebRTCVoiceClient::getInstance()->setHidden(hidden); #endif LLVivoxVoiceClient::getInstance()->setHidden(hidden); @@ -302,7 +302,16 @@ void LLVoiceClient::setHidden(bool hidden) void LLVoiceClient::terminate() { - if (mSpatialVoiceModule) mSpatialVoiceModule->terminate(); +#if !__FreeBSD__ && !_M_ARM64 + if (LLVivoxVoiceClient::instanceExists()) + { + LLWebRTCVoiceClient::getInstance()->terminate(); + } +#endif + if (LLVivoxVoiceClient::instanceExists()) + { + LLVivoxVoiceClient::getInstance()->terminate(); + } mSpatialVoiceModule = NULL; m_servicePump = NULL; @@ -337,7 +346,7 @@ void LLVoiceClient::updateSettings() updateMicMuteLogic(); -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 LLWebRTCVoiceClient::getInstance()->updateSettings(); #endif LLVivoxVoiceClient::getInstance()->updateSettings(); @@ -348,7 +357,7 @@ void LLVoiceClient::updateSettings() void LLVoiceClient::tuningStart() { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 LLWebRTCVoiceClient::getInstance()->tuningStart(); #endif LLVivoxVoiceClient::getInstance()->tuningStart(); @@ -356,7 +365,7 @@ void LLVoiceClient::tuningStart() void LLVoiceClient::tuningStop() { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 LLWebRTCVoiceClient::getInstance()->tuningStop(); #endif LLVivoxVoiceClient::getInstance()->tuningStop(); @@ -364,7 +373,7 @@ void LLVoiceClient::tuningStop() bool LLVoiceClient::inTuningMode() { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 return LLWebRTCVoiceClient::getInstance()->inTuningMode(); #else return LLVivoxVoiceClient::getInstance()->inTuningMode(); @@ -373,7 +382,7 @@ bool LLVoiceClient::inTuningMode() void LLVoiceClient::tuningSetMicVolume(float volume) { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 LLWebRTCVoiceClient::getInstance()->tuningSetMicVolume(volume); #else LLVivoxVoiceClient::getInstance()->tuningSetMicVolume(volume); @@ -382,7 +391,7 @@ void LLVoiceClient::tuningSetMicVolume(float volume) void LLVoiceClient::tuningSetSpeakerVolume(float volume) { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 LLWebRTCVoiceClient::getInstance()->tuningSetSpeakerVolume(volume); #else LLVivoxVoiceClient::getInstance()->tuningSetSpeakerVolume(volume); @@ -391,7 +400,7 @@ void LLVoiceClient::tuningSetSpeakerVolume(float volume) float LLVoiceClient::tuningGetEnergy(void) { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 return LLWebRTCVoiceClient::getInstance()->tuningGetEnergy(); #else return LLVivoxVoiceClient::getInstance()->tuningGetEnergy(); @@ -403,7 +412,7 @@ float LLVoiceClient::tuningGetEnergy(void) bool LLVoiceClient::deviceSettingsAvailable() { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 return LLWebRTCVoiceClient::getInstance()->deviceSettingsAvailable(); #else return LLVivoxVoiceClient::getInstance()->deviceSettingsAvailable(); @@ -412,7 +421,7 @@ bool LLVoiceClient::deviceSettingsAvailable() bool LLVoiceClient::deviceSettingsUpdated() { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 return LLWebRTCVoiceClient::getInstance()->deviceSettingsUpdated(); #else return LLVivoxVoiceClient::getInstance()->deviceSettingsUpdated(); @@ -421,7 +430,7 @@ bool LLVoiceClient::deviceSettingsUpdated() void LLVoiceClient::refreshDeviceLists(bool clearCurrentList) { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 LLWebRTCVoiceClient::getInstance()->refreshDeviceLists(clearCurrentList); #else LLVivoxVoiceClient::getInstance()->refreshDeviceLists(clearCurrentList); @@ -431,7 +440,7 @@ void LLVoiceClient::refreshDeviceLists(bool clearCurrentList) void LLVoiceClient::setCaptureDevice(const std::string& name) { LLVivoxVoiceClient::getInstance()->setCaptureDevice(name); -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 LLWebRTCVoiceClient::getInstance()->setCaptureDevice(name); #endif } @@ -439,14 +448,14 @@ void LLVoiceClient::setCaptureDevice(const std::string& name) void LLVoiceClient::setRenderDevice(const std::string& name) { LLVivoxVoiceClient::getInstance()->setRenderDevice(name); -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 LLWebRTCVoiceClient::getInstance()->setRenderDevice(name); #endif } const LLVoiceDeviceList& LLVoiceClient::getCaptureDevices() { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 return LLWebRTCVoiceClient::getInstance()->getCaptureDevices(); #else return LLVivoxVoiceClient::getInstance()->getCaptureDevices(); @@ -456,7 +465,7 @@ const LLVoiceDeviceList& LLVoiceClient::getCaptureDevices() const LLVoiceDeviceList& LLVoiceClient::getRenderDevices() { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 return LLWebRTCVoiceClient::getInstance()->getRenderDevices(); #else return LLVivoxVoiceClient::getInstance()->getRenderDevices(); @@ -469,7 +478,7 @@ const LLVoiceDeviceList& LLVoiceClient::getRenderDevices() void LLVoiceClient::getParticipantList(std::set<LLUUID> &participants) const { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 LLWebRTCVoiceClient::getInstance()->getParticipantList(participants); #endif LLVivoxVoiceClient::getInstance()->getParticipantList(participants); @@ -477,7 +486,7 @@ void LLVoiceClient::getParticipantList(std::set<LLUUID> &participants) const bool LLVoiceClient::isParticipant(const LLUUID &speaker_id) const { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 return LLWebRTCVoiceClient::getInstance()->isParticipant(speaker_id) || #else return @@ -574,7 +583,7 @@ void LLVoiceClient::activateSpatialChannel(bool activate) bool LLVoiceClient::isCurrentChannel(const LLSD& channelInfo) { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 return LLWebRTCVoiceClient::getInstance()->isCurrentChannel(channelInfo) || #else return @@ -584,7 +593,7 @@ bool LLVoiceClient::isCurrentChannel(const LLSD& channelInfo) bool LLVoiceClient::compareChannels(const LLSD &channelInfo1, const LLSD &channelInfo2) { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 return LLWebRTCVoiceClient::getInstance()->compareChannels(channelInfo1, channelInfo2) || #else return @@ -630,7 +639,7 @@ LLVoiceP2POutgoingCallInterface *LLVoiceClient::getOutgoingCallInterface(const L void LLVoiceClient::setVoiceVolume(F32 volume) { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 LLWebRTCVoiceClient::getInstance()->setVoiceVolume(volume); #endif LLVivoxVoiceClient::getInstance()->setVoiceVolume(volume); @@ -638,7 +647,7 @@ void LLVoiceClient::setVoiceVolume(F32 volume) void LLVoiceClient::setMicGain(F32 gain) { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 LLWebRTCVoiceClient::getInstance()->setMicGain(gain); #endif LLVivoxVoiceClient::getInstance()->setMicGain(gain); @@ -687,7 +696,7 @@ bool LLVoiceClient::voiceEnabled() void LLVoiceClient::setVoiceEnabled(bool enabled) { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 if (LLWebRTCVoiceClient::instanceExists()) { LLWebRTCVoiceClient::getInstance()->setVoiceEnabled(enabled); @@ -715,7 +724,7 @@ void LLVoiceClient::updateMicMuteLogic() // Either of these always overrides any other PTT setting. new_mic_mute = true; } -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 LLWebRTCVoiceClient::getInstance()->setMuteMic(new_mic_mute); #endif LLVivoxVoiceClient::getInstance()->setMuteMic(new_mic_mute); @@ -812,7 +821,7 @@ bool LLVoiceClient::getVoiceEnabled(const LLUUID& id) const std::string LLVoiceClient::getDisplayName(const LLUUID& id) const { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 std::string result = LLWebRTCVoiceClient::getInstance()->getDisplayName(id); if (result.empty()) { @@ -826,7 +835,7 @@ std::string LLVoiceClient::getDisplayName(const LLUUID& id) const bool LLVoiceClient::isVoiceWorking() const { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 return LLVivoxVoiceClient::getInstance()->isVoiceWorking() || LLWebRTCVoiceClient::getInstance()->isVoiceWorking(); #else @@ -846,7 +855,7 @@ bool LLVoiceClient::isOnlineSIP(const LLUUID& id) bool LLVoiceClient::getIsSpeaking(const LLUUID& id) { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 return LLWebRTCVoiceClient::getInstance()->getIsSpeaking(id) || #else return @@ -858,7 +867,7 @@ bool LLVoiceClient::getIsModeratorMuted(const LLUUID& id) { // don't bother worrying about p2p calls, as // p2p calls don't have mute. -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 return LLWebRTCVoiceClient::getInstance()->getIsModeratorMuted(id) || #else return @@ -868,7 +877,7 @@ bool LLVoiceClient::getIsModeratorMuted(const LLUUID& id) F32 LLVoiceClient::getCurrentPower(const LLUUID& id) { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 return std::fmax(LLVivoxVoiceClient::getInstance()->getCurrentPower(id), LLWebRTCVoiceClient::getInstance()->getCurrentPower(id)); #else @@ -885,7 +894,7 @@ bool LLVoiceClient::getOnMuteList(const LLUUID& id) F32 LLVoiceClient::getUserVolume(const LLUUID& id) { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 return std::fmax(LLVivoxVoiceClient::getInstance()->getUserVolume(id), LLWebRTCVoiceClient::getInstance()->getUserVolume(id)); #else return LLVivoxVoiceClient::getInstance()->getUserVolume(id); @@ -894,7 +903,7 @@ F32 LLVoiceClient::getUserVolume(const LLUUID& id) void LLVoiceClient::setUserVolume(const LLUUID& id, F32 volume) { -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 LLWebRTCVoiceClient::getInstance()->setUserVolume(id, volume); #endif LLVivoxVoiceClient::getInstance()->setUserVolume(id, volume); @@ -906,7 +915,7 @@ void LLVoiceClient::setUserVolume(const LLUUID& id, F32 volume) void LLVoiceClient::addObserver(LLVoiceClientStatusObserver* observer) { LLVivoxVoiceClient::getInstance()->addObserver(observer); -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 LLWebRTCVoiceClient::getInstance()->addObserver(observer); #endif } @@ -917,7 +926,7 @@ void LLVoiceClient::removeObserver(LLVoiceClientStatusObserver* observer) { LLVivoxVoiceClient::getInstance()->removeObserver(observer); } -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 if (LLWebRTCVoiceClient::instanceExists()) { LLWebRTCVoiceClient::getInstance()->removeObserver(observer); @@ -928,7 +937,7 @@ void LLVoiceClient::removeObserver(LLVoiceClientStatusObserver* observer) void LLVoiceClient::addObserver(LLFriendObserver* observer) { LLVivoxVoiceClient::getInstance()->addObserver(observer); -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 LLWebRTCVoiceClient::getInstance()->addObserver(observer); #endif } @@ -939,7 +948,7 @@ void LLVoiceClient::removeObserver(LLFriendObserver* observer) { LLVivoxVoiceClient::getInstance()->removeObserver(observer); } -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 if (LLWebRTCVoiceClient::instanceExists()) { LLWebRTCVoiceClient::getInstance()->removeObserver(observer); @@ -950,7 +959,7 @@ void LLVoiceClient::removeObserver(LLFriendObserver* observer) void LLVoiceClient::addObserver(LLVoiceClientParticipantObserver* observer) { LLVivoxVoiceClient::getInstance()->addObserver(observer); -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 LLWebRTCVoiceClient::getInstance()->addObserver(observer); #endif } @@ -961,7 +970,7 @@ void LLVoiceClient::removeObserver(LLVoiceClientParticipantObserver* observer) { LLVivoxVoiceClient::getInstance()->removeObserver(observer); } -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 if (LLWebRTCVoiceClient::instanceExists()) { LLWebRTCVoiceClient::getInstance()->removeObserver(observer); @@ -1029,7 +1038,7 @@ class LLViewerRequiredVoiceVersion : public LLHTTPNode { voiceModule = (LLVoiceModuleInterface *) LLVivoxVoiceClient::getInstance(); } -#if !__FreeBSD__ +#if !__FreeBSD__ && !_M_ARM64 else if (voice_server_type == "webrtc") { voiceModule = (LLVoiceModuleInterface *) LLWebRTCVoiceClient::getInstance(); diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 7faef8cc41..e08bc2dfc4 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -36,7 +36,7 @@ #include "llbufferstream.h" #include "llfile.h" #include "llmenugl.h" -#ifdef LL_USESYSTEMLIBS +#if 1 # include "expat.h" #else # include "expat/expat.h" @@ -1023,7 +1023,6 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon() std::string old_log = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SLVoice.old"); if (gDirUtilp->fileExists(new_log)) { - LLFile::remove(old_log, ENOENT); LLFile::rename(new_log, old_log); } @@ -1174,9 +1173,9 @@ bool LLVivoxVoiceClient::provisionVoiceAccount() LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("voiceAccountProvision", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("voiceAccountProvision", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); int retryCount(0); LLSD result; @@ -1586,8 +1585,8 @@ bool LLVivoxVoiceClient::requestParcelVoiceInfo() LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("parcelVoiceInfoRequest", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("parcelVoiceInfoRequest", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD result = httpAdapter->postAndSuspend(httpRequest, url, LLSD()); @@ -4630,7 +4629,7 @@ LLVivoxVoiceClient::participantStatePtr_t LLVivoxVoiceClient::sessionState::addP if(!result) { // participant isn't already in one list or the other. - result.reset(new participantState(useAlternateURI?mSIPURI:uri)); + result = std::make_shared<participantState>(useAlternateURI?mSIPURI:uri); mParticipantsByURI.insert(participantMap::value_type(result->mURI, result)); mParticipantsChanged = true; diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h index 3e0a237905..ca1258e05e 100644 --- a/indra/newview/llvoicevivox.h +++ b/indra/newview/llvoicevivox.h @@ -43,7 +43,7 @@ class LLVivoxProtocolParser; #include "llmutelist.h" #include <queue> -#ifdef LL_USESYSTEMLIBS +#if 1 # include "expat.h" #else # include "expat/expat.h" diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp index 93c217a7ba..06ccd23670 100644 --- a/indra/newview/llvoicewebrtc.cpp +++ b/indra/newview/llvoicewebrtc.cpp @@ -34,7 +34,7 @@ #include "llbufferstream.h" #include "llfile.h" #include "llmenugl.h" -#ifdef LL_USESYSTEMLIBS +#if 1 # include "expat.h" #else # include "expat/expat.h" @@ -52,6 +52,7 @@ #include "llcachename.h" #include "llimview.h" // for LLIMMgr #include "llworld.h" +#include "llviewerregion.h" #include "llparcel.h" #include "llviewerparcelmgr.h" #include "llfirstuse.h" @@ -81,9 +82,15 @@ const std::string WEBRTC_VOICE_SERVER_TYPE = "webrtc"; namespace { - const F32 MAX_AUDIO_DIST = 50.0f; - const F32 VOLUME_SCALE_WEBRTC = 0.01f; - const F32 LEVEL_SCALE_WEBRTC = 0.008f; + const F32 MAX_AUDIO_DIST = 50.0f; + const F32 VOLUME_SCALE_WEBRTC = 0.01f; + const F32 TUNING_LEVEL_SCALE = 0.01f; + const F32 TUNING_LEVEL_START_POINT = 0.8f; + const F32 LEVEL_SCALE = 0.005f; + const F32 LEVEL_START_POINT = 0.18f; + const uint32_t SET_HIDDEN_RESTORE_DELAY_MS = 200; // 200 ms to unmute again after hiding during teleport + const uint32_t MUTE_FADE_DELAY_MS = 500; // 20ms fade followed by 480ms silence gets rid of the click just after unmuting. + // This is because the buffers and processing is cleared by the silence. const F32 SPEAKING_AUDIO_LEVEL = 0.30; @@ -200,7 +207,6 @@ bool LLWebRTCVoiceClient::sShuttingDown = false; LLWebRTCVoiceClient::LLWebRTCVoiceClient() : mHidden(false), - mTuningMode(false), mTuningMicGain(0.0), mTuningSpeakerVolume(50), // Set to 50 so the user can hear themselves when he sets his mic volume mDevicesListUpdated(false), @@ -267,6 +273,11 @@ void LLWebRTCVoiceClient::cleanupSingleton() void LLWebRTCVoiceClient::init(LLPumpIO* pump) { // constructor will set up LLVoiceClient::getInstance() + initWebRTC(); +} + +void LLWebRTCVoiceClient::initWebRTC() +{ llwebrtc::init(this); mWebRTCDeviceInterface = llwebrtc::getDeviceInterface(); @@ -282,10 +293,13 @@ void LLWebRTCVoiceClient::terminate() return; } + LL_INFOS("Voice") << "Terminating WebRTC" << LL_ENDL; + mVoiceEnabled = false; + sShuttingDown = true; // so that coroutines won't post more work. llwebrtc::terminate(); - sShuttingDown = true; + mWebRTCDeviceInterface = nullptr; } //--------------------------------------------------- @@ -336,35 +350,57 @@ void LLWebRTCVoiceClient::updateSettings() LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE; setVoiceEnabled(LLVoiceClient::getInstance()->voiceEnabled()); - static LLCachedControl<S32> sVoiceEarLocation(gSavedSettings, "VoiceEarLocation"); - setEarLocation(sVoiceEarLocation); - - static LLCachedControl<std::string> sInputDevice(gSavedSettings, "VoiceInputAudioDevice"); - setCaptureDevice(sInputDevice); + if (mVoiceEnabled) + { + static LLCachedControl<S32> sVoiceEarLocation(gSavedSettings, "VoiceEarLocation"); + setEarLocation(sVoiceEarLocation); - static LLCachedControl<std::string> sOutputDevice(gSavedSettings, "VoiceOutputAudioDevice"); - setRenderDevice(sOutputDevice); + static LLCachedControl<std::string> sInputDevice(gSavedSettings, "VoiceInputAudioDevice"); + setCaptureDevice(sInputDevice); - LL_INFOS("Voice") << "Input device: " << std::quoted(sInputDevice()) << ", output device: " << std::quoted(sOutputDevice()) << LL_ENDL; + static LLCachedControl<std::string> sOutputDevice(gSavedSettings, "VoiceOutputAudioDevice"); + setRenderDevice(sOutputDevice); - static LLCachedControl<F32> sMicLevel(gSavedSettings, "AudioLevelMic"); - setMicGain(sMicLevel); + LL_INFOS("Voice") << "Input device: " << std::quoted(sInputDevice()) << ", output device: " << std::quoted(sOutputDevice()) + << LL_ENDL; - llwebrtc::LLWebRTCDeviceInterface::AudioConfig config; + static LLCachedControl<F32> sMicLevel(gSavedSettings, "AudioLevelMic"); + setMicGain(sMicLevel); - static LLCachedControl<bool> sEchoCancellation(gSavedSettings, "VoiceEchoCancellation", true); - config.mEchoCancellation = sEchoCancellation; + llwebrtc::LLWebRTCDeviceInterface::AudioConfig config; - static LLCachedControl<bool> sAGC(gSavedSettings, "VoiceAutomaticGainControl", true); - config.mAGC = sAGC; + bool audioConfigChanged = false; - static LLCachedControl<U32> sNoiseSuppressionLevel(gSavedSettings, - "VoiceNoiseSuppressionLevel", - llwebrtc::LLWebRTCDeviceInterface::AudioConfig::ENoiseSuppressionLevel::NOISE_SUPPRESSION_LEVEL_VERY_HIGH); - config.mNoiseSuppressionLevel = (llwebrtc::LLWebRTCDeviceInterface::AudioConfig::ENoiseSuppressionLevel) (U32)sNoiseSuppressionLevel; + static LLCachedControl<bool> sEchoCancellation(gSavedSettings, "VoiceEchoCancellation", true); + if (sEchoCancellation != config.mEchoCancellation) + { + config.mEchoCancellation = sEchoCancellation; + audioConfigChanged = true; + } - mWebRTCDeviceInterface->setAudioConfig(config); + static LLCachedControl<bool> sAGC(gSavedSettings, "VoiceAutomaticGainControl", true); + if (sAGC != config.mAGC) + { + config.mAGC = sAGC; + audioConfigChanged = true; + } + static LLCachedControl<U32> sNoiseSuppressionLevel( + gSavedSettings, + "VoiceNoiseSuppressionLevel", + llwebrtc::LLWebRTCDeviceInterface::AudioConfig::ENoiseSuppressionLevel::NOISE_SUPPRESSION_LEVEL_VERY_HIGH); + auto noiseSuppressionLevel = + (llwebrtc::LLWebRTCDeviceInterface::AudioConfig::ENoiseSuppressionLevel)(U32)sNoiseSuppressionLevel; + if (noiseSuppressionLevel != config.mNoiseSuppressionLevel) + { + config.mNoiseSuppressionLevel = noiseSuppressionLevel; + audioConfigChanged = true; + } + if (audioConfigChanged && mWebRTCDeviceInterface) + { + mWebRTCDeviceInterface->setAudioConfig(config); + } + } } // Observers @@ -661,7 +697,11 @@ LLVoiceDeviceList& LLWebRTCVoiceClient::getCaptureDevices() void LLWebRTCVoiceClient::setCaptureDevice(const std::string& name) { - mWebRTCDeviceInterface->setCaptureDevice(name); + if (mWebRTCDeviceInterface) + { + LL_DEBUGS("Voice") << "new capture device is " << name << LL_ENDL; + mWebRTCDeviceInterface->setCaptureDevice(name); + } } void LLWebRTCVoiceClient::setDevicesListUpdated(bool state) { @@ -688,25 +728,45 @@ void LLWebRTCVoiceClient::OnDevicesChangedImpl(const llwebrtc::LLWebRTCVoiceDevi return; } LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE; + + LL_DEBUGS("Voice") << "Reiniting " << LL_ENDL; + std::string inputDevice = gSavedSettings.getString("VoiceInputAudioDevice"); std::string outputDevice = gSavedSettings.getString("VoiceOutputAudioDevice"); LL_DEBUGS("Voice") << "Setting devices to-input: '" << inputDevice << "' output: '" << outputDevice << "'" << LL_ENDL; - clearRenderDevices(); - for (auto &device : render_devices) + + // only set the render device if the device list has changed. + if (mRenderDevices.size() != render_devices.size() || !std::equal(mRenderDevices.begin(), + mRenderDevices.end(), + render_devices.begin(), + [](const LLVoiceDevice& a, const llwebrtc::LLWebRTCVoiceDevice& b) { + return a.display_name == b.mDisplayName && a.full_name == b.mID; })) { - addRenderDevice(LLVoiceDevice(device.mDisplayName, device.mID)); + clearRenderDevices(); + for (auto& device : render_devices) + { + addRenderDevice(LLVoiceDevice(device.mDisplayName, device.mID)); + } + setRenderDevice(outputDevice); } - setRenderDevice(outputDevice); - clearCaptureDevices(); - for (auto &device : capture_devices) + // only set the capture device if the device list has changed. + if (mCaptureDevices.size() != capture_devices.size() ||!std::equal(mCaptureDevices.begin(), + mCaptureDevices.end(), + capture_devices.begin(), + [](const LLVoiceDevice& a, const llwebrtc::LLWebRTCVoiceDevice& b) + { return a.display_name == b.mDisplayName && a.full_name == b.mID; })) { - LL_DEBUGS("Voice") << "Checking capture device:'" << device.mID << "'" << LL_ENDL; + clearCaptureDevices(); + for (auto& device : capture_devices) + { + LL_DEBUGS("Voice") << "Checking capture device:'" << device.mID << "'" << LL_ENDL; - addCaptureDevice(LLVoiceDevice(device.mDisplayName, device.mID)); + addCaptureDevice(LLVoiceDevice(device.mDisplayName, device.mID)); + } + setCaptureDevice(inputDevice); } - setCaptureDevice(inputDevice); setDevicesListUpdated(true); } @@ -731,14 +791,21 @@ LLVoiceDeviceList& LLWebRTCVoiceClient::getRenderDevices() void LLWebRTCVoiceClient::setRenderDevice(const std::string& name) { - mWebRTCDeviceInterface->setRenderDevice(name); + if (mWebRTCDeviceInterface) + { + LL_DEBUGS("Voice") << "new render device is " << name << LL_ENDL; + mWebRTCDeviceInterface->setRenderDevice(name); + } } void LLWebRTCVoiceClient::tuningStart() { if (!mIsInTuningMode) { - mWebRTCDeviceInterface->setTuningMode(true); + if (mWebRTCDeviceInterface) + { + mWebRTCDeviceInterface->setTuningMode(true); + } mIsInTuningMode = true; } } @@ -747,7 +814,10 @@ void LLWebRTCVoiceClient::tuningStop() { if (mIsInTuningMode) { - mWebRTCDeviceInterface->setTuningMode(false); + if (mWebRTCDeviceInterface) + { + mWebRTCDeviceInterface->setTuningMode(false); + } mIsInTuningMode = false; } } @@ -759,7 +829,14 @@ bool LLWebRTCVoiceClient::inTuningMode() void LLWebRTCVoiceClient::tuningSetMicVolume(float volume) { - mTuningMicGain = volume; + if (volume != mTuningMicGain) + { + mTuningMicGain = volume; + if (mWebRTCDeviceInterface) + { + mWebRTCDeviceInterface->setTuningMicGain(volume); + } + } } void LLWebRTCVoiceClient::tuningSetSpeakerVolume(float volume) @@ -771,21 +848,14 @@ void LLWebRTCVoiceClient::tuningSetSpeakerVolume(float volume) } } -float LLWebRTCVoiceClient::getAudioLevel() +float LLWebRTCVoiceClient::tuningGetEnergy(void) { - if (mIsInTuningMode) + if (!mWebRTCDeviceInterface) { - return (1.0f - mWebRTCDeviceInterface->getTuningAudioLevel() * LEVEL_SCALE_WEBRTC) * mTuningMicGain / 2.1f; - } - else - { - return (1.0f - mWebRTCDeviceInterface->getPeerConnectionAudioLevel() * LEVEL_SCALE_WEBRTC) * mMicGain / 2.1f; + return 0.f; } -} - -float LLWebRTCVoiceClient::tuningGetEnergy(void) -{ - return getAudioLevel(); + float rms = mWebRTCDeviceInterface->getTuningAudioLevel(); + return TUNING_LEVEL_START_POINT - TUNING_LEVEL_SCALE * rms; } bool LLWebRTCVoiceClient::deviceSettingsAvailable() @@ -811,7 +881,10 @@ void LLWebRTCVoiceClient::refreshDeviceLists(bool clearCurrentList) clearCaptureDevices(); clearRenderDevices(); } - mWebRTCDeviceInterface->refreshDevices(); + if (mWebRTCDeviceInterface) + { + mWebRTCDeviceInterface->refreshDevices(); + } } @@ -821,6 +894,11 @@ void LLWebRTCVoiceClient::setHidden(bool hidden) if (inSpatialChannel()) { + if (mWebRTCDeviceInterface) + { + mWebRTCDeviceInterface->setMute(mHidden || mMuteMic, + mHidden ? 0 : SET_HIDDEN_RESTORE_DELAY_MS); // delay 200ms so as to not pile up mutes/unmutes. + } if (mHidden) { // get out of the channel entirely @@ -985,7 +1063,9 @@ void LLWebRTCVoiceClient::updatePosition(void) LLWebRTCVoiceClient::participantStatePtr_t participant = findParticipantByID("Estate", gAgentID); if(participant) { - participant->mRegion = gAgent.getRegion()->getRegionID(); + if (participant->mRegion != region->getRegionID()) { + participant->mRegion = region->getRegionID(); + } } } } @@ -1109,13 +1189,14 @@ void LLWebRTCVoiceClient::sendPositionUpdate(bool force) // Update our own volume on our participant, so it'll show up // in the UI. This is done on all sessions, so switching // sessions retains consistent volume levels. -void LLWebRTCVoiceClient::updateOwnVolume() { - F32 audio_level = 0.0; - if (!mMuteMic && !mTuningMode) +void LLWebRTCVoiceClient::updateOwnVolume() +{ + F32 audio_level = 0.0f; + if (!mMuteMic && mWebRTCDeviceInterface) { - audio_level = getAudioLevel(); + float rms = mWebRTCDeviceInterface->getPeerConnectionAudioLevel(); + audio_level = LEVEL_START_POINT - LEVEL_SCALE * rms; } - sessionState::for_each(boost::bind(predUpdateOwnVolume, _1, audio_level)); } @@ -1228,7 +1309,7 @@ LLWebRTCVoiceClient::participantStatePtr_t LLWebRTCVoiceClient::sessionState::ad if (!result) { // participant isn't already in one list or the other. - result.reset(new participantState(agent_id, region)); + result = std::make_shared<participantState>(agent_id, region); mParticipantsByUUID.insert(participantUUIDMap::value_type(agent_id, result)); result->mAvatarID = agent_id; } @@ -1512,6 +1593,17 @@ void LLWebRTCVoiceClient::setMuteMic(bool muted) } mMuteMic = muted; + + if (mIsInTuningMode) + { + return; + } + + if (mWebRTCDeviceInterface) + { + mWebRTCDeviceInterface->setMute(muted, muted ? MUTE_FADE_DELAY_MS : 0); // delay for 40ms on mute to allow buffers to empty + } + // when you're hidden, your mic is always muted. if (!mHidden) { @@ -1550,7 +1642,10 @@ void LLWebRTCVoiceClient::setMicGain(F32 gain) if (gain != mMicGain) { mMicGain = gain; - mWebRTCDeviceInterface->setPeerConnectionGain(gain); + if (mWebRTCDeviceInterface) + { + mWebRTCDeviceInterface->setMicGain(gain); + } } } @@ -1734,6 +1829,15 @@ void LLWebRTCVoiceClient::onChangeDetailed(const LLMute& mute) } } +void LLWebRTCVoiceClient::userAuthorized(const std::string& user_id, const LLUUID& agentID) +{ + if (sShuttingDown) + { + sShuttingDown = false; // was terminated, restart + initWebRTC(); + } +} + void LLWebRTCVoiceClient::predSetUserMute(const LLWebRTCVoiceClient::sessionStatePtr_t &session, const LLUUID &id, bool mute) { session->setUserMute(id, mute); @@ -1999,6 +2103,33 @@ bool LLWebRTCVoiceClient::sessionState::processConnectionStates() return !mWebRTCConnections.empty(); } +// Helper function to check if a region supports WebRTC voice +bool LLWebRTCVoiceClient::estateSessionState::isRegionWebRTCEnabled(const LLUUID& regionID) +{ + LLViewerRegion* region = LLWorld::getInstance()->getRegionFromID(regionID); + if (!region) + { + LL_WARNS("Voice") << "Could not find region " << regionID + << " for voice server type validation" << LL_ENDL; + return false; + } + + LLSD simulatorFeatures; + region->getSimulatorFeatures(simulatorFeatures); + + bool isWebRTCEnabled = simulatorFeatures.has("VoiceServerType") && + simulatorFeatures["VoiceServerType"].asString() == "webrtc"; + + if (!isWebRTCEnabled) + { + LL_DEBUGS("Voice") << "Region " << regionID << " VoiceServerType is not 'webrtc' (got: " + << (simulatorFeatures.has("VoiceServerType") ? simulatorFeatures["VoiceServerType"].asString() : "none") << ")" + << LL_ENDL; + } + + return isWebRTCEnabled; +} + // processing of spatial voice connection states requires special handling. // as neighboring regions need to be started up or shut down depending // on our location. @@ -2023,6 +2154,13 @@ bool LLWebRTCVoiceClient::estateSessionState::processConnectionStates() // shut down connections to neighbors that are too far away. spatialConnection.get()->shutDown(); } + else if (!isRegionWebRTCEnabled(regionID)) + { + // shut down connections to neighbors that no longer support WebRTC voice. + LL_DEBUGS("Voice") << "Shutting down connection to neighbor region " << regionID + << " - no longer supports WebRTC voice" << LL_ENDL; + spatialConnection.get()->shutDown(); + } if (!spatialConnection.get()->isShuttingDown()) { neighbor_ids.erase(regionID); @@ -2032,11 +2170,20 @@ bool LLWebRTCVoiceClient::estateSessionState::processConnectionStates() // add new connections for new neighbors for (auto &neighbor : neighbor_ids) { - connectionPtr_t connection(new LLVoiceWebRTCSpatialConnection(neighbor, INVALID_PARCEL_ID, mChannelID)); + // Only connect if the region supports WebRTC voice server type + if (isRegionWebRTCEnabled(neighbor)) + { + connectionPtr_t connection = std::make_shared<LLVoiceWebRTCSpatialConnection>(neighbor, INVALID_PARCEL_ID, mChannelID); - mWebRTCConnections.push_back(connection); - connection->setMuteMic(mMuted); - connection->setSpeakerVolume(mSpeakerVolume); + mWebRTCConnections.push_back(connection); + connection->setMuteMic(mMuted); // mute will be set for primary connection when that connection comes up + connection->setSpeakerVolume(mSpeakerVolume); + } + else + { + LL_DEBUGS("Voice") << "Skipping neighbor region " << neighbor + << " - does not support WebRTC voice" << LL_ENDL; + } } } return LLWebRTCVoiceClient::sessionState::processConnectionStates(); @@ -2259,7 +2406,6 @@ void LLVoiceWebRTCConnection::processIceUpdatesCoro(connectionPtr_t connection) return; } - bool iceCompleted = false; LLSD body; if (!connection->mIceCandidates.empty() || connection->mIceCompleted) { @@ -2298,18 +2444,17 @@ void LLVoiceWebRTCConnection::processIceUpdatesCoro(connectionPtr_t connection) LLSD body_candidate; body_candidate["completed"] = true; body["candidate"] = body_candidate; - iceCompleted = connection->mIceCompleted; connection->mIceCompleted = false; } body["viewer_session"] = connection->mViewerSession; body["voice_server_type"] = WEBRTC_VOICE_SERVER_TYPE; - LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter( - new LLCoreHttpUtil::HttpCoroutineAdapter("LLVoiceWebRTCAdHocConnection::processIceUpdatesCoro", - LLCore::HttpRequest::DEFAULT_POLICY_ID)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter = + std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("LLVoiceWebRTCAdHocConnection::processIceUpdatesCoro", + LLCore::HttpRequest::DEFAULT_POLICY_ID); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); httpOpts->setWantHeaders(true); @@ -2386,6 +2531,7 @@ void LLVoiceWebRTCConnection::OnAudioEstablished(llwebrtc::LLWebRTCAudioInterfac } LL_DEBUGS("Voice") << "On AudioEstablished." << LL_ENDL; mWebRTCAudioInterface = audio_interface; + mWebRTCAudioInterface->setMute(true); // mute will be set appropriately later when we finish setting up. setVoiceConnectionState(VOICE_STATE_SESSION_ESTABLISHED); }); } @@ -2403,10 +2549,7 @@ void LLVoiceWebRTCConnection::OnRenegotiationNeeded() LL::WorkQueue::postMaybe(mMainQueue, [=, this] { LL_DEBUGS("Voice") << "Voice channel requires renegotiation." << LL_ENDL; - if (!mShutDown) - { - setVoiceConnectionState(VOICE_STATE_SESSION_RETRY); - } + setVoiceConnectionState(VOICE_STATE_SESSION_RETRY); mCurrentStatus = LLVoiceClientStatusObserver::ERROR_UNKNOWN; }); } @@ -2518,11 +2661,11 @@ void LLVoiceWebRTCConnection::breakVoiceConnectionCoro(connectionPtr_t connectio body["viewer_session"] = connection->mViewerSession; body["voice_server_type"] = WEBRTC_VOICE_SERVER_TYPE; - LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter( - new LLCoreHttpUtil::HttpCoroutineAdapter("LLVoiceWebRTCAdHocConnection::breakVoiceConnection", - LLCore::HttpRequest::DEFAULT_POLICY_ID)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter = + std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("LLVoiceWebRTCAdHocConnection::breakVoiceConnection", + LLCore::HttpRequest::DEFAULT_POLICY_ID); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); httpOpts->setWantHeaders(true); @@ -2546,6 +2689,11 @@ void LLVoiceWebRTCConnection::breakVoiceConnectionCoro(connectionPtr_t connectio void LLVoiceWebRTCSpatialConnection::requestVoiceConnection() { LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE; + if (LLWebRTCVoiceClient::isShuttingDown()) + { + mOutstandingRequests--; + return; + } LLViewerRegion *regionp = LLWorld::instance().getRegionFromID(mRegionID); @@ -2582,11 +2730,11 @@ void LLVoiceWebRTCSpatialConnection::requestVoiceConnection() } body["channel_type"] = "local"; body["voice_server_type"] = WEBRTC_VOICE_SERVER_TYPE; - LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter( - new LLCoreHttpUtil::HttpCoroutineAdapter("LLVoiceWebRTCAdHocConnection::requestVoiceConnection", - LLCore::HttpRequest::DEFAULT_POLICY_ID)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter = + std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("LLVoiceWebRTCAdHocConnection::requestVoiceConnection", + LLCore::HttpRequest::DEFAULT_POLICY_ID); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); httpOpts->setWantHeaders(true); LLSD result = httpAdapter->postAndSuspend(httpRequest, url, body, httpOpts); @@ -2745,7 +2893,13 @@ bool LLVoiceWebRTCConnection::connectionStateMachine() } // update the peer connection with the various characteristics of // this connection. - mWebRTCAudioInterface->setMute(mMuted); + // For spatial this connection will come up as muted, but will be set to the appropriate + // value later on when we determine the regions we connect to. + if (isSpatial()) + { + // we'll determine primary state later and set mute accordinly + mPrimary = false; + } mWebRTCAudioInterface->setReceiveVolume(mSpeakerVolume); LLWebRTCVoiceClient::getInstance()->OnConnectionEstablished(mChannelID, mRegionID); setVoiceConnectionState(VOICE_STATE_WAIT_FOR_DATA_CHANNEL); @@ -2768,6 +2922,10 @@ bool LLVoiceWebRTCConnection::connectionStateMachine() LLWebRTCVoiceClient::getInstance()->updatePosition(); LLWebRTCVoiceClient::getInstance()->sendPositionUpdate(true); } + else + { + mWebRTCAudioInterface->setMute(mMuted); + } } break; } @@ -2790,6 +2948,10 @@ bool LLVoiceWebRTCConnection::connectionStateMachine() if (primary != mPrimary) { mPrimary = primary; + if (mWebRTCAudioInterface) + { + mWebRTCAudioInterface->setMute(mMuted || !mPrimary); + } sendJoin(); } } @@ -2843,9 +3005,13 @@ bool LLVoiceWebRTCConnection::connectionStateMachine() } // else was already posted by llwebrtc::terminate(). break; + } + case VOICE_STATE_WAIT_FOR_CLOSE: break; + case VOICE_STATE_CLOSED: + { if (!mShutDown) { mVoiceConnectionState = VOICE_STATE_START_SESSION; @@ -2921,7 +3087,6 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b return; } boost::json::object voice_data = voice_data_parsed.as_object(); - bool new_participant = false; boost::json::object mute; boost::json::object user_gain; for (auto &participant_elem : voice_data) @@ -2974,7 +3139,6 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b } } - new_participant |= joined; if (!participant && joined && (primary || !isSpatial())) { participant = LLWebRTCVoiceClient::getInstance()->addParticipantByID(mChannelID, agent_id, mRegionID); @@ -3024,7 +3188,7 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b { root["ug"] = user_gain; } - if (root.size() > 0) + if (root.size() > 0 && mWebRTCDataInterface) { std::string json_data = boost::json::serialize(root); mWebRTCDataInterface->sendData(json_data, false); @@ -3067,7 +3231,10 @@ void LLVoiceWebRTCConnection::OnDataChannelReady(llwebrtc::LLWebRTCDataInterface void LLVoiceWebRTCConnection::sendJoin() { LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE; - + if (!mWebRTCDataInterface) + { + return; + } boost::json::object root; boost::json::object join_obj; @@ -3089,10 +3256,7 @@ LLVoiceWebRTCSpatialConnection::LLVoiceWebRTCSpatialConnection(const LLUUID ® LLVoiceWebRTCConnection(regionID, channelID), mParcelLocalID(parcelLocalID) { - if (gAgent.getRegion()) - { - mPrimary = (regionID == gAgent.getRegion()->getRegionID()); - } + mPrimary = false; // will be set to primary after connection established } LLVoiceWebRTCSpatialConnection::~LLVoiceWebRTCSpatialConnection() @@ -3101,23 +3265,20 @@ LLVoiceWebRTCSpatialConnection::~LLVoiceWebRTCSpatialConnection() void LLVoiceWebRTCSpatialConnection::setMuteMic(bool muted) { - if (mMuted != muted) + mMuted = muted; + if (mWebRTCAudioInterface) { - mMuted = muted; - if (mWebRTCAudioInterface) + LLViewerRegion *regionp = gAgent.getRegion(); + if (regionp && mRegionID == regionp->getRegionID()) { - LLViewerRegion *regionp = gAgent.getRegion(); - if (regionp && mRegionID == regionp->getRegionID()) - { - mWebRTCAudioInterface->setMute(muted); - } - else - { - // Always mute this agent with respect to neighboring regions. - // Peers don't want to hear this agent from multiple regions - // as that'll echo. - mWebRTCAudioInterface->setMute(true); - } + mWebRTCAudioInterface->setMute(muted); + } + else + { + // Always mute this agent with respect to neighboring regions. + // Peers don't want to hear this agent from multiple regions + // as that'll echo. + mWebRTCAudioInterface->setMute(true); } } } @@ -3145,6 +3306,12 @@ void LLVoiceWebRTCAdHocConnection::requestVoiceConnection() { LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE; + if (LLWebRTCVoiceClient::isShuttingDown()) + { + mOutstandingRequests--; + return; + } + LLViewerRegion *regionp = LLWorld::instance().getRegionFromID(mRegionID); LL_DEBUGS("Voice") << "Requesting voice connection." << LL_ENDL; @@ -3178,11 +3345,11 @@ void LLVoiceWebRTCAdHocConnection::requestVoiceConnection() body["channel_type"] = "multiagent"; body["voice_server_type"] = WEBRTC_VOICE_SERVER_TYPE; - LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter( - new LLCoreHttpUtil::HttpCoroutineAdapter("LLVoiceWebRTCAdHocConnection::requestVoiceConnection", - LLCore::HttpRequest::DEFAULT_POLICY_ID)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter = + std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("LLVoiceWebRTCAdHocConnection::requestVoiceConnection", + LLCore::HttpRequest::DEFAULT_POLICY_ID); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); httpOpts->setWantHeaders(true); diff --git a/indra/newview/llvoicewebrtc.h b/indra/newview/llvoicewebrtc.h index ff82d2739d..0c658803db 100644 --- a/indra/newview/llvoicewebrtc.h +++ b/indra/newview/llvoicewebrtc.h @@ -43,7 +43,7 @@ class LLWebRTCProtocolParser; #include <queue> #include "boost/json.hpp" -#ifdef LL_USESYSTEMLIBS +#if 1 # include "expat.h" #else # include "expat/expat.h" @@ -204,7 +204,7 @@ public: //@} // authorize the user - void userAuthorized(const std::string &user_id, const LLUUID &agentID) override {}; + void userAuthorized(const std::string &user_id, const LLUUID &agentID) override; void OnConnectionEstablished(const std::string& channelID, const LLUUID& regionID); @@ -351,6 +351,9 @@ public: bool isSpatial() override { return true; } bool isEstate() override { return true; } bool isCallbackPossible() override { return false; } + + private: + bool isRegionWebRTCEnabled(const LLUUID& regionID); }; class parcelSessionState : public sessionState @@ -440,10 +443,8 @@ public: boost::signals2::connection mAvatarNameCacheConnection; private: - - // helper function to retrieve the audio level - // Used in multiple places. - float getAudioLevel(); + // init or restart the WebRTC device interface. + void initWebRTC(); // Coroutine support methods //--- @@ -455,7 +456,6 @@ private: LL::WorkQueue::weak_t mMainQueue; - bool mTuningMode; F32 mTuningMicGain; int mTuningSpeakerVolume; bool mDevicesListUpdated; // set to true when the device list has been updated diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp index ab8d0d2564..38c702c4ca 100644 --- a/indra/newview/llvosky.cpp +++ b/indra/newview/llvosky.cpp @@ -100,8 +100,16 @@ LLSkyTex::LLSkyTex() : void LLSkyTex::init(bool isShiny) { mIsShiny = isShiny; - mSkyData = new LLColor4[(U32)(SKYTEX_RESOLUTION * SKYTEX_RESOLUTION)]; - mSkyDirs = new LLVector3[(U32)(SKYTEX_RESOLUTION * SKYTEX_RESOLUTION)]; + try + { + mSkyData = new LLColor4[(U32)(SKYTEX_RESOLUTION * SKYTEX_RESOLUTION)]; + mSkyDirs = new LLVector3[(U32)(SKYTEX_RESOLUTION * SKYTEX_RESOLUTION)]; + } + catch (std::bad_alloc&) + { + LLError::LLUserWarningMsg::showOutOfMemory(); + LL_ERRS() << "Failed to allocate memory for sky texture data" << LL_ENDL; + } for (S32 i = 0; i < 2; ++i) { diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp index 294d36b0a9..bc326a74a8 100644 --- a/indra/newview/llvosurfacepatch.cpp +++ b/indra/newview/llvosurfacepatch.cpp @@ -245,6 +245,7 @@ bool LLVOSurfacePatch::updateLOD() void LLVOSurfacePatch::getTerrainGeometry(LLStrider<LLVector3> &verticesp, LLStrider<LLVector3> &normalsp, + LLStrider<LLVector2> &texCoords0p, LLStrider<LLVector2> &texCoords1p, LLStrider<U16> &indicesp) { @@ -259,18 +260,21 @@ void LLVOSurfacePatch::getTerrainGeometry(LLStrider<LLVector3> &verticesp, updateMainGeometry(facep, verticesp, normalsp, + texCoords0p, texCoords1p, indicesp, index_offset); updateNorthGeometry(facep, verticesp, normalsp, + texCoords0p, texCoords1p, indicesp, index_offset); updateEastGeometry(facep, verticesp, normalsp, + texCoords0p, texCoords1p, indicesp, index_offset); @@ -279,6 +283,7 @@ void LLVOSurfacePatch::getTerrainGeometry(LLStrider<LLVector3> &verticesp, void LLVOSurfacePatch::updateMainGeometry(LLFace *facep, LLStrider<LLVector3> &verticesp, LLStrider<LLVector3> &normalsp, + LLStrider<LLVector2> &texCoords0p, LLStrider<LLVector2> &texCoords1p, LLStrider<U16> &indicesp, U32 &index_offset) @@ -317,9 +322,10 @@ void LLVOSurfacePatch::updateMainGeometry(LLFace *facep, { x = i * render_stride; y = j * render_stride; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } } @@ -381,6 +387,7 @@ void LLVOSurfacePatch::updateMainGeometry(LLFace *facep, void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, LLStrider<LLVector3> &verticesp, LLStrider<LLVector3> &normalsp, + LLStrider<LLVector2> &texCoords0p, LLStrider<LLVector2> &texCoords1p, LLStrider<U16> &indicesp, U32 &index_offset) @@ -414,9 +421,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, x = i * render_stride; y = 16 - render_stride; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } @@ -425,9 +433,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, { x = i * render_stride; y = 16; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } @@ -460,9 +469,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, x = i * render_stride; y = 16 - render_stride; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } @@ -472,9 +482,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, x = i * render_stride; y = 16; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } @@ -514,9 +525,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, x = i * north_stride; y = 16 - render_stride; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } @@ -526,9 +538,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, x = i * north_stride; y = 16; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } @@ -564,6 +577,7 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, void LLVOSurfacePatch::updateEastGeometry(LLFace *facep, LLStrider<LLVector3> &verticesp, LLStrider<LLVector3> &normalsp, + LLStrider<LLVector2> &texCoords0p, LLStrider<LLVector2> &texCoords1p, LLStrider<U16> &indicesp, U32 &index_offset) @@ -592,9 +606,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep, x = 16 - render_stride; y = i * render_stride; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } @@ -603,9 +618,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep, { x = 16; y = i * render_stride; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } @@ -638,9 +654,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep, x = 16 - render_stride; y = i * render_stride; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } // Iterate through the east patch's points @@ -649,9 +666,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep, x = 16; y = i * render_stride; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } @@ -690,9 +708,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep, x = 16 - render_stride; y = i * east_stride; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } // Iterate through the east patch's points @@ -701,9 +720,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep, x = 16; y = i * east_stride; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } @@ -1022,12 +1042,14 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group) LLStrider<LLVector3> vertices_start; LLStrider<LLVector3> normals_start; LLStrider<LLVector4a> tangents_start; + LLStrider<LLVector2> texcoords0_start; // ownership overlay LLStrider<LLVector2> texcoords2_start; LLStrider<U16> indices_start; llassert_always(buffer->getVertexStrider(vertices_start)); llassert_always(buffer->getNormalStrider(normals_start)); llassert_always(buffer->getTangentStrider(tangents_start)); + llassert_always(buffer->getTexCoord0Strider(texcoords0_start)); llassert_always(buffer->getTexCoord1Strider(texcoords2_start)); llassert_always(buffer->getIndexStrider(indices_start)); @@ -1037,6 +1059,7 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group) { LLStrider<LLVector3> vertices = vertices_start; LLStrider<LLVector3> normals = normals_start; + LLStrider<LLVector2> texcoords0 = texcoords0_start; LLStrider<LLVector2> texcoords2 = texcoords2_start; LLStrider<U16> indices = indices_start; @@ -1049,7 +1072,7 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group) facep->setVertexBuffer(buffer); LLVOSurfacePatch* patchp = (LLVOSurfacePatch*) facep->getViewerObject(); - patchp->getTerrainGeometry(vertices, normals, texcoords2, indices); + patchp->getTerrainGeometry(vertices, normals, texcoords0, texcoords2, indices); indices_index += facep->getIndicesCount(); index_offset += facep->getGeomCount(); diff --git a/indra/newview/llvosurfacepatch.h b/indra/newview/llvosurfacepatch.h index af5f05774b..c93a58d2d9 100644 --- a/indra/newview/llvosurfacepatch.h +++ b/indra/newview/llvosurfacepatch.h @@ -57,6 +57,7 @@ public: /*virtual*/ void updateFaceSize(S32 idx); void getTerrainGeometry(LLStrider<LLVector3> &verticesp, LLStrider<LLVector3> &normalsp, + LLStrider<LLVector2> &texCoords0p, LLStrider<LLVector2> &texCoords1p, LLStrider<U16> &indicesp); @@ -109,18 +110,21 @@ protected: void updateMainGeometry(LLFace *facep, LLStrider<LLVector3> &verticesp, LLStrider<LLVector3> &normalsp, + LLStrider<LLVector2> &texCoords0p, LLStrider<LLVector2> &texCoords1p, LLStrider<U16> &indicesp, U32 &index_offset); void updateNorthGeometry(LLFace *facep, LLStrider<LLVector3> &verticesp, LLStrider<LLVector3> &normalsp, + LLStrider<LLVector2> &texCoords0p, LLStrider<LLVector2> &texCoords1p, LLStrider<U16> &indicesp, U32 &index_offset); void updateEastGeometry(LLFace *facep, LLStrider<LLVector3> &verticesp, LLStrider<LLVector3> &normalsp, + LLStrider<LLVector2> &texCoords0p, LLStrider<LLVector2> &texCoords1p, LLStrider<U16> &indicesp, U32 &index_offset); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 3fb7a3c156..4c316fce07 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -352,8 +352,11 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, if (isSculpted()) { LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); - sculpt_id = sculpt_params->getSculptTexture(); - sculpt_type = sculpt_params->getSculptType(); + if (sculpt_params) + { + sculpt_id = sculpt_params->getSculptTexture(); + sculpt_type = sculpt_params->getSculptType(); + } LL_DEBUGS("ObjectUpdate") << "uuid " << mID << " set sculpt_id " << sculpt_id << LL_ENDL; } @@ -860,8 +863,11 @@ void LLVOVolume::updateTextureVirtualSize(bool forced) // animated faces get moved to a smaller partition to reduce // side-effects of their updates (see shrinkWrap in // LLVOVolume::animateTextures). - mDrawable->getSpatialGroup()->dirtyGeom(); - gPipeline.markRebuild(mDrawable->getSpatialGroup()); + if (mDrawable->getSpatialGroup()) + { + mDrawable->getSpatialGroup()->dirtyGeom(); + gPipeline.markRebuild(mDrawable->getSpatialGroup()); + } } } @@ -1188,12 +1194,15 @@ void LLVOVolume::updateSculptTexture() if (isSculpted() && !isMesh()) { LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); - LLUUID id = sculpt_params->getSculptTexture(); - if (id.notNull()) + if (sculpt_params) { - mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, true, LLGLTexture::BOOST_SCULPTED, LLViewerTexture::LOD_TEXTURE); - mSculptTexture->forceToSaveRawImage(0, F32_MAX); - mSculptTexture->setKnownDrawSize(256, 256); + LLUUID id = sculpt_params->getSculptTexture(); + if (id.notNull()) + { + mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, true, LLGLTexture::BOOST_SCULPTED, LLViewerTexture::LOD_TEXTURE); + mSculptTexture->forceToSaveRawImage(0, F32_MAX); + mSculptTexture->setKnownDrawSize(256, 256); + } } mSkinInfoUnavaliable = false; @@ -1481,6 +1490,7 @@ bool LLVOVolume::calcLOD() const LLVector3* box = avatar->getLastAnimExtents(); LLVector3 diag = box[1] - box[0]; radius = diag.magVec() * 0.5f; + LL_DEBUGS("DynamicBox") << avatar->getDebugName() << " diag " << diag << " radius " << radius << LL_ENDL; } else { @@ -1491,6 +1501,7 @@ bool LLVOVolume::calcLOD() const LLVector3* box = avatar->getLastAnimExtents(); LLVector3 diag = box[1] - box[0]; radius = diag.magVec(); // preserve old BinRadius behavior - 2x off + LL_DEBUGS("DynamicBox") << avatar->getDebugName() << " diag " << diag << " radius " << radius << LL_ENDL; } if (distance <= 0.f || radius <= 0.f) { @@ -1555,11 +1566,16 @@ bool LLVOVolume::calcLOD() mLODAdjustedDistance = distance; + static LLCachedControl<S32> debug_selection_lods(gSavedSettings, "DebugSelectionLODs", 0); if (isHUDAttachment()) { // HUDs always show at highest detail cur_detail = 3; } + else if (isSelected() && debug_selection_lods() >= 0) + { + cur_detail = llmin(debug_selection_lods(), 3); + } else { cur_detail = computeLODDetail(ll_round(distance, 0.01f), ll_round(radius, 0.01f), lod_factor); @@ -2640,6 +2656,17 @@ void LLVOVolume::syncMediaData(S32 texture_index, const LLSD &media_data, bool m } viewer_media_t media_impl = LLViewerMedia::getInstance()->updateMediaImpl(mep, previous_url, update_from_self); + static LLCachedControl<bool> media_autoplay_huds(gSavedSettings, "MediaAutoPlayHuds", true); + bool was_loaded = media_impl->hasMedia(); + if (isHUDAttachment() && media_autoplay_huds && !was_loaded) + { + std::string url = mep->getCurrentURL(); + if (media_impl->getCurrentMediaURL() != url) + { + media_impl->navigateTo(url, "", false, true); + } + } + addMediaImpl(media_impl, texture_index) ; } else @@ -2666,10 +2693,10 @@ void LLVOVolume::mediaNavigateBounceBack(U8 texture_index) if (mep && impl) { std::string url = mep->getCurrentURL(); - // Look for a ":", if not there, assume "http://" + // Look for a ":", if not there, assume "https://" if (!url.empty() && std::string::npos == url.find(':')) { - url = "http://" + url; + url = "https://" + url; } // If the url we're trying to "bounce back" to is either empty or not // allowed by the whitelist, try the home url. If *that* doesn't work, @@ -2677,10 +2704,10 @@ void LLVOVolume::mediaNavigateBounceBack(U8 texture_index) if (url.empty() || !mep->checkCandidateUrl(url)) { url = mep->getHomeURL(); - // Look for a ":", if not there, assume "http://" + // Look for a ":", if not there, assume "https://" if (!url.empty() && std::string::npos == url.find(':')) { - url = "http://" + url; + url = "https://" + url; } } if (url.empty() || !mep->checkCandidateUrl(url)) @@ -3573,12 +3600,15 @@ bool LLVOVolume::isMesh() const if (isSculpted()) { LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); - U8 sculpt_type = sculpt_params->getSculptType(); - - if ((sculpt_type & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH) - // mesh is a mesh + if (sculpt_params) { - return true; + U8 sculpt_type = sculpt_params->getSculptType(); + + if ((sculpt_type & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH) + // mesh is a mesh + { + return true; + } } } @@ -3780,7 +3810,12 @@ bool LLVOVolume::canBeAnimatedObject() const bool LLVOVolume::isAnimatedObject() const { - LLVOVolume *root_vol = (LLVOVolume*)getRootEdit(); + LLViewerObject *root_obj = getRootEdit(); + if (root_obj->getPCode() != LL_PCODE_VOLUME) + { + return false; // at the moment only volumes can be animated + } + LLVOVolume* root_vol = (LLVOVolume*)root_obj; mIsAnimatedObject = root_vol->getExtendedMeshFlags() & LLExtendedMeshParams::ANIMATED_MESH_ENABLED_FLAG; return mIsAnimatedObject; } @@ -4990,7 +5025,7 @@ void LLRiggedVolume::update( else { face_begin = face_index; - face_end = face_begin + 1; + face_end = llmin(face_begin + 1, volume->getNumVolumeFaces()); } for (S32 i = face_begin; i < face_end; ++i) { @@ -5875,6 +5910,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) } else { + static LLCachedControl<bool> render_reflection_object(gSavedSettings, "RenderReflectionProbeShowTransparent", false); F32 alpha; if (is_pbr) { @@ -5889,7 +5925,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) drawablep->setState(LLDrawable::HAS_ALPHA); add_face(sAlphaFaces, alpha_count, facep); } - else if (LLDrawPoolAlpha::sShowDebugAlpha || + else if ((LLDrawPoolAlpha::sShowDebugAlpha && (render_reflection_object || !vobj->isReflectionProbe())) || (gPipeline.sRenderHighlight && !drawablep->getParent() && //only root objects are highlighted with red color in this case drawablep->getVObj() && drawablep->getVObj()->flagScripted() && @@ -6729,7 +6765,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace && te->getShiny() && can_be_shiny) { //shiny - if (tex->getPrimaryFormat() == GL_ALPHA) + if (tex && tex->getPrimaryFormat() == GL_ALPHA) { //invisiprim+shiny if (!facep->getViewerObject()->isAttachment() && !facep->getViewerObject()->isRiggedMesh()) { @@ -6769,7 +6805,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace } else { //not alpha and not shiny - if (!is_alpha && tex->getPrimaryFormat() == GL_ALPHA) + if (!is_alpha && tex && tex->getPrimaryFormat() == GL_ALPHA) { //invisiprim if (!facep->getViewerObject()->isAttachment() && !facep->getViewerObject()->isRiggedMesh()) { diff --git a/indra/newview/llwatchdog.cpp b/indra/newview/llwatchdog.cpp deleted file mode 100644 index 0a1d346266..0000000000 --- a/indra/newview/llwatchdog.cpp +++ /dev/null @@ -1,266 +0,0 @@ -/** - * @file llthreadwatchdog.cpp - * @brief The LLThreadWatchdog class definitions - * - * $LicenseInfo:firstyear=2007&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 "llwatchdog.h" -#include "llthread.h" - -const U32 WATCHDOG_SLEEP_TIME_USEC = 1000000; - -// This class runs the watchdog timing thread. -class LLWatchdogTimerThread : public LLThread -{ -public: - LLWatchdogTimerThread() : - LLThread("Watchdog"), - mSleepMsecs(0), - mStopping(false) - { - } - - ~LLWatchdogTimerThread() {} - - void setSleepTime(long ms) { mSleepMsecs = ms; } - void stop() - { - mStopping = true; - mSleepMsecs = 1; - } - - /* virtual */ void run() - { - while(!mStopping) - { - LLWatchdog::getInstance()->run(); - ms_sleep(mSleepMsecs); - } - } - -private: - long mSleepMsecs; - bool mStopping; -}; - -// LLWatchdogEntry -LLWatchdogEntry::LLWatchdogEntry() -{ -} - -LLWatchdogEntry::~LLWatchdogEntry() -{ - stop(); -} - -void LLWatchdogEntry::start() -{ - LLWatchdog::getInstance()->add(this); -} - -void LLWatchdogEntry::stop() -{ - // this can happen very late in the shutdown sequence - if (! LLWatchdog::wasDeleted()) - { - LLWatchdog::getInstance()->remove(this); - } -} - -// LLWatchdogTimeout -const std::string UNINIT_STRING = "uninitialized"; - -LLWatchdogTimeout::LLWatchdogTimeout() : - mTimeout(0.0f), - mPingState(UNINIT_STRING) -{ -} - -LLWatchdogTimeout::~LLWatchdogTimeout() -{ -} - -bool LLWatchdogTimeout::isAlive() const -{ - return (mTimer.getStarted() && !mTimer.hasExpired()); -} - -void LLWatchdogTimeout::reset() -{ - mTimer.setTimerExpirySec(mTimeout); -} - -void LLWatchdogTimeout::setTimeout(F32 d) -{ - mTimeout = d; -} - -void LLWatchdogTimeout::start(const std::string& state) -{ - if (mTimeout == 0) - { - LL_WARNS() << "Cant' start watchdog entry - no timeout set" << LL_ENDL; - return; - } - // Order of operation is very important here. - // After LLWatchdogEntry::start() is called - // LLWatchdogTimeout::isAlive() will be called asynchronously. - ping(state); - mTimer.start(); - mTimer.setTimerExpirySec(mTimeout); // timer expiration set to 0 by start() - LLWatchdogEntry::start(); -} - -void LLWatchdogTimeout::stop() -{ - LLWatchdogEntry::stop(); - mTimer.stop(); -} - -void LLWatchdogTimeout::ping(const std::string& state) -{ - if(!state.empty()) - { - mPingState = state; - } - reset(); -} - -// LLWatchdog -LLWatchdog::LLWatchdog() - :mSuspectsAccessMutex() - ,mTimer(NULL) - ,mLastClockCount(0) -{ -} - -LLWatchdog::~LLWatchdog() -{ -} - -void LLWatchdog::add(LLWatchdogEntry* e) -{ - lockThread(); - mSuspects.insert(e); - unlockThread(); -} - -void LLWatchdog::remove(LLWatchdogEntry* e) -{ - lockThread(); - mSuspects.erase(e); - unlockThread(); -} - -void LLWatchdog::init() -{ - if(!mSuspectsAccessMutex && !mTimer) - { - mSuspectsAccessMutex = new LLMutex(); - mTimer = new LLWatchdogTimerThread(); - mTimer->setSleepTime(WATCHDOG_SLEEP_TIME_USEC / 1000); - mLastClockCount = LLTimer::getTotalTime(); - - // mTimer->start() kicks off the thread, any code after - // start needs to use the mSuspectsAccessMutex - mTimer->start(); - } -} - -void LLWatchdog::cleanup() -{ - if(mTimer) - { - mTimer->stop(); - delete mTimer; - mTimer = NULL; - } - - if(mSuspectsAccessMutex) - { - delete mSuspectsAccessMutex; - mSuspectsAccessMutex = NULL; - } - - mLastClockCount = 0; -} - -void LLWatchdog::run() -{ - lockThread(); - - // Check the time since the last call to run... - // If the time elapsed is two times greater than the regualr sleep time - // reset the active timeouts. - const U32 TIME_ELAPSED_MULTIPLIER = 2; - U64 current_time = LLTimer::getTotalTime(); - U64 current_run_delta = current_time - mLastClockCount; - mLastClockCount = current_time; - - if(current_run_delta > (WATCHDOG_SLEEP_TIME_USEC * TIME_ELAPSED_MULTIPLIER)) - { - LL_INFOS() << "Watchdog thread delayed: resetting entries." << LL_ENDL; - for (const auto& suspect : mSuspects) - { - suspect->reset(); - } - } - else - { - SuspectsRegistry::iterator result = - std::find_if(mSuspects.begin(), - mSuspects.end(), - [](const LLWatchdogEntry* suspect){ return ! suspect->isAlive(); }); - if(result != mSuspects.end()) - { - // error!!! - if(mTimer) - { - mTimer->stop(); - } - - LL_ERRS() << "Watchdog timer expired; assuming viewer is hung and crashing" << LL_ENDL; - } - } - - - unlockThread(); -} - -void LLWatchdog::lockThread() -{ - if(mSuspectsAccessMutex != NULL) - { - mSuspectsAccessMutex->lock(); - } -} - -void LLWatchdog::unlockThread() -{ - if(mSuspectsAccessMutex != NULL) - { - mSuspectsAccessMutex->unlock(); - } -} diff --git a/indra/newview/llwatchdog.h b/indra/newview/llwatchdog.h deleted file mode 100644 index fe8932e298..0000000000 --- a/indra/newview/llwatchdog.h +++ /dev/null @@ -1,101 +0,0 @@ -/** - * @file llthreadwatchdog.h - * @brief The LLThreadWatchdog class declaration - * - * $LicenseInfo:firstyear=2007&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_LLTHREADWATCHDOG_H -#define LL_LLTHREADWATCHDOG_H - -#include <boost/function.hpp> - -#ifndef LL_TIMER_H - #include "lltimer.h" -#endif - -// LLWatchdogEntry is the interface used by the tasks that -// need to be watched. -class LLWatchdogEntry -{ -public: - LLWatchdogEntry(); - virtual ~LLWatchdogEntry(); - - // isAlive is accessed by the watchdog thread. - // This may mean that resources used by - // isAlive and other method may need synchronization. - virtual bool isAlive() const = 0; - virtual void reset() = 0; - virtual void start(); - virtual void stop(); -}; - -class LLWatchdogTimeout : public LLWatchdogEntry -{ -public: - LLWatchdogTimeout(); - virtual ~LLWatchdogTimeout(); - - /* virtual */ bool isAlive() const; - /* virtual */ void reset(); - /* virtual */ void start() { start(""); } - /* virtual */ void stop(); - - void start(const std::string& state); - void setTimeout(F32 d); - void ping(const std::string& state); - const std::string& getState() {return mPingState; } - -private: - LLTimer mTimer; - F32 mTimeout; - std::string mPingState; -}; - -class LLWatchdogTimerThread; // Defined in the cpp -class LLWatchdog : public LLSingleton<LLWatchdog> -{ - LLSINGLETON(LLWatchdog); - ~LLWatchdog(); - -public: - // Add an entry to the watchdog. - void add(LLWatchdogEntry* e); - void remove(LLWatchdogEntry* e); - - void init(); - void run(); - void cleanup(); - -private: - void lockThread(); - void unlockThread(); - - typedef std::set<LLWatchdogEntry*> SuspectsRegistry; - SuspectsRegistry mSuspects; - LLMutex* mSuspectsAccessMutex; - LLWatchdogTimerThread* mTimer; - U64 mLastClockCount; -}; - -#endif // LL_LLTHREADWATCHDOG_H diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index 8ce1a745c3..cc593fe7b4 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -33,7 +33,6 @@ #include "llagentwearables.h" #include "llappearancemgr.h" -#include "llinventoryfunctions.h" #include "llinventoryicon.h" #include "llgesturemgr.h" #include "lltransutil.h" @@ -41,15 +40,6 @@ #include "llviewermenu.h" #include "llvoavatarself.h" -class LLFindOutfitItems : public LLInventoryCollectFunctor -{ -public: - LLFindOutfitItems() {} - virtual ~LLFindOutfitItems() {} - virtual bool operator()(LLInventoryCategory* cat, - LLInventoryItem* item); -}; - bool LLFindOutfitItems::operator()(LLInventoryCategory* cat, LLInventoryItem* item) { @@ -195,6 +185,7 @@ LLPanelWearableOutfitItem::LLPanelWearableOutfitItem(LLViewerInventoryItem* item // virtual void LLPanelWearableOutfitItem::updateItem(const std::string& name, + bool favorite, EItemState item_state) { std::string search_label = name; @@ -225,7 +216,7 @@ void LLPanelWearableOutfitItem::updateItem(const std::string& name, } } - LLPanelInventoryListItemBase::updateItem(search_label, item_state); + LLPanelInventoryListItemBase::updateItem(search_label, favorite, item_state); } ////////////////////////////////////////////////////////////////////////// @@ -452,6 +443,7 @@ LLPanelAttachmentListItem* LLPanelAttachmentListItem::create(LLViewerInventoryIt } void LLPanelAttachmentListItem::updateItem(const std::string& name, + bool favorite, EItemState item_state) { std::string title_joint = name; @@ -469,7 +461,7 @@ void LLPanelAttachmentListItem::updateItem(const std::string& name, title_joint = title_joint + " (" + trans_name + ")"; } - LLPanelInventoryListItemBase::updateItem(title_joint, item_state); + LLPanelInventoryListItemBase::updateItem(title_joint, favorite, item_state); } ////////////////////////////////////////////////////////////////////////// @@ -497,7 +489,7 @@ bool LLPanelDummyClothingListItem::postBuild() addWidgetToRightSide("btn_add_panel"); setIconImage(LLInventoryIcon::getIcon(LLAssetType::AT_CLOTHING, LLInventoryType::IT_NONE, mWearableType, false)); - updateItem(wearableTypeToString(mWearableType)); + updateItem(wearableTypeToString(mWearableType), false); // Make it look loke clothing item - reserve space for 'delete' button setLeftWidgetsWidth(getChildView("item_icon")->getRect().mLeft); @@ -931,8 +923,8 @@ LLContextMenu* LLWearableItemsList::ContextMenu::createMenu() registrar.add("Wearable.CreateNew", boost::bind(createNewWearable, selected_id)); registrar.add("Wearable.ShowOriginal", boost::bind(show_item_original, selected_id)); registrar.add("Wearable.TakeOffDetach", - boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids, no_op)); + boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids, no_op)); // Register handlers for clothing. registrar.add("Clothing.TakeOff", boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids, no_op)); @@ -942,6 +934,7 @@ LLContextMenu* LLWearableItemsList::ContextMenu::createMenu() // Register handlers for attachments. registrar.add("Attachment.Detach", boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids, no_op)); + registrar.add("Attachment.Favorite", boost::bind(toggle_favorites, ids)); registrar.add("Attachment.Touch", boost::bind(handle_attachment_touch, selected_id)); registrar.add("Attachment.Profile", boost::bind(show_item_profile, selected_id)); registrar.add("Object.Attach", boost::bind(LLViewerAttachMenu::attachObjects, ids, _2)); @@ -975,6 +968,8 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu U32 n_touchable = 0; // number of touchable items among the selected ones bool can_be_worn = true; + bool can_favorite = false; + bool can_unfavorite = false; for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it) { @@ -996,6 +991,15 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu const bool is_editable = get_is_item_editable(id); const bool is_touchable = enable_attachment_touch(id); const bool is_already_worn = gAgentWearables.selfHasWearable(wearable_type); + + LLUUID linked_id = item->getLinkedUUID(); + LLViewerInventoryItem* linked_item = gInventory.getItem(linked_id); + if (linked_item) + { + can_favorite |= !linked_item->getIsFavorite(); + can_unfavorite |= linked_item->getIsFavorite(); + } + if (is_worn) { ++n_worn; @@ -1019,7 +1023,7 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu if (can_be_worn) { - can_be_worn = get_can_item_be_worn(item->getLinkedUUID()); + can_be_worn = get_can_item_be_worn(linked_id); } } // for @@ -1041,6 +1045,8 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu setMenuItemEnabled(menu, "create_new", LLAppearanceMgr::instance().canAddWearables(ids)); setMenuItemVisible(menu, "show_original", !standalone); setMenuItemEnabled(menu, "show_original", n_items == 1 && n_links == n_items); + setMenuItemVisible(menu, "favorites_add", can_favorite); + setMenuItemVisible(menu, "favorites_remove", can_unfavorite); setMenuItemVisible(menu, "take_off", mask == MASK_CLOTHING && n_worn == n_items); setMenuItemVisible(menu, "detach", mask == MASK_ATTACHMENT && n_worn == n_items); setMenuItemVisible(menu, "take_off_or_detach", mask == (MASK_ATTACHMENT|MASK_CLOTHING)); diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index 3fe1059176..915a557239 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -32,6 +32,7 @@ #include "llsingleton.h" // newview +#include "llinventoryfunctions.h" #include "llinventoryitemslist.h" #include "llinventorylistitem.h" #include "lllistcontextmenu.h" @@ -94,6 +95,7 @@ public: * Updates item name and (worn) suffix. */ /*virtual*/ void updateItem(const std::string& name, + bool favorite, EItemState item_state = IS_DEFAULT); void onAddWearable(); @@ -147,6 +149,7 @@ public: /** Set item title. Joint name is added to the title in parenthesis */ /*virtual*/ void updateItem(const std::string& name, + bool favorite, EItemState item_state = IS_DEFAULT); protected: @@ -507,4 +510,12 @@ protected: LLWearableType::EType mMenuWearableType; }; +class LLFindOutfitItems : public LLInventoryCollectFunctor +{ +public: + LLFindOutfitItems() {} + virtual ~LLFindOutfitItems() {} + virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item); +}; + #endif //LL_LLWEARABLEITEMSLIST_H diff --git a/indra/newview/llwebprofile.cpp b/indra/newview/llwebprofile.cpp index 4528ad012d..132cbf4fcd 100644 --- a/indra/newview/llwebprofile.cpp +++ b/indra/newview/llwebprofile.cpp @@ -83,7 +83,7 @@ void LLWebProfile::setAuthCookie(const std::string& cookie) /*static*/ LLCore::HttpHeaders::ptr_t LLWebProfile::buildDefaultHeaders() { - LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders); + LLCore::HttpHeaders::ptr_t httpHeaders = std::make_shared<LLCore::HttpHeaders>(); LLSD headers = LLViewerMedia::getInstance()->getHeaders(); for (LLSD::map_iterator it = headers.beginMap(); it != headers.endMap(); ++it) @@ -100,9 +100,9 @@ void LLWebProfile::uploadImageCoro(LLPointer<LLImageFormatted> image, std::strin { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("genericPostCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("uploadImageCoro", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); + LLCore::HttpOptions::ptr_t httpOpts = std::make_shared<LLCore::HttpOptions>(); LLCore::HttpHeaders::ptr_t httpHeaders; if (dynamic_cast<LLImagePNG*>(image.get()) == 0) diff --git a/indra/newview/llwebprofile.h b/indra/newview/llwebprofile.h index a9cfa102c0..5b3f3f2ce1 100644 --- a/indra/newview/llwebprofile.h +++ b/indra/newview/llwebprofile.h @@ -51,7 +51,7 @@ class LLWebProfile LOG_CLASS(LLWebProfile); public: - typedef boost::function<void(bool ok)> status_callback_t; + typedef std::function<void(bool ok)> status_callback_t; static void uploadImage(LLPointer<LLImageFormatted> image, const std::string& caption, bool add_location); static void setAuthCookie(const std::string& cookie); diff --git a/indra/newview/llwindowlistener.cpp b/indra/newview/llwindowlistener.cpp index ebcdd537a5..6d234a9a34 100644 --- a/indra/newview/llwindowlistener.cpp +++ b/indra/newview/llwindowlistener.cpp @@ -41,9 +41,9 @@ #include "llrootview.h" #include "llsdutil.h" #include "stringize.h" +#include <functional> #include <typeinfo> #include <map> -#include <boost/bind.hpp> LLWindowListener::LLWindowListener(LLViewerWindow *window, const KeyboardGetter& kbgetter) : LLEventAPI("LLWindow", "Inject input events into the LLWindow instance"), @@ -54,7 +54,7 @@ LLWindowListener::LLWindowListener(LLViewerWindow *window, const KeyboardGetter& "Given [\"keysym\"], [\"keycode\"] or [\"char\"], inject the specified "; std::string keyExplain = "(integer keycode values, or keysym string from any addKeyName() call in\n" - "http://bitbucket.org/lindenlab/viewer-release/src/tip/indra/llwindow/llkeyboard.cpp )\n"; + "https://github.com/secondlife/viewer/blob/develop/indra/llwindow/llkeyboard.cpp )\n"; std::string mask = "Specify optional [\"mask\"] as an array containing any of \"CTL\", \"ALT\",\n" "\"SHIFT\" or \"MAC_CONTROL\"; the corresponding modifier bits will be combined\n" @@ -69,7 +69,7 @@ LLWindowListener::LLWindowListener(LLViewerWindow *window, const KeyboardGetter& "(button values \"LEFT\", \"MIDDLE\", \"RIGHT\")\n"; std::string paramsExplain = "[\"path\"] is as for LLUI::getInstance()->resolvePath(), described in\n" - "http://bitbucket.org/lindenlab/viewer-release/src/tip/indra/llui/llui.h\n" + "https://github.com/secondlife/viewer/blob/develop/indra/llui/llui.h\n" "If you omit [\"path\"], you must specify both [\"x\"] and [\"y\"].\n" "If you specify [\"path\"] without both [\"x\"] and [\"y\"], will synthesize (x, y)\n" "in the center of the LLView selected by [\"path\"].\n" @@ -352,7 +352,7 @@ struct WhichButton: public StringLookup<Actions> }; static WhichButton buttons; -typedef boost::function<bool(LLCoordGL, MASK)> MouseFunc; +typedef std::function<bool(LLCoordGL, MASK)> MouseFunc; // Wrap a function returning 'void' to return 'true' instead. I'm sure there's // a more generic way to accomplish this, but generically handling the @@ -363,7 +363,7 @@ typedef boost::function<bool(LLCoordGL, MASK)> MouseFunc; // seem to overload comma the same way; or at least not with bind().) class MouseFuncTrue { - typedef boost::function<void(LLCoordGL, MASK)> MouseFuncVoid; + typedef std::function<void(LLCoordGL, MASK)> MouseFuncVoid; MouseFuncVoid mFunc; public: @@ -463,9 +463,9 @@ static void mouseEvent(const MouseFunc& func, const LLSD& request) // Instantiate a TemporaryDrilldownFunc to route incoming mouse events // to the target LLView*. But put it on the heap since "path" is - // optional. Nonetheless, manage it with a boost::scoped_ptr so it + // optional. Nonetheless, manage it with a std::unique_ptr so it // will be destroyed when we leave. - tempfunc.reset(new LLView::TemporaryDrilldownFunc(llview::TargetEvent(target))); + tempfunc = std::make_unique<LLView::TemporaryDrilldownFunc>(llview::TargetEvent(target)); } // The question of whether the requested LLView actually handled the @@ -484,11 +484,11 @@ void LLWindowListener::mouseDown(LLSD const & request) if (actions.valid) { // Normally you can pass NULL to an LLWindow* without compiler - // complaint, but going through boost::bind() evidently + // complaint, but going through std::bind() evidently // bypasses that special case: it only knows you're trying to pass an // int to a pointer. Explicitly cast NULL to the desired pointer type. - mouseEvent(boost::bind(actions.down, mWindow, - static_cast<LLWindow*>(NULL), _1, _2), + mouseEvent(std::bind(actions.down, mWindow, + static_cast<LLWindow*>(NULL), std::placeholders::_1, std::placeholders::_2), request); } } @@ -498,8 +498,7 @@ void LLWindowListener::mouseUp(LLSD const & request) Actions actions(buttons.lookup(request["button"])); if (actions.valid) { - mouseEvent(boost::bind(actions.up, mWindow, - static_cast<LLWindow*>(NULL), _1, _2), + mouseEvent(std::bind(actions.up, mWindow, static_cast<LLWindow*>(NULL), std::placeholders::_1, std::placeholders::_2), request); } } @@ -511,8 +510,8 @@ void LLWindowListener::mouseMove(LLSD const & request) // void, whereas mouseEvent() accepts a function returning bool -- and // uses that bool return. Use MouseFuncTrue to construct a callable that // returns bool anyway. - mouseEvent(MouseFuncTrue(boost::bind(&LLWindowCallbacks::handleMouseMove, mWindow, - static_cast<LLWindow*>(NULL), _1, _2)), + mouseEvent(MouseFuncTrue(std::bind(&LLWindowCallbacks::handleMouseMove, mWindow, static_cast<LLWindow*>(NULL), std::placeholders::_1, + std::placeholders::_2)), request); } diff --git a/indra/newview/llwindowlistener.h b/indra/newview/llwindowlistener.h index 207f64c8c0..9908a9c451 100644 --- a/indra/newview/llwindowlistener.h +++ b/indra/newview/llwindowlistener.h @@ -28,7 +28,7 @@ #define LL_LLWINDOWLISTENER_H #include "lleventapi.h" -#include <boost/function.hpp> +#include <functional> class LLKeyboard; class LLViewerWindow; @@ -36,7 +36,7 @@ class LLViewerWindow; class LLWindowListener : public LLEventAPI { public: - typedef boost::function<LLKeyboard*()> KeyboardGetter; + typedef std::function<LLKeyboard*()> KeyboardGetter; LLWindowListener(LLViewerWindow * window, const KeyboardGetter& kbgetter); void getInfo(LLSD const & evt); diff --git a/indra/newview/llwlhandlers.cpp b/indra/newview/llwlhandlers.cpp index 4e3a7a8788..aabcb2e514 100644 --- a/indra/newview/llwlhandlers.cpp +++ b/indra/newview/llwlhandlers.cpp @@ -101,8 +101,8 @@ void LLEnvironmentRequest::environmentRequestCoro(std::string url, LLEnvironment LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); S32 requestId = ++LLEnvironmentRequest::sLastRequest; LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("EnvironmentRequest", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("EnvironmentRequest", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD result = httpAdapter->getAndSuspend(httpRequest, url); @@ -193,8 +193,8 @@ void LLEnvironmentApply::environmentApplyCoro(std::string url, LLSD content, LLE { LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("EnvironmentApply", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + httpAdapter = std::make_shared<LLCoreHttpUtil::HttpCoroutineAdapter>("EnvironmentApply", httpPolicy); + LLCore::HttpRequest::ptr_t httpRequest = std::make_shared<LLCore::HttpRequest>(); LLSD result = httpAdapter->postAndSuspend(httpRequest, url, content); diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index e0d8c25731..47e1815bc2 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -838,6 +838,7 @@ void LLWorld::printPacketsLost() << " packets lost: " << cdp->getPacketsLost() << LL_ENDL; } } + LL_INFOS() << "Packets dropped by Packet Ring: " << gMessageSystem->mPacketRing.getNumDroppedPackets() << LL_ENDL; } void LLWorld::processCoarseUpdate(LLMessageSystem* msg, void** user_data) @@ -1371,10 +1372,8 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi F32 LLWorld::getNearbyAvatarsAndMaxGPUTime(std::vector<LLVOAvatar*> &valid_nearby_avs) { - static LLCachedControl<F32> render_far_clip(gSavedSettings, "RenderFarClip", 64); - F32 nearby_max_complexity = 0; - F32 radius = render_far_clip * render_far_clip; + F32 radius = LLVOAvatar::sRenderDistance * LLVOAvatar::sRenderDistance; for (LLCharacter* character : LLCharacter::sInstances) { diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index 7962c28e6d..153bee3aef 100644 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -32,6 +32,7 @@ #include "message.h" #include "lltracker.h" #include "lluistring.h" +#include "llviewercontrol.h" #include "llviewertexturelist.h" #include "lltrans.h" #include "llgltexture.h" @@ -492,9 +493,20 @@ bool LLWorldMap::insertItem(U32 x_world, U32 y_world, std::string& name, LLUUID& case MAP_ITEM_MATURE_EVENT: case MAP_ITEM_ADULT_EVENT: { - std::string timeStr = "["+ LLTrans::getString ("TimeHour")+"]:[" - +LLTrans::getString ("TimeMin")+"] [" - +LLTrans::getString ("TimeAMPM")+"]"; + std::string timeStr; + + static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); + if (use_24h) + { + timeStr = "[" + LLTrans::getString("TimeHour") + "]:[" + + LLTrans::getString("TimeMin") + "]"; + } + else + { + timeStr = "[" + LLTrans::getString("TimeHour12") + "]:[" + + LLTrans::getString("TimeMin") + "] [" + + LLTrans::getString("TimeAMPM") + "]"; + } LLSD substitution; substitution["datetime"] = (S32) extra; LLStringUtil::format (timeStr, substitution); diff --git a/indra/newview/llworldmap.h b/indra/newview/llworldmap.h index aab19a4d5f..68e7f3ee29 100644 --- a/indra/newview/llworldmap.h +++ b/indra/newview/llworldmap.h @@ -28,7 +28,6 @@ #define LL_LLWORLDMAP_H #include "llworldmipmap.h" -#include <boost/function.hpp> #include "v3dmath.h" #include "lluuid.h" diff --git a/indra/newview/llworldmapmessage.cpp b/indra/newview/llworldmapmessage.cpp index c60d075e0c..a5433133ab 100644 --- a/indra/newview/llworldmapmessage.cpp +++ b/indra/newview/llworldmapmessage.cpp @@ -33,7 +33,8 @@ #include "llagent.h" #include "llfloaterworldmap.h" -const U32 LAYER_FLAG = 2; +constexpr U32 LAYER_FLAG = 2; +constexpr S32 MAP_SIM_RETURN_NULL_SIMS = 0x00010000; //--------------------------------------------------------------------------- // World Map Message Handling @@ -43,7 +44,7 @@ LLWorldMapMessage::LLWorldMapMessage() : mSLURLRegionName(), mSLURLRegionHandle(0), mSLURL(), - mSLURLCallback(0), + mSLURLCallback(nullptr), mSLURLTeleport(false) { } @@ -135,7 +136,11 @@ void LLWorldMapMessage::sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); U32 flags = LAYER_FLAG; - flags |= (return_nonexistent ? 0x10000 : 0); + if (return_nonexistent) + { + // overwrite LAYER_FLAG, otherwise server won't respond to missing regions + flags = MAP_SIM_RETURN_NULL_SIMS; + } msg->addU32Fast(_PREHASH_Flags, flags); msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim msg->addBOOLFast(_PREHASH_Godlike, false); // Filled in on sim @@ -157,15 +162,17 @@ void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**) U32 agent_flags; msg->getU32Fast(_PREHASH_AgentData, _PREHASH_Flags, agent_flags); - // There's only one flag that we ever use here - if (agent_flags != LAYER_FLAG) + S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_Data); + + // There's only one flag that we ever use here, unless we also want an existence check. + if (agent_flags != LAYER_FLAG + && num_blocks != 1) // we check existence for a single region { LL_WARNS() << "Invalid map image type returned! layer = " << agent_flags << LL_ENDL; return; } - S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_Data); - //LL_INFOS("WorldMap") << "num_blocks = " << num_blocks << LL_ENDL; + LL_DEBUGS("WorldMap") << "num_blocks = " << num_blocks << LL_ENDL; bool found_null_sim = false; @@ -191,38 +198,43 @@ void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**) U32 x_world = (U32)(x_regions) * REGION_WIDTH_UNITS; U32 y_world = (U32)(y_regions) * REGION_WIDTH_UNITS; - // name shouldn't be empty, see EXT-4568 - llassert(!name.empty()); - - // Insert that region in the world map, if failure, flag it as a "null_sim" - if (!(LLWorldMap::getInstance()->insertRegion(x_world, y_world, name, image_id, (U32)accesscode, region_flags))) + // Name shouldn't be empty unless region doesn't exist + if (!name.empty()) { - found_null_sim = true; - } + // Insert that region in the world map, if failure, flag it as a "null_sim" + if (!(LLWorldMap::getInstance()->insertRegion(x_world, y_world, name, image_id, (U32)accesscode, region_flags))) + { + found_null_sim = true; + } - // If we hit a valid tracking location, do what needs to be done app level wise - if (LLWorldMap::getInstance()->isTrackingValidLocation()) - { - LLVector3d pos_global = LLWorldMap::getInstance()->getTrackedPositionGlobal(); - if (LLWorldMap::getInstance()->isTrackingDoubleClick()) + // If we hit a valid tracking location, do what needs to be done app level wise + if (LLWorldMap::getInstance()->isTrackingValidLocation()) { - // Teleport if the user double clicked - gAgent.teleportViaLocation(pos_global); + LLVector3d pos_global = LLWorldMap::getInstance()->getTrackedPositionGlobal(); + if (LLWorldMap::getInstance()->isTrackingDoubleClick()) + { + // Teleport if the user double clicked + gAgent.teleportViaLocation(pos_global); + } + // Update the "real" tracker information + gFloaterWorldMap->trackLocation(pos_global); } - // Update the "real" tracker information - gFloaterWorldMap->trackLocation(pos_global); + } + else + { + found_null_sim = true; } // Handle the SLURL callback if any url_callback_t callback = LLWorldMapMessage::getInstance()->mSLURLCallback; - if(callback != NULL) + if (callback != nullptr) { U64 handle = to_region_handle(x_world, y_world); // Check if we reached the requested region if ((LLStringUtil::compareInsensitive(LLWorldMapMessage::getInstance()->mSLURLRegionName, name)==0) || (LLWorldMapMessage::getInstance()->mSLURLRegionHandle == handle)) { - LLWorldMapMessage::getInstance()->mSLURLCallback = NULL; + LLWorldMapMessage::getInstance()->mSLURLCallback = nullptr; LLWorldMapMessage::getInstance()->mSLURLRegionName.clear(); LLWorldMapMessage::getInstance()->mSLURLRegionHandle = 0; diff --git a/indra/newview/llworldmapmessage.h b/indra/newview/llworldmapmessage.h index 357d31ccc1..87ae935bb9 100644 --- a/indra/newview/llworldmapmessage.h +++ b/indra/newview/llworldmapmessage.h @@ -27,7 +27,7 @@ #ifndef LL_LLWORLDMAPMESSAGE_H #define LL_LLWORLDMAPMESSAGE_H -#include "boost/function.hpp" +#include <functional> // Handling of messages (send and process) as well as SLURL callback if necessary class LLMessageSystem; @@ -38,7 +38,7 @@ class LLWorldMapMessage : public LLSingleton<LLWorldMapMessage> ~LLWorldMapMessage(); public: - typedef boost::function<void(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)> + typedef std::function<void(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)> url_callback_t; // Process incoming answers to map stuff requests diff --git a/indra/newview/llxmlrpclistener.cpp b/indra/newview/llxmlrpclistener.cpp index 92e6c88752..758615a730 100644 --- a/indra/newview/llxmlrpclistener.cpp +++ b/indra/newview/llxmlrpclistener.cpp @@ -241,7 +241,7 @@ public: } LLSD http_params = command.get("http_params"); - mTransaction.reset(new LLXMLRPCTransaction(mUri, mMethod, request_params, http_params)); + mTransaction = std::make_unique<LLXMLRPCTransaction>(mUri, mMethod, request_params, http_params); mPreviousStatus = mTransaction->status(NULL); // Now ensure that we get regular callbacks to poll for completion. diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index 7fbcb5fc04..7b0bf6f251 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -50,13 +50,6 @@ #include "llappviewer.h" #include "lltrans.h" -#include "boost/move/unique_ptr.hpp" - -namespace boost -{ - using ::boost::movelib::unique_ptr; // move unique_ptr into the boost namespace. -} - // Static instance of LLXMLRPCListener declared here so that every time we // bring in this code, we instantiate a listener. If we put the static // instance of LLXMLRPCListener into llxmlrpclistener.cpp, the linker would @@ -194,11 +187,11 @@ LLXMLRPCTransaction::Impl::Impl if (!mHttpRequest) { - mHttpRequest = LLCore::HttpRequest::ptr_t(new LLCore::HttpRequest); + mHttpRequest = std::make_shared<LLCore::HttpRequest>(); } // LLRefCounted starts with a 1 ref, so don't add a ref in the smart pointer - httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions()); + httpOpts = std::make_shared<LLCore::HttpOptions>(); // Delay between repeats will start from 5 sec and grow to 20 sec with each repeat httpOpts->setMinBackoff((LLCore::HttpTime)5E6L); @@ -221,7 +214,7 @@ LLXMLRPCTransaction::Impl::Impl httpOpts->setSSLVerifyHost(vefifySSLCert ? 2 : 0); // LLRefCounted starts with a 1 ref, so don't add a ref in the smart pointer - httpHeaders = LLCore::HttpHeaders::ptr_t(new LLCore::HttpHeaders()); + httpHeaders = std::make_shared<LLCore::HttpHeaders>(); httpHeaders->append(HTTP_OUT_HEADER_CONTENT_TYPE, HTTP_CONTENT_TEXT_XML); @@ -244,7 +237,7 @@ LLXMLRPCTransaction::Impl::Impl body->append(request.c_str(), request.size()); - mHandler = LLXMLRPCTransaction::Handler::ptr_t(new Handler(mHttpRequest, this)); + mHandler = std::make_shared<Handler>(mHttpRequest, this); mPostH = mHttpRequest->requestPost(LLCore::HttpRequest::DEFAULT_POLICY_ID, mURI, body.get(), httpOpts, httpHeaders, mHandler); diff --git a/indra/newview/mpfloatertuning.cpp b/indra/newview/mpfloatertuning.cpp index 1a3e4cf718..23f8c21e70 100644 --- a/indra/newview/mpfloatertuning.cpp +++ b/indra/newview/mpfloatertuning.cpp @@ -39,47 +39,37 @@ MPFloaterTuning::MPFloaterTuning(const LLSD& key) : LLFloater(key) { } -void MPFloaterTuning::syncFromPreferenceSetting(void *user_data) -{ - MPFloaterTuning *self = static_cast<MPFloaterTuning*>(user_data); +bool MPFloaterTuning::postBuild() +{ U32 fps = gSavedSettings.getU32("MaxFPS"); if(fps==0) fps=132; - LLSliderCtrl* fpsSliderCtrl = self->getChild<LLSliderCtrl>("fpsSlider"); - fpsSliderCtrl->setValue(fps,FALSE); + mFpsSlider = getChild<LLSliderCtrl>("fpsSliderCtrl"); + mFpsSlider->setCommitCallback(boost::bind(&MPFloaterTuning::onFpsSliderChanged, this)); - LLTextBox* fpsText = self->getChild<LLTextBox>("fpsText"); - if(fps>120) fpsText->setValue("no limit"); - else fpsText->setValue(std::to_string(fps)+" fps"); -} - -bool MPFloaterTuning::postBuild() -{ - LLSliderCtrl* fpsSliderCtrl = getChild<LLSliderCtrl>("fpsSlider"); - fpsSliderCtrl->setMinValue(12); - fpsSliderCtrl->setMaxValue(132); - fpsSliderCtrl->setSliderMouseUpCallback(boost::bind(&MPFloaterTuning::onFinalCommit,this)); + mFpsSlider->setValue(fps, false); - LLTextBox* fpsText = getChild<LLTextBox>("fpsText"); - fpsText->setValue(""); + mFpsTextBox = getChild<LLTextBox>("fpsTextCtrl"); + mFpsTextBox->setValue(""); - syncFromPreferenceSetting(this); + if(fps>120) mFpsTextBox->setValue("no limit"); + else if(fps==0) mFpsTextBox->setValue("no limit"); + else mFpsTextBox->setValue(std::to_string(fps)+" fps"); - return TRUE; + return true; } // Do send-to-the-server work when slider drag completes, or new // value entered as text. -void MPFloaterTuning::onFinalCommit() +void MPFloaterTuning::onFpsSliderChanged() { - LLSliderCtrl* fpsSliderCtrl = getChild<LLSliderCtrl>("fpsSlider"); - U32 fps = (U32)fpsSliderCtrl->getValueF32(); + U32 fps = (U32)mFpsSlider->getValueF32(); gSavedSettings.setU32("MaxFPS",fps); - LLTextBox* fpsText = getChild<LLTextBox>("fpsText"); - if(fps>120) fpsText->setValue("no limit"); - else fpsText->setValue(std::to_string(fps)+" fps"); + if(fps>120) mFpsTextBox->setValue("no limit"); + else if(fps==0) mFpsTextBox->setValue("no limit"); + else mFpsTextBox->setValue(std::to_string(fps)+" fps"); } void MPFloaterTuning::onClose(bool app_quitting) diff --git a/indra/newview/mpfloatertuning.h b/indra/newview/mpfloatertuning.h index 9e9c7f174f..bebdaa9952 100644 --- a/indra/newview/mpfloatertuning.h +++ b/indra/newview/mpfloatertuning.h @@ -29,20 +29,28 @@ #include "llfloater.h" +class LLSliderCtrl; +class LLTextBox; + class MPFloaterTuning: public LLFloater { -public: + public: + MPFloaterTuning(const LLSD& key); bool postBuild(); void onFinalCommit(); - static void syncFromPreferenceSetting(void *user_data); - - //void updateEditEnabled(); /*virtual*/ void onClose(bool app_quitting); + + private: + + LLSliderCtrl* mFpsSlider = nullptr; + LLTextBox* mFpsTextBox = nullptr; + + void onFpsSliderChanged(); }; #endif diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index e441e189ad..a844e29cbb 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -121,7 +121,7 @@ #include "SMAAAreaTex.h" #include "SMAASearchTex.h" - +#include "llerror.h" #ifndef LL_WINDOWS #define A_GCC 1 #pragma GCC diagnostic ignored "-Wunused-function" @@ -141,7 +141,7 @@ bool LLPipeline::WindLightUseAtmosShaders; bool LLPipeline::RenderDeferred; F32 LLPipeline::RenderDeferredSunWash; U32 LLPipeline::RenderFSAAType; -U32 LLPipeline::RenderResolutionDivisor; +F32 LLPipeline::RenderResolutionDivisor; bool LLPipeline::RenderUIBuffer; S32 LLPipeline::RenderShadowDetail; S32 LLPipeline::RenderShadowSplits; @@ -218,6 +218,7 @@ S32 LLPipeline::RenderBufferVisualization; bool LLPipeline::RenderMirrors; S32 LLPipeline::RenderHeroProbeUpdateRate; S32 LLPipeline::RenderHeroProbeConservativeUpdateMultiplier; +bool LLPipeline::RenderAvatarCloth; LLTrace::EventStatHandle<S64> LLPipeline::sStatBatchSize("renderbatchsize"); const U32 LLPipeline::MAX_PREVIEW_WIDTH = 512; @@ -228,6 +229,9 @@ const F32 ALPHA_BLEND_CUTOFF = 0.598f; const F32 DEFERRED_LIGHT_FALLOFF = 0.5f; const U32 DEFERRED_VB_MASK = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1; +const U32 SHADOWS_RESX = 512; +const U32 SHADOWS_RESY = 512; + extern S32 gBoxFrame; extern bool gDisplaySwapBuffers; extern bool gDebugGL; @@ -267,6 +271,7 @@ LLTrace::BlockTimerStatHandle FTM_STATESORT("Sort Draw State"); LLTrace::BlockTimerStatHandle FTM_PIPELINE("Pipeline"); LLTrace::BlockTimerStatHandle FTM_CLIENT_COPY("Client Copy"); LLTrace::BlockTimerStatHandle FTM_RENDER_DEFERRED("Deferred Shading"); +LLTrace::BlockTimerStatHandle FTM_RENDER_SHADOWS("Shadows"); LLTrace::BlockTimerStatHandle FTM_RENDER_UI_HUD("HUD"); LLTrace::BlockTimerStatHandle FTM_RENDER_UI_3D("3D"); @@ -345,19 +350,25 @@ void validate_framebuffer_object(); // target -- RenderTarget to add attachments to bool addDeferredAttachments(LLRenderTarget& target, bool for_impostor = false) { - U32 orm = GL_RGBA; + U32 orm = GL_RGBA8; +/* + U32 norm = GL_RGBA16; +*/ U32 norm = GL_RGBA16F; U32 emissive = GL_RGB16F; static LLCachedControl<bool> has_emissive(gSavedSettings, "RenderEnableEmissiveBuffer", false); static LLCachedControl<bool> has_hdr(gSavedSettings, "RenderHDREnabled", true); + static LLCachedControl<U32> MPColorPrecision(gSavedSettings, "MPColorPrecision", 0); + static LLCachedControl<bool> MPHDRDisplay(gSavedSettings, "MPHDRDisplay", false); + bool hdr = has_hdr() && gGLManager.mGLVersion > 4.05f; - if (!hdr) + if (!hdr || MPColorPrecision != 2) { norm = GL_RGB10_A2; - emissive = GL_RGB; } + if (!hdr || (!MPHDRDisplay && MPColorPrecision == 1)) emissive = GL_RGB8; bool valid = true; valid = valid && target.addColorAttachment(orm); // frag-data[1] specular OR PBR ORM @@ -426,9 +437,11 @@ void LLPipeline::init() sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights"); sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles"); + mReflectionMapManager.refreshSettings(); + mInitialized = true; - stop_glerror(); + LOG_GLERROR("LLPipeline::init()"); //create render pass pools getPool(LLDrawPool::POOL_WATEREXCLUSION); @@ -478,6 +491,10 @@ void LLPipeline::init() gSavedSettings.setBOOL("RenderPerformanceTest", true); } +#if LL_DARWIN + mHDRDisplay = gSavedSettings.getBOOL("MPHDRDisplay"); +#endif + mOldRenderDebugMask = mRenderDebugMask; mBackfaceCull = true; @@ -599,7 +616,7 @@ void LLPipeline::init() connectRefreshCachedSettingsSafe("RenderMirrors"); connectRefreshCachedSettingsSafe("RenderHeroProbeUpdateRate"); connectRefreshCachedSettingsSafe("RenderHeroProbeConservativeUpdateMultiplier"); - connectRefreshCachedSettingsSafe("RenderAutoHideSurfaceAreaLimit"); + connectRefreshCachedSettingsSafe("RenderAvatarCloth"); LLPointer<LLControlVariable> cntrl_ptr = gSavedSettings.getControl("CollectFontVertexBuffers"); if (cntrl_ptr.notNull()) @@ -700,7 +717,8 @@ void LLPipeline::cleanup() void LLPipeline::destroyGL() { - stop_glerror(); + LOG_GLERROR("LLPipeline::destroyGL()"); + unloadShaders(); mHighlightFaces.clear(); @@ -729,7 +747,9 @@ void LLPipeline::resizeShadowTexture() { releaseSunShadowTargets(); releaseSpotShadowTargets(); - allocateShadowBuffer(mRT->width, mRT->height); + //GLuint resX = gViewerWindow->getWorldViewWidthRaw(); + //GLuint resY = gViewerWindow->getWorldViewHeightRaw(); + allocateShadowBuffer(SHADOWS_RESX, SHADOWS_RESY); gResizeShadowTexture = false; } @@ -759,6 +779,12 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) return ret == FBO_SUCCESS_FULLRES; } +void LLPipeline::renderTriangle() +{ + gPipeline.mScreenTriangleVB->setBuffer(); + gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +} + LLPipeline::eFBOStatus LLPipeline::doAllocateScreenBuffer(U32 resX, U32 resY) { @@ -803,13 +829,15 @@ LLPipeline::eFBOStatus LLPipeline::doAllocateScreenBuffer(U32 resX, U32 resY) return ret; } -bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY) +bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY, U32 type_) { LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY; static LLCachedControl<bool> has_hdr(gSavedSettings, "RenderHDREnabled", true); bool hdr = gGLManager.mGLVersion > 4.05f && has_hdr(); + static LLCachedControl<U32> MPColorPrecision(gSavedSettings, "MPColorPrecision", 0); + if (mRT == &mMainRT) { // hacky -- allocate auxillary buffer @@ -822,14 +850,14 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY) mRT = &mAuxillaryRT; U32 res = mReflectionMapManager.mProbeResolution * 4; //multiply by 4 because probes will be 16x super sampled - allocateScreenBufferInternal(res, res); + allocateScreenBufferInternal(res, res, 1); if (RenderMirrors) { mHeroProbeManager.initReflectionMaps(); res = mHeroProbeManager.mProbeResolution; // We also scale the hero probe RT to the probe res since we don't super sample it. mRT = &mHeroProbeRT; - allocateScreenBufferInternal(res, res); + allocateScreenBufferInternal(res, res, 2); } mRT = &mMainRT; @@ -840,28 +868,33 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY) mRT->width = resX; mRT->height = resY; - U32 res_mod = RenderResolutionDivisor; + F32 res_mod = fmin(RenderResolutionDivisor, 4.0); - if (res_mod > 1 && res_mod < resX && res_mod < resY) + if (res_mod >= 0.5 && res_mod <= 4.0) { - resX /= res_mod; - resY /= res_mod; + resX = (U32)(floor((F32)resX / res_mod)); + resY = (U32)(floor((F32)resY / res_mod)); } S32 shadow_detail = RenderShadowDetail; bool ssao = RenderDeferredSSAO; //allocate deferred rendering color buffers - if (!mRT->deferredScreen.allocate(resX, resY, GL_RGBA, true)) return false; + + GLuint deferredScreenFormat = GL_RGBA8; + if((hdr && MPColorPrecision == 2)) deferredScreenFormat = GL_RGBA16F; + + if (!mRT->deferredScreen.allocate(resX, resY, deferredScreenFormat, true)) return false; if (!addDeferredAttachments(mRT->deferredScreen)) return false; - GLuint screenFormat = hdr ? GL_RGBA16F : GL_RGBA; + GLuint screenFormat = GL_RGBA16F; + if(!hdr && !mHDRDisplay && MPColorPrecision == 1) screenFormat = GL_RGB10_A2; if (!mRT->screen.allocate(resX, resY, GL_RGBA16F)) return false; mRT->deferredScreen.shareDepthBuffer(mRT->screen); - if (shadow_detail > 0 || ssao || RenderDepthOfField) + if (hdr || shadow_detail > 0 || ssao || RenderDepthOfField) { //only need mRT->deferredLight for shadows OR ssao OR dof if (!mRT->deferredLight.allocate(resX, resY, screenFormat)) return false; } @@ -870,13 +903,17 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY) mRT->deferredLight.release(); } - allocateShadowBuffer(resX, resY); + //allocateShadowBuffer(resX, resY); + if(type_ == 0) allocateShadowBuffer(SHADOWS_RESX, SHADOWS_RESY); if (!gCubeSnapshot) // hack to not re-allocate various targets for cube snapshots { + GLuint UIFormat = GL_RGBA8; + //if(mHDRDisplay && MPColorPrecision == 2) UIFormat = GL_RGBA16F; + if (RenderUIBuffer) { - if (!mUIScreen.allocate(resX, resY, GL_RGBA)) + if (!mUIScreen.allocate(resX, resY, UIFormat)) { return false; } @@ -884,10 +921,16 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY) if (RenderFSAAType > 0) { - if (!mFXAAMap.allocate(resX, resY, GL_RGBA)) return false; + GLuint AAFormat = GL_RGBA8; + if(mHDRDisplay && MPColorPrecision != 1) + { + AAFormat = GL_RGBA16F; + } + + if (!mFXAAMap.allocate(resX, resY, AAFormat)) return false; if (RenderFSAAType == 2) { - if (!mSMAABlendBuffer.allocate(resX, resY, GL_RGBA, false)) return false; + if (!mSMAABlendBuffer.allocate(resX, resY, AAFormat, false)) return false; } } else @@ -896,19 +939,36 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY) mSMAABlendBuffer.release(); } + //mDummyRT.allocate(8, 8, GL_RGBA8, false); + //water reflection texture (always needed as scratch space whether or not transparent water is enabled) mWaterDis.allocate(resX, resY, screenFormat, true); if(RenderScreenSpaceReflections) { - mSceneMap.allocate(resX, resY, screenFormat, true); + //mSceneMap.allocate(resX, resY, screenFormat, true); + //We plan a setting. For now e go with a reasonable value + mSceneMap.allocate(512, 512, screenFormat, true); } else { mSceneMap.release(); } - mPostMap.allocate(resX, resY, screenFormat); +/* + mPostPingMap.allocate(resX, resY, GL_RGBA); + mPostPongMap.allocate(resX, resY, GL_RGBA); +*/ + if((hdr && MPColorPrecision == 2) || mHDRDisplay) + { + mPostMaps[0].allocate(resX, resY, screenFormat); + mPostMaps[1].allocate(resX, resY, screenFormat); + } + else + { + mPostMaps[0].allocate(resX, resY, GL_RGBA); + mPostMaps[1].allocate(resX, resY, GL_RGBA); + } // The water exclusion mask needs its own depth buffer so we can take care of the problem of multiple water planes. // Should we ever make water not just a plane, it also aids with that as well as the water planes will be rendered into the mask. @@ -921,9 +981,9 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY) // used to scale down textures // See LLViwerTextureList::updateImagesCreateTextures and LLImageGL::scaleDown - mDownResMap.allocate(1024, 1024, GL_RGBA); + mDownResMap.allocate(1024, 1024, GL_RGBA8); - mBakeMap.allocate(LLAvatarAppearanceDefines::SCRATCH_TEX_WIDTH, LLAvatarAppearanceDefines::SCRATCH_TEX_HEIGHT, GL_RGBA); + mBakeMap.allocate(LLAvatarAppearanceDefines::SCRATCH_TEX_WIDTH, LLAvatarAppearanceDefines::SCRATCH_TEX_HEIGHT, GL_RGBA8); } //HACK make screenbuffer allocations start failing after 30 seconds if (gSavedSettings.getBOOL("SimulateFBOFailure")) @@ -933,7 +993,7 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY) gGL.getTexUnit(0)->disable(); - stop_glerror(); + LOG_GLERROR("LLPipeline::allocateScreenBufferInternal end"); return true; } @@ -946,16 +1006,19 @@ bool LLPipeline::allocateShadowBuffer(U32 resX, U32 resY) LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY; S32 shadow_detail = RenderShadowDetail; - F32 scale = gCubeSnapshot ? 1.0f : llmax(0.f, RenderShadowResolutionScale); // Don't scale probe shadow maps - U32 sun_shadow_map_width = BlurHappySize(resX, scale); - U32 sun_shadow_map_height = BlurHappySize(resY, scale); + F32 scale = gCubeSnapshot ? 1.0f : llmax(0.5f, RenderShadowResolutionScale); // Don't scale probe shadow maps + //U32 sun_shadow_map_width = BlurHappySize(resX, scale); + //U32 sun_shadow_map_height = BlurHappySize(resY, scale); + U32 sun_shadow_map_width = resX * scale; + U32 sun_shadow_map_height = resY * scale; - if (shadow_detail > 0) + if (shadow_detail > 0 && shadow_detail < 3) { //allocate 4 sun shadow maps for (U32 i = 0; i < 4; i++) { - if (!mRT->shadow[i].allocate(sun_shadow_map_width, sun_shadow_map_height, 0, true)) + if (!mRT->shadow[i].allocate(sun_shadow_map_width, sun_shadow_map_height, 0, true, LLTexUnit::TT_TEXTURE, LLTexUnit::TMG_NONE)) { + LL_WARNS() << "failed allocating shadow buffer " << i << " w:" << sun_shadow_map_width << " h:" << sun_shadow_map_height << LL_ENDL; return false; } } @@ -1055,7 +1118,7 @@ void LLPipeline::refreshCachedSettings() RenderDeferred = true; // DEPRECATED -- gSavedSettings.getBOOL("RenderDeferred"); RenderDeferredSunWash = gSavedSettings.getF32("RenderDeferredSunWash"); RenderFSAAType = gSavedSettings.getU32("RenderFSAAType"); - RenderResolutionDivisor = gSavedSettings.getU32("RenderResolutionDivisor"); + RenderResolutionDivisor = gSavedSettings.getF32("RenderResolutionDivisor"); RenderUIBuffer = gSavedSettings.getBOOL("RenderUIBuffer"); RenderShadowDetail = gSavedSettings.getS32("RenderShadowDetail"); RenderShadowSplits = gSavedSettings.getS32("RenderShadowSplits"); @@ -1131,6 +1194,7 @@ void LLPipeline::refreshCachedSettings() RenderMirrors = gSavedSettings.getBOOL("RenderMirrors"); RenderHeroProbeUpdateRate = gSavedSettings.getS32("RenderHeroProbeUpdateRate"); RenderHeroProbeConservativeUpdateMultiplier = gSavedSettings.getS32("RenderHeroProbeConservativeUpdateMultiplier"); + RenderAvatarCloth = gSavedSettings.getBOOL("RenderAvatarCloth"); sReflectionProbesEnabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderReflectionsEnabled") && gSavedSettings.getBOOL("RenderReflectionsEnabled"); RenderSpotLight = nullptr; @@ -1148,6 +1212,13 @@ void LLPipeline::releaseGLBuffers() { assertInitialized(); + mBloomMap.release(); + + for (U32 i = 0; i < 2; i++) + { + mBloomBlur[i].release(); + } + if (mNoiseMap) { LLImageGL::deleteTextures(1, &mNoiseMap); @@ -1172,6 +1243,8 @@ void LLPipeline::releaseGLBuffers() mSMAASearchMap = 0; } + //mDummyRT.release(); + releaseLUTBuffers(); mWaterDis.release(); @@ -1180,7 +1253,12 @@ void LLPipeline::releaseGLBuffers() mWaterExclusionMask.release(); - mPostMap.release(); +/* + mPostPingMap.release(); + mPostPongMap.release(); +*/ + mPostMaps[0].release(); + mPostMaps[1].release(); mFXAAMap.release(); @@ -1268,26 +1346,38 @@ void LLPipeline::releaseSpotShadowTargets() void LLPipeline::createGLBuffers() { LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; - stop_glerror(); + LOG_GLERROR("LLPipeline::createGLBuffers()"); assertInitialized(); - stop_glerror(); - GLuint resX = gViewerWindow->getWorldViewWidthRaw(); GLuint resY = gViewerWindow->getWorldViewHeightRaw(); // allocate screen space glow buffers const U32 glow_res = llmax(1, llmin(512, 1 << gSavedSettings.getS32("RenderGlowResolutionPow"))); const bool glow_hdr = gSavedSettings.getBOOL("RenderGlowHDR"); - const U32 glow_color_fmt = glow_hdr ? GL_RGBA16F : GL_RGBA; + static LLCachedControl<U32> MPColorPrecision(gSavedSettings, "MPColorPrecision", 0); + + U32 glow_color_fmt = glow_hdr ? GL_RGBA16F : GL_RGBA8; + if(MPColorPrecision == 2) glow_color_fmt = GL_RGBA16F; + for (U32 i = 0; i < 3; i++) { mGlow[i].allocate(512, glow_res, glow_color_fmt); } + mBloomMap.allocate(512, 256, glow_color_fmt); + + for (U32 i = 0; i < 2; i++) + { + mBloomBlur[i].allocate(512, 256, glow_color_fmt); + } + allocateScreenBuffer(resX, resY); - mRT->width = 0; - mRT->height = 0; + // Do not zero out mRT dimensions here. allocateScreenBuffer() above + // already sets the correct dimensions. Zeroing them caused resizeShadowTexture() + // to fail if called immediately after createGLBuffers (e.g., post graphics change). + // mRT->width = 0; + // mRT->height = 0; if (!mNoiseMap) @@ -1306,7 +1396,7 @@ void LLPipeline::createGLBuffers() LLImageGL::generateTextures(1, &mNoiseMap); gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mNoiseMap); - LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGB16F, noiseRes, noiseRes, GL_RGB, GL_FLOAT, noise, false); + LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGB8, noiseRes, noiseRes, GL_RGB, GL_UNSIGNED_INT, noise, false); gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT); } @@ -1321,7 +1411,7 @@ void LLPipeline::createGLBuffers() LLImageGL::generateTextures(1, &mTrueNoiseMap); gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mTrueNoiseMap); - LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGB16F, noiseRes, noiseRes, GL_RGB,GL_FLOAT, noise, false); + LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGB16F, noiseRes, noiseRes, GL_RGB, GL_FLOAT, noise, false); gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT); } @@ -1390,7 +1480,7 @@ void LLPipeline::createGLBuffers() gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mSMAASampleMap); LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGB, raw_image->getWidth(), raw_image->getHeight(), format, GL_UNSIGNED_BYTE, raw_image->getData(), false); - stop_glerror(); + LOG_GLERROR("LLPipeline::createGLBuffers after setManualImage"); gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR); gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); } @@ -1412,7 +1502,18 @@ void LLPipeline::createLUTBuffers() { U32 lightResX = gSavedSettings.getU32("RenderSpecularResX"); U32 lightResY = gSavedSettings.getU32("RenderSpecularResY"); - F32* ls = new F32[lightResX*lightResY]; + F32* ls = nullptr; + try + { + ls = new F32[lightResX*lightResY]; + } + catch (std::bad_alloc&) + { + LLError::LLUserWarningMsg::showOutOfMemory(); + // might be better to set the error into mFatalMessage and rethrow + LL_ERRS() << "Bad memory allocation in createLUTBuffers! lightResX: " + << lightResX << " lightResY: " << lightResY << LL_ENDL; + } F32 specExp = gSavedSettings.getF32("RenderSpecularExponent"); // Calculate the (normalized) blinn-phong specular lookup texture. (with a few tweaks) for (U32 y = 0; y < lightResY; ++y) @@ -1439,11 +1540,7 @@ void LLPipeline::createLUTBuffers() } U32 pix_format = GL_R16F; -#if LL_DARWIN - // Need to work around limited precision with 10.6.8 and older drivers - // - pix_format = GL_R32F; -#endif + LLImageGL::generateTextures(1, &mLightFunc); gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mLightFunc); LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, pix_format, lightResX, lightResY, GL_RED, GL_FLOAT, ls, false); @@ -1456,7 +1553,7 @@ void LLPipeline::createLUTBuffers() } mPbrBrdfLut.allocate(512, 512, GL_RG16F); - mPbrBrdfLut.bindTarget(); + mPbrBrdfLut.bindTarget("mPbrBrdfLut", 1); if (gDeferredGenBrdfLutProgram.isComplete()) { @@ -1480,7 +1577,7 @@ void LLPipeline::createLUTBuffers() mPbrBrdfLut.flush(); mExposureMap.allocate(1, 1, GL_R16F); - mExposureMap.bindTarget(); + mExposureMap.bindTarget("mExposureMap", 1); glClearColor(1, 1, 1, 0); mExposureMap.clear(); glClearColor(0, 0, 0, 0); @@ -2511,7 +2608,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result) gSky.mVOSkyp->mDrawable->setVisible(camera); sCull->pushDrawable(gSky.mVOSkyp->mDrawable); gSky.updateCull(); - stop_glerror(); + LOG_GLERROR("LLPipeline::updateCull sky"); } if (hasRenderType(LLPipeline::RENDER_TYPE_WL_SKY) && @@ -2521,6 +2618,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result) { gSky.mVOWLSkyp->mDrawable->setVisible(camera); sCull->pushDrawable(gSky.mVOWLSkyp->mDrawable); + LOG_GLERROR("LLPipeline::updateCull pushDrawable"); } } @@ -2673,6 +2771,8 @@ void LLPipeline::doOcclusion(LLCamera& camera) gGL.setColorMask(true, true); } + + LOG_GLERROR("LLPipeline::doOcclusion()"); } bool LLPipeline::updateDrawableGeom(LLDrawable* drawablep) @@ -2842,6 +2942,7 @@ void LLPipeline::updateGeom(F32 max_dtime) } updateMovedList(mMovedBridge); + LOG_GLERROR("LLPipeline::updateGeom()"); } void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera) @@ -2932,7 +3033,7 @@ void LLPipeline::markMoved(LLDrawable *drawablep, bool damped_motion) void LLPipeline::markShift(LLDrawable *drawablep) { - if (!drawablep || drawablep->isDead()) + if (!drawablep || drawablep->isDead() || !drawablep->getVObj()) { return; } @@ -2966,7 +3067,7 @@ void LLPipeline::shiftObjects(const LLVector3 &offset) iter != mShiftList.end(); iter++) { LLDrawable *drawablep = *iter; - if (drawablep->isDead()) + if (drawablep->isDead() || !drawablep->getVObj()) { continue; } @@ -3840,6 +3941,8 @@ void render_hud_elements() } gUIProgram.unbind(); + + LOG_GLERROR("LLPipeline::render_hud_elements()"); } static inline void bindHighlightProgram(LLGLSLShader& program) @@ -3944,6 +4047,8 @@ void LLPipeline::renderHighlights() unbindHighlightProgram(gHighlightSpecularProgram); } } + + LOG_GLERROR("LLPipeline::renderHighlights()"); } //debug use @@ -3953,16 +4058,15 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion) { LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderGeomDeferred"); LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL; //LL_RECORD_BLOCK_TIME(FTM_RENDER_GEOMETRY); + LL_RECORD_BLOCK_TIME(FTM_RENDER_GEOMETRY); LL_PROFILE_GPU_ZONE("renderGeomDeferred"); llassert(!sRenderingHUDs); -#if GL_VERSION_1_1 if (gUseWireframe) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } -#endif if (&camera == LLViewerCamera::getInstance()) { // a bit hacky, this is the start of the main render frame, figure out delta between last modelview matrix and @@ -3983,6 +4087,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion) bool occlude = LLPipeline::sUseOcclusion > 1 && do_occlusion && !LLGLSLShader::sProfileEnabled; setupHWLights(); + LOG_GLERROR("LLPipeline::renderGeomDeferred() setupHWLights"); { LL_PROFILE_ZONE_NAMED_CATEGORY_DRAWPOOL("deferred pools"); @@ -4071,7 +4176,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion) } } iter1 = iter2; - stop_glerror(); + LOG_GLERROR(""); } gGLLastMatrix = NULL; @@ -4082,27 +4187,102 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion) } // Tracy ZoneScoped -#if GL_VERSION_1_1 if (gUseWireframe) { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } -#endif } +// Render the geometry for the attached huds +// This fixes the slow down due to attached huds +void LLPipeline::renderGeomPostDeferredOnlyHud(LLCamera& camera) +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL; + LL_PROFILE_GPU_ZONE("renderGeomPostDeferred"); + LL_RECORD_BLOCK_TIME(FTM_RENDER_DEFERRED); + + U32 cur_type = 0; + + LLGLEnable cull(GL_CULL_FACE); + + gGL.setSceneBlendType(LLRender::BT_ALPHA); + gGL.setColorMask(true, false); + + pool_set_t::iterator iter1 = mPools.begin(); + + while ( iter1 != mPools.end() ) + { + LLDrawPool *poolp = *iter1; + + cur_type = poolp->getType(); + + pool_set_t::iterator iter2 = iter1; + if (hasRenderType(poolp->getType()) && poolp->getNumPostDeferredPasses() > 0) + { + LL_PROFILE_ZONE_NAMED_CATEGORY_DRAWPOOL("deferred poolrender"); + + gGLLastMatrix = NULL; + gGL.loadMatrix(gGLModelView); + + for( S32 i = 0; i < poolp->getNumPostDeferredPasses(); i++ ) + { + LLVertexBuffer::unbind(); + poolp->beginPostDeferredPass(i); + for (iter2 = iter1; iter2 != mPools.end(); iter2++) + { + LLDrawPool *p = *iter2; + if (p->getType() != cur_type) + { + break; + } + + p->renderPostDeferred(i); + } + poolp->endPostDeferredPass(i); + LLVertexBuffer::unbind(); + + if (gDebugGL || gDebugPipeline) + { + LLGLState::checkStates(GL_FALSE); + } + } + } + else + { + // Skip all pools of this type + for (iter2 = iter1; iter2 != mPools.end(); iter2++) + { + LLDrawPool *p = *iter2; + if (p->getType() != cur_type) + { + break; + } + } + } + iter1 = iter2; + LOG_GLERROR("after pools"); + } + + gGLLastMatrix = NULL; + gGL.matrixMode(LLRender::MM_MODELVIEW); + gGL.loadMatrix(gGLModelView); + + LOG_GLERROR("LLPipeline::renderGeomPostDeferredOnlyHud()"); +} + + // Render all of our geometry that's required after our deferred pass. // This is gonna be stuff like alpha, water, etc. void LLPipeline::renderGeomPostDeferred(LLCamera& camera) { LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL; LL_PROFILE_GPU_ZONE("renderGeomPostDeferred"); + LL_RECORD_BLOCK_TIME(FTM_RENDER_DEFERRED); -#if GL_VERSION_1_1 if (gUseWireframe) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } -#endif U32 cur_type = 0; @@ -4126,8 +4306,11 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera) // do water haze just before pre water alpha U32 water_haze_pass = LLDrawPool::POOL_ALPHA_PRE_WATER; + if(!done_atmospherics) + { calcNearbyLights(camera); setupHWLights(); + } gGL.setSceneBlendType(LLRender::BT_ALPHA); gGL.setColorMask(true, false); @@ -4214,7 +4397,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera) } } iter1 = iter2; - stop_glerror(); + LOG_GLERROR("after pools"); } gGLLastMatrix = NULL; @@ -4230,12 +4413,12 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera) renderDebug(); } -#if GL_VERSION_1_1 if (gUseWireframe) { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } -#endif + + LOG_GLERROR("LLPipeline::renderGeomPostDeferred()"); } void LLPipeline::renderGeomShadow(LLCamera& camera) @@ -4295,11 +4478,12 @@ void LLPipeline::renderGeomShadow(LLCamera& camera) } } iter1 = iter2; - stop_glerror(); + LOG_GLERROR(""); } gGLLastMatrix = NULL; gGL.loadMatrix(gGLModelView); + LOG_GLERROR("LLPipeline::renderGeomShadow()"); } @@ -4328,11 +4512,9 @@ void LLPipeline::renderPhysicsDisplay() gGL.flush(); gDebugProgram.bind(); -#if GL_VERSION_1_1 - LLGLEnable(GL_POLYGON_OFFSET_LINE); -#endif + LLGLEnable polygon_offset_line(GL_POLYGON_OFFSET_LINE); glPolygonOffset(3.f, 3.f); - glLineWidth(3.f); + //glLineWidth(3.f); LLGLEnable blend(GL_BLEND); gGL.setSceneBlendType(LLRender::BT_ALPHA); @@ -4346,12 +4528,10 @@ void LLPipeline::renderPhysicsDisplay() bool wireframe = (pass == 2); -#if GL_VERSION_1_1 if (wireframe) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } -#endif for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); iter != LLWorld::getInstance()->getRegionList().end(); ++iter) @@ -4371,14 +4551,12 @@ void LLPipeline::renderPhysicsDisplay() } gGL.flush(); -#if GL_VERSION_1_1 if (wireframe) { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } -#endif } - glLineWidth(1.f); + //glLineWidth(1.f); gDebugProgram.unbind(); } @@ -4456,16 +4634,14 @@ void LLPipeline::renderDebug() glClearColor(clearColor.mV[0],clearColor.mV[1],clearColor.mV[2],0); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); // no stencil -- deprecated | GL_STENCIL_BUFFER_BIT); gGL.setColorMask(true, false); -#if GL_VERSION_1_1 glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); -#endif } //NavMesh if ( pathfindingConsole->isRenderNavMesh() ) { gGL.flush(); - glLineWidth(2.0f); + //glLineWidth(2.0f); LLGLEnable cull(GL_CULL_FACE); LLGLDisable blend(GL_BLEND); @@ -4488,10 +4664,8 @@ void LLPipeline::renderDebug() gPathfindingProgram.bind(); gGL.flush(); -#if GL_VERSION_1_1 glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); -#endif - glLineWidth(1.0f); + //glLineWidth(1.0f); gGL.flush(); } //User designated path @@ -4547,9 +4721,7 @@ void LLPipeline::renderDebug() LLGLDisable cull(i >= 2 ? GL_CULL_FACE : 0); gGL.flush(); -#if GL_VERSION_1_1 glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); -#endif //get rid of some z-fighting LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL); @@ -4574,10 +4746,8 @@ void LLPipeline::renderDebug() gGL.flush(); } -#if GL_VERSION_1_1 LLGLEnable lineOffset(GL_POLYGON_OFFSET_LINE); glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); -#endif F32 offset = gSavedSettings.getF32("PathfindingLineOffset"); @@ -4597,14 +4767,10 @@ void LLPipeline::renderDebug() } else { -#if GL_VERSION_1_1 glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); -#endif gPathfindingProgram.uniform1f(sAmbiance, ambiance); llPathingLibInstance->renderNavMeshShapesVBO( render_order[i] ); -#if GL_VERSION_1_1 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); -#endif } } @@ -4614,16 +4780,14 @@ void LLPipeline::renderDebug() gPathfindingProgram.uniform1f(sTint, 1.f); gPathfindingProgram.uniform1f(sAlphaScale, 1.f); - glLineWidth(gSavedSettings.getF32("PathfindingLineWidth")); + //glLineWidth(gSavedSettings.getF32("PathfindingLineWidth")); LLGLDisable blendOut(GL_BLEND); llPathingLibInstance->renderNavMeshShapesVBO( render_order[i] ); gGL.flush(); - glLineWidth(1.f); + //glLineWidth(1.f); } -#if GL_VERSION_1_1 glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); -#endif } } } @@ -4634,9 +4798,7 @@ void LLPipeline::renderDebug() { //render navmesh xray F32 ambiance = gSavedSettings.getF32("PathfindingAmbiance"); -#if GL_VERSION_1_1 LLGLEnable lineOffset(GL_POLYGON_OFFSET_LINE); -#endif LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL); F32 offset = gSavedSettings.getF32("PathfindingLineOffset"); @@ -4645,7 +4807,7 @@ void LLPipeline::renderDebug() LLGLEnable blend(GL_BLEND); LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER); gGL.flush(); - glLineWidth(2.0f); + //glLineWidth(2.0f); LLGLEnable cull(GL_CULL_FACE); gPathfindingProgram.uniform1f(sTint, gSavedSettings.getF32("PathfindingXRayTint")); @@ -4653,14 +4815,10 @@ void LLPipeline::renderDebug() if (gSavedSettings.getBOOL("PathfindingXRayWireframe")) { //draw hidden wireframe as darker and less opaque -#if GL_VERSION_1_1 glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); -#endif gPathfindingProgram.uniform1f(sAmbiance, 1.f); llPathingLibInstance->renderNavMesh(); -#if GL_VERSION_1_1 glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); -#endif } else { @@ -4676,7 +4834,7 @@ void LLPipeline::renderDebug() gPathfindingProgram.bind(); gGL.flush(); - glLineWidth(1.0f); + //glLineWidth(1.0f); } glPolygonOffset(0.f, 0.f); @@ -4700,9 +4858,7 @@ void LLPipeline::renderDebug() gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep, true); -#if GL_VERSION_1_1 glPointSize(8.f); -#endif LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS); gGL.begin(LLRender::POINTS); @@ -4727,9 +4883,7 @@ void LLPipeline::renderDebug() } gGL.end(); gGL.flush(); -#if GL_VERSION_1_1 glPointSize(1.f); -#endif } // Debug stuff. @@ -4817,12 +4971,11 @@ void LLPipeline::renderDebug() LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("probe debug display"); bindDeferredShader(gReflectionProbeDisplayProgram, NULL); - mScreenTriangleVB->setBuffer(); LLGLEnable blend(GL_BLEND); LLGLDepthTest depth(GL_FALSE); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); unbindDeferredShader(gReflectionProbeDisplayProgram); } @@ -4933,9 +5086,7 @@ void LLPipeline::renderDebug() { //render visible point cloud gGL.flush(); -#if GL_VERSION_1_1 glPointSize(8.f); -#endif gGL.begin(LLRender::POINTS); F32* c = col+i*4; @@ -4949,9 +5100,7 @@ void LLPipeline::renderDebug() gGL.end(); gGL.flush(); -#if GL_VERSION_1_1 glPointSize(1.f); -#endif LLVector3* ext = mShadowExtents[i]; LLVector3 pos = (ext[0]+ext[1])*0.5f; @@ -5777,6 +5926,8 @@ void LLPipeline::setupHWLights() mSunDiffuse.setVec(psky->getSunlightColor()); mMoonDiffuse.setVec(psky->getMoonlightColor()); + if(!mHDRDisplay) + { F32 max_color = llmax(mSunDiffuse.mV[0], mSunDiffuse.mV[1], mSunDiffuse.mV[2]); if (max_color > 1.f) { @@ -5790,6 +5941,7 @@ void LLPipeline::setupHWLights() mMoonDiffuse *= 1.f/max_color; } mMoonDiffuse.clamp(); + } // prevent underlighting from having neither lightsource facing us if (!sun_up && !moon_up) @@ -6815,6 +6967,8 @@ void LLPipeline::resetVertexBuffers(LLDrawable* drawable) facep->clearVertexBuffer(); } } + + LOG_GLERROR("LLPipeline::resetVertexBuffers()"); } void LLPipeline::renderObjects(U32 type, bool texture, bool batch_texture, bool rigged) @@ -6834,6 +6988,7 @@ void LLPipeline::renderObjects(U32 type, bool texture, bool batch_texture, bool gGL.loadMatrix(gGLModelView); gGLLastMatrix = NULL; + LOG_GLERROR("LLPipeline::renderObjects()"); } void LLPipeline::renderGLTFObjects(U32 type, bool texture, bool rigged) @@ -6862,6 +7017,7 @@ void LLPipeline::renderGLTFObjects(U32 type, bool texture, bool rigged) { LL::GLTFSceneManager::instance().render(true, true); } + LOG_GLERROR("LLPipeline::renderGLTFObjects()"); } // Currently only used for shadows -Cosmic,2023-04-19 @@ -6942,6 +7098,7 @@ void LLPipeline::renderAlphaObjects(bool rigged) gGL.loadMatrix(gGLModelView); gGLLastMatrix = NULL; + LOG_GLERROR("LLPipeline::renderAlphaObjects()"); } // Currently only used for shadows -Cosmic,2023-04-19 @@ -6960,6 +7117,7 @@ void LLPipeline::renderMaskedObjects(U32 type, bool texture, bool batch_texture, } gGL.loadMatrix(gGLModelView); gGLLastMatrix = NULL; + LOG_GLERROR("LLPipeline::renderMaskedObjects()"); } // Currently only used for shadows -Cosmic,2023-04-19 @@ -6978,6 +7136,7 @@ void LLPipeline::renderFullbrightMaskedObjects(U32 type, bool texture, bool batc } gGL.loadMatrix(gGLModelView); gGLLastMatrix = NULL; + LOG_GLERROR("LLPipeline::renderFullbrightMaskedObjects()"); } void apply_cube_face_rotation(U32 face) @@ -7040,13 +7199,13 @@ void LLPipeline::bindScreenToTexture() } -static LLTrace::BlockTimerStatHandle FTM_RENDER_BLOOM("Bloom"); +static LLTrace::BlockTimerStatHandle FTM_RENDER_BLOOM("Post processing"); void LLPipeline::visualizeBuffers(LLRenderTarget* src, LLRenderTarget* dst, U32 bufferIndex) { - dst->bindTarget(); + dst->bindTarget("visualizeBuffers", 1); gDeferredBufferVisualProgram.bind(); - gDeferredBufferVisualProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_BILINEAR, bufferIndex); + gDeferredBufferVisualProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT, bufferIndex); static LLStaticHashedString mipLevel("mipLevel"); if (RenderBufferVisualization != 4) @@ -7054,8 +7213,7 @@ void LLPipeline::visualizeBuffers(LLRenderTarget* src, LLRenderTarget* dst, U32 else gDeferredBufferVisualProgram.uniform1f(mipLevel, 8); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); gDeferredBufferVisualProgram.unbind(); dst->flush(); } @@ -7066,7 +7224,8 @@ void LLPipeline::generateLuminance(LLRenderTarget* src, LLRenderTarget* dst) { LL_PROFILE_GPU_ZONE("luminance sample"); - dst->bindTarget(); + dst->bindTarget("generateLuminance", 0); + dst->clear(); LLGLDepthTest depth(GL_FALSE, GL_FALSE); @@ -7097,14 +7256,18 @@ void LLPipeline::generateLuminance(LLRenderTarget* src, LLRenderTarget* dst) static LLStaticHashedString diffuse_luminance_scale_s("diffuse_luminance_scale"); gLuminanceProgram.uniform1f(diffuse_luminance_scale_s, diffuse_luminance_scale); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); + + gLuminanceProgram.unbind(); + dst->flush(); // note -- unbind AFTER the glGenerateMipMap so time in generatemipmap can be profiled under "Luminance" // also note -- keep an eye on the performance of glGenerateMipmap, might need to replace it with a mip generation shader - gLuminanceProgram.unbind(); + //gLuminanceProgram.unbind(); } + + LOG_GLERROR("LLPipeline::generateLuminance()"); } void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool use_history) { @@ -7115,17 +7278,15 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool if (use_history) { // copy last frame's exposure into mLastExposure - mLastExposure.bindTarget(); + mLastExposure.bindTarget("mLastExposure", 1); gCopyProgram.bind(); gGL.getTexUnit(0)->bind(dst); - - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); - + renderTriangle(); mLastExposure.flush(); } - dst->bindTarget(); + dst->bindTarget("generateExposure", 1); + dst->clear(); LLGLDepthTest depth(GL_FALSE, GL_FALSE); @@ -7208,27 +7369,33 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool shader->uniform4f(dynamic_exposure_params, dynamic_exposure_coefficient, exp_min, exp_max, dynamic_exposure_speed_error); shader->uniform4f(dynamic_exposure_params2, sky->getHDROffset(should_auto_adjust()), exp_min, exp_max, dynamic_exposure_speed_target); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); if (use_history) { gGL.getTexUnit(channel)->unbind(mLastExposure.getUsage()); } + + //shader->unbindTexture(LLShaderMgr::DEFERRED_DIFFUSE); + //shader->unbindTexture(LLShaderMgr::EXPOSURE_MAP); shader->unbind(); dst->flush(); } + + LOG_GLERROR("LLPipeline::generateExposure()"); } extern LLPointer<LLImageGL> gEXRImage; -void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst) +void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst, bool gamma_correct) { - dst->bindTarget(); +/* + LL_PROFILE_GPU_ZONE("tonemap"); +*/ + + dst->bindTarget("tonemap", 1); // gamma correct lighting { - LL_PROFILE_GPU_ZONE("tonemap"); - static LLCachedControl<bool> buildNoPost(gSavedSettings, "RenderDisablePostProcessing", false); LLGLDepthTest depth(GL_FALSE, GL_FALSE); @@ -7239,18 +7406,34 @@ void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst) LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky(); - bool no_post = gSnapshotNoPost || psky->getReflectionProbeAmbiance(should_auto_adjust) == 0.f || (buildNoPost && gFloaterTools->isAvailable()); - LLGLSLShader& shader = no_post ? gNoPostTonemapProgram : gDeferredPostTonemapProgram; + bool no_post = gSnapshotNoPost || psky->getReflectionProbeAmbiance(should_auto_adjust) == 0.f || (buildNoPost && gFloaterTools && gFloaterTools->isAvailable()); + LLGLSLShader* shader = nullptr; + if(gamma_correct) + { + bool legacy_gamma = psky->getReflectionProbeAmbiance(should_auto_adjust) == 0.f; + if(legacy_gamma) + { + shader = no_post ? &gNoPostTonemapLegacyGammaCorrectProgram : &gDeferredPostTonemapLegacyGammaCorrectProgram; + } + else + { + shader = no_post ? &gNoPostTonemapGammaCorrectProgram : &gDeferredPostTonemapGammaCorrectProgram; + } + } + else + { + shader = no_post ? &gNoPostTonemapProgram : &gDeferredPostTonemapProgram; + } - shader.bind(); + shader->bind(); - S32 channel = 0; + //S32 channel = 0; - shader.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT); + shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT); - shader.bindTexture(LLShaderMgr::EXPOSURE_MAP, &mExposureMap); + shader->bindTexture(LLShaderMgr::EXPOSURE_MAP, &mExposureMap); - shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)src->getWidth(), (GLfloat)src->getHeight()); + shader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)src->getWidth(), (GLfloat)src->getHeight()); static LLCachedControl<F32> exposure(gSavedSettings, "RenderExposure", 1.f); @@ -7260,29 +7443,42 @@ void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst) static LLStaticHashedString tonemap_mix("tonemap_mix"); static LLStaticHashedString tonemap_type("tonemap_type"); - shader.uniform1f(s_exposure, e); + shader->uniform1f(s_exposure, e); static LLCachedControl<U32> tonemap_type_setting(gSavedSettings, "RenderTonemapType", 0U); - shader.uniform1i(tonemap_type, tonemap_type_setting); - shader.uniform1f(tonemap_mix, psky->getTonemapMix(should_auto_adjust())); + shader->uniform1i(tonemap_type, tonemap_type_setting); + shader->uniform1f(tonemap_mix, psky->getTonemapMix(should_auto_adjust())); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); +/* gGL.getTexUnit(channel)->unbind(src->getUsage()); - shader.unbind(); +*/ + shader->unbind(); } dst->flush(); + LOG_GLERROR("LLPipeline::tonemap()"); } void LLPipeline::gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst) { + LLGLDepthTest depth(GL_FALSE, GL_FALSE); + +/* + LL_PROFILE_GPU_ZONE("gamma correct"); + dst->bindTarget(); +*/ // gamma correct lighting { +/* + LLGLDepthTest depth(GL_FALSE, GL_FALSE); +*/ + LL_PROFILE_GPU_ZONE("gamma correct"); - LLGLDepthTest depth(GL_FALSE, GL_FALSE); + dst->bindTarget("gammaCorrect", 1); + dst->clear(GL_COLOR_BUFFER_BIT); static LLCachedControl<bool> buildNoPost(gSavedSettings, "RenderDisablePostProcessing", false); static LLCachedControl<bool> should_auto_adjust(gSavedSettings, "RenderSkyAutoAdjustLegacy", false); @@ -7291,16 +7487,29 @@ void LLPipeline::gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst) LLGLSLShader& shader = psky->getReflectionProbeAmbiance(should_auto_adjust) == 0.f ? gLegacyPostGammaCorrectProgram : gDeferredPostGammaCorrectProgram; + static LLCachedControl<F32> mp_hdr_gamma(gSavedSettings, "MPHDRGamma", false); + if(mHDRDisplay) shader = gHDRGammaCorrectProgram; + shader.bind(); shader.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT); - shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)src->getWidth(), (GLfloat)src->getHeight()); + //screensize isn't a uniform in the shader, we comment out for now + //shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)src->getWidth(), (GLfloat)src->getHeight()); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + if(mHDRDisplay) + { + shader.uniform1f(LLShaderMgr::GAMMA, (GLfloat)mp_hdr_gamma); + shader.uniform1f(LLShaderMgr::MP_HDR_BOOST, 1.0); + } + + renderTriangle(); + //shader.unbindTexture(LLShaderMgr::DEFERRED_DIFFUSE); shader.unbind(); + + dst->flush(); } - dst->flush(); + + LOG_GLERROR("LLPipeline::gammaCorrect()"); } void LLPipeline::copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget* dst) @@ -7313,7 +7522,7 @@ void LLPipeline::copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget* LLRenderTarget& depth_src = mRT->deferredScreen; - dst->bindTarget(); + dst->bindTarget("copyScreenSpaceReflections", 1); dst->clear(); gCopyDepthProgram.bind(); @@ -7323,19 +7532,25 @@ void LLPipeline::copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget* gGL.getTexUnit(diff_map)->bind(src); gGL.getTexUnit(depth_map)->bind(&depth_src, true); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); dst->flush(); } + LOG_GLERROR("LLPipeline::copyScreenSpaceReflection()"); } void LLPipeline::generateGlow(LLRenderTarget* src) { + LL_PROFILE_GPU_ZONE("glow generate"); if (sRenderGlow) { LL_PROFILE_GPU_ZONE("glow"); + LL_RECORD_BLOCK_TIME(FTM_RENDER_GLOW); + +/* mGlow[2].bindTarget(); +*/ + mGlow[2].bindTarget("mGlow[2]", 1); mGlow[2].clear(); gGlowExtractProgram.bind(); @@ -7375,14 +7590,13 @@ void LLPipeline::generateGlow(LLRenderTarget* src) gGL.color4f(1, 1, 1, 1); gPipeline.enableLightsFullbright(); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); - + renderTriangle(); + //gGlowExtractProgram.unbindTexture(LLShaderMgr::DIFFUSE_MAP); + gGlowExtractProgram.unbindTexture(LLShaderMgr::GLOW_NOISE_MAP); + gGlowExtractProgram.unbind(); mGlow[2].flush(); } - gGlowExtractProgram.unbind(); - // power of two between 1 and 1024 U32 glowResPow = RenderGlowResolutionPow; const U32 glow_res = llmax(1, llmin(1024, 1 << glowResPow)); @@ -7402,7 +7616,7 @@ void LLPipeline::generateGlow(LLRenderTarget* src) for (S32 i = 0; i < kernel; i++) { - mGlow[i % 2].bindTarget(); + mGlow[i % 2].bindTarget("mGlow[i % 2]", 1); mGlow[i % 2].clear(); if (i == 0) @@ -7423,8 +7637,7 @@ void LLPipeline::generateGlow(LLRenderTarget* src) gGlowProgram.uniform2f(LLShaderMgr::GLOW_DELTA, 0, delta); } - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); mGlow[i % 2].flush(); } @@ -7434,25 +7647,32 @@ void LLPipeline::generateGlow(LLRenderTarget* src) } else // !sRenderGlow, skip the glow ping-pong and just clear the result target { - mGlow[1].bindTarget(); + mGlow[1].bindTarget("mGlow[1]", 1); mGlow[1].clear(); mGlow[1].flush(); } + LOG_GLERROR("LLPipeline::generateGlow()"); } -void LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst) +bool LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst) { - static LLCachedControl<F32> cas_sharpness(gSavedSettings, "RenderCASSharpness", 0.4f); - if (cas_sharpness == 0.0f || !gCASProgram.isComplete()) - { - gPipeline.copyRenderTarget(src, dst); - return; - } + LL_PROFILE_GPU_ZONE("cas"); + + static LLCachedControl<F32> cas_sharpness(gSavedSettings, "RenderCASSharpness", 0.0f); LLGLSLShader* sharpen_shader = &gCASProgram; + static LLCachedControl<bool> should_auto_adjust(gSavedSettings, "RenderSkyAutoAdjustLegacy", false); + + LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky(); + bool legacy_gamma = psky->getReflectionProbeAmbiance(should_auto_adjust) == 0.f; + if(legacy_gamma) + { + sharpen_shader = &gCASLegacyGammaProgram; + } // Bind setup: - dst->bindTarget(); + dst->bindTarget("applyCAS", 1); + dst->clear(); sharpen_shader->bind(); @@ -7474,32 +7694,67 @@ void LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst) sharpen_shader->uniform2f(out_screen_res, (AF1)dst->getWidth(), (AF1)dst->getHeight()); } - sharpen_shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT); - - // Draw - gPipeline.mScreenTriangleVB->setBuffer(); - gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); - + S32 channel = sharpen_shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT); + renderTriangle(); + //sharpen_shader->unbindTexture(channel); sharpen_shader->unbind(); dst->flush(); + + return true; +} + +bool LLPipeline::generateFXAABuffer(LLRenderTarget* src) +{ + llassert(!gCubeSnapshot); + bool multisample = RenderFSAAType == 1 && gFXAAProgram[0].isComplete() && mFXAAMap.isComplete(); + + if(!multisample) return false; + + LL_PROFILE_GPU_ZONE("aa"); + + // bake out texture2D with RGBL for FXAA shader + mFXAAMap.bindTarget("applyFXAA", 1); + mFXAAMap.clear(GL_COLOR_BUFFER_BIT); + + LLGLSLShader* shader = &gGlowCombineFXAAProgram; + shader->bind(); + + S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage()); + if (channel > -1) + { + src->bindTexture(0, channel, LLTexUnit::TFO_BILINEAR); + } + + { + LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS); + renderTriangle(); + } + + //shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage()); + shader->unbind(); + + mFXAAMap.flush(); + + return true; } -void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst) +bool LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst) { + LL_PROFILE_GPU_ZONE("FXAA"); { llassert(!gCubeSnapshot); bool multisample = RenderFSAAType == 1 && gFXAAProgram[0].isComplete() && mFXAAMap.isComplete(); - // Present everything. - if (multisample) + if(!multisample) return false; + { LL_PROFILE_GPU_ZONE("aa"); S32 width = dst->getWidth(); S32 height = dst->getHeight(); // bake out texture2D with RGBL for FXAA shader - mFXAAMap.bindTarget(); + mFXAAMap.bindTarget("applyFXAA", 1); mFXAAMap.clear(GL_COLOR_BUFFER_BIT); LLGLSLShader* shader = &gGlowCombineFXAAProgram; @@ -7513,8 +7768,7 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst) { LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); } shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage()); @@ -7522,7 +7776,8 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst) mFXAAMap.flush(); - dst->bindTarget(); + dst->bindTarget("applyFXAA", 1); + dst->clear(); static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U); U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U); @@ -7536,12 +7791,14 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst) mFXAAMap.bindTexture(0, channel, LLTexUnit::TFO_BILINEAR); } + /* gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft; gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom; gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth(); gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight(); glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]); + */ F32 scale_x = (F32)width / mFXAAMap.getWidth(); F32 scale_y = (F32)height / mFXAAMap.getHeight(); @@ -7557,28 +7814,34 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst) S32 depth_channel = shader->getTextureChannel(LLShaderMgr::DEFERRED_DEPTH); gGL.getTexUnit(depth_channel)->bind(&mRT->deferredScreen, true); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); + } + + if (channel > -1) + { + shader->unbindTexture(channel); } shader->unbind(); dst->flush(); } - else { - copyRenderTarget(src, dst); - } } + + return true; } -void LLPipeline::generateSMAABuffers(LLRenderTarget* src) +bool LLPipeline::generateSMAABuffers(LLRenderTarget* src) { llassert(!gCubeSnapshot); - bool multisample = RenderFSAAType == 2 && gSMAAEdgeDetectProgram[0].isComplete() && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete(); + if(RenderFSAAType < 2) return false; + bool multisample = gSMAAEdgeDetectProgram[0].isComplete() && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete(); + + if(!multisample) return false; // Present everything. if (multisample) { - LL_PROFILE_GPU_ZONE("aa"); + LL_PROFILE_GPU_ZONE("SMAA Edge"); static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U); U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U); @@ -7598,50 +7861,44 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src) LLRenderTarget& dest = mFXAAMap; LLGLSLShader& edge_shader = gSMAAEdgeDetectProgram[fsaa_quality]; - dest.bindTarget(); + dest.bindTarget("generateSMAABuffers", 1); dest.clear(GL_COLOR_BUFFER_BIT); edge_shader.bind(); edge_shader.uniform4fv(sSmaaRTMetrics, 1, rt_metrics); - S32 channel = edge_shader.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage()); + S32 channel = edge_shader.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE); + if (channel > -1) { if (!use_sample) { - src->bindTexture(0, channel, LLTexUnit::TFO_POINT); + src->bindTexture(0, channel, LLTexUnit::TFO_BILINEAR); gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); } else { gGL.getTexUnit(channel)->bindManual(LLTexUnit::TT_TEXTURE, mSMAASampleMap); gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); + gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR); } + gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); } - //if (use_stencil) - //{ - // glStencilFunc(GL_ALWAYS, 1, 0xFF); - // glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); - // glStencilMask(0xFF); - //} - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); + edge_shader.unbindTexture(LLShaderMgr::DEFERRED_DIFFUSE); + gGL.getTexUnit(channel)->unbindFast(LLTexUnit::TT_TEXTURE); edge_shader.unbind(); dest.flush(); - - gGL.getTexUnit(channel)->unbindFast(LLTexUnit::TT_TEXTURE); } { - //LLGLState stencil(GL_STENCIL_TEST, use_stencil); - // Bind setup: LLRenderTarget& dest = mSMAABlendBuffer; LLGLSLShader& blend_weights_shader = gSMAABlendWeightsProgram[fsaa_quality]; - dest.bindTarget(); + dest.bindTarget("mSMAABlendBuffer", 1); dest.clear(GL_COLOR_BUFFER_BIT); blend_weights_shader.bind(); @@ -7668,17 +7925,8 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src) gGL.getTexUnit(search_tex_channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); } - //if (use_stencil) - //{ - // glStencilFunc(GL_EQUAL, 1, 0xFF); - // glStencilMask(0x00); - //} - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); - //if (use_stencil) - //{ - // glStencilFunc(GL_ALWAYS, 0, 0xFF); - //} + renderTriangle(); + blend_weights_shader.unbind(); dest.flush(); gGL.getTexUnit(edge_tex_channel)->unbindFast(LLTexUnit::TT_TEXTURE); @@ -7686,17 +7934,27 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src) gGL.getTexUnit(search_tex_channel)->unbindFast(LLTexUnit::TT_TEXTURE); } } + + LOG_GLERROR("LLPipeline::generateSMAABuffers()"); + + return true; } -void LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst) +bool LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst) { + LL_PROFILE_GPU_ZONE("SMAA"); llassert(!gCubeSnapshot); - bool multisample = RenderFSAAType == 2 && gSMAAEdgeDetectProgram[0].isComplete() && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete(); - // Present everything. - if (multisample) + bool multisample = false; + + if(RenderFSAAType > 1) + { + multisample = gSMAAEdgeDetectProgram[0].isComplete() && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete(); + } + + if(!multisample) return false; + { - LL_PROFILE_GPU_ZONE("aa"); static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U); U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U); @@ -7708,16 +7966,13 @@ void LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst) LLGLDepthTest depth(GL_FALSE, GL_FALSE); static LLCachedControl<bool> use_sample(gSavedSettings, "RenderSMAAUseSample", false); - //static LLCachedControl<bool> use_stencil(gSavedSettings, "RenderSMAAUseStencil", true); { - //LLGLDisable stencil(GL_STENCIL_TEST); - // Bind setup: LLRenderTarget* bound_target = dst; LLGLSLShader& blend_shader = gSMAANeighborhoodBlendProgram[fsaa_quality]; - bound_target->bindTarget(); + bound_target->bindTarget("applySMAA", 1); bound_target->clear(GL_COLOR_BUFFER_BIT); blend_shader.bind(); @@ -7736,36 +7991,30 @@ void LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst) mSMAABlendBuffer.bindTexture(0, blend_channel, LLTexUnit::TFO_BILINEAR); } - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); - - bound_target->flush(); - blend_shader.unbind(); + renderTriangle(); gGL.getTexUnit(diffuse_channel)->unbindFast(LLTexUnit::TT_TEXTURE); gGL.getTexUnit(blend_channel)->unbindFast(LLTexUnit::TT_TEXTURE); + blend_shader.unbind(); + bound_target->flush(); } } - else - { - copyRenderTarget(src, dst); - } + + LOG_GLERROR("LLPipeline::applySMAA()"); + return true; } void LLPipeline::copyRenderTarget(LLRenderTarget* src, LLRenderTarget* dst) { LL_PROFILE_GPU_ZONE("copyRenderTarget"); - dst->bindTarget(); - + dst->bindTarget("copyRenderTarget", 1); + dst->clear(GL_COLOR_BUFFER_BIT); gDeferredPostNoDoFProgram.bind(); gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src); - gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true); + //gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true); - { - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); - } + renderTriangle(); gDeferredPostNoDoFProgram.unbind(); @@ -7774,9 +8023,13 @@ void LLPipeline::copyRenderTarget(LLRenderTarget* src, LLRenderTarget* dst) void LLPipeline::combineGlow(LLRenderTarget* src, LLRenderTarget* dst) { - // Go ahead and do our glow combine here in our destination. We blit this later into the front buffer. + LL_PROFILE_GPU_ZONE("glow combine"); +/* + // Go ahead and do our glow combine here in our destination. We blit this later into the front buffer. dst->bindTarget(); +*/ + dst->bindTarget("combineGlow", 1); { @@ -7785,26 +8038,28 @@ void LLPipeline::combineGlow(LLRenderTarget* src, LLRenderTarget* dst) gGlowCombineProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src); gGlowCombineProgram.bindTexture(LLShaderMgr::DEFERRED_EMISSIVE, &mGlow[1]); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); } dst->flush(); + LOG_GLERROR("LLPipeline::combineGlow()"); } -void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst) +bool LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst) { + LL_PROFILE_GPU_ZONE("dof"); { bool dof_enabled = (RenderDepthOfFieldInEditMode || !LLToolMgr::getInstance()->inBuildMode()) && RenderDepthOfField && !gCubeSnapshot; + if(!dof_enabled) return false; + gViewerWindow->setup3DViewport(); if (dof_enabled) { - LL_PROFILE_GPU_ZONE("dof"); LLGLDisable blend(GL_BLEND); // depth of field focal plane calculations @@ -7908,7 +8163,7 @@ void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst) F32 magnification = focal_length / (subject_distance - focal_length); { // build diffuse+bloom+CoF - mRT->deferredLight.bindTarget(); + mRT->deferredLight.bindTarget("renderDOF", 1); gDeferredCoFProgram.bind(); @@ -7925,8 +8180,8 @@ void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst) gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF); gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); + gDeferredCoFProgram.unbind(); mRT->deferredLight.flush(); } @@ -7935,7 +8190,7 @@ void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst) U32 dof_height = (U32)(mRT->screen.getHeight() * CameraDoFResScale); { // perform DoF sampling at half-res (preserve alpha channel) - src->bindTarget(); + src->bindTarget("DoF sampling", 1); glViewport(0, 0, dof_width, dof_height); gGL.setColorMask(true, false); @@ -7947,8 +8202,7 @@ void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst) gDeferredPostProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF); gDeferredPostProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); gDeferredPostProgram.unbind(); @@ -7958,7 +8212,7 @@ void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst) { // combine result based on alpha - dst->bindTarget(); + dst->bindTarget("DoF combine", 1); glViewport(0, 0, dst->getWidth(), dst->getHeight()); gDeferredDoFCombineProgram.bind(); @@ -7971,19 +8225,134 @@ void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst) gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_WIDTH, (dof_width - 1) / (F32)src->getWidth()); gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_HEIGHT, (dof_height - 1) / (F32)src->getHeight()); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); - gDeferredDoFCombineProgram.unbind(); + renderTriangle(); + gDeferredDoFCombineProgram.unbind(); dst->flush(); } } - else - { - copyRenderTarget(src, dst); - } } + + return true; +} + +bool LLPipeline::renderBloom(LLRenderTarget* src, LLRenderTarget* dst) +{ + static LLCachedControl<U32> mp_render_bloom(gSavedSettings, "MPRenderBloom", 0); + + if(mp_render_bloom < 1) return false; + + static LLCachedControl<F32> mp_bloom_extract_brightness(gSavedSettings, "MPBloomExtractBrightness", 0.10); + static LLCachedControl<F32> mp_bloom_radius(gSavedSettings, "MPBloomBlurRadius", 1.5); + static LLCachedControl<F32> mp_bloom_radius_add(gSavedSettings, "MPBloomBlurRadiusAdd", 0); + static LLCachedControl<F32> mp_bloom_strength(gSavedSettings, "MPBloomStrength", 1.0); + static LLCachedControl<F32> mp_bloom_metal(gSavedSettings, "MPBloomExtractMetal", 0.2); + static LLCachedControl<F32> mp_bloom_nonmetal(gSavedSettings, "MPBloomExtractNonMetal", 0.2); + + F32 clampValue = 1.0; + if(mHDRDisplay) clampValue = 11.0; + + LLGLDepthTest depth(GL_FALSE, GL_FALSE); + LLGLDisable blend(GL_BLEND); + + mBloomMap.bindTarget("mBloomMap", 1); + + glClearColor(0, 0, 0, 0); + mBloomMap.clear(); + + gBloomExtractProgram.bind(); + gBloomExtractProgram.bindTexture(LLShaderMgr::DIFFUSE_MAP, &mRT->screen); + gBloomExtractProgram.bindTexture(LLShaderMgr::BLOOM_EXTRACT_ORM, &mRT->deferredScreen, false, LLTexUnit::TFO_POINT, 1); + //gBloomExtractProgram.bindTexture(LLShaderMgr::BLOOM_EXTRACT_EMISSIVE, &mGlow[1], false, LLTexUnit::TFO_POINT, 0); + gBloomExtractProgram.bindTexture(LLShaderMgr::BLOOM_EXTRACT_EMISSIVE2, &mRT->deferredScreen, false, LLTexUnit::TFO_POINT, 3); + + gBloomExtractProgram.uniform1f(LLShaderMgr::BLOOM_EXTRACT_BRIGHTNESS, 1.0 - mp_bloom_extract_brightness); + gBloomExtractProgram.uniform1f(LLShaderMgr::BLOOM_EXTRACT_METAL, mp_bloom_metal); + gBloomExtractProgram.uniform1f(LLShaderMgr::BLOOM_EXTRACT_NONMETAL, mp_bloom_nonmetal); + + renderTriangle(); + + gBloomExtractProgram.unbindTexture(LLShaderMgr::DIFFUSE_MAP); + gBloomExtractProgram.unbindTexture(LLShaderMgr::BLOOM_EXTRACT_ORM); + gBloomExtractProgram.unbindTexture(LLShaderMgr::BLOOM_EXTRACT_EMISSIVE); + gBloomExtractProgram.unbindTexture(LLShaderMgr::BLOOM_EXTRACT_EMISSIVE2); + + gBloomExtractProgram.unbind(); + mBloomMap.flush(); + + + // ping pong blur + + S16 horizontal = 1, first_iteration = true; + unsigned int amount = mp_render_bloom; + if(amount > 10) amount = 10; + + F32 radius = mp_bloom_radius; + + gBloomBlurProgram.bind(); + + + // Iteration 0 + + gBloomBlurProgram.uniform1f(LLShaderMgr::BLOOM_BLUR_RADIUS, radius); + + mBloomBlur[0].bindTarget("", 1); + //mBloomBlur[0].clear(); + gBloomBlurProgram.uniform1i( LLShaderMgr::BLOOM_BLURH, 0); + gBloomBlurProgram.bindTexture( LLShaderMgr::BLOOM_EMAP, &mBloomMap); + renderTriangle(); + mBloomBlur[0].flush(); + + mBloomBlur[1].bindTarget("", 1); + gBloomBlurProgram.uniform1i( LLShaderMgr::BLOOM_BLURH, 1); + gBloomBlurProgram.bindTexture( LLShaderMgr::BLOOM_EMAP, &mBloomBlur[0]); + renderTriangle(); + mBloomBlur[1].flush(); + + + // additional iterations + + for (unsigned int i = 1; i < amount; i++) + { + radius += mp_bloom_radius_add; + gBloomBlurProgram.uniform1f(LLShaderMgr::BLOOM_BLUR_RADIUS, radius); + + mBloomBlur[0].bindTarget("", 1); + gBloomBlurProgram.uniform1i( LLShaderMgr::BLOOM_BLURH, 0); + gBloomBlurProgram.bindTexture( LLShaderMgr::BLOOM_EMAP, &mBloomBlur[1]); + renderTriangle(); + mBloomBlur[0].flush(); + + mBloomBlur[1].bindTarget("", 1); + gBloomBlurProgram.uniform1i( LLShaderMgr::BLOOM_BLURH, 1); + gBloomBlurProgram.bindTexture( LLShaderMgr::BLOOM_EMAP, &mBloomBlur[0]); + renderTriangle(); + mBloomBlur[1].flush(); + } + + gBloomBlurProgram.unbindTexture(LLShaderMgr::BLOOM_EMAP); + gBloomBlurProgram.unbind(); + + + // combine + + dst->bindTarget("bloom combine", 1); + //dst->clear(); + + gBloomCombineProgram.bind(); + + gBloomCombineProgram.bindTexture(LLShaderMgr::DIFFUSE_MAP, src); + gBloomCombineProgram.bindTexture(LLShaderMgr::BLOOM_BMAP, &mBloomBlur[1]); + gBloomCombineProgram.uniform1f(LLShaderMgr::BLOOM_STRENGTH, mp_bloom_strength); + gBloomCombineProgram.uniform1f(LLShaderMgr::BLOOM_CLAMP, clampValue); + + renderTriangle(); + + gBloomCombineProgram.unbind(); + dst->flush(); + + return true; } void LLPipeline::renderFinalize() @@ -8002,38 +8371,55 @@ void LLPipeline::renderFinalize() LLGLDisable blend(GL_BLEND); LLGLDisable cull(GL_CULL_FACE); - enableLightsFullbright(); - gGL.setColorMask(true, true); glClearColor(0, 0, 0, 0); static LLCachedControl<bool> has_hdr(gSavedSettings, "RenderHDREnabled", true); bool hdr = gGLManager.mGLVersion > 4.05f && has_hdr(); - if (hdr) + bool apply_cas = false; + static LLCachedControl<F32> cas_sharpness(gSavedSettings, "RenderCASSharpness", 0.0f); + if (cas_sharpness > 0.0f && gCASProgram.isComplete() && gCASLegacyGammaProgram.isComplete() && !mHDRDisplay) apply_cas = true; + + U16 activeRT = 0; + + if (hdr && !mHDRDisplay) { copyScreenSpaceReflections(&mRT->screen, &mSceneMap); generateLuminance(&mRT->screen, &mLuminanceMap); - generateExposure(&mLuminanceMap, &mExposureMap); - tonemap(&mRT->screen, &mPostMap); - - applyCAS(&mPostMap, &mRT->screen); + if (apply_cas) + { + tonemap(&mRT->screen, &mRT->deferredLight, false); + applyCAS(&mRT->deferredLight, &mPostMaps[activeRT]); + } + else + { + tonemap(&mRT->screen, &mPostMaps[activeRT], true); + } + } + else + { + if(mHDRDisplay) copyScreenSpaceReflections(&mRT->screen, &mSceneMap); + gammaCorrect(&mRT->screen, &mPostMaps[activeRT]); } + generateFXAABuffer(&mRT->screen); generateSMAABuffers(&mRT->screen); - gammaCorrect(&mRT->screen, &mPostMap); - - LLVertexBuffer::unbind(); + generateGlow(&mPostMaps[activeRT]); - applySMAA(&mPostMap, &mRT->screen); - - generateGlow(&mRT->screen); + if(hdr) + { + if(renderBloom(&mPostMaps[activeRT], &mPostMaps[1 - activeRT])) + { + activeRT = 1 - activeRT; + } + } - combineGlow(&mRT->screen, &mPostMap); + LLVertexBuffer::unbind(); gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft; gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom; @@ -8041,15 +8427,25 @@ void LLPipeline::renderFinalize() gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight(); glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]); - renderDoF(&mPostMap, &mRT->screen); + combineGlow(&mPostMaps[activeRT], &mPostMaps[1 - activeRT]); + activeRT = 1 - activeRT; + + if(renderDoF(&mPostMaps[activeRT], &mPostMaps[1 - activeRT])) + { + activeRT = 1 - activeRT; + } - LLRenderTarget* finalBuffer = &mRT->screen; - if (RenderFSAAType == 1) + if(applyFXAA(&mPostMaps[activeRT], &mPostMaps[1 - activeRT])) + { + activeRT = 1 - activeRT; + } + else if(applySMAA(&mPostMaps[activeRT], &mPostMaps[1 - activeRT])) { - applyFXAA(&mRT->screen, &mPostMap); - finalBuffer = &mPostMap; + activeRT = 1 - activeRT; } + LLRenderTarget* finalBuffer = &mPostMaps[activeRT]; + if (RenderBufferVisualization > -1) { switch (RenderBufferVisualization) @@ -8079,6 +8475,36 @@ void LLPipeline::renderFinalize() } break; } + case 7: + visualizeBuffers(&mBloomMap, finalBuffer, 0); + break; + case 8: + visualizeBuffers(&mBloomBlur[1], finalBuffer, 0); + break; + case 9: + visualizeBuffers(&mPostMaps[activeRT], finalBuffer, 0); + break; + case 10: + visualizeBuffers(&mGlow[0], finalBuffer, 0); + break; + case 11: + visualizeBuffers(&mGlow[1], finalBuffer, 0); + break; + case 12: + visualizeBuffers(&mGlow[2], finalBuffer, 0); + break; + case 13: + visualizeBuffers(&mSceneMap, finalBuffer, 0); + break; + case 14: + visualizeBuffers(&mRT->screen, finalBuffer, 0); + break; + case 15: + visualizeBuffers(&mRT->deferredLight, finalBuffer, 0); + break; + case 16: + visualizeBuffers(&mPostMaps[1-activeRT], finalBuffer, 0); + break; default: break; } @@ -8096,12 +8522,15 @@ void LLPipeline::renderFinalize() { LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); } + gDeferredPostNoDoFNoiseProgram.unbindTexture(LLShaderMgr::DEFERRED_DIFFUSE); + gDeferredPostNoDoFNoiseProgram.unbindTexture(LLShaderMgr::DEFERRED_DEPTH); gDeferredPostNoDoFNoiseProgram.unbind(); + //gGL.flush(); + gGL.setSceneBlendType(LLRender::BT_ALPHA); if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES)) @@ -8122,6 +8551,7 @@ void LLPipeline::renderFinalize() // flush calls made to "addTrianglesDrawn" so far to stats machinery recordTrianglesDrawn(); + LOG_GLERROR("LLPipeline::renderFinalize()"); } void LLPipeline::bindLightFunc(LLGLSLShader& shader) @@ -8141,6 +8571,8 @@ void LLPipeline::bindLightFunc(LLGLSLShader& shader) void LLPipeline::bindShadowMaps(LLGLSLShader& shader) { + LOG_GLERROR("bindShadowMaps() 1"); + for (U32 i = 0; i < 4; i++) { LLRenderTarget* shadow_target = getSunShadowTarget(i); @@ -8154,15 +8586,20 @@ void LLPipeline::bindShadowMaps(LLGLSLShader& shader) } } - for (U32 i = 4; i < 6; i++) + LOG_GLERROR("bindShadowMaps() 2"); + + if(RenderShadowDetail > 1) { - S32 channel = shader.enableTexture(LLShaderMgr::DEFERRED_SHADOW0 + i); - if (channel > -1) + for (U32 i = 4; i < 6; i++) { - LLRenderTarget* shadow_target = getSpotShadowTarget(i - 4); - if (shadow_target) + S32 channel = shader.enableTexture(LLShaderMgr::DEFERRED_SHADOW0 + i); + if (channel > -1) { - gGL.getTexUnit(channel)->bind(shadow_target, true); + LLRenderTarget* shadow_target = getSpotShadowTarget(i - 4); + if (shadow_target) + { + gGL.getTexUnit(channel)->bind(shadow_target, true); + } } } } @@ -8262,7 +8699,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_ bindLightFunc(shader); - stop_glerror(); + LOG_GLERROR("bindDeferredShader()"); light_target = light_target ? light_target : deferred_light_target; channel = shader.enableTexture(LLShaderMgr::DEFERRED_LIGHT, light_target->getUsage()); @@ -8278,11 +8715,11 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_ } } - stop_glerror(); + LOG_GLERROR("bindDeferredShader() 2"); bindShadowMaps(shader); - stop_glerror(); + LOG_GLERROR("bindDeferredShader() 3"); F32 mat[16*6]; for (U32 i = 0; i < 16; i++) @@ -8297,7 +8734,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_ shader.uniformMatrix4fv(LLShaderMgr::DEFERRED_SHADOW_MATRIX, 6, false, mat); - stop_glerror(); + LOG_GLERROR("bindDeferredShader() 4"); if (!LLPipeline::sReflectionProbesEnabled) { @@ -8323,34 +8760,6 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_ bindReflectionProbes(shader); - if (gAtmosphere) - { - // bind precomputed textures necessary for calculating sun and sky luminance - channel = shader.enableTexture(LLShaderMgr::TRANSMITTANCE_TEX, LLTexUnit::TT_TEXTURE); - if (channel > -1) - { - shader.bindTexture(LLShaderMgr::TRANSMITTANCE_TEX, gAtmosphere->getTransmittance()); - } - - channel = shader.enableTexture(LLShaderMgr::SCATTER_TEX, LLTexUnit::TT_TEXTURE_3D); - if (channel > -1) - { - shader.bindTexture(LLShaderMgr::SCATTER_TEX, gAtmosphere->getScattering()); - } - - channel = shader.enableTexture(LLShaderMgr::SINGLE_MIE_SCATTER_TEX, LLTexUnit::TT_TEXTURE_3D); - if (channel > -1) - { - shader.bindTexture(LLShaderMgr::SINGLE_MIE_SCATTER_TEX, gAtmosphere->getMieScattering()); - } - - channel = shader.enableTexture(LLShaderMgr::ILLUMINANCE_TEX, LLTexUnit::TT_TEXTURE); - if (channel > -1) - { - shader.bindTexture(LLShaderMgr::ILLUMINANCE_TEX, gAtmosphere->getIlluminance()); - } - } - /*if (gCubeSnapshot) { // we only really care about the first two values, but the shader needs increasing separation between clip planes shader.uniform4f(LLShaderMgr::DEFERRED_SHADOW_CLIP, 1.f, 64.f, 128.f, 256.f); @@ -8451,6 +8860,8 @@ void LLPipeline::renderDeferredLighting() return; } + LOG_GLERROR("renderDeferredLighting begin"); + llassert(!sRenderingHUDs); F32 light_scale = 1.f; @@ -8492,10 +8903,10 @@ void LLPipeline::renderDeferredLighting() tc_moon = mat * tc_moon; mTransformedMoonDir.set(tc_moon); - if ((RenderDeferredSSAO && !gCubeSnapshot) || RenderShadowDetail > 0) + if ((RenderDeferredSSAO && !gCubeSnapshot) || (!gCubeSnapshot && RenderShadowDetail > 0 && RenderShadowDetail < 4)) { LL_PROFILE_GPU_ZONE("sun program"); - deferred_light_target->bindTarget(); + deferred_light_target->bindTarget("sun_shader", 1); { // paint shadow/SSAO light map (direct lighting lightmap) LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("renderDeferredLighting - sun shadow"); @@ -8527,7 +8938,7 @@ void LLPipeline::renderDeferredLighting() LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("renderDeferredLighting - soften shadow"); LL_PROFILE_GPU_ZONE("soften shadow"); // blur lightmap - screen_target->bindTarget(); + screen_target->bindTarget("SSAO", 1); glClearColor(1, 1, 1, 1); screen_target->clear(GL_COLOR_BUFFER_BIT); glClearColor(0, 0, 0, 0); @@ -8560,8 +8971,7 @@ void LLPipeline::renderDeferredLighting() { LLGLDisable blend(GL_BLEND); LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); } screen_target->flush(); @@ -8569,21 +8979,20 @@ void LLPipeline::renderDeferredLighting() bindDeferredShader(gDeferredBlurLightProgram, screen_target); - deferred_light_target->bindTarget(); + deferred_light_target->bindTarget("blur light", 1); gDeferredBlurLightProgram.uniform2f(sDelta, 0.f, 1.f); { LLGLDisable blend(GL_BLEND); LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); } deferred_light_target->flush(); unbindDeferredShader(gDeferredBlurLightProgram); } - screen_target->bindTarget(); + screen_target->bindTarget("renderDeferredLighting screen_target", 1); // clear color buffer here - zeroing alpha (glow) is important or it will accumulate against sky glClearColor(0, 0, 0, 0); screen_target->clear(GL_COLOR_BUFFER_BIT); @@ -8616,8 +9025,7 @@ void LLPipeline::renderDeferredLighting() LLGLDisable blend(GL_BLEND); // full screen blit - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); } unbindDeferredShader(gDeferredSoftenProgram); @@ -8833,8 +9241,7 @@ void LLPipeline::renderDeferredLighting() gDeferredMultiLightProgram[idx].uniform1i(LLShaderMgr::CLASSIC_MODE, (psky->canAutoAdjust()) ? 1 : 0); far_z = 0.f; count = 0; - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); unbindDeferredShader(gDeferredMultiLightProgram[idx]); } } @@ -8870,6 +9277,9 @@ void LLPipeline::renderDeferredLighting() gDeferredMultiSpotLightProgram.uniform1i(LLShaderMgr::CLASSIC_MODE, (psky->canAutoAdjust()) ? 1 : 0); mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + /* + gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + */ } gDeferredMultiSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION); @@ -8932,11 +9342,14 @@ void LLPipeline::renderDeferredLighting() } } gGL.setColorMask(true, true); + + LOG_GLERROR("renderDeferredLighting end"); } void LLPipeline::doAtmospherics() { LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; + LOG_GLERROR("doAtmospherics begin"); if (sImpostorRender) { // do not attempt atmospherics on impostors @@ -8954,7 +9367,7 @@ void LLPipeline::doAtmospherics() LLRenderTarget& dst = gPipeline.mWaterDis; mRT->screen.flush(); - dst.bindTarget(); + dst.bindTarget("doAtmospherics dst", 1); gCopyDepthProgram.bind(); S32 diff_map = gCopyDepthProgram.getTextureChannel(LLShaderMgr::DIFFUSE_MAP); @@ -8964,11 +9377,10 @@ void LLPipeline::doAtmospherics() gGL.getTexUnit(depth_map)->bind(&depth_src, true); gGL.setColorMask(false, false); - gPipeline.mScreenTriangleVB->setBuffer(); - gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); dst.flush(); - mRT->screen.bindTarget(); + mRT->screen.bindTarget("atmospherics", 1); } LLGLEnable blend(GL_BLEND); @@ -8990,13 +9402,14 @@ void LLPipeline::doAtmospherics() LLGLDepthTest depth(GL_FALSE); // full screen blit - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); unbindDeferredShader(haze_shader); gGL.setSceneBlendType(LLRender::BT_ALPHA); } + + LOG_GLERROR("doAtmospherics end"); } void LLPipeline::doWaterHaze() @@ -9018,7 +9431,7 @@ void LLPipeline::doWaterHaze() LLRenderTarget& dst = gPipeline.mWaterDis; mRT->screen.flush(); - dst.bindTarget(); + dst.bindTarget("water haze copy depth", 1); gCopyDepthProgram.bind(); S32 diff_map = gCopyDepthProgram.getTextureChannel(LLShaderMgr::DIFFUSE_MAP); @@ -9028,11 +9441,10 @@ void LLPipeline::doWaterHaze() gGL.getTexUnit(depth_map)->bind(&depth_src, true); gGL.setColorMask(false, false); - gPipeline.mScreenTriangleVB->setBuffer(); - gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); dst.flush(); - mRT->screen.bindTarget(); + mRT->screen.bindTarget("water haze", 1); } LLGLEnable blend(GL_BLEND); @@ -9058,8 +9470,7 @@ void LLPipeline::doWaterHaze() LLGLDepthTest depth(GL_FALSE); // full screen blit - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); } else { @@ -9081,11 +9492,13 @@ void LLPipeline::doWaterHaze() gGL.setSceneBlendType(LLRender::BT_ALPHA); } + + LOG_GLERROR("after doWaterHaze()"); } void LLPipeline::doWaterExclusionMask() { - mWaterExclusionMask.bindTarget(); + mWaterExclusionMask.bindTarget("", 1); glClearColor(1, 1, 1, 1); mWaterExclusionMask.clear(); mWaterExclusionPool->render(); @@ -9238,6 +9651,7 @@ void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep) } } + LOG_GLERROR("setupSpotLight() end"); } void LLPipeline::unbindDeferredShader(LLGLSLShader &shader) @@ -9245,7 +9659,7 @@ void LLPipeline::unbindDeferredShader(LLGLSLShader &shader) LLRenderTarget* deferred_target = &mRT->deferredScreen; LLRenderTarget* deferred_light_target = &mRT->deferredLight; - stop_glerror(); + LOG_GLERROR("unbindDeferredShader() begin"); shader.disableTexture(LLShaderMgr::NORMAL_MAP, deferred_target->getUsage()); shader.disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, deferred_target->getUsage()); shader.disableTexture(LLShaderMgr::DEFERRED_SPECULAR, deferred_target->getUsage()); @@ -9294,6 +9708,8 @@ void LLPipeline::unbindDeferredShader(LLGLSLShader &shader) gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); gGL.getTexUnit(0)->activate(); shader.unbind(); + + LOG_GLERROR("unbindDeferredShader() end"); } void LLPipeline::setEnvMat(LLGLSLShader& shader) @@ -9314,13 +9730,8 @@ void LLPipeline::bindReflectionProbes(LLGLSLShader& shader) return; } -#if GL_VERSION_4_0 S32 channel = shader.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY); -#else - S32 channel; -#endif bool bound = false; -#if GL_VERSION_4_0 if (channel > -1 && mReflectionMapManager.mTexture.notNull()) { mReflectionMapManager.mTexture->bind(channel); @@ -9351,9 +9762,13 @@ void LLPipeline::bindReflectionProbes(LLGLSLShader& shader) setEnvMat(shader); } -#endif // reflection probe shaders generally sample the scene map as well for SSR + + //if(RenderScreenSpaceReflections) + //{ + //LL_WARNS() << "binding SSR to reflection maps" << LL_ENDL; + channel = shader.enableTexture(LLShaderMgr::SCENE_MAP); if (channel > -1) { @@ -9379,8 +9794,10 @@ void LLPipeline::bindReflectionProbes(LLGLSLShader& shader) { gGL.getTexUnit(channel)->bind(&mSceneMap, true); } + //} + LOG_GLERROR("bindReflectionProbes() end"); } void LLPipeline::unbindReflectionProbes(LLGLSLShader& shader) @@ -9394,6 +9811,8 @@ void LLPipeline::unbindReflectionProbes(LLGLSLShader& shader) gGL.getTexUnit(channel)->enable(LLTexUnit::TT_TEXTURE); } } + + LOG_GLERROR("unbindReflectionProbes() end"); } @@ -9452,11 +9871,13 @@ static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_MASKED("Alpha Masked"); static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_BLEND("Alpha Blend"); static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_TREE("Alpha Tree"); static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_GRASS("Alpha Grass"); +static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_MATERIAL("Alpha Material"); static LLTrace::BlockTimerStatHandle FTM_SHADOW_FULLBRIGHT_ALPHA_MASKED("Fullbright Alpha Masked"); void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCamera& shadow_cam, LLCullResult& result, bool depth_clamp) { - LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; //LL_RECORD_BLOCK_TIME(FTM_SHADOW_RENDER); + LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; + LL_RECORD_BLOCK_TIME(FTM_SHADOW_RENDER); LL_PROFILE_GPU_ZONE("renderShadow"); LLPipeline::sShadowRender = true; @@ -9490,11 +9911,12 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_LESS); + //static LLCachedControl<bool> sShadowAlternative(gSavedSettings, "MPShadowAlternative", false); + updateCull(shadow_cam, result); stateSort(shadow_cam, result); - //generate shadow map gGL.matrixMode(LLRender::MM_PROJECTION); gGL.pushMatrix(); gGL.loadMatrix(glm::value_ptr(proj)); @@ -9534,8 +9956,10 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa gGL.setColorMask(false, false); } - LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow simple"); //LL_RECORD_BLOCK_TIME(FTM_SHADOW_SIMPLE); + LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow simple"); LL_PROFILE_GPU_ZONE("shadow simple"); + LL_RECORD_BLOCK_TIME(FTM_SHADOW_SIMPLE); + gGL.getTexUnit(0)->disable(); for (U32 type : types) @@ -9556,12 +9980,15 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa { LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow geom"); + LL_RECORD_BLOCK_TIME(FTM_SHADOW_GEOM); renderGeomShadow(shadow_cam); } { LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha"); LL_PROFILE_GPU_ZONE("shadow alpha"); + LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA); + const S32 sun_up = LLEnvironment::instance().getIsSunUp() ? 1 : 0; U32 target_width = LLRenderTarget::sCurResX; @@ -9572,6 +9999,7 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa { LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha masked"); LL_PROFILE_GPU_ZONE("shadow alpha masked"); + LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA_MASKED); gDeferredShadowAlphaMaskProgram.bind(rigged); LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up); LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width); @@ -9581,12 +10009,15 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa { LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha blend"); LL_PROFILE_GPU_ZONE("shadow alpha blend"); + LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA_BLEND); renderAlphaObjects(rigged); } { LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow fullbright alpha masked"); LL_PROFILE_GPU_ZONE("shadow alpha masked"); + LL_RECORD_BLOCK_TIME(FTM_SHADOW_FULLBRIGHT_ALPHA_MASKED); + gDeferredShadowFullbrightAlphaMaskProgram.bind(rigged); LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up); LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width); @@ -9596,6 +10027,8 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa { LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha grass"); LL_PROFILE_GPU_ZONE("shadow alpha grass"); + LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA_GRASS); + gDeferredTreeShadowProgram.bind(rigged); LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(ALPHA_BLEND_CUTOFF); @@ -9607,6 +10040,8 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa { LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha material"); LL_PROFILE_GPU_ZONE("shadow alpha material"); + LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA_MATERIAL); + renderMaskedObjects(LLRenderPass::PASS_NORMSPEC_MASK, true, false, rigged); renderMaskedObjects(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, true, false, rigged); renderMaskedObjects(LLRenderPass::PASS_SPECMAP_MASK, true, false, rigged); @@ -9894,11 +10329,19 @@ void LLPipeline::generateSunShadow(LLCamera& camera) return; } + if(gCubeSnapshot) + { + LL_WARNS() << "generateSunShadow() gCubeSnapshot" << LL_ENDL; + return; + } + LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; //LL_RECORD_BLOCK_TIME(FTM_GEN_SUN_SHADOW); LL_PROFILE_GPU_ZONE("generateSunShadow"); LLDisableOcclusionCulling no_occlusion; + U32 splits = 4; + bool skip_avatar_update = false; if (!isAgentAvatarValid() || gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK || !LLVOAvatar::sVisibleInFirstPerson) { @@ -10003,7 +10446,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera) LLPlane shadow_near_clip; { LLVector3 p = camera.getOrigin(); // gAgent.getPositionAgent(); - p += caster_dir * RenderFarClip*2.f; + p += caster_dir * RenderFarClip*1.1f; shadow_near_clip.setVec(p, caster_dir); } @@ -10076,30 +10519,38 @@ void LLPipeline::generateSunShadow(LLCamera& camera) update_min_max(min, max, fp[i]); } - near_clip = llclamp(-max.mV[2], 0.01f, 4.0f); - F32 far_clip = llclamp(-min.mV[2]*2.f, 16.0f, 512.0f); + static LLCachedControl<F32> maxDist(gSavedSettings, "MPRenderShadowMaxDist", 128); - //far_clip = llmin(far_clip, 128.f); + near_clip = llclamp(-max.mV[2], 0.01f, 4.0f); + F32 far_clip = llclamp(-min.mV[2]*1.1, 16.0f, maxDist); far_clip = llmin(far_clip, camera.getFar()); F32 range = far_clip-near_clip; - LLVector3 split_exp = RenderShadowSplitExponent; + F32 closestDist = 2.0; + F32 closeDist = 10.0; - F32 da = 1.f-llmax( fabsf(lightDir*up), fabsf(lightDir*camera.getLeftAxis()) ); + mSunClipPlanes.mV[0] = near_clip + closestDist; + mSunClipPlanes.mV[1] = near_clip + closeDist; + mSunClipPlanes.mV[2] = mSunClipPlanes.mV[1] + (range-closeDist)*0.4; + mSunClipPlanes.mV[3] = far_clip; + /* + LLVector3 split_exp = RenderShadowSplitExponent; + F32 da = 1.f-llmax( fabsf(lightDir*up), fabsf(lightDir*camera.getLeftAxis()) ); da = powf(da, split_exp.mV[2]); F32 sxp = split_exp.mV[1] + (split_exp.mV[0]-split_exp.mV[1])*da; - for (U32 i = 0; i < 4; ++i) + for (U32 i = 0; i < splits; ++i) { - F32 x = (F32)(i+1)/4.f; + F32 x = (F32)(i+1)/(F32)splits; x = powf(x, sxp); mSunClipPlanes.mV[i] = near_clip+range*x; } + */ - mSunClipPlanes.mV[0] *= 1.25f; //bump back first split for transition padding + //mSunClipPlanes.mV[0] *= 1.1f; //bump back first split for transition padding } if (gCubeSnapshot) @@ -10113,13 +10564,17 @@ void LLPipeline::generateSunShadow(LLCamera& camera) // convenience array of 4 near clip plane distances F32 dist[] = { near_clip, mSunClipPlanes.mV[0], mSunClipPlanes.mV[1], mSunClipPlanes.mV[2], mSunClipPlanes.mV[3] }; - if (mSunDiffuse == LLColor4::black) + if (mSunDiffuse == LLColor4::black || RenderShadowDetail == 3) { //sun diffuse is totally black shadows don't matter skipRenderingShadows(); } else { - for (S32 j = 0; j < (gCubeSnapshot ? 2 : 4); j++) + S32 begin = 0; + S32 end = splits-1; + if(gCubeSnapshot) end = 1; + + for (S32 j = begin; j <= end; j++) { if (!hasRenderDebugMask(RENDER_DEBUG_SHADOW_FRUSTA) && !gCubeSnapshot) { @@ -10157,8 +10612,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera) delta += (frust[i+4]-frust[(i+2)%4+4])*0.05f; delta.normVec(); F32 dp = delta*pn; - frust[i] = eye + (delta*dist[j]*0.75f)/dp; - frust[i+4] = eye + (delta*dist[j+1]*1.25f)/dp; + frust[i] = eye + (delta*dist[j]*0.9f)/dp; + frust[i+4] = eye + (delta*dist[j+1]*1.1f)/dp; } shadow_cam.calcAgentFrustumPlanes(frust); @@ -10171,8 +10626,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera) std::vector<LLVector3> fp; - if (!gPipeline.getVisiblePointCloud(shadow_cam, min, max, fp, lightDir) - || j > RenderShadowSplits) + if (!gPipeline.getVisiblePointCloud(shadow_cam, min, max, fp, lightDir)) { //no possible shadow receivers if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA) && !gCubeSnapshot) @@ -10182,7 +10636,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera) mShadowCamera[j+4] = shadow_cam; } - mRT->shadow[j].bindTarget(); + mRT->shadow[j].bindTarget("", 1); { LLGLDepthTest depth(GL_TRUE); mRT->shadow[j].clear(); @@ -10472,8 +10926,9 @@ void LLPipeline::generateSunShadow(LLCamera& camera) stop_glerror(); - mRT->shadow[j].bindTarget(); - mRT->shadow[j].getViewport(gGLViewport); + mRT->shadow[j].bindTarget("mRT->shadow[j] (rendering)", 1); + //mRT->shadow[j].getViewport(gGLViewport); + //mRT->shadow[j].getViewport(0, 0, SHADOWS_RESX, SHADOWS_RESY); mRT->shadow[j].clear(); { @@ -10621,8 +11076,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera) // - mSpotShadow[i].bindTarget(); - mSpotShadow[i].getViewport(gGLViewport); + mSpotShadow[i].bindTarget("mSpotShadow[i]", 1); + //mSpotShadow[i].getViewport(gGLViewport); mSpotShadow[i].clear(); static LLCullResult result[2]; @@ -10670,6 +11125,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera) { gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode()); } + + LOG_GLERROR("LLPipeline::generateSunShadow()"); } void LLPipeline::renderGroups(LLRenderPass* pass, U32 type, bool texture) @@ -10685,6 +11142,8 @@ void LLPipeline::renderGroups(LLRenderPass* pass, U32 type, bool texture) pass->renderGroup(group,type,texture); } } + + LOG_GLERROR("LLPipeline::renderGroups()"); } void LLPipeline::renderRiggedGroups(LLRenderPass* pass, U32 type, bool texture) @@ -10700,6 +11159,8 @@ void LLPipeline::renderRiggedGroups(LLRenderPass* pass, U32 type, bool texture) pass->renderRiggedGroup(group, type, texture); } } + + LOG_GLERROR("LLPipeline::renderRiggedGroups()"); } void LLPipeline::profileAvatar(LLVOAvatar* avatar, bool profile_attachments) @@ -10716,7 +11177,7 @@ void LLPipeline::profileAvatar(LLVOAvatar* avatar, bool profile_attachments) LLGLSLShader* cur_shader = LLGLSLShader::sCurBoundShaderPtr; - mRT->deferredScreen.bindTarget(); + mRT->deferredScreen.bindTarget("mRT->deferredScreen in profileAvatar", 1); mRT->deferredScreen.clear(); if (!profile_attachments) @@ -10770,6 +11231,8 @@ void LLPipeline::profileAvatar(LLVOAvatar* avatar, bool profile_attachments) { cur_shader->bind(); } + + LOG_GLERROR("LLPipeline::profileAvatar()"); } void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool for_profile, LLViewerObject* specific_attachment) @@ -10990,7 +11453,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool { if (!avatar->mImpostor.isComplete()) { - avatar->mImpostor.allocate(resX, resY, GL_RGBA, true); + avatar->mImpostor.allocate(resX, resY, GL_RGBA8, true); if (LLPipeline::sRenderDeferred) { @@ -11006,7 +11469,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool avatar->mImpostor.resize(resX, resY); } - avatar->mImpostor.bindTarget(); + avatar->mImpostor.bindTarget("avatar->mImpostor", 1); } } @@ -11143,6 +11606,9 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool } LLVertexBuffer::unbind(); + + LOG_GLERROR("LLPipeline::generateImpostor()"); + LLGLState::checkStates(); } @@ -11467,7 +11933,7 @@ void LLPipeline::skipRenderingShadows() for (S32 j = 0; j < 4; j++) { - mRT->shadow[j].bindTarget(); + mRT->shadow[j].bindTarget("skip rendering shadows", 1); mRT->shadow[j].clear(); mRT->shadow[j].flush(); } @@ -11506,21 +11972,24 @@ public: } }; - +// Called from LLViewHighlightTransparent when "Highlight Transparent" is toggled void LLPipeline::rebuildDrawInfo() { - for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); - iter != LLWorld::getInstance()->getRegionList().end(); ++iter) + const U32 types_to_traverse[] = { - LLViewerRegion* region = *iter; - - LLOctreeDirty dirty; - - LLSpatialPartition* part = region->getSpatialPartition(LLViewerRegion::PARTITION_VOLUME); - dirty.traverse(part->mOctree); + LLViewerRegion::PARTITION_VOLUME, + LLViewerRegion::PARTITION_BRIDGE, + LLViewerRegion::PARTITION_AVATAR + }; - part = region->getSpatialPartition(LLViewerRegion::PARTITION_BRIDGE); - dirty.traverse(part->mOctree); + LLOctreeDirty dirty; + for (LLViewerRegion* region : LLWorld::getInstance()->getRegionList()) + { + for (U32 type : types_to_traverse) + { + LLSpatialPartition* part = region->getSpatialPartition(type); + dirty.traverse(part->mOctree); + } } } diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 315e38ed8c..60804eee9e 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -125,11 +125,14 @@ public: private: //implementation of above, wrapped for easy error handling eFBOStatus doAllocateScreenBuffer(U32 resX, U32 resY); + void renderTriangle(); + public: //attempt to allocate screen buffers at resX, resY //returns true if allocation successful, false otherwise - bool allocateScreenBufferInternal(U32 resX, U32 resY); + //type 0 = screen, 1 = probe, 2 = mirror + bool allocateScreenBufferInternal(U32 resX, U32 resY, U32 type_ = 0); bool allocateShadowBuffer(U32 resX, U32 resY); // rebuild all LLVOVolume render batches @@ -155,18 +158,21 @@ public: void copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget* dst); void generateLuminance(LLRenderTarget* src, LLRenderTarget* dst); void generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool use_history = true); - void tonemap(LLRenderTarget* src, LLRenderTarget* dst); + void tonemap(LLRenderTarget* src, LLRenderTarget* dst, bool gamma_correct); void gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst); void generateGlow(LLRenderTarget* src); - void applyCAS(LLRenderTarget* src, LLRenderTarget* dst); - void applyFXAA(LLRenderTarget* src, LLRenderTarget* dst); - void generateSMAABuffers(LLRenderTarget* src); - void applySMAA(LLRenderTarget* src, LLRenderTarget* dst); - void renderDoF(LLRenderTarget* src, LLRenderTarget* dst); + bool applyCAS(LLRenderTarget* src, LLRenderTarget* dst); + bool generateFXAABuffer(LLRenderTarget* src); + bool applyFXAA(LLRenderTarget* src, LLRenderTarget* dst); + bool generateSMAABuffers(LLRenderTarget* src); + bool applySMAA(LLRenderTarget* src, LLRenderTarget* dst); + bool renderDoF(LLRenderTarget* src, LLRenderTarget* dst); void copyRenderTarget(LLRenderTarget* src, LLRenderTarget* dst); void combineGlow(LLRenderTarget* src, LLRenderTarget* dst); void visualizeBuffers(LLRenderTarget* src, LLRenderTarget* dst, U32 bufferIndex); + bool renderBloom(LLRenderTarget* src, LLRenderTarget* dst); + void init(); void cleanup(); bool isInit() { return mInitialized; }; @@ -308,6 +314,7 @@ public: void renderGeomDeferred(LLCamera& camera, bool do_occlusion = false); void renderGeomPostDeferred(LLCamera& camera); + void renderGeomPostDeferredOnlyHud(LLCamera& camera); void renderGeomShadow(LLCamera& camera); void bindLightFunc(LLGLSLShader& shader); @@ -702,7 +709,7 @@ public: LLRenderTarget shadow[4]; }; - // main full resoltuion render target + // main full resolution render target RenderTargetPack mMainRT; // auxillary 512x512 render target pack @@ -729,13 +736,22 @@ public: LLRenderTarget mExposureMap; LLRenderTarget mLastExposure; + LLRenderTarget mBloomMap; + LLRenderTarget mBloomBlur[2]; + // tonemapped and gamma corrected render ready for post - LLRenderTarget mPostMap; +/* + LLRenderTarget mPostPingMap; + LLRenderTarget mPostPongMap; +*/ + LLRenderTarget mPostMaps[2]; // FXAA helper target LLRenderTarget mFXAAMap; LLRenderTarget mSMAABlendBuffer; + //LLRenderTarget mDummyRT; + // render ui to buffer target LLRenderTarget mUIScreen; @@ -812,6 +828,9 @@ public: bool mShadersLoaded; U32 mTransformFeedbackPrimitives; //number of primitives expected to be generated by transform feedback + + bool mHDRDisplay; + protected: bool mRenderTypeEnabled[NUM_RENDER_TYPES]; std::stack<std::string> mRenderTypeEnableStack; @@ -1008,7 +1027,7 @@ public: static bool RenderDeferred; static F32 RenderDeferredSunWash; static U32 RenderFSAAType; - static U32 RenderResolutionDivisor; + static F32 RenderResolutionDivisor; static bool RenderUIBuffer; static S32 RenderShadowDetail; static S32 RenderShadowSplits; @@ -1086,6 +1105,7 @@ public: static bool RenderMirrors; static S32 RenderHeroProbeUpdateRate; static S32 RenderHeroProbeConservativeUpdateMultiplier; + static bool RenderAvatarCloth; }; void render_bbox(const LLVector3 &min, const LLVector3 &max); diff --git a/indra/newview/res-sdl/cross.BMP b/indra/newview/res-sdl/cross.BMP Binary files differindex 0b4672d4d6..96ed7a4d60 100644 --- a/indra/newview/res-sdl/cross.BMP +++ b/indra/newview/res-sdl/cross.BMP diff --git a/indra/newview/res-sdl/lltoolcamera.BMP b/indra/newview/res-sdl/lltoolcamera.BMP Binary files differindex c961d7a49c..f281181091 100644 --- a/indra/newview/res-sdl/lltoolcamera.BMP +++ b/indra/newview/res-sdl/lltoolcamera.BMP diff --git a/indra/newview/res-sdl/lltoolcreate.BMP b/indra/newview/res-sdl/lltoolcreate.BMP Binary files differindex 08a4a9322d..4b7a144143 100644 --- a/indra/newview/res-sdl/lltoolcreate.BMP +++ b/indra/newview/res-sdl/lltoolcreate.BMP diff --git a/indra/newview/res-sdl/lltoolpipette.BMP b/indra/newview/res-sdl/lltoolpipette.BMP Binary files differindex 2d27118289..6580ab0e68 100644 --- a/indra/newview/res-sdl/lltoolpipette.BMP +++ b/indra/newview/res-sdl/lltoolpipette.BMP diff --git a/indra/newview/res-sdl/lltoolrotate.BMP b/indra/newview/res-sdl/lltoolrotate.BMP Binary files differindex 6115984c62..4d29e99177 100644 --- a/indra/newview/res-sdl/lltoolrotate.BMP +++ b/indra/newview/res-sdl/lltoolrotate.BMP diff --git a/indra/newview/res-sdl/toolmediaopen.BMP b/indra/newview/res-sdl/toolmediaopen.BMP Binary files differindex 670f07235e..5d70cb0463 100644 --- a/indra/newview/res-sdl/toolmediaopen.BMP +++ b/indra/newview/res-sdl/toolmediaopen.BMP diff --git a/indra/newview/res-sdl/toolopen.BMP b/indra/newview/res-sdl/toolopen.BMP Binary files differindex ae4908fd35..3e26ceec28 100644 --- a/indra/newview/res-sdl/toolopen.BMP +++ b/indra/newview/res-sdl/toolopen.BMP diff --git a/indra/newview/res-sdl/toolplay.BMP b/indra/newview/res-sdl/toolplay.BMP Binary files differindex d0e14838e9..7edf03d86a 100644 --- a/indra/newview/res-sdl/toolplay.BMP +++ b/indra/newview/res-sdl/toolplay.BMP diff --git a/indra/newview/res/ll_icon_small.ico b/indra/newview/res/ll_icon_small.ico Binary files differnew file mode 100644 index 0000000000..9cc41f3e4a --- /dev/null +++ b/indra/newview/res/ll_icon_small.ico diff --git a/indra/newview/res/resource.h b/indra/newview/res/resource.h index e904f4a1a8..1d3289d784 100644 --- a/indra/newview/res/resource.h +++ b/indra/newview/res/resource.h @@ -30,6 +30,7 @@ #define IDREMOVE 3 #define IDI_LL_ICON 103 #define IDC_GRABHAND 104 +#define IDI_LL_ICON_SMALL 105 #define IDC_CURSOR1 134 #define IDC_CURSOR2 136 #define IDC_CURSOR3 147 diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc index 4ee26a312a..b88390d78c 100755 --- a/indra/newview/res/viewerRes.rc +++ b/indra/newview/res/viewerRes.rc @@ -56,6 +56,7 @@ END // remains consistent on all systems. IDI_LL_ICON ICON "ll_icon.ico" IDI_LCD_LL_ICON ICON "icon1.ico" +IDI_LL_ICON_SMALL ICON "ll_icon_small.ico" ///////////////////////////////////////////////////////////////////////////// // @@ -152,13 +153,13 @@ BEGIN BEGIN BLOCK "040904b0" BEGIN - VALUE "CompanyName", "Linden Lab" - VALUE "FileDescription", "Second Life" + VALUE "CompanyName", "Megapahit" + VALUE "FileDescription", "Megapahit viewer" VALUE "FileVersion", "${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}" - VALUE "InternalName", "Second Life" - VALUE "LegalCopyright", "Copyright (c) 2020, Linden Research, Inc." - VALUE "OriginalFilename", "SecondLife.exe" - VALUE "ProductName", "Second Life" + VALUE "InternalName", "Megapahit" + VALUE "LegalCopyright", "Copyright (c) 2026, Megapahit." + VALUE "OriginalFilename", "Megapahit.exe" + VALUE "ProductName", "Megapahit viewer" VALUE "ProductVersion", "${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}" END END diff --git a/indra/newview/rlvactions.cpp b/indra/newview/rlvactions.cpp new file mode 100644 index 0000000000..110beeafc0 --- /dev/null +++ b/indra/newview/rlvactions.cpp @@ -0,0 +1,42 @@ +/** + * @file rlvactions.cpp + * @author Kitty Barnett + * @brief RLVa public facing helper class to easily make RLV checks + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, 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 "rlvactions.h" +#include "rlvhandler.h" + +// ============================================================================ +// Helper functions +// + +bool RlvActions::isRlvEnabled() +{ + return RlvHandler::isEnabled(); +} + +// ============================================================================ diff --git a/indra/newview/rlvactions.h b/indra/newview/rlvactions.h new file mode 100644 index 0000000000..cb0df95e37 --- /dev/null +++ b/indra/newview/rlvactions.h @@ -0,0 +1,46 @@ +/** + * @file rlvactions.h + * @author Kitty Barnett + * @brief RLVa public facing helper class to easily make RLV checks + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, 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$ + */ + +#pragma once + +// ============================================================================ +// RlvActions - developer-friendly non-RLVa code facing class, use in lieu of RlvHandler whenever possible +// + +class RlvActions +{ + // ================ + // Helper functions + // ================ +public: + /* + * Convenience function to check if RLVa is enabled without having to include rlvhandler.h + */ + static bool isRlvEnabled(); +}; + +// ============================================================================ diff --git a/indra/newview/rlvcommon.cpp b/indra/newview/rlvcommon.cpp new file mode 100644 index 0000000000..4140659715 --- /dev/null +++ b/indra/newview/rlvcommon.cpp @@ -0,0 +1,134 @@ +/** + * @file rlvcommon.h + * @author Kitty Barnett + * @brief RLVa helper functions and constants used throughout the viewer + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, 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 "llagent.h" +#include "llchat.h" +#include "lldbstrings.h" +#include "llversioninfo.h" +#include "llviewermenu.h" +#include "llviewerstats.h" +#include "message.h" +#include <boost/algorithm/string.hpp> + +#include "rlvcommon.h" + +#include "llviewercontrol.h" +#include "rlvhandler.h" + +using namespace Rlv; + +// ============================================================================ +// RlvStrings +// + +std::string Strings::getVersion(bool wants_legacy) +{ + return llformat("%s viewer v%d.%d.%d (RLVa %d.%d.%d)", + !wants_legacy ? "RestrainedLove" : "RestrainedLife", + SpecVersion::Major, SpecVersion::Minor, SpecVersion::Patch, + ImplVersion::Major, ImplVersion::Minor, ImplVersion::Patch); +} + +std::string Strings::getVersionAbout() +{ + return llformat("RLV v%d.%d.%d / RLVa v%d.%d.%d.%d", + SpecVersion::Major, SpecVersion::Minor, SpecVersion::Patch, + ImplVersion::Major, ImplVersion::Minor, ImplVersion::Patch, LLVersionInfo::instance().getBuild()); +} + +std::string Strings::getVersionNum() +{ + return llformat("%d%02d%02d%02d", + SpecVersion::Major, SpecVersion::Minor, SpecVersion::Patch, SpecVersion::Build); +} + +std::string Strings::getVersionImplNum() +{ + return llformat("%d%02d%02d%02d", + ImplVersion::Major, ImplVersion::Minor, ImplVersion::Patch, ImplVersion::ImplId); +} + +// ============================================================================ +// RlvUtil +// + +void Util::menuToggleVisible() +{ + bool isTopLevel = gSavedSettings.getBOOL(Settings::TopLevelMenu); + bool isRlvEnabled = RlvHandler::isEnabled(); + + LLMenuGL* menuRLVaMain = gMenuBarView->findChildMenuByName("RLVa Main", false); + LLMenuGL* menuAdvanced = gMenuBarView->findChildMenuByName("Advanced", false); + LLMenuGL* menuRLVaEmbed= menuAdvanced->findChildMenuByName("RLVa Embedded", false); + + gMenuBarView->setItemVisible("RLVa Main", isRlvEnabled && isTopLevel); + menuAdvanced->setItemVisible("RLVa Embedded", isRlvEnabled && !isTopLevel); + + if ( isRlvEnabled && menuRLVaMain && menuRLVaEmbed && + ( (isTopLevel && 1 == menuRLVaMain->getItemCount()) || (!isTopLevel && 1 == menuRLVaEmbed->getItemCount())) ) + { + LLMenuGL* menuFrom = isTopLevel ? menuRLVaEmbed : menuRLVaMain; + LLMenuGL* menuTo = isTopLevel ? menuRLVaMain : menuRLVaEmbed; + while (LLMenuItemGL* pItem = menuFrom->getItem(1)) + { + menuFrom->removeChild(pItem); + menuTo->addChild(pItem); + pItem->updateBranchParent(menuTo); + } + } +} + +bool Util::parseStringList(const std::string& strInput, std::vector<std::string>& optionList, std::string_view strSeparator) +{ + if (!strInput.empty()) + boost::split(optionList, strInput, boost::is_any_of(strSeparator)); + return !optionList.empty(); +} + +bool Util::sendChatReply(S32 nChannel, const std::string& strUTF8Text) +{ + if (!isValidReplyChannel(nChannel)) + return false; + + // Copy/paste from send_chat_from_viewer() + gMessageSystem->newMessageFast(_PREHASH_ChatFromViewer); + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gMessageSystem->nextBlockFast(_PREHASH_ChatData); + gMessageSystem->addStringFast(_PREHASH_Message, utf8str_truncate(strUTF8Text, MAX_MSG_STR_LEN)); + gMessageSystem->addU8Fast(_PREHASH_Type, CHAT_TYPE_SHOUT); + gMessageSystem->addS32("Channel", nChannel); + gAgent.sendReliableMessage(); + add(LLStatViewer::CHAT_COUNT, 1); + + return true; +} + +// ============================================================================ diff --git a/indra/newview/rlvcommon.h b/indra/newview/rlvcommon.h new file mode 100644 index 0000000000..6f1bbbbdc6 --- /dev/null +++ b/indra/newview/rlvcommon.h @@ -0,0 +1,72 @@ +/** + * @file rlvcommon.h + * @author Kitty Barnett + * @brief RLVa helper functions and constants used throughout the viewer + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, 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$ + */ + +#pragma once + +#include "rlvdefines.h" + +namespace Rlv +{ + // ============================================================================ + // RlvStrings + // + + class Strings + { + public: + static std::string getVersion(bool wants_legacy); + static std::string getVersionAbout(); + static std::string getVersionImplNum(); + static std::string getVersionNum(); + }; + + // ============================================================================ + // RlvUtil + // + + namespace Util + { + bool isValidReplyChannel(S32 nChannel, bool isLoopback = false); + void menuToggleVisible(); + bool parseStringList(const std::string& strInput, std::vector<std::string>& optionList, std::string_view strSeparator = Constants::OptionSeparator); + bool sendChatReply(S32 nChannel, const std::string& strUTF8Text); + bool sendChatReply(const std::string& strChannel, const std::string& strUTF8Text); + }; + + inline bool Util::isValidReplyChannel(S32 nChannel, bool isLoopback) + { + return (nChannel > (!isLoopback ? 0 : -1)) && (CHAT_CHANNEL_DEBUG != nChannel); + } + + inline bool Util::sendChatReply(const std::string& strChannel, const std::string& strUTF8Text) + { + S32 nChannel; + return LLStringUtil::convertToS32(strChannel, nChannel) ? sendChatReply(nChannel, strUTF8Text) : false; + } + + // ============================================================================ +} diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h new file mode 100644 index 0000000000..4437adcf1b --- /dev/null +++ b/indra/newview/rlvdefines.h @@ -0,0 +1,203 @@ +/** + * @file rlvdefines.h + * @author Kitty Barnett + * @brief RLVa common defines, constants and enums + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, 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$ + */ + +#pragma once + +// ============================================================================ +// Defines +// + +// Defining these makes it easier if we ever need to change our tag +#define RLV_WARNS LL_WARNS("RLV") +#define RLV_INFOS LL_INFOS("RLV") +#define RLV_DEBUGS LL_DEBUGS("RLV") +#define RLV_ENDL LL_ENDL +#define RLV_VERIFY(f) (f) + +#if LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG + // Make sure we halt execution on errors + #define RLV_ERRS LL_ERRS("RLV") + // Keep our asserts separate from LL's + #define RLV_ASSERT(f) if (!(f)) { RLV_ERRS << "ASSERT (" << #f << ")" << RLV_ENDL; } + #define RLV_ASSERT_DBG(f) RLV_ASSERT(f) +#else + // Don't halt execution on errors in release + #define RLV_ERRS LL_WARNS("RLV") + // We don't want to check assertions in release builds + #ifdef RLV_DEBUG + #define RLV_ASSERT(f) RLV_VERIFY(f) + #define RLV_ASSERT_DBG(f) + #else + #define RLV_ASSERT(f) + #define RLV_ASSERT_DBG(f) + #endif // RLV_DEBUG +#endif // LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG + +namespace Rlv +{ + // Version of the specification we report + namespace SpecVersion { + constexpr S32 Major = 4; + constexpr S32 Minor = 0; + constexpr S32 Patch = 0; + constexpr S32 Build = 0; + }; + + // RLVa implementation version + namespace ImplVersion { + constexpr S32 Major = 3; + constexpr S32 Minor = 0; + constexpr S32 Patch = 0; + constexpr S32 ImplId = 13; + }; + + namespace Constants + { + constexpr char CmdPrefix = '@'; + constexpr char ConsolePrompt[] = "> "; + constexpr std::string_view OptionSeparator = ";"; + } +} + +// ============================================================================ +// Enumeration declarations +// + +namespace Rlv +{ + enum class EBehaviour { + Version = 0, + VersionNew, + VersionNum, + GetSitID, + Sit, + SitGround, + Unsit, + Detach, + RemOutfit, + GetInv, + Attach, + AttachOver, + GetCommand, + + Count, + Unknown, + }; + + enum class EBehaviourOptionType + { + EmptyOrException, // Behaviour takes no parameters + Exception, // Behaviour requires an exception as a parameter + NoneOrException, // Behaviour takes either no parameters or an exception + }; + + enum class EParamType { + Unknown = 0x00, + Add = 0x01, // <param> == "n"|"add" + Remove = 0x02, // <param> == "y"|"rem" + Force = 0x04, // <param> == "force" + Reply = 0x08, // <param> == <number> + Clear = 0x10, + AddRem = Add | Remove + }; + + enum class ECmdRet { + Unknown = 0x0000, // Unknown error (should only be used internally) + Retained, // Command was retained + Succeeded = 0x0100, // Command executed successfully + SuccessUnset, // Command executed successfully (RLV_TYPE_REMOVE for an unrestricted behaviour) + SuccessDuplicate, // Command executed successfully (RLV_TYPE_ADD for an already restricted behaviour) + SuccessDeprecated, // Command executed successfully but has been marked as deprecated + SuccessDelayed, // Command parsed valid but will execute at a later time + Failed = 0x0200, // Command failed (general failure) + FailedSyntax, // Command failed (syntax error) + FailedOption, // Command failed (invalid option) + FailedParam, // Command failed (invalid param) + FailedLock, // Command failed (command is locked by another object) + FailedDisabled, // Command failed (command disabled by user) + FailedUnknown, // Command failed (unknown command) + FailedNoSharedRoot, // Command failed (missing #RLV) + FailedDeprecated, // Command failed (deprecated and no longer supported) + FailedNoBehaviour, // Command failed (force modifier on an object with no active restrictions) + FailedUnheldBehaviour, // Command failed (local modifier on an object that doesn't hold the base behaviour) + FailedBlocked, // Command failed (object is blocked) + FailedThrottled, // Command failed (throttled) + FailedNoProcessor // Command doesn't have a template processor define (legacy code) + }; + + enum class EExceptionCheck + { + Permissive, // Exception can be set by any object + Strict, // Exception must be set by all objects holding the restriction + Default, // Permissive or strict will be determined by currently enforced restrictions + }; + + // Replace&remove in c++23 + template <typename E> + constexpr std::enable_if_t<std::is_enum_v<E> && !std::is_convertible_v<E, int>, std::underlying_type_t<E>> to_underlying(E e) noexcept + { + return static_cast<std::underlying_type_t<E>>(e); + } + + template <typename E> + constexpr std::enable_if_t<std::is_enum_v<E> && !std::is_convertible_v<E, int>, bool> has_flag(E value, E flag) noexcept + { + return (to_underlying(value) & to_underlying(flag)) != 0; + } + + constexpr bool isReturnCodeSuccess(ECmdRet eRet) + { + return (to_underlying(eRet) & to_underlying(ECmdRet::Succeeded)) == to_underlying(ECmdRet::Succeeded); + } + + constexpr bool isReturnCodeFailed(ECmdRet eRet) + { + return (to_underlying(eRet) & to_underlying(ECmdRet::Failed)) == to_underlying(ECmdRet::Failed); + } +} + +// ============================================================================ +// Settings +// + +namespace Rlv +{ + namespace Settings + { + constexpr char Main[] = "RestrainedLove"; + constexpr char Debug[] = "RestrainedLoveDebug"; + + constexpr char DebugHideUnsetDup[] = "RLVaDebugHideUnsetDuplicate"; + constexpr char EnableExperimentalCommands[] = "RLVaExperimentalCommands"; + constexpr char EnableIMQuery[] = "RLVaEnableIMQuery"; + constexpr char EnableTempAttach[] = "RLVaEnableTemporaryAttachments"; + constexpr char TopLevelMenu[] = "RLVaTopLevelMenu"; + }; + +}; + +// ============================================================================ diff --git a/indra/newview/rlvfloaters.cpp b/indra/newview/rlvfloaters.cpp new file mode 100644 index 0000000000..8a074fd14d --- /dev/null +++ b/indra/newview/rlvfloaters.cpp @@ -0,0 +1,122 @@ +/** + * @file rlvfloaters.cpp + * @author Kitty Barnett + * @brief RLVa floaters class implementations + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, 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 "llagentdata.h" +#include "llchatentry.h" +#include "lltexteditor.h" +#include "lltrans.h" +#include "llvoavatarself.h" + +#include "rlvfloaters.h" +#include "rlvhandler.h" + +using namespace Rlv; + +// ============================================================================ +// FloaterConsole +// + +bool FloaterConsole::postBuild() +{ + mInputEdit = getChild<LLChatEntry>("console_input"); + mInputEdit->setCommitCallback(std::bind(&FloaterConsole::onInput, this)); + mInputEdit->setTextExpandedCallback(std::bind(&FloaterConsole::reshapeLayoutPanel, this)); + mInputEdit->setFocus(true); + mInputEdit->setCommitOnFocusLost(false); + + mInputPanel = getChild<LLLayoutPanel>("input_panel"); + mInputEditPad = mInputPanel->getRect().getHeight() - mInputEdit->getRect().getHeight(); + + mOutputText = getChild<LLTextEditor>("console_output"); + mOutputText->appendText(Constants::ConsolePrompt, false); + + if (RlvHandler::isEnabled()) + { + mCommandOutputConn = RlvHandler::instance().setCommandOutputCallback([this](const RlvCommand& rlvCmd, S32, const std::string strText) + { + if (rlvCmd.getObjectID() == gAgentID) + { + mOutputText->appendText(rlvCmd.getBehaviour() + ": ", true); + mOutputText->appendText(strText, false); + } + }); + } + + return true; +} + +void FloaterConsole::onClose(bool fQuitting) +{ + if (RlvHandler::isEnabled()) + { + RlvHandler::instance().processCommand(gAgentID, "clear", true); + } +} + +void FloaterConsole::onInput() +{ + if (!isAgentAvatarValid()) + { + return; + } + + std::string strText = mInputEdit->getText(); + LLStringUtil::trim(strText); + + mOutputText->appendText(strText, false); + mInputEdit->setText(LLStringUtil::null); + + if (!RlvHandler::isEnabled()) + { + mOutputText->appendText(LLTrans::getString("RlvConsoleDisable"), true); + } + else if (strText.length() <= 3 || Constants::CmdPrefix != strText[0]) + { + mOutputText->appendText(LLTrans::getString("RlvConsoleInvalidCmd"), true); + } + else + { + LLChat chat; + chat.mFromID = gAgentID; + chat.mChatType = CHAT_TYPE_OWNER; + + RlvHandler::instance().handleSimulatorChat(strText, chat, gAgentAvatarp); + + mOutputText->appendText(strText, true); + } + + mOutputText->appendText(Constants::ConsolePrompt, true); +} + +void FloaterConsole::reshapeLayoutPanel() +{ + mInputPanel->reshape(mInputPanel->getRect().getWidth(), mInputEdit->getRect().getHeight() + mInputEditPad, false); +} + +// ============================================================================ diff --git a/indra/newview/rlvfloaters.h b/indra/newview/rlvfloaters.h new file mode 100644 index 0000000000..8acfa43f28 --- /dev/null +++ b/indra/newview/rlvfloaters.h @@ -0,0 +1,68 @@ +/** + * @file rlvfloaters.h + * @author Kitty Barnett + * @brief RLVa floaters class implementations + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, 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$ + */ + +#pragma once + +#include "llfloater.h" + +#include "rlvdefines.h" + +class LLChatEntry; +class LLFloaterReg; +class LLLayoutPanel; +class LLTextEditor; +class RlvCommand; +class RlvHandler; + +namespace Rlv +{ + // ============================================================================ + // FloaterConsole - debug console to allow command execution without the need for a script + // + + class FloaterConsole : public LLFloater + { + friend class ::LLFloaterReg; + FloaterConsole(const LLSD& sdKey) : LLFloater(sdKey) {} + + public: + bool postBuild() override; + void onClose(bool fQuitting) override; + protected: + void onInput(); + void reshapeLayoutPanel(); + + private: + boost::signals2::scoped_connection mCommandOutputConn; + int mInputEditPad = 0; + LLLayoutPanel* mInputPanel = nullptr; + LLChatEntry* mInputEdit = nullptr; + LLTextEditor* mOutputText = nullptr; + }; + + // ============================================================================ +}; diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp new file mode 100644 index 0000000000..2cc06b3bbc --- /dev/null +++ b/indra/newview/rlvhandler.cpp @@ -0,0 +1,436 @@ +/** + * @file rlvhandler.cpp + * @author Kitty Barnett + * @brief RLVa helper classes for internal use only + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, 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 "llagent.h" +#include "llstartup.h" +#include "llappearancemgr.h" +#include "llinventoryfunctions.h" +#include "llinventorymodel.h" +#include "llmoveview.h" +#include "llviewercontrol.h" +#include "llviewermenu.h" +#include "llviewerobject.h" +#include "llviewerobjectlist.h" + +#include "rlvcommon.h" +#include "rlvhandler.h" +#include "rlvhelper.h" + +#include <boost/algorithm/string.hpp> + +using namespace Rlv; + +// ============================================================================ +// Static variable initialization +// + +bool RlvHandler::mIsEnabled = false; + +// ============================================================================ +// Command processing functions +// + +bool RlvHandler::handleSimulatorChat(std::string& message, const LLChat& chat, const LLViewerObject* chatObj) +{ + // *TODO: There's an edge case for temporary attachments when going from enabled -> disabled with restrictions already in place + static LLCachedControl<bool> enable_temp_attach(gSavedSettings, Settings::EnableTempAttach); + static LLCachedControl<bool> show_debug_output(gSavedSettings, Settings::Debug); + static LLCachedControl<bool> hide_unset_dupes(gSavedSettings, Settings::DebugHideUnsetDup); + + if ( message.length() <= 3 || Constants::CmdPrefix != message[0] || CHAT_TYPE_OWNER != chat.mChatType || + (chatObj && chatObj->isTempAttachment() && !enable_temp_attach()) ) + { + return false; + } + + message.erase(0, 1); + LLStringUtil::toLower(message); + CommandDbgOut cmdDbgOut(message, chatObj->getID() == gAgentID); + + boost_tokenizer tokens(message, boost::char_separator<char>(",", "", boost::drop_empty_tokens)); + for (const std::string& strCmd : tokens) + { + ECmdRet eRet = processCommand(chat.mFromID, strCmd, true); + if ( show_debug_output() && + (!hide_unset_dupes() || (ECmdRet::SuccessUnset != eRet && ECmdRet::SuccessDuplicate != eRet)) ) + { + cmdDbgOut.add(strCmd, eRet); + } + } + + message = cmdDbgOut.get(); + return true; +} + +ECmdRet RlvHandler::processCommand(const LLUUID& idObj, const std::string& strCmd, bool fromObj) +{ + const RlvCommand rlvCmd(idObj, strCmd); + return processCommand(std::ref(rlvCmd), fromObj); +} + +ECmdRet RlvHandler::processCommand(std::reference_wrapper<const RlvCommand> rlvCmd, bool fromObj) +{ + { + const RlvCommand& rlvCmdTmp = rlvCmd; // Reference to the temporary with limited variable scope since we don't want it to leak below + + RLV_DEBUGS << "[" << rlvCmdTmp.getObjectID() << "]: " << rlvCmdTmp.asString() << RLV_ENDL; + if (!rlvCmdTmp.isValid()) + { + RLV_DEBUGS << "\t-> invalid syntax" << RLV_ENDL; + return ECmdRet::FailedSyntax; + } + if (rlvCmdTmp.isBlocked()) + { + RLV_DEBUGS << "\t-> blocked command" << RLV_ENDL; + return ECmdRet::FailedDisabled; + } + } + + ECmdRet eRet = ECmdRet::Unknown; + switch (rlvCmd.get().getParamType()) + { + case EParamType::Reply: + case EParamType::Force: + case EParamType::Remove: + case EParamType::Add: + eRet = rlvCmd.get().processCommand(); + break; + case EParamType::Unknown: + default: + eRet = ECmdRet::FailedParam; + break; + } + RLV_ASSERT(ECmdRet::Unknown != eRet); + + RLV_DEBUGS << "\t--> command " << (isReturnCodeSuccess(eRet) ? "succeeded" : "failed") << RLV_ENDL; + + return eRet; +} + +// ============================================================================ +// Initialization helper functions +// + +bool RlvHandler::canEnable() +{ + return LLStartUp::getStartupState() <= STATE_LOGIN_CLEANUP; +} + +bool RlvHandler::setEnabled(bool enable) +{ + if (mIsEnabled == enable) + return enable; + + if (enable && canEnable()) + { + RLV_INFOS << "Enabling Restrained Love API support - " << Strings::getVersionAbout() << RLV_ENDL; + mIsEnabled = true; + } + + return mIsEnabled; +} + +// ============================================================================ +// Command handlers (RLV_TYPE_REPLY) +// + +ECmdRet CommandHandlerBaseImpl<EParamType::Reply>::processCommand(const RlvCommand& rlvCmd, ReplyHandlerFunc* pHandler) +{ + // Sanity check - <param> should specify a - valid - reply channel + S32 nChannel; + if (!LLStringUtil::convertToS32(rlvCmd.getParam(), nChannel) || !Util::isValidReplyChannel(nChannel, rlvCmd.getObjectID() == gAgentID)) + return ECmdRet::FailedParam; + + std::string strReply; + ECmdRet eRet = (*pHandler)(rlvCmd, strReply); + + // If we made it this far then: + // - the command was handled successfully so we send off the response + // - the command failed but we still send off an - empty - response to keep the issuing script from blocking + if (nChannel != 0) + { + Util::sendChatReply(nChannel, strReply); + } + RlvHandler::instance().mOnCommandOutput(rlvCmd, nChannel, strReply); + + return eRet; +} + +// Handles: @getcommand[:<behaviour>[;<type>[;<separator>]]]=<channel> +template<> template<> +ECmdRet ReplyHandler<EBehaviour::GetCommand>::onCommand(const RlvCommand& rlvCmd, std::string& strReply) +{ + std::vector<std::string> optionList; + Util::parseStringList(rlvCmd.getOption(), optionList); + + // If a second parameter is present it'll specify the command type + EParamType eType = EParamType::Unknown; + if (optionList.size() >= 2) + { + if (optionList[1] == "any" || optionList[1].empty()) + eType = EParamType::Unknown; + else if (optionList[1] == "add") + eType = EParamType::AddRem; + else if (optionList[1] == "force") + eType = EParamType::Force; + else if (optionList[1] == "reply") + eType = EParamType::Reply; + else + return ECmdRet::FailedOption; + } + + std::list<std::string> cmdList; + if (BehaviourDictionary::instance().getCommands(!optionList.empty() ? optionList[0] : LLStringUtil::null, eType, cmdList)) + strReply = boost::algorithm::join(cmdList, optionList.size() >= 3 ? optionList[2] : Constants::OptionSeparator); + return ECmdRet::Succeeded; +} + +// Handles: @version=<chnannel> and @versionnew=<channel> +template<> template<> +ECmdRet VersionReplyHandler::onCommand(const RlvCommand& rlvCmd, std::string& strReply) +{ + strReply = Strings::getVersion(EBehaviour::Version == rlvCmd.getBehaviourType()); + return ECmdRet::Succeeded; +} + +// Handles: @versionnum[:impl]=<channel> +template<> template<> +ECmdRet ReplyHandler<EBehaviour::VersionNum>::onCommand(const RlvCommand& rlvCmd, std::string& strReply) +{ + if (!rlvCmd.hasOption()) + strReply = Strings::getVersionNum(); + else if ("impl" == rlvCmd.getOption()) + strReply = Strings::getVersionImplNum(); + else + return ECmdRet::FailedOption; + return ECmdRet::Succeeded; +} + +template<> template<> +ECmdRet ReplyHandler<EBehaviour::GetSitID>::onCommand(const RlvCommand& rlvCmd, std::string& strReply) +{ + if (gAgent.isSitting()) + gAgent.getSitObjectID().toString(strReply); + else + strReply = "00000000-0000-0000-0000-000000000000"; + return ECmdRet::Succeeded; +} + +template<> template<> +ECmdRet ReplyHandler<EBehaviour::GetInv>::onCommand(const RlvCommand& rlvCmd, std::string& strReply) +{ + auto folderID = gInventory.getRootFolderID(); + LLNameCategoryCollector has_name("#RLV"); + if (!gInventory.hasMatchingDirectDescendent(folderID, has_name)) + return ECmdRet::FailedNoSharedRoot; + folderID = findDescendentCategoryIDByName(folderID, "#RLV"); + strReply = ""; + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + std::vector<std::string> optionList; + auto option = rlvCmd.getOption(); + if (!option.empty()) + { + Util::parseStringList(option, optionList, "/"); + auto optIter = optionList.begin(); + for(; optionList.end() != optIter; ++optIter) + { + auto name = *optIter; + if (!name.empty()) + folderID = findDescendentCategoryIDByName(folderID, name); + } + } + gInventory.getDirectDescendentsOf(folderID, cats, items); + auto iter = cats->begin(); + for(; cats->end() != iter; ++iter) + { + auto name = (*iter)->getName(); + if (name.front() == '.') + continue; + if (iter != cats->begin()) + strReply.append(","); + strReply.append(name); + } + return ECmdRet::Succeeded; +} + +// Force + +ECmdRet CommandHandlerBaseImpl<EParamType::Force>::processCommand(const RlvCommand& rlvCmd, ForceHandlerFunc* pHandler) +{ + return (*pHandler)(rlvCmd); +} + +template<> template<> +ECmdRet ForceHandler<EBehaviour::Sit>::onCommand(const RlvCommand& rlvCmd) +{ + handle_object_sit(LLUUID{rlvCmd.getOption()}); + return ECmdRet::Succeeded; +} + +template<> template<> +ECmdRet ForceHandler<EBehaviour::SitGround>::onCommand(const RlvCommand& rlvCmd) +{ + gAgent.sitDown(); + return ECmdRet::Succeeded; +} + +template<> template<> +ECmdRet ForceHandler<EBehaviour::Unsit>::onCommand(const RlvCommand& rlvCmd) +{ + gAgent.standUp(); + return ECmdRet::Succeeded; +} + +template<> template<> +ECmdRet ForceHandler<EBehaviour::RemOutfit>::onCommand(const RlvCommand& rlvCmd) +{ + std::vector<std::string> optionList; + auto option = rlvCmd.getOption(); + if (option.empty()) + { + LLAppearanceMgr::instance().removeAllClothesFromAvatar(); + } + else + { + LLWearableType::EType type = LLWearableType::getInstance()->typeNameToType(option); + if (type >= LLWearableType::WT_SHAPE + && type < LLWearableType::WT_COUNT + && (gAgentWearables.getWearableCount(type) > 0)) + { + U32 wearable_index = gAgentWearables.getWearableCount(type) - 1; + LLUUID item_id = gAgentWearables.getWearableItemID(type,wearable_index); + LLAppearanceMgr::instance().removeItemFromAvatar(item_id); + } + } + return ECmdRet::Succeeded; +} + +#define RESTRAINED_LOVE_OUTFIT(A) \ + auto folderID = gInventory.getRootFolderID();\ + LLNameCategoryCollector has_name("#RLV");\ + if (!gInventory.hasMatchingDirectDescendent(folderID, has_name))\ + return ECmdRet::FailedNoSharedRoot;\ + folderID = findDescendentCategoryIDByName(folderID, "#RLV");\ + std::vector<std::string> optionList;\ + auto option = rlvCmd.getOption();\ + if (!option.empty())\ + {\ + folderID = findDescendentCategoryIDByName(folderID, option);\ + if (folderID == LLUUID::null)\ + {\ + Util::parseStringList(option, optionList, "/");\ + auto iter = optionList.begin();\ + for(; optionList.end() != iter; ++iter)\ + {\ + auto name = *iter;\ + if (!name.empty())\ + folderID = findDescendentCategoryIDByName(folderID, name);\ + }\ + }\ + A\ + }\ + return ECmdRet::Succeeded; + +#define RESTRAINED_LOVE_REPLACE \ + LLAppearanceMgr::instance().replaceCurrentOutfit(folderID); + +#define RESTRAINED_LOVE_ADD \ + LLAppearanceMgr::instance().addCategoryToCurrentOutfit(folderID); + +template<> template<> +ECmdRet ForceHandler<EBehaviour::Attach>::onCommand(const RlvCommand& rlvCmd) +{ + RESTRAINED_LOVE_OUTFIT(RESTRAINED_LOVE_REPLACE); +} + +template<> template<> +ECmdRet ForceHandler<EBehaviour::AttachOver>::onCommand(const RlvCommand& rlvCmd) +{ + RESTRAINED_LOVE_OUTFIT(RESTRAINED_LOVE_ADD); +} + +template<> template<> +ECmdRet ForceHandler<EBehaviour::Detach>::onCommand(const RlvCommand& rlvCmd) +{ + auto folderID = gInventory.getRootFolderID(); + LLNameCategoryCollector has_name("#RLV"); + if (!gInventory.hasMatchingDirectDescendent(folderID, has_name)) + return ECmdRet::FailedNoSharedRoot; + folderID = findDescendentCategoryIDByName(folderID, "#RLV"); + std::vector<std::string> optionList; + auto option = rlvCmd.getOption(); + if (!option.empty()) + { + LLNameCategoryCollector is_named(option); + if (gInventory.hasMatchingDirectDescendent(folderID, is_named)) + { + folderID = findDescendentCategoryIDByName(folderID, option); + LLAppearanceMgr::instance().takeOffOutfit(folderID); + } + } + return ECmdRet::Succeeded; +} + +// AddRem + +ECmdRet CommandHandlerBaseImpl<EParamType::AddRem>::processCommand(const RlvCommand& rlvCmd, BhvrHandlerFunc* pHandler, BhvrToggleHandlerFunc* pToggleHandler) +{ + auto param = rlvCmd.getParam(); + bool toggle = false; + if (param == "y") + toggle = true; + else if (param != "n") + return ECmdRet::FailedParam; + return (*pHandler)(rlvCmd, toggle); +} + +template<> template<> +ECmdRet BehaviourToggleHandler<EBehaviour::Sit>::onCommand(const RlvCommand& rlvCmd, bool& toggle) +{ + gAgent.setAllowedToSit(toggle); + return ECmdRet::Succeeded; +} + +template<> template<> +ECmdRet BehaviourToggleHandler<EBehaviour::Unsit>::onCommand(const RlvCommand& rlvCmd, bool& toggle) +{ + gAgent.setAllowedToStand(toggle); + if (gAgent.isSitting()) + LLPanelStandStopFlying::getInstance()->setVisibleStandButton(toggle); + return ECmdRet::Succeeded; +} + +template<> template<> +ECmdRet BehaviourToggleHandler<EBehaviour::Detach>::onCommand(const RlvCommand& rlvCmd, bool& toggle) +{ + gObjectList.findObject(rlvCmd.getObjectID())->setLocked(!toggle); + return ECmdRet::Succeeded; +} + +// ============================================================================ diff --git a/indra/newview/rlvhandler.h b/indra/newview/rlvhandler.h new file mode 100644 index 0000000000..38612485b1 --- /dev/null +++ b/indra/newview/rlvhandler.h @@ -0,0 +1,80 @@ +/** + * @file rlvhandler.h + * @author Kitty Barnett + * @brief Primary command process and orchestration class + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, 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$ + */ + +#pragma once + +#include "llchat.h" +#include "llsingleton.h" + +#include "rlvhelper.h" + +class LLViewerObject; + +// ============================================================================ +// RlvHandler class +// + +class RlvHandler : public LLSingleton<RlvHandler> +{ + template<Rlv::EParamType> friend struct Rlv::CommandHandlerBaseImpl; + + LLSINGLETON_EMPTY_CTOR(RlvHandler); + + /* + * Command processing + */ +public: + // Command processing helper functions + bool handleSimulatorChat(std::string& message, const LLChat& chat, const LLViewerObject* chatObj); + Rlv::ECmdRet processCommand(const LLUUID& idObj, const std::string& stCmd, bool fromObj); +protected: + Rlv::ECmdRet processCommand(std::reference_wrapper<const RlvCommand> rlvCmdRef, bool fromObj); + + /* + * Helper functions + */ +public: + // Initialization (deliberately static so they can safely be called in tight loops) + static bool canEnable(); + static bool isEnabled() { return mIsEnabled; } + static bool setEnabled(bool enable); + + /* + * Event handling + */ +public: + // The command output signal is triggered whenever a command produces channel or debug output + using command_output_signal_t = boost::signals2::signal<void (const RlvCommand&, S32, const std::string&)>; + boost::signals2::connection setCommandOutputCallback(const command_output_signal_t::slot_type& cb) { return mOnCommandOutput.connect(cb); } + +protected: + command_output_signal_t mOnCommandOutput; +private: + static bool mIsEnabled; +}; + +// ============================================================================ diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp new file mode 100644 index 0000000000..2c14434194 --- /dev/null +++ b/indra/newview/rlvhelper.cpp @@ -0,0 +1,405 @@ +/** + * @file rlvhelper.cpp + * @author Kitty Barnett + * @brief RLVa helper classes for internal use only + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, 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 "lltrans.h" +#include "llviewercontrol.h" + +#include "rlvhelper.h" + +#include <boost/algorithm/string.hpp> + +using namespace Rlv; + +// ============================================================================ +// BehaviourDictionary +// + +BehaviourDictionary::BehaviourDictionary() +{ + // + // Restrictions + // + + // + // Reply-only + // + addEntry(new ReplyProcessor<EBehaviour::GetCommand>("getcommand")); + addEntry(new ReplyProcessor<EBehaviour::GetSitID>("getsitid")); + addEntry(new ReplyProcessor<EBehaviour::GetInv>("getinv")); + addEntry(new ReplyProcessor<EBehaviour::Version, VersionReplyHandler>("version")); + addEntry(new ReplyProcessor<EBehaviour::VersionNew, VersionReplyHandler>("versionnew")); + addEntry(new ReplyProcessor<EBehaviour::VersionNum>("versionnum")); + + // Force + addEntry(new ForceProcessor<EBehaviour::Sit>("sit")); + addEntry(new ForceProcessor<EBehaviour::SitGround>("sitground")); + addEntry(new ForceProcessor<EBehaviour::Unsit>("unsit")); + addEntry(new ForceProcessor<EBehaviour::RemOutfit>("remoutfit")); + addEntry(new ForceProcessor<EBehaviour::Attach>("attach")); + addEntry(new ForceProcessor<EBehaviour::AttachOver>("attachover")); + addEntry(new ForceProcessor<EBehaviour::Detach>("detach")); + + // AddRem + addEntry(new BehaviourProcessor<EBehaviour::Sit>("sit")); + addEntry(new BehaviourProcessor<EBehaviour::Unsit>("unsit")); + addEntry(new BehaviourProcessor<EBehaviour::Detach>("detach")); + + // Populate mString2InfoMap (the tuple <behaviour, type> should be unique) + for (const BehaviourInfo* bhvr_info_p : mBhvrInfoList) + { + mString2InfoMap.insert(std::make_pair(std::make_pair(bhvr_info_p->getBehaviour(), static_cast<EParamType>(bhvr_info_p->getParamTypeMask())), bhvr_info_p)); + } + + // Populate m_Bhvr2InfoMap (there can be multiple entries per ERlvBehaviour) + for (const BehaviourInfo* bhvr_info_p : mBhvrInfoList) + { + if ((bhvr_info_p->getParamTypeMask() & to_underlying(EParamType::AddRem)) && !bhvr_info_p->isSynonym()) + { +#ifdef RLV_DEBUG + for (const auto& itBhvr : boost::make_iterator_range(mBhvr2InfoMap.lower_bound(bhvr_info_p->getBehaviourType()), mBhvr2InfoMap.upper_bound(bhvr_info_p->getBehaviourType()))) + { + RLV_ASSERT((itBhvr.first != bhvr_info_p->getBehaviourType()) || (itBhvr.second->getBehaviourFlags() != bhvr_info_p->getBehaviourFlags())); + } +#endif // RLV_DEBUG + mBhvr2InfoMap.insert(std::pair(bhvr_info_p->getBehaviourType(), bhvr_info_p)); + } + } +} + +BehaviourDictionary::~BehaviourDictionary() +{ + for (const BehaviourInfo* bhvr_info_p : mBhvrInfoList) + { + delete bhvr_info_p; + } + mBhvrInfoList.clear(); +} + +void BehaviourDictionary::addEntry(const BehaviourInfo* entry_p) +{ + // Filter experimental commands (if disabled) + static LLCachedControl<bool> sEnableExperimental(gSavedSettings, Settings::EnableExperimentalCommands); + if (!entry_p || (!sEnableExperimental && entry_p->isExperimental())) + { + return; + } + + // Sanity check for duplicate entries +#ifndef LL_RELEASE_FOR_DOWNLOAD + std::for_each(mBhvrInfoList.begin(), mBhvrInfoList.end(), + [&entry_p](const BehaviourInfo* bhvr_info_p) { + RLV_ASSERT_DBG((bhvr_info_p->getBehaviour() != entry_p->getBehaviour()) || ((bhvr_info_p->getParamTypeMask() & entry_p->getParamTypeMask()) == 0)); + }); +#endif // LL_RELEASE_FOR_DOWNLOAD + + mBhvrInfoList.push_back(entry_p); +} + +const BehaviourInfo* BehaviourDictionary::getBehaviourInfo(EBehaviour eBhvr, EParamType eParamType) const +{ + const BehaviourInfo* bhvr_info_p = nullptr; + for (auto itBhvrLower = mBhvr2InfoMap.lower_bound(eBhvr), itBhvrUpper = mBhvr2InfoMap.upper_bound(eBhvr); + std::find_if(itBhvrLower, itBhvrUpper, [eParamType](const auto& bhvrEntry) { return bhvrEntry.second->getParamTypeMask() == to_underlying(eParamType); }) != itBhvrUpper; + ++itBhvrLower) + { + if (bhvr_info_p) + return nullptr; + bhvr_info_p = itBhvrLower->second; + } + return bhvr_info_p; +} + +const BehaviourInfo* BehaviourDictionary::getBehaviourInfo(const std::string& strBhvr, EParamType eParamType, bool* is_strict_p) const +{ + size_t idxBhvrLastPart = strBhvr.find_last_of('_'); + std::string strBhvrLastPart((std::string::npos != idxBhvrLastPart) && (idxBhvrLastPart < strBhvr.size()) ? strBhvr.substr(idxBhvrLastPart + 1) : LLStringUtil::null); + + bool isStrict = (strBhvrLastPart.compare("sec") == 0); + if (is_strict_p) + *is_strict_p = isStrict; + + auto itBhvr = mString2InfoMap.find(std::make_pair((!isStrict) ? strBhvr : strBhvr.substr(0, strBhvr.size() - 4), (has_flag(eParamType, EParamType::AddRem)) ? EParamType::AddRem : eParamType)); + if ((mString2InfoMap.end() == itBhvr) && (!isStrict) && (!strBhvrLastPart.empty()) && (EParamType::Force == eParamType)) + { + // No match found but it could still be a local scope modifier + auto itBhvrMod = mString2InfoMap.find(std::make_pair(strBhvr.substr(0, idxBhvrLastPart), EParamType::AddRem)); + } + + return ((itBhvr != mString2InfoMap.end()) && ((!isStrict) || (itBhvr->second->hasStrict()))) ? itBhvr->second : nullptr; +} + +EBehaviour BehaviourDictionary::getBehaviourFromString(const std::string& strBhvr, EParamType eParamType, bool* pisStrict) const +{ + const BehaviourInfo* bhvr_info_p = getBehaviourInfo(strBhvr, eParamType, pisStrict); + // Filter out locally scoped modifier commands since they don't actually have a unique behaviour value of their own + return bhvr_info_p->getBehaviourType(); +} + +bool BehaviourDictionary::getCommands(const std::string& strMatch, EParamType eParamType, std::list<std::string>& cmdList) const +{ + cmdList.clear(); + for (const BehaviourInfo* bhvr_info_p : mBhvrInfoList) + { + if ((bhvr_info_p->getParamTypeMask() & to_underlying(eParamType)) || (EParamType::Unknown == eParamType)) + { + std::string strCmd = bhvr_info_p->getBehaviour(); + if ((std::string::npos != strCmd.find(strMatch)) || (strMatch.empty())) + cmdList.push_back(strCmd); + if ((bhvr_info_p->hasStrict()) && ((std::string::npos != strCmd.append("_sec").find(strMatch)) || (strMatch.empty()))) + cmdList.push_back(strCmd); + } + } + return !cmdList.empty(); +} + +bool BehaviourDictionary::getHasStrict(EBehaviour eBhvr) const +{ + for (const auto& itBhvr : boost::make_iterator_range(mBhvr2InfoMap.lower_bound(eBhvr), mBhvr2InfoMap.upper_bound(eBhvr))) + { + // Only restrictions can be strict + if (to_underlying(EParamType::AddRem) != itBhvr.second->getParamTypeMask()) + continue; + return itBhvr.second->hasStrict(); + } + RLV_ASSERT(false); + return false; +} + +void BehaviourDictionary::toggleBehaviourFlag(const std::string& strBhvr, EParamType eParamType, BehaviourInfo::EBehaviourFlags eBhvrFlag, bool fEnable) +{ + auto itBhvr = mString2InfoMap.find(std::make_pair(strBhvr, (has_flag(eParamType, EParamType::AddRem)) ? EParamType::AddRem : eParamType)); + if (mString2InfoMap.end() != itBhvr) + { + const_cast<BehaviourInfo*>(itBhvr->second)->toggleBehaviourFlag(eBhvrFlag, fEnable); + } +} + +// ============================================================================ +// RlvCommmand +// + +RlvCommand::RlvCommand(const LLUUID& idObj, const std::string& strCmd) + : mObjId(idObj) +{ + if (parseCommand(strCmd, mBehaviour, mOption, mParam)) + { + if ("n" == mParam || "add" == mParam) + mParamType = EParamType::Add; + else if ("y" == mParam || "rem" == mParam) + mParamType = EParamType::Remove; + else if ("clear" == mBehaviour) // clear is the odd one out so just make it its own type + mParamType = EParamType::Clear; + else if ("force" == mParam) + mParamType = EParamType::Force; + else if (S32 nTemp; LLStringUtil::convertToS32(mParam, nTemp)) // Assume it's a reply command if we can convert <param> to an S32 + mParamType = EParamType::Reply; + } + + mIsValid = mParamType != EParamType::Unknown; + if (!mIsValid) + { + mOption.clear(); + mParam.clear(); + return; + } + + mBhvrInfo = BehaviourDictionary::instance().getBehaviourInfo(mBehaviour, mParamType, &mIsStrict); +} + +RlvCommand::RlvCommand(const RlvCommand& rlvCmd, EParamType eParamType) + : mIsValid(rlvCmd.mIsValid), mObjId(rlvCmd.mObjId), mBehaviour(rlvCmd.mBehaviour), mBhvrInfo(rlvCmd.mBhvrInfo) + , mParamType( (EParamType::Unknown == eParamType) ? rlvCmd.mParamType : eParamType) + , mIsStrict(rlvCmd.mIsStrict), mOption(rlvCmd.mOption), mParam(rlvCmd.mParam), mIsRefCounted(rlvCmd.mIsRefCounted) +{ +} + +bool RlvCommand::parseCommand(const std::string& strCmd, std::string& strBhvr, std::string& strOption, std::string& strParam) +{ + // Format: <behaviour>[:<option>]=<param> + const size_t idxOption = strCmd.find(':'); + const size_t idxParam = strCmd.find('='); + + // If <behaviour> is missing it's always an improperly formatted command + // If there's an option, but it comes after <param> it's also invalid + if ( (idxOption == 0 || idxParam == 0) || + (idxOption != std::string::npos && idxOption >= idxParam) ) + { + return false; + } + + strBhvr = strCmd.substr(0, std::string::npos != idxOption ? idxOption : idxParam); + strOption = strParam = ""; + + // If <param> is missing it's an improperly formatted command + if (idxParam == std::string::npos || idxParam + 1 == strCmd.length()) + { + // Unless "<behaviour> == "clear" AND (idxOption == 0)" + // OR <behaviour> == "clear" AND (idxParam != 0) + if (strBhvr == "clear" && (!idxOption || idxParam)) + return true; + return false; + } + + if (idxOption != std::string::npos && idxOption + 1 != idxParam) + strOption = strCmd.substr(idxOption + 1, idxParam - idxOption - 1); + strParam = strCmd.substr(idxParam + 1); + + return true; +} + +std::string RlvCommand::asString() const +{ + // NOTE: @clear=<param> should be represented as clear:<param> + return mParamType != EParamType::Clear + ? getBehaviour() + (!mOption.empty() ? ":" + mOption : "") + : getBehaviour() + (!mParam.empty() ? ":" + mParam : ""); +} + +// ========================================================================= +// Various helper classes/timers/functors +// + +namespace Rlv +{ + // =========================================================================== + // CommandDbgOut + // + + void CommandDbgOut::add(std::string strCmd, ECmdRet eRet) + { + const std::string strSuffix = getReturnCodeString(eRet); + if (!strSuffix.empty()) + strCmd.append(llformat(" (%s)", strSuffix.c_str())); + else if (mForConsole) + return; // Only show console feedback on successful commands when there's an informational notice + + std::string& strResult = mCommandResults[isReturnCodeSuccess(eRet) ? ECmdRet::Succeeded : (ECmdRet::Retained == eRet ? ECmdRet::Retained : ECmdRet::Failed)]; + if (!strResult.empty()) + strResult.append(", "); + strResult.append(strCmd); + } + + std::string CommandDbgOut::get() const { + std::ostringstream result; + + if (1 == mCommandResults.size() && !mForConsole) + { + auto it = mCommandResults.begin(); + result << " " << getDebugVerbFromReturnCode(it->first) << ": @" << it->second; + } + else if (!mCommandResults.empty()) + { + auto appendResult = [&](ECmdRet eRet, const std::string& name) + { + auto it = mCommandResults.find(eRet); + if (it == mCommandResults.end()) return; + if (!mForConsole) result << "\n - "; + result << LLTrans::getString(name) << ": @" << it->second; + }; + if (!mForConsole) + result << ": @" << mOrigCmd; + appendResult(ECmdRet::Succeeded, !mForConsole ? "RlvDebugExecuted" : "RlvConsoleExecuted"); + appendResult(ECmdRet::Failed, !mForConsole ? "RlvDebugFailed" : "RlvConsoleFailed"); + appendResult(ECmdRet::Retained, !mForConsole ? "RlvDebugRetained" : "RlvConsoleRetained"); + } + + return result.str(); + } + + std::string CommandDbgOut::getDebugVerbFromReturnCode(ECmdRet eRet) + { + switch (eRet) + { + case ECmdRet::Succeeded: + return LLTrans::getString("RlvDebugExecuted"); + case ECmdRet::Failed: + return LLTrans::getString("RlvDebugFailed"); + case ECmdRet::Retained: + return LLTrans::getString("RlvDebugRetained"); + default: + RLV_ASSERT(false); + return LLStringUtil::null; + } + } + + std::string CommandDbgOut::getReturnCodeString(ECmdRet eRet) + { + switch (eRet) + { + case ECmdRet::SuccessUnset: + return LLTrans::getString("RlvReturnCodeUnset"); + case ECmdRet::SuccessDuplicate: + return LLTrans::getString("RlvReturnCodeDuplicate"); + case ECmdRet::SuccessDelayed: + return LLTrans::getString("RlvReturnCodeDelayed"); + case ECmdRet::SuccessDeprecated: + return LLTrans::getString("RlvReturnCodeDeprecated"); + case ECmdRet::FailedSyntax: + return LLTrans::getString("RlvReturnCodeSyntax"); + case ECmdRet::FailedOption: + return LLTrans::getString("RlvReturnCodeOption"); + case ECmdRet::FailedParam: + return LLTrans::getString("RlvReturnCodeParam"); + case ECmdRet::FailedLock: + return LLTrans::getString("RlvReturnCodeLock"); + case ECmdRet::FailedDisabled: + return LLTrans::getString("RlvReturnCodeDisabled"); + case ECmdRet::FailedUnknown: + return LLTrans::getString("RlvReturnCodeUnknown"); + case ECmdRet::FailedNoSharedRoot: + return LLTrans::getString("RlvReturnCodeNoSharedRoot"); + case ECmdRet::FailedDeprecated: + return LLTrans::getString("RlvReturnCodeDeprecatedAndDisabled"); + case ECmdRet::FailedNoBehaviour: + return LLTrans::getString("RlvReturnCodeNoBehaviour"); + case ECmdRet::FailedUnheldBehaviour: + return LLTrans::getString("RlvReturnCodeUnheldBehaviour"); + case ECmdRet::FailedBlocked: + return LLTrans::getString("RlvReturnCodeBlocked"); + case ECmdRet::FailedThrottled: + return LLTrans::getString("RlvReturnCodeThrottled"); + case ECmdRet::FailedNoProcessor: + return LLTrans::getString("RlvReturnCodeNoProcessor"); + // The following are identified by the chat verb + case ECmdRet::Retained: + case ECmdRet::Succeeded: + case ECmdRet::Failed: + return LLStringUtil::null; + // The following shouldn't occur + case ECmdRet::Unknown: + default: + RLV_ASSERT(false); + return LLStringUtil::null; + } + } + + // =========================================================================== +} + +// ============================================================================ diff --git a/indra/newview/rlvhelper.h b/indra/newview/rlvhelper.h new file mode 100644 index 0000000000..f241332594 --- /dev/null +++ b/indra/newview/rlvhelper.h @@ -0,0 +1,299 @@ +/** + * @file rlvhelper.h + * @author Kitty Barnett + * @brief RLVa helper classes for internal use only + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, 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$ + */ + +#pragma once + +#include "rlvdefines.h" + +// ============================================================================ +// Forward declarations +// + +class RlvCommand; + +// ============================================================================ + +namespace Rlv +{ + // ============================================================================ + // BehaviourInfo class - Generic behaviour descriptor (used by restrictions, reply and force commands) + // + + class BehaviourInfo + { + public: + enum EBehaviourFlags : uint32_t + { + // General behaviour flags + Strict = 0x0001, // Behaviour has a "_sec" version + Synonym = 0x0002, // Behaviour is a synonym of another + Extended = 0x0004, // Behaviour is part of the RLVa extended command set + Experimental = 0x0008, // Behaviour is part of the RLVa experimental command set + Blocked = 0x0010, // Behaviour is blocked + Deprecated = 0x0020, // Behaviour is deprecated + MaskGeneral = 0x0FFF, + + // Force-wear specific flags + ForceWear_WearReplace = 0x0001 << 16, + ForceWear_WearAdd = 0x0002 << 16, + ForceWear_WearRemove = 0x0004 << 16, + ForceWear_Node = 0x0010 << 16, + ForceWear_Subtree = 0x0020 << 16, + ForceWear_ContextNone = 0x0100 << 16, + ForceWear_ContextObject = 0x0200 << 16, + MaskForceWear = 0xFFFFu << 16 + }; + + BehaviourInfo(const std::string& strBhvr, EBehaviour eBhvr, EParamType maskParamType, std::underlying_type_t<EBehaviourFlags> nBhvrFlags = 0) + : mBhvr(strBhvr), mBhvrType(eBhvr), mBhvrFlags(nBhvrFlags), mMaskParamType(to_underlying(maskParamType)) {} + virtual ~BehaviourInfo() {} + + const std::string& getBehaviour() const { return mBhvr; } + EBehaviour getBehaviourType() const { return mBhvrType; } + std::underlying_type_t<EBehaviourFlags> getBehaviourFlags() const { return mBhvrFlags; } + std::underlying_type_t<EParamType> getParamTypeMask() const { return mMaskParamType; } + bool hasStrict() const { return mBhvrFlags & Strict; } + bool isBlocked() const { return mBhvrFlags & Blocked; } + bool isExperimental() const { return mBhvrFlags & Experimental; } + bool isExtended() const { return mBhvrFlags & Extended; } + bool isSynonym() const { return mBhvrFlags & Synonym; } + void toggleBehaviourFlag(EBehaviourFlags eBhvrFlag, bool fEnable); + + virtual ECmdRet processCommand(const RlvCommand& rlvCmd) const { return ECmdRet::FailedNoProcessor; } + + protected: + std::string mBhvr; + EBehaviour mBhvrType; + std::underlying_type_t<EBehaviourFlags> mBhvrFlags; + std::underlying_type_t<EParamType> mMaskParamType; + }; + + inline void BehaviourInfo::toggleBehaviourFlag(EBehaviourFlags eBhvrFlag, bool fEnable) + { + if (fEnable) + mBhvrFlags |= eBhvrFlag; + else + mBhvrFlags &= ~eBhvrFlag; + } + + // ============================================================================ + // BehaviourDictionary and related classes + // + + class BehaviourDictionary : public LLSingleton<BehaviourDictionary> + { + LLSINGLETON(BehaviourDictionary); + protected: + ~BehaviourDictionary() override; + public: + void addEntry(const BehaviourInfo* entry_p); + + /* + * General helper functions + */ + public: + EBehaviour getBehaviourFromString(const std::string& strBhvr, EParamType eParamType, bool* is_strict_p = nullptr) const; + const BehaviourInfo* getBehaviourInfo(EBehaviour eBhvr, EParamType eParamType) const; + const BehaviourInfo* getBehaviourInfo(const std::string& strBhvr, EParamType eParamType, bool* is_strict_p = nullptr) const; + bool getCommands(const std::string& strMatch, EParamType eParamType, std::list<std::string>& cmdList) const; + bool getHasStrict(EBehaviour eBhvr) const; + void toggleBehaviourFlag(const std::string& strBhvr, EParamType eParamType, BehaviourInfo::EBehaviourFlags eBvhrFlag, bool fEnable); + + /* + * Member variables + */ + protected: + std::list<const BehaviourInfo*> mBhvrInfoList; + std::map<std::pair<std::string, EParamType>, const BehaviourInfo*> mString2InfoMap; + std::multimap<EBehaviour, const BehaviourInfo*> mBhvr2InfoMap; + }; + + // ============================================================================ + // CommandHandler and related classes + // + + typedef ECmdRet(BhvrHandlerFunc)(const RlvCommand&, bool&); + typedef void(BhvrToggleHandlerFunc)(EBehaviour, bool); + typedef ECmdRet(ForceHandlerFunc)(const RlvCommand&); + typedef ECmdRet(ReplyHandlerFunc)(const RlvCommand&, std::string&); + + // + // CommandHandlerBaseImpl - Base implementation for each command type (the old process(AddRem|Force|Reply)Command functions) + // + template<EParamType paramType> struct CommandHandlerBaseImpl; + template<> struct CommandHandlerBaseImpl<EParamType::AddRem> { static ECmdRet processCommand(const RlvCommand&, BhvrHandlerFunc*, BhvrToggleHandlerFunc* = nullptr); }; + template<> struct CommandHandlerBaseImpl<EParamType::Force> { static ECmdRet processCommand(const RlvCommand&, ForceHandlerFunc*); }; + template<> struct CommandHandlerBaseImpl<EParamType::Reply> { static ECmdRet processCommand(const RlvCommand&, ReplyHandlerFunc*); }; + + // + // CommandHandler - The actual command handler (Note that a handler is more general than a processor; a handler can - for instance - be used by multiple processors) + // + #if LL_WINDOWS + #define RLV_TEMPL_FIX(x) template<x> + #else + #define RLV_TEMPL_FIX(x) template<typename Placeholder = int> + #endif // LL_WINDOWS + + + template <EParamType templParamType, EBehaviour templBhvr> + struct CommandHandler + { + RLV_TEMPL_FIX(typename = typename std::enable_if<templParamType == EParamType::AddRem>::type) static ECmdRet onCommand(const RlvCommand&, bool&); + RLV_TEMPL_FIX(typename = typename std::enable_if<templParamType == EParamType::AddRem>::type) static void onCommandToggle(EBehaviour, bool); + RLV_TEMPL_FIX(typename = typename std::enable_if<templParamType == EParamType::Force>::type) static ECmdRet onCommand(const RlvCommand&); + RLV_TEMPL_FIX(typename = typename std::enable_if<templParamType == EParamType::Reply>::type) static ECmdRet onCommand(const RlvCommand&, std::string&); + }; + + // Aliases to improve readability in definitions + template<EBehaviour templBhvr> using BehaviourHandler = CommandHandler<EParamType::AddRem, templBhvr>; + template<EBehaviour templBhvr> using BehaviourToggleHandler = BehaviourHandler<templBhvr>; + template<EBehaviour templBhvr> using ForceHandler = CommandHandler<EParamType::Force, templBhvr>; + template<EBehaviour templBhvr> using ReplyHandler = CommandHandler<EParamType::Reply, templBhvr>; + + // List of shared handlers + using VersionReplyHandler = ReplyHandler<EBehaviour::Version>; // Shared between @version and @versionnew + + // + // CommandProcessor - Templated glue class that brings BehaviourInfo, CommandHandlerBaseImpl and CommandHandler together + // + template <EParamType templParamType, EBehaviour templBhvr, typename handlerImpl = CommandHandler<templParamType, templBhvr>, typename baseImpl = CommandHandlerBaseImpl<templParamType>> + class CommandProcessor : public BehaviourInfo + { + public: + // Default constructor used by behaviour specializations + RLV_TEMPL_FIX(typename = typename std::enable_if<templBhvr != EBehaviour::Unknown>::type) + CommandProcessor(const std::string& strBhvr, U32 nBhvrFlags = 0) : BehaviourInfo(strBhvr, templBhvr, templParamType, nBhvrFlags) {} + + // Constructor used when we don't want to specialize on behaviour (see BehaviourGenericProcessor) + RLV_TEMPL_FIX(typename = typename std::enable_if<templBhvr == EBehaviour::Unknown>::type) + CommandProcessor(const std::string& strBhvr, EBehaviour eBhvr, U32 nBhvrFlags = 0) : BehaviourInfo(strBhvr, eBhvr, templParamType, nBhvrFlags) {} + + ECmdRet processCommand(const RlvCommand& rlvCmd) const override { return baseImpl::processCommand(rlvCmd, &handlerImpl::onCommand); } + }; + + // Aliases to improve readability in definitions + template<EBehaviour templBhvr, typename handlerImpl = CommandHandler<EParamType::AddRem, templBhvr>> using BehaviourProcessor = CommandProcessor<EParamType::AddRem, templBhvr, handlerImpl>; + template<EBehaviour templBhvr, typename handlerImpl = CommandHandler<EParamType::Force, templBhvr>> using ForceProcessor = CommandProcessor<EParamType::Force, templBhvr, handlerImpl>; + template<EBehaviour templBhvr, typename handlerImpl = CommandHandler<EParamType::Reply, templBhvr>> using ReplyProcessor = CommandProcessor<EParamType::Reply, templBhvr, handlerImpl>; + + // Provides pre-defined generic implementations of basic behaviours (template voodoo - see original commit for something that still made sense) + template<EBehaviourOptionType templOptionType> struct BehaviourGenericHandler { static ECmdRet onCommand(const RlvCommand& rlvCmd, bool& fRefCount); }; + template<EBehaviourOptionType templOptionType> using BehaviourGenericProcessor = BehaviourProcessor<EBehaviour::Unknown, BehaviourGenericHandler<templOptionType>>; + template<EBehaviourOptionType templOptionType> struct ForceGenericHandler { static ECmdRet onCommand(const RlvCommand& rlvCmd); }; + template<EBehaviourOptionType templOptionType> using ForceGenericProcessor = ForceProcessor<EBehaviour::Unknown, ForceGenericHandler<templOptionType>>; + + // ============================================================================ + // BehaviourProcessor and related classes - Handles add/rem comamnds aka "restrictions) + // + + template <EBehaviour eBhvr, typename handlerImpl = BehaviourHandler<eBhvr>, typename toggleHandlerImpl = BehaviourToggleHandler<eBhvr>> + class BehaviourToggleProcessor : public BehaviourInfo + { + public: + BehaviourToggleProcessor(const std::string& strBhvr, U32 nBhvrFlags = 0) : BehaviourInfo(strBhvr, eBhvr, EParamType::AddRem, nBhvrFlags) {} + ECmdRet processCommand(const RlvCommand& rlvCmd) const override { return CommandHandlerBaseImpl<EParamType::AddRem>::processCommand(rlvCmd, &handlerImpl::onCommand, &toggleHandlerImpl::onCommandToggle); } + }; + template <EBehaviour eBhvr, EBehaviourOptionType optionType, typename toggleHandlerImpl = BehaviourToggleHandler<eBhvr>> using RlvBehaviourGenericToggleProcessor = BehaviourToggleProcessor<eBhvr, BehaviourGenericHandler<optionType>, toggleHandlerImpl>; + + // ============================================================================ + // Various helper classes/timers/functors + // + + struct CommandDbgOut + { + CommandDbgOut(const std::string& orig_cmd, bool for_console) : mOrigCmd(orig_cmd), mForConsole(for_console) {} + void add(std::string strCmd, ECmdRet eRet); + std::string get() const; + static std::string getDebugVerbFromReturnCode(ECmdRet eRet); + static std::string getReturnCodeString(ECmdRet eRet); + private: + std::string mOrigCmd; + std::map<ECmdRet, std::string> mCommandResults; + bool mForConsole = false; + }; +} + +// ============================================================================ +// RlvCommand +// + +class RlvCommand +{ +public: + explicit RlvCommand(const LLUUID& idObj, const std::string& strCmd); + RlvCommand(const RlvCommand& rlvCmd, Rlv::EParamType eParamType = Rlv::EParamType::Unknown); + + /* + * Member functions + */ +public: + std::string asString() const; + const std::string& getBehaviour() const { return mBehaviour; } + const Rlv::BehaviourInfo* getBehaviourInfo() const { return mBhvrInfo; } + Rlv::EBehaviour getBehaviourType() const { return (mBhvrInfo) ? mBhvrInfo->getBehaviourType() : Rlv::EBehaviour::Unknown; } + U32 getBehaviourFlags() const { return (mBhvrInfo) ? mBhvrInfo->getBehaviourFlags() : 0; } + const LLUUID& getObjectID() const { return mObjId; } + const std::string& getOption() const { return mOption; } + const std::string& getParam() const { return mParam; } + Rlv::EParamType getParamType() const { return mParamType; } + bool hasOption() const { return !mOption.empty(); } + bool isBlocked() const { return (mBhvrInfo) ? mBhvrInfo->isBlocked() : false; } + bool isRefCounted() const { return mIsRefCounted; } + bool isStrict() const { return mIsStrict; } + bool isValid() const { return mIsValid; } + Rlv::ECmdRet processCommand() const { return (mBhvrInfo) ? mBhvrInfo->processCommand(*this) : Rlv::ECmdRet::FailedNoProcessor; } + +protected: + static bool parseCommand(const std::string& strCommand, std::string& strBehaviour, std::string& strOption, std::string& strParam); + bool markRefCounted() const { return mIsRefCounted = true; } + + /* + * Operators + */ +public: + bool operator ==(const RlvCommand&) const; + + /* + * Member variables + */ +protected: + bool mIsValid = false; + LLUUID mObjId; + std::string mBehaviour; + const Rlv::BehaviourInfo* mBhvrInfo = nullptr; + Rlv::EParamType mParamType = Rlv::EParamType::Unknown; + bool mIsStrict = false; + std::string mOption; + std::string mParam; + mutable bool mIsRefCounted = false; + + friend class RlvHandler; + friend class RlvObject; + template<Rlv::EParamType> friend struct Rlv::CommandHandlerBaseImpl; +}; + +// ============================================================================ diff --git a/indra/newview/skins/contrast/textures/build/Object_Sphere_Selected.png b/indra/newview/skins/contrast/textures/build/Object_Sphere_Selected.png Binary files differdeleted file mode 100644 index ee015e1786..0000000000 --- a/indra/newview/skins/contrast/textures/build/Object_Sphere_Selected.png +++ /dev/null diff --git a/indra/newview/skins/contrast/textures/build/Object_Tree_Selected.png b/indra/newview/skins/contrast/textures/build/Object_Tree_Selected.png Binary files differdeleted file mode 100644 index f21b0e4043..0000000000 --- a/indra/newview/skins/contrast/textures/build/Object_Tree_Selected.png +++ /dev/null diff --git a/indra/newview/skins/contrast/textures/cloud-particle.j2c b/indra/newview/skins/contrast/textures/cloud-particle.j2c Binary files differdeleted file mode 100644 index 6c03bf6d05..0000000000 --- a/indra/newview/skins/contrast/textures/cloud-particle.j2c +++ /dev/null diff --git a/indra/newview/skins/contrast/textures/default_land_picture.png b/indra/newview/skins/contrast/textures/default_land_picture.png Binary files differnew file mode 100644 index 0000000000..c53a5f6aa0 --- /dev/null +++ b/indra/newview/skins/contrast/textures/default_land_picture.png diff --git a/indra/newview/skins/contrast/textures/default_profile_picture.png b/indra/newview/skins/contrast/textures/default_profile_picture.png Binary files differnew file mode 100644 index 0000000000..5bade1cb36 --- /dev/null +++ b/indra/newview/skins/contrast/textures/default_profile_picture.png diff --git a/indra/newview/skins/contrast/textures/navbar/Info_Off.png b/indra/newview/skins/contrast/textures/navbar/Info_Off.png Binary files differdeleted file mode 100644 index 64722255a3..0000000000 --- a/indra/newview/skins/contrast/textures/navbar/Info_Off.png +++ /dev/null diff --git a/indra/newview/skins/contrast/textures/navbar/Info_Over.png b/indra/newview/skins/contrast/textures/navbar/Info_Over.png Binary files differdeleted file mode 100644 index 84f1d03129..0000000000 --- a/indra/newview/skins/contrast/textures/navbar/Info_Over.png +++ /dev/null diff --git a/indra/newview/skins/contrast/textures/navbar/Info_Press.png b/indra/newview/skins/contrast/textures/navbar/Info_Press.png Binary files differdeleted file mode 100644 index 169105829e..0000000000 --- a/indra/newview/skins/contrast/textures/navbar/Info_Press.png +++ /dev/null diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_sphere.png b/indra/newview/skins/contrast/textures/widgets/track_control_sphere.png Binary files differdeleted file mode 100644 index 6ba8d3877f..0000000000 --- a/indra/newview/skins/contrast/textures/widgets/track_control_sphere.png +++ /dev/null diff --git a/indra/newview/skins/contrast_gold/colors.xml b/indra/newview/skins/contrast_gold/colors.xml new file mode 100644 index 0000000000..7249e4e6eb --- /dev/null +++ b/indra/newview/skins/contrast_gold/colors.xml @@ -0,0 +1,1001 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<colors> + + <!-- Named Colors --> + <color + name="EmphasisColor" + value="0.857 0.668 0.308 1" /> + <color + name="EmphasisColor_13" + value="0.857 0.668 0.308 0.13" /> + <color + name="EmphasisColor_35" + value="0.857 0.668 0.308 0.35" /> + <color + name="BeaconColor" + value="0.857 0.668 0.308 1" /> + <color + name="White" + value="1 1 1 1" /> + <color + name="White_05" + value="1 1 1 0.05" /> + <color + name="White_10" + value="1 1 1 0.1" /> + <color + name="White_25" + value="1 1 1 0.25" /> + <color + name="White_50" + value="1 1 1 0.5" /> + <color + name="LtGray" + value="0.7 0.7 0.7 1" /> + <color + name="LtGray_35" + value="0.7 0.7 0.7 0.35" /> + <color + name="LtGray_50" + value="0.7 0.7 0.7 0.50" /> + <color + name="Gray" + value="0.4 0.4 0.4 1" /> + <color + name="DkGray0" + value="0.05 0.05 0.05 1" /> + <color + name="DkGray" + value="0.08 0.08 0.08 1" /> + <color + name="DkGray_66" + value="0.08 0.08 0.08 .66" /> + <color + name="DkGray2" + value="0.1 0.1 0.1 1" /> + <color + name="MouseGray" + value="0.12 0.12 0.12 1" /> + <color + name="Black" + value="0 0 0 1" /> + <color + name="Black_10" + value="0 0 0 0.1" /> + <color + name="Black_25" + value="0 0 0 0.25" /> + <color + name="Black_50" + value="0 0 0 0.5" /> + <color + name="FrogGreen" + value="0.26 0.33 0.42 1" /> + <!-- ^(Not actually green) --> + <color + name="Red" + value="1 0 0 1" /> + <color + name="Blue" + value="0 0 1 1" /> + <color + name="Yellow" + value="1 1 0 1" /> + <color + name="Green" + value="0 1 0 1" /> + <color + name="Transparent" + value="0 0 0 0" /> + <color + name="Purple" + value="1 0 1 1" /> + <color + name="Lime" + value=".8 1 .73 1" /> + <color + name="LtYellow" + value="1 1 .79 1" /> + <color + name="DrYellow" + value="1 0.86 0 1" /> + <color + name="LtOrange" + value="1 .85 .73 1" /> + <color + name="MdBlue" + value=".07 .38 .51 1" /> + <color + name="DkBlue" + value=".06 .06 .3 1" /> + <color + name="LtRed" + value="1 0.2 0.2 1" /> + <color + name="LtGreen" + value="0.2 1 0.2 1" /> + <color + name="Red_80" + value="1 0 0 0.8" /> + <color + name="DkRed" + value="0.3 0.06 0.06 1" /> + <color + name="Green_80" + value="0 1 0 0.8" /> + <color + name="Blue_80" + value="0 0 1 0.8" /> + <color + name="Orange" + value="1 .82 .46 1" /> + + <!-- This color name makes potentially unused colors show up bright purple. + Leave this here until all Unused? are removed below, otherwise + the viewer generates many warnings on startup. --> + <color + name="Unused?" + value=".831 1 0 1" /> + + <!-- UI Definitions --> + + <color + name="AccordionHeaderTextColor" + reference="Gray" /> + <color + name="AgentChatColor" + reference="White" /> + <color + name="AlertBoxColor" + value="0.24 0.24 0.24 1" /> + <color + name="AlertCautionBoxColor" + value="1 0.82 0.46 1" /> + <color + name="AlertCautionTextColor" + reference="LtYellow" /> + <color + name="AvatarListItemIconDefaultColor" + reference="White" /> + <color + name="AvatarListItemIconOnlineColor" + reference="White" /> + <color + name="AvatarListItemIconOfflineColor" + value="0.5 0.5 0.5 0.5" /> + <color + name="AvatarListItemIconVoiceInvitedColor" + reference="AvatarListItemIconOfflineColor" /> + <color + name="AvatarListItemIconVoiceJoinedColor" + reference="AvatarListItemIconOnlineColor" /> + <color + name="AvatarListItemIconVoiceLeftColor" + reference="AvatarListItemIconOfflineColor" /> + <color + name="BadgeImageColor" + value="1.0 0.40 0.0 1.0" /> + <color + name="BadgeBorderColor" + value="0.9 0.9 0.9 1.0" /> + <color + name="BadgeLabelColor" + reference="White" /> + <color + name="ButtonBorderColor" + reference="Unused?" /> + <color + name="ButtonCautionImageColor" + reference="Unused?" /> + <color + name="ButtonColor" + reference="Unused?" /> + <color + name="ButtonFlashBgColor" + reference="Unused?" /> + <color + name="ButtonImageColor" + reference="White" /> + <color + name="ButtonLabelColor" + reference="LtGray" /> + <color + name="ButtonLabelDisabledColor" + reference="White_25" /> + <color + name="ButtonLabelSelectedColor" + reference="White" /> + <color + name="ButtonLabelSelectedDisabledColor" + reference="White_25" /> + <color + name="ButtonSelectedBgColor" + reference="Unused?" /> + <color + name="ButtonSelectedColor" + reference="Unused?" /> + <color + name="ButtonUnselectedBgColor" + reference="Unused?" /> + <color + name="ButtonUnselectedFgColor" + reference="Unused?" /> + <color + name="ChatHistoryBgColor" + reference="Transparent" /> + <color + name="ChatHistoryTextColor" + reference="LtGray" /> + <color + name="ChicletFlashColor" + value="0.114 0.65 0.1" /> + <color + name="ColorDropShadow" + reference="Black_50" /> + <color + name="ColorPaletteEntry01" + reference="Black" /> + <color + name="ColorPaletteEntry02" + reference="Gray" /> + <color + name="ColorPaletteEntry03" + value="0.5 0 0 1" /> + <color + name="ColorPaletteEntry04" + value="0.5 0.5 0 1" /> + <color + name="ColorPaletteEntry05" + value="0 0.5 0 1" /> + <color + name="ColorPaletteEntry06" + value="0 0.5 0.5 1" /> + <color + name="ColorPaletteEntry07" + value="0 0 0.5 1" /> + <color + name="ColorPaletteEntry08" + value="0.5 0 0.5 1" /> + <color + name="ColorPaletteEntry09" + value="0.5 0.5 0 1" /> + <color + name="ColorPaletteEntry10" + value="0 0.25 0.25 1" /> + <color + name="ColorPaletteEntry11" + value="0 0.5 1 1" /> + <color + name="ColorPaletteEntry12" + value="0 0.25 0.5 1" /> + <color + name="ColorPaletteEntry13" + value="0.5 0 1 1" /> + <color + name="ColorPaletteEntry14" + value="0.5 0.25 0 1" /> + <color + name="ColorPaletteEntry15" + reference="White" /> + <color + name="ColorPaletteEntry16" + reference="LtYellow" /> + <color + name="ColorPaletteEntry17" + reference="White" /> + <color + name="ColorPaletteEntry18" + reference="LtGray" /> + <color + name="ColorPaletteEntry19" + reference="Red" /> + <color + name="ColorPaletteEntry20" + reference="Yellow" /> + <color + name="ColorPaletteEntry21" + reference="Green" /> + <color + name="ColorPaletteEntry22" + value="0 1 1 1" /> + <color + name="ColorPaletteEntry23" + reference="Blue" /> + <color + name="ColorPaletteEntry24" + reference="Purple" /> + <color + name="ColorPaletteEntry25" + value="1 1 0.5 1" /> + <color + name="ColorPaletteEntry26" + value="0 1 0.5 1" /> + <color + name="ColorPaletteEntry27" + value="0.5 1 1 1" /> + <color + name="ColorPaletteEntry28" + value="0.5 0.5 1 1" /> + <color + name="ColorPaletteEntry29" + value="1 0 0.5 1" /> + <color + name="ColorPaletteEntry30" + value="1 0.5 0 1" /> + <color + name="ColorPaletteEntry31" + reference="White" /> + <color + name="ColorPaletteEntry32" + reference="White" /> + <color + name="ComboListBgColor" + reference="DkGray" /> + <color + name="ConsoleBackground" + reference="Black" /> + <color + name="ContextSilhouetteColor" + reference="EmphasisColor" /> + <color + name="ConversationFriendColor" + value="0.5 0.7 0.85 1" /> + <color + name="DefaultHighlightDark" + reference="White_10" /> + <color + name="DefaultHighlightLight" + reference="White_25" /> + <color + name="DefaultShadowDark" + reference="Black_50" /> + <color + name="DefaultShadowLight" + reference="Black_50" /> + <color + name="EffectColor" + reference="White" /> + <color + name="FilterBackgroundColor" + reference="Black" /> + <color + name="FilterTextColor" + reference="EmphasisColor" /> + <color + name="FloaterButtonImageColor" + reference="Gray" /> + <color + name="FloaterDefaultBackgroundColor" + reference="DkGray_66" /> + <color + name="FloaterFocusBackgroundColor" + reference="DkGray2" /> + <color + name="FloaterFocusBorderColor" + reference="Black_50" /> + <color + name="FloaterUnfocusBorderColor" + reference="Black_50" /> + <color + name="FocusColor" + reference="EmphasisColor" /> + <color + name="FolderViewLoadingMessageTextColor" + value="0.3344 0.545 0.645 1" /> + <color + name="FpsTextColor" + value="0.34 0.51 0.64 0.8" /> + <color + name="GridFocusPointColor" + reference="White_50" /> + <color + name="GridlineBGColor" + value="0.92 0.92 1 0.78" /> + <color + name="GridlineColor" + reference="White" /> + <color + name="GridlineShadowColor" + value="0 0 0 0.31" /> + <color + name="GroupNotifyBoxColor" + value="0.3344 0.5456 0.5159 1" /> + <color + name="GroupNotifyTextColor" + reference="White"/> + <color + name="GroupNotifyDimmedTextColor" + reference="LtGray" /> + <color + name="GroupOverTierColor" + value="0.43 0.06 0.06 1" /> + <color + name="HTMLLinkColor" + reference="EmphasisColor" /> + <color + name="HealthTextColor" + reference="White" /> + <color + name="HelpBgColor" + reference="Unused?" /> + <color + name="HelpFgColor" + reference="Unused?" /> + <color + name="HelpScrollHighlightColor" + reference="Unused?" /> + <color + name="HelpScrollShadowColor" + reference="Unused?" /> + <color + name="HelpScrollThumbColor" + reference="Unused?" /> + <color + name="HelpScrollTrackColor" + reference="Unused?" /> + <color + name="HighlightChildColor" + reference="Yellow" /> + <color + name="HighlightInspectColor" + value="1 0 1 1" /> + <color + name="HighlightParentColor" + value="0.5 0.65 0.8 1" /> + <color + name="IMHistoryBgColor" + reference="Unused?" /> + <color + name="IMHistoryTextColor" + reference="Unused?" /> + <color + name="IconDisabledColor" + reference="White_25" /> + <color + name="IconEnabledColor" + reference="White" /> + <color + name="InventoryBackgroundColor" + reference="DkGray2" /> + <color + name="InventoryFocusOutlineColor" + reference="White_25" /> + <color + name="InventoryItemSuffixColor" + reference="White_25" /> + <color + name="InventoryItemLibraryColor" + reference="EmphasisColor" /> + <color + name="InventoryItemLinkColor" + reference="LtGray_50" /> + <color + name="InventoryMouseOverColor" + reference="LtGray_35" /> + <color + name="InventorySearchStatusColor" + reference="EmphasisColor" /> + <color + name="LabelDisabledColor" + reference="White_25" /> + <color + name="LabelSelectedColor" + reference="White" /> + <color + name="LabelSelectedDisabledColor" + reference="White_25" /> + <color + name="LabelTextColor" + reference="LtGray" /> + <color + name="LoginProgressBarBgColor" + reference="Unused?" /> + <color + name="LoginProgressBarFgColor" + reference="Unused?" /> + <color + name="LoginProgressBoxBorderColor" + value="0.857 0.668 0.308 0" /> + <color + name="LoginProgressBoxCenterColor" + value="0 0 0 0.78" /> + <color + name="LoginProgressBoxShadowColor" + value="0 0 0 0.78" /> + <color + name="LoginProgressBoxTextColor" + reference="White" /> + <color + name="MapAvatarColor" + reference="White" /> + <color + name="MapAvatarFriendColor" + value="0.5 0.7 0.85 1" /> + <color + name="MapAvatarSelfColor" + value="0.53125 0 0.498047 1" /> + <color + name="MapFrustumColor" + reference="White_10" /> + <color + name="MapParcelOutlineColor" + value="1 1 1 0.5" /> + <color + name="MapTrackColor" + reference="Red" /> + <color + name="MapTrackColorUnder" + reference="Blue" /> + <color + name="MapTrackDisabledColor" + value="0.5 0 0 1" /> + <color + name="MenuBarBgColor" + reference="MouseGray" /> + <color + name="MenuBarGodBgColor" + reference="FrogGreen" /> + <color + name="MenuDefaultBgColor" + reference="DkGray2" /> + <color + name="MenuItemDisabledColor" + reference="LtGray_50" /> + <color + name="MenuItemEnabledColor" + reference="LtGray" /> + <color + name="MenuItemHighlightBgColor" + reference="EmphasisColor_35" /> + <color + name="MenuItemFlashBgColor" + reference="BeaconColor" /> + <color + name="MenuItemHighlightFgColor" + reference="White" /> + <color + name="MenuNonProductionBgColor" + reference="Black" /> + <color + name="MenuNonProductionGodBgColor" + value="0.263 0.325 0.345 1" /> + <color + name="MenuPopupBgColor" + reference="DkGray2" /> + <color + name="ModelUploaderLabels" + value="1 0.6 0 1" /> + <color + name="MultiSliderDisabledThumbColor" + reference="Black" /> + <color + name="MultiSliderThumbCenterColor" + reference="White" /> + <color + name="MultiSliderThumbCenterSelectedColor" + reference="Green" /> + <color + name="MultiSliderThumbOutlineColor" + reference="Unused?" /> + <color + name="MultiSliderTrackColor" + reference="LtGray" /> + <color + name="MultiSliderTriangleColor" + reference="Yellow" /> + <!-- + <color + name="NameTagBackground" + value="0.85 0.85 0.85 0.80" /> + --> + <color + name="NameTagBackground" + value="0 0 0 1" /> + <color + name="NameTagChat" + reference="White" /> + <color + name="NameTagFriend" + value="0.5 0.7 0.85 1" /> + <color + name="NameTagLegacy" + reference="White" /> + <color + name="NameTagMatch" + reference="White" /> + <color + name="NameTagMismatch" + reference="White" /> + <color + name="NetMapBackgroundColor" + value="0 0 0 1" /> + <color + name="NetMapGroupOwnAboveWater" + value="0.85 0 0.85 1" /> + <color + name="NetMapGroupOwnBelowWater" + value="0.63 0 0.63 1" /> + <color + name="NetMapOtherOwnAboveWater" + value="0.24 0.24 0.24 1" /> + <color + name="NetMapOtherOwnBelowWater" + value="0.12 0.12 0.12 1" /> + <color + name="NetMapYouOwnAboveWater" + value="0 0.85 0.85 1" /> + <color + name="NetMapYouOwnBelowWater" + value="0 0.63 0.63 1" /> + <color + name="NotifyBoxColor" + value="LtGray" /> + <color + name="NotifyCautionBoxColor" + value="1 0.82 0.46 1" /> + <color + name="NotifyCautionWarnColor" + reference="White" /> + <color + name="NotifyTextColor" + reference="White" /> + <color + name="ObjectBubbleColor" + reference="DkGray_66" /> + <color + name="ObjectChatColor" + reference="LtYellow" /> + <color + name="OverdrivenColor" + reference="Red" /> + <color + name="PanelDefaultBackgroundColor" + reference="DkGray" /> + <color + name="PanelDefaultHighlightLight" + reference="White_50" /> + <color + name="PanelFocusBackgroundColor" + reference="DkGray2" /> + <color + name="PanelNotificationBackground" + value="1 0.3 0.3 0" /> + <color + name="ParcelHoverColor" + reference="White" /> + <color + name="PathfindingErrorColor" + reference="LtRed" /> + <color + name="PathfindingWarningColor" + reference="DrYellow" /> + <color + name="PathfindingGoodColor" + reference="LtGreen" /> + <color + name="MaterialErrorColor" + reference="LtRed" /> + <color + name="MaterialWarningColor" + reference="DrYellow" /> + <color + name="MaterialGoodColor" + reference="LtGreen" /> + <color + name="PathfindingDefaultBeaconColor" + reference="Red_80" /> + <color + name="PathfindingDefaultBeaconTextColor" + reference="White" /> + <color + name="PathfindingLinksetBeaconColor" + reference="Blue_80" /> + <color + name="PathfindingCharacterBeaconColor" + reference="Red_80" /> + <color + name="PieMenuBgColor" + value="0.24 0.24 0.24 0.59" /> + <color + name="PieMenuLineColor" + value="0 0 0 0.5" /> + <color + name="PieMenuSelectedColor" + value="0.72 0.72 0.74 0.3" /> + <color + name="PropertyColorAuction" + value="0.5 0 1 0.4" /> + <color + name="PropertyColorAvail" + reference="Transparent" /> + <color + name="PropertyColorForSale" + value="1 0.5 0 0.4" /> + <color + name="PropertyColorGroup" + value="0 0.72 0.72 0.4" /> + <color + name="PropertyColorOther" + value="1 0 0 0.4" /> + <color + name="PropertyColorSelf" + value="0 1 0 0.4" /> + <color + name="ScriptBgReadOnlyColor" + value="0.39 0.39 0.39 1" /> + <color + name="ScriptErrorColor" + reference="Red" /> + <color + name="ScrollBGStripeColor" + reference="Transparent" /> + <color + name="ScrollBgReadOnlyColor" + reference="Transparent" /> + <color + name="ScrollBgWriteableColor" + reference="White_05" /> + <color + name="ScrollDisabledColor" + reference="White_25" /> + <color + name="ScrollHighlightedColor" + reference="Unused?" /> + <color + name="ScrollHoveredColor" + reference="EmphasisColor_13" /> + <color + name="ScrollSelectedBGColor" + reference="EmphasisColor_35" /> + <color + name="ScrollSelectedFGColor" + reference="White" /> + <color + name="ScrollUnselectedColor" + reference="LtGray" /> + <color + name="ScrollbarThumbColor" + reference="White" /> + <color + name="ScrollbarTrackColor" + reference="Black" /> + <color + name="SelectedOutfitTextColor" + reference="EmphasisColor" /> + <color + name="SilhouetteChildColor" + value="0.13 0.42 0.77 1" /> + <color + name="SilhouetteParentColor" + reference="Yellow" /> + <color + name="SliderDisabledThumbColor" + reference="White_25" /> + <color + name="SliderThumbCenterColor" + reference="White" /> + <color + name="SliderThumbOutlineColor" + reference="White" /> + <color + name="SliderTrackColor" + reference="Unused?" /> + <color + name="SpeakingColor" + reference="FrogGreen" /> + <color + name="SystemChatColor" + reference="LtGray" /> + <color + name="TextBgFocusColor" + reference="White" /> + <color + name="TextBgReadOnlyColor" + reference="White_05" /> + <color + name="TextBgWriteableColor" + reference="LtGray" /> + <color + name="TextCursorColor" + reference="Black" /> + <color + name="TextDefaultColor" + reference="Black" /> + <color + name="TextEmbeddedItemColor" + value="0 0 0.5 1" /> + <color + name="TextEmbeddedItemReadOnlyColor" + reference="Unused?" /> + <color + name="TextFgColor" + value="0.102 0.102 0.102 1" /> + <color + name="TextFgReadOnlyColor" + reference="LtGray" /> + <color + name="TextFgTentativeColor" + value="0.4 0.4 0.4 1" /> + <color + name="TimeTextColor" + reference="LtGray" /> + <color + name="TitleBarFocusColor" + reference="White_10" /> + <color + name="ToastBackground" + value="0.15 0.15 0.15 0" /> + <color + name="ToolTipBgColor" + value="0.937 0.89 0.655 1" /> + <color + name="ToolTipBorderColor" + value="0.812 0.753 0.451 1" /> + <color + name="ToolTipTextColor" + reference="DkGray2" /> + <color + name="InspectorTipTextColor" + reference="LtGray" /> + <color + name="UserChatColor" + reference="White" /> + <color + name="llOwnerSayChatColor" + reference="LtOrange" /> + + <!-- New Colors --> + <color + name="OutputMonitorMutedColor" + reference="DkGray2" /> + <color + name="SysWellItemUnselected" + value="0 0 0 0" /> + <color + name="SysWellItemSelected" + value="0.3 0.3 0.3 1.0" /> + <color + name="ColorSwatchBorderColor" + value="0.45098 0.517647 0.607843 1"/> + <color + name="ChatTeleportSeparatorColor" + reference="Black" /> + <color + name="ChatTimestampColor" + reference="White" /> + <color + name="MenuBarBetaBgColor" + reference="DkBlue" /> + <color + name="MenuBarProjectBgColor" + reference="MdBlue" /> + <color + name="MenuBarTestBgColor" + reference="DkRed" /> + <color + name="MeshImportTableNormalColor" + value="1 1 1 1"/> + <color + name="MeshImportTableHighlightColor" + value="0.2 0.8 1 1"/> + + <color + name="DirectChatColor" + reference="LtOrange" /> + + <color + name="ToolbarDropZoneColor" + value=".48 .69 1 .5" /> + <color + name="PanelNotificationListItem" + value="0.3 0.3 0.3 .3" /> + + <!-- profiles --> + <color + name="StatusUserOnline" + reference="White" /> + <color + name="StatusUserOffline" + reference="LtGray_35" /> + <!-- Groups visible in own profiles --> + <color + name="GroupVisibleInProfile" + reference="TextBgFocusColor" /> + <color + name="GroupHiddenInProfile" + reference="Gray" /> + + + <!-- Generic color names (legacy) --> + <color + name="white" + value="1 1 1 1"/> + <color + name="black" + value="0 0 0 1"/> + <color + name="red" + value="1 0 0 1"/> + <color + name="green" + value="0 1 0 1"/> + <color + name="blue" + value="0 0 1 1"/> + + <!--Resize bar colors --> + + <color + name="ResizebarBorderLight" + value="0.231 0.231 0.231 1"/> + + <color + name="ResizebarBorderDark" + value="0.133 0.133 0.133 1"/> + + <color + name="ResizebarBody" + value="0.208 0.208 0.208 1"/> + + <!-- syntax highlighting (LSL Scripts) --> + <color + name="ScriptText" + reference="Black" /> + <color + name="ScriptBackground" + reference="White" /> + <color + name="ScriptCursorColor" + reference="Black" /> + <color + name="SyntaxLslComment" + value="0 0.5 0 1" /> + <color + name="SyntaxLslConstant" + value="0 0.6 0.6 1" /> + <color + name="SyntaxLslControlFlow" + value="0.4 0 0.8 1" /> + <color + name="SyntaxLslControlLabel" + value="0 0 0.8 1" /> + <color + name="SyntaxLslDataType" + value="0.8 0.4 0 1" /> + <color + name="SyntaxLslDeprecated" + value="0.9 0.0 0.66, 1" /> + <color + name="SyntaxLslEvent" + value="0 0.3 0.5 1" /> + <color + name="SyntaxLslFunction" + value="0.3 0 0.5 1" /> + <color + name="SyntaxLslGodMode" + value="0.7 .2 .35 1" /> + <color + name="SyntaxLslStringLiteral" + value="1 0.14 0 1" /> + <color + name="OutfitGalleryItemSelected" + reference="EmphasisColor_35" /> + <color + name="OutfitGalleryItemWorn" + reference="EmphasisColor_13" /> + <color + name="OutfitGalleryItemUnselected" + value="0.4 0.4 0.4 1" /> + <color + name="PanelGray" + value="0.27 0.27 0.27 1" /> + <color + name="PerformanceMid" + value="1 0.8 0 1" /> + <color + name="OutfitSnapshotMacMask" + value="0.115 0.115 0.115 1"/> + <color + name="OutfitSnapshotMacMask2" + value="0.1 0.1 0.1 1"/> +</colors> diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_Center.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_Center.png Binary files differnew file mode 100644 index 0000000000..446daf6a90 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_Center.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_In.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_In.png Binary files differnew file mode 100644 index 0000000000..479c98903e --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_In.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_Out.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_Out.png Binary files differnew file mode 100644 index 0000000000..cc4e6f99ff --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Rotate_Out.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_Center.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_Center.png Binary files differnew file mode 100644 index 0000000000..dbafbcc9f0 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_Center.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_In.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_In.png Binary files differnew file mode 100644 index 0000000000..041a42ecf9 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_In.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_Out.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_Out.png Binary files differnew file mode 100644 index 0000000000..cffead1703 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Cam_Tracking_Out.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/ChatBarHandle.png b/indra/newview/skins/contrast_gold/textures/bottomtray/ChatBarHandle.png Binary files differnew file mode 100644 index 0000000000..50239c8af8 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/ChatBarHandle.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/DownArrow.png b/indra/newview/skins/contrast_gold/textures/bottomtray/DownArrow.png Binary files differnew file mode 100644 index 0000000000..82f58b22b9 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/DownArrow.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Backward_Off.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Backward_Off.png Binary files differnew file mode 100644 index 0000000000..4dddc2b391 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Backward_Off.png diff --git a/indra/newview/skins/contrast/textures/icons/see_them_on_map.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Backward_On.png Binary files differindex d309980c13..1af8e6b956 100644 --- a/indra/newview/skins/contrast/textures/icons/see_them_on_map.png +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Backward_On.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Down_Off.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Down_Off.png Binary files differnew file mode 100644 index 0000000000..2893c9a9f1 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Down_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Down_On.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Down_On.png Binary files differnew file mode 100644 index 0000000000..4f97611db1 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Down_On.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Forward_Off.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Forward_Off.png Binary files differnew file mode 100644 index 0000000000..80d227b6a7 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Forward_Off.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Grass_Selected.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Forward_On.png Binary files differindex 19cf732d91..f01c9f3c63 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Grass_Selected.png +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Forward_On.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Left_Off.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Left_Off.png Binary files differnew file mode 100644 index 0000000000..3602efa9d9 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Left_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Left_On.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Left_On.png Binary files differnew file mode 100644 index 0000000000..a120d46e99 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Left_On.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Right_Off.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Right_Off.png Binary files differnew file mode 100644 index 0000000000..9c3fc37dfe --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Right_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Right_On.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Right_On.png Binary files differnew file mode 100644 index 0000000000..c241ac75df --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Right_On.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnLeft_Off.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnLeft_Off.png Binary files differnew file mode 100644 index 0000000000..282e8d62de --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnLeft_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnLeft_On.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnLeft_On.png Binary files differnew file mode 100644 index 0000000000..20ce7b9296 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnLeft_On.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnRight_Off.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnRight_Off.png Binary files differnew file mode 100644 index 0000000000..5039e57c32 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnRight_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnRight_On.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnRight_On.png Binary files differnew file mode 100644 index 0000000000..7b3d2e8dd8 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_TurnRight_On.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Up_Off.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Up_Off.png Binary files differnew file mode 100644 index 0000000000..a49c43c2cf --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Up_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Up_On.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Up_On.png Binary files differnew file mode 100644 index 0000000000..ecce0d0192 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Movement_Up_On.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Object_View_Off.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Object_View_Off.png Binary files differnew file mode 100644 index 0000000000..e9dea7e17e --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Object_View_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Object_View_On.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Object_View_On.png Binary files differnew file mode 100644 index 0000000000..7a348ba22e --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Object_View_On.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/Unread_Chiclet.png b/indra/newview/skins/contrast_gold/textures/bottomtray/Unread_Chiclet.png Binary files differnew file mode 100644 index 0000000000..e8fe243dc7 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/Unread_Chiclet.png diff --git a/indra/newview/skins/contrast/textures/icons/hand.png b/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Lvl1.png Binary files differindex 3f497eefbb..3072512301 100644 --- a/indra/newview/skins/contrast/textures/icons/hand.png +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Lvl1.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Ring_Selected.png b/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Lvl2.png Binary files differindex ccc1f6d221..28872be28f 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Ring_Selected.png +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Lvl2.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Lvl3.png b/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Lvl3.png Binary files differnew file mode 100644 index 0000000000..14ec77b99a --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Lvl3.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Off.png b/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Off.png Binary files differnew file mode 100644 index 0000000000..48be51e9af --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_On.png b/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_On.png Binary files differnew file mode 100644 index 0000000000..823acfc583 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/VoicePTT_On.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/WellButton_Lit.png b/indra/newview/skins/contrast_gold/textures/bottomtray/WellButton_Lit.png Binary files differnew file mode 100644 index 0000000000..84711ddc29 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/WellButton_Lit.png diff --git a/indra/newview/skins/contrast_gold/textures/bottomtray/WellButton_Lit_Selected.png b/indra/newview/skins/contrast_gold/textures/bottomtray/WellButton_Lit_Selected.png Binary files differnew file mode 100644 index 0000000000..9b9468c574 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/bottomtray/WellButton_Lit_Selected.png diff --git a/indra/newview/skins/contrast_gold/textures/cloud-particle.png b/indra/newview/skins/contrast_gold/textures/cloud-particle.png Binary files differnew file mode 100644 index 0000000000..2196e764f7 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/cloud-particle.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowClosed_Off.png b/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowClosed_Off.png Binary files differnew file mode 100644 index 0000000000..19c842b816 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowClosed_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowClosed_Press.png b/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowClosed_Press.png Binary files differnew file mode 100644 index 0000000000..b9879dcc8a --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowClosed_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowOpened_Off.png b/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowOpened_Off.png Binary files differnew file mode 100644 index 0000000000..d506cda5c9 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowOpened_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowOpened_Press.png b/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowOpened_Press.png Binary files differnew file mode 100644 index 0000000000..08f7493a02 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Accordion_ArrowOpened_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Accordion_Off.png b/indra/newview/skins/contrast_gold/textures/containers/Accordion_Off.png Binary files differnew file mode 100644 index 0000000000..ec2c3f0b47 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Accordion_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Accordion_Over.png b/indra/newview/skins/contrast_gold/textures/containers/Accordion_Over.png Binary files differnew file mode 100644 index 0000000000..9ce484130f --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Accordion_Over.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Accordion_Press.png b/indra/newview/skins/contrast_gold/textures/containers/Accordion_Press.png Binary files differnew file mode 100644 index 0000000000..36edc1c7c4 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Accordion_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Accordion_Selected.png b/indra/newview/skins/contrast_gold/textures/containers/Accordion_Selected.png Binary files differnew file mode 100644 index 0000000000..9a6b4b4a27 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Accordion_Selected.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Container.png b/indra/newview/skins/contrast_gold/textures/containers/Container.png Binary files differnew file mode 100644 index 0000000000..511eb94386 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Container.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/TabTop_Left_Off.png b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Left_Off.png Binary files differnew file mode 100644 index 0000000000..3aad7243bc --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Left_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/TabTop_Left_Selected.png b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Left_Selected.png Binary files differnew file mode 100644 index 0000000000..cbf5721766 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Left_Selected.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle.png b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle.png Binary files differnew file mode 100644 index 0000000000..4d2ab77048 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle_Off.png b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle_Off.png Binary files differnew file mode 100644 index 0000000000..586593314f --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle_Selected.png b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle_Selected.png Binary files differnew file mode 100644 index 0000000000..4d2ab77048 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Middle_Selected.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right.png b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right.png Binary files differnew file mode 100644 index 0000000000..fce7b8771d --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Flashing.png b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Flashing.png Binary files differnew file mode 100644 index 0000000000..fd13bb699d --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Flashing.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Off.png b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Off.png Binary files differnew file mode 100644 index 0000000000..4db77fbfde --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Selected.png b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Selected.png Binary files differnew file mode 100644 index 0000000000..fce7b8771d --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/TabTop_Right_Selected.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Flash.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Flash.png Binary files differnew file mode 100644 index 0000000000..8935aa949b --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Flash.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Off.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Off.png Binary files differnew file mode 100644 index 0000000000..92ea6428a9 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Over.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Over.png Binary files differnew file mode 100644 index 0000000000..31e0f84278 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Over.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Selected.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Selected.png Binary files differnew file mode 100644 index 0000000000..13af7b9039 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Left_Selected.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Flash.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Flash.png Binary files differnew file mode 100644 index 0000000000..dd73d655e9 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Flash.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Off.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Off.png Binary files differnew file mode 100644 index 0000000000..17029352fc --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Over.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Over.png Binary files differnew file mode 100644 index 0000000000..f9bf4b69ab --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Over.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Selected.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Selected.png Binary files differnew file mode 100644 index 0000000000..ba963bd6d3 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Middle_Selected.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Flash.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Flash.png Binary files differnew file mode 100644 index 0000000000..f6b775c2a0 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Flash.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Off.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Off.png Binary files differnew file mode 100644 index 0000000000..3cc431f70d --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Over.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Over.png Binary files differnew file mode 100644 index 0000000000..794731f9fc --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Over.png diff --git a/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Selected.png b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Selected.png Binary files differnew file mode 100644 index 0000000000..b65ceb7edb --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/containers/Toolbar_Right_Selected.png diff --git a/indra/newview/skins/contrast_gold/textures/default_land_picture.j2c b/indra/newview/skins/contrast_gold/textures/default_land_picture.j2c Binary files differnew file mode 100644 index 0000000000..d2a8726404 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/default_land_picture.j2c diff --git a/indra/newview/skins/contrast_gold/textures/default_land_picture.png b/indra/newview/skins/contrast_gold/textures/default_land_picture.png Binary files differnew file mode 100644 index 0000000000..c53a5f6aa0 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/default_land_picture.png diff --git a/indra/newview/skins/contrast_gold/textures/default_profile_picture.j2c b/indra/newview/skins/contrast_gold/textures/default_profile_picture.j2c Binary files differnew file mode 100644 index 0000000000..09e03af0e9 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/default_profile_picture.j2c diff --git a/indra/newview/skins/contrast_gold/textures/default_profile_picture.png b/indra/newview/skins/contrast_gold/textures/default_profile_picture.png Binary files differnew file mode 100644 index 0000000000..5bade1cb36 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/default_profile_picture.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/AddItem_Disabled.png b/indra/newview/skins/contrast_gold/textures/icons/AddItem_Disabled.png Binary files differnew file mode 100644 index 0000000000..d21b72b973 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/AddItem_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/AddItem_Off.png b/indra/newview/skins/contrast_gold/textures/icons/AddItem_Off.png Binary files differnew file mode 100644 index 0000000000..64108d133a --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/AddItem_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/AddItem_Press.png b/indra/newview/skins/contrast_gold/textures/icons/AddItem_Press.png Binary files differnew file mode 100644 index 0000000000..3168f51757 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/AddItem_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/AudioMute_Off.png b/indra/newview/skins/contrast_gold/textures/icons/AudioMute_Off.png Binary files differnew file mode 100644 index 0000000000..dd89920fae --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/AudioMute_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/AudioMute_Over.png b/indra/newview/skins/contrast_gold/textures/icons/AudioMute_Over.png Binary files differnew file mode 100644 index 0000000000..a4fbec4144 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/AudioMute_Over.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/Audio_Off.png b/indra/newview/skins/contrast_gold/textures/icons/Audio_Off.png Binary files differnew file mode 100644 index 0000000000..4f6f5512c8 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/Audio_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/Audio_Press.png b/indra/newview/skins/contrast_gold/textures/icons/Audio_Press.png Binary files differnew file mode 100644 index 0000000000..0268a0f9fb --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/Audio_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/Icon_Notification_Condense.png b/indra/newview/skins/contrast_gold/textures/icons/Icon_Notification_Condense.png Binary files differnew file mode 100644 index 0000000000..3a19e79f82 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/Icon_Notification_Condense.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/Icon_Notification_Expand.png b/indra/newview/skins/contrast_gold/textures/icons/Icon_Notification_Expand.png Binary files differnew file mode 100644 index 0000000000..f5331feb02 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/Icon_Notification_Expand.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/Info.png b/indra/newview/skins/contrast_gold/textures/icons/Info.png Binary files differnew file mode 100644 index 0000000000..e05a585f0b --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/Info.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/Info_Over.png b/indra/newview/skins/contrast_gold/textures/icons/Info_Over.png Binary files differnew file mode 100644 index 0000000000..95fd5fa424 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/Info_Over.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/Info_Small.png b/indra/newview/skins/contrast_gold/textures/icons/Info_Small.png Binary files differnew file mode 100644 index 0000000000..c4ce13e132 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/Info_Small.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/MP_Logo.png b/indra/newview/skins/contrast_gold/textures/icons/MP_Logo.png Binary files differnew file mode 100644 index 0000000000..b01e8f4ea3 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/MP_Logo.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/MinusItem_Disabled.png b/indra/newview/skins/contrast_gold/textures/icons/MinusItem_Disabled.png Binary files differnew file mode 100644 index 0000000000..b62ed35182 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/MinusItem_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/MinusItem_Off.png b/indra/newview/skins/contrast_gold/textures/icons/MinusItem_Off.png Binary files differnew file mode 100644 index 0000000000..eb7b8838f7 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/MinusItem_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/MinusItem_Press.png b/indra/newview/skins/contrast_gold/textures/icons/MinusItem_Press.png Binary files differnew file mode 100644 index 0000000000..2dc6081cb0 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/MinusItem_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/Parcel_M_Dark.png b/indra/newview/skins/contrast_gold/textures/icons/Parcel_M_Dark.png Binary files differnew file mode 100644 index 0000000000..ab5a1680a7 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/Parcel_M_Dark.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/Parcel_M_Light.png b/indra/newview/skins/contrast_gold/textures/icons/Parcel_M_Light.png Binary files differnew file mode 100644 index 0000000000..2db94e37c9 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/Parcel_M_Light.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/Parcel_PG_Dark.png b/indra/newview/skins/contrast_gold/textures/icons/Parcel_PG_Dark.png Binary files differnew file mode 100644 index 0000000000..e1f7613d04 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/Parcel_PG_Dark.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/Parcel_PG_Light.png b/indra/newview/skins/contrast_gold/textures/icons/Parcel_PG_Light.png Binary files differnew file mode 100644 index 0000000000..04d13027d2 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/Parcel_PG_Light.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/Parcel_R_Light.png b/indra/newview/skins/contrast_gold/textures/icons/Parcel_R_Light.png Binary files differnew file mode 100644 index 0000000000..dbf43152b3 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/Parcel_R_Light.png diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_8.png b/indra/newview/skins/contrast_gold/textures/icons/ProgressLarge_8.png Binary files differindex df0e825cef..df0e825cef 100644 --- a/indra/newview/skins/default/textures/icons/ProgressLarge_8.png +++ b/indra/newview/skins/contrast_gold/textures/icons/ProgressLarge_8.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/VoiceMute_Off.png b/indra/newview/skins/contrast_gold/textures/icons/VoiceMute_Off.png Binary files differnew file mode 100644 index 0000000000..425ba267a5 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/VoiceMute_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Lvl1.png b/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Lvl1.png Binary files differnew file mode 100644 index 0000000000..3072512301 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Lvl1.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Torus_Selected.png b/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Lvl2.png Binary files differindex ff1cce3a79..28872be28f 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Torus_Selected.png +++ b/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Lvl2.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Lvl3.png b/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Lvl3.png Binary files differnew file mode 100644 index 0000000000..a4a171bd81 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Lvl3.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Off.png b/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Off.png Binary files differnew file mode 100644 index 0000000000..533663a4fa --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_On.png b/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_On.png Binary files differnew file mode 100644 index 0000000000..823acfc583 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/VoicePTT_On.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/add_icon.png b/indra/newview/skins/contrast_gold/textures/icons/add_icon.png Binary files differnew file mode 100644 index 0000000000..b5b09ae6e0 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/add_icon.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/back_arrow_off.png b/indra/newview/skins/contrast_gold/textures/icons/back_arrow_off.png Binary files differnew file mode 100644 index 0000000000..0adf0b677e --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/back_arrow_off.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/back_arrow_over.png b/indra/newview/skins/contrast_gold/textures/icons/back_arrow_over.png Binary files differnew file mode 100644 index 0000000000..13ce6a8e4d --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/back_arrow_over.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/back_arrow_press.png b/indra/newview/skins/contrast_gold/textures/icons/back_arrow_press.png Binary files differnew file mode 100644 index 0000000000..311a90ac22 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/back_arrow_press.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Hemi_Sphere_Selected.png b/indra/newview/skins/contrast_gold/textures/icons/check_mark.png Binary files differindex 2d1e035d41..ea59769d38 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Hemi_Sphere_Selected.png +++ b/indra/newview/skins/contrast_gold/textures/icons/check_mark.png diff --git a/indra/newview/skins/contrast/textures/icons/see_them_online.png b/indra/newview/skins/contrast_gold/textures/icons/see_me_online.png Binary files differindex 135e6cdd82..5684e27f43 100644 --- a/indra/newview/skins/contrast/textures/icons/see_them_online.png +++ b/indra/newview/skins/contrast_gold/textures/icons/see_me_online.png diff --git a/indra/newview/skins/contrast_gold/textures/icons/unknown_icon.png b/indra/newview/skins/contrast_gold/textures/icons/unknown_icon.png Binary files differnew file mode 100644 index 0000000000..9a4e7f8616 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/icons/unknown_icon.png diff --git a/indra/newview/skins/default/textures/megapahit/icon_group.png b/indra/newview/skins/contrast_gold/textures/megapahit/icon_group.png Binary files differindex f3872dea3f..f3872dea3f 100644 --- a/indra/newview/skins/default/textures/megapahit/icon_group.png +++ b/indra/newview/skins/contrast_gold/textures/megapahit/icon_group.png diff --git a/indra/newview/skins/default/textures/megapahit/icon_land_auction.png b/indra/newview/skins/contrast_gold/textures/megapahit/icon_land_auction.png Binary files differindex 550703968f..550703968f 100644 --- a/indra/newview/skins/default/textures/megapahit/icon_land_auction.png +++ b/indra/newview/skins/contrast_gold/textures/megapahit/icon_land_auction.png diff --git a/indra/newview/skins/default/textures/megapahit/icon_land_forsale.png b/indra/newview/skins/contrast_gold/textures/megapahit/icon_land_forsale.png Binary files differindex 209bb868ea..209bb868ea 100644 --- a/indra/newview/skins/default/textures/megapahit/icon_land_forsale.png +++ b/indra/newview/skins/contrast_gold/textures/megapahit/icon_land_forsale.png diff --git a/indra/newview/skins/default/textures/megapahit/icon_place.png b/indra/newview/skins/contrast_gold/textures/megapahit/icon_place.png Binary files differindex 60cf42424a..60cf42424a 100644 --- a/indra/newview/skins/default/textures/megapahit/icon_place.png +++ b/indra/newview/skins/contrast_gold/textures/megapahit/icon_place.png diff --git a/indra/newview/skins/contrast_gold/textures/model_wizard/progress_bar_bg.png b/indra/newview/skins/contrast_gold/textures/model_wizard/progress_bar_bg.png Binary files differnew file mode 100644 index 0000000000..7c6920205f --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/model_wizard/progress_bar_bg.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Cone_Selected.png b/indra/newview/skins/contrast_gold/textures/model_wizard/progress_light.png Binary files differindex 4aeb96c3ae..be6b263fb6 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Cone_Selected.png +++ b/indra/newview/skins/contrast_gold/textures/model_wizard/progress_light.png diff --git a/indra/newview/skins/contrast_gold/textures/navbar/BuyArrow_Over.png b/indra/newview/skins/contrast_gold/textures/navbar/BuyArrow_Over.png Binary files differnew file mode 100644 index 0000000000..3d9c758574 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/navbar/BuyArrow_Over.png diff --git a/indra/newview/skins/contrast_gold/textures/navbar/BuyArrow_Press.png b/indra/newview/skins/contrast_gold/textures/navbar/BuyArrow_Press.png Binary files differnew file mode 100644 index 0000000000..69b0d43900 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/navbar/BuyArrow_Press.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Pyramid_Selected.png b/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Active.png Binary files differindex ffb878dc72..6d42f52963 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Pyramid_Selected.png +++ b/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Active.png diff --git a/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Off.png b/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Off.png Binary files differnew file mode 100644 index 0000000000..82d044d817 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Over.png b/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Over.png Binary files differnew file mode 100644 index 0000000000..74861fdb58 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Over.png diff --git a/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Press.png b/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Press.png Binary files differnew file mode 100644 index 0000000000..6670667022 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/navbar/Favorite_Star_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG.png b/indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG.png Binary files differnew file mode 100644 index 0000000000..6a91700ae0 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG.png diff --git a/indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG_NoFav_Bevel.png b/indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG_NoFav_Bevel.png Binary files differnew file mode 100644 index 0000000000..c61dcde58c --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG_NoFav_Bevel.png diff --git a/indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG_NoNav_Bevel.png b/indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG_NoNav_Bevel.png Binary files differnew file mode 100644 index 0000000000..9e3da34596 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/navbar/NavBar_BG_NoNav_Bevel.png diff --git a/indra/newview/skins/contrast_gold/textures/navbar/Row_Selection.png b/indra/newview/skins/contrast_gold/textures/navbar/Row_Selection.png Binary files differnew file mode 100644 index 0000000000..d3870fb640 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/navbar/Row_Selection.png diff --git a/indra/newview/skins/contrast_gold/textures/navbar/separator.png b/indra/newview/skins/contrast_gold/textures/navbar/separator.png Binary files differnew file mode 100644 index 0000000000..c1d74e5a64 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/navbar/separator.png diff --git a/indra/newview/skins/contrast_gold/textures/textures.xml b/indra/newview/skins/contrast_gold/textures/textures.xml new file mode 100644 index 0000000000..00082fb556 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/textures.xml @@ -0,0 +1,934 @@ +<!-- +This file contains metadata about how to load, display, and scale textures for rendering in the UI. +Images do *NOT* have to appear in this file in order to use them as textures in the UI...simply refer +to them by filename (relative to textures directory). +NOTE: if you want to reuse an image file with different metadata, simply create a new texture entry +with the same filename but different name + +<texture + name="MyTexture" (mandatory) + - this is the name you reference the texture by in XUI. For example, <button image_unselected="MyTexture"/> + file_name="images/my_texture.png" (optional) + - this is the path to the actual file asset, relative to the current skins "textures" directory. + If not supplied, the filename will be taken from the texture name itself, "MyTexture" in this case. + NOTE: you need to provide an extension on the filename (".png", ".tga", ".jpg") for us to decode the image properly + preload="true" (optional, false by default) + - If true, we will attempt to load the image before displaying any UI. + If false, we will load in the background after initializing the UI. + use_mips="true" (currently unused) + scale.left="1" + scale.bottom="1" + scale.top="15" + scale.right="31" + - Specifies the segmentation for 9-slice image scaling. Specifically, the pixel offsets from the LOWER LEFT corner + that define the region of the image that is stretched to make the whole image fit in the required space. + In this example, if the source image is 32x16 pixels, we have defined a center region that starts one pixel up + and to the right from the bottom left corner and extends to 31 pixels right and 15 pixels up from the bottom left + corner. The end result is that the image will keep a 1 pixel border all around while stretching to fit the required + region. +--> + +<textures version="101"> + <!-- Please add new files alphabetically to prevent merge conflicts. JC --> + <texture name="Accordion_ArrowClosed_Off" file_name="containers/Accordion_ArrowClosed_Off.png" preload="false" /> + <texture name="Accordion_ArrowClosed_Press" file_name="containers/Accordion_ArrowClosed_Press.png" preload="false" /> + <texture name="Accordion_ArrowOpened_Off" file_name="containers/Accordion_ArrowOpened_Off.png" preload="false" /> + <texture name="Accordion_ArrowOpened_Press" file_name="containers/Accordion_ArrowOpened_Press.png" preload="false" /> + <texture name="Accordion_Off" file_name="containers/Accordion_Off.png" preload="false" /> + <texture name="Accordion_Press" file_name="containers/Accordion_Press.png" preload="false" /> + <texture name="Accordion_Over" file_name="containers/Accordion_Over.png" preload="false" /> + <texture name="Accordion_Selected" file_name="containers/Accordion_Selected.png" preload="false" /> + + <texture name="Activate_Checkmark" file_name="taskpanel/Activate_Checkmark.png" preload="false" /> + + <texture name="AddItem_Disabled" file_name="icons/AddItem_Disabled.png" preload="false" /> + <texture name="AddItem_Off" file_name="icons/AddItem_Off.png" preload="false" /> + <texture name="AddItem_Press" file_name="icons/AddItem_Press.png" preload="false" /> + + <texture name="add_payment_image_center" file_name="windows/add_payment_image_center.png" preload="true" /> + <texture name="add_payment_image_left" file_name="windows/add_payment_image_left.png" preload="true" /> + <texture name="add_payment_image_right" file_name="windows/add_payment_image_right.png" preload="true" /> + + <texture name="Arrow_Left_Off" file_name="navbar/Arrow_Left_Off.png" preload="true" /> + <texture name="Arrow_Right_Off" file_name="navbar/Arrow_Right_Off.png" preload="true" /> + + <texture name="Arrow_Small_Up" file_name="widgets/Arrow_Small_Up.png" preload="true" /> + <texture name="Arrow_Small_Left" file_name="widgets/Arrow_Small_Left.png" preload="true" /> + <texture name="Arrow_Small_Right" file_name="widgets/Arrow_Small_Right.png" preload="true" /> + + <texture name="Arrow_Down" file_name="widgets/Arrow_Down.png" preload="true" /> + <texture name="Arrow_Up" file_name="widgets/Arrow_Up.png" preload="true" /> + <texture name="Arrow_Left" file_name="widgets/Arrow_Left.png" preload="true" /> + <texture name="Arrow_Right" file_name="widgets/Arrow_Right.png" preload="true" /> + + <texture name="AudioMute_Off" file_name="icons/AudioMute_Off.png" preload="false" /> + <texture name="AudioMute_Over" file_name="icons/AudioMute_Over.png" preload="false" /> + <texture name="VoiceMute_Off" file_name="icons/VoiceMute_Off.png" preload="false" /> + + <texture name="Audio_Off" file_name="icons/Audio_Off.png" preload="false" /> + <texture name="Audio_Press" file_name="icons/Audio_Press.png" preload="false" /> + + <texture name="BackArrow_Off" file_name="icons/BackArrow_Off.png" preload="false" /> + + <texture name="BackButton_Off" file_name="icons/back_arrow_off.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" /> + <texture name="BackButton_Over" file_name="icons/back_arrow_over.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" /> + <texture name="BackButton_Press" file_name="icons/back_arrow_press.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" /> + + <texture name="Error_Tag_Background" file_name="widgets/Error_Tag_Background.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" /> + <texture name="New_Tag_Background" file_name="widgets/New_Tag_Background.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" /> + <texture name="New_Tag_Border" file_name="widgets/New_Tag_Border.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" /> + + <texture name="Badge_Background" file_name="widgets/Badge_Background.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" /> + <texture name="Badge_Border" file_name="widgets/Badge_Border.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" /> + + <texture name="Blank" file_name="Blank.png" preload="false" /> + + <texture name="BreadCrumbBtn_Left_Disabled" file_name="widgets/BreadCrumbBtn_Left_Disabled.png" preload="false"/> + <texture name="BreadCrumbBtn_Left_Off" file_name="widgets/BreadCrumbBtn_Left_Off.png" preload="false"/> + <texture name="BreadCrumbBtn_Left_Over" file_name="widgets/BreadCrumbBtn_Left_Over.png" preload="false"/> + <texture name="BreadCrumbBtn_Left_Press" file_name="widgets/BreadCrumbBtn_Left_Press.png" preload="false"/> + + <texture name="BreadCrumbBtn_Middle_Disabled" file_name="widgets/BreadCrumbBtn_Middle_Disabled.png" preload="false"/> + <texture name="BreadCrumbBtn_Middle_Off" file_name="widgets/BreadCrumbBtn_Middle_Off.png" preload="false"/> + <texture name="BreadCrumbBtn_Middle_Over" file_name="widgets/BreadCrumbBtn_Middle_Over.png" preload="false"/> + <texture name="BreadCrumbBtn_Middle_Press" file_name="widgets/BreadCrumbBtn_Middle_Press.png" preload="false"/> + + <texture name="BreadCrumbBtn_Right_Disabled" file_name="widgets/BreadCrumbBtn_Right_Disabled.png" preload="false"/> + <texture name="BreadCrumbBtn_Right_Off" file_name="widgets/BreadCrumbBtn_Right_Off.png" preload="false"/> + <texture name="BreadCrumbBtn_Right_Over" file_name="widgets/BreadCrumbBtn_Right_Over.png" preload="false"/> + <texture name="BreadCrumbBtn_Right_Press" file_name="widgets/BreadCrumbBtn_Right_Press.png" preload="false"/> + + <texture name="BuyArrow_Over" file_name="navbar/BuyArrow_Over.png" preload="true" scale.left="0" scale.top="1" scale.right="0" scale.bottom="0" /> + <texture name="BuyArrow_Press" file_name="navbar/BuyArrow_Press.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" /> + + <texture name="Cam_Avatar_Off" file_name="bottomtray/Cam_Avatar_Off.png" preload="true" /> + <texture name="Cam_FreeCam_Off" file_name="bottomtray/Cam_FreeCam_Off.png" preload="false" /> + <texture name="Cam_Orbit_Off" file_name="bottomtray/Cam_Orbit_Off.png" preload="false" /> + <texture name="Cam_Pan_Off" file_name="bottomtray/Cam_Pan_Off.png" preload="false" /> + + <texture name="Cam_Preset_Back_Off" file_name="bottomtray/Cam_Preset_Back_Off.png" preload="false" /> + <texture name="Cam_Preset_Back_On" file_name="bottomtray/Cam_Preset_Back_On.png" preload="false" /> + <texture name="Cam_Preset_Eye_Off" file_name="bottomtray/Cam_Preset_Eye_Off.png" preload="false" /> + <texture name="Cam_Preset_Front_Off" file_name="bottomtray/Cam_Preset_Front_Off.png" preload="false" /> + <texture name="Cam_Preset_Front_On" file_name="bottomtray/Cam_Preset_Front_On.png" preload="false" /> + <texture name="Cam_Preset_Side_Off" file_name="bottomtray/Cam_Preset_Side_Off.png" preload="false" /> + <texture name="Cam_Preset_Side_On" file_name="bottomtray/Cam_Preset_Side_On.png" preload="false" /> + + <texture name="Cam_Rotate_In" file_name="bottomtray/Cam_Rotate_In.png" preload="false" /> + <texture name="Cam_Rotate_Out" file_name="bottomtray/Cam_Rotate_Out.png" preload="false" /> + <texture name="Cam_Rotate_Center" file_name="bottomtray/Cam_Rotate_Center.png" preload="false" /> + <texture name="Cam_Tracking_In" file_name="bottomtray/Cam_Tracking_In.png" preload="false" /> + <texture name="Cam_Tracking_Out" file_name="bottomtray/Cam_Tracking_Out.png" preload="false" /> + <texture name="Cam_Tracking_Center" file_name="bottomtray/Cam_Tracking_Center.png" preload="false" /> + + <texture name="Checkbox_Off_Disabled" file_name="widgets/Checkbox_Disabled.png" preload="true" /> + <texture name="Checkbox_On_Disabled" file_name="widgets/Checkbox_On_Disabled.png" preload="true" /> + <texture name="Checkbox_Off" file_name="widgets/Checkbox_Off.png" preload="true" /> + <texture name="Checkbox_On" file_name="widgets/Checkbox_On.png" preload="true" /> + <texture name="Checkbox_On_Press" file_name="widgets/Checkbox_On_Press.png" preload="true" /> + <texture name="Checkbox_Press" file_name="widgets/Checkbox_Press.png" preload="true" /> + <texture name="Check_Mark" file_name="icons/check_mark.png" preload="true" /> + + <texture name="Checker" file_name="checker.png" preload="false" /> + + <texture name="Command_360_Capture_Icon" file_name="toolbar_icons/360_capture.png" preload="true" /> + <texture name="Command_AboutLand_Icon" file_name="toolbar_icons/land.png" preload="true" /> + <texture name="Command_Appearance_Icon" file_name="toolbar_icons/appearance.png" preload="true" /> + <texture name="Command_Avatar_Icon" file_name="toolbar_icons/avatars.png" preload="true" /> + <texture name="Command_Build_Icon" file_name="toolbar_icons/build.png" preload="true" /> + <texture name="Command_Chat_Icon" file_name="toolbar_icons/chat.png" preload="true" /> + <texture name="Command_Compass_Icon" file_name="toolbar_icons/land.png" preload="true" /> + <texture name="Command_Destinations_Icon" file_name="toolbar_icons/destinations.png" preload="true" /> + <texture name="Command_Gestures_Icon" file_name="toolbar_icons/gestures.png" preload="true" /> + <texture name="Command_Grid_Status_Icon" file_name="toolbar_icons/grid_status.png" preload="true" /> + <texture name="Command_HowTo_Icon" file_name="toolbar_icons/howto.png" preload="true" /> + <texture name="Command_Inventory_Icon" file_name="toolbar_icons/inventory.png" preload="true" /> + <texture name="Command_Map_Icon" file_name="toolbar_icons/map.png" preload="true" /> + <texture name="Command_Marketplace_Icon" file_name="toolbar_icons/marketplace.png" preload="true" /> + <texture name="Command_MktListings_Icon" file_name="toolbar_icons/mktlistings.png" preload="true" /> + <texture name="Command_MiniCart_Icon" file_name="toolbar_icons/mini_cart.png" preload="true" /> + <texture name="Command_MiniMap_Icon" file_name="toolbar_icons/mini_map.png" preload="true" /> + <texture name="Command_Move_Icon" file_name="toolbar_icons/move.png" preload="true" /> + <texture name="Command_Environments_Icon" file_name="toolbar_icons/environments.png" preload="true" /> + <texture name="Command_People_Icon" file_name="toolbar_icons/people.png" preload="true" /> + <texture name="Command_Performance_Icon" file_name="toolbar_icons/performance.png" preload="true" /> + <texture name="Command_Picks_Icon" file_name="toolbar_icons/picks.png" preload="true" /> + <texture name="Command_Places_Icon" file_name="toolbar_icons/places.png" preload="true" /> + <texture name="Command_Preferences_Icon" file_name="toolbar_icons/preferences.png" preload="true" /> + <texture name="Command_Profile_Icon" file_name="toolbar_icons/profile.png" preload="true" /> + <texture name="Command_Report_Abuse_Icon" file_name="toolbar_icons/report_abuse.png" preload="true" /> + <texture name="Command_Search_Icon" file_name="toolbar_icons/search.png" preload="true" /> + <texture name="Command_Snapshot_Icon" file_name="toolbar_icons/snapshot.png" preload="true" /> + <texture name="Command_Speak_Icon" file_name="toolbar_icons/speak.png" preload="true" /> + <texture name="Command_View_Icon" file_name="toolbar_icons/view.png" preload="true" /> + <texture name="Command_Voice_Icon" file_name="toolbar_icons/nearbyvoice.png" preload="true" /> + <texture name="Command_FavoriteFolder_Icon" file_name="toolbar_icons/favorite_folder.png" preload="true" /> + <texture name="Command_Resync_Animations" file_name="toolbar_icons/resync_animations.png" preload="true" /> + <texture name="Caret_Bottom_Icon" file_name="toolbar_icons/caret_bottom.png" preload="true" scale.left="1" scale.top="23" scale.right="15" scale.bottom="1" /> + <texture name="Caret_Right_Icon" file_name="toolbar_icons/caret_right.png" preload="true" scale.left="5" scale.top="15" scale.right="28" scale.bottom="1" /> + <texture name="Caret_Left_Icon" file_name="toolbar_icons/caret_left.png" preload="true" scale.left="1" scale.top="15" scale.right="23" scale.bottom="1" /> + + <texture name="ComboButton_Disabled" file_name="widgets/ComboButton_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> + <texture name="ComboButton_Selected" file_name="widgets/ComboButton_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> + <texture name="ComboButton_UpSelected" file_name="widgets/ComboButton_UpSelected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> + <texture name="ComboButton_On" file_name="widgets/ComboButton_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> + <texture name="ComboButton_Off" file_name="widgets/ComboButton_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> + <texture name="ComboButton_UpOff" file_name="widgets/ComboButton_UpOff.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> + + <texture name="Container" file_name="containers/Container.png" preload="false" /> + + <texture name="Conv_toolbar_add_person" file_name="icons/Conv_toolbar_add_person.png" preload="false" /> + <texture name="Conv_toolbar_arrow_ne" file_name="icons/Conv_toolbar_arrow_ne.png" preload="false" /> + <texture name="Conv_toolbar_arrow_sw" file_name="icons/Conv_toolbar_arrow_sw.png" preload="false" /> + <texture name="Conv_toolbar_call_log" file_name="icons/Conv_toolbar_call_log.png" preload="false" /> + <texture name="Conv_toolbar_close" file_name="icons/Conv_toolbar_close.png" preload="false" /> + <texture name="Conv_toolbar_collapse" file_name="icons/Conv_toolbar_collapse.png" preload="false" /> + <texture name="Conv_collapse_to_one_line" file_name="icons/collapse_to_one_line.png" preload="false" /> + <texture name="Conv_expand_one_line" file_name="icons/expand_one_liner.png" preload="false" /> + <texture name="Conv_toolbar_expand" file_name="icons/Conv_toolbar_expand.png" preload="false" /> + <texture name="Conv_toolbar_hang_up" file_name="icons/Conv_toolbar_hang_up.png" preload="false" /> + <texture name="Conv_toolbar_open_call" file_name="icons/Conv_toolbar_open_call.png" preload="false" /> + <texture name="Conv_toolbar_plus" file_name="icons/Conv_toolbar_plus.png" preload="false" /> + <texture name="Conv_toolbar_sort" file_name="icons/Conv_toolbar_sort.png" preload="false" /> + <texture name="Conv_log_inbox" file_name="icons/Conv_log_inbox.png" preload="false" /> + + <texture name="Copy" file_name="icons/Copy.png" preload="false" /> + <texture name="CopyBright" file_name="icons/CopyBright.png" preload="false" /> + + <texture name="DisclosureArrow_Opened_Off" file_name="widgets/DisclosureArrow_Opened_Off.png" preload="true" /> + + <texture name="ChatBarHandle" file_name="bottomtray/ChatBarHandle.png" preload="false" /> + <texture name="DownArrow" file_name="bottomtray/DownArrow.png" preload="false" /> + <texture name="DownArrow_Off" file_name="icons/DownArrow_Off.png" preload="false" /> + <texture name="Dragbar" file_name="windows/Dragbar.png" preload="false" scale.left="35" scale.top="5" scale.right="29" scale.bottom="5" /> + + <texture name="DropDown_Disabled" file_name="widgets/DropDown_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" /> + <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" /> + <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" /> + <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" /> + + <texture name="DropTarget" file_name="widgets/DropTarget.png" preload="false" /> + + <texture name="Emoji_Picker_Icon" file_name="icons/emoji_picker_icon.png" preload="true" /> + <texture name="ExternalBrowser_Off" file_name="icons/ExternalBrowser_Off.png" preload="false" /> + <texture name="Edit_Wrench" file_name="icons/Edit_Wrench.png" preload="false" /> + + <texture name="Presets_Icon" file_name="icons/Presets_Icon.png" preload="true" /> + + <texture name="Presets_Icon" file_name="icons/Presets_Icon.png" preload="true" /> + <texture name="Presets_Icon_Graphic" file_name="icons/Presets_Icon_Graphic.png" preload="true" /> + <texture name="Favorite_Star_Active" file_name="navbar/Favorite_Star_Active.png" preload="false" /> + <texture name="Favorite_Star_Off" file_name="navbar/Favorite_Star_Off.png" preload="false" /> + <texture name="Favorite_Star_Press" file_name="navbar/Favorite_Star_Press.png" preload="false" /> + <texture name="Favorite_Star_Over" file_name="navbar/Favorite_Star_Over.png" preload="false" /> + <texture name="Favorite_Link_Over" file_name="navbar/Favorite_Link_Over.png" preload="false" /> + + + <texture name="Flag" file_name="navbar/Flag.png" preload="false" /> + + <texture name="Flyout_Left" file_name="windows/Flyout_Left.png" preload="false" /> + <texture name="Flyout_Pointer" file_name="windows/Flyout_Pointer.png" preload="false" /> + <texture name="Flyout_Right" file_name="windows/Flyout_Right.png" preload="false" /> + + <texture name="Folder_Arrow" file_name="folder_arrow.tga" preload="false" /> + <texture name="ForSale_Badge" file_name="icons/ForSale_Badge.png" preload="false" /> + <texture name="ForwardArrow_Off" file_name="icons/ForwardArrow_Off.png" preload="false" /> + <texture name="ForwardArrow_Press" file_name="icons/ForwardArrow_Press.png" preload="false" /> + + <texture name="Generic_Experience" file_name="Blank.png" preload="false" /> + <texture name="Generic_Group" file_name="icons/Generic_Group.png" preload="false" /> + <texture name="Generic_Group_Large" file_name="icons/Generic_Group_Large.png" preload="false" /> + <texture name="icon_group.tga" file_name="icons/Generic_Group.png" preload="false" /> + <texture name="Generic_Object_Small" file_name="icons/Generic_Object_Small.png" preload="false" /> + <texture name="Generic_Person" file_name="icons/Generic_Person.png" preload="false" /> + <texture name="Generic_Person_Large" file_name="icons/Generic_Person_Large.png" preload="false" /> + + <texture name="Group_Notices" file_name="icons/Group_Notices.png" preload="false" /> + + <texture name="Hand" file_name="icons/hand.png" preload="false" /> + + <texture name="Help_Press" file_name="navbar/Help_Press.png" preload="false" /> + + <texture name="Hierarchy_View_Disabled" file_name="icons/Hierarchy_View_Disabled.png" preload="false" /> + <texture name="Hierarchy_View_On" file_name="icons/Hierarchy_View_On.png" preload="false" /> + + + <texture name="Home_Off" file_name="navbar/Home_Off.png" preload="false" /> + <texture name="Horizontal Drag Handle" file_name="widgets/horizontal_drag_handle.png" scale.left="8" scale.right="120" scale.bottom="1" scale.top="6" scale_type="scale_outer"/> + + <texture name="Icon_Close_Foreground" file_name="windows/Icon_Close_Foreground.png" preload="true" /> + <texture name="Icon_Close_Press" file_name="windows/Icon_Close_Press.png" preload="true" /> + <texture name="Icon_Close_Toast" file_name="windows/Icon_Close_Toast.png" preload="true" /> + + <texture name="Icon_Copy" file_name="icons/copy_clipboard.png" preload="true" /> + + <texture name="Icon_Delete" file_name="icons/delete_icon.png" preload="true" /> + + <texture name="Icon_Dock_Foreground" file_name="windows/Icon_Dock_Foreground.png" preload="true" /> + <texture name="Icon_Dock_Press" file_name="windows/Icon_Dock_Press.png" preload="true" /> + + <texture name="Icon_File_Upload" file_name="icons/file_upload.png" preload="true" /> + + <texture name="Icon_For_Sale" file_name="icons/Icon_For_Sale.png" preload="false" /> + + <texture name="Icon_Gear_Background" file_name="windows/Icon_Gear_Background.png" preload="false" /> + <texture name="Icon_Gear_Foreground" file_name="windows/Icon_Gear_Foreground.png" preload="false" /> + <texture name="Icon_Gear_Press" file_name="windows/Icon_Gear_Press.png" preload="false" /> + <texture name="Icon_Gear" file_name="windows/Icon_Gear.png" preload="false" /> + + <texture name="Icon_Help_Foreground" file_name="windows/Icon_Help_Foreground.png" preload="true" /> + <texture name="Icon_Help_Press" file_name="windows/Icon_Help_Press.png" preload="true" /> + + <texture name="Icon_Minimize_Foreground" file_name="windows/Icon_Minimize_Foreground.png" preload="true" /> + <texture name="Icon_Minimize_Press" file_name="windows/Icon_Minimize_Press.png" preload="true" /> + + <texture name="Icon_Paste" file_name="icons/paste_clipboard.png" preload="true" /> + + <texture name="Icon_Restore_Foreground" file_name="windows/Icon_Restore_Foreground.png" preload="false" /> + <texture name="Icon_Restore_Press" file_name="windows/Icon_Restore_Press.png" preload="false" /> + + <texture name="Icon_Snapshot" file_name="icons/snapshot_icon.png" preload="true" /> + + <texture name="Icon_Use_Texture" file_name="icons/texture_icon.png" preload="true" /> + + <texture name="Info" file_name="icons/Info.png" preload="false" /> + <texture name="Info_Small" file_name="icons/Info_Small.png" preload="false" /> + <texture name="Info_Off" file_name="navbar/Info_Off.png" preload="false" /> + <texture name="Info_Over" file_name="icons/Info_Over.png" preload="false" /> + <texture name="Info_Press" file_name="navbar/Info_Press.png" preload="false" /> + + <texture name="Inspector_Background" file_name="windows/Inspector_Background.png" preload="false" + scale.left="4" scale.top="28" scale.right="60" scale.bottom="4" /> + <texture name="Inspector_Hover" file_name="windows/Inspector_Hover.png" preload="false" /> + <texture name="Inspector_I" file_name="windows/Inspector_I.png" preload="false" /> + + <texture name="Inv_Alpha" file_name="icons/Inv_Alpha.png" preload="false" /> + <texture name="Inv_Animation" file_name="icons/Inv_Animation.png" preload="false" /> + <texture name="Inv_BodyShape" file_name="icons/Inv_BodyShape.png" preload="false" /> + <texture name="Inv_CallingCard" file_name="icons/Inv_CallingCard.png" preload="false" /> + <texture name="Inv_Clothing" file_name="icons/Inv_Clothing.png" preload="false" /> + <texture name="Inv_Eye" file_name="icons/Inv_Eye.png" preload="false" /> + <texture name="Inv_FolderClosed" file_name="icons/Inv_FolderClosed.png" preload="false" /> + <texture name="Inv_FolderOpen" file_name="icons/Inv_FolderOpen.png" preload="false" /> + <texture name="Inv_Gesture" file_name="icons/Inv_Gesture.png" preload="false" /> + <texture name="Inv_Gloves" file_name="icons/Inv_Gloves.png" preload="false" /> + <texture name="Inv_Hair" file_name="icons/Inv_Hair.png" preload="false" /> + <texture name="Inv_LinkItem" file_name="icons/Inv_LinkItem.png" preload="false" /> + <texture name="Inv_LinkFolder" file_name="icons/Inv_LinkFolder.png" preload="false" /> + <texture name="Inv_Jacket" file_name="icons/Inv_Jacket.png" preload="false" /> + <texture name="Inv_LookFolderOpen" file_name="icons/Inv_LookFolderOpen.png" preload="false" /> + <texture name="Inv_LookFolderClosed" file_name="icons/Inv_LookFolderClosed.png" preload="false" /> + <texture name="Inv_LostClosed" file_name="icons/Inv_LostClosed.png" preload="false" /> + <texture name="Inv_LostOpen" file_name="icons/Inv_LostOpen.png" preload="false" /> + <texture name="Inv_Landmark" file_name="icons/Inv_Landmark.png" preload="false" /> + <texture name="Inv_Material" file_name="icons/Inv_Material.png" preload="false" /> + <texture name="Inv_Mesh" file_name="icons/Inv_Mesh.png" preload="false" /> + <texture name="Inv_Notecard" file_name="icons/Inv_Notecard.png" preload="false" /> + <texture name="Inv_Object" file_name="icons/Inv_Object.png" preload="false" /> + <texture name="Inv_Object_Multi" file_name="icons/Inv_Object_Multi.png" preload="false" /> + <texture name="Inv_Pants" file_name="icons/Inv_Pants.png" preload="false" /> + <texture name="Inv_Script" file_name="icons/Inv_Script.png" preload="false" /> + <texture name="Inv_Shirt" file_name="icons/Inv_Shirt.png" preload="false" /> + <texture name="Inv_Shoe" file_name="icons/Inv_Shoe.png" preload="false" /> + <texture name="Inv_Skin" file_name="icons/Inv_Skin.png" preload="false" /> + <texture name="Inv_Skirt" file_name="icons/Inv_Skirt.png" preload="false" /> + <texture name="Inv_Snapshot" file_name="icons/Inv_Snapshot.png" preload="false" /> + <texture name="Inv_Socks" file_name="icons/Inv_Socks.png" preload="false" /> + <texture name="Inv_Sound" file_name="icons/Inv_Sound.png" preload="false" /> + <texture name="Inv_StockFolderClosed" file_name="icons/Inv_StockFolderClosed.png" preload="false" /> + <texture name="Inv_StockFolderOpen" file_name="icons/Inv_StockFolderOpen.png" preload="false" /> + <texture name="Inv_SysClosed" file_name="icons/Inv_SysClosed.png" preload="false" /> + <texture name="Inv_SysOpen" file_name="icons/Inv_SysOpen.png" preload="false" /> + <texture name="Inv_Tattoo" file_name="icons/Inv_Tattoo.png" preload="false" /> + <texture name="Inv_Universal" file_name="icons/Inv_Universal.png" preload="false" /> + <texture name="Inv_Physics" file_name="icons/Inv_Physics.png" preload="false" /> + <texture name="Inv_Texture" file_name="icons/Inv_Texture.png" preload="false" /> + <texture name="Inv_TrashClosed" file_name="icons/Inv_TrashClosed.png" preload="false" /> + <texture name="Inv_TrashOpen" file_name="icons/Inv_TrashOpen.png" preload="false" /> + <texture name="Inv_Underpants" file_name="icons/Inv_Underpants.png" preload="false" /> + <texture name="Inv_Undershirt" file_name="icons/Inv_Undershirt.png" preload="false" /> + <texture name="Inv_Link" file_name="icons/Inv_Link.png" preload="false" /> + <texture name="Inv_Settings" file_name="icons/Inv_Settings.png" preload="false" /> + <texture name="Inv_SettingsSky" file_name="icons/Inv_SettingsSky.png" preload="false" /> + <texture name="Inv_SettingsWater" file_name="icons/Inv_SettingsWater.png" preload="false" /> + <texture name="Inv_SettingsDay" file_name="icons/Inv_SettingsDay.png" preload="false" /> + + <texture name="Inv_Invalid" file_name="icons/Inv_Invalid.png" preload="false" /> + <texture name="Inv_Unknown" file_name="icons/Inv_UnknownObject.png" preload="false" /> + <texture name="Inv_VersionFolderClosed" file_name="icons/Inv_VersionFolderClosed.png" preload="false" /> + <texture name="Inv_VersionFolderOpen" file_name="icons/Inv_VersionFolderOpen.png" preload="false" /> + + <texture name="Inv_Toolbar_SearchVisibility" file_name="icons/Inv_Toolbar_SearchVisibility.png" preload="false" /> + + <texture name="Landmarks_overlay" file_name="navbar/Landmarks.png" preload="false" /> + + <texture name="Linden_Dollar_Alert" file_name="widgets/Linden_Dollar_Alert.png"/> + <texture name="Linden_Dollar_Background" file_name="widgets/Linden_Dollar_Background.png"/> + + <texture name="ListItem_Select" file_name="widgets/ListItem_Select.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" /> + <texture name="ListItem_Over" file_name="widgets/ListItem_Over.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" /> + + <texture name="List_View_Disabled" file_name="icons/List_View_Disabled.png" preload="false" /> + <texture name="List_View_On" file_name="icons/List_View_On.png" preload="false" /> + + <texture name="Lock" file_name="icons/Lock.png" preload="false" /> + <texture name="Lock2" file_name="navbar/Lock.png" preload="false" /> + + <texture name="Locked_Icon" file_name="icons/Locked_Icon.png" preload="false" /> + + <texture name="Map_Placeholder_Icon" file_name="icons/map_placeholder.png" preload="true" /> + + <texture name="Marketplace_Dropzone_Background" file_name="widgets/Marketplace_Dropzone_Background.png" preload="true" /> + <texture name="MarketplaceBtn_Off" file_name="widgets/MarketplaceBtn_Off.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" /> + <texture name="MarketplaceBtn_Selected" file_name="widgets/MarketplaceBtn_Selected.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" /> + + <texture name="Microphone_On" file_name="icons/Microphone_On.png" preload="false" /> + + <texture name="MinusItem_Disabled" file_name="icons/MinusItem_Disabled.png" preload="false" /> + <texture name="MinusItem_Off" file_name="icons/MinusItem_Off.png" preload="false" /> + <texture name="MinusItem_Press" file_name="icons/MinusItem_Press.png" preload="false" /> + + <texture name="menu_separator" file_name="navbar/FileMenu_Divider.png" scale.left="4" scale.top="166" scale.right="0" scale.bottom="0" /> + + <texture name="ModelImport_Status_Good" file_name="green_checkmark.png" preload="false"/> + <texture name="ModelImport_Status_Warning" file_name="lag_status_warning.tga" preload="false"/> + <texture name="ModelImport_Status_Error" file_name="red_x.png" preload="false"/> + + <texture name="MouseLook_View_Off" file_name="bottomtray/Mouselook_View_Off.png" preload="false" /> + <texture name="MouseLook_View_On" file_name="bottomtray/Mouselook_View_On.png" preload="false" /> + + <texture name="Move_Fly_Off" file_name="bottomtray/Move_Fly_Off.png" preload="false" /> + <texture name="Move_Run_Off" file_name="bottomtray/Move_Run_Off.png" preload="false" /> + <texture name="Move_Walk_Off" file_name="bottomtray/Move_Walk_Off.png" preload="false" /> + <texture name="Movement_Backward_Off" file_name="bottomtray/Movement_Backward_Off.png" preload="false" /> + <texture name="Movement_Backward_On" file_name="bottomtray/Movement_Backward_On.png" preload="false" /> + <texture name="Movement_Down_Off" file_name="bottomtray/Movement_Down_Off.png" preload="false" /> + <texture name="Movement_Down_On" file_name="bottomtray/Movement_Down_On.png" preload="false" /> + <texture name="Movement_Forward_Off" file_name="bottomtray/Movement_Forward_Off.png" preload="false" /> + <texture name="Movement_Forward_On" file_name="bottomtray/Movement_Forward_On.png" preload="false" /> + <texture name="Movement_Left_Off" file_name="bottomtray/Movement_Left_Off.png" preload="false" /> + <texture name="Movement_Left_On" file_name="bottomtray/Movement_Left_On.png" preload="false" /> + <texture name="Movement_Right_Off" file_name="bottomtray/Movement_Right_Off.png" preload="false" /> + <texture name="Movement_Right_On" file_name="bottomtray/Movement_Right_On.png" preload="false" /> + <texture name="Movement_TurnLeft_Off" file_name="bottomtray/Movement_TurnLeft_Off.png" preload="false" /> + <texture name="Movement_TurnLeft_On" file_name="bottomtray/Movement_TurnLeft_On.png" preload="false" /> + <texture name="Movement_TurnRight_Off" file_name="bottomtray/Movement_TurnRight_Off.png" preload="false" /> + <texture name="Movement_TurnRight_On" file_name="bottomtray/Movement_TurnRight_On.png" preload="false" /> + <texture name="Movement_Up_Off" file_name="bottomtray/Movement_Up_Off.png" preload="false" /> + <texture name="Movement_Up_On" file_name="bottomtray/Movement_Up_On.png" preload="false" /> + + <texture name="NavBar_BG" file_name="navbar/NavBar_BG.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" /> + <texture name="NavBar_BG_NoFav_Bevel" file_name="navbar/NavBar_BG_NoFav_Bevel.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" /> + <texture name="NavBar_BG_NoNav_Bevel" file_name="navbar/NavBar_BG_NoNav_Bevel.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" /> + + <texture name="Nearby_chat_icon" file_name="icons/nearby_chat_icon.png" preload="false" /> + + <texture name="Notices_Unread" file_name="bottomtray/Notices_Unread.png" preload="true" /> + + <texture name="NoEntryLines" file_name="world/NoEntryLines.png" use_mips="true" preload="false" /> + <texture name="NoEntryPassLines" file_name="world/NoEntryPassLines.png" use_mips="true" preload="false" /> + + <texture name="Object_Cone" file_name="build/Object_Cone.png" preload="false" /> + <texture name="Object_Cone_Selected" file_name="build/Object_Cone_Selected.png" preload="false" /> + <texture name="Object_Cube" file_name="build/Object_Cube.png" preload="false" /> + <texture name="Object_Cube_Selected" file_name="build/Object_Cube_Selected.png" preload="false" /> + <texture name="Object_Cylinder" file_name="build/Object_Cylinder.png" preload="false" /> + <texture name="Object_Cylinder_Selected" file_name="build/Object_Cylinder_Selected.png" preload="false" /> + <texture name="Object_Grass" file_name="build/Object_Grass.png" preload="false" /> + <texture name="Object_Grass_Selected" file_name="build/Object_Grass_Selected.png" preload="false" /> + <texture name="Object_Hemi_Cone" file_name="build/Object_Hemi_Cone.png" preload="false" /> + <texture name="Object_Hemi_Cone_Selected" file_name="build/Object_Hemi_Cone_Selected.png" preload="false" /> + <texture name="Object_Hemi_Cylinder" file_name="build/Object_Hemi_Cylinder.png" preload="false" /> + <texture name="Object_Hemi_Cylinder_Selected" file_name="build/Object_Hemi_Cylinder_Selected.png" preload="false" /> + <texture name="Object_Hemi_Sphere" file_name="build/Object_Hemi_Sphere.png" preload="false" /> + <texture name="Object_Hemi_Sphere_Selected" file_name="build/Object_Hemi_Sphere_Selected.png" preload="false" /> + <texture name="Object_Prism" file_name="build/Object_Prism.png" preload="false" /> + <texture name="Object_Prism_Selected" file_name="build/Object_Prism_Selected.png" preload="false" /> + <texture name="Object_Pyramid" file_name="build/Object_Pyramid.png" preload="false" /> + <texture name="Object_Pyramid_Selected" file_name="build/Object_Pyramid_Selected.png" preload="false" /> + <texture name="Object_Ring" file_name="build/Object_Ring.png" preload="false" /> + <texture name="Object_Ring_Selected" file_name="build/Object_Ring_Selected.png" preload="false" /> + <texture name="Object_Sphere" file_name="build/Object_Sphere.png" preload="false" /> + <texture name="Object_Sphere_Selected" file_name="build/Object_Sphere_Selected.png" preload="false" /> + <texture name="Object_Tetrahedron" file_name="build/Object_Tetrahedron.png" preload="false" /> + <texture name="Object_Tetrahedron_Selected" file_name="build/Object_Tetrahedron_Selected.png" preload="false" /> + <texture name="Object_Torus" file_name="build/Object_Torus.png" preload="false" /> + <texture name="Object_Torus_Selected" file_name="build/Object_Torus_Selected.png" preload="false" /> + <texture name="Object_Tree" file_name="build/Object_Tree.png" preload="false" /> + <texture name="Object_Tree_Selected" file_name="build/Object_Tree_Selected.png" preload="false" /> + <texture name="Object_Tube" file_name="build/Object_Tube.png" preload="false" /> + <texture name="Object_Tube_Selected" file_name="build/Object_Tube_Selected.png" preload="false" /> + + <texture name="Object_View_Off" file_name="bottomtray/Object_View_Off.png" preload="false" /> + <texture name="Object_View_On" file_name="bottomtray/Object_View_On.png" preload="false" /> + + <texture name="OptionsMenu_Disabled" file_name="icons/OptionsMenu_Disabled.png" preload="false" /> + <texture name="OptionsMenu_Off" file_name="icons/OptionsMenu_Off.png" preload="false" /> + <texture name="OptionsMenu_Press" file_name="icons/OptionsMenu_Press.png" preload="false" /> + + <texture name="ClipboardSmallMenu_Disabled" file_name="icons/ClipboardSmallMenu_Disabled.png" preload="false" /> + <texture name="ClipboardSmallMenu_Off" file_name="icons/ClipboardSmallMenu_Off.png" preload="false" /> + <texture name="ClipboardSmallMenu_Press" file_name="icons/ClipboardSmallMenu_Press.png" preload="false" /> + <texture name="ClipboardMenu_Disabled" file_name="icons/ClipboardMenu_Disabled.png" preload="false" /> + <texture name="ClipboardMenu_Off" file_name="icons/ClipboardMenu_Off.png" preload="false" /> + <texture name="ClipboardMenu_Press" file_name="icons/ClipboardMenu_Press.png" preload="false" /> + + <texture name="OutboxStatus_Success" file_name="green_checkmark.png" preload="false" /> + <texture name="OutboxStatus_Warning" file_name="icons/pop_up_caution.png" preload="false" /> + <texture name="OutboxStatus_Error" file_name="red_x.png" preload="false" /> + + <texture name="PanOrbit_Off" file_name="bottomtray/PanOrbit_Off.png" preload="false" /> + + <texture name="Parcel_Exp_Color" file_name="icons/Parcel_Exp_Color.png" preload="false" /> + + <texture name="Parcel_Build_Dark" file_name="icons/Parcel_Build_Dark.png" preload="false" /> + <texture name="Parcel_BuildNo_Dark" file_name="icons/Parcel_BuildNo_Dark.png" preload="false" /> + <texture name="Parcel_Damage_Dark" file_name="icons/Parcel_Damage_Dark.png" preload="false" /> + <texture name="Parcel_DamageNo_Dark" file_name="icons/Parcel_DamageNo_Dark.png" preload="false" /> + <texture name="Parcel_Fly_Dark" file_name="icons/Parcel_Fly_Dark.png" preload="false" /> + <texture name="Parcel_FlyNo_Dark" file_name="icons/Parcel_FlyNo_Dark.png" preload="false" /> + <texture name="Parcel_Health_Dark" file_name="icons/Parcel_Health_Dark.png" preload="false" /> + <texture name="Parcel_M_Dark" file_name="icons/Parcel_M_Dark.png" preload="false" /> + <texture name="Parcel_PG_Dark" file_name="icons/Parcel_PG_Dark.png" preload="false" /> + <texture name="Parcel_Push_Dark" file_name="icons/Parcel_Push_Dark.png" preload="false" /> + <texture name="Parcel_PushNo_Dark" file_name="icons/Parcel_PushNo_Dark.png" preload="false" /> + <texture name="Parcel_R_Dark" file_name="icons/Parcel_R_Dark.png" preload="false" /> + <texture name="Parcel_Scripts_Dark" file_name="icons/Parcel_Scripts_Dark.png" preload="false" /> + <texture name="Parcel_ScriptsNo_Dark" file_name="icons/Parcel_ScriptsNo_Dark.png" preload="false" /> + <texture name="Parcel_Voice_Dark" file_name="icons/Parcel_Voice_Dark.png" preload="false" /> + <texture name="Parcel_VoiceNo_Dark" file_name="icons/Parcel_VoiceNo_Dark.png" preload="false" /> + <texture name="Parcel_SeeAVsOff_Dark" file_name="icons/Parcel_SeeAVsOff_Dark.png" preload="false" /> + <texture name="Parcel_SeeAVsOn_Dark" file_name="icons/Parcel_SeeAVsOn_Dark.png" preload="false" /> + <texture name="Parcel_SeeAVsOff_Light" file_name="icons/Parcel_SeeAVsOff_Light.png" preload="false" /> + <texture name="Parcel_SeeAVsOn_Light" file_name="icons/Parcel_SeeAVsOn_Light.png" preload="false" /> + + <texture name="Parcel_BuildNo_Light" file_name="icons/Parcel_BuildNo_Light.png" preload="false" /> + <texture name="Parcel_FlyNo_Light" file_name="icons/Parcel_FlyNo_Light.png" preload="false" /> + <texture name="Parcel_ForSale_Light" file_name="icons/Parcel_ForSale_Light.png" preload="false" /> + <texture name="Parcel_M_Light" file_name="icons/Parcel_M_Light.png" preload="false" /> + <texture name="Parcel_PG_Light" file_name="icons/Parcel_PG_Light.png" preload="false" /> + <texture name="Parcel_PushNo_Light" file_name="icons/Parcel_PushNo_Light.png" preload="false" /> + <texture name="Parcel_R_Light" file_name="icons/Parcel_R_Light.png" preload="false" /> + <texture name="Parcel_ScriptsNo_Light" file_name="icons/Parcel_ScriptsNo_Dark.png" preload="false" /> + <texture name="Parcel_Voice_Light" file_name="icons/Parcel_Voice_Light.png" preload="false" /> + <texture name="Parcel_VoiceNo_Light" file_name="icons/Parcel_VoiceNo_Light.png" preload="false" /> + + <texture name="Pathfinding_Dirty" file_name="icons/Pathfinding_Dirty.png" preload="false" /> + <texture name="Pathfinding_Disabled" file_name="icons/Pathfinding_Disabled.png" preload="false" /> + + <texture name="Pause_Off" file_name="icons/Pause_Off.png" preload="false" /> + <texture name="Pause_Over" file_name="icons/Pause_Over.png" preload="false" /> + <texture name="Pause_Press" file_name="icons/Pause_Press.png" preload="false" /> + <texture name="Person_Check" file_name="icons/Person_Check.png" preload="false" /> + <texture name="Person_Star" file_name="icons/Person_Star.png" preload="false" /> + + <texture name="Permission_Visible_Online" file_name="icons/see_me_online.png" preload="false" /> + <texture name="Permission_Visible_Map" file_name="icons/see_on_map.png" preload="false" /> + <texture name="Permission_Edit_Objects_Mine" file_name="icons/edit_mine.png" preload="false" /> + <texture name="Permission_Edit_Objects_Theirs" file_name="icons/edit_theirs.png" preload="false" /> + + <texture name="Play_Off" file_name="icons/Play_Off.png" preload="false" /> + <texture name="Play_Over" file_name="icons/Play_Over.png" preload="false" /> + <texture name="Play_Press" file_name="icons/Play_Press.png" preload="false" /> + + <texture name="Profile_Badge_Beta" file_name="icons/profile_badge_beta.png" preload="true"/> + <texture name="Profile_Badge_Beta_Lifetime" file_name="icons/profile_badge_beta_lifetime.png" preload="true"/> + <texture name="Profile_Badge_Lifetime" file_name="icons/profile_badge_lifetime.png" preload="true"/> + <texture name="Profile_Badge_Linden" file_name="icons/profile_badge_linden.png" preload="true"/> + <texture name="Profile_Badge_Pplus_Lifetime" file_name="icons/profile_badge_pplus_lifetime.png" preload="true"/> + <texture name="Profile_Badge_Premium_Lifetime" file_name="icons/profile_badge_premium_lifetime.png" preload="true"/> + <texture name="Profile_Group_Visibility_Off" file_name="icons/profile_group_visibility_eye_off.png" preload="true"/> + <texture name="Profile_Group_Visibility_Off_Pressed" file_name="icons/profile_group_visibility_eye_off_pressed.png" preload="true"/> + <texture name="Profile_Group_Visibility_On" file_name="icons/profile_group_visibility_eye_on.png" preload="true"/> + <texture name="Profile_Group_Visibility_On_Pressed" file_name="icons/profile_group_visibility_eye_on_pressed.png" preload="true"/> + <texture name="Profile_Friend_Offline" file_name="icons/Profile_Friend_Offline.png" preload="true"/> + <texture name="Profile_Friend_Online" file_name="icons/Profile_Friend_Online.png" preload="true"/> + <texture name="Profile_Perm_Find_Disabled" file_name="icons/Profile_Perm_Find_Disabled.png" preload="true"/> + <texture name="Profile_Perm_Find_Enabled" file_name="icons/Profile_Perm_Find_Enabled.png" preload="true"/> + <texture name="Profile_Perm_Objects_Disabled" file_name="icons/Profile_Perm_Objects_Disabled.png" preload="true"/> + <texture name="Profile_Perm_Objects_Enabled" file_name="icons/Profile_Perm_Objects_Enabled.png" preload="true"/> + <texture name="Profile_Perm_Online_Disabled" file_name="icons/Profile_Perm_Online_Disabled.png" preload="true"/> + <texture name="Profile_Perm_Online_Enabled" file_name="icons/Profile_Perm_Online_Enabled.png" preload="true"/> + + <texture name="ProgressBar" file_name="widgets/ProgressBar.png" preload="true" scale.left="4" scale.top="11" scale.right="48" scale.bottom="3" /> + <texture name="ProgressBarSolid" file_name="widgets/ProgressBarSolid.png" preload="true" scale.left="4" scale.top="11" scale.right="48" scale.bottom="3" /> + <texture name="ProgressTrack" file_name="widgets/ProgressTrack.png" preload="true" scale.left="4" scale.top="13" scale.right="148" scale.bottom="2" /> + + <texture name="PushButton_Disabled" file_name="widgets/PushButton_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + <texture name="PushButton_Off" file_name="widgets/PushButton_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + <texture name="PushButton_On" file_name="widgets/PushButton_On.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + <texture name="PushButton_On_Selected" file_name="widgets/PushButton_On_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + <texture name="PushButton_Over" file_name="widgets/PushButton_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + <texture name="PushButton_Press" file_name="widgets/PushButton_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + <texture name="PushButton_Selected" file_name="widgets/PushButton_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + <texture name="PushButton_Selected_Press" file_name="widgets/PushButton_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + <texture name="PushButton_Selected_Disabled" file_name="widgets/PushButton_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + + <texture name="PushButton_Login" file_name="widgets/PushButton_Login.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + <texture name="PushButton_Login_Over" file_name="widgets/PushButton_Login_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + <texture name="PushButton_Login_Pressed" file_name="widgets/PushButton_Login_Pressed.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + + + <texture name="RadioButton_Press" file_name="widgets/RadioButton_Press.png" preload="true" /> + <texture name="RadioButton_On_Press" file_name="widgets/RadioButton_On_Press.png" preload="true" /> + <texture name="RadioButton_Off" file_name="widgets/RadioButton_Off.png" preload="true" /> + <texture name="RadioButton_On" file_name="widgets/RadioButton_On.png" preload="true" /> + <texture name="RadioButton_Disabled" file_name="widgets/RadioButton_Disabled.png" preload="true" /> + <texture name="RadioButton_On_Disabled" file_name="widgets/RadioButton_On_Disabled.png" preload="true" /> + + + <texture name="Refresh_Off" file_name="icons/Refresh_Off.png" preload="true" /> + + <texture name="Resize_Corner" file_name="windows/Resize_Corner.png" preload="true" /> + + <texture name="Rounded_Rect" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="26" scale.right="58" scale.bottom="6" /> + <texture name="Rounded_Rect_Top" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="8" scale.right="58" scale.bottom="0" clip.left="0" clip.right="64" clip.bottom="16" clip.top="32" /> + <texture name="Rounded_Rect_Bottom" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="16" scale.right="58" scale.bottom="8" clip.left="0" clip.right="64" clip.bottom="0" clip.top="16" /> + <texture name="Rounded_Rect_Left" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="26" scale.right="32" scale.bottom="6" clip.left="0" clip.right="32" clip.bottom="0" clip.top="32" /> + <texture name="Rounded_Rect_Right" file_name="Rounded_Rect.png" preload="true" scale.left="0" scale.top="26" scale.right="26" scale.bottom="6" clip.left="32" clip.right="64" clip.bottom="0" clip.top="32" /> + <texture name="Rounded_Square" file_name="rounded_square.j2c" preload="true" scale.left="16" scale.top="16" scale.right="112" scale.bottom="16" /> + <texture name="Row_Selection" file_name="navbar/Row_Selection.png" preload="false" /> + + <texture name="ScrollArrow_Down" file_name="widgets/ScrollArrow_Down.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" /> + <texture name="ScrollArrow_Left" file_name="widgets/ScrollArrow_Left.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" /> + <texture name="ScrollArrow_Right" file_name="widgets/ScrollArrow_Right.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" /> + <texture name="ScrollArrow_Up" file_name="widgets/ScrollArrow_Up.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" /> + + <texture name="ScrollThumb_Horiz" file_name="widgets/ScrollThumb_Horiz.png" preload="true" scale.left="4" scale.top="0" scale.bottom="0" scale.right="2" /> + <texture name="ScrollThumb_Vert" file_name="widgets/ScrollThumb_Vert.png" preload="true" scale.left="4" scale.top="53" scale.bottom="10" scale.right="4" /> + <texture name="ScrollTrack_Vert" file_name="widgets/ScrollTrack_Vert.png" preload="true" scale.left="2" scale.top="40" scale.bottom="13" scale.right="0" /> + <texture name="ScrollTrack_Horiz" file_name="widgets/ScrollTrack_Horiz.png" preload="true" scale.left="4" scale.top="0" scale.bottom="0" scale.right="2" /> + + + <texture name="Search" file_name="navbar/Search.png" preload="false" /> + + <texture name="Search_Icon" file_name="icons/Search_Icon.png" preload="false" /> + + <texture name="SegmentedBtn_Left_Off" file_name="widgets/SegmentedBtn_Left_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="SegmentedBtn_Left_Over" file_name="widgets/SegmentedBtn_Left_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="SegmentedBtn_Left_Press" file_name="widgets/SegmentedBtn_Left_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="SegmentedBtn_Left_Disabled" file_name="widgets/SegmentedBtn_Left_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="SegmentedBtn_Left_Selected" file_name="widgets/SegmentedBtn_Left_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="SegmentedBtn_Left_Selected_Over" file_name="widgets/SegmentedBtn_Left_Selected_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="SegmentedBtn_Left_Selected_Press" file_name="widgets/SegmentedBtn_Left_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="SegmentedBtn_Left_Selected_Disabled" file_name="widgets/SegmentedBtn_Left_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + + <texture name="SegmentedBtn_Middle_Disabled" file_name="widgets/SegmentedBtn_Middle_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="SegmentedBtn_Middle_Selected" file_name="widgets/SegmentedBtn_Middle_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="SegmentedBtn_Middle_Selected_Press" file_name="widgets/SegmentedBtn_Middle_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="SegmentedBtn_Middle_Selected_Disabled" file_name="widgets/SegmentedBtn_Middle_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + + <texture name="SegmentedBtn_Right_Off" file_name="widgets/SegmentedBtn_Right_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="SegmentedBtn_Right_Over" file_name="widgets/SegmentedBtn_Right_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="SegmentedBtn_Right_Press" file_name="widgets/SegmentedBtn_Right_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="SegmentedBtn_Right_Disabled" file_name="widgets/SegmentedBtn_Right_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="SegmentedBtn_Right_Selected" file_name="widgets/SegmentedBtn_Right_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="SegmentedBtn_Right_Selected_Press" file_name="widgets/SegmentedBtn_Right_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="SegmentedBtn_Right_Selected_Disabled" file_name="widgets/SegmentedBtn_Right_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + + <texture name="Shirt_Large" file_name="icons/Shirt_Large.png" preload="false" /> + + <texture name="Sidebar_Icon_Dock_Foreground" file_name="taskpanel/Sidebar_Icon_Dock_Foreground.png" preload="false" /> + <texture name="Sidebar_Icon_Dock_Press" file_name="taskpanel/Sidebar_Icon_Dock_Press.png" preload="false" /> + <texture name="Sidebar_Icon_Undock_Foreground" file_name="taskpanel/Sidebar_Icon_Undock_Foreground.png" preload="false" /> + <texture name="Sidebar_Icon_Undock_Press" file_name="taskpanel/Sidebar_Icon_Undock_Press.png" preload="false" /> + + <texture name="Shop" file_name="icons/Shop.png" preload="false" /> + + <texture name="SkipBackward_Off" file_name="icons/SkipBackward_Off.png" preload="false" /> + <texture name="SkipForward_Off" file_name="icons/SkipForward_Off.png" preload="false" /> + + <texture name="SliderTrack_Horiz" file_name="widgets/SliderTrack_Horiz.png" scale.left="4" scale.top="4" scale.right="100" scale.bottom="2" /> + <texture name="SliderTrack_Vert" file_name="widgets/SliderTrack_Vert.png" scale.left="2" scale.top="100" scale.right="4" scale.bottom="4" /> + <texture name="SliderThumb_Off" file_name="widgets/SliderThumb_Off.png" /> + <texture name="SliderThumb_Disabled" file_name="widgets/SliderThumb_Disabled.png" /> + <texture name="SliderThumb_Press" file_name="widgets/SliderThumb_Press.png" /> + + <texture name="SL_Logo" file_name="icons/MP_Logo.png" preload="true" /> + <texture name="OBJECT_Icon" file_name="icons/object_icon.png" preload="true" /> + <texture name="Unknown_Icon" file_name="icons/unknown_icon.png" preload="true" /> + + <texture name="Snapshot_Off" file_name="bottomtray/Snapshot_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="Snapshot_Download" file_name="snapshot_download.png" preload="false" /> + <texture name="Snapshot_Email" file_name="snapshot_email.png" preload="false" /> + <texture name="Snapshot_Inventory" file_name="toolbar_icons/inventory.png" preload="false" /> + <texture name="Snapshot_Profile" file_name="toolbar_icons/profile.png" preload="false" /> + <texture name="startup_logo" file_name="windows/startup_logo.png" preload="true" /> + + <texture name="login_mp_logo" file_name="windows/login_mp_logo.png" preload="true" /> + <texture name="login_mp_logo_small" file_name="windows/login_mp_logo_small.png" preload="true" /> + <texture name="first_login_image" file_name="windows/first_login_image.jpg" preload="true" /> + + <texture name="Stepper_Down_Off" file_name="widgets/Stepper_Down_Off.png" preload="false" /> + <texture name="Stepper_Down_Press" file_name="widgets/Stepper_Down_Press.png" preload="false" /> + <texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="false" /> + <texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="false" /> + + <texture name="Stop_Off" file_name="icons/Stop_Off.png" preload="true" /> + <texture name="StopReload_Off" file_name="icons/StopReload_Off.png" preload="false" /> + <texture name="StopReload_Over" file_name="icons/StopReload_Over.png" preload="false" /> + + <texture name="Sync_Disabled" file_name="icons/Sync_Disabled.png" preload="true" /> + <texture name="Sync_Enabled" file_name="icons/Sync_Enabled.png" preload="true" /> + <texture name="Sync_Progress_1" file_name="icons/Sync_Progress_1.png" preload="true" /> + <texture name="Sync_Progress_2" file_name="icons/Sync_Progress_2.png" preload="true" /> + <texture name="Sync_Progress_3" file_name="icons/Sync_Progress_3.png" preload="true" /> + <texture name="Sync_Progress_4" file_name="icons/Sync_Progress_4.png" preload="true" /> + <texture name="Sync_Progress_5" file_name="icons/Sync_Progress_5.png" preload="true" /> + <texture name="Sync_Progress_6" file_name="icons/Sync_Progress_6.png" preload="true" /> + + <texture name="TabIcon_Close_Off" file_name="taskpanel/TabIcon_Close_Off.png" preload="false" /> + <texture name="TabIcon_Home_Selected" file_name="taskpanel/TabIcon_Home_Selected.png" preload="false" /> + <texture name="TabIcon_Me_Off" file_name="taskpanel/TabIcon_Me_Off.png" preload="false" /> + <texture name="TabIcon_Open_Off" file_name="taskpanel/TabIcon_Open_Off.png" preload="false" /> + <texture name="TabIcon_People_Off" file_name="taskpanel/TabIcon_People_Off.png" preload="false" /> + <texture name="TabIcon_Places_Off" file_name="taskpanel/TabIcon_Places_Off.png" preload="false" /> + <texture name="TabIcon_Things_Off" file_name="taskpanel/TabIcon_Things_Off.png" preload="false" /> + + <texture name="TabTop_Right_Off" file_name="containers/TabTop_Right_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" /> + <texture name="TabTop_Right_Selected" file_name="containers/TabTop_Right_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" /> + <texture name="TabTop_Right_Flashing" file_name="containers/TabTop_Right_Flashing.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" /> + <texture name="TabTop_Middle_Off" file_name="containers/TabTop_Middle_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="120" scale.bottom="9" /> + <texture name="TabTop_Middle_Selected" file_name="containers/TabTop_Middle_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="96" scale.bottom="9" /> + <texture name="TabTop_Left_Off" file_name="containers/TabTop_Left_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="120" scale.bottom="9" /> + <texture name="TabTop_Left_Selected" file_name="containers/TabTop_Left_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="96" scale.bottom="9" /> + + <texture name="TaskPanel_Tab_Off" file_name="taskpanel/TaskPanel_Tab_Off.png" preload="false" scale.left="4" scale.top="29" scale.right="36" scale.bottom="4" /> + <texture name="TaskPanel_Tab_Selected" file_name="taskpanel/TaskPanel_Tab_Selected.png" preload="false" scale.left="5" scale.top="30" scale.right="36" scale.bottom="5" /> + + <texture name="TextField_Search_Disabled" file_name="widgets/TextField_Search_Disabled.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" /> + <texture name="TextField_Off" file_name="widgets/TextField_Off.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" /> + <texture name="TextField_Search_Active" file_name="widgets/TextField_Search_Active.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" /> + <texture name="TextField_Search_Off" file_name="widgets/TextField_Search_Off.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" /> + <texture name="TextField_Disabled" file_name="widgets/TextField_Disabled.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" /> + <texture name="TextField_Active" file_name="widgets/TextField_Active.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" /> + <texture name="TextField_Search_Highlight" file_name="widgets/TextField_Search_Highlight.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" /> + + <texture name="Thumbnail_Fallback" file_name="icons/thumbnail_fallback_icon.png" preload="true" /> + + <texture name="Toast_CloseBtn" file_name="windows/Toast_CloseBtn.png" preload="true" /> + <texture name="Toast_Background" file_name="windows/Toast_Background.png" preload="true" + scale.left="4" scale.top="28" scale.right="60" scale.bottom="4" /> + <texture name="Toast_Over" file_name="windows/Toast_Over.png" preload="true" + scale.left="4" scale.top="28" scale.right="60" scale.bottom="4" /> + + <texture name="Tool_Create" file_name="build/Tool_Create.png" preload="false" /> + <texture name="Tool_Dozer" file_name="build/Tool_Dozer.png" preload="false" /> + <texture name="Tool_Face" file_name="build/Tool_Face.png" preload="false" /> + <texture name="Tool_Grab" file_name="build/Tool_Grab.png" preload="false" /> + <texture name="Tool_Zoom" file_name="build/Tool_Zoom.png" preload="false" /> + + <texture name="Toolbar_Left_Flash" file_name="containers/Toolbar_Left_Flash.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" /> + <texture name="Toolbar_Left_Off" file_name="containers/Toolbar_Left_Off.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" /> + <texture name="Toolbar_Left_Over" file_name="containers/Toolbar_Left_Over.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" /> + <texture name="Toolbar_Left_Selected" file_name="containers/Toolbar_Left_Selected.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" /> + <texture name="Toolbar_Middle_Off" file_name="containers/Toolbar_Middle_Off.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" /> + <texture name="Toolbar_Middle_Over" file_name="containers/Toolbar_Middle_Over.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" /> + <texture name="Toolbar_Middle_Selected" file_name="containers/Toolbar_Middle_Selected.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" /> + <texture name="Toolbar_Middle_Flash" file_name="containers/Toolbar_Middle_Flash.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" /> + <texture name="Toolbar_Right_Off" file_name="containers/Toolbar_Right_Off.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" /> + <texture name="Toolbar_Right_Over" file_name="containers/Toolbar_Right_Over.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" /> + <texture name="Toolbar_Right_Selected" file_name="containers/Toolbar_Right_Selected.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" /> + <texture name="Toolbar_Right_Flash" file_name="containers/Toolbar_Right_Flash.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" /> + + <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="16" scale.right="100" scale.bottom="3" /> + + <texture name="TrashItem_Disabled" file_name="icons/TrashItem_Disabled.png" preload="false" /> + <texture name="TrashItem_Off" file_name="icons/TrashItem_Off.png" preload="false" /> + <texture name="TrashItem_Press" file_name="icons/TrashItem_Press.png" preload="false" /> + + <texture name="Unread_Chiclet" file_name="bottomtray/Unread_Chiclet.png" preload="false" /> + + <texture name="UpArrow_Off" file_name="icons/UpArrow_Off.png" preload="false" /> + + <texture name="Video_URL_Off" file_name="icons/Video_URL_Off.png" preload="true" /> + + <texture name="Vertical Drag Handle" file_name="widgets/vertical_drag_handle.png" scale.left="2" scale.right="7" scale.bottom="8" scale.top="120" scale_type="scale_outer"/> + + <texture name="VirtualTrackball_Moon_Back" file_name="widgets/track_control_moon_back.png" /> + <texture name="VirtualTrackball_Moon_Front" file_name="widgets/track_control_moon_front.png" /> + <texture name="VirtualTrackball_Rotate_Bottom" file_name="widgets/track_control_rotate_bottom.png" /> + <texture name="VirtualTrackball_Rotate_Left" file_name="widgets/track_control_rotate_left_side.png" /> + <texture name="VirtualTrackball_Rotate_Right" file_name="widgets/track_control_rotate_right_side.png" /> + <texture name="VirtualTrackball_Rotate_Top" file_name="widgets/track_control_rotate_top.png" /> + <texture name="VirtualTrackball_Rotate_Bottom_Active" file_name="widgets/track_control_rotate_bottom_active.png" /> + <texture name="VirtualTrackball_Rotate_Left_Active" file_name="widgets/track_control_rotate_left_side_active.png" /> + <texture name="VirtualTrackball_Rotate_Right_Active" file_name="widgets/track_control_rotate_right_side_active.png" /> + <texture name="VirtualTrackball_Rotate_Top_Active" file_name="widgets/track_control_rotate_top_active.png" /> + <texture name="VirtualTrackball_Sphere" file_name="widgets/track_control_sphere.png" /> + <texture name="VirtualTrackball_Sun_Back" file_name="widgets/track_control_sun_back.png" /> + <texture name="VirtualTrackball_Sun_Front" file_name="widgets/track_control_sun_front.png" /> + + <texture name="Volume_Background" file_name="windows/Volume_Background.png" preload="false" + scale.left="6" scale.top="33" scale.right="63" scale.bottom="10" /> + + <texture name="VoicePTT_Lvl1" file_name="bottomtray/VoicePTT_Lvl1.png" preload="false" /> + <texture name="VoicePTT_Lvl2" file_name="bottomtray/VoicePTT_Lvl2.png" preload="false" /> + <texture name="VoicePTT_Lvl3" file_name="bottomtray/VoicePTT_Lvl3.png" preload="false" /> + <texture name="VoicePTT_Off" file_name="bottomtray/VoicePTT_Off.png" preload="false" /> + <texture name="VoicePTT_On" file_name="bottomtray/VoicePTT_On.png" preload="false" /> + + <texture name="Wearables_Divider" file_name="windows/Wearables_Divider.png" preload="false" /> + + <texture name="Add_Icon" file_name="icons/add_icon.png" preload="false" /> + <texture name="Remove_Icon" file_name="icons/remove_icon.png" preload="false" /> + + <texture name="Web_Profile_Off" file_name="icons/Web_Profile_Off.png" preload="false" /> + + <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + + <texture name="Window_Background" file_name="windows/Window_Background.png" preload="true" + scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" /> + <texture name="Window_Foreground" file_name="windows/Window_Foreground.png" preload="true" + scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" /> + <texture name="Window_NoTitle_Background" file_name="windows/Window_Background.png" preload="true" + scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" /> + <texture name="Window_NoTitle_Foreground" file_name="windows/Window_Foreground.png" preload="true" + scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" /> + + <texture name="YouAreHere_Badge" file_name="icons/YouAreHere_Badge.png" preload="false" /> + + <texture name="Zoom_Off" file_name="icons/Zoom_Off.png" preload="false" /> + <texture name="UnZoom_Off" file_name="icons/UnZoom_Off.png" preload="false" /> + + <texture name="pixiesmall.j2c" use_mips="true" /> + <texture name="script_error.j2c" use_mips="true" /> + <texture name="silhouette.j2c" use_mips="true" /> + <texture name="foot_shadow.j2c" use_mips="true" /> + <texture name="cloud-particle.png" use_mips="true" /> + <texture name="transparent.j2c" use_mips="true" /> + + <!--WARNING OLD ART BELOW *do not use*--> + <texture name="icn_media_web.tga" preload="true" /> + <texture name="icn_media_movie.tga" preload="true" /> + + <texture name="jump_left_out.tga" file_name="widgets/jump_left_out.png" /> + <texture name="jump_left_in.tga" file_name="widgets/jump_left_in.png" /> + <texture name="jump_right_out.tga" file_name="widgets/jump_right_out.png" /> + <texture name="jump_right_in.tga" file_name="widgets/jump_right_in.png" /> + + <texture name="scrollbutton_left_out_blue.tga" file_name="widgets/ScrollArrow_Left_Opaque.png" /> + <texture name="scrollbutton_left_in_blue.tga" file_name="widgets/ScrollArrow_Left_Over_Opaque.png" /> + <texture name="scrollbutton_right_out_blue.tga" file_name="widgets/ScrollArrow_Right_Opaque.png" /> + <texture name="scrollbutton_right_in_blue.tga" file_name="widgets/ScrollArrow_Right_Over_Opaque.png" /> + <texture name="scrollbutton_up_out_blue.tga" file_name="widgets/ScrollArrow_Up_Opaque.png" /> + <texture name="scrollbutton_up_in_blue.tga" file_name="widgets/ScrollArrow_Up_Over_Opaque.png" /> + <texture name="scrollbutton_down_out_blue.tga" file_name="widgets/ScrollArrow_Down_Opaque.png" /> + <texture name="scrollbutton_down_in_blue.tga" file_name="widgets/ScrollArrow_Down_Over_Opaque.png" /> + + <texture name="up_arrow.tga" file_name="up_arrow.png" /> + <texture name="down_arrow.tga" file_name="down_arrow.png" /> + <texture name="arrow_down.tga" /> + + <texture name="tearoffbox.tga" /> + <texture name="tearoff_pressed.tga" /> + + <texture name="color_swatch_alpha.tga" preload="true" /> + + <texture name="button_anim_pause.tga" /> + <texture name="button_anim_pause_selected.tga" /> + <texture name="button_anim_play.tga" /> + <texture name="button_anim_play_selected.tga" /> + <texture name="crosshairs.tga" /> + <texture name="direction_arrow.tga" file_name="world/BeaconArrow.png" /> + + <texture name="icon_avatar_offline.tga" /> + <texture name="icon_avatar_online.tga" /> + <texture name="icon_diurnal.tga" /> + <texture name="icon_for_sale.tga" file_name="icons/Icon_For_Sale.png" /> + <texture name="icon_top_pick.tga" /> + + <texture name="lag_status_critical.tga" /> + <texture name="lag_status_good.tga" /> + <texture name="lag_status_warning.tga" /> + + <texture name="legend.tga" /> + + <texture name="map_avatar_16.tga" /> + <texture name="map_avatar_8.tga" /> + <texture name="map_event.tga" /> + <texture name="map_home.tga" /> + <texture name="map_infohub.tga" /> + <texture name="map_telehub.tga" /> + <texture name="map_track_16.tga" /> + <texture name="map_ui_collapse_icon.png" /> + <texture name="map_ui_expand_icon.png" /> + + <texture name="notify_caution_icon.tga" /> + + <texture name="default_land_picture.j2c" file_name="default_land_picture.png"/> + <texture name="default_profile_picture.j2c" file_name="default_profile_picture.png"/> + <texture name="locked_image.j2c" /> + <texture name="badge_note.j2c" /> + <texture name="badge_warn.j2c" /> + <texture name="badge_ok.j2c" /> + <texture name="materials_ui_x_24.png" /> + + <texture name="Progress_1" file_name="icons/Progress_1.png" preload="true" /> + <texture name="Progress_2" file_name="icons/Progress_2.png" preload="true" /> + <texture name="Progress_3" file_name="icons/Progress_3.png" preload="true" /> + <texture name="Progress_4" file_name="icons/Progress_4.png" preload="true" /> + <texture name="Progress_5" file_name="icons/Progress_5.png" preload="true" /> + <texture name="Progress_6" file_name="icons/Progress_6.png" preload="true" /> + <texture name="Progress_7" file_name="icons/Progress_7.png" preload="true" /> + <texture name="Progress_8" file_name="icons/Progress_8.png" preload="true" /> + <texture name="Progress_9" file_name="icons/Progress_9.png" preload="true" /> + <texture name="Progress_10" file_name="icons/Progress_10.png" preload="true" /> + <texture name="Progress_11" file_name="icons/Progress_11.png" preload="true" /> + <texture name="Progress_12" file_name="icons/Progress_12.png" preload="true" /> + + <texture name="bevel_background" file_name="widgets/bevel_background.png" preload="true" scale.left="12" scale.top="15" scale.right="108" scale.bottom="2"/> + <texture name="buy_off" file_name="widgets/buy_off.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/> + <texture name="buy_over" file_name="widgets/buy_over.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/> + <texture name="buy_press" file_name="widgets/buy_press.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/> + + <texture name="hint_background" file_name="windows/hint_background.png" preload="false" scale.left="8" scale.top="70" scale.right="195" scale.bottom="11"/> + <texture name="hint_arrow_left" file_name="windows/hint_arrow_left.png" preload="false"/> + <texture name="hint_arrow_right" file_name="windows/hint_arrow_right.png" preload="false"/> + <texture name="hint_arrow_up" file_name="windows/hint_arrow_up.png" preload="false"/> + <texture name="hint_arrow_down" file_name="windows/hint_arrow_down.png" preload="false"/> + <texture name="hint_arrow_lower_left" file_name="windows/hint_arrow_lower_left.png" preload="false"/> + + <texture name="Yellow_Gradient" file_name="windows/yellow_gradient.png"/> + <texture name="Popup_Caution" file_name="icons/pop_up_caution.png"/> + <texture name="Camera_Drag_Dot" file_name="world/CameraDragDot.png"/> + <texture name="NavBar Separator" file_name="navbar/separator.png"/> + + <texture name="Default_Outfit_Photo" file_name="icons/Default_Outfit_Photo.png" preload="true"/> + <texture name="Notification_Condense" file_name="icons/Icon_Notification_Condense.png" preload="true"/> + <texture name="Notification_Expand" file_name="icons/Icon_Notification_Expand.png" preload="true"/> + <texture name="System_Notification" file_name="icons/MP_Logo.png" preload="true"/> + <texture name="Icon_Attachment_Small" file_name="icons/Icon_Attachment_Small.png" preload="true"/> + <texture name="Icon_Attachment_Large" file_name="icons/Icon_Attachment_Large.png" preload="true"/> + + <texture name="Single_Folder_Mode" file_name="icons/single_folder_mode.png" preload="true"/> + <texture name="Multi_Folder_Mode" file_name="icons/multi_folder_mode.png" preload="true"/> + <texture name="Single_Folder_Back" file_name="icons/single_folder_back.png" preload="true"/> + <texture name="Single_Folder_Forward" file_name="icons/single_folder_forward.png" preload="true"/> + <texture name="Single_Folder_Up" file_name="icons/single_folder_up.png" preload="true"/> + <texture name="Icon_Color_Palette" file_name="icons/Icon_Color_Palette.png" preload="false"/> + <texture name="Icon_Font_Size" file_name="icons/Icon_Font_Size.png" preload="false"/> + + <texture name="Icon_Place" file_name="megapahit/icon_place.png" preload="false" /> + <texture name="Icon_Auction" file_name="megapahit/icon_land_auction.png" preload="false" /> + <texture name="Icon_For_Sale" file_name="megapahit/icon_land_forsale.png" preload="false" /> + <texture name="Icon_Group" file_name="megapahit/icon_group.png" preload="false" /> + <texture name="Icon_Legacy_Event_PG" file_name="icons/Parcel_PG_Dark.png" preload="false" /> + <texture name="Icon_Legacy_Event_Mature" file_name="icons/Parcel_M_Dark.png" preload="false" /> + <texture name="Icon_Legacy_Event_Adult" file_name="icons/Parcel_R_Dark.png" preload="false" /> + + <texture name="ProgressLarge_1" file_name="icons/ProgressLarge_1.png" preload="true" /> + <texture name="ProgressLarge_2" file_name="icons/ProgressLarge_2.png" preload="true" /> + <texture name="ProgressLarge_3" file_name="icons/ProgressLarge_3.png" preload="true" /> + <texture name="ProgressLarge_4" file_name="icons/ProgressLarge_4.png" preload="true" /> + <texture name="ProgressLarge_5" file_name="icons/ProgressLarge_5.png" preload="true" /> + <texture name="ProgressLarge_6" file_name="icons/ProgressLarge_6.png" preload="true" /> + <texture name="ProgressLarge_7" file_name="icons/ProgressLarge_7.png" preload="true" /> + <texture name="ProgressLarge_8" file_name="icons/ProgressLarge_8.png" preload="true" /> + <texture name="ProgressLarge_9" file_name="icons/ProgressLarge_9.png" preload="true" /> + <texture name="ProgressLarge_10" file_name="icons/ProgressLarge_10.png" preload="true" /> + <texture name="ProgressLarge_11" file_name="icons/ProgressLarge_11.png" preload="true" /> + <texture name="ProgressLarge_12" file_name="icons/ProgressLarge_12.png" preload="true" /> + +</textures> diff --git a/indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_bottom.png b/indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_bottom.png Binary files differnew file mode 100644 index 0000000000..5f6a01eaa1 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_bottom.png diff --git a/indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_left.png b/indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_left.png Binary files differnew file mode 100644 index 0000000000..0b8090314c --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_left.png diff --git a/indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_right.png b/indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_right.png Binary files differnew file mode 100644 index 0000000000..044751560f --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/toolbar_icons/caret_right.png diff --git a/indra/newview/skins/contrast_gold/textures/toolbar_icons/highlighting.png b/indra/newview/skins/contrast_gold/textures/toolbar_icons/highlighting.png Binary files differnew file mode 100644 index 0000000000..eeb43d165d --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/toolbar_icons/highlighting.png diff --git a/indra/newview/skins/contrast_gold/textures/toolbar_icons/highlighting_selected.png b/indra/newview/skins/contrast_gold/textures/toolbar_icons/highlighting_selected.png Binary files differnew file mode 100644 index 0000000000..79d812ee3e --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/toolbar_icons/highlighting_selected.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Down.png b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Down.png Binary files differnew file mode 100644 index 0000000000..8b592ed840 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Down.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Left.png b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Left.png Binary files differnew file mode 100644 index 0000000000..04416541b9 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Left.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Right.png b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Right.png Binary files differnew file mode 100644 index 0000000000..e57452a558 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Right.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Down.png b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Down.png Binary files differnew file mode 100644 index 0000000000..8694cdf2d4 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Down.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Left.png b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Left.png Binary files differnew file mode 100644 index 0000000000..a1b82d5101 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Left.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Right.png b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Right.png Binary files differnew file mode 100644 index 0000000000..0e05d76852 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Right.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Up.png b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Up.png Binary files differnew file mode 100644 index 0000000000..348bc4c019 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Small_Up.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Up.png b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Up.png Binary files differnew file mode 100644 index 0000000000..8b3da09d79 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Arrow_Up.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Badge_Background.png b/indra/newview/skins/contrast_gold/textures/widgets/Badge_Background.png Binary files differnew file mode 100644 index 0000000000..5abc1bf489 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Badge_Background.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Badge_Border.png b/indra/newview/skins/contrast_gold/textures/widgets/Badge_Border.png Binary files differnew file mode 100644 index 0000000000..57d3be2320 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Badge_Border.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Disabled.png Binary files differnew file mode 100644 index 0000000000..e18872b6f6 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Off.png Binary files differnew file mode 100644 index 0000000000..699ddd9bf3 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Over.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Over.png Binary files differnew file mode 100644 index 0000000000..12854bdb12 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Over.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Press.png Binary files differnew file mode 100644 index 0000000000..1f04a1e9e8 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Left_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Disabled.png Binary files differnew file mode 100644 index 0000000000..2cf3de24c0 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Off.png Binary files differnew file mode 100644 index 0000000000..52bcf88258 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Over.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Over.png Binary files differnew file mode 100644 index 0000000000..efdd13003a --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Over.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Press.png Binary files differnew file mode 100644 index 0000000000..3c66b1f1cc --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Middle_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Disabled.png Binary files differnew file mode 100644 index 0000000000..d9c9692114 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Off.png Binary files differnew file mode 100644 index 0000000000..4935dae42e --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Over.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Over.png Binary files differnew file mode 100644 index 0000000000..6eeec08248 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Over.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Press.png Binary files differnew file mode 100644 index 0000000000..2d6d08522b --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/BreadCrumbBtn_Right_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Disabled.png Binary files differnew file mode 100644 index 0000000000..8439f82e29 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Off.png Binary files differnew file mode 100644 index 0000000000..cb9a04d84f --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On.png b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On.png Binary files differnew file mode 100644 index 0000000000..0ec090504a --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On_Disabled.png Binary files differnew file mode 100644 index 0000000000..5759f7de69 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On_Press.png Binary files differnew file mode 100644 index 0000000000..ba46e91c55 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_On_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Press.png Binary files differnew file mode 100644 index 0000000000..5f5a33d878 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Checkbox_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Disabled.png Binary files differnew file mode 100644 index 0000000000..ebeb813349 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Hover.png b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Hover.png Binary files differnew file mode 100644 index 0000000000..1377d35e1a --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Hover.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Off.png Binary files differnew file mode 100644 index 0000000000..4f573cf6fa --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Off.png diff --git a/indra/newview/skins/contrast/textures/icons/see_on_map.png b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_On.png Binary files differindex fc7057cacd..1d1ea1bd87 100644 --- a/indra/newview/skins/contrast/textures/icons/see_on_map.png +++ b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_On.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Selected.png b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Selected.png Binary files differnew file mode 100644 index 0000000000..d87e46aba7 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_Selected.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_UpOff.png b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_UpOff.png Binary files differnew file mode 100644 index 0000000000..5a067aca7c --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_UpOff.png diff --git a/indra/newview/skins/contrast/textures/icons/SL_Logo.png b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_UpSelected.png Binary files differindex 8234387058..34b0c70cb0 100644 --- a/indra/newview/skins/contrast/textures/icons/SL_Logo.png +++ b/indra/newview/skins/contrast_gold/textures/widgets/ComboButton_UpSelected.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/DisclosureArrow_Opened_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/DisclosureArrow_Opened_Off.png Binary files differnew file mode 100644 index 0000000000..115ec7a11f --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/DisclosureArrow_Opened_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/DropDown.png b/indra/newview/skins/contrast_gold/textures/widgets/DropDown.png Binary files differnew file mode 100644 index 0000000000..30e14f8684 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/DropDown.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/DropDown_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/DropDown_Disabled.png Binary files differnew file mode 100644 index 0000000000..fbc1f58aa5 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/DropDown_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/DropDown_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/DropDown_Off.png Binary files differnew file mode 100644 index 0000000000..e21cd20ba9 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/DropDown_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/DropDown_On.png b/indra/newview/skins/contrast_gold/textures/widgets/DropDown_On.png Binary files differnew file mode 100644 index 0000000000..dc19edd130 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/DropDown_On.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/DropDown_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/DropDown_Press.png Binary files differnew file mode 100644 index 0000000000..dc19edd130 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/DropDown_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/DropTarget.png b/indra/newview/skins/contrast_gold/textures/widgets/DropTarget.png Binary files differnew file mode 100644 index 0000000000..01e7a88861 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/DropTarget.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Error_Tag_Background.png b/indra/newview/skins/contrast_gold/textures/widgets/Error_Tag_Background.png Binary files differnew file mode 100644 index 0000000000..439fce3dd3 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Error_Tag_Background.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Linden_Dollar_Alert.png b/indra/newview/skins/contrast_gold/textures/widgets/Linden_Dollar_Alert.png Binary files differnew file mode 100644 index 0000000000..76e078100f --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Linden_Dollar_Alert.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Linden_Dollar_Background.png b/indra/newview/skins/contrast_gold/textures/widgets/Linden_Dollar_Background.png Binary files differnew file mode 100644 index 0000000000..6e71ef7b72 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Linden_Dollar_Background.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Prism_Selected.png b/indra/newview/skins/contrast_gold/textures/widgets/ListItem_Over.png Binary files differindex 6ec9e72c54..0ec8de776e 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Prism_Selected.png +++ b/indra/newview/skins/contrast_gold/textures/widgets/ListItem_Over.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ListItem_Select.png b/indra/newview/skins/contrast_gold/textures/widgets/ListItem_Select.png Binary files differnew file mode 100644 index 0000000000..6dd7b3c638 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ListItem_Select.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/MarketplaceBtn_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/MarketplaceBtn_Off.png Binary files differnew file mode 100644 index 0000000000..37cd0f6108 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/MarketplaceBtn_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/MarketplaceBtn_Selected.png b/indra/newview/skins/contrast_gold/textures/widgets/MarketplaceBtn_Selected.png Binary files differnew file mode 100644 index 0000000000..3d9d474966 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/MarketplaceBtn_Selected.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Marketplace_Dropzone_Background.png b/indra/newview/skins/contrast_gold/textures/widgets/Marketplace_Dropzone_Background.png Binary files differnew file mode 100644 index 0000000000..9eb4a5c55d --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Marketplace_Dropzone_Background.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/New_Tag_Background.png b/indra/newview/skins/contrast_gold/textures/widgets/New_Tag_Background.png Binary files differnew file mode 100644 index 0000000000..3631d90825 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/New_Tag_Background.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/New_Tag_Border.png b/indra/newview/skins/contrast_gold/textures/widgets/New_Tag_Border.png Binary files differnew file mode 100644 index 0000000000..d9b78eeea4 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/New_Tag_Border.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ProgressBar.png b/indra/newview/skins/contrast_gold/textures/widgets/ProgressBar.png Binary files differnew file mode 100644 index 0000000000..85a8559ceb --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ProgressBar.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ProgressBarSolid.png b/indra/newview/skins/contrast_gold/textures/widgets/ProgressBarSolid.png Binary files differnew file mode 100644 index 0000000000..59a798464d --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ProgressBarSolid.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ProgressTrack.png b/indra/newview/skins/contrast_gold/textures/widgets/ProgressTrack.png Binary files differnew file mode 100644 index 0000000000..f4be9f5ccd --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ProgressTrack.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Disabled.png Binary files differnew file mode 100644 index 0000000000..e99ec4b14b --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login.png Binary files differnew file mode 100644 index 0000000000..8e7d932ab1 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login_Over.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login_Over.png Binary files differnew file mode 100644 index 0000000000..038ba23be2 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login_Over.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login_Pressed.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login_Pressed.png Binary files differnew file mode 100644 index 0000000000..828aa1a139 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Login_Pressed.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Off.png Binary files differnew file mode 100644 index 0000000000..8d0b56ade0 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_On.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_On.png Binary files differnew file mode 100644 index 0000000000..cdbcf6be4d --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_On.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_On_Selected.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_On_Selected.png Binary files differnew file mode 100644 index 0000000000..cdbcf6be4d --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_On_Selected.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Over.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Over.png Binary files differnew file mode 100644 index 0000000000..db8ad9d691 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Over.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Press.png Binary files differnew file mode 100644 index 0000000000..cdbcf6be4d --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected.png Binary files differnew file mode 100644 index 0000000000..cdbcf6be4d --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected_Disabled.png Binary files differnew file mode 100644 index 0000000000..c44b0d2083 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected_Press.png Binary files differnew file mode 100644 index 0000000000..cdbcf6be4d --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/PushButton_Selected_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Disabled.png Binary files differnew file mode 100644 index 0000000000..32ec25fe0e --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Off.png Binary files differnew file mode 100644 index 0000000000..5d267af5dc --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On.png b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On.png Binary files differnew file mode 100644 index 0000000000..e6bf0db157 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On_Disabled.png Binary files differnew file mode 100644 index 0000000000..72aae43618 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On_Press.png Binary files differnew file mode 100644 index 0000000000..f3883b82b3 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_On_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Press.png Binary files differnew file mode 100644 index 0000000000..0025256045 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/RadioButton_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down.png Binary files differnew file mode 100644 index 0000000000..768909d447 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down_Opaque.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down_Opaque.png Binary files differnew file mode 100644 index 0000000000..1c57521e9e --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down_Opaque.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down_Over_Opaque.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down_Over_Opaque.png Binary files differnew file mode 100644 index 0000000000..3db7be9ffa --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Down_Over_Opaque.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left.png Binary files differnew file mode 100644 index 0000000000..9ef73f48a5 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left_Opaque.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left_Opaque.png Binary files differnew file mode 100644 index 0000000000..0fb0671036 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left_Opaque.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left_Over_Opaque.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left_Over_Opaque.png Binary files differnew file mode 100644 index 0000000000..464130c359 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Left_Over_Opaque.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right.png Binary files differnew file mode 100644 index 0000000000..8a59274b8a --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right_Opaque.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right_Opaque.png Binary files differnew file mode 100644 index 0000000000..ab1f1ac90b --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right_Opaque.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right_Over_Opaque.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right_Over_Opaque.png Binary files differnew file mode 100644 index 0000000000..e5a94429a3 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Right_Over_Opaque.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up.png Binary files differnew file mode 100644 index 0000000000..064580f0c8 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up_Opaque.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up_Opaque.png Binary files differnew file mode 100644 index 0000000000..2cc4857d27 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up_Opaque.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up_Over_Opaque.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up_Over_Opaque.png Binary files differnew file mode 100644 index 0000000000..2018b53af9 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollArrow_Up_Over_Opaque.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollThumb_Horiz.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollThumb_Horiz.png Binary files differnew file mode 100644 index 0000000000..9afc907c1c --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollThumb_Horiz.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollThumb_Vert.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollThumb_Vert.png Binary files differnew file mode 100644 index 0000000000..ede643e528 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollThumb_Vert.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollTrack_Horiz.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollTrack_Horiz.png Binary files differnew file mode 100644 index 0000000000..35da770073 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollTrack_Horiz.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/ScrollTrack_Vert.png b/indra/newview/skins/contrast_gold/textures/widgets/ScrollTrack_Vert.png Binary files differnew file mode 100644 index 0000000000..cf67c23133 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/ScrollTrack_Vert.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Disabled.png Binary files differnew file mode 100644 index 0000000000..ba63751690 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Off.png Binary files differnew file mode 100644 index 0000000000..1a9f7e9d71 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Over.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Over.png Binary files differnew file mode 100644 index 0000000000..e4fcf491ba --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Over.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Press.png Binary files differnew file mode 100644 index 0000000000..dbe6651dc8 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected.png Binary files differnew file mode 100644 index 0000000000..dbe6651dc8 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Disabled.png Binary files differnew file mode 100644 index 0000000000..fb91d76860 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Over.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Over.png Binary files differnew file mode 100644 index 0000000000..fb91d76860 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Over.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Press.png Binary files differnew file mode 100644 index 0000000000..fb91d76860 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Left_Selected_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Disabled.png Binary files differnew file mode 100644 index 0000000000..d9f05d33ec --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected.png Binary files differnew file mode 100644 index 0000000000..d2342f6538 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png Binary files differnew file mode 100644 index 0000000000..5e3b275c46 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected_Press.png Binary files differnew file mode 100644 index 0000000000..5e3b275c46 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Middle_Selected_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Disabled.png Binary files differnew file mode 100644 index 0000000000..ecd2144d6d --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Off.png Binary files differnew file mode 100644 index 0000000000..1901d5e843 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_On_Selected.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_On_Selected.png Binary files differnew file mode 100644 index 0000000000..a09415cd59 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_On_Selected.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Over.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Over.png Binary files differnew file mode 100644 index 0000000000..534c30cddc --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Over.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Press.png Binary files differnew file mode 100644 index 0000000000..a97612ce2f --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected.png Binary files differnew file mode 100644 index 0000000000..a97612ce2f --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected_Disabled.png Binary files differnew file mode 100644 index 0000000000..ca7551a267 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected_Press.png Binary files differnew file mode 100644 index 0000000000..d7e9451f76 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SegmentedBtn_Right_Selected_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Disabled.png Binary files differnew file mode 100644 index 0000000000..5cfa3ae4e1 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Off.png Binary files differnew file mode 100644 index 0000000000..66cdcbeb94 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Press.png Binary files differnew file mode 100644 index 0000000000..0bf8e43e81 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SliderThumb_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SliderTrack_Horiz.png b/indra/newview/skins/contrast_gold/textures/widgets/SliderTrack_Horiz.png Binary files differnew file mode 100644 index 0000000000..720830f83f --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SliderTrack_Horiz.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/SliderTrack_Vert.png b/indra/newview/skins/contrast_gold/textures/widgets/SliderTrack_Vert.png Binary files differnew file mode 100644 index 0000000000..c01db44707 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/SliderTrack_Vert.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Down_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Down_Off.png Binary files differnew file mode 100644 index 0000000000..ff21034095 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Down_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Down_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Down_Press.png Binary files differnew file mode 100644 index 0000000000..7349132503 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Down_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Up_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Up_Off.png Binary files differnew file mode 100644 index 0000000000..133845bdbc --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Up_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Up_Press.png b/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Up_Press.png Binary files differnew file mode 100644 index 0000000000..3dce7733c2 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Stepper_Up_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/TextField_Active.png b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Active.png Binary files differnew file mode 100644 index 0000000000..66c3867b81 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Active.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/TextField_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Disabled.png Binary files differnew file mode 100644 index 0000000000..baf747f581 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/TextField_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Off.png Binary files differnew file mode 100644 index 0000000000..a35562f950 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Active.png b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Active.png Binary files differnew file mode 100644 index 0000000000..572535f1ab --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Active.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Disabled.png b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Disabled.png Binary files differnew file mode 100644 index 0000000000..94b4b158f7 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Disabled.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Highlight.png b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Highlight.png Binary files differnew file mode 100644 index 0000000000..7768da04e8 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Highlight.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Off.png b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Off.png Binary files differnew file mode 100644 index 0000000000..fccd38c807 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/TextField_Search_Off.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/Tooltip.png b/indra/newview/skins/contrast_gold/textures/widgets/Tooltip.png Binary files differnew file mode 100644 index 0000000000..1be53bdaa2 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/Tooltip.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/bevel_background.png b/indra/newview/skins/contrast_gold/textures/widgets/bevel_background.png Binary files differnew file mode 100644 index 0000000000..6304124aec --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/bevel_background.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/buy_off.png b/indra/newview/skins/contrast_gold/textures/widgets/buy_off.png Binary files differnew file mode 100644 index 0000000000..f623b501e2 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/buy_off.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Hemi_Cone_Selected.png b/indra/newview/skins/contrast_gold/textures/widgets/buy_over.png Binary files differindex ae65f1d5e6..25d4173242 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Hemi_Cone_Selected.png +++ b/indra/newview/skins/contrast_gold/textures/widgets/buy_over.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Tube_Selected.png b/indra/newview/skins/contrast_gold/textures/widgets/buy_press.png Binary files differindex 5653f06af1..3195431c84 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Tube_Selected.png +++ b/indra/newview/skins/contrast_gold/textures/widgets/buy_press.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/horizontal_drag_handle.png b/indra/newview/skins/contrast_gold/textures/widgets/horizontal_drag_handle.png Binary files differnew file mode 100644 index 0000000000..631d653968 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/horizontal_drag_handle.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/jump_left_in.png b/indra/newview/skins/contrast_gold/textures/widgets/jump_left_in.png Binary files differnew file mode 100644 index 0000000000..073606628c --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/jump_left_in.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/jump_left_out.png b/indra/newview/skins/contrast_gold/textures/widgets/jump_left_out.png Binary files differnew file mode 100644 index 0000000000..71d5c5c36a --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/jump_left_out.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/jump_right_in.png b/indra/newview/skins/contrast_gold/textures/widgets/jump_right_in.png Binary files differnew file mode 100644 index 0000000000..96f8501932 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/jump_right_in.png diff --git a/indra/newview/skins/contrast_gold/textures/widgets/jump_right_out.png b/indra/newview/skins/contrast_gold/textures/widgets/jump_right_out.png Binary files differnew file mode 100644 index 0000000000..9c02f5f649 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/widgets/jump_right_out.png diff --git a/indra/newview/skins/contrast/textures/widgets/vertical_drag_handle.png b/indra/newview/skins/contrast_gold/textures/widgets/vertical_drag_handle.png Binary files differindex d78e898a9c..d78e898a9c 100644 --- a/indra/newview/skins/contrast/textures/widgets/vertical_drag_handle.png +++ b/indra/newview/skins/contrast_gold/textures/widgets/vertical_drag_handle.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Dragbar.png b/indra/newview/skins/contrast_gold/textures/windows/Dragbar.png Binary files differnew file mode 100644 index 0000000000..3a998abdc3 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Dragbar.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Flyout_Left.png b/indra/newview/skins/contrast_gold/textures/windows/Flyout_Left.png Binary files differnew file mode 100644 index 0000000000..3110d7f6b5 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Flyout_Left.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Flyout_Pointer.png b/indra/newview/skins/contrast_gold/textures/windows/Flyout_Pointer.png Binary files differnew file mode 100644 index 0000000000..4076bb393e --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Flyout_Pointer.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Flyout_Right.png b/indra/newview/skins/contrast_gold/textures/windows/Flyout_Right.png Binary files differnew file mode 100644 index 0000000000..4c55cd6287 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Flyout_Right.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Foreground.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Foreground.png Binary files differnew file mode 100644 index 0000000000..cb516886a2 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Foreground.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Press.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Press.png Binary files differnew file mode 100644 index 0000000000..283981f6ea --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Toast.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Toast.png Binary files differnew file mode 100644 index 0000000000..b08ffbc742 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Close_Toast.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Dock_Foreground.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Dock_Foreground.png Binary files differnew file mode 100644 index 0000000000..7508fcb25e --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Dock_Foreground.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Dock_Press.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Dock_Press.png Binary files differnew file mode 100644 index 0000000000..3f2c560398 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Dock_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear.png Binary files differnew file mode 100644 index 0000000000..7cf85bece4 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Background.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Background.png Binary files differnew file mode 100644 index 0000000000..09d83e62e4 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Background.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Foreground.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Foreground.png Binary files differnew file mode 100644 index 0000000000..fa998eee5d --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Foreground.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Press.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Press.png Binary files differnew file mode 100644 index 0000000000..603fa2f388 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Gear_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Help_Foreground.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Help_Foreground.png Binary files differnew file mode 100644 index 0000000000..1bde4c040a --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Help_Foreground.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Help_Press.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Help_Press.png Binary files differnew file mode 100644 index 0000000000..f3b885283f --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Help_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Minimize_Foreground.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Minimize_Foreground.png Binary files differnew file mode 100644 index 0000000000..942efb40f7 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Minimize_Foreground.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Minimize_Press.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Minimize_Press.png Binary files differnew file mode 100644 index 0000000000..1fe37b7a2e --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Minimize_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Restore_Foreground.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Restore_Foreground.png Binary files differnew file mode 100644 index 0000000000..7840deccb8 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Restore_Foreground.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Restore_Press.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Restore_Press.png Binary files differnew file mode 100644 index 0000000000..33258a0bc5 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Restore_Press.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Icon_Undock_Foreground.png b/indra/newview/skins/contrast_gold/textures/windows/Icon_Undock_Foreground.png Binary files differnew file mode 100644 index 0000000000..df826226e6 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Icon_Undock_Foreground.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Inspector_Background.png b/indra/newview/skins/contrast_gold/textures/windows/Inspector_Background.png Binary files differnew file mode 100644 index 0000000000..3053269b84 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Inspector_Background.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Inspector_Hover.png b/indra/newview/skins/contrast_gold/textures/windows/Inspector_Hover.png Binary files differnew file mode 100644 index 0000000000..0cb846eba0 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Inspector_Hover.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Inspector_I.png b/indra/newview/skins/contrast_gold/textures/windows/Inspector_I.png Binary files differnew file mode 100644 index 0000000000..e5899c55a7 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Inspector_I.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Cylinder_Selected.png b/indra/newview/skins/contrast_gold/textures/windows/Resize_Corner.png Binary files differindex 50bd865cfc..4a533011df 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Cylinder_Selected.png +++ b/indra/newview/skins/contrast_gold/textures/windows/Resize_Corner.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Toast_Background.png b/indra/newview/skins/contrast_gold/textures/windows/Toast_Background.png Binary files differnew file mode 100644 index 0000000000..00676350ca --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Toast_Background.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Toast_CloseBtn.png b/indra/newview/skins/contrast_gold/textures/windows/Toast_CloseBtn.png Binary files differnew file mode 100644 index 0000000000..f37d8d085d --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Toast_CloseBtn.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Toast_Over.png b/indra/newview/skins/contrast_gold/textures/windows/Toast_Over.png Binary files differnew file mode 100644 index 0000000000..5191e0858d --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Toast_Over.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Volume_Background.png b/indra/newview/skins/contrast_gold/textures/windows/Volume_Background.png Binary files differnew file mode 100644 index 0000000000..439e9fd2a1 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Volume_Background.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Wearables_Divider.png b/indra/newview/skins/contrast_gold/textures/windows/Wearables_Divider.png Binary files differnew file mode 100644 index 0000000000..8795ccd661 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Wearables_Divider.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Window_Background.png b/indra/newview/skins/contrast_gold/textures/windows/Window_Background.png Binary files differnew file mode 100644 index 0000000000..1df5943e1b --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Window_Background.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/Window_Foreground.png b/indra/newview/skins/contrast_gold/textures/windows/Window_Foreground.png Binary files differnew file mode 100644 index 0000000000..988ec48eb7 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/Window_Foreground.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/first_login_image.jpg b/indra/newview/skins/contrast_gold/textures/windows/first_login_image.jpg Binary files differnew file mode 100644 index 0000000000..860fed4ac7 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/first_login_image.jpg diff --git a/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_down.png b/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_down.png Binary files differnew file mode 100644 index 0000000000..b449d3be7c --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_down.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_left.png b/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_left.png Binary files differnew file mode 100644 index 0000000000..d93d621067 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_left.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_lower_left.png b/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_lower_left.png Binary files differnew file mode 100644 index 0000000000..5e8def5a5b --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_lower_left.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_right.png b/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_right.png Binary files differnew file mode 100644 index 0000000000..3524487fb3 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_right.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_up.png b/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_up.png Binary files differnew file mode 100644 index 0000000000..aca440d712 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/hint_arrow_up.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/hint_background.png b/indra/newview/skins/contrast_gold/textures/windows/hint_background.png Binary files differnew file mode 100644 index 0000000000..d045bc5e29 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/hint_background.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/login_mp_logo.png b/indra/newview/skins/contrast_gold/textures/windows/login_mp_logo.png Binary files differnew file mode 100644 index 0000000000..7526374ba2 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/login_mp_logo.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/login_mp_logo_small.png b/indra/newview/skins/contrast_gold/textures/windows/login_mp_logo_small.png Binary files differnew file mode 100644 index 0000000000..779d8ff649 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/login_mp_logo_small.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/login_sl_logo.png b/indra/newview/skins/contrast_gold/textures/windows/login_sl_logo.png Binary files differnew file mode 100644 index 0000000000..e4d4eb3ebf --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/login_sl_logo.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/login_sl_logo_small.png b/indra/newview/skins/contrast_gold/textures/windows/login_sl_logo_small.png Binary files differnew file mode 100644 index 0000000000..36fb15de08 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/login_sl_logo_small.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/startup_logo.png b/indra/newview/skins/contrast_gold/textures/windows/startup_logo.png Binary files differnew file mode 100644 index 0000000000..6a81a6451d --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/startup_logo.png diff --git a/indra/newview/skins/contrast_gold/textures/windows/yellow_gradient.png b/indra/newview/skins/contrast_gold/textures/windows/yellow_gradient.png Binary files differnew file mode 100644 index 0000000000..4a07282ecb --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/windows/yellow_gradient.png diff --git a/indra/newview/skins/contrast_gold/textures/world/CameraDragDot.png b/indra/newview/skins/contrast_gold/textures/world/CameraDragDot.png Binary files differnew file mode 100644 index 0000000000..2ccf098e0f --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/world/CameraDragDot.png diff --git a/indra/newview/skins/contrast_gold/textures/world/NoEntryLines.png b/indra/newview/skins/contrast_gold/textures/world/NoEntryLines.png Binary files differnew file mode 100644 index 0000000000..b295ba1281 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/world/NoEntryLines.png diff --git a/indra/newview/skins/contrast_gold/textures/world/NoEntryPassLines.png b/indra/newview/skins/contrast_gold/textures/world/NoEntryPassLines.png Binary files differnew file mode 100644 index 0000000000..34900e2c02 --- /dev/null +++ b/indra/newview/skins/contrast_gold/textures/world/NoEntryPassLines.png diff --git a/indra/newview/skins/contrast_gold/xui/en/panel_progress.xml b/indra/newview/skins/contrast_gold/xui/en/panel_progress.xml new file mode 100644 index 0000000000..7bf851a234 --- /dev/null +++ b/indra/newview/skins/contrast_gold/xui/en/panel_progress.xml @@ -0,0 +1,201 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel + follows="left|bottom|right|top" + height="768" + layout="topleft" + left="0" + name="login_progress_panel" + top="768" + width="1024"> + <layout_stack + follows="left|right|top|bottom" + height="768" + layout="topleft" + left="0" + name="horizontal_centering" + orientation="horizontal" + top="0" + width="1024"> + <layout_panel + layout="topleft" + min_width="10" + name="left" + width="150" /> + <layout_panel + height="768" + layout="topleft" + min_width="670" + name="center" + width="670"> + <layout_stack + follows="left|right|top|bottom" + height="768" + layout="topleft" + left="0" + orientation="vertical" + name="vertical_centering1" + top="0" + width="670"> + <layout_panel + height="200" + layout="topleft" + min_height="10" + name="panel3" + width="670" /> + <layout_panel + auto_resize="false" + height="255" + layout="topleft" + min_height="255" + name="panel4" + width="670"> + <icon + color="LoginProgressBoxCenterColor" + follows="left|right|bottom|top" + image_name="Rounded_Square" + layout="topleft" + left="0" + top="0" + height="255" + width="670" /> + <layout_stack + follows="left|right|top|bottom" + height="255" + layout="topleft" + left="0" + orientation="vertical" + name="vertical_centering2" + animate="false" + top="0" + width="670"> + <layout_panel + auto_resize="false" + height="30" + layout="topleft" + min_height="30" + name="panel_top_spacer" + width="670"> + </layout_panel> + <layout_panel + auto_resize="false" + height="100" + layout="topleft" + min_height="100" + name="panel_login" + width="670"> + <text + follows="left|right|top" + layout="topleft" + font="SansSerifHuge" + font_shadow="none" + halign="left" + height="20" + left="47" + top="32" + right="-47" + name="title_text" + text_color="LoginProgressBoxTextColor"/> + <text + follows="left|right|top" + layout="topleft" + font="SansSerif" + font_shadow="none" + halign="left" + height="20" + top_pad="5" + right="-47" + left_delta="0" + name="progress_text" + text_color="LoginProgressBoxTextColor" + word_wrap="true"/> + <progress_bar + color_bar="0.857 0.668 0.308 0.96" + follows="left|right|top" + layout="topleft" + image_fill="ProgressBarSolid" + height="16" + left="45" + top_pad="5" + name="login_progress_bar" + right="-45" /> + </layout_panel> + <layout_panel + auto_resize="false" + height="90" + layout="topleft" + min_height="90" + name="panel_motd" + width="670"> + <text + follows="left|right|top|bottom" + font="SansSerifLarge" + font_shadow="none" + halign="left" + valign="center" + height="80" + layout="topleft" + left="45" + line_spacing.pixels="2" + name="message_text" + text_color="LoginProgressBoxTextColor" + top="7" + right="-90" + word_wrap="true"/> + </layout_panel> + <layout_panel + auto_resize="false" + height="40" + layout="topleft" + min_height="40" + name="panel_icons" + width="670"> + <!--Logos are tied to following label from code--> + <text + follows="left|right|top" + layout="topleft" + font="SansSerifLarge" + font_shadow="none" + halign="left" + height="16" + width="240" + left="47" + top="6" + line_spacing.pixels="2" + name="logos_lbl" + text_color="LoginProgressBoxTextColor"> + Megapahit uses + </text> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel + height="200" + layout="topleft" + min_width="10" + name="panel5" + width="670" /> + </layout_stack> + </layout_panel> + <layout_panel + layout="topleft" + min_width="10" + name="right" + width="150" /> + </layout_stack> + <button + follows="right|bottom" + height="22" + layout="topleft" + left="-106" + name="cancel_btn" + top="700" + width="90" /> + <web_browser + follows="all" + layout="topleft" + left="0" + name="login_media_panel" + width="1024" + height="768" + top="0"/> +</panel> diff --git a/indra/newview/skins/contrast_gold/xui/en/widgets/progress_bar.xml b/indra/newview/skins/contrast_gold/xui/en/widgets/progress_bar.xml new file mode 100644 index 0000000000..e55950dd33 --- /dev/null +++ b/indra/newview/skins/contrast_gold/xui/en/widgets/progress_bar.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<progress_bar image_bar="ProgressTrack" + image_fill="ProgressBar" + color_bar.red="0,664" + color_bar.green="0,467" + color_bar.blue="0,156" + color_bar.alpha="1" + color_bg.red="0,664" + color_bg.green="0,467" + color_bg.blue="0,156" + color_bg.alpha="1" + /> diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 5c2206a3b1..699b727212 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -458,6 +458,9 @@ name="InventoryBackgroundColor" reference="DkGray2" /> <color + name="InventoryFavoriteColor" + reference="Yellow" /> + <color name="InventoryFocusOutlineColor" reference="White_25" /> <color @@ -590,7 +593,7 @@ --> <color name="NameTagBackground" - value="0 0 0 1" /> + value="0.101 0.101 0.101 0.6" /> <color name="NameTagChat" reference="White" /> @@ -763,6 +766,12 @@ name="SelectedOutfitTextColor" reference="EmphasisColor" /> <color + name="SearchableControlHighlightFontColor" + value="1 0 0 1" /> + <color + name="SearchableControlHighlightBgColor" + value="0.5 0.1 0.1 1" /> + <color name="SilhouetteChildColor" value="0.13 0.42 0.77 1" /> <color @@ -998,4 +1007,16 @@ <color name="OutfitSnapshotMacMask2" value="0.1 0.1 0.1 1"/> + <color + name="ChatMentionFont" + value="0.3 0.82 1 1" /> + <color + name="ChatMentionHighlight" + value="0.82 0.91 0.98 0.15" /> + <color + name="ChatSelfMentionHighlight" + value="1 1 0 0.35" /> + <color + name="MentionFlashBgColor" + value="1 1 0 0.5" /> </colors> diff --git a/indra/newview/skins/default/textures/3p_icons/fmod_logo.png b/indra/newview/skins/default/textures/3p_icons/fmod_logo.png Binary files differnew file mode 100644 index 0000000000..5a50e0ad34 --- /dev/null +++ b/indra/newview/skins/default/textures/3p_icons/fmod_logo.png diff --git a/indra/newview/skins/default/textures/3p_icons/havok_logo.png b/indra/newview/skins/default/textures/3p_icons/havok_logo.png Binary files differnew file mode 100644 index 0000000000..ff1ea3a72e --- /dev/null +++ b/indra/newview/skins/default/textures/3p_icons/havok_logo.png diff --git a/indra/newview/skins/default/textures/cloud-particle.j2c b/indra/newview/skins/default/textures/cloud-particle.j2c Binary files differdeleted file mode 100644 index 6c03bf6d05..0000000000 --- a/indra/newview/skins/default/textures/cloud-particle.j2c +++ /dev/null diff --git a/indra/newview/skins/default/textures/cloud-particle.png b/indra/newview/skins/default/textures/cloud-particle.png Binary files differnew file mode 100644 index 0000000000..f2080ddb9f --- /dev/null +++ b/indra/newview/skins/default/textures/cloud-particle.png diff --git a/indra/newview/skins/default/textures/icon_auction.tga b/indra/newview/skins/default/textures/icon_auction.tga Binary files differindex baf7d0d000..d121833b47 100644 --- a/indra/newview/skins/default/textures/icon_auction.tga +++ b/indra/newview/skins/default/textures/icon_auction.tga diff --git a/indra/newview/skins/contrast/textures/icon_legacy_event.tga b/indra/newview/skins/default/textures/icon_event.tga Binary files differindex 7805dbce60..7805dbce60 100644 --- a/indra/newview/skins/contrast/textures/icon_legacy_event.tga +++ b/indra/newview/skins/default/textures/icon_event.tga diff --git a/indra/newview/skins/contrast/textures/icon_legacy_event_adult.tga b/indra/newview/skins/default/textures/icon_event_adult.tga Binary files differindex c344fb1e78..c344fb1e78 100644 --- a/indra/newview/skins/contrast/textures/icon_legacy_event_adult.tga +++ b/indra/newview/skins/default/textures/icon_event_adult.tga diff --git a/indra/newview/skins/contrast/textures/icon_legacy_event_mature.tga b/indra/newview/skins/default/textures/icon_event_mature.tga Binary files differindex 61c879bc92..61c879bc92 100644 --- a/indra/newview/skins/contrast/textures/icon_legacy_event_mature.tga +++ b/indra/newview/skins/default/textures/icon_event_mature.tga diff --git a/indra/newview/skins/default/textures/icon_group.tga b/indra/newview/skins/default/textures/icon_group.tga Binary files differdeleted file mode 100644 index 79cd71689d..0000000000 --- a/indra/newview/skins/default/textures/icon_group.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/icon_place.tga b/indra/newview/skins/default/textures/icon_place.tga Binary files differindex e10655c6ec..2170c98499 100644 --- a/indra/newview/skins/default/textures/icon_place.tga +++ b/indra/newview/skins/default/textures/icon_place.tga diff --git a/indra/newview/skins/default/textures/icons/Icon_Pointer.png b/indra/newview/skins/default/textures/icons/Icon_Pointer.png Binary files differnew file mode 100644 index 0000000000..021942a8aa --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Icon_Pointer.png diff --git a/indra/newview/skins/default/textures/icons/Inv_Favorite_Star_Content.png b/indra/newview/skins/default/textures/icons/Inv_Favorite_Star_Content.png Binary files differnew file mode 100644 index 0000000000..b71b202234 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Inv_Favorite_Star_Content.png diff --git a/indra/newview/skins/default/textures/icons/Inv_Favorite_Star_Full.png b/indra/newview/skins/default/textures/icons/Inv_Favorite_Star_Full.png Binary files differnew file mode 100644 index 0000000000..7d55fb5cfe --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Inv_Favorite_Star_Full.png diff --git a/indra/newview/skins/default/textures/icons/MP_Logo.png b/indra/newview/skins/default/textures/icons/MP_Logo.png Binary files differindex e33a830d3b..6aba54189f 100644 --- a/indra/newview/skins/default/textures/icons/MP_Logo.png +++ b/indra/newview/skins/default/textures/icons/MP_Logo.png diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_1.png b/indra/newview/skins/default/textures/icons/ProgressLarge_1.png Binary files differdeleted file mode 100644 index ff277fc431..0000000000 --- a/indra/newview/skins/default/textures/icons/ProgressLarge_1.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_10.png b/indra/newview/skins/default/textures/icons/ProgressLarge_10.png Binary files differdeleted file mode 100644 index 1c94e21d89..0000000000 --- a/indra/newview/skins/default/textures/icons/ProgressLarge_10.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_11.png b/indra/newview/skins/default/textures/icons/ProgressLarge_11.png Binary files differdeleted file mode 100644 index 89bea9b474..0000000000 --- a/indra/newview/skins/default/textures/icons/ProgressLarge_11.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_12.png b/indra/newview/skins/default/textures/icons/ProgressLarge_12.png Binary files differdeleted file mode 100644 index da38475ba4..0000000000 --- a/indra/newview/skins/default/textures/icons/ProgressLarge_12.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_2.png b/indra/newview/skins/default/textures/icons/ProgressLarge_2.png Binary files differdeleted file mode 100644 index c024275ebe..0000000000 --- a/indra/newview/skins/default/textures/icons/ProgressLarge_2.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_3.png b/indra/newview/skins/default/textures/icons/ProgressLarge_3.png Binary files differdeleted file mode 100644 index 87b931e72e..0000000000 --- a/indra/newview/skins/default/textures/icons/ProgressLarge_3.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_4.png b/indra/newview/skins/default/textures/icons/ProgressLarge_4.png Binary files differdeleted file mode 100644 index 6dbef74361..0000000000 --- a/indra/newview/skins/default/textures/icons/ProgressLarge_4.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_5.png b/indra/newview/skins/default/textures/icons/ProgressLarge_5.png Binary files differdeleted file mode 100644 index daccf9b375..0000000000 --- a/indra/newview/skins/default/textures/icons/ProgressLarge_5.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_6.png b/indra/newview/skins/default/textures/icons/ProgressLarge_6.png Binary files differdeleted file mode 100644 index cafddcb88d..0000000000 --- a/indra/newview/skins/default/textures/icons/ProgressLarge_6.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_7.png b/indra/newview/skins/default/textures/icons/ProgressLarge_7.png Binary files differdeleted file mode 100644 index 8acf6472d4..0000000000 --- a/indra/newview/skins/default/textures/icons/ProgressLarge_7.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_9.png b/indra/newview/skins/default/textures/icons/ProgressLarge_9.png Binary files differdeleted file mode 100644 index 293a7b8f5c..0000000000 --- a/indra/newview/skins/default/textures/icons/ProgressLarge_9.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/SL_Logo.png b/indra/newview/skins/default/textures/icons/SL_Logo.png Binary files differindex 943265e240..5e376c72f9 100644 --- a/indra/newview/skins/default/textures/icons/SL_Logo.png +++ b/indra/newview/skins/default/textures/icons/SL_Logo.png diff --git a/indra/newview/skins/default/textures/icons/hand.png b/indra/newview/skins/default/textures/icons/hand.png Binary files differindex 3f497eefbb..5fbdb70c2b 100644 --- a/indra/newview/skins/default/textures/icons/hand.png +++ b/indra/newview/skins/default/textures/icons/hand.png diff --git a/indra/newview/skins/default/textures/megapahit/fps_button.png b/indra/newview/skins/default/textures/megapahit/fps_button.png Binary files differnew file mode 100644 index 0000000000..fa436a620d --- /dev/null +++ b/indra/newview/skins/default/textures/megapahit/fps_button.png diff --git a/indra/newview/skins/default/textures/megapahit/mp_blue_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_blue_bullet.png Binary files differnew file mode 100644 index 0000000000..1a27570786 --- /dev/null +++ b/indra/newview/skins/default/textures/megapahit/mp_blue_bullet.png diff --git a/indra/newview/skins/default/textures/megapahit/mp_green_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_green_bullet.png Binary files differnew file mode 100644 index 0000000000..f4c28e4bc9 --- /dev/null +++ b/indra/newview/skins/default/textures/megapahit/mp_green_bullet.png diff --git a/indra/newview/skins/default/textures/megapahit/mp_help_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_help_bullet.png Binary files differnew file mode 100644 index 0000000000..64c8933a78 --- /dev/null +++ b/indra/newview/skins/default/textures/megapahit/mp_help_bullet.png diff --git a/indra/newview/skins/default/textures/megapahit/mp_info_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_info_bullet.png Binary files differnew file mode 100644 index 0000000000..c90767b9ac --- /dev/null +++ b/indra/newview/skins/default/textures/megapahit/mp_info_bullet.png diff --git a/indra/newview/skins/default/textures/megapahit/mp_red_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_red_bullet.png Binary files differnew file mode 100644 index 0000000000..aeaa52b53b --- /dev/null +++ b/indra/newview/skins/default/textures/megapahit/mp_red_bullet.png diff --git a/indra/newview/skins/default/textures/megapahit/mp_yellow_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_yellow_bullet.png Binary files differnew file mode 100644 index 0000000000..026fbaf56d --- /dev/null +++ b/indra/newview/skins/default/textures/megapahit/mp_yellow_bullet.png diff --git a/indra/newview/skins/default/textures/navbar/Info_Off.png b/indra/newview/skins/default/textures/navbar/Info_Off.png Binary files differindex 64722255a3..6399cd6715 100644 --- a/indra/newview/skins/default/textures/navbar/Info_Off.png +++ b/indra/newview/skins/default/textures/navbar/Info_Off.png diff --git a/indra/newview/skins/default/textures/navbar/Info_Over.png b/indra/newview/skins/default/textures/navbar/Info_Over.png Binary files differindex 84f1d03129..a296d2014f 100644 --- a/indra/newview/skins/default/textures/navbar/Info_Over.png +++ b/indra/newview/skins/default/textures/navbar/Info_Over.png diff --git a/indra/newview/skins/default/textures/navbar/Info_Press.png b/indra/newview/skins/default/textures/navbar/Info_Press.png Binary files differindex 169105829e..2afc4a9143 100644 --- a/indra/newview/skins/default/textures/navbar/Info_Press.png +++ b/indra/newview/skins/default/textures/navbar/Info_Press.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index f824816183..a8fc8faa44 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -87,7 +87,7 @@ with the same filename but different name <texture name="BreadCrumbBtn_Left_Off" file_name="widgets/BreadCrumbBtn_Left_Off.png" preload="false"/> <texture name="BreadCrumbBtn_Left_Over" file_name="widgets/BreadCrumbBtn_Left_Over.png" preload="false"/> <texture name="BreadCrumbBtn_Left_Press" file_name="widgets/BreadCrumbBtn_Left_Press.png" preload="false"/> - + <texture name="BreadCrumbBtn_Middle_Disabled" file_name="widgets/BreadCrumbBtn_Middle_Disabled.png" preload="false"/> <texture name="BreadCrumbBtn_Middle_Off" file_name="widgets/BreadCrumbBtn_Middle_Off.png" preload="false"/> <texture name="BreadCrumbBtn_Middle_Over" file_name="widgets/BreadCrumbBtn_Middle_Over.png" preload="false"/> @@ -194,7 +194,7 @@ with the same filename but different name <texture name="Copy" file_name="icons/Copy.png" preload="false" /> <texture name="CopyBright" file_name="icons/CopyBright.png" preload="false" /> - + <texture name="DisclosureArrow_Opened_Off" file_name="widgets/DisclosureArrow_Opened_Off.png" preload="true" /> <texture name="ChatBarHandle" file_name="bottomtray/ChatBarHandle.png" preload="false" /> @@ -246,7 +246,7 @@ with the same filename but different name <texture name="Group_Notices" file_name="icons/Group_Notices.png" preload="false" /> <texture name="Hand" file_name="icons/hand.png" preload="false" /> - + <texture name="Help_Press" file_name="navbar/Help_Press.png" preload="false" /> <texture name="Hierarchy_View_Disabled" file_name="icons/Hierarchy_View_Disabled.png" preload="false" /> @@ -259,16 +259,16 @@ with the same filename but different name <texture name="Icon_Close_Foreground" file_name="windows/Icon_Close_Foreground.png" preload="true" /> <texture name="Icon_Close_Press" file_name="windows/Icon_Close_Press.png" preload="true" /> <texture name="Icon_Close_Toast" file_name="windows/Icon_Close_Toast.png" preload="true" /> - + <texture name="Icon_Copy" file_name="icons/copy_clipboard.png" preload="true" /> - + <texture name="Icon_Delete" file_name="icons/delete_icon.png" preload="true" /> <texture name="Icon_Dock_Foreground" file_name="windows/Icon_Dock_Foreground.png" preload="true" /> <texture name="Icon_Dock_Press" file_name="windows/Icon_Dock_Press.png" preload="true" /> <texture name="Icon_File_Upload" file_name="icons/file_upload.png" preload="true" /> - + <texture name="Icon_For_Sale" file_name="icons/Icon_For_Sale.png" preload="false" /> <texture name="Icon_Gear_Background" file_name="windows/Icon_Gear_Background.png" preload="false" /> @@ -281,14 +281,14 @@ with the same filename but different name <texture name="Icon_Minimize_Foreground" file_name="windows/Icon_Minimize_Foreground.png" preload="true" /> <texture name="Icon_Minimize_Press" file_name="windows/Icon_Minimize_Press.png" preload="true" /> - + <texture name="Icon_Paste" file_name="icons/paste_clipboard.png" preload="true" /> <texture name="Icon_Restore_Foreground" file_name="windows/Icon_Restore_Foreground.png" preload="false" /> <texture name="Icon_Restore_Press" file_name="windows/Icon_Restore_Press.png" preload="false" /> <texture name="Icon_Snapshot" file_name="icons/snapshot_icon.png" preload="true" /> - + <texture name="Icon_Use_Texture" file_name="icons/texture_icon.png" preload="true" /> <texture name="Info" file_name="icons/Info.png" preload="false" /> @@ -308,6 +308,8 @@ with the same filename but different name <texture name="Inv_CallingCard" file_name="icons/Inv_CallingCard.png" preload="false" /> <texture name="Inv_Clothing" file_name="icons/Inv_Clothing.png" preload="false" /> <texture name="Inv_Eye" file_name="icons/Inv_Eye.png" preload="false" /> + <texture name="Inv_Favorite_Star_Content" file_name="icons/Inv_Favorite_Star_Content.png" preload="false" /> + <texture name="Inv_Favorite_Star_Full" file_name="icons/Inv_Favorite_Star_Full.png" preload="false" /> <texture name="Inv_FolderClosed" file_name="icons/Inv_FolderClosed.png" preload="false" /> <texture name="Inv_FolderOpen" file_name="icons/Inv_FolderOpen.png" preload="false" /> <texture name="Inv_Gesture" file_name="icons/Inv_Gesture.png" preload="false" /> @@ -322,7 +324,7 @@ with the same filename but different name <texture name="Inv_LostOpen" file_name="icons/Inv_LostOpen.png" preload="false" /> <texture name="Inv_Landmark" file_name="icons/Inv_Landmark.png" preload="false" /> <texture name="Inv_Material" file_name="icons/Inv_Material.png" preload="false" /> - <texture name="Inv_Mesh" file_name="icons/Inv_Mesh.png" preload="false" /> + <texture name="Inv_Mesh" file_name="icons/Inv_Mesh.png" preload="false" /> <texture name="Inv_Notecard" file_name="icons/Inv_Notecard.png" preload="false" /> <texture name="Inv_Object" file_name="icons/Inv_Object.png" preload="false" /> <texture name="Inv_Object_Multi" file_name="icons/Inv_Object_Multi.png" preload="false" /> @@ -377,7 +379,7 @@ with the same filename but different name <texture name="Locked_Icon" file_name="icons/Locked_Icon.png" preload="false" /> <texture name="Map_Placeholder_Icon" file_name="icons/map_placeholder.png" preload="true" /> - + <texture name="Marketplace_Dropzone_Background" file_name="widgets/Marketplace_Dropzone_Background.png" preload="true" /> <texture name="MarketplaceBtn_Off" file_name="widgets/MarketplaceBtn_Off.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" /> <texture name="MarketplaceBtn_Selected" file_name="widgets/MarketplaceBtn_Selected.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" /> @@ -393,7 +395,7 @@ with the same filename but different name <texture name="ModelImport_Status_Good" file_name="green_checkmark.png" preload="false"/> <texture name="ModelImport_Status_Warning" file_name="lag_status_warning.tga" preload="false"/> <texture name="ModelImport_Status_Error" file_name="red_x.png" preload="false"/> - + <texture name="MouseLook_View_Off" file_name="bottomtray/Mouselook_View_Off.png" preload="false" /> <texture name="MouseLook_View_On" file_name="bottomtray/Mouselook_View_On.png" preload="false" /> @@ -549,7 +551,7 @@ with the same filename but different name <texture name="Profile_Perm_Objects_Enabled" file_name="icons/Profile_Perm_Objects_Enabled.png" preload="true"/> <texture name="Profile_Perm_Online_Disabled" file_name="icons/Profile_Perm_Online_Disabled.png" preload="true"/> <texture name="Profile_Perm_Online_Enabled" file_name="icons/Profile_Perm_Online_Enabled.png" preload="true"/> - + <texture name="ProgressBar" file_name="widgets/ProgressBar.png" preload="true" scale.left="4" scale.top="11" scale.right="48" scale.bottom="3" /> <texture name="ProgressBarSolid" file_name="widgets/ProgressBarSolid.png" preload="true" scale.left="4" scale.top="11" scale.right="48" scale.bottom="3" /> <texture name="ProgressTrack" file_name="widgets/ProgressTrack.png" preload="true" scale.left="4" scale.top="13" scale.right="148" scale.bottom="2" /> @@ -742,7 +744,7 @@ with the same filename but different name <texture name="UpArrow_Off" file_name="icons/UpArrow_Off.png" preload="false" /> <texture name="Video_URL_Off" file_name="icons/Video_URL_Off.png" preload="true" /> - + <texture name="Vertical Drag Handle" file_name="widgets/vertical_drag_handle.png" scale.left="2" scale.right="7" scale.bottom="8" scale.top="120" scale_type="scale_outer"/> <texture name="VirtualTrackball_Moon_Back" file_name="widgets/track_control_moon_back.png" /> @@ -758,7 +760,7 @@ with the same filename but different name <texture name="VirtualTrackball_Sphere" file_name="widgets/track_control_sphere.png" /> <texture name="VirtualTrackball_Sun_Back" file_name="widgets/track_control_sun_back.png" /> <texture name="VirtualTrackball_Sun_Front" file_name="widgets/track_control_sun_front.png" /> - + <texture name="Volume_Background" file_name="windows/Volume_Background.png" preload="false" scale.left="6" scale.top="33" scale.right="63" scale.bottom="10" /> @@ -767,7 +769,7 @@ with the same filename but different name <texture name="VoicePTT_Lvl3" file_name="bottomtray/VoicePTT_Lvl3.png" preload="false" /> <texture name="VoicePTT_Off" file_name="bottomtray/VoicePTT_Off.png" preload="false" /> <texture name="VoicePTT_On" file_name="bottomtray/VoicePTT_On.png" preload="false" /> - + <texture name="Wearables_Divider" file_name="windows/Wearables_Divider.png" preload="false" /> <texture name="Add_Icon" file_name="icons/add_icon.png" preload="false" /> @@ -796,7 +798,7 @@ with the same filename but different name <texture name="script_error.j2c" use_mips="true" /> <texture name="silhouette.j2c" use_mips="true" /> <texture name="foot_shadow.j2c" use_mips="true" /> - <texture name="cloud-particle.j2c" use_mips="true" /> + <texture name="cloud-particle.png" use_mips="true" /> <texture name="transparent.j2c" use_mips="true" /> <!--WARNING OLD ART BELOW *do not use*--> @@ -837,8 +839,14 @@ with the same filename but different name <texture name="icon_avatar_online.tga" /> <texture name="icon_diurnal.tga" /> <texture name="icon_for_sale.tga" file_name="icons/Icon_For_Sale.png" /> + <texture name="icon_auction.tga"/> + <texture name="icon_place.tga"/> <texture name="icon_top_pick.tga" /> + <texture name="icon_event.tga"/> + <texture name="icon_event_adult.tga"/> + <texture name="icon_event_mature.tga" /> + <texture name="lag_status_critical.tga" /> <texture name="lag_status_good.tga" /> <texture name="lag_status_warning.tga" /> @@ -882,7 +890,7 @@ with the same filename but different name <texture name="buy_off" file_name="widgets/buy_off.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/> <texture name="buy_over" file_name="widgets/buy_over.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/> <texture name="buy_press" file_name="widgets/buy_press.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/> - + <texture name="hint_background" file_name="windows/hint_background.png" preload="false" scale.left="8" scale.top="70" scale.right="195" scale.bottom="11"/> <texture name="hint_arrow_left" file_name="windows/hint_arrow_left.png" preload="false"/> <texture name="hint_arrow_right" file_name="windows/hint_arrow_right.png" preload="false"/> @@ -909,26 +917,15 @@ with the same filename but different name <texture name="Single_Folder_Up" file_name="icons/single_folder_up.png" preload="true"/> <texture name="Icon_Color_Palette" file_name="icons/Icon_Color_Palette.png" preload="false"/> <texture name="Icon_Font_Size" file_name="icons/Icon_Font_Size.png" preload="false"/> + <texture name="Icon_Pointer" file_name="icons/Icon_Pointer.png" preload="false"/> - <texture name="Icon_Place" file_name="megapahit/icon_place.png" preload="false" /> - <texture name="Icon_Auction" file_name="megapahit/icon_land_auction.png" preload="false" /> - <texture name="Icon_For_Sale" file_name="megapahit/icon_land_forsale.png" preload="false" /> - <texture name="Icon_Group" file_name="megapahit/icon_group.png" preload="false" /> - <texture name="Icon_Legacy_Event_PG" file_name="icons/Parcel_PG_Dark.png" preload="false" /> - <texture name="Icon_Legacy_Event_Mature" file_name="icons/Parcel_M_Dark.png" preload="false" /> - <texture name="Icon_Legacy_Event_Adult" file_name="icons/Parcel_R_Dark.png" preload="false" /> + <texture name="mp_fpsButton" file_name="megapahit/fps_button.png" preload="false" /> - <texture name="ProgressLarge_1" file_name="icons/ProgressLarge_1.png" preload="true" /> - <texture name="ProgressLarge_2" file_name="icons/ProgressLarge_2.png" preload="true" /> - <texture name="ProgressLarge_3" file_name="icons/ProgressLarge_3.png" preload="true" /> - <texture name="ProgressLarge_4" file_name="icons/ProgressLarge_4.png" preload="true" /> - <texture name="ProgressLarge_5" file_name="icons/ProgressLarge_5.png" preload="true" /> - <texture name="ProgressLarge_6" file_name="icons/ProgressLarge_6.png" preload="true" /> - <texture name="ProgressLarge_7" file_name="icons/ProgressLarge_7.png" preload="true" /> - <texture name="ProgressLarge_8" file_name="icons/ProgressLarge_8.png" preload="true" /> - <texture name="ProgressLarge_9" file_name="icons/ProgressLarge_9.png" preload="true" /> - <texture name="ProgressLarge_10" file_name="icons/ProgressLarge_10.png" preload="true" /> - <texture name="ProgressLarge_11" file_name="icons/ProgressLarge_11.png" preload="true" /> - <texture name="ProgressLarge_12" file_name="icons/ProgressLarge_12.png" preload="true" /> + <texture name="mp_red_bullet" file_name="megapahit/mp_red_bullet.png" preload="false" /> + <texture name="mp_yellow_bullet" file_name="megapahit/mp_yellow_bullet.png" preload="false" /> + <texture name="mp_green_bullet" file_name="megapahit/mp_green_bullet.png" preload="false" /> + <texture name="mp_blue_bullet" file_name="megapahit/mp_blue_bullet.png" preload="false" /> + <texture name="mp_help_bullet" file_name="megapahit/mp_help_bullet.png" preload="false" /> + <texture name="mp_info_bullet" file_name="megapahit/mp_info_bullet.png" preload="false" /> </textures> diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Off.png b/indra/newview/skins/default/textures/widgets/ComboButton_Off.png Binary files differindex 4f573cf6fa..8c315a9d25 100644 --- a/indra/newview/skins/default/textures/widgets/ComboButton_Off.png +++ b/indra/newview/skins/default/textures/widgets/ComboButton_Off.png diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png b/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png Binary files differindex 5a067aca7c..34edea9421 100644 --- a/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png +++ b/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Disabled.png Binary files differindex ba63751690..ef50fb5d51 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Disabled.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Disabled.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Off.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Off.png Binary files differindex 1a9f7e9d71..191dbf08fc 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Off.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Off.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Over.png Binary files differindex e4fcf491ba..d5882bce85 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Over.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Over.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Press.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Press.png Binary files differindex dbe6651dc8..ddaab1cfcd 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Press.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Press.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected.png Binary files differindex dbe6651dc8..c8634b1294 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Disabled.png Binary files differindex b78f2bc62e..465ce8d7da 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Disabled.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Disabled.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Over.png Binary files differindex f2abcb3ce0..9ff1e05a52 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Over.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Over.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Press.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Press.png Binary files differindex 9a14e7c69d..4775dab43b 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Press.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_Selected_Press.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Disabled.png Binary files differindex d9f05d33ec..65d082b993 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Disabled.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Disabled.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected.png Binary files differindex d2342f6538..12f55c599e 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png Binary files differindex 7b612ade9c..6a023156c5 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Press.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Press.png Binary files differindex eb08fed30e..457644e69a 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Press.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Press.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Disabled.png Binary files differindex ecd2144d6d..ccea8fc784 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Disabled.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Disabled.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Off.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Off.png Binary files differindex 1901d5e843..f90ede3b71 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Off.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Off.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Selected.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Selected.png Binary files differindex ffcb2772e0..524d3b6bfd 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Selected.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Selected.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Over.png Binary files differindex 534c30cddc..cadcec085a 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Over.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Over.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Press.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Press.png Binary files differindex a97612ce2f..889d06a690 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Press.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Press.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected.png Binary files differindex a97612ce2f..aa3906d236 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Disabled.png Binary files differindex d8f02b3730..255fd1c415 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Disabled.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Disabled.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Press.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Press.png Binary files differindex 3d93e5e73b..a69d0b525f 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Press.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Press.png diff --git a/indra/newview/skins/default/textures/widgets/Stepper_Down_Press.png b/indra/newview/skins/default/textures/widgets/Stepper_Down_Press.png Binary files differindex edd485afed..e888e1e045 100644 --- a/indra/newview/skins/default/textures/widgets/Stepper_Down_Press.png +++ b/indra/newview/skins/default/textures/widgets/Stepper_Down_Press.png diff --git a/indra/newview/skins/default/textures/windows/first_login_image.jpg b/indra/newview/skins/default/textures/windows/first_login_image.jpg Binary files differindex 860fed4ac7..30f31341ed 100644 --- a/indra/newview/skins/default/textures/windows/first_login_image.jpg +++ b/indra/newview/skins/default/textures/windows/first_login_image.jpg diff --git a/indra/newview/skins/default/xui/da/floater_about.xml b/indra/newview/skins/default/xui/da/floater_about.xml index 604eb7c58f..4ea34975e1 100644 --- a/indra/newview/skins/default/xui/da/floater_about.xml +++ b/indra/newview/skins/default/xui/da/floater_about.xml @@ -5,7 +5,7 @@ [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] </floater.string> <floater.string name="AboutPosition"> - Du er ved [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] i regionen [REGION] lokaliseret ved <nolink>[HOSTNAME]</nolink> ([HOSTIP]) + Du er ved [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] i regionen [REGION] lokaliseret ved <nolink>[HOSTNAME]</nolink> [SERVER_VERSION] [SERVER_RELEASE_NOTES_URL] </floater.string> diff --git a/indra/newview/skins/default/xui/da/floater_avatar_textures.xml b/indra/newview/skins/default/xui/da/floater_avatar_textures.xml index d0d766eaab..e7fe66c73f 100644 --- a/indra/newview/skins/default/xui/da/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/da/floater_avatar_textures.xml @@ -14,7 +14,7 @@ teksturer teksturer </text> <button label="Vis IDs pÃ¥ skærm" label_selected="Dump" name="Dump"/> - <panel name="scroll_content_panel"> + <panel name="scroll_content_panel2"> <texture_picker label="HÃ¥r" name="hair-baked"/> <texture_picker label="HÃ¥r" name="hair_grain"/> <texture_picker label="Alpha - hÃ¥r" name="hair_alpha"/> diff --git a/indra/newview/skins/default/xui/da/floater_search.xml b/indra/newview/skins/default/xui/da/floater_search.xml deleted file mode 100644 index 80a30b1aa1..0000000000 --- a/indra/newview/skins/default/xui/da/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title="FIND"> - <floater.string name="loading_text"> - Henter... - </floater.string> - <floater.string name="done_text"> - Færdig - </floater.string> - <layout_stack name="stack1"> - <layout_panel name="browser_layout"> - <text name="refresh_search"> - Gentag søgning med "God level" - </text> - </layout_panel> - </layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/da/panel_status_bar.xml b/indra/newview/skins/default/xui/da/panel_status_bar.xml index 6e7bdfc188..a976c3f17a 100644 --- a/indra/newview/skins/default/xui/da/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/da/panel_status_bar.xml @@ -12,7 +12,7 @@ <panel.string name="bandwidth_tooltip"> BÃ¥ndbredde </panel.string> - <panel.string name="time"> + <panel.string name="time_ampm"> [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] </panel.string> <panel.string name="timeTooltip"> diff --git a/indra/newview/skins/default/xui/da/sidepanel_item_info.xml b/indra/newview/skins/default/xui/da/sidepanel_item_info.xml index d52845160b..e5ad86b315 100644 --- a/indra/newview/skins/default/xui/da/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/da/sidepanel_item_info.xml @@ -15,6 +15,9 @@ <panel.string name="acquiredDate"> [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] </panel.string> + <panel.string name="acquiredDateAMPM"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour12,datetime,local]:[min,datetime,local]:[second,datetime,local] [ampm,datetime,local] [year,datetime,local] + </panel.string> <panel.string name="origin_inventory"> (Beholdning) </panel.string> diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml index a7dff91311..18fbd92292 100644 --- a/indra/newview/skins/default/xui/da/strings.xml +++ b/indra/newview/skins/default/xui/da/strings.xml @@ -1,8 +1,4 @@ <?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"> MEGAPAHIT @@ -554,9 +550,9 @@ Prøv venligst om lidt igen. <string name="mesh"> mesh </string> - <string name="settings"> - indstillinger - </string> + <string name="settings"> + indstillinger + </string> <string name="AvatarEditingAppearance"> (Redigering Udseende) </string> @@ -819,10 +815,10 @@ Prøv venligst om lidt igen. Du vil nu blive dirigeret til lokal stemme chat </string> <string name="ScriptQuestionCautionChatGranted"> - '[OBJECTNAME]', en genstand, ejet af '[OWNERNAME]', lokaliseret i [REGIONNAME] pÃ¥ [REGIONPOS], har fÃ¥et tilladelse til: [PERMISSIONS]. + '[OBJECTNAME]', en genstand, ejet af '[OWNERNAME]', lokaliseret i [REGIONNAME] pÃ¥ [REGIONPOS], har fÃ¥et tilladelse til: [PERMISSIONS]. </string> <string name="ScriptQuestionCautionChatDenied"> - '[OBJECTNAME]', en genstand, ejet af '[OWNERNAME]', lokaliseret i [REGIONNAME] pÃ¥ [REGIONPOS], er afvist tilladelse til: [PERMISSIONS]. + '[OBJECTNAME]', en genstand, ejet af '[OWNERNAME]', lokaliseret i [REGIONNAME] pÃ¥ [REGIONPOS], er afvist tilladelse til: [PERMISSIONS]. </string> <string name="ScriptTakeMoney"> Tag Linden dollars (L$) fra dig @@ -933,16 +929,16 @@ Prøv venligst om lidt igen. Vælg bibliotek </string> <string name="AvatarSetNotAway"> - Sæt "til stede" + Sæt "til stede" </string> <string name="AvatarSetAway"> - Sæt "væk" + Sæt "væk" </string> <string name="AvatarSetNotBusy"> - Sæt "ledig" + Sæt "ledig" </string> <string name="AvatarSetBusy"> - Sæt "optaget" + Sæt "optaget" </string> <string name="shape"> Form @@ -1169,8 +1165,10 @@ Prøv venligst om lidt igen. <string name="InventoryNoTexture"> Du har ikke en kopi af denne tekstur i din beholdning </string> - <string name="Unconstrained">Ikke lÃ¥st</string> - <string name="no_transfer" value=" (ikke overdragbar)"/> + <string name="Unconstrained"> + Ikke lÃ¥st + </string> + <string name="no_transfer" value=" (ikke overdragbar)"/> <string name="no_modify" value=" (ikke redigere)"/> <string name="no_copy" value=" (ikke kopiere)"/> <string name="worn" value=" (bÃ¥ret)"/> @@ -1568,16 +1566,16 @@ Prøv venligst om lidt igen. nulstil </string> <string name="RunQueueTitle"> - Sæt "running" fremskridt + Sæt "running" fremskridt </string> <string name="RunQueueStart"> - sæt til "running" + sæt til "running" </string> <string name="NotRunQueueTitle"> - Sæt "Not Running" fremskridt + Sæt "Not Running" fremskridt </string> <string name="NotRunQueueStart"> - sæt til "not running" + sæt til "not running" </string> <string name="CompileSuccessful"> Kompleret uden fejl! @@ -1589,7 +1587,7 @@ Prøv venligst om lidt igen. Gemt. </string> <string name="ObjectOutOfRange"> - Script ("object out of range") + Script ("object out of range") </string> <string name="GodToolsObjectOwnedBy"> Objekt [OBJECT] ejet af [OWNER] @@ -1660,13 +1658,13 @@ Prøv venligst om lidt igen. Memory brugt: [COUNT] kb </string> <string name="ScriptLimitsParcelScriptURLs"> - Parcel Script URL'er + Parcel Script URL'er </string> <string name="ScriptLimitsURLsUsed"> - URL'er brugt: [COUNT] ud af [MAX]; [AVAILABLE] tilgængelige + URL'er brugt: [COUNT] ud af [MAX]; [AVAILABLE] tilgængelige </string> <string name="ScriptLimitsURLsUsedSimple"> - URL'er brugt: [COUNT] + URL'er brugt: [COUNT] </string> <string name="ScriptLimitsRequestError"> Fejl ved anmodning om information @@ -1813,7 +1811,7 @@ Prøv venligst om lidt igen. Nyt script </string> <string name="BusyModeResponseDefault"> - Beboeren du sendte en besked er 'optaget', hvilket betyder at han/hun ikke vil forstyrres. Din besked vil blive vis i hans/hendes IM panel til senere visning. + Beboeren du sendte en besked er 'optaget', hvilket betyder at han/hun ikke vil forstyrres. Din besked vil blive vis i hans/hendes IM panel til senere visning. </string> <string name="MuteByName"> (Efter navn) @@ -2121,11 +2119,11 @@ Hvis fejlen stadig bliver ved, kan det være nødvendigt at afinstallere [APP_NA </string> <string name="MBAlreadyRunning"> [APP_NAME] kører allerede. -Undersøg din "task bar" for at se efter minimeret version af programmet. +Undersøg din "task bar" for at se efter minimeret version af programmet. Hvis fejlen fortsætter, prøv at genstarte din computer. </string> <string name="MBFrozenCrashed"> - [APP_NAME] ser ud til at være "frosset" eller gÃ¥et ned tidligere. + [APP_NAME] ser ud til at være "frosset" eller gÃ¥et ned tidligere. Ønsker du at sende en fejlrapport? </string> <string name="MBAlert"> @@ -2161,39 +2159,39 @@ Afvikler i vindue. Fejl ved nedlukning </string> <string name="MBDevContextErr"> - Kan ikke oprette "GL device context" + Kan ikke oprette "GL device context" </string> <string name="MBPixelFmtErr"> - Kan ikke finde passende "pixel format" + Kan ikke finde passende "pixel format" </string> <string name="MBPixelFmtDescErr"> - Kan ikke finde "pixel format" beskrivelse + Kan ikke finde "pixel format" beskrivelse </string> <string name="MBTrueColorWindow"> - [APP_NAME] kræver "True Color (32-bit)" for at kunne køre. -GÃ¥ venligst til din computers skærmopsætning og sæt "color mode" til 32-bit. + [APP_NAME] kræver "True Color (32-bit)" for at kunne køre. +GÃ¥ venligst til din computers skærmopsætning og sæt "color mode" til 32-bit. </string> <string name="MBAlpha"> - [APP_NAME] kan ikke køre, da den ikke kan finde en "8 bit alpha channel". Normalt skyldes dette et problem med en video driver. + [APP_NAME] kan ikke køre, da den ikke kan finde en "8 bit alpha channel". Normalt skyldes dette et problem med en video driver. Venligst undersøg om du har de nyeste drivere til dit videokort installeret. -Din skærm skal ogsÃ¥ være sat op til at køre "True Color (32-bit)" i din displayopsætning. +Din skærm skal ogsÃ¥ være sat op til at køre "True Color (32-bit)" i din displayopsætning. Hvis du bliver ved med at modtage denne besked, kontakt [SUPPORT_SITE]. </string> <string name="MBPixelFmtSetErr"> - Kan ikke sætte "pixel format" + Kan ikke sætte "pixel format" </string> <string name="MBGLContextErr"> - Kan ikke oprette "GL rendering context" + Kan ikke oprette "GL rendering context" </string> <string name="MBGLContextActErr"> - Kan ikke aktivere "GL rendering context" + Kan ikke aktivere "GL rendering context" </string> <string name="MBVideoDrvErr"> [APP_NAME] kan ikke afvikles da driverne til dit videokort ikke blev installeret korrekt, er forældede, eller du benytter hardware der ikke er supporteret. Undersøg venligst om du har installeret de nyeste drivere til dit grafikkort, og selv om du har de nyeste, prøv at geninstallere dem. Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. </string> - <string name="5 O'Clock Shadow"> + <string name="5 O'Clock Shadow"> Skægstubbe </string> <string name="All White"> @@ -3328,7 +3326,7 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. Skævt ansigt </string> <string name="Shear Front"> - "MÃ¥ne" + "MÃ¥ne" </string> <string name="Shear Left Up"> Venstre op @@ -3463,7 +3461,7 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. Sparsomt </string> <string name="Spiked Hair"> - HÃ¥r med "spikes" + HÃ¥r med "spikes" </string> <string name="Square"> Firkantet @@ -3723,6 +3721,10 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="conference-title-incoming"> Konference med [AGENT_NAME] </string> + <string name="bot_warning"> + Du chatter med en bot, [NAME]. Del ikke personlige oplysninger. +Læs mere pÃ¥ https://second.life/scripted-agents. + </string> <string name="no_session_message"> (IM session eksisterer ikke) </string> @@ -3763,7 +3765,7 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. En gruppe moderator har deaktiveret din tekst chat. </string> <string name="muted_error"> - Du er blevet "blokeret". + Du er blevet "blokeret". </string> <string name="add_session_event"> Ikke muligt at tilføge brugere til samtale med [RECIPIENT]. @@ -3793,7 +3795,7 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. [SOURCES] har sagt noget nyt </string> <string name="session_initialization_timed_out_error"> - Initialisering af session er "timed out" + Initialisering af session er "timed out" </string> <string name="Home position set."> Hjemmeposition sat. @@ -4026,7 +4028,7 @@ Krænkelsesanmeldelse Kvinde - Latter </string> <string name="Female - Looking good"> - Kvinde - "Ser godt ud" + Kvinde - "Ser godt ud" </string> <string name="Female - Over here"> Kvinde - Herovre @@ -4140,7 +4142,7 @@ Krænkelsesanmeldelse <string name="ExternalEditorNotFound"> Kan ikke benytte deb eksterne editor der er angivet. Prøv at omkrandse stien til editor med anførselstegn. -(f.eks. "/stil til min editor" "%s") +(f.eks. "/stil til min editor" "%s") </string> <string name="ExternalEditorCommandParseError"> Fejl ved hÃ¥ndtering af kommando til ekstern editor. @@ -4464,10 +4466,10 @@ Prøv at omkrandse stien til editor med anførselstegn. Viser pejlelys for fysiske objekter (grøn) </string> <string name="BeaconScripted"> - Viser pejlelys for "scriptede" objekter (rød) + Viser pejlelys for "scriptede" objekter (rød) </string> <string name="BeaconScriptedTouch"> - Viser pejlelys for "scriptede" objekter med berøringsfunktion (rød) + Viser pejlelys for "scriptede" objekter med berøringsfunktion (rød) </string> <string name="BeaconSound"> Viser pejlelys for lyd (gul) diff --git a/indra/newview/skins/default/xui/da/teleport_strings.xml b/indra/newview/skins/default/xui/da/teleport_strings.xml index 0d89fae986..79ec69fd9b 100644 --- a/indra/newview/skins/default/xui/da/teleport_strings.xml +++ b/indra/newview/skins/default/xui/da/teleport_strings.xml @@ -21,8 +21,8 @@ Hvis du stadig ikke kan teleporte, prøv venligst at logge ud og ligge ind for a Prøv igen om lidt. </message> <message name="NoHelpIslandTP"> - Du kan ikke teleportere tilbage til Welcome Island. -GÃ¥ til 'Welcome Island Puclic' for at prøve tutorial igen. + Du kan ikke teleportere tilbage til Welcome Island. +GÃ¥ til 'Welcome Island Puclic' for at prøve tutorial igen. </message> <message name="noaccess_tport"> Beklager, du har ikke adgang til denne teleport destination. diff --git a/indra/newview/skins/default/xui/de/floater_avatar_textures.xml b/indra/newview/skins/default/xui/de/floater_avatar_textures.xml index aed9aa6e78..915ef3067f 100644 --- a/indra/newview/skins/default/xui/de/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/de/floater_avatar_textures.xml @@ -8,7 +8,7 @@ Texturen</text> <text name="composite_label">Zusammengesetzte Texturen</text> <button label="IDs an Konsole ausgeben" label_selected="Abladen" name="Dump"/> - <panel name="scroll_content_panel"> + <panel name="scroll_content_panel2"> <texture_picker label="Haare" name="hair-baked"/> <texture_picker label="Haare" name="hair_grain"/> <texture_picker label="Alpha: Haare" name="hair_alpha"/> diff --git a/indra/newview/skins/default/xui/de/floater_search.xml b/indra/newview/skins/default/xui/de/floater_search.xml deleted file mode 100644 index bd39bf2bce..0000000000 --- a/indra/newview/skins/default/xui/de/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> - <floater.string name="loading_text"> - Wird geladen... - </floater.string> - <floater.string name="done_text"> - Fertig - </floater.string> - <layout_stack name="stack1"> - <layout_panel name="browser_layout"> - <text name="refresh_search"> - Suche wiederholen, um aktuellen Gott-Level zu berücksichtigen - </text> - </layout_panel> - </layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/de/panel_progress.xml b/indra/newview/skins/default/xui/de/panel_progress.xml index c9bed9fd9b..a3813c91d0 100644 --- a/indra/newview/skins/default/xui/de/panel_progress.xml +++ b/indra/newview/skins/default/xui/de/panel_progress.xml @@ -1,8 +1,10 @@ <?xml version="1.0" ?> <panel name="login_progress_panel"> + <layout_panel name="panel_icons"/> <layout_stack name="vertical_centering"/> <layout_panel name="panel4"/> <layout_panel name="center"/> <layout_stack name="horizontal_centering"> + <text name="logos_lbl">Megapahit verwendet</text> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml index 602424821f..09447cbbaf 100644 --- a/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@ <combo_box.item label="Klein (128x128)" name="Small(128x128)"/> <combo_box.item label="Mittel (256x256)" name="Medium(256x256)"/> <combo_box.item label="Groß (512x512)" name="Large(512x512)"/> - <combo_box.item label="Aktuelles Fenster (512x512)" name="CurrentWindow"/> + <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/> <combo_box.item label="Benutzerdefiniert" name="Custom"/> </combo_box> <spinner label="Breite x Höhe" name="inventory_snapshot_width"/> diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_options.xml b/indra/newview/skins/default/xui/de/panel_snapshot_options.xml index dab20d63eb..2a51f10894 100644 --- a/indra/newview/skins/default/xui/de/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/de/panel_snapshot_options.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_snapshot_options"> <button label="Auf Datenträger speichern" name="save_to_computer_btn"/> - <button label="In Inventar speichern ([AMOUNT] L$)" name="save_to_inventory_btn"/> + <button label="In Inventar speichern" name="save_to_inventory_btn"/> <button label="Im Profil-Feed teilen" name="save_to_profile_btn"/> <button label="Auf Facebook teilen" name="send_to_facebook_btn"/> <button label="Auf Twitter teilen" name="send_to_twitter_btn"/> diff --git a/indra/newview/skins/default/xui/de/panel_status_bar.xml b/indra/newview/skins/default/xui/de/panel_status_bar.xml index 0829814220..7e305fb16b 100644 --- a/indra/newview/skins/default/xui/de/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/de/panel_status_bar.xml @@ -6,7 +6,7 @@ <panel.string name="bandwidth_tooltip"> Bandbreite </panel.string> - <panel.string name="time"> + <panel.string name="time_ampm"> [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] </panel.string> <panel.string name="timeTooltip"> diff --git a/indra/newview/skins/default/xui/de/sidepanel_item_info.xml b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml index 168bb14248..3570ccacd2 100644 --- a/indra/newview/skins/default/xui/de/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml @@ -21,6 +21,9 @@ <panel.string name="acquiredDate"> [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] </panel.string> + <panel.string name="acquiredDateAMPM"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour12,datetime,local]:[min,datetime,local]:[second,datetime,local] [ampm,datetime,local] [year,datetime,local] + </panel.string> <panel.string name="origin_inventory"> (Inventar) </panel.string> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index b147c49224..a17eb22d89 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -1,619 +1,1686 @@ <?xml version="1.0" ?> <strings> - <string name="SECOND_LIFE">Second Life</string> - <string name="APP_NAME">Megapahit</string> - <string name="CAPITALIZED_APP_NAME">MEGAPAHIT</string> - <string name="SECOND_LIFE_GRID">Second Life-Grid:</string> - <string name="SUPPORT_SITE">Second Life Support-Portal</string> - <string name="StartupDetectingHardware">Hardware wird erfasst...</string> - <string name="StartupLoading">[APP_NAME] wird geladen...</string> - <string name="StartupClearingCache">Cache wird gelöscht...</string> - <string name="StartupInitializingTextureCache">Textur-Cache wird initialisiert...</string> - <string name="StartupRequireDriverUpdate">Grafikinitialisierung fehlgeschlagen. Bitte aktualisieren Sie Ihren Grafiktreiber.</string> - <string name="AboutHeader">[CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]Bit) [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]</string> - <string name="BuildConfig">Build-Konfiguration [BUILD_CONFIG]</string> - <string name="AboutPosition">Sie befinden sich an [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] auf <nolink>[HOSTNAME]</nolink> ([HOSTIP]) + <string name="SECOND_LIFE"> + Second Life + </string> + <string name="APP_NAME"> + Megapahit + </string> + <string name="CAPITALIZED_APP_NAME"> + MEGAPAHIT + </string> + <string name="SECOND_LIFE_GRID"> + Second Life-Grid: + </string> + <string name="SUPPORT_SITE"> + Second Life Support-Portal + </string> + <string name="StartupDetectingHardware"> + Hardware wird erfasst... + </string> + <string name="StartupLoading"> + [APP_NAME] wird geladen... + </string> + <string name="StartupClearingCache"> + Cache wird gelöscht... + </string> + <string name="StartupInitializingTextureCache"> + Textur-Cache wird initialisiert... + </string> + <string name="StartupRequireDriverUpdate"> + Grafikinitialisierung fehlgeschlagen. Bitte aktualisieren Sie Ihren Grafiktreiber. + </string> + <string name="AboutHeader"> + [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]Bit) [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] + </string> + <string name="BuildConfig"> + Build-Konfiguration [BUILD_CONFIG] + </string> + <string name="AboutPosition"> + Sie befinden sich an [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] auf <nolink>[HOSTNAME]</nolink> SLURL: <nolink>[SLURL]</nolink> (globale Koordinaten [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] -[SERVER_RELEASE_NOTES_URL]</string> - <string name="AboutSystem">CPU: [CPU] +[SERVER_RELEASE_NOTES_URL] + </string> + <string name="AboutSystem"> + CPU: [CPU] Speicher: [MEMORY_MB] MB Betriebssystemversion: [OS_VERSION] Grafikkartenhersteller: [GRAPHICS_CARD_VENDOR] -Grafikkarte: [GRAPHICS_CARD]</string> - <string name="AboutDriver">Windows-Grafiktreiberversion: [GRAPHICS_DRIVER_VERSION]</string> - <string name="AboutOGL">OpenGL-Version: [OPENGL_VERSION]</string> - <string name="AboutSettings">Fenstergröße: [WINDOW_WIDTH]x[WINDOW_HEIGHT] +Grafikkarte: [GRAPHICS_CARD] + </string> + <string name="AboutDriver"> + Windows-Grafiktreiberversion: [GRAPHICS_DRIVER_VERSION] + </string> + <string name="AboutOGL"> + OpenGL-Version: [OPENGL_VERSION] + </string> + <string name="AboutSettings"> + Fenstergröße: [WINDOW_WIDTH]x[WINDOW_HEIGHT] Schriftgrößenanpassung: [FONT_SIZE_ADJUSTMENT] pt UI-Skalierung: [UI_SCALE] Sichtweite: [DRAW_DISTANCE] m Bandbreite: [NET_BANDWITH] kbit/s LOD-Faktor: [LOD_FACTOR] Darstellungsqualität: [RENDER_QUALITY] -Erweitertes Beleuchtungsmodell: [GPU_SHADERS] -Texturspeicher: [TEXTURE_MEMORY] MB</string> - <string name="AboutOSXHiDPI">HiDPI-Anzeigemodus: [HIDPI]</string> - <string name="AboutLibs">J2C-Decoderversion: [J2C_VERSION] +Texturspeicher: [TEXTURE_MEMORY] MB + </string> + <string name="AboutOSXHiDPI"> + HiDPI-Anzeigemodus: [HIDPI] + </string> + <string name="AboutLibs"> + J2C-Decoderversion: [J2C_VERSION] Audiotreiberversion: [AUDIO_DRIVER_VERSION] [LIBCEF_VERSION] LibVLC-Version: [LIBVLC_VERSION] -Voice-Server-Version: [VOICE_VERSION]</string> - <string name="AboutTraffic">Paketverlust: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1] %)</string> - <string name="AboutTime">[month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]</string> - <string name="ErrorFetchingServerReleaseNotesURL">Fehler beim Abrufen der URL für die Server-Versionshinweise.</string> - <string name="BuildConfiguration">Build-Konfiguration</string> - <string name="ProgressRestoring">Wird wiederhergestellt...</string> - <string name="ProgressChangingResolution">Auflösung wird geändert...</string> - <string name="Fullbright">Fullbright (Legacy)</string> - <string name="LoginInProgress">Anmeldevorgang gestartet. [APP_NAME] reagiert möglicherweise nicht. Bitte warten.</string> - <string name="LoginInProgressNoFrozen">Anmeldung erfolgt...</string> - <string name="LoginAuthenticating">Authentifizierung</string> - <string name="LoginMaintenance">Account wird aktualisiert...</string> - <string name="LoginAttempt">Ein früherer Anmeldeversuch ist fehlgeschlagen. Anmeldung, Versuch [NUMBER]</string> - <string name="LoginPrecaching">Welt wird geladen...</string> - <string name="LoginInitializingBrowser">Integrierter Webbrowser wird initialisiert...</string> - <string name="LoginInitializingMultimedia">Multimedia wird initialisiert...</string> - <string name="LoginInitializingFonts">Schriftarten werden geladen...</string> - <string name="LoginVerifyingCache">Cache-Dateien werden überprüft (dauert 60-90 Sekunden)...</string> - <string name="LoginProcessingResponse">Antwort wird verarbeitet...</string> - <string name="LoginInitializingWorld">Welt wird initialisiert...</string> - <string name="LoginDecodingImages">Bilder werden entpackt...</string> - <string name="LoginInitializingQuicktime">QuickTime wird initialisiert...</string> - <string name="LoginQuicktimeNotFound">QuickTime nicht gefunden - Initialisierung nicht möglich.</string> - <string name="LoginQuicktimeOK">QuickTime wurde initialisiert.</string> - <string name="LoginRequestSeedCapGrant">Regionsfähigkeiten anfordern...</string> - <string name="LoginRetrySeedCapGrant">Regionsfähigkeiten anfordern. Versuch [NUMBER]...</string> - <string name="LoginWaitingForRegionHandshake">Region-Handshake...</string> - <string name="LoginConnectingToRegion">Region-Verbindung...</string> - <string name="LoginDownloadingClothing">Kleidung wird geladen...</string> - <string name="InvalidCertificate">Der Server hat ein ungültiges oder korruptes Zertifikate zurückgegeben. Bitte kontaktieren Sie den Grid-Administrator.</string> - <string name="CertInvalidHostname">Ein ungültiger Hostname wurde verwendet, um auf den Server zuzugreifen. Bitte überprüfen Sie Ihre SLURL oder den Grid-Hostnamen.</string> - <string name="CertExpired">Das vom Grid ausgegebene Zertifikate ist abgelaufen. Bitte überprüfen Sie Ihre Systemuhr oder kontaktieren Sie Ihren Grid-Administrator.</string> - <string name="CertKeyUsage">Das vom Server ausgegebene Zertifikat konnte nicht für SSL verwendet werden. Bitte kontaktieren Sie Ihren Grid-Administrator.</string> - <string name="CertBasicConstraints">In der Zertifikatskette des Servers befanden sich zu viele Zertifikate. Bitte kontaktieren Sie Ihren Grid-Administrator.</string> - <string name="CertInvalidSignature">Die Zertifikatsunterschrift des Gridservers konnte nicht bestätigt werden. Bitte kontaktieren Sie Ihren Grid-Administrator.</string> - <string name="LoginFailedNoNetwork">Netzwerkfehler: Verbindung konnte nicht hergestellt werden. Bitte überprüfen Sie Ihre Netzwerkverbindung.</string> - <string name="LoginFailedHeader">Anmeldung fehlgeschlagen</string> - <string name="Quit">Beenden</string> - <string name="create_account_url">http://join.secondlife.com/?sourceid=[sourceid]</string> - <string name="AgniGridLabel">Second Life Main Grid (Agni)</string> - <string name="AditiGridLabel">Second Life Beta Test Grid (Aditi)</string> - <string name="ViewerDownloadURL">http://secondlife.com/download</string> - <string name="LoginFailedViewerNotPermitted">Mit dem von Ihnen verwendeten Viewer ist der Zugriff auf Second Life nicht mehr möglich. Laden Sie von den folgenden Seite einen neuen Viewer herunter: +Voice-Server-Version: [VOICE_VERSION] + </string> + <string name="AboutTraffic"> + Paketverlust: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1] %) + </string> + <string name="AboutTime"> + [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt] + </string> + <string name="ErrorFetchingServerReleaseNotesURL"> + Fehler beim Abrufen der URL für die Server-Versionshinweise. + </string> + <string name="BuildConfiguration"> + Build-Konfiguration + </string> + <string name="ProgressRestoring"> + Wird wiederhergestellt... + </string> + <string name="ProgressChangingResolution"> + Auflösung wird geändert... + </string> + <string name="Fullbright"> + Fullbright (Legacy) + </string> + <string name="LoginInProgress"> + Anmeldevorgang gestartet. [APP_NAME] reagiert möglicherweise nicht. Bitte warten. + </string> + <string name="LoginInProgressNoFrozen"> + Anmeldung erfolgt... + </string> + <string name="LoginAuthenticating"> + Authentifizierung + </string> + <string name="LoginMaintenance"> + Account wird aktualisiert... + </string> + <string name="LoginAttempt"> + Ein früherer Anmeldeversuch ist fehlgeschlagen. Anmeldung, Versuch [NUMBER] + </string> + <string name="LoginPrecaching"> + Welt wird geladen... + </string> + <string name="LoginInitializingBrowser"> + Integrierter Webbrowser wird initialisiert... + </string> + <string name="LoginInitializingMultimedia"> + Multimedia wird initialisiert... + </string> + <string name="LoginInitializingFonts"> + Schriftarten werden geladen... + </string> + <string name="LoginVerifyingCache"> + Cache-Dateien werden überprüft (dauert 60-90 Sekunden)... + </string> + <string name="LoginProcessingResponse"> + Antwort wird verarbeitet... + </string> + <string name="LoginInitializingWorld"> + Welt wird initialisiert... + </string> + <string name="LoginDecodingImages"> + Bilder werden entpackt... + </string> + <string name="LoginInitializingQuicktime"> + QuickTime wird initialisiert... + </string> + <string name="LoginQuicktimeNotFound"> + QuickTime nicht gefunden - Initialisierung nicht möglich. + </string> + <string name="LoginQuicktimeOK"> + QuickTime wurde initialisiert. + </string> + <string name="LoginRequestSeedCapGrant"> + Regionsfähigkeiten anfordern... + </string> + <string name="LoginRetrySeedCapGrant"> + Regionsfähigkeiten anfordern. Versuch [NUMBER]... + </string> + <string name="LoginWaitingForRegionHandshake"> + Region-Handshake... + </string> + <string name="LoginConnectingToRegion"> + Region-Verbindung... + </string> + <string name="LoginDownloadingClothing"> + Kleidung wird geladen... + </string> + <string name="InvalidCertificate"> + Der Server hat ein ungültiges oder korruptes Zertifikate zurückgegeben. Bitte kontaktieren Sie den Grid-Administrator. + </string> + <string name="CertInvalidHostname"> + Ein ungültiger Hostname wurde verwendet, um auf den Server zuzugreifen. Bitte überprüfen Sie Ihre SLURL oder den Grid-Hostnamen. + </string> + <string name="CertExpired"> + Das vom Grid ausgegebene Zertifikate ist abgelaufen. Bitte überprüfen Sie Ihre Systemuhr oder kontaktieren Sie Ihren Grid-Administrator. + </string> + <string name="CertKeyUsage"> + Das vom Server ausgegebene Zertifikat konnte nicht für SSL verwendet werden. Bitte kontaktieren Sie Ihren Grid-Administrator. + </string> + <string name="CertBasicConstraints"> + In der Zertifikatskette des Servers befanden sich zu viele Zertifikate. Bitte kontaktieren Sie Ihren Grid-Administrator. + </string> + <string name="CertInvalidSignature"> + Die Zertifikatsunterschrift des Gridservers konnte nicht bestätigt werden. Bitte kontaktieren Sie Ihren Grid-Administrator. + </string> + <string name="LoginFailedNoNetwork"> + Netzwerkfehler: Verbindung konnte nicht hergestellt werden. Bitte überprüfen Sie Ihre Netzwerkverbindung. + </string> + <string name="LoginFailedHeader"> + Anmeldung fehlgeschlagen + </string> + <string name="Quit"> + Beenden + </string> + <string name="create_account_url"> + http://join.secondlife.com/?sourceid=[sourceid] + </string> + <string name="AgniGridLabel"> + Second Life Main Grid (Agni) + </string> + <string name="AditiGridLabel"> + Second Life Beta Test Grid (Aditi) + </string> + <string name="ViewerDownloadURL"> + http://secondlife.com/download + </string> + <string name="LoginFailedViewerNotPermitted"> + Mit dem von Ihnen verwendeten Viewer ist der Zugriff auf Second Life nicht mehr möglich. Laden Sie von den folgenden Seite einen neuen Viewer herunter: http://secondlife.com/download Weitere Informationen finden Sie auf der folgenden FAQ-Seite: -http://secondlife.com/viewer-access-faq</string> - <string name="LoginIntermediateOptionalUpdateAvailable">Optionales Viewer-Update verfügbar: [VERSION]</string> - <string name="LoginFailedRequiredUpdate">Erforderliches Viewer-Update: [VERSION]</string> - <string name="LoginFailedAlreadyLoggedIn">Dieser Agent ist bereits angemeldet.</string> - <string name="LoginFailedAuthenticationFailed">Wir bitten um Entschuldigung! Wir konnten Sie nicht anmelden. +http://secondlife.com/viewer-access-faq + </string> + <string name="LoginIntermediateOptionalUpdateAvailable"> + Optionales Viewer-Update verfügbar: [VERSION] + </string> + <string name="LoginFailedRequiredUpdate"> + Erforderliches Viewer-Update: [VERSION] + </string> + <string name="LoginFailedAlreadyLoggedIn"> + Dieser Agent ist bereits angemeldet. + </string> + <string name="LoginFailedAuthenticationFailed"> + Wir bitten um Entschuldigung! Wir konnten Sie nicht anmelden. Stellen Sie sicher, dass Sie die richtigen Informationen eingegeben haben: * Benutzername (wie robertschmidt12 oder warme.sonne) * Kennwort -Stellen Sie außerdem sicher, dass die Umschaltsperre deaktiviert ist.</string> - <string name="LoginFailedPasswordChanged">Ihr Kennwort wurde aus Sicherheitsgründen geändert. +Stellen Sie außerdem sicher, dass die Umschaltsperre deaktiviert ist. + </string> + <string name="LoginFailedPasswordChanged"> + Ihr Kennwort wurde aus Sicherheitsgründen geändert. Gehen Sie zur Seite „Mein Account“ unter http://secondlife.com/password und beantworten Sie die Sicherheitsfrage, um Ihr Kennwort zurückzusetzen. -Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten.</string> - <string name="LoginFailedPasswordReset">Aufgrund von Systemänderungen müssen Sie Ihr Kennwort zurücksetzen. +Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten. + </string> + <string name="LoginFailedPasswordReset"> + Aufgrund von Systemänderungen müssen Sie Ihr Kennwort zurücksetzen. Gehen Sie zur Seite „Mein Account“ unter http://secondlife.com/password und beantworten Sie die Sicherheitsfrage, um Ihr Kennwort zurückzusetzen. -Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten.</string> - <string name="LoginFailedEmployeesOnly">Second Life ist vorübergehend wegen Wartung geschlossen. +Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten. + </string> + <string name="LoginFailedEmployeesOnly"> + Second Life ist vorübergehend wegen Wartung geschlossen. Nur Mitarbeiter können sich anmelden. -Aktuelle Informationen finden Sie unter www.secondlife.com/status.</string> - <string name="LoginFailedPremiumOnly">Die Anmeldung bei Second Life ist vorübergehend eingeschränkt, um sicherzustellen, dass Einwohner, die sich bereits inworld aufhalten, das bestmögliche Erlebnis haben. +Aktuelle Informationen finden Sie unter www.secondlife.com/status. + </string> + <string name="LoginFailedPremiumOnly"> + Die Anmeldung bei Second Life ist vorübergehend eingeschränkt, um sicherzustellen, dass Einwohner, die sich bereits inworld aufhalten, das bestmögliche Erlebnis haben. -Benutzer mit kostenlosen Konten können sich während dieses Zeitraums nicht bei Second Life anmelden, damit die Kapazität Benutzern zur Verfügung steht, die ein gebührenpflichtiges Premium-Konto besitzen.</string> - <string name="LoginFailedComputerProhibited">Der Zugriff auf Second Life ist von diesem Computer aus nicht möglich. +Benutzer mit kostenlosen Konten können sich während dieses Zeitraums nicht bei Second Life anmelden, damit die Kapazität Benutzern zur Verfügung steht, die ein gebührenpflichtiges Premium-Konto besitzen. + </string> + <string name="LoginFailedComputerProhibited"> + Der Zugriff auf Second Life ist von diesem Computer aus nicht möglich. Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an -support@secondlife.com.</string> - <string name="LoginFailedAcountSuspended">Ihr Konto ist erst ab -[TIME] Pacific Time wieder verfügbar.</string> - <string name="LoginFailedAccountDisabled">Ihre Anfrage kann derzeit nicht bearbeitet werden. -Bitte wenden Sie sich unter http://secondlife.com/support an den Second Life-Support.</string> - <string name="LoginFailedTransformError">Nicht übereinstimmende Daten bei der Anmeldung festgestellt. -Wenden Sie sich an support@secondlife.com.</string> - <string name="LoginFailedAccountMaintenance">An Ihrem Konto werden gerade kleinere Wartungsarbeiten durchgeführt. +support@secondlife.com. + </string> + <string name="LoginFailedAcountSuspended"> + Ihr Konto ist erst ab +[TIME] Pacific Time wieder verfügbar. + </string> + <string name="LoginFailedAccountDisabled"> + Ihre Anfrage kann derzeit nicht bearbeitet werden. +Bitte wenden Sie sich unter http://secondlife.com/support an den Second Life-Support. + </string> + <string name="LoginFailedTransformError"> + Nicht übereinstimmende Daten bei der Anmeldung festgestellt. +Wenden Sie sich an support@secondlife.com. + </string> + <string name="LoginFailedAccountMaintenance"> + An Ihrem Konto werden gerade kleinere Wartungsarbeiten durchgeführt. Ihr Konto ist erst ab [TIME] Pacific Time wieder verfügbar. -Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.</string> - <string name="LoginFailedPendingLogoutFault">Abmeldeanforderung führte zu einem Simulatorfehler.</string> - <string name="LoginFailedPendingLogout">Das System meldet Sie gerade ab. -Bitte warten Sie eine Minute, bevor Sie sich erneut einloggen.</string> - <string name="LoginFailedUnableToCreateSession">Es kann keine gültige Sitzung erstellt werden.</string> - <string name="LoginFailedUnableToConnectToSimulator">Es kann keine Simulatorverbindung hergestellt werden.</string> - <string name="LoginFailedRestrictedHours">Mit Ihrem Konto ist der Zugriff auf Second Life +Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com. + </string> + <string name="LoginFailedPendingLogoutFault"> + Abmeldeanforderung führte zu einem Simulatorfehler. + </string> + <string name="LoginFailedPendingLogout"> + Das System meldet Sie gerade ab. +Bitte warten Sie eine Minute, bevor Sie sich erneut einloggen. + </string> + <string name="LoginFailedUnableToCreateSession"> + Es kann keine gültige Sitzung erstellt werden. + </string> + <string name="LoginFailedUnableToConnectToSimulator"> + Es kann keine Simulatorverbindung hergestellt werden. + </string> + <string name="LoginFailedRestrictedHours"> + Mit Ihrem Konto ist der Zugriff auf Second Life nur zwischen [START] und [END] Pacific Time möglich. Schauen Sie während dieses Zeitraums vorbei. -Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.</string> - <string name="LoginFailedIncorrectParameters">Falsche Parameter. -Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.</string> - <string name="LoginFailedFirstNameNotAlphanumeric">Vorname muss alphanumerisch sein. -Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.</string> - <string name="LoginFailedLastNameNotAlphanumeric">Nachname muss alphanumerisch sein. -Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.</string> - <string name="LogoutFailedRegionGoingOffline">Die Region wird gerade offline geschaltet. -Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.</string> - <string name="LogoutFailedAgentNotInRegion">Agent nicht in Region. -Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.</string> - <string name="LogoutFailedPendingLogin">Die Region war gerade dabei, eine andere Sitzung anzumelden. -Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.</string> - <string name="LogoutFailedLoggingOut">Die Region war gerade dabei, die vorherige Sitzung abzumelden. -Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.</string> - <string name="LogoutFailedStillLoggingOut">Die Region ist noch immer dabei, die vorherige Sitzung abzumelden. -Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.</string> - <string name="LogoutSucceeded">Die Region hat soeben die letzte Sitzung abgemeldet. -Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.</string> - <string name="LogoutFailedLogoutBegun">Die Region hat den Abmeldevorgang gestartet. -Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.</string> - <string name="LoginFailedLoggingOutSession">Das System hat begonnen, Ihre letzte Sitzung abzumelden. -Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.</string> - <string name="AgentLostConnection">In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung.</string> - <string name="SavingSettings">Ihr Einstellungen werden gespeichert...</string> - <string name="LoggingOut">Abmeldung erfolgt...</string> - <string name="ShuttingDown">Programm wird beendet...</string> - <string name="YouHaveBeenDisconnected">Die Verbindung zu der Region ist abgebrochen.</string> - <string name="SentToInvalidRegion">Sie wurden in eine ungültige Region geschickt.</string> - <string name="TestingDisconnect">Verbindungsabbruch wird getestet</string> - <string name="SocialFacebookConnecting">Mit Facebook verbinden...</string> - <string name="SocialFacebookPosting">Posten...</string> - <string name="SocialFacebookDisconnecting">Facebook-Verbindung trennen...</string> - <string name="SocialFacebookErrorConnecting">Problem beim Verbinden mit Facebook</string> - <string name="SocialFacebookErrorPosting">Problem beim Posten auf Facebook</string> - <string name="SocialFacebookErrorDisconnecting">Problem beim Trennen der Facebook-Verbindung</string> - <string name="SocialFlickrConnecting">Verbinden mit Flickr...</string> - <string name="SocialFlickrPosting">Posten...</string> - <string name="SocialFlickrDisconnecting">Flickr-Verbindung wird getrennt...</string> - <string name="SocialFlickrErrorConnecting">Problem beim Verbinden mit Flickr</string> - <string name="SocialFlickrErrorPosting">Problem beim Posten auf Flickr</string> - <string name="SocialFlickrErrorDisconnecting">Problem beim Trennen der Flickr-Verbindung</string> - <string name="SocialTwitterConnecting">Verbinden mit Twitter...</string> - <string name="SocialTwitterPosting">Posten...</string> - <string name="SocialTwitterDisconnecting">Twitter-Verbindung wird getrennt...</string> - <string name="SocialTwitterErrorConnecting">Problem beim Verbinden mit Twitter</string> - <string name="SocialTwitterErrorPosting">Problem beim Posten auf Twitter</string> - <string name="SocialTwitterErrorDisconnecting">Problem beim Trennen der Twitter-Verbindung</string> - <string name="BlackAndWhite">Schwarzweiß</string> - <string name="Colors1970">Farben der Siebziger Jahre</string> - <string name="Intense">Intensiv</string> - <string name="Newspaper">Zeitungspapier</string> - <string name="Sepia">Sepia</string> - <string name="Spotlight">Spotlight</string> - <string name="Video">Video</string> - <string name="Autocontrast">Autokontrast</string> - <string name="LensFlare">Blendenfleck</string> - <string name="Miniature">Miniatur</string> - <string name="Toycamera">Spielzeugkamera</string> - <string name="TooltipPerson">Person</string> - <string name="TooltipNoName">(namenlos)</string> - <string name="TooltipOwner">Eigentümer:</string> - <string name="TooltipPublic">Öffentlich</string> - <string name="TooltipIsGroup">(Gruppe)</string> - <string name="TooltipForSaleL$">Zum Verkauf: [AMOUNT] L$</string> - <string name="TooltipFlagGroupBuild">Gruppenbau</string> - <string name="TooltipFlagNoBuild">Bauen aus</string> - <string name="TooltipFlagNoEdit">Gruppenbau</string> - <string name="TooltipFlagNotSafe">Unsicher</string> - <string name="TooltipFlagNoFly">Fliegen aus</string> - <string name="TooltipFlagGroupScripts">Gruppenskripte</string> - <string name="TooltipFlagNoScripts">Skripte aus</string> - <string name="TooltipLand">Land:</string> - <string name="TooltipMustSingleDrop">Sie können nur ein einzelnes Objekt hierher ziehen</string> - <string name="TooltipTooManyWearables">Sie können keinen Ordner tragen, der mehr als [AMOUNT] Elemente enthält. Sie können diesen Höchstwert unter „Erweitert“ > „Debug-Einstellungen anzeigen“ > „WearFolderLimit“ ändern.</string> +Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com. + </string> + <string name="LoginFailedIncorrectParameters"> + Falsche Parameter. +Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com. + </string> + <string name="LoginFailedFirstNameNotAlphanumeric"> + Vorname muss alphanumerisch sein. +Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com. + </string> + <string name="LoginFailedLastNameNotAlphanumeric"> + Nachname muss alphanumerisch sein. +Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com. + </string> + <string name="LogoutFailedRegionGoingOffline"> + Die Region wird gerade offline geschaltet. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + </string> + <string name="LogoutFailedAgentNotInRegion"> + Agent nicht in Region. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + </string> + <string name="LogoutFailedPendingLogin"> + Die Region war gerade dabei, eine andere Sitzung anzumelden. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + </string> + <string name="LogoutFailedLoggingOut"> + Die Region war gerade dabei, die vorherige Sitzung abzumelden. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + </string> + <string name="LogoutFailedStillLoggingOut"> + Die Region ist noch immer dabei, die vorherige Sitzung abzumelden. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + </string> + <string name="LogoutSucceeded"> + Die Region hat soeben die letzte Sitzung abgemeldet. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + </string> + <string name="LogoutFailedLogoutBegun"> + Die Region hat den Abmeldevorgang gestartet. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + </string> + <string name="LoginFailedLoggingOutSession"> + Das System hat begonnen, Ihre letzte Sitzung abzumelden. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + </string> + <string name="AgentLostConnection"> + In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung. + </string> + <string name="SavingSettings"> + Ihr Einstellungen werden gespeichert... + </string> + <string name="LoggingOut"> + Abmeldung erfolgt... + </string> + <string name="ShuttingDown"> + Programm wird beendet... + </string> + <string name="YouHaveBeenDisconnected"> + Die Verbindung zu der Region ist abgebrochen. + </string> + <string name="SentToInvalidRegion"> + Sie wurden in eine ungültige Region geschickt. + </string> + <string name="TestingDisconnect"> + Verbindungsabbruch wird getestet + </string> + <string name="SocialFacebookConnecting"> + Mit Facebook verbinden... + </string> + <string name="SocialFacebookPosting"> + Posten... + </string> + <string name="SocialFacebookDisconnecting"> + Facebook-Verbindung trennen... + </string> + <string name="SocialFacebookErrorConnecting"> + Problem beim Verbinden mit Facebook + </string> + <string name="SocialFacebookErrorPosting"> + Problem beim Posten auf Facebook + </string> + <string name="SocialFacebookErrorDisconnecting"> + Problem beim Trennen der Facebook-Verbindung + </string> + <string name="SocialFlickrConnecting"> + Verbinden mit Flickr... + </string> + <string name="SocialFlickrPosting"> + Posten... + </string> + <string name="SocialFlickrDisconnecting"> + Flickr-Verbindung wird getrennt... + </string> + <string name="SocialFlickrErrorConnecting"> + Problem beim Verbinden mit Flickr + </string> + <string name="SocialFlickrErrorPosting"> + Problem beim Posten auf Flickr + </string> + <string name="SocialFlickrErrorDisconnecting"> + Problem beim Trennen der Flickr-Verbindung + </string> + <string name="SocialTwitterConnecting"> + Verbinden mit Twitter... + </string> + <string name="SocialTwitterPosting"> + Posten... + </string> + <string name="SocialTwitterDisconnecting"> + Twitter-Verbindung wird getrennt... + </string> + <string name="SocialTwitterErrorConnecting"> + Problem beim Verbinden mit Twitter + </string> + <string name="SocialTwitterErrorPosting"> + Problem beim Posten auf Twitter + </string> + <string name="SocialTwitterErrorDisconnecting"> + Problem beim Trennen der Twitter-Verbindung + </string> + <string name="BlackAndWhite"> + Schwarzweiß + </string> + <string name="Colors1970"> + Farben der Siebziger Jahre + </string> + <string name="Intense"> + Intensiv + </string> + <string name="Newspaper"> + Zeitungspapier + </string> + <string name="Sepia"> + Sepia + </string> + <string name="Spotlight"> + Spotlight + </string> + <string name="Video"> + Video + </string> + <string name="Autocontrast"> + Autokontrast + </string> + <string name="LensFlare"> + Blendenfleck + </string> + <string name="Miniature"> + Miniatur + </string> + <string name="Toycamera"> + Spielzeugkamera + </string> + <string name="TooltipPerson"> + Person + </string> + <string name="TooltipNoName"> + (namenlos) + </string> + <string name="TooltipOwner"> + Eigentümer: + </string> + <string name="TooltipPublic"> + Öffentlich + </string> + <string name="TooltipIsGroup"> + (Gruppe) + </string> + <string name="TooltipForSaleL$"> + Zum Verkauf: [AMOUNT] L$ + </string> + <string name="TooltipFlagGroupBuild"> + Gruppenbau + </string> + <string name="TooltipFlagNoBuild"> + Bauen aus + </string> + <string name="TooltipFlagNoEdit"> + Gruppenbau + </string> + <string name="TooltipFlagNotSafe"> + Unsicher + </string> + <string name="TooltipFlagNoFly"> + Fliegen aus + </string> + <string name="TooltipFlagGroupScripts"> + Gruppenskripte + </string> + <string name="TooltipFlagNoScripts"> + Skripte aus + </string> + <string name="TooltipLand"> + Land: + </string> + <string name="TooltipMustSingleDrop"> + Sie können nur ein einzelnes Objekt hierher ziehen + </string> + <string name="TooltipTooManyWearables"> + Sie können keinen Ordner tragen, der mehr als [AMOUNT] Elemente enthält. Sie können diesen Höchstwert unter „Erweitert“ > „Debug-Einstellungen anzeigen“ > „WearFolderLimit“ ändern. + </string> <string name="TooltipPrice" value="[AMOUNT] L$"/> - <string name="TooltipSLIcon">Führt zu einer Seite in der offiziellen Domäne SecondLife.com oder LindenLab.com.</string> - <string name="TooltipOutboxDragToWorld">Sie können keine Objekte aus dem Marktplatz-Auflistungsordner rezzen</string> - <string name="TooltipOutboxWorn">Sie können Objekte, die Sie tragen, nicht in den Marktplatz-Auflistungsordner stellen</string> - <string name="TooltipOutboxFolderLevels">Tiefe der verschachtelten Ordner überschreitet [AMOUNT]. Reduzieren Sie die Ordnertiefe. Verpacken Sie ggf. einige Artikel.</string> - <string name="TooltipOutboxTooManyFolders">Anzahl von Unterordnern überschreitet [AMOUNT]. Reduzieren Sie die Anzahl von Ordnern in Ihrer Auflistung. Verpacken Sie ggf. einige Artikel.</string> - <string name="TooltipOutboxTooManyObjects">Anzahl von Objekten überschreitet [AMOUNT]. Um mehr als [AMOUNT] Objekte in einer Auflistung verkaufen zu können, müssen Sie einige davon verpacken.</string> - <string name="TooltipOutboxTooManyStockItems">Anzahl von Bestandsobjekten überschreitet [AMOUNT].</string> - <string name="TooltipOutboxCannotDropOnRoot">Sie können Objekte oder Ordner nur in der Registerkarte „ALLE“ oder „NICHT VERKNüPFT“ ablegen. Klicken Sie auf eine dieser Registerkarten und versuchen Sie dann erneut, Ihre Objekte bzw. Ordner zu verschieben.</string> - <string name="TooltipOutboxNoTransfer">Mindestens eines dieser Objekte kann nicht verkauft oder übertragen werden</string> - <string name="TooltipOutboxNotInInventory">Sie können nur Objekte aus Ihrem Inventar in den Marktplatz einstellen</string> - <string name="TooltipOutboxLinked">Sie können keine verknüpften Objekte oder Ordner in den Marktplatz einstellen</string> - <string name="TooltipOutboxCallingCard">Sie können Visitenkarten nicht in den Marktplatz einstellen</string> - <string name="TooltipOutboxDragActive">Sie können keine gelistete Auflistung entfernen</string> - <string name="TooltipOutboxCannotMoveRoot">Der Stammordner mit Marktplatz-Auflistungen kann nicht verschoben werden.</string> - <string name="TooltipOutboxMixedStock">Alle Objekte in einem Bestandsordner müssen vom gleichen Typ sein und die gleiche Berechtigung haben</string> - <string name="TooltipDragOntoOwnChild">Sie können einen Ordner nicht in einen seiner untergeordneten Ordner verschieben</string> - <string name="TooltipDragOntoSelf">Sie können einen Ordner nicht in sich selbst verschieben</string> - <string name="TooltipHttpUrl">Anklicken, um Webseite anzuzeigen</string> - <string name="TooltipSLURL">Anklicken, um Informationen zu diesem Standort anzuzeigen</string> - <string name="TooltipAgentUrl">Anklicken, um das Profil dieses Einwohners anzuzeigen</string> - <string name="TooltipAgentInspect">Mehr über diesen Einwohner</string> - <string name="TooltipAgentMute">Klicken, um diesen Einwohner stummzuschalten</string> - <string name="TooltipAgentUnmute">Klicken, um diesen Einwohner freizuschalten</string> - <string name="TooltipAgentIM">Klicken, um diesem Einwohner eine IM zu schicken.</string> - <string name="TooltipAgentPay">Klicken, um diesen Einwohner zu bezahlen</string> - <string name="TooltipAgentOfferTeleport">Klicken, um diesem Einwohner einen Teleport anzubieten.</string> - <string name="TooltipAgentRequestFriend">Klicken, um diesem Einwohner ein Freundschaftsangebot zu schicken.</string> - <string name="TooltipGroupUrl">Anklicken, um Beschreibung der Gruppe anzuzeigen</string> - <string name="TooltipEventUrl">Anklicken, um Beschreibung der Veranstaltung anzuzeigen</string> - <string name="TooltipClassifiedUrl">Anklicken, um diese Anzeige anzuzeigen</string> - <string name="TooltipParcelUrl">Anklicken, um Beschreibung der Parzelle anzuzeigen</string> - <string name="TooltipTeleportUrl">Anklicken, um zu diesem Standort zu teleportieren</string> - <string name="TooltipObjectIMUrl">Anklicken, um Beschreibung des Objekts anzuzeigen</string> - <string name="TooltipMapUrl">Klicken, um diese Position auf der Karte anzuzeigen</string> - <string name="TooltipSLAPP">Anklicken, um Befehl secondlife:// auszuführen</string> + <string name="TooltipSLIcon"> + Führt zu einer Seite in der offiziellen Domäne SecondLife.com oder LindenLab.com. + </string> + <string name="TooltipOutboxDragToWorld"> + Sie können keine Objekte aus dem Marktplatz-Auflistungsordner rezzen + </string> + <string name="TooltipOutboxWorn"> + Sie können Objekte, die Sie tragen, nicht in den Marktplatz-Auflistungsordner stellen + </string> + <string name="TooltipOutboxFolderLevels"> + Tiefe der verschachtelten Ordner überschreitet [AMOUNT]. Reduzieren Sie die Ordnertiefe. Verpacken Sie ggf. einige Artikel. + </string> + <string name="TooltipOutboxTooManyFolders"> + Anzahl von Unterordnern überschreitet [AMOUNT]. Reduzieren Sie die Anzahl von Ordnern in Ihrer Auflistung. Verpacken Sie ggf. einige Artikel. + </string> + <string name="TooltipOutboxTooManyObjects"> + Anzahl von Objekten überschreitet [AMOUNT]. Um mehr als [AMOUNT] Objekte in einer Auflistung verkaufen zu können, müssen Sie einige davon verpacken. + </string> + <string name="TooltipOutboxTooManyStockItems"> + Anzahl von Bestandsobjekten überschreitet [AMOUNT]. + </string> + <string name="TooltipOutboxCannotDropOnRoot"> + Sie können Objekte oder Ordner nur in der Registerkarte „ALLE“ oder „NICHT VERKNüPFT“ ablegen. Klicken Sie auf eine dieser Registerkarten und versuchen Sie dann erneut, Ihre Objekte bzw. Ordner zu verschieben. + </string> + <string name="TooltipOutboxNoTransfer"> + Mindestens eines dieser Objekte kann nicht verkauft oder übertragen werden + </string> + <string name="TooltipOutboxNotInInventory"> + Sie können nur Objekte aus Ihrem Inventar in den Marktplatz einstellen + </string> + <string name="TooltipOutboxLinked"> + Sie können keine verknüpften Objekte oder Ordner in den Marktplatz einstellen + </string> + <string name="TooltipOutboxCallingCard"> + Sie können Visitenkarten nicht in den Marktplatz einstellen + </string> + <string name="TooltipOutboxDragActive"> + Sie können keine gelistete Auflistung entfernen + </string> + <string name="TooltipOutboxCannotMoveRoot"> + Der Stammordner mit Marktplatz-Auflistungen kann nicht verschoben werden. + </string> + <string name="TooltipOutboxMixedStock"> + Alle Objekte in einem Bestandsordner müssen vom gleichen Typ sein und die gleiche Berechtigung haben + </string> + <string name="TooltipDragOntoOwnChild"> + Sie können einen Ordner nicht in einen seiner untergeordneten Ordner verschieben + </string> + <string name="TooltipDragOntoSelf"> + Sie können einen Ordner nicht in sich selbst verschieben + </string> + <string name="TooltipHttpUrl"> + Anklicken, um Webseite anzuzeigen + </string> + <string name="TooltipSLURL"> + Anklicken, um Informationen zu diesem Standort anzuzeigen + </string> + <string name="TooltipAgentUrl"> + Anklicken, um das Profil dieses Einwohners anzuzeigen + </string> + <string name="TooltipAgentInspect"> + Mehr über diesen Einwohner + </string> + <string name="TooltipAgentMute"> + Klicken, um diesen Einwohner stummzuschalten + </string> + <string name="TooltipAgentUnmute"> + Klicken, um diesen Einwohner freizuschalten + </string> + <string name="TooltipAgentIM"> + Klicken, um diesem Einwohner eine IM zu schicken. + </string> + <string name="TooltipAgentPay"> + Klicken, um diesen Einwohner zu bezahlen + </string> + <string name="TooltipAgentOfferTeleport"> + Klicken, um diesem Einwohner einen Teleport anzubieten. + </string> + <string name="TooltipAgentRequestFriend"> + Klicken, um diesem Einwohner ein Freundschaftsangebot zu schicken. + </string> + <string name="TooltipGroupUrl"> + Anklicken, um Beschreibung der Gruppe anzuzeigen + </string> + <string name="TooltipEventUrl"> + Anklicken, um Beschreibung der Veranstaltung anzuzeigen + </string> + <string name="TooltipClassifiedUrl"> + Anklicken, um diese Anzeige anzuzeigen + </string> + <string name="TooltipParcelUrl"> + Anklicken, um Beschreibung der Parzelle anzuzeigen + </string> + <string name="TooltipTeleportUrl"> + Anklicken, um zu diesem Standort zu teleportieren + </string> + <string name="TooltipObjectIMUrl"> + Anklicken, um Beschreibung des Objekts anzuzeigen + </string> + <string name="TooltipMapUrl"> + Klicken, um diese Position auf der Karte anzuzeigen + </string> + <string name="TooltipSLAPP"> + Anklicken, um Befehl secondlife:// auszuführen + </string> <string name="CurrentURL" value=" CurrentURL: [CurrentURL]"/> - <string name="TooltipEmail">Klicken, um eine E-Mail zu verfassen</string> - <string name="SLurlLabelTeleport">Teleportieren nach</string> - <string name="SLurlLabelShowOnMap">Karte anzeigen für</string> - <string name="SLappAgentMute">Stummschalten</string> - <string name="SLappAgentUnmute">Stummschaltung aufheben</string> - <string name="SLappAgentIM">IM</string> - <string name="SLappAgentPay">Bezahlen</string> - <string name="SLappAgentOfferTeleport">Teleportangebot an</string> - <string name="SLappAgentRequestFriend">Freundschaftsangebot</string> - <string name="SLappAgentRemoveFriend">Entfernen von Freunden</string> - <string name="BUTTON_CLOSE_DARWIN">Schließen (⌘W)</string> - <string name="BUTTON_CLOSE_WIN">Schließen (Strg+W)</string> - <string name="BUTTON_CLOSE_CHROME">Schließen</string> - <string name="BUTTON_RESTORE">Wiederherstellen</string> - <string name="BUTTON_MINIMIZE">Minimieren</string> - <string name="BUTTON_TEAR_OFF">Abnehmen</string> - <string name="BUTTON_DOCK">Andocken</string> - <string name="BUTTON_HELP">Hilfe anzeigen</string> - <string name="TooltipNotecardNotAllowedTypeDrop">Objekte dieses Typs können nicht an Notizkarten -für diese Region angehängt werden.</string> - <string name="TooltipNotecardOwnerRestrictedDrop">An Notizkarten können nur Objekte ohne + <string name="TooltipEmail"> + Klicken, um eine E-Mail zu verfassen + </string> + <string name="SLurlLabelTeleport"> + Teleportieren nach + </string> + <string name="SLurlLabelShowOnMap"> + Karte anzeigen für + </string> + <string name="SLappAgentMute"> + Stummschalten + </string> + <string name="SLappAgentUnmute"> + Stummschaltung aufheben + </string> + <string name="SLappAgentIM"> + IM + </string> + <string name="SLappAgentPay"> + Bezahlen + </string> + <string name="SLappAgentOfferTeleport"> + Teleportangebot an + </string> + <string name="SLappAgentRequestFriend"> + Freundschaftsangebot + </string> + <string name="SLappAgentRemoveFriend"> + Entfernen von Freunden + </string> + <string name="BUTTON_CLOSE_DARWIN"> + Schließen (⌘W) + </string> + <string name="BUTTON_CLOSE_WIN"> + Schließen (Strg+W) + </string> + <string name="BUTTON_CLOSE_CHROME"> + Schließen + </string> + <string name="BUTTON_RESTORE"> + Wiederherstellen + </string> + <string name="BUTTON_MINIMIZE"> + Minimieren + </string> + <string name="BUTTON_TEAR_OFF"> + Abnehmen + </string> + <string name="BUTTON_DOCK"> + Andocken + </string> + <string name="BUTTON_HELP"> + Hilfe anzeigen + </string> + <string name="TooltipNotecardNotAllowedTypeDrop"> + Objekte dieses Typs können nicht an Notizkarten +für diese Region angehängt werden. + </string> + <string name="TooltipNotecardOwnerRestrictedDrop"> + An Notizkarten können nur Objekte ohne Berechtigungseinschränkungen für den -nächsten Eigentümer angehängt werden.</string> - <string name="Searching">Suchen...</string> - <string name="NoneFound">Nicht gefunden.</string> - <string name="RetrievingData">Laden...</string> - <string name="ReleaseNotes">Versionshinweise</string> - <string name="RELEASE_NOTES_BASE_URL">https://megapahit.net/</string> - <string name="LoadingData">Wird geladen...</string> - <string name="AvatarNameNobody">(niemand)</string> - <string name="AvatarNameWaiting">(wartet)</string> - <string name="AvatarNameMultiple">(mehrere)</string> - <string name="GroupNameNone">(keiner)</string> - <string name="AssetErrorNone">Kein Fehler</string> - <string name="AssetErrorRequestFailed">Asset-Anforderung: fehlgeschlagen</string> - <string name="AssetErrorNonexistentFile">Asset-Anforderung: Datei existiert nicht</string> - <string name="AssetErrorNotInDatabase">Asset-Anforderung: Asset in Datenbank nicht gefunden</string> - <string name="AssetErrorEOF">Ende der Datei</string> - <string name="AssetErrorCannotOpenFile">Datei kann nicht geöffnet werden</string> - <string name="AssetErrorFileNotFound">Datei nicht gefunden</string> - <string name="AssetErrorTCPTimeout">Zeitüberschreitung bei Dateiübertragung</string> - <string name="AssetErrorCircuitGone">Verbindung verloren</string> - <string name="AssetErrorPriceMismatch">Viewer und Server sind sich nicht über Preis einig</string> - <string name="AssetErrorUnknownStatus">Status unbekannt</string> - <string name="AssetUploadServerUnreacheble">Dienst nicht verfügbar.</string> - <string name="AssetUploadServerDifficulties">Auf dem Server sind unerwartete Probleme aufgetreten.</string> - <string name="AssetUploadServerUnavaliable">Dienst nicht verfügbar oder Zeitüberschreitung beim Upload.</string> - <string name="AssetUploadRequestInvalid">Fehler bei der Upload-Anforderung. Um das Problem zu lösen, -besuchen Sie bitte http://secondlife.com/support</string> - <string name="SettingValidationError">Validierung für das Importieren der Einstellungen [NAME] fehlgeschlagen</string> - <string name="SettingImportFileError">[FILE] konnte nicht geöffnet werden</string> - <string name="SettingParseFileError">[FILE] konnte nicht geöffnet werden</string> - <string name="SettingTranslateError">Altes Windlight [NAME] konnte nicht übernommen werden</string> - <string name="texture">Textur</string> - <string name="sound">Sound</string> - <string name="calling card">Visitenkarte</string> - <string name="landmark">Landmarke</string> - <string name="legacy script">Skript (veraltet)</string> - <string name="clothing">Kleidung</string> - <string name="object">Objekt</string> - <string name="note card">Notizkarte</string> - <string name="folder">Ordner</string> - <string name="root">Hauptverzeichnis</string> - <string name="lsl2 script">LSL2 Skript</string> - <string name="lsl bytecode">LSL Bytecode</string> - <string name="tga texture">tga-Textur</string> - <string name="body part">Körperteil</string> - <string name="snapshot">Foto</string> - <string name="lost and found">Fundbüro</string> - <string name="targa image">targa-Bild</string> - <string name="trash">Papierkorb</string> - <string name="jpeg image">jpeg-Bild</string> - <string name="animation">Animation</string> - <string name="gesture">Geste</string> - <string name="simstate">simstate</string> - <string name="favorite">Favoriten</string> - <string name="symbolic link">Link</string> - <string name="symbolic folder link">Link zu Ordner</string> - <string name="settings blob">Einstellungen</string> - <string name="mesh">mesh</string> - <string name="AvatarEditingAppearance">(Aussehen wird bearbeitet)</string> - <string name="AvatarAway">Abwesend</string> - <string name="AvatarDoNotDisturb">Nicht stören</string> - <string name="AvatarMuted">Ignoriert</string> - <string name="anim_express_afraid">Ängstlich</string> - <string name="anim_express_anger">Verärgert</string> - <string name="anim_away">Abwesend</string> - <string name="anim_backflip">Rückwärtssalto</string> - <string name="anim_express_laugh">Lachkrampf</string> - <string name="anim_express_toothsmile">Grinsen</string> - <string name="anim_blowkiss">Kusshand</string> - <string name="anim_express_bored">Gelangweilt</string> - <string name="anim_bow">Verbeugen</string> - <string name="anim_clap">Klatschen</string> - <string name="anim_courtbow">Diener</string> - <string name="anim_express_cry">Weinen</string> - <string name="anim_dance1">Tanz 1</string> - <string name="anim_dance2">Tanz 2</string> - <string name="anim_dance3">Tanz 3</string> - <string name="anim_dance4">Tanz 4</string> - <string name="anim_dance5">Tanz 5</string> - <string name="anim_dance6">Tanz 6</string> - <string name="anim_dance7">Tanz 7</string> - <string name="anim_dance8">Tanz 8</string> - <string name="anim_express_disdain">Verachten</string> - <string name="anim_drink">Trinken</string> - <string name="anim_express_embarrased">Verlegen</string> - <string name="anim_angry_fingerwag">Drohen</string> - <string name="anim_fist_pump">Faust pumpen</string> - <string name="anim_yoga_float">Yogaflieger</string> - <string name="anim_express_frown">Stirnrunzeln</string> - <string name="anim_impatient">Ungeduldig</string> - <string name="anim_jumpforjoy">Freudensprung</string> - <string name="anim_kissmybutt">LMA</string> - <string name="anim_express_kiss">Küssen</string> - <string name="anim_laugh_short">Lachen</string> - <string name="anim_musclebeach">Posen</string> - <string name="anim_no_unhappy">Nein (Bedauernd)</string> - <string name="anim_no_head">Nein</string> - <string name="anim_nyanya">Ällabätsch</string> - <string name="anim_punch_onetwo">Eins-Zwei-Punch</string> - <string name="anim_express_open_mouth">Mund offen</string> - <string name="anim_peace">Friede</string> - <string name="anim_point_you">Auf anderen zeigen</string> - <string name="anim_point_me">Auf mich zeigen</string> - <string name="anim_punch_l">Linker Haken</string> - <string name="anim_punch_r">Rechter Haken</string> - <string name="anim_rps_countdown">SSP zählen</string> - <string name="anim_rps_paper">SSP Papier</string> - <string name="anim_rps_rock">SSP Stein</string> - <string name="anim_rps_scissors">SSP Schere</string> - <string name="anim_express_repulsed">Angewidert</string> - <string name="anim_kick_roundhouse_r">Rundkick</string> - <string name="anim_express_sad">Traurig</string> - <string name="anim_salute">Salutieren</string> - <string name="anim_shout">Rufen</string> - <string name="anim_express_shrug">Schulterzucken</string> - <string name="anim_express_smile">Lächeln</string> - <string name="anim_smoke_idle">Zigarette halten</string> - <string name="anim_smoke_inhale">Rauchen</string> - <string name="anim_smoke_throw_down">Zigarette wegwerfen</string> - <string name="anim_express_surprise">Überraschung</string> - <string name="anim_sword_strike_r">Schwerthieb</string> - <string name="anim_angry_tantrum">Wutanfall</string> - <string name="anim_express_tongue_out">Zunge rausstrecken</string> - <string name="anim_hello">Winken</string> - <string name="anim_whisper">Flüstern</string> - <string name="anim_whistle">Pfeifen</string> - <string name="anim_express_wink">Zwinkern</string> - <string name="anim_wink_hollywood">Zwinkern (Hollywood)</string> - <string name="anim_express_worry">Sorgenvoll</string> - <string name="anim_yes_happy">Ja (Erfreut)</string> - <string name="anim_yes_head">Ja</string> - <string name="multiple_textures">Mehrfach</string> - <string name="use_texture">Textur verwenden</string> - <string name="manip_hint1">Zum Einrasten Mauscursor</string> - <string name="manip_hint2">über Lineal bewegen</string> - <string name="texture_loading">Wird geladen...</string> - <string name="worldmap_offline">Offline</string> - <string name="worldmap_item_tooltip_format">[PRICE] L$ für [AREA] m²</string> - <string name="worldmap_results_none_found">Nicht gefunden.</string> - <string name="Ok">OK</string> - <string name="Premature end of file">Unvollständige Datei</string> - <string name="ST_NO_JOINT">HAUPTVERZEICHNIS oder VERBINDUNG nicht gefunden.</string> - <string name="NearbyChatTitle">Chat in der Nähe</string> - <string name="NearbyChatLabel">(Chat in der Nähe)</string> - <string name="whisper">flüstert:</string> - <string name="shout">ruft:</string> - <string name="ringing">Verbindung mit In-Welt-Voice-Chat...</string> - <string name="connected">Verbunden</string> - <string name="unavailable">Der aktuelle Standort unterstützt keine Voice-Kommunikation</string> - <string name="hang_up">Verbindung mit In-Welt-Voice-Chat getrennt</string> - <string name="reconnect_nearby">Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden</string> - <string name="ScriptQuestionCautionChatGranted">Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung erteilt: [PERMISSIONS].</string> - <string name="ScriptQuestionCautionChatDenied">Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung verweigert: [PERMISSIONS].</string> - <string name="AdditionalPermissionsRequestHeader">Wenn Sie dem Objekt Zugriff auf Ihr Konto gewähren, kann dieses außerdem:</string> - <string name="ScriptTakeMoney">Linden-Dollar (L$) von Ihnen nehmen</string> - <string name="ActOnControlInputs">Steuerung festlegen</string> - <string name="RemapControlInputs">Steuerung neu zuweisen</string> - <string name="AnimateYourAvatar">Avatar animieren</string> - <string name="AttachToYourAvatar">An Avatar anhängen</string> - <string name="ReleaseOwnership">Eigentum aufgeben und öffentlich machen</string> - <string name="LinkAndDelink">Mit Objekten verknüpfen und davon trennen</string> - <string name="AddAndRemoveJoints">Verbindungen zu anderen Objekten hinzufügen und entfernen</string> - <string name="ChangePermissions">Berechtigungen ändern</string> - <string name="TrackYourCamera">Kameraverfolgung</string> - <string name="ControlYourCamera">Kamerasteuerung</string> - <string name="TeleportYourAgent">Sie teleportieren</string> - <string name="ForceSitAvatar">Ihren Avatar zwingen, sich zu setzen</string> - <string name="ChangeEnvSettings">Umgebungseinstellungen ändern</string> - <string name="NotConnected">Nicht verbunden</string> - <string name="AgentNameSubst">(Sie)</string> +nächsten Eigentümer angehängt werden. + </string> + <string name="Searching"> + Suchen... + </string> + <string name="NoneFound"> + Nicht gefunden. + </string> + <string name="RetrievingData"> + Laden... + </string> + <string name="ReleaseNotes"> + Versionshinweise + </string> + <string name="RELEASE_NOTES_BASE_URL"> + https://megapahit.net/ + </string> + <string name="LoadingData"> + Wird geladen... + </string> + <string name="AvatarNameNobody"> + (niemand) + </string> + <string name="AvatarNameWaiting"> + (wartet) + </string> + <string name="AvatarNameMultiple"> + (mehrere) + </string> + <string name="GroupNameNone"> + (keiner) + </string> + <string name="AssetErrorNone"> + Kein Fehler + </string> + <string name="AssetErrorRequestFailed"> + Asset-Anforderung: fehlgeschlagen + </string> + <string name="AssetErrorNonexistentFile"> + Asset-Anforderung: Datei existiert nicht + </string> + <string name="AssetErrorNotInDatabase"> + Asset-Anforderung: Asset in Datenbank nicht gefunden + </string> + <string name="AssetErrorEOF"> + Ende der Datei + </string> + <string name="AssetErrorCannotOpenFile"> + Datei kann nicht geöffnet werden + </string> + <string name="AssetErrorFileNotFound"> + Datei nicht gefunden + </string> + <string name="AssetErrorTCPTimeout"> + Zeitüberschreitung bei Dateiübertragung + </string> + <string name="AssetErrorCircuitGone"> + Verbindung verloren + </string> + <string name="AssetErrorPriceMismatch"> + Viewer und Server sind sich nicht über Preis einig + </string> + <string name="AssetErrorUnknownStatus"> + Status unbekannt + </string> + <string name="AssetUploadServerUnreacheble"> + Dienst nicht verfügbar. + </string> + <string name="AssetUploadServerDifficulties"> + Auf dem Server sind unerwartete Probleme aufgetreten. + </string> + <string name="AssetUploadServerUnavaliable"> + Dienst nicht verfügbar oder Zeitüberschreitung beim Upload. + </string> + <string name="AssetUploadRequestInvalid"> + Fehler bei der Upload-Anforderung. Um das Problem zu lösen, +besuchen Sie bitte http://secondlife.com/support + </string> + <string name="SettingValidationError"> + Validierung für das Importieren der Einstellungen [NAME] fehlgeschlagen + </string> + <string name="SettingImportFileError"> + [FILE] konnte nicht geöffnet werden + </string> + <string name="SettingParseFileError"> + [FILE] konnte nicht geöffnet werden + </string> + <string name="SettingTranslateError"> + Altes Windlight [NAME] konnte nicht übernommen werden + </string> + <string name="texture"> + Textur + </string> + <string name="sound"> + Sound + </string> + <string name="calling card"> + Visitenkarte + </string> + <string name="landmark"> + Landmarke + </string> + <string name="legacy script"> + Skript (veraltet) + </string> + <string name="clothing"> + Kleidung + </string> + <string name="object"> + Objekt + </string> + <string name="note card"> + Notizkarte + </string> + <string name="folder"> + Ordner + </string> + <string name="root"> + Hauptverzeichnis + </string> + <string name="lsl2 script"> + LSL2 Skript + </string> + <string name="lsl bytecode"> + LSL Bytecode + </string> + <string name="tga texture"> + tga-Textur + </string> + <string name="body part"> + Körperteil + </string> + <string name="snapshot"> + Foto + </string> + <string name="lost and found"> + Fundbüro + </string> + <string name="targa image"> + targa-Bild + </string> + <string name="trash"> + Papierkorb + </string> + <string name="jpeg image"> + jpeg-Bild + </string> + <string name="animation"> + Animation + </string> + <string name="gesture"> + Geste + </string> + <string name="simstate"> + simstate + </string> + <string name="favorite"> + Favoriten + </string> + <string name="symbolic link"> + Link + </string> + <string name="symbolic folder link"> + Link zu Ordner + </string> + <string name="settings blob"> + Einstellungen + </string> + <string name="mesh"> + mesh + </string> + <string name="AvatarEditingAppearance"> + (Aussehen wird bearbeitet) + </string> + <string name="AvatarAway"> + Abwesend + </string> + <string name="AvatarDoNotDisturb"> + Nicht stören + </string> + <string name="AvatarMuted"> + Ignoriert + </string> + <string name="anim_express_afraid"> + Ängstlich + </string> + <string name="anim_express_anger"> + Verärgert + </string> + <string name="anim_away"> + Abwesend + </string> + <string name="anim_backflip"> + Rückwärtssalto + </string> + <string name="anim_express_laugh"> + Lachkrampf + </string> + <string name="anim_express_toothsmile"> + Grinsen + </string> + <string name="anim_blowkiss"> + Kusshand + </string> + <string name="anim_express_bored"> + Gelangweilt + </string> + <string name="anim_bow"> + Verbeugen + </string> + <string name="anim_clap"> + Klatschen + </string> + <string name="anim_courtbow"> + Diener + </string> + <string name="anim_express_cry"> + Weinen + </string> + <string name="anim_dance1"> + Tanz 1 + </string> + <string name="anim_dance2"> + Tanz 2 + </string> + <string name="anim_dance3"> + Tanz 3 + </string> + <string name="anim_dance4"> + Tanz 4 + </string> + <string name="anim_dance5"> + Tanz 5 + </string> + <string name="anim_dance6"> + Tanz 6 + </string> + <string name="anim_dance7"> + Tanz 7 + </string> + <string name="anim_dance8"> + Tanz 8 + </string> + <string name="anim_express_disdain"> + Verachten + </string> + <string name="anim_drink"> + Trinken + </string> + <string name="anim_express_embarrased"> + Verlegen + </string> + <string name="anim_angry_fingerwag"> + Drohen + </string> + <string name="anim_fist_pump"> + Faust pumpen + </string> + <string name="anim_yoga_float"> + Yogaflieger + </string> + <string name="anim_express_frown"> + Stirnrunzeln + </string> + <string name="anim_impatient"> + Ungeduldig + </string> + <string name="anim_jumpforjoy"> + Freudensprung + </string> + <string name="anim_kissmybutt"> + LMA + </string> + <string name="anim_express_kiss"> + Küssen + </string> + <string name="anim_laugh_short"> + Lachen + </string> + <string name="anim_musclebeach"> + Posen + </string> + <string name="anim_no_unhappy"> + Nein (Bedauernd) + </string> + <string name="anim_no_head"> + Nein + </string> + <string name="anim_nyanya"> + Ällabätsch + </string> + <string name="anim_punch_onetwo"> + Eins-Zwei-Punch + </string> + <string name="anim_express_open_mouth"> + Mund offen + </string> + <string name="anim_peace"> + Friede + </string> + <string name="anim_point_you"> + Auf anderen zeigen + </string> + <string name="anim_point_me"> + Auf mich zeigen + </string> + <string name="anim_punch_l"> + Linker Haken + </string> + <string name="anim_punch_r"> + Rechter Haken + </string> + <string name="anim_rps_countdown"> + SSP zählen + </string> + <string name="anim_rps_paper"> + SSP Papier + </string> + <string name="anim_rps_rock"> + SSP Stein + </string> + <string name="anim_rps_scissors"> + SSP Schere + </string> + <string name="anim_express_repulsed"> + Angewidert + </string> + <string name="anim_kick_roundhouse_r"> + Rundkick + </string> + <string name="anim_express_sad"> + Traurig + </string> + <string name="anim_salute"> + Salutieren + </string> + <string name="anim_shout"> + Rufen + </string> + <string name="anim_express_shrug"> + Schulterzucken + </string> + <string name="anim_express_smile"> + Lächeln + </string> + <string name="anim_smoke_idle"> + Zigarette halten + </string> + <string name="anim_smoke_inhale"> + Rauchen + </string> + <string name="anim_smoke_throw_down"> + Zigarette wegwerfen + </string> + <string name="anim_express_surprise"> + Überraschung + </string> + <string name="anim_sword_strike_r"> + Schwerthieb + </string> + <string name="anim_angry_tantrum"> + Wutanfall + </string> + <string name="anim_express_tongue_out"> + Zunge rausstrecken + </string> + <string name="anim_hello"> + Winken + </string> + <string name="anim_whisper"> + Flüstern + </string> + <string name="anim_whistle"> + Pfeifen + </string> + <string name="anim_express_wink"> + Zwinkern + </string> + <string name="anim_wink_hollywood"> + Zwinkern (Hollywood) + </string> + <string name="anim_express_worry"> + Sorgenvoll + </string> + <string name="anim_yes_happy"> + Ja (Erfreut) + </string> + <string name="anim_yes_head"> + Ja + </string> + <string name="multiple_textures"> + Mehrfach + </string> + <string name="use_texture"> + Textur verwenden + </string> + <string name="manip_hint1"> + Zum Einrasten Mauscursor + </string> + <string name="manip_hint2"> + über Lineal bewegen + </string> + <string name="texture_loading"> + Wird geladen... + </string> + <string name="worldmap_offline"> + Offline + </string> + <string name="worldmap_item_tooltip_format"> + [PRICE] L$ für [AREA] m² + </string> + <string name="worldmap_results_none_found"> + Nicht gefunden. + </string> + <string name="Ok"> + OK + </string> + <string name="Premature end of file"> + Unvollständige Datei + </string> + <string name="ST_NO_JOINT"> + HAUPTVERZEICHNIS oder VERBINDUNG nicht gefunden. + </string> + <string name="NearbyChatTitle"> + Chat in der Nähe + </string> + <string name="NearbyChatLabel"> + (Chat in der Nähe) + </string> + <string name="whisper"> + flüstert: + </string> + <string name="shout"> + ruft: + </string> + <string name="ringing"> + Verbindung mit In-Welt-Voice-Chat... + </string> + <string name="connected"> + Verbunden + </string> + <string name="unavailable"> + Der aktuelle Standort unterstützt keine Voice-Kommunikation + </string> + <string name="hang_up"> + Verbindung mit In-Welt-Voice-Chat getrennt + </string> + <string name="reconnect_nearby"> + Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden + </string> + <string name="ScriptQuestionCautionChatGranted"> + Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung erteilt: [PERMISSIONS]. + </string> + <string name="ScriptQuestionCautionChatDenied"> + Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung verweigert: [PERMISSIONS]. + </string> + <string name="AdditionalPermissionsRequestHeader"> + Wenn Sie dem Objekt Zugriff auf Ihr Konto gewähren, kann dieses außerdem: + </string> + <string name="ScriptTakeMoney"> + Linden-Dollar (L$) von Ihnen nehmen + </string> + <string name="ActOnControlInputs"> + Steuerung festlegen + </string> + <string name="RemapControlInputs"> + Steuerung neu zuweisen + </string> + <string name="AnimateYourAvatar"> + Avatar animieren + </string> + <string name="AttachToYourAvatar"> + An Avatar anhängen + </string> + <string name="ReleaseOwnership"> + Eigentum aufgeben und öffentlich machen + </string> + <string name="LinkAndDelink"> + Mit Objekten verknüpfen und davon trennen + </string> + <string name="AddAndRemoveJoints"> + Verbindungen zu anderen Objekten hinzufügen und entfernen + </string> + <string name="ChangePermissions"> + Berechtigungen ändern + </string> + <string name="TrackYourCamera"> + Kameraverfolgung + </string> + <string name="ControlYourCamera"> + Kamerasteuerung + </string> + <string name="TeleportYourAgent"> + Sie teleportieren + </string> + <string name="ForceSitAvatar"> + Ihren Avatar zwingen, sich zu setzen + </string> + <string name="ChangeEnvSettings"> + Umgebungseinstellungen ändern + </string> + <string name="NotConnected"> + Nicht verbunden + </string> + <string name="AgentNameSubst"> + (Sie) + </string> <string name="JoinAnExperience"/> - <string name="SilentlyManageEstateAccess">Beim Verwalten von Grundbesitzzugangslisten Warnhinweise unterdrücken</string> - <string name="OverrideYourAnimations">Ihre Standardanimationen ersetzen</string> - <string name="ScriptReturnObjects">Objekte in Ihrem Namen zurückgeben</string> - <string name="UnknownScriptPermission">(unbekannt)</string> - <string name="SIM_ACCESS_PG">Generell</string> - <string name="SIM_ACCESS_MATURE">Moderat</string> - <string name="SIM_ACCESS_ADULT">Adult</string> - <string name="SIM_ACCESS_DOWN">Offline</string> - <string name="SIM_ACCESS_MIN">Unbekannt</string> - <string name="land_type_unknown">(unbekannt)</string> - <string name="Estate / Full Region">Grundstück / Vollständige Region</string> - <string name="Estate / Homestead">Grundbesitz/Homestead</string> - <string name="Mainland / Homestead">Mainland/Homestead</string> - <string name="Mainland / Full Region">Mainland / Vollständige Region</string> - <string name="all_files">Alle Dateien</string> - <string name="sound_files">Sounds</string> - <string name="animation_files">Animationen</string> - <string name="image_files">Bilder</string> - <string name="save_file_verb">Speichern</string> - <string name="load_file_verb">Laden</string> - <string name="targa_image_files">Targa-Bilder</string> - <string name="bitmap_image_files">Bitmap-Bilder</string> - <string name="png_image_files">PNG-Bilder</string> - <string name="save_texture_image_files">Targa- oder PNG-Bilder</string> - <string name="avi_movie_file">AVI-Filmdatei</string> - <string name="xaf_animation_file">XAF Anim-Datei</string> - <string name="xml_file">XML-Datei</string> - <string name="raw_file">RAW-Datei</string> - <string name="compressed_image_files">Komprimierte Bilder</string> - <string name="load_files">Dateien laden</string> - <string name="choose_the_directory">Verzeichnis auswählen</string> - <string name="script_files">Skripts</string> - <string name="dictionary_files">Wörterbücher</string> - <string name="shape">Form</string> - <string name="skin">Haut</string> - <string name="hair">Haare</string> - <string name="eyes">Augen</string> - <string name="shirt">Hemd</string> - <string name="pants">Hose</string> - <string name="shoes">Schuhe</string> - <string name="socks">Socken</string> - <string name="jacket">Jacke</string> - <string name="gloves">Handschuhe</string> - <string name="undershirt">Unterhemd</string> - <string name="underpants">Unterhose</string> - <string name="skirt">Rock</string> - <string name="alpha">Alpha</string> - <string name="tattoo">Tätowierung</string> - <string name="universal">Universal</string> - <string name="physics">Physik</string> - <string name="invalid">ungültig</string> - <string name="none">keine</string> - <string name="shirt_not_worn">Hemd nicht getragen</string> - <string name="pants_not_worn">Hosen nicht getragen</string> - <string name="shoes_not_worn">Schuhe nicht getragen</string> - <string name="socks_not_worn">Socken nicht getragen</string> - <string name="jacket_not_worn">Jacke nicht getragen</string> - <string name="gloves_not_worn">Handschuhe nicht getragen</string> - <string name="undershirt_not_worn">Unterhemd nicht getragen</string> - <string name="underpants_not_worn">Unterhose nicht getragen</string> - <string name="skirt_not_worn">Rock nicht getragen</string> - <string name="alpha_not_worn">Alpha nicht getragen</string> - <string name="tattoo_not_worn">Tätowierung nicht getragen</string> - <string name="universal_not_worn">Universal nicht getragen</string> - <string name="physics_not_worn">Physik nicht getragen</string> - <string name="invalid_not_worn">ungültig</string> - <string name="create_new_shape">Neue Form/Gestalt erstellen</string> - <string name="create_new_skin">Neue Haut erstellen</string> - <string name="create_new_hair">Neue Haare erstellen</string> - <string name="create_new_eyes">Neue Augen erstellen</string> - <string name="create_new_shirt">Neues Hemd erstellen</string> - <string name="create_new_pants">Neue Hose erstellen</string> - <string name="create_new_shoes">Neue Schuhe erstellen</string> - <string name="create_new_socks">Neue Socken erstellen</string> - <string name="create_new_jacket">Neue Jacke erstellen</string> - <string name="create_new_gloves">Neue Handschuhe erstellen</string> - <string name="create_new_undershirt">Neues Unterhemd erstellen</string> - <string name="create_new_underpants">Neue Unterhose erstellen</string> - <string name="create_new_skirt">Neuer Rock erstellen</string> - <string name="create_new_alpha">Neue Alpha erstellen</string> - <string name="create_new_tattoo">Neue Tätowierung erstellen</string> - <string name="create_new_universal">Neues Universal erstellen</string> - <string name="create_new_physics">Neue Physik erstellen</string> - <string name="create_new_invalid">ungültig</string> - <string name="NewWearable">Neue/r/s [WEARABLE_ITEM]</string> - <string name="next">Weiter</string> - <string name="ok">OK</string> - <string name="GroupNotifyGroupNotice">Gruppenmitteilung</string> - <string name="GroupNotifyGroupNotices">Gruppenmitteilungen</string> - <string name="GroupNotifySentBy">Gesendet von</string> - <string name="GroupNotifyAttached">Im Anhang:</string> - <string name="GroupNotifyViewPastNotices">Alte Mitteilungen anzeigen oder hier Auswahl treffen, um keine Mitteilungen mehr zu erhalten.</string> - <string name="GroupNotifyOpenAttachment">Anlage öffnen</string> - <string name="GroupNotifySaveAttachment">Siehe Anhang</string> - <string name="TeleportOffer">Teleport-Angebot</string> - <string name="StartUpNotifications">Sie haben neue Benachrichtigungen erhalten, während Sie abwesend waren.</string> - <string name="OverflowInfoChannelString">Sie haben noch %d weitere Benachrichtigungen</string> - <string name="BodyPartsRightArm">Rechter Arm</string> - <string name="BodyPartsHead">Kopf</string> - <string name="BodyPartsLeftArm">Linker Arm</string> - <string name="BodyPartsLeftLeg">Linkes Bein</string> - <string name="BodyPartsTorso">Oberkörper</string> - <string name="BodyPartsRightLeg">Rechtes Bein</string> - <string name="BodyPartsEnhancedSkeleton">Erweitertes Skelett</string> - <string name="GraphicsQualityLow">Niedrig</string> - <string name="GraphicsQualityMid">Mittel</string> - <string name="GraphicsQualityHigh">Hoch</string> - <string name="LeaveMouselook">ESC drücken, um zur Normalansicht zurückzukehren</string> - <string name="InventoryNoMatchingItems">Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/all/[SEARCH_TERM] Suche].</string> - <string name="InventoryNoMatchingRecentItems">Sie haben nicht das Richtige gefunden? Versuchen Sie [secondlife:///app/inventory/filters Show filters].</string> - <string name="PlacesNoMatchingItems">Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/places/[SEARCH_TERM] Suche].</string> - <string name="FavoritesNoMatchingItems">Landmarke hier hin ziehen, um diese hinzuzufügen.</string> - <string name="MarketplaceNoMatchingItems">Keine übereinstimmenden Objekte gefunden. Überprüfen Sie die Schreibweise des Suchbegriffs und versuchen Sie es noch einmal.</string> - <string name="InventoryNoTexture">Sie haben keine Kopie dieser Textur in Ihrem Inventar.</string> - <string name="InventoryInboxNoItems">Einkäufe aus dem Marktplatz erscheinen hier. Sie können diese dann zur Verwendung in Ihr Inventar ziehen.</string> - <string name="MarketplaceURL">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/</string> - <string name="MarketplaceURL_CreateStore">http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3</string> - <string name="MarketplaceURL_Dashboard">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard</string> - <string name="MarketplaceURL_Imports">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports</string> - <string name="MarketplaceURL_LearnMore">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more</string> - <string name="InventoryPlayAnimationTooltip">Fenster mit Spieloptionen öffnen.</string> - <string name="InventoryPlayGestureTooltip">Ausgewählte Geste inworld ausführen.</string> - <string name="InventoryPlaySoundTooltip">Fenster mit Spieloptionen öffnen.</string> - <string name="InventoryOutboxNotMerchantTitle">Jeder kann Artikel im Marktplatz verkaufen.</string> + <string name="SilentlyManageEstateAccess"> + Beim Verwalten von Grundbesitzzugangslisten Warnhinweise unterdrücken + </string> + <string name="OverrideYourAnimations"> + Ihre Standardanimationen ersetzen + </string> + <string name="ScriptReturnObjects"> + Objekte in Ihrem Namen zurückgeben + </string> + <string name="UnknownScriptPermission"> + (unbekannt) + </string> + <string name="SIM_ACCESS_PG"> + Generell + </string> + <string name="SIM_ACCESS_MATURE"> + Moderat + </string> + <string name="SIM_ACCESS_ADULT"> + Adult + </string> + <string name="SIM_ACCESS_DOWN"> + Offline + </string> + <string name="SIM_ACCESS_MIN"> + Unbekannt + </string> + <string name="land_type_unknown"> + (unbekannt) + </string> + <string name="Estate / Full Region"> + Grundstück / Vollständige Region + </string> + <string name="Estate / Homestead"> + Grundbesitz/Homestead + </string> + <string name="Mainland / Homestead"> + Mainland/Homestead + </string> + <string name="Mainland / Full Region"> + Mainland / Vollständige Region + </string> + <string name="all_files"> + Alle Dateien + </string> + <string name="sound_files"> + Sounds + </string> + <string name="animation_files"> + Animationen + </string> + <string name="image_files"> + Bilder + </string> + <string name="save_file_verb"> + Speichern + </string> + <string name="load_file_verb"> + Laden + </string> + <string name="targa_image_files"> + Targa-Bilder + </string> + <string name="bitmap_image_files"> + Bitmap-Bilder + </string> + <string name="png_image_files"> + PNG-Bilder + </string> + <string name="save_texture_image_files"> + Targa- oder PNG-Bilder + </string> + <string name="avi_movie_file"> + AVI-Filmdatei + </string> + <string name="xaf_animation_file"> + XAF Anim-Datei + </string> + <string name="xml_file"> + XML-Datei + </string> + <string name="raw_file"> + RAW-Datei + </string> + <string name="compressed_image_files"> + Komprimierte Bilder + </string> + <string name="load_files"> + Dateien laden + </string> + <string name="choose_the_directory"> + Verzeichnis auswählen + </string> + <string name="script_files"> + Skripts + </string> + <string name="dictionary_files"> + Wörterbücher + </string> + <string name="shape"> + Form + </string> + <string name="skin"> + Haut + </string> + <string name="hair"> + Haare + </string> + <string name="eyes"> + Augen + </string> + <string name="shirt"> + Hemd + </string> + <string name="pants"> + Hose + </string> + <string name="shoes"> + Schuhe + </string> + <string name="socks"> + Socken + </string> + <string name="jacket"> + Jacke + </string> + <string name="gloves"> + Handschuhe + </string> + <string name="undershirt"> + Unterhemd + </string> + <string name="underpants"> + Unterhose + </string> + <string name="skirt"> + Rock + </string> + <string name="alpha"> + Alpha + </string> + <string name="tattoo"> + Tätowierung + </string> + <string name="universal"> + Universal + </string> + <string name="physics"> + Physik + </string> + <string name="invalid"> + ungültig + </string> + <string name="none"> + keine + </string> + <string name="shirt_not_worn"> + Hemd nicht getragen + </string> + <string name="pants_not_worn"> + Hosen nicht getragen + </string> + <string name="shoes_not_worn"> + Schuhe nicht getragen + </string> + <string name="socks_not_worn"> + Socken nicht getragen + </string> + <string name="jacket_not_worn"> + Jacke nicht getragen + </string> + <string name="gloves_not_worn"> + Handschuhe nicht getragen + </string> + <string name="undershirt_not_worn"> + Unterhemd nicht getragen + </string> + <string name="underpants_not_worn"> + Unterhose nicht getragen + </string> + <string name="skirt_not_worn"> + Rock nicht getragen + </string> + <string name="alpha_not_worn"> + Alpha nicht getragen + </string> + <string name="tattoo_not_worn"> + Tätowierung nicht getragen + </string> + <string name="universal_not_worn"> + Universal nicht getragen + </string> + <string name="physics_not_worn"> + Physik nicht getragen + </string> + <string name="invalid_not_worn"> + ungültig + </string> + <string name="create_new_shape"> + Neue Form/Gestalt erstellen + </string> + <string name="create_new_skin"> + Neue Haut erstellen + </string> + <string name="create_new_hair"> + Neue Haare erstellen + </string> + <string name="create_new_eyes"> + Neue Augen erstellen + </string> + <string name="create_new_shirt"> + Neues Hemd erstellen + </string> + <string name="create_new_pants"> + Neue Hose erstellen + </string> + <string name="create_new_shoes"> + Neue Schuhe erstellen + </string> + <string name="create_new_socks"> + Neue Socken erstellen + </string> + <string name="create_new_jacket"> + Neue Jacke erstellen + </string> + <string name="create_new_gloves"> + Neue Handschuhe erstellen + </string> + <string name="create_new_undershirt"> + Neues Unterhemd erstellen + </string> + <string name="create_new_underpants"> + Neue Unterhose erstellen + </string> + <string name="create_new_skirt"> + Neuer Rock erstellen + </string> + <string name="create_new_alpha"> + Neue Alpha erstellen + </string> + <string name="create_new_tattoo"> + Neue Tätowierung erstellen + </string> + <string name="create_new_universal"> + Neues Universal erstellen + </string> + <string name="create_new_physics"> + Neue Physik erstellen + </string> + <string name="create_new_invalid"> + ungültig + </string> + <string name="NewWearable"> + Neue/r/s [WEARABLE_ITEM] + </string> + <string name="next"> + Weiter + </string> + <string name="ok"> + OK + </string> + <string name="GroupNotifyGroupNotice"> + Gruppenmitteilung + </string> + <string name="GroupNotifyGroupNotices"> + Gruppenmitteilungen + </string> + <string name="GroupNotifySentBy"> + Gesendet von + </string> + <string name="GroupNotifyAttached"> + Im Anhang: + </string> + <string name="GroupNotifyViewPastNotices"> + Alte Mitteilungen anzeigen oder hier Auswahl treffen, um keine Mitteilungen mehr zu erhalten. + </string> + <string name="GroupNotifyOpenAttachment"> + Anlage öffnen + </string> + <string name="GroupNotifySaveAttachment"> + Siehe Anhang + </string> + <string name="TeleportOffer"> + Teleport-Angebot + </string> + <string name="StartUpNotifications"> + Sie haben neue Benachrichtigungen erhalten, während Sie abwesend waren. + </string> + <string name="OverflowInfoChannelString"> + Sie haben noch %d weitere Benachrichtigungen + </string> + <string name="BodyPartsRightArm"> + Rechter Arm + </string> + <string name="BodyPartsHead"> + Kopf + </string> + <string name="BodyPartsLeftArm"> + Linker Arm + </string> + <string name="BodyPartsLeftLeg"> + Linkes Bein + </string> + <string name="BodyPartsTorso"> + Oberkörper + </string> + <string name="BodyPartsRightLeg"> + Rechtes Bein + </string> + <string name="BodyPartsEnhancedSkeleton"> + Erweitertes Skelett + </string> + <string name="GraphicsQualityLow"> + Niedrig + </string> + <string name="GraphicsQualityMid"> + Mittel + </string> + <string name="GraphicsQualityHigh"> + Hoch + </string> + <string name="LeaveMouselook"> + ESC drücken, um zur Normalansicht zurückzukehren + </string> + <string name="InventoryNoMatchingItems"> + Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/all/[SEARCH_TERM] Suche]. + </string> + <string name="InventoryNoMatchingRecentItems"> + Sie haben nicht das Richtige gefunden? Versuchen Sie [secondlife:///app/inventory/filters Show filters]. + </string> + <string name="PlacesNoMatchingItems"> + Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/places/[SEARCH_TERM] Suche]. + </string> + <string name="FavoritesNoMatchingItems"> + Landmarke hier hin ziehen, um diese hinzuzufügen. + </string> + <string name="MarketplaceNoMatchingItems"> + Keine übereinstimmenden Objekte gefunden. Überprüfen Sie die Schreibweise des Suchbegriffs und versuchen Sie es noch einmal. + </string> + <string name="InventoryNoTexture"> + Sie haben keine Kopie dieser Textur in Ihrem Inventar. + </string> + <string name="InventoryInboxNoItems"> + Einkäufe aus dem Marktplatz erscheinen hier. Sie können diese dann zur Verwendung in Ihr Inventar ziehen. + </string> + <string name="MarketplaceURL"> + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ + </string> + <string name="MarketplaceURL_CreateStore"> + http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 + </string> + <string name="MarketplaceURL_Dashboard"> + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard + </string> + <string name="MarketplaceURL_Imports"> + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports + </string> + <string name="MarketplaceURL_LearnMore"> + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more + </string> + <string name="InventoryPlayAnimationTooltip"> + Fenster mit Spieloptionen öffnen. + </string> + <string name="InventoryPlayGestureTooltip"> + Ausgewählte Geste inworld ausführen. + </string> + <string name="InventoryPlaySoundTooltip"> + Fenster mit Spieloptionen öffnen. + </string> + <string name="InventoryOutboxNotMerchantTitle"> + Jeder kann Artikel im Marktplatz verkaufen. + </string> <string name="InventoryOutboxNotMerchantTooltip"/> - <string name="InventoryOutboxNotMerchant">Wenn Sie als Händler aktiv werden möchten, müssen Sie einen [[MARKETPLACE_CREATE_STORE_URL] Laden im Marktplatz erstellen].</string> - <string name="InventoryOutboxNoItemsTitle">Ihre Outbox ist leer.</string> + <string name="InventoryOutboxNotMerchant"> + Wenn Sie als Händler aktiv werden möchten, müssen Sie einen [[MARKETPLACE_CREATE_STORE_URL] Laden im Marktplatz erstellen]. + </string> + <string name="InventoryOutboxNoItemsTitle"> + Ihre Outbox ist leer. + </string> <string name="InventoryOutboxNoItemsTooltip"/> - <string name="InventoryOutboxNoItems">Ziehen Sie Ordner in dien Bereich und klicken Sie auf „In Marktplatz übertragen“, um sie im [[MARKETPLACE_DASHBOARD_URL] Marktplatz] zum Verkauf anzubieten.</string> - <string name="InventoryOutboxInitializingTitle">Marktplatz wird initialisiert.</string> - <string name="InventoryOutboxInitializing">Wir greifen auf Ihr Konto im [[MARKETPLACE_CREATE_STORE_URL] Marktplatz-Laden] zu.</string> - <string name="InventoryOutboxErrorTitle">Marktplatzfehler.</string> - <string name="InventoryOutboxError">Der [[MARKETPLACE_CREATE_STORE_URL] Marktplatz-Laden] gibt Fehler zurück.</string> - <string name="InventoryMarketplaceError">Beim Öffnen der Marktplatz-Auflistungen ist ein Fehler aufgetreten. -Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich unter http://support.secondlife.com an den Support von Second Life.</string> - <string name="InventoryMarketplaceListingsNoItemsTitle">Ihr Ordner mit Marktplatz-Auflistungen ist leer.</string> - <string name="InventoryMarketplaceListingsNoItems">Ziehen Sie Ordner in diesen Bereich, um sie im [[MARKETPLACE_DASHBOARD_URL] Marktplatz] zum Verkauf anzubieten.</string> - <string name="InventoryItemsCount">( [ITEMS_COUNT] Artikel )</string> - <string name="Marketplace Validation Warning Stock">Bestandsordner müssen in einem Versionsordner gespeichert sein</string> - <string name="Marketplace Validation Error Mixed Stock">: Fehler: Alle Objekte in einem Bestandsordner müssen kopiergeschützt und vom gleichen Typ sein.</string> - <string name="Marketplace Validation Error Subfolder In Stock">: Fehler: Bestandsordner kann keine Unterordner enthalten</string> - <string name="Marketplace Validation Warning Empty">: Warnung: Ordner enthält keine Objekte</string> - <string name="Marketplace Validation Warning Create Stock">: Warnung: Bestandsordner wird erstellt</string> - <string name="Marketplace Validation Warning Create Version">: Warnung: Versionsordner wird erstellt</string> - <string name="Marketplace Validation Warning Move">: Warnung: Objekte werden verschoben</string> - <string name="Marketplace Validation Warning Delete">: Warnung: Ordnerinhalte wurden in Bestandsordner übertragen; leerer Ordner wird entfernt</string> - <string name="Marketplace Validation Error Stock Item">: Fehler: Kopiergeschützte Objekte müssen in einem Bestandsordner gespeichert sein</string> - <string name="Marketplace Validation Warning Unwrapped Item">: Warnung: Objekte müssen in einem Versionsordner gespeichert sein</string> - <string name="Marketplace Validation Error">: Fehler:</string> - <string name="Marketplace Validation Warning">: Warnung:</string> - <string name="Marketplace Validation Error Empty Version">: Warnung: Versionsordner muss mindestens 1 Objekt enthalten</string> - <string name="Marketplace Validation Error Empty Stock">: Warnung: Bestandsordner muss mindestens 1 Objekt enthalten</string> - <string name="Marketplace Validation No Error">Keine Fehler oder Warnungen</string> - <string name="Marketplace Error None">Keine Fehler</string> - <string name="Marketplace Error Prefix">Fehler:</string> - <string name="Marketplace Error Not Merchant">Bevor Sie Artikel in den Marktplatz übertragen können, müssen Sie sich als Händler registrieren (kostenlos).</string> - <string name="Marketplace Error Not Accepted">Objekt kann nicht in diesen Ordner verschoben werden.</string> - <string name="Marketplace Error Unsellable Item">Dieses Objekt kann nicht im Marktplatz verkauft werden.</string> - <string name="MarketplaceNoID">keine Mkt-ID</string> - <string name="MarketplaceLive">aufgelistet</string> - <string name="MarketplaceActive">aktiv</string> - <string name="MarketplaceMax">max.</string> - <string name="MarketplaceStock">Bestand</string> - <string name="MarketplaceNoStock">ausverkauft</string> - <string name="MarketplaceUpdating">Aktualisierung läuft...</string> - <string name="UploadFeeInfo">Die Gebühr richtet sich nach deiner Abonnementstufe. Für höhere Stufen werden niedrigere Gebühren erhoben. [https://secondlife.com/my/account/membership.php? Mehr erfahren]</string> - <string name="Open landmarks">Wegweiser öffnen</string> - <string name="Unconstrained">Unbegrenzt</string> + <string name="InventoryOutboxNoItems"> + Ziehen Sie Ordner in dien Bereich und klicken Sie auf „In Marktplatz übertragen“, um sie im [[MARKETPLACE_DASHBOARD_URL] Marktplatz] zum Verkauf anzubieten. + </string> + <string name="InventoryOutboxInitializingTitle"> + Marktplatz wird initialisiert. + </string> + <string name="InventoryOutboxInitializing"> + Wir greifen auf Ihr Konto im [[MARKETPLACE_CREATE_STORE_URL] Marktplatz-Laden] zu. + </string> + <string name="InventoryOutboxErrorTitle"> + Marktplatzfehler. + </string> + <string name="InventoryOutboxError"> + Der [[MARKETPLACE_CREATE_STORE_URL] Marktplatz-Laden] gibt Fehler zurück. + </string> + <string name="InventoryMarketplaceError"> + Beim Öffnen der Marktplatz-Auflistungen ist ein Fehler aufgetreten. +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich unter http://support.secondlife.com an den Support von Second Life. + </string> + <string name="InventoryMarketplaceListingsNoItemsTitle"> + Ihr Ordner mit Marktplatz-Auflistungen ist leer. + </string> + <string name="InventoryMarketplaceListingsNoItems"> + Ziehen Sie Ordner in diesen Bereich, um sie im [[MARKETPLACE_DASHBOARD_URL] Marktplatz] zum Verkauf anzubieten. + </string> + <string name="InventoryItemsCount"> + ( [ITEMS_COUNT] Artikel ) + </string> + <string name="Marketplace Validation Warning Stock"> + Bestandsordner müssen in einem Versionsordner gespeichert sein + </string> + <string name="Marketplace Validation Error Mixed Stock"> + : Fehler: Alle Objekte in einem Bestandsordner müssen kopiergeschützt und vom gleichen Typ sein. + </string> + <string name="Marketplace Validation Error Subfolder In Stock"> + : Fehler: Bestandsordner kann keine Unterordner enthalten + </string> + <string name="Marketplace Validation Warning Empty"> + : Warnung: Ordner enthält keine Objekte + </string> + <string name="Marketplace Validation Warning Create Stock"> + : Warnung: Bestandsordner wird erstellt + </string> + <string name="Marketplace Validation Warning Create Version"> + : Warnung: Versionsordner wird erstellt + </string> + <string name="Marketplace Validation Warning Move"> + : Warnung: Objekte werden verschoben + </string> + <string name="Marketplace Validation Warning Delete"> + : Warnung: Ordnerinhalte wurden in Bestandsordner übertragen; leerer Ordner wird entfernt + </string> + <string name="Marketplace Validation Error Stock Item"> + : Fehler: Kopiergeschützte Objekte müssen in einem Bestandsordner gespeichert sein + </string> + <string name="Marketplace Validation Warning Unwrapped Item"> + : Warnung: Objekte müssen in einem Versionsordner gespeichert sein + </string> + <string name="Marketplace Validation Error"> + : Fehler: + </string> + <string name="Marketplace Validation Warning"> + : Warnung: + </string> + <string name="Marketplace Validation Error Empty Version"> + : Warnung: Versionsordner muss mindestens 1 Objekt enthalten + </string> + <string name="Marketplace Validation Error Empty Stock"> + : Warnung: Bestandsordner muss mindestens 1 Objekt enthalten + </string> + <string name="Marketplace Validation No Error"> + Keine Fehler oder Warnungen + </string> + <string name="Marketplace Error None"> + Keine Fehler + </string> + <string name="Marketplace Error Prefix"> + Fehler: + </string> + <string name="Marketplace Error Not Merchant"> + Bevor Sie Artikel in den Marktplatz übertragen können, müssen Sie sich als Händler registrieren (kostenlos). + </string> + <string name="Marketplace Error Not Accepted"> + Objekt kann nicht in diesen Ordner verschoben werden. + </string> + <string name="Marketplace Error Unsellable Item"> + Dieses Objekt kann nicht im Marktplatz verkauft werden. + </string> + <string name="MarketplaceNoID"> + keine Mkt-ID + </string> + <string name="MarketplaceLive"> + aufgelistet + </string> + <string name="MarketplaceActive"> + aktiv + </string> + <string name="MarketplaceMax"> + max. + </string> + <string name="MarketplaceStock"> + Bestand + </string> + <string name="MarketplaceNoStock"> + ausverkauft + </string> + <string name="MarketplaceUpdating"> + Aktualisierung läuft... + </string> + <string name="UploadFeeInfo"> + Die Gebühr richtet sich nach deiner Abonnementstufe. Für höhere Stufen werden niedrigere Gebühren erhoben. [https://secondlife.com/my/account/membership.php? Mehr erfahren] + </string> + <string name="Open landmarks"> + Wegweiser öffnen + </string> + <string name="Unconstrained"> + Unbegrenzt + </string> <string name="no_transfer" value=" (kein Transferieren)"/> <string name="no_modify" value=" (kein Bearbeiten)"/> <string name="no_copy" value=" (kein Kopieren)"/> <string name="worn" value=" (getragen)"/> <string name="link" value=" (Link)"/> <string name="broken_link" value=" (unvollständiger_Link)"/> - <string name="LoadingContents">Inhalte werden geladen...</string> - <string name="NoContents">Keine Inhalte</string> + <string name="LoadingContents"> + Inhalte werden geladen... + </string> + <string name="NoContents"> + Keine Inhalte + </string> <string name="WornOnAttachmentPoint" value=" (getragen am [ATTACHMENT_POINT])"/> <string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/> <string name="ActiveGesture" value="[GESLABEL] (aktiviert)"/> - <string name="PermYes">Ja</string> - <string name="PermNo">Nein</string> + <string name="PermYes"> + Ja + </string> + <string name="PermNo"> + Nein + </string> <string name="Chat Message" value="Chat:"/> <string name="Sound" value=" Sound:"/> <string name="Wait" value=" --- Warten:"/> @@ -637,1439 +1704,4215 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich unter http://suppo <string name="Snapshots" value=" Fotos,"/> <string name="No Filters" value="Nein "/> <string name="Since Logoff" value=" - Seit Abmeldung"/> - <string name="InvFolder My Inventory">Mein Inventar</string> - <string name="InvFolder Library">Bibliothek</string> - <string name="InvFolder Textures">Texturen</string> - <string name="InvFolder Sounds">Sounds</string> - <string name="InvFolder Calling Cards">Visitenkarten</string> - <string name="InvFolder Landmarks">Landmarken</string> - <string name="InvFolder Scripts">Skripts</string> - <string name="InvFolder Clothing">Kleidung</string> - <string name="InvFolder Objects">Objekte</string> - <string name="InvFolder Notecards">Notizkarten</string> - <string name="InvFolder New Folder">Neuer Ordner</string> - <string name="InvFolder Inventory">Inventar</string> - <string name="InvFolder Uncompressed Images">Nicht-Komprimierte Bilder</string> - <string name="InvFolder Body Parts">Körperteile</string> - <string name="InvFolder Trash">Papierkorb</string> - <string name="InvFolder Photo Album">Fotoalbum</string> - <string name="InvFolder Lost And Found">Fundbüro</string> - <string name="InvFolder Uncompressed Sounds">Nicht-Komprimierte Sounds</string> - <string name="InvFolder Animations">Animationen</string> - <string name="InvFolder Gestures">Gesten</string> - <string name="InvFolder Favorite">Meine Favoriten</string> - <string name="InvFolder favorite">Meine Favoriten</string> - <string name="InvFolder Favorites">Meine Favoriten</string> - <string name="InvFolder favorites">Meine Favoriten</string> - <string name="InvFolder Current Outfit">Aktuelles Outfit</string> - <string name="InvFolder Initial Outfits">Ursprüngliche Outfits</string> - <string name="InvFolder My Outfits">Meine Outfits</string> - <string name="InvFolder Accessories">Zubehör</string> - <string name="InvFolder Meshes">Netze</string> - <string name="InvFolder Received Items">Erhaltene Artikel</string> - <string name="InvFolder Merchant Outbox">Händler-Outbox</string> - <string name="InvFolder Friends">Freunde</string> - <string name="InvFolder All">Alle</string> - <string name="no_attachments">Keine Anhänge getragen</string> - <string name="Attachments remain">Anhänge (noch [COUNT] Positionen frei)</string> - <string name="Buy">Kaufen</string> - <string name="BuyforL$">Kaufen für L$</string> - <string name="Stone">Stein</string> - <string name="Metal">Metall</string> - <string name="Glass">Glas</string> - <string name="Wood">Holz</string> - <string name="Flesh">Fleisch</string> - <string name="Plastic">Plastik</string> - <string name="Rubber">Gummi</string> - <string name="Light">Hell</string> - <string name="KBShift">Umschalt-Taste</string> - <string name="KBCtrl">Strg</string> - <string name="Chest">Brust</string> - <string name="Skull">Schädel</string> - <string name="Left Shoulder">Linke Schulter</string> - <string name="Right Shoulder">Rechte Schulter</string> - <string name="Left Hand">Linke Hand</string> - <string name="Right Hand">Rechte Hand</string> - <string name="Left Foot">Linker Fuß</string> - <string name="Right Foot">Rechter Fuß</string> - <string name="Spine">Wirbelsäule</string> - <string name="Pelvis">Becken</string> - <string name="Mouth">Mund</string> - <string name="Chin">Kinn</string> - <string name="Left Ear">Linkes Ohr</string> - <string name="Right Ear">Rechtes Ohr</string> - <string name="Left Eyeball">Linker Augapfel</string> - <string name="Right Eyeball">Rechter Augapfel</string> - <string name="Nose">Nase</string> - <string name="R Upper Arm">R Oberarm</string> - <string name="R Forearm">R Unterarm</string> - <string name="L Upper Arm">L Oberarm</string> - <string name="L Forearm">L Unterarm</string> - <string name="Right Hip">Rechte Hüfte</string> - <string name="R Upper Leg">R Oberschenkel</string> - <string name="R Lower Leg">R Unterschenkel</string> - <string name="Left Hip">Linke Hüfte</string> - <string name="L Upper Leg">L Oberschenkel</string> - <string name="L Lower Leg">L Unterschenkel</string> - <string name="Stomach">Bauch</string> - <string name="Left Pec">Linke Brust</string> - <string name="Right Pec">Rechts</string> - <string name="Neck">Hals</string> - <string name="Avatar Center">Avatar-Mitte</string> - <string name="Left Ring Finger">Linker Ringfinger</string> - <string name="Right Ring Finger">Rechter Ringfinger</string> - <string name="Tail Base">Schwanzansatz</string> - <string name="Tail Tip">Schwanzspitze</string> - <string name="Left Wing">Linker Flügel</string> - <string name="Right Wing">Rechter Flügel</string> - <string name="Jaw">Kiefer</string> - <string name="Alt Left Ear">Alt. linkes Ohr</string> - <string name="Alt Right Ear">Alt. rechtes Ohr</string> - <string name="Alt Left Eye">Alt. linkes Auge</string> - <string name="Alt Right Eye">Alt. rechtes Auge</string> - <string name="Tongue">Zunge</string> - <string name="Groin">Leiste</string> - <string name="Left Hind Foot">Linker hinterer Fuß</string> - <string name="Right Hind Foot">Rechter hinterer Fuß</string> - <string name="Invalid Attachment">Ungültige Stelle für Anhang</string> - <string name="ATTACHMENT_MISSING_ITEM">Fehler: fehlendes Objekt</string> - <string name="ATTACHMENT_MISSING_BASE_ITEM">Fehler: Basisobjekt fehlt</string> - <string name="ATTACHMENT_NOT_ATTACHED">Fehler: Objekt ist im aktuellen Outfit, aber nicht angehängt</string> - <string name="YearsMonthsOld">[AGEYEARS] [AGEMONTHS] alt</string> - <string name="YearsOld">[AGEYEARS] alt</string> - <string name="MonthsOld">[AGEMONTHS] alt</string> - <string name="WeeksOld">[AGEWEEKS] alt</string> - <string name="DaysOld">[AGEDAYS] alt</string> - <string name="TodayOld">Seit heute Mitglied</string> - <string name="av_render_everyone_now">Jetzt kann jeder Sie sehen.</string> - <string name="av_render_not_everyone">Sie sind u. U. nicht für alle Leute in Ihrer Nähe sichtbar.</string> - <string name="av_render_over_half">Sie sind u. U. für mehr als die Hälfte der Leute in Ihrer Nähe nicht sichtbar.</string> - <string name="av_render_most_of">Sie sind u. U. für die meisten Leuten in Ihrer Nähe nicht sichtbar.</string> - <string name="av_render_anyone">Sie sind u. U. für niemanden in Ihrer Nähe sichtbar.</string> - <string name="hud_description_total">Ihr HUD</string> - <string name="hud_name_with_joint">[OBJ_NAME] (getragen von [JNT_NAME])</string> - <string name="hud_render_memory_warning">[HUD_DETAILS] beansprucht viel Texturspeicher</string> - <string name="hud_render_cost_warning">[HUD_DETAILS] enthält zu viele ressourcenintensive Objekte und Texturen</string> - <string name="hud_render_heavy_textures_warning">[HUD_DETAILS] enthält viele große Texturen</string> - <string name="hud_render_cramped_warning">[HUD_DETAILS] enthält zu viele Objekte</string> - <string name="hud_render_textures_warning">[HUD_DETAILS] enthält zu viele Texturen</string> - <string name="AgeYearsA">[COUNT] Jahr</string> - <string name="AgeYearsB">[COUNT] Jahre</string> - <string name="AgeYearsC">[COUNT] Jahre</string> - <string name="AgeMonthsA">[COUNT] Monat</string> - <string name="AgeMonthsB">[COUNT] Monate</string> - <string name="AgeMonthsC">[COUNT] Monate</string> - <string name="AgeWeeksA">[COUNT] Woche</string> - <string name="AgeWeeksB">[COUNT] Wochen</string> - <string name="AgeWeeksC">[COUNT] Wochen</string> - <string name="AgeDaysA">[COUNT] Tag</string> - <string name="AgeDaysB">[COUNT] Tage</string> - <string name="AgeDaysC">[COUNT] Tage</string> - <string name="GroupMembersA">[COUNT] Mitglied</string> - <string name="GroupMembersB">[COUNT] Mitglieder</string> - <string name="GroupMembersC">[COUNT] Mitglieder</string> - <string name="AcctTypeResident">Einwohner</string> - <string name="AcctTypeTrial">Test</string> - <string name="AcctTypeCharterMember">Charta-Mitglied</string> - <string name="AcctTypeEmployee">Linden Lab-Mitarbeiter</string> - <string name="PaymentInfoUsed">Zahlungsinfo verwendet</string> - <string name="PaymentInfoOnFile">Zahlungsinfo archiviert</string> - <string name="NoPaymentInfoOnFile">Keine Zahlungsinfo archiviert</string> - <string name="AgeVerified">Altersgeprüft</string> - <string name="NotAgeVerified">Nicht altersgeprüft</string> - <string name="Center 2">Mitte 2</string> - <string name="Top Right">Oben rechts</string> - <string name="Top">Oben</string> - <string name="Top Left">Oben links</string> - <string name="Center">Mitte</string> - <string name="Bottom Left">Unten links</string> - <string name="Bottom">Unten</string> - <string name="Bottom Right">Unten rechts</string> - <string name="CompileQueueDownloadedCompiling">Heruntergeladen, wird kompiliert</string> - <string name="CompileQueueServiceUnavailable">Kein Skriptkompilierungsdienst verfügbar</string> - <string name="CompileQueueScriptNotFound">Skript wurde auf Server nicht gefunden.</string> - <string name="CompileQueueProblemDownloading">Beim Herunterladen ist ein Problem aufgetreten</string> - <string name="CompileQueueInsufficientPermDownload">Unzureichende Rechte zum Herunterladen eines Skripts.</string> - <string name="CompileQueueInsufficientPermFor">Unzureichende Berechtigungen für</string> - <string name="CompileQueueUnknownFailure">Unbekannter Fehler beim Herunterladen</string> - <string name="CompileNoExperiencePerm">Skript „[SCRIPT]“ mit Erlebnis „[EXPERIENCE]“ wird übersprungen.</string> - <string name="CompileQueueTitle">Rekompilierung</string> - <string name="CompileQueueStart">rekompilieren</string> - <string name="ResetQueueTitle">Zurücksetzen</string> - <string name="ResetQueueStart">Zurücksetzen</string> - <string name="RunQueueTitle">Skript ausführen</string> - <string name="RunQueueStart">Skript ausführen</string> - <string name="NotRunQueueTitle">Skript anhalten</string> - <string name="NotRunQueueStart">Skript anhalten</string> - <string name="CompileSuccessful">Kompilieren erfolgreich abgeschlossen!</string> - <string name="CompileSuccessfulSaving">Kompilieren erfolgreich abgeschlossen, speichern...</string> - <string name="SaveComplete">Speichervorgang abgeschlossen.</string> - <string name="UploadFailed">Datei-Upload fehlgeschlagen:</string> - <string name="ObjectOutOfRange">Skript (Objekt außerhalb des Bereichs)</string> - <string name="ScriptWasDeleted">Skript (aus Inventar gelöscht)</string> - <string name="GodToolsObjectOwnedBy">Objekt [OBJECT], Besitzer [OWNER]</string> - <string name="GroupsNone">keine</string> + <string name="InvFolder My Inventory"> + Mein Inventar + </string> + <string name="InvFolder Library"> + Bibliothek + </string> + <string name="InvFolder Textures"> + Texturen + </string> + <string name="InvFolder Sounds"> + Sounds + </string> + <string name="InvFolder Calling Cards"> + Visitenkarten + </string> + <string name="InvFolder Landmarks"> + Landmarken + </string> + <string name="InvFolder Scripts"> + Skripts + </string> + <string name="InvFolder Clothing"> + Kleidung + </string> + <string name="InvFolder Objects"> + Objekte + </string> + <string name="InvFolder Notecards"> + Notizkarten + </string> + <string name="InvFolder New Folder"> + Neuer Ordner + </string> + <string name="InvFolder Inventory"> + Inventar + </string> + <string name="InvFolder Uncompressed Images"> + Nicht-Komprimierte Bilder + </string> + <string name="InvFolder Body Parts"> + Körperteile + </string> + <string name="InvFolder Trash"> + Papierkorb + </string> + <string name="InvFolder Photo Album"> + Fotoalbum + </string> + <string name="InvFolder Lost And Found"> + Fundbüro + </string> + <string name="InvFolder Uncompressed Sounds"> + Nicht-Komprimierte Sounds + </string> + <string name="InvFolder Animations"> + Animationen + </string> + <string name="InvFolder Gestures"> + Gesten + </string> + <string name="InvFolder Favorite"> + Meine Favoriten + </string> + <string name="InvFolder favorite"> + Meine Favoriten + </string> + <string name="InvFolder Favorites"> + Meine Favoriten + </string> + <string name="InvFolder favorites"> + Meine Favoriten + </string> + <string name="InvFolder Current Outfit"> + Aktuelles Outfit + </string> + <string name="InvFolder Initial Outfits"> + Ursprüngliche Outfits + </string> + <string name="InvFolder My Outfits"> + Meine Outfits + </string> + <string name="InvFolder Accessories"> + Zubehör + </string> + <string name="InvFolder Meshes"> + Netze + </string> + <string name="InvFolder Received Items"> + Erhaltene Artikel + </string> + <string name="InvFolder Merchant Outbox"> + Händler-Outbox + </string> + <string name="InvFolder Friends"> + Freunde + </string> + <string name="InvFolder All"> + Alle + </string> + <string name="no_attachments"> + Keine Anhänge getragen + </string> + <string name="Attachments remain"> + Anhänge (noch [COUNT] Positionen frei) + </string> + <string name="Buy"> + Kaufen + </string> + <string name="BuyforL$"> + Kaufen für L$ + </string> + <string name="Stone"> + Stein + </string> + <string name="Metal"> + Metall + </string> + <string name="Glass"> + Glas + </string> + <string name="Wood"> + Holz + </string> + <string name="Flesh"> + Fleisch + </string> + <string name="Plastic"> + Plastik + </string> + <string name="Rubber"> + Gummi + </string> + <string name="Light"> + Hell + </string> + <string name="KBShift"> + Umschalt-Taste + </string> + <string name="KBCtrl"> + Strg + </string> + <string name="Chest"> + Brust + </string> + <string name="Skull"> + Schädel + </string> + <string name="Left Shoulder"> + Linke Schulter + </string> + <string name="Right Shoulder"> + Rechte Schulter + </string> + <string name="Left Hand"> + Linke Hand + </string> + <string name="Right Hand"> + Rechte Hand + </string> + <string name="Left Foot"> + Linker Fuß + </string> + <string name="Right Foot"> + Rechter Fuß + </string> + <string name="Spine"> + Wirbelsäule + </string> + <string name="Pelvis"> + Becken + </string> + <string name="Mouth"> + Mund + </string> + <string name="Chin"> + Kinn + </string> + <string name="Left Ear"> + Linkes Ohr + </string> + <string name="Right Ear"> + Rechtes Ohr + </string> + <string name="Left Eyeball"> + Linker Augapfel + </string> + <string name="Right Eyeball"> + Rechter Augapfel + </string> + <string name="Nose"> + Nase + </string> + <string name="R Upper Arm"> + R Oberarm + </string> + <string name="R Forearm"> + R Unterarm + </string> + <string name="L Upper Arm"> + L Oberarm + </string> + <string name="L Forearm"> + L Unterarm + </string> + <string name="Right Hip"> + Rechte Hüfte + </string> + <string name="R Upper Leg"> + R Oberschenkel + </string> + <string name="R Lower Leg"> + R Unterschenkel + </string> + <string name="Left Hip"> + Linke Hüfte + </string> + <string name="L Upper Leg"> + L Oberschenkel + </string> + <string name="L Lower Leg"> + L Unterschenkel + </string> + <string name="Stomach"> + Bauch + </string> + <string name="Left Pec"> + Linke Brust + </string> + <string name="Right Pec"> + Rechts + </string> + <string name="Neck"> + Hals + </string> + <string name="Avatar Center"> + Avatar-Mitte + </string> + <string name="Left Ring Finger"> + Linker Ringfinger + </string> + <string name="Right Ring Finger"> + Rechter Ringfinger + </string> + <string name="Tail Base"> + Schwanzansatz + </string> + <string name="Tail Tip"> + Schwanzspitze + </string> + <string name="Left Wing"> + Linker Flügel + </string> + <string name="Right Wing"> + Rechter Flügel + </string> + <string name="Jaw"> + Kiefer + </string> + <string name="Alt Left Ear"> + Alt. linkes Ohr + </string> + <string name="Alt Right Ear"> + Alt. rechtes Ohr + </string> + <string name="Alt Left Eye"> + Alt. linkes Auge + </string> + <string name="Alt Right Eye"> + Alt. rechtes Auge + </string> + <string name="Tongue"> + Zunge + </string> + <string name="Groin"> + Leiste + </string> + <string name="Left Hind Foot"> + Linker hinterer Fuß + </string> + <string name="Right Hind Foot"> + Rechter hinterer Fuß + </string> + <string name="Invalid Attachment"> + Ungültige Stelle für Anhang + </string> + <string name="ATTACHMENT_MISSING_ITEM"> + Fehler: fehlendes Objekt + </string> + <string name="ATTACHMENT_MISSING_BASE_ITEM"> + Fehler: Basisobjekt fehlt + </string> + <string name="ATTACHMENT_NOT_ATTACHED"> + Fehler: Objekt ist im aktuellen Outfit, aber nicht angehängt + </string> + <string name="YearsMonthsOld"> + [AGEYEARS] [AGEMONTHS] alt + </string> + <string name="YearsOld"> + [AGEYEARS] alt + </string> + <string name="MonthsOld"> + [AGEMONTHS] alt + </string> + <string name="WeeksOld"> + [AGEWEEKS] alt + </string> + <string name="DaysOld"> + [AGEDAYS] alt + </string> + <string name="TodayOld"> + Seit heute Mitglied + </string> + <string name="av_render_everyone_now"> + Jetzt kann jeder Sie sehen. + </string> + <string name="av_render_not_everyone"> + Sie sind u. U. nicht für alle Leute in Ihrer Nähe sichtbar. + </string> + <string name="av_render_over_half"> + Sie sind u. U. für mehr als die Hälfte der Leute in Ihrer Nähe nicht sichtbar. + </string> + <string name="av_render_most_of"> + Sie sind u. U. für die meisten Leuten in Ihrer Nähe nicht sichtbar. + </string> + <string name="av_render_anyone"> + Sie sind u. U. für niemanden in Ihrer Nähe sichtbar. + </string> + <string name="hud_description_total"> + Ihr HUD + </string> + <string name="hud_name_with_joint"> + [OBJ_NAME] (getragen von [JNT_NAME]) + </string> + <string name="hud_render_memory_warning"> + [HUD_DETAILS] beansprucht viel Texturspeicher + </string> + <string name="hud_render_cost_warning"> + [HUD_DETAILS] enthält zu viele ressourcenintensive Objekte und Texturen + </string> + <string name="hud_render_heavy_textures_warning"> + [HUD_DETAILS] enthält viele große Texturen + </string> + <string name="hud_render_cramped_warning"> + [HUD_DETAILS] enthält zu viele Objekte + </string> + <string name="hud_render_textures_warning"> + [HUD_DETAILS] enthält zu viele Texturen + </string> + <string name="AgeYearsA"> + [COUNT] Jahr + </string> + <string name="AgeYearsB"> + [COUNT] Jahre + </string> + <string name="AgeYearsC"> + [COUNT] Jahre + </string> + <string name="AgeMonthsA"> + [COUNT] Monat + </string> + <string name="AgeMonthsB"> + [COUNT] Monate + </string> + <string name="AgeMonthsC"> + [COUNT] Monate + </string> + <string name="AgeWeeksA"> + [COUNT] Woche + </string> + <string name="AgeWeeksB"> + [COUNT] Wochen + </string> + <string name="AgeWeeksC"> + [COUNT] Wochen + </string> + <string name="AgeDaysA"> + [COUNT] Tag + </string> + <string name="AgeDaysB"> + [COUNT] Tage + </string> + <string name="AgeDaysC"> + [COUNT] Tage + </string> + <string name="GroupMembersA"> + [COUNT] Mitglied + </string> + <string name="GroupMembersB"> + [COUNT] Mitglieder + </string> + <string name="GroupMembersC"> + [COUNT] Mitglieder + </string> + <string name="AcctTypeResident"> + Einwohner + </string> + <string name="AcctTypeTrial"> + Test + </string> + <string name="AcctTypeCharterMember"> + Charta-Mitglied + </string> + <string name="AcctTypeEmployee"> + Linden Lab-Mitarbeiter + </string> + <string name="PaymentInfoUsed"> + Zahlungsinfo verwendet + </string> + <string name="PaymentInfoOnFile"> + Zahlungsinfo archiviert + </string> + <string name="NoPaymentInfoOnFile"> + Keine Zahlungsinfo archiviert + </string> + <string name="AgeVerified"> + Altersgeprüft + </string> + <string name="NotAgeVerified"> + Nicht altersgeprüft + </string> + <string name="Center 2"> + Mitte 2 + </string> + <string name="Top Right"> + Oben rechts + </string> + <string name="Top"> + Oben + </string> + <string name="Top Left"> + Oben links + </string> + <string name="Center"> + Mitte + </string> + <string name="Bottom Left"> + Unten links + </string> + <string name="Bottom"> + Unten + </string> + <string name="Bottom Right"> + Unten rechts + </string> + <string name="CompileQueueDownloadedCompiling"> + Heruntergeladen, wird kompiliert + </string> + <string name="CompileQueueServiceUnavailable"> + Kein Skriptkompilierungsdienst verfügbar + </string> + <string name="CompileQueueScriptNotFound"> + Skript wurde auf Server nicht gefunden. + </string> + <string name="CompileQueueProblemDownloading"> + Beim Herunterladen ist ein Problem aufgetreten + </string> + <string name="CompileQueueInsufficientPermDownload"> + Unzureichende Rechte zum Herunterladen eines Skripts. + </string> + <string name="CompileQueueInsufficientPermFor"> + Unzureichende Berechtigungen für + </string> + <string name="CompileQueueUnknownFailure"> + Unbekannter Fehler beim Herunterladen + </string> + <string name="CompileNoExperiencePerm"> + Skript „[SCRIPT]“ mit Erlebnis „[EXPERIENCE]“ wird übersprungen. + </string> + <string name="CompileQueueTitle"> + Rekompilierung + </string> + <string name="CompileQueueStart"> + rekompilieren + </string> + <string name="ResetQueueTitle"> + Zurücksetzen + </string> + <string name="ResetQueueStart"> + Zurücksetzen + </string> + <string name="RunQueueTitle"> + Skript ausführen + </string> + <string name="RunQueueStart"> + Skript ausführen + </string> + <string name="NotRunQueueTitle"> + Skript anhalten + </string> + <string name="NotRunQueueStart"> + Skript anhalten + </string> + <string name="CompileSuccessful"> + Kompilieren erfolgreich abgeschlossen! + </string> + <string name="CompileSuccessfulSaving"> + Kompilieren erfolgreich abgeschlossen, speichern... + </string> + <string name="SaveComplete"> + Speichervorgang abgeschlossen. + </string> + <string name="UploadFailed"> + Datei-Upload fehlgeschlagen: + </string> + <string name="ObjectOutOfRange"> + Skript (Objekt außerhalb des Bereichs) + </string> + <string name="ScriptWasDeleted"> + Skript (aus Inventar gelöscht) + </string> + <string name="GodToolsObjectOwnedBy"> + Objekt [OBJECT], Besitzer [OWNER] + </string> + <string name="GroupsNone"> + keine + </string> <string name="Group" value=" (Gruppe)"/> - <string name="Unknown">(unbekannt)</string> + <string name="Unknown"> + (unbekannt) + </string> <string name="SummaryForTheWeek" value="Zusammenfassung für diese Woche, beginnend am "/> <string name="NextStipendDay" value=". Der nächste Stipendium-Tag ist "/> - <string name="GroupPlanningDate">[mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]</string> + <string name="GroupPlanningDate"> + [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc] + </string> <string name="GroupIndividualShare" value=" Gruppenanteil Einzelanteil"/> <string name="GroupColumn" value="Gruppe"/> - <string name="Balance">Kontostand</string> - <string name="Credits">Danksagung</string> - <string name="Debits">Soll</string> - <string name="Total">Gesamtbetrag</string> - <string name="NoGroupDataFound">Für Gruppe wurden keine Gruppendaten gefunden</string> - <string name="IMParentEstate">parent estate</string> - <string name="IMMainland">Mainland</string> - <string name="IMTeen">Teen</string> - <string name="Anyone">jeder</string> - <string name="RegionInfoError">Fehler</string> - <string name="RegionInfoAllEstatesOwnedBy">alle Grundbesitze gehören [OWNER]</string> - <string name="RegionInfoAllEstatesYouOwn">alle Grundbesitze, die Sie besitzen</string> - <string name="RegionInfoAllEstatesYouManage">alle Grundbesitze, die Sie für [OWNER] verwalten</string> - <string name="RegionInfoAllowedResidents">Immer zulässig: ([ALLOWEDAGENTS], max. [MAXACCESS])</string> - <string name="RegionInfoAllowedGroups">Immer zugelassene Gruppen: ([ALLOWEDGROUPS], max. [MAXACCESS])</string> - <string name="RegionInfoBannedResidents">Immer verbannt: ([BANNEDAGENTS], max. [MAXBANNED])</string> - <string name="RegionInfoListTypeAllowedAgents">Immer zugelassen</string> - <string name="RegionInfoListTypeBannedAgents">Immer verbannt</string> - <string name="RegionInfoAllEstates">alle Grundbesitze</string> - <string name="RegionInfoManagedEstates">verwaltete Grundbesitze</string> - <string name="RegionInfoThisEstate">dieser Grundbesitz</string> - <string name="AndNMore">und [EXTRA_COUNT] weitere</string> - <string name="ScriptLimitsParcelScriptMemory">Parzellenskript-Speicher</string> - <string name="ScriptLimitsParcelsOwned">Aufgeführte Parzellen: [PARCELS]</string> - <string name="ScriptLimitsMemoryUsed">Verwendeter Speicher: [COUNT] KB von [MAX] KB; [AVAILABLE] KB verfügbar</string> - <string name="ScriptLimitsMemoryUsedSimple">Verwendeter Speicher: [COUNT] KB</string> - <string name="ScriptLimitsParcelScriptURLs">Parzelleskript-URLs</string> - <string name="ScriptLimitsURLsUsed">Verwendete URLs: [COUNT] von [MAX]; [AVAILABLE] verfügbar</string> - <string name="ScriptLimitsURLsUsedSimple">Verwendete URLs: [COUNT]</string> - <string name="ScriptLimitsRequestError">Fehler bei Informationsabruf</string> - <string name="ScriptLimitsRequestNoParcelSelected">Keine Parzellen wurden ausgewählt</string> - <string name="ScriptLimitsRequestWrongRegion">Fehler: Skriptinformationen sind nur für Ihre aktuelle Region verfügbar</string> - <string name="ScriptLimitsRequestWaiting">Informationen werden abgerufen...</string> - <string name="ScriptLimitsRequestDontOwnParcel">Sie sind nicht berechtigt, diese Parzelle zu untersuchen.</string> - <string name="SITTING_ON">sitzt auf</string> - <string name="ATTACH_CHEST">Brust</string> - <string name="ATTACH_HEAD">Schädel</string> - <string name="ATTACH_LSHOULDER">Linke Schulter</string> - <string name="ATTACH_RSHOULDER">Rechte Schulter</string> - <string name="ATTACH_LHAND">Linke Hand</string> - <string name="ATTACH_RHAND">Rechte Hand</string> - <string name="ATTACH_LFOOT">Linker Fuß</string> - <string name="ATTACH_RFOOT">Rechter Fuß</string> - <string name="ATTACH_BACK">Wirbelsäule</string> - <string name="ATTACH_PELVIS">Becken</string> - <string name="ATTACH_MOUTH">Mund</string> - <string name="ATTACH_CHIN">Kinn</string> - <string name="ATTACH_LEAR">Linkes Ohr</string> - <string name="ATTACH_REAR">Rechtes Ohr</string> - <string name="ATTACH_LEYE">Linkes Auge</string> - <string name="ATTACH_REYE">Rechtes Auge</string> - <string name="ATTACH_NOSE">Nase</string> - <string name="ATTACH_RUARM">Rechter Oberarm</string> - <string name="ATTACH_RLARM">Rechter Unterarm</string> - <string name="ATTACH_LUARM">Linker Oberarm</string> - <string name="ATTACH_LLARM">Linker Unterarm</string> - <string name="ATTACH_RHIP">Rechte Hüfte</string> - <string name="ATTACH_RULEG">Rechter Oberschenkel</string> - <string name="ATTACH_RLLEG">Rechter Unterschenkel</string> - <string name="ATTACH_LHIP">Linke Hüfte</string> - <string name="ATTACH_LULEG">Linker Oberschenkel</string> - <string name="ATTACH_LLLEG">Linker Unterschenkel</string> - <string name="ATTACH_BELLY">Bauch</string> - <string name="ATTACH_LEFT_PEC">Linke Brust</string> - <string name="ATTACH_RIGHT_PEC">Rechte Brust</string> - <string name="ATTACH_HUD_CENTER_2">HUD Mitte 2</string> - <string name="ATTACH_HUD_TOP_RIGHT">HUD oben rechts</string> - <string name="ATTACH_HUD_TOP_CENTER">HUD oben Mitte</string> - <string name="ATTACH_HUD_TOP_LEFT">HUD oben links</string> - <string name="ATTACH_HUD_CENTER_1">HUD Mitte 1</string> - <string name="ATTACH_HUD_BOTTOM_LEFT">HUD unten links</string> - <string name="ATTACH_HUD_BOTTOM">HUD unten</string> - <string name="ATTACH_HUD_BOTTOM_RIGHT">HUD unten rechts</string> - <string name="ATTACH_NECK">Hals</string> - <string name="ATTACH_AVATAR_CENTER">Avatar-Mitte</string> - <string name="ATTACH_LHAND_RING1">Linker Ringfinger</string> - <string name="ATTACH_RHAND_RING1">Rechter Ringfinger</string> - <string name="ATTACH_TAIL_BASE">Schwanzansatz</string> - <string name="ATTACH_TAIL_TIP">Schwanzspitze</string> - <string name="ATTACH_LWING">Linker Flügel</string> - <string name="ATTACH_RWING">Rechter Flügel</string> - <string name="ATTACH_FACE_JAW">Kiefer</string> - <string name="ATTACH_FACE_LEAR">Alt. linkes Ohr</string> - <string name="ATTACH_FACE_REAR">Alt. rechtes Ohr</string> - <string name="ATTACH_FACE_LEYE">Alt. linkes Auge</string> - <string name="ATTACH_FACE_REYE">Alt. rechtes Auge</string> - <string name="ATTACH_FACE_TONGUE">Zunge</string> - <string name="ATTACH_GROIN">Leiste</string> - <string name="ATTACH_HIND_LFOOT">Linker hinterer Fuß</string> - <string name="ATTACH_HIND_RFOOT">Rechter hinterer Fuß</string> - <string name="CursorPos">Zeile [LINE], Spalte [COLUMN]</string> - <string name="PanelDirCountFound">[COUNT] gefunden</string> - <string name="PanelDirTimeStr">[hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt]</string> - <string name="PanelDirEventsDateText">[mthnum,datetime,slt]/[day,datetime,slt]</string> - <string name="PanelContentsTooltip">Objektinhalt</string> - <string name="PanelContentsNewScript">Neues Skript</string> - <string name="DoNotDisturbModeResponseDefault">Dieser Einwohner hat den Nicht-stören-Modus aktiviert und wird Ihre Nachricht später sehen.</string> - <string name="MuteByName">(Nach Namen)</string> - <string name="MuteAgent">(Einwohner)</string> - <string name="MuteObject">(Objekt)</string> - <string name="MuteGroup">(Gruppe)</string> - <string name="MuteExternal">(Extern)</string> - <string name="RegionNoCovenant">Für diesen Grundbesitz liegt kein Vertrag vor.</string> - <string name="RegionNoCovenantOtherOwner">Für diesen Grundbesitz liegt kein Vertrag vor. Das Land auf diesem Grundbesitz wird vom Grundbesitzer und nicht von Linden Lab verkauft. Für Informationen zum Verkauf setzen Sie sich bitte mit dem Grundbesitzer in Verbindung.</string> + <string name="Balance"> + Kontostand + </string> + <string name="Credits"> + Danksagung + </string> + <string name="Debits"> + Soll + </string> + <string name="Total"> + Gesamtbetrag + </string> + <string name="NoGroupDataFound"> + Für Gruppe wurden keine Gruppendaten gefunden + </string> + <string name="IMParentEstate"> + parent estate + </string> + <string name="IMMainland"> + Mainland + </string> + <string name="IMTeen"> + Teen + </string> + <string name="Anyone"> + jeder + </string> + <string name="RegionInfoError"> + Fehler + </string> + <string name="RegionInfoAllEstatesOwnedBy"> + alle Grundbesitze gehören [OWNER] + </string> + <string name="RegionInfoAllEstatesYouOwn"> + alle Grundbesitze, die Sie besitzen + </string> + <string name="RegionInfoAllEstatesYouManage"> + alle Grundbesitze, die Sie für [OWNER] verwalten + </string> + <string name="RegionInfoAllowedResidents"> + Immer zulässig: ([ALLOWEDAGENTS], max. [MAXACCESS]) + </string> + <string name="RegionInfoAllowedGroups"> + Immer zugelassene Gruppen: ([ALLOWEDGROUPS], max. [MAXACCESS]) + </string> + <string name="RegionInfoBannedResidents"> + Immer verbannt: ([BANNEDAGENTS], max. [MAXBANNED]) + </string> + <string name="RegionInfoListTypeAllowedAgents"> + Immer zugelassen + </string> + <string name="RegionInfoListTypeBannedAgents"> + Immer verbannt + </string> + <string name="RegionInfoAllEstates"> + alle Grundbesitze + </string> + <string name="RegionInfoManagedEstates"> + verwaltete Grundbesitze + </string> + <string name="RegionInfoThisEstate"> + dieser Grundbesitz + </string> + <string name="AndNMore"> + und [EXTRA_COUNT] weitere + </string> + <string name="ScriptLimitsParcelScriptMemory"> + Parzellenskript-Speicher + </string> + <string name="ScriptLimitsParcelsOwned"> + Aufgeführte Parzellen: [PARCELS] + </string> + <string name="ScriptLimitsMemoryUsed"> + Verwendeter Speicher: [COUNT] KB von [MAX] KB; [AVAILABLE] KB verfügbar + </string> + <string name="ScriptLimitsMemoryUsedSimple"> + Verwendeter Speicher: [COUNT] KB + </string> + <string name="ScriptLimitsParcelScriptURLs"> + Parzelleskript-URLs + </string> + <string name="ScriptLimitsURLsUsed"> + Verwendete URLs: [COUNT] von [MAX]; [AVAILABLE] verfügbar + </string> + <string name="ScriptLimitsURLsUsedSimple"> + Verwendete URLs: [COUNT] + </string> + <string name="ScriptLimitsRequestError"> + Fehler bei Informationsabruf + </string> + <string name="ScriptLimitsRequestNoParcelSelected"> + Keine Parzellen wurden ausgewählt + </string> + <string name="ScriptLimitsRequestWrongRegion"> + Fehler: Skriptinformationen sind nur für Ihre aktuelle Region verfügbar + </string> + <string name="ScriptLimitsRequestWaiting"> + Informationen werden abgerufen... + </string> + <string name="ScriptLimitsRequestDontOwnParcel"> + Sie sind nicht berechtigt, diese Parzelle zu untersuchen. + </string> + <string name="SITTING_ON"> + sitzt auf + </string> + <string name="ATTACH_CHEST"> + Brust + </string> + <string name="ATTACH_HEAD"> + Schädel + </string> + <string name="ATTACH_LSHOULDER"> + Linke Schulter + </string> + <string name="ATTACH_RSHOULDER"> + Rechte Schulter + </string> + <string name="ATTACH_LHAND"> + Linke Hand + </string> + <string name="ATTACH_RHAND"> + Rechte Hand + </string> + <string name="ATTACH_LFOOT"> + Linker Fuß + </string> + <string name="ATTACH_RFOOT"> + Rechter Fuß + </string> + <string name="ATTACH_BACK"> + Wirbelsäule + </string> + <string name="ATTACH_PELVIS"> + Becken + </string> + <string name="ATTACH_MOUTH"> + Mund + </string> + <string name="ATTACH_CHIN"> + Kinn + </string> + <string name="ATTACH_LEAR"> + Linkes Ohr + </string> + <string name="ATTACH_REAR"> + Rechtes Ohr + </string> + <string name="ATTACH_LEYE"> + Linkes Auge + </string> + <string name="ATTACH_REYE"> + Rechtes Auge + </string> + <string name="ATTACH_NOSE"> + Nase + </string> + <string name="ATTACH_RUARM"> + Rechter Oberarm + </string> + <string name="ATTACH_RLARM"> + Rechter Unterarm + </string> + <string name="ATTACH_LUARM"> + Linker Oberarm + </string> + <string name="ATTACH_LLARM"> + Linker Unterarm + </string> + <string name="ATTACH_RHIP"> + Rechte Hüfte + </string> + <string name="ATTACH_RULEG"> + Rechter Oberschenkel + </string> + <string name="ATTACH_RLLEG"> + Rechter Unterschenkel + </string> + <string name="ATTACH_LHIP"> + Linke Hüfte + </string> + <string name="ATTACH_LULEG"> + Linker Oberschenkel + </string> + <string name="ATTACH_LLLEG"> + Linker Unterschenkel + </string> + <string name="ATTACH_BELLY"> + Bauch + </string> + <string name="ATTACH_LEFT_PEC"> + Linke Brust + </string> + <string name="ATTACH_RIGHT_PEC"> + Rechte Brust + </string> + <string name="ATTACH_HUD_CENTER_2"> + HUD Mitte 2 + </string> + <string name="ATTACH_HUD_TOP_RIGHT"> + HUD oben rechts + </string> + <string name="ATTACH_HUD_TOP_CENTER"> + HUD oben Mitte + </string> + <string name="ATTACH_HUD_TOP_LEFT"> + HUD oben links + </string> + <string name="ATTACH_HUD_CENTER_1"> + HUD Mitte 1 + </string> + <string name="ATTACH_HUD_BOTTOM_LEFT"> + HUD unten links + </string> + <string name="ATTACH_HUD_BOTTOM"> + HUD unten + </string> + <string name="ATTACH_HUD_BOTTOM_RIGHT"> + HUD unten rechts + </string> + <string name="ATTACH_NECK"> + Hals + </string> + <string name="ATTACH_AVATAR_CENTER"> + Avatar-Mitte + </string> + <string name="ATTACH_LHAND_RING1"> + Linker Ringfinger + </string> + <string name="ATTACH_RHAND_RING1"> + Rechter Ringfinger + </string> + <string name="ATTACH_TAIL_BASE"> + Schwanzansatz + </string> + <string name="ATTACH_TAIL_TIP"> + Schwanzspitze + </string> + <string name="ATTACH_LWING"> + Linker Flügel + </string> + <string name="ATTACH_RWING"> + Rechter Flügel + </string> + <string name="ATTACH_FACE_JAW"> + Kiefer + </string> + <string name="ATTACH_FACE_LEAR"> + Alt. linkes Ohr + </string> + <string name="ATTACH_FACE_REAR"> + Alt. rechtes Ohr + </string> + <string name="ATTACH_FACE_LEYE"> + Alt. linkes Auge + </string> + <string name="ATTACH_FACE_REYE"> + Alt. rechtes Auge + </string> + <string name="ATTACH_FACE_TONGUE"> + Zunge + </string> + <string name="ATTACH_GROIN"> + Leiste + </string> + <string name="ATTACH_HIND_LFOOT"> + Linker hinterer Fuß + </string> + <string name="ATTACH_HIND_RFOOT"> + Rechter hinterer Fuß + </string> + <string name="CursorPos"> + Zeile [LINE], Spalte [COLUMN] + </string> + <string name="PanelDirCountFound"> + [COUNT] gefunden + </string> + <string name="PanelDirTimeStr"> + [hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt] + </string> + <string name="PanelDirEventsDateText"> + [mthnum,datetime,slt]/[day,datetime,slt] + </string> + <string name="PanelContentsTooltip"> + Objektinhalt + </string> + <string name="PanelContentsNewScript"> + Neues Skript + </string> + <string name="DoNotDisturbModeResponseDefault"> + Dieser Einwohner hat den Nicht-stören-Modus aktiviert und wird Ihre Nachricht später sehen. + </string> + <string name="MuteByName"> + (Nach Namen) + </string> + <string name="MuteAgent"> + (Einwohner) + </string> + <string name="MuteObject"> + (Objekt) + </string> + <string name="MuteGroup"> + (Gruppe) + </string> + <string name="MuteExternal"> + (Extern) + </string> + <string name="RegionNoCovenant"> + Für diesen Grundbesitz liegt kein Vertrag vor. + </string> + <string name="RegionNoCovenantOtherOwner"> + Für diesen Grundbesitz liegt kein Vertrag vor. Das Land auf diesem Grundbesitz wird vom Grundbesitzer und nicht von Linden Lab verkauft. Für Informationen zum Verkauf setzen Sie sich bitte mit dem Grundbesitzer in Verbindung. + </string> <string name="covenant_last_modified" value="Zuletzt geändert: "/> <string name="none_text" value=" (keiner) "/> <string name="never_text" value=" (nie) "/> - <string name="GroupOwned">In Gruppenbesitz</string> - <string name="Public">Öffentlich</string> - <string name="LocalSettings">Lokale Einstellungen</string> - <string name="RegionSettings">Regionseinstellungen</string> - <string name="NoEnvironmentSettings">Diese Region unterstützt keine Umgebungseinstellungen.</string> - <string name="EnvironmentSun">Sonne</string> - <string name="EnvironmentMoon">Mond</string> - <string name="EnvironmentBloom">Bloom</string> - <string name="EnvironmentCloudNoise">Wolkenrauschen</string> - <string name="EnvironmentNormalMap">Normal-Map</string> - <string name="EnvironmentTransparent">Transparent</string> - <string name="ClassifiedClicksTxt">Klicks: [TELEPORT] teleportieren, [MAP] Karte, [PROFILE] Profil</string> - <string name="ClassifiedUpdateAfterPublish">(wird nach Veröffentlichung aktualisiert)</string> - <string name="NoPicksClassifiedsText">Sie haben keine Auswahl oder Anzeigen erstelllt. Klicken Sie auf die „Plus"-Schaltfläche, um eine Auswahl oder Anzeige zu erstellen.</string> - <string name="NoPicksText">Sie haben keine Auswahl erstellt. Klicken Sie auf die Schaltfläche "Neu", um eine Auswahl zu erstellen.</string> - <string name="NoClassifiedsText">Sie haben keine Anzeigen erstellt. Klicken Sie auf die Schaltfläche "Neu", um eine Anzeige zu erstellen.</string> - <string name="NoAvatarPicksClassifiedsText">Der Einwohner hat keine Auswahl oder Anzeigen</string> - <string name="NoAvatarPicksText">Der Einwohner hat keine Auswahl</string> - <string name="NoAvatarClassifiedsText">Der Einwohner hat keine Anzeigen</string> - <string name="PicksClassifiedsLoadingText">Wird geladen...</string> - <string name="MultiPreviewTitle">Vorschau</string> - <string name="MultiPropertiesTitle">Eigenschaften</string> - <string name="InvOfferAnObjectNamed">Ein Objekt namens</string> - <string name="InvOfferOwnedByGroup">im Besitz der Gruppe</string> - <string name="InvOfferOwnedByUnknownGroup">im Besitz einer unbekannten Gruppe</string> - <string name="InvOfferOwnedBy">im Besitz von</string> - <string name="InvOfferOwnedByUnknownUser">im Besitz eines unbekannten Einwohners</string> - <string name="InvOfferGaveYou">hat Ihnen folgendes übergeben</string> - <string name="InvOfferDecline">Sie lehnen [DESC] von <nolink>[NAME]</nolink> ab.</string> - <string name="GroupMoneyTotal">Gesamtbetrag</string> - <string name="GroupMoneyBought">gekauft</string> - <string name="GroupMoneyPaidYou">bezahlte Ihnen</string> - <string name="GroupMoneyPaidInto">bezahlte an</string> - <string name="GroupMoneyBoughtPassTo">kaufte Pass für</string> - <string name="GroupMoneyPaidFeeForEvent">bezahlte Gebühr für Event</string> - <string name="GroupMoneyPaidPrizeForEvent">bezahlte Preis für Event</string> - <string name="GroupMoneyBalance">Kontostand</string> - <string name="GroupMoneyCredits">Danksagung</string> - <string name="GroupMoneyDebits">Soll</string> - <string name="GroupMoneyDate">[weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]</string> - <string name="AcquiredItems">Erworbene Artikel</string> - <string name="Cancel">Abbrechen</string> - <string name="UploadingCosts">Das Hochladen von [NAME] kostet [AMOUNT] L$</string> - <string name="BuyingCosts">Die Kosten betragen: [AMOUNT] L$</string> - <string name="UnknownFileExtension">Unbekanntes Dateiformat .%s -Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh</string> - <string name="MuteObject2">Ignorieren</string> - <string name="MuteAvatar">Ignorieren</string> - <string name="UnmuteObject">Freischalten</string> - <string name="UnmuteAvatar">Freischalten</string> - <string name="AddLandmarkNavBarMenu">Zu meinen Landmarken hinzufügen...</string> - <string name="EditLandmarkNavBarMenu">Meine Landmarken bearbeiten...</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">Strg+</string> - <string name="accel-win-alt">Alt+</string> - <string name="accel-win-shift">Umschalt+</string> - <string name="FileSaved">Datei wurde gespeichert</string> - <string name="Receiving">Daten werden empfangen</string> - <string name="AM">Uhr</string> - <string name="PM">Uhr</string> - <string name="PST">PST</string> - <string name="PDT">PDT</string> - <string name="Direction_Forward">Vorwärts</string> - <string name="Direction_Left">Links</string> - <string name="Direction_Right">Rechts</string> - <string name="Direction_Back">Zurück</string> - <string name="Direction_North">Norden</string> - <string name="Direction_South">Süden</string> - <string name="Direction_West">Westen</string> - <string name="Direction_East">Osten</string> - <string name="Direction_Up">Nach oben</string> - <string name="Direction_Down">Nach unten</string> - <string name="Any Category">Alle Kategorien</string> - <string name="Shopping">Shopping</string> - <string name="Land Rental">Land mieten</string> - <string name="Property Rental">Immobilie mieten</string> - <string name="Special Attraction">Attraktionen</string> - <string name="New Products">Neue Produkte</string> - <string name="Employment">Stellenangebote</string> - <string name="Wanted">Gesucht</string> - <string name="Service">Dienstleistungen</string> - <string name="Personal">Sonstiges</string> - <string name="None">Keiner</string> - <string name="Linden Location">Lindenort</string> - <string name="Adult">Adult</string> - <string name="Arts&Culture">Kunst & Kultur</string> - <string name="Business">Firmen</string> - <string name="Educational">Bildung</string> - <string name="Gaming">Spielen</string> - <string name="Hangout">Treffpunkt</string> - <string name="Newcomer Friendly">Anfängergerecht</string> - <string name="Parks&Nature">Parks und Natur</string> - <string name="Residential">Wohngebiet</string> - <string name="Stage">Phase</string> - <string name="Other">Sonstige</string> - <string name="Rental">Vermietung</string> - <string name="Any">Alle</string> - <string name="You">Sie</string> - <string name=":">:</string> - <string name=",">,</string> - <string name="...">...</string> - <string name="***">***</string> - <string name="(">(</string> - <string name=")">)</string> - <string name=".">.</string> - <string name="'">'</string> - <string name="---">---</string> - <string name="Multiple Media">Mehrere Medien</string> - <string name="Play Media">Medien Abspielen/Pausieren</string> - <string name="IntelDriverPage">http://www.intel.com/p/en_US/support/detect/graphics</string> - <string name="NvidiaDriverPage">http://www.nvidia.com/Download/index.aspx?lang=de-de</string> - <string name="AMDDriverPage">http://support.amd.com/de/Pages/AMDSupportHub.aspx</string> - <string name="MBCmdLineError">Beim Parsen der Befehlszeile wurde ein Fehler festgestellt. + <string name="GroupOwned"> + In Gruppenbesitz + </string> + <string name="Public"> + Öffentlich + </string> + <string name="LocalSettings"> + Lokale Einstellungen + </string> + <string name="RegionSettings"> + Regionseinstellungen + </string> + <string name="NoEnvironmentSettings"> + Diese Region unterstützt keine Umgebungseinstellungen. + </string> + <string name="EnvironmentSun"> + Sonne + </string> + <string name="EnvironmentMoon"> + Mond + </string> + <string name="EnvironmentBloom"> + Bloom + </string> + <string name="EnvironmentCloudNoise"> + Wolkenrauschen + </string> + <string name="EnvironmentNormalMap"> + Normal-Map + </string> + <string name="EnvironmentTransparent"> + Transparent + </string> + <string name="ClassifiedClicksTxt"> + Klicks: [TELEPORT] teleportieren, [MAP] Karte, [PROFILE] Profil + </string> + <string name="ClassifiedUpdateAfterPublish"> + (wird nach Veröffentlichung aktualisiert) + </string> + <string name="NoPicksClassifiedsText"> + Sie haben keine Auswahl oder Anzeigen erstelllt. Klicken Sie auf die „Plus"-Schaltfläche, um eine Auswahl oder Anzeige zu erstellen. + </string> + <string name="NoPicksText"> + Sie haben keine Auswahl erstellt. Klicken Sie auf die Schaltfläche "Neu", um eine Auswahl zu erstellen. + </string> + <string name="NoClassifiedsText"> + Sie haben keine Anzeigen erstellt. Klicken Sie auf die Schaltfläche "Neu", um eine Anzeige zu erstellen. + </string> + <string name="NoAvatarPicksClassifiedsText"> + Der Einwohner hat keine Auswahl oder Anzeigen + </string> + <string name="NoAvatarPicksText"> + Der Einwohner hat keine Auswahl + </string> + <string name="NoAvatarClassifiedsText"> + Der Einwohner hat keine Anzeigen + </string> + <string name="PicksClassifiedsLoadingText"> + Wird geladen... + </string> + <string name="MultiPreviewTitle"> + Vorschau + </string> + <string name="MultiPropertiesTitle"> + Eigenschaften + </string> + <string name="InvOfferAnObjectNamed"> + Ein Objekt namens + </string> + <string name="InvOfferOwnedByGroup"> + im Besitz der Gruppe + </string> + <string name="InvOfferOwnedByUnknownGroup"> + im Besitz einer unbekannten Gruppe + </string> + <string name="InvOfferOwnedBy"> + im Besitz von + </string> + <string name="InvOfferOwnedByUnknownUser"> + im Besitz eines unbekannten Einwohners + </string> + <string name="InvOfferGaveYou"> + hat Ihnen folgendes übergeben + </string> + <string name="InvOfferDecline"> + Sie lehnen [DESC] von <nolink>[NAME]</nolink> ab. + </string> + <string name="GroupMoneyTotal"> + Gesamtbetrag + </string> + <string name="GroupMoneyBought"> + gekauft + </string> + <string name="GroupMoneyPaidYou"> + bezahlte Ihnen + </string> + <string name="GroupMoneyPaidInto"> + bezahlte an + </string> + <string name="GroupMoneyBoughtPassTo"> + kaufte Pass für + </string> + <string name="GroupMoneyPaidFeeForEvent"> + bezahlte Gebühr für Event + </string> + <string name="GroupMoneyPaidPrizeForEvent"> + bezahlte Preis für Event + </string> + <string name="GroupMoneyBalance"> + Kontostand + </string> + <string name="GroupMoneyCredits"> + Danksagung + </string> + <string name="GroupMoneyDebits"> + Soll + </string> + <string name="GroupMoneyDate"> + [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc] + </string> + <string name="AcquiredItems"> + Erworbene Artikel + </string> + <string name="Cancel"> + Abbrechen + </string> + <string name="UploadingCosts"> + Das Hochladen von [NAME] kostet [AMOUNT] L$ + </string> + <string name="BuyingCosts"> + Die Kosten betragen: [AMOUNT] L$ + </string> + <string name="UnknownFileExtension"> + Unbekanntes Dateiformat .%s +Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh + </string> + <string name="MuteObject2"> + Ignorieren + </string> + <string name="MuteAvatar"> + Ignorieren + </string> + <string name="UnmuteObject"> + Freischalten + </string> + <string name="UnmuteAvatar"> + Freischalten + </string> + <string name="AddLandmarkNavBarMenu"> + Zu meinen Landmarken hinzufügen... + </string> + <string name="EditLandmarkNavBarMenu"> + Meine Landmarken bearbeiten... + </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"> + Strg+ + </string> + <string name="accel-win-alt"> + Alt+ + </string> + <string name="accel-win-shift"> + Umschalt+ + </string> + <string name="FileSaved"> + Datei wurde gespeichert + </string> + <string name="Receiving"> + Daten werden empfangen + </string> + <string name="AM"> + Uhr + </string> + <string name="PM"> + Uhr + </string> + <string name="PST"> + PST + </string> + <string name="PDT"> + PDT + </string> + <string name="Direction_Forward"> + Vorwärts + </string> + <string name="Direction_Left"> + Links + </string> + <string name="Direction_Right"> + Rechts + </string> + <string name="Direction_Back"> + Zurück + </string> + <string name="Direction_North"> + Norden + </string> + <string name="Direction_South"> + Süden + </string> + <string name="Direction_West"> + Westen + </string> + <string name="Direction_East"> + Osten + </string> + <string name="Direction_Up"> + Nach oben + </string> + <string name="Direction_Down"> + Nach unten + </string> + <string name="Any Category"> + Alle Kategorien + </string> + <string name="Shopping"> + Shopping + </string> + <string name="Land Rental"> + Land mieten + </string> + <string name="Property Rental"> + Immobilie mieten + </string> + <string name="Special Attraction"> + Attraktionen + </string> + <string name="New Products"> + Neue Produkte + </string> + <string name="Employment"> + Stellenangebote + </string> + <string name="Wanted"> + Gesucht + </string> + <string name="Service"> + Dienstleistungen + </string> + <string name="Personal"> + Sonstiges + </string> + <string name="None"> + Keiner + </string> + <string name="Linden Location"> + Lindenort + </string> + <string name="Adult"> + Adult + </string> + <string name="Arts&Culture"> + Kunst & Kultur + </string> + <string name="Business"> + Firmen + </string> + <string name="Educational"> + Bildung + </string> + <string name="Gaming"> + Spielen + </string> + <string name="Hangout"> + Treffpunkt + </string> + <string name="Newcomer Friendly"> + Anfängergerecht + </string> + <string name="Parks&Nature"> + Parks und Natur + </string> + <string name="Residential"> + Wohngebiet + </string> + <string name="Stage"> + Phase + </string> + <string name="Other"> + Sonstige + </string> + <string name="Rental"> + Vermietung + </string> + <string name="Any"> + Alle + </string> + <string name="You"> + Sie + </string> + <string name=":"> + : + </string> + <string name=","> + , + </string> + <string name="..."> + ... + </string> + <string name="***"> + *** + </string> + <string name="("> + ( + </string> + <string name=")"> + ) + </string> + <string name="."> + . + </string> + <string name="'"> + ' + </string> + <string name="---"> + --- + </string> + <string name="Multiple Media"> + Mehrere Medien + </string> + <string name="Play Media"> + Medien Abspielen/Pausieren + </string> + <string name="IntelDriverPage"> + http://www.intel.com/p/en_US/support/detect/graphics + </string> + <string name="NvidiaDriverPage"> + http://www.nvidia.com/Download/index.aspx?lang=de-de + </string> + <string name="AMDDriverPage"> + http://support.amd.com/de/Pages/AMDSupportHub.aspx + </string> + <string name="MBCmdLineError"> + Beim Parsen der Befehlszeile wurde ein Fehler festgestellt. Weitere Informationen: http://wiki.secondlife.com/wiki/Client_parameters (EN) -Fehler:</string> - <string name="MBCmdLineUsg">[APP_NAME] Verwendung in Befehlszeile:</string> - <string name="MBUnableToAccessFile">[APP_NAME] kann auf die erforderliche Datei nicht zugreifen. +Fehler: + </string> + <string name="MBCmdLineUsg"> + [APP_NAME] Verwendung in Befehlszeile: + </string> + <string name="MBUnableToAccessFile"> + [APP_NAME] kann auf die erforderliche Datei nicht zugreifen. Grund hierfür ist, dass Sie entweder mehrere Instanzen gleichzeitig ausführen oder dass Ihr System denkt, eine Datei sei geöffnet. Falls diese Nachricht erneut angezeigt wird, starten Sie bitte Ihren Computer neu und probieren Sie es noch einmal. -Falls der Fehler dann weiterhin auftritt, müssen Sie [APP_NAME] von Ihrem System de-installieren und erneut installieren.</string> - <string name="MBFatalError">Unbehebbarer Fehler</string> - <string name="MBRequiresAltiVec">[APP_NAME] erfordert einen Prozessor mit AltiVec (G4 oder später).</string> - <string name="MBAlreadyRunning">[APP_NAME] läuft bereits. +Falls der Fehler dann weiterhin auftritt, müssen Sie [APP_NAME] von Ihrem System de-installieren und erneut installieren. + </string> + <string name="MBFatalError"> + Unbehebbarer Fehler + </string> + <string name="MBRequiresAltiVec"> + [APP_NAME] erfordert einen Prozessor mit AltiVec (G4 oder später). + </string> + <string name="MBAlreadyRunning"> + [APP_NAME] läuft bereits. Bitte sehen Sie in Ihrer Menüleiste nach, dort sollte ein Symbol für das Programm angezeigt werden. -Falls diese Nachricht erneut angezeigt wird, starten Sie Ihren Computer bitte neu.</string> - <string name="MBFrozenCrashed">[APP_NAME] scheint eingefroren zu sein oder ist abgestürzt. -Möchten Sie einen Absturz-Bericht einschicken?</string> - <string name="MBAlert">Benachrichtigung</string> - <string name="MBNoDirectX">[APP_NAME] kann DirectX 9.0b oder höher nicht feststellen. +Falls diese Nachricht erneut angezeigt wird, starten Sie Ihren Computer bitte neu. + </string> + <string name="MBFrozenCrashed"> + [APP_NAME] scheint eingefroren zu sein oder ist abgestürzt. +Möchten Sie einen Absturz-Bericht einschicken? + </string> + <string name="MBAlert"> + Benachrichtigung + </string> + <string name="MBNoDirectX"> + [APP_NAME] kann DirectX 9.0b oder höher nicht feststellen. [APP_NAME] verwendet DirectX, um nach Hardware und/oder veralteten Treibern zu suchen, die zu Problemen mit der Stabilität, Leistung und Abstürzen führen können. Sie können [APP_NAME] auch so ausführen, wir empfehlen jedoch, dass DirectX 9.0b vorhanden ist und ausgeführt wird. -Möchten Sie fortfahren?</string> - <string name="MBWarning">Hinweis</string> - <string name="MBNoAutoUpdate">Für Linux ist zur Zeit noch kein automatisches Aktualisieren möglich. -Bitte laden Sie die aktuellste Version von www.secondlife.com herunter.</string> - <string name="MBRegClassFailed">RegisterClass fehlgeschlagen</string> - <string name="MBError">Fehler</string> - <string name="MBFullScreenErr">Vollbildschirm mit [WIDTH] x [HEIGHT] kann nicht ausgeführt werden. -Ausführung erfolgt in Fenster.</string> - <string name="MBDestroyWinFailed">Fehler beim Herunterfahren während Fenster geschlossen wurde (DestroyWindow() fehlgeschlagen)</string> - <string name="MBShutdownErr">Fehler beim Herunterfahren</string> - <string name="MBDevContextErr">Kann keinen Kontext für GL-Gerät erstellen</string> - <string name="MBPixelFmtErr">Passendes Pixelformat wurde nicht gefunden</string> - <string name="MBPixelFmtDescErr">Beschreibung für Pixelformat nicht verfügbar</string> - <string name="MBTrueColorWindow">Um [APP_NAME] auszuführen, ist True Color (32-bit) erforderlich. -Klicken Sie öffnen Sie auf Ihrem Computer die Einstellungen für die Anzeige und stellen Sie den Bildschirm auf 32-bit Farbe ein.</string> - <string name="MBAlpha">[APP_NAME] kann nicht ausgeführt werden, da kein 8-Bit-Alpha-Kanal verfügbar ist. Dies geschieht normalerweise bei Problemen mit dem Treiber der Video-Karte. +Möchten Sie fortfahren? + </string> + <string name="MBWarning"> + Hinweis + </string> + <string name="MBNoAutoUpdate"> + Für Linux ist zur Zeit noch kein automatisches Aktualisieren möglich. +Bitte laden Sie die aktuellste Version von www.secondlife.com herunter. + </string> + <string name="MBRegClassFailed"> + RegisterClass fehlgeschlagen + </string> + <string name="MBError"> + Fehler + </string> + <string name="MBFullScreenErr"> + Vollbildschirm mit [WIDTH] x [HEIGHT] kann nicht ausgeführt werden. +Ausführung erfolgt in Fenster. + </string> + <string name="MBDestroyWinFailed"> + Fehler beim Herunterfahren während Fenster geschlossen wurde (DestroyWindow() fehlgeschlagen) + </string> + <string name="MBShutdownErr"> + Fehler beim Herunterfahren + </string> + <string name="MBDevContextErr"> + Kann keinen Kontext für GL-Gerät erstellen + </string> + <string name="MBPixelFmtErr"> + Passendes Pixelformat wurde nicht gefunden + </string> + <string name="MBPixelFmtDescErr"> + Beschreibung für Pixelformat nicht verfügbar + </string> + <string name="MBTrueColorWindow"> + Um [APP_NAME] auszuführen, ist True Color (32-bit) erforderlich. +Klicken Sie öffnen Sie auf Ihrem Computer die Einstellungen für die Anzeige und stellen Sie den Bildschirm auf 32-bit Farbe ein. + </string> + <string name="MBAlpha"> + [APP_NAME] kann nicht ausgeführt werden, da kein 8-Bit-Alpha-Kanal verfügbar ist. Dies geschieht normalerweise bei Problemen mit dem Treiber der Video-Karte. Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für Ihre Videokarte installiert haben. Vergewissern Sie sich außerdem, dass Ihr Bildschirm auf True Color (32-Bit) eingestellt ist (Systemsteuerung > Anzeige > Einstellungen). -Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].</string> - <string name="MBPixelFmtSetErr">Pixel-Format kann nicht eingestellt werden.</string> - <string name="MBGLContextErr">Kann keinen Kontext für GL-Gerät erstellen</string> - <string name="MBGLContextActErr">Kann keinen Kontext für GL-Gerät aktivieren</string> - <string name="MBVideoDrvErr">[APP_NAME] kann nicht ausgeführt werden, da die Treiber Ihrer Videokarte entweder nicht richtig installiert oder veraltet sind, oder die entsprechende Hardware nicht unterstützt wird. Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für die Videokarte installiert haben. Falls Sie die aktuellsten Treiber bereits installiert haben, installieren Sie diese bitte erneut. +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. + </string> + <string name="MBPixelFmtSetErr"> + Pixel-Format kann nicht eingestellt werden. + </string> + <string name="MBGLContextErr"> + Kann keinen Kontext für GL-Gerät erstellen + </string> + <string name="MBGLContextActErr"> + Kann keinen Kontext für GL-Gerät aktivieren + </string> + <string name="MBVideoDrvErr"> + [APP_NAME] kann nicht ausgeführt werden, da die Treiber Ihrer Videokarte entweder nicht richtig installiert oder veraltet sind, oder die entsprechende Hardware nicht unterstützt wird. Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für die Videokarte installiert haben. Falls Sie die aktuellsten Treiber bereits installiert haben, installieren Sie diese bitte erneut. -Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].</string> - <string name="5 O'Clock Shadow">Bartschatten</string> - <string name="All White">Ganz weiß</string> - <string name="Anime Eyes">Anime-Augen</string> - <string name="Arced">Gewölbt</string> - <string name="Arm Length">Armlänge</string> - <string name="Attached">Angewachsen</string> - <string name="Attached Earlobes">Angewachsene Ohrläppchen</string> - <string name="Back Fringe">Nackenfransen</string> - <string name="Baggy">Tränensäcke</string> - <string name="Bangs">Pony</string> - <string name="Beady Eyes">Knopfaugen</string> - <string name="Belly Size">Bauchgröße</string> - <string name="Big">Groß</string> - <string name="Big Butt">Großer Hintern</string> - <string name="Big Hair Back">Volumen: Hinten</string> - <string name="Big Hair Front">Volumen: Vorne</string> - <string name="Big Hair Top">Volumen: Oben</string> - <string name="Big Head">Groß</string> - <string name="Big Pectorals">Große Brustmuskeln</string> - <string name="Big Spikes">Große Stacheln</string> - <string name="Black">Schwarz</string> - <string name="Blonde">Blond</string> - <string name="Blonde Hair">Blondes Haar</string> - <string name="Blush">Rouge</string> - <string name="Blush Color">Rougefarbe</string> - <string name="Blush Opacity">Rouge Deckkraft</string> - <string name="Body Definition">Körperkonturen</string> - <string name="Body Fat">Körperfett</string> - <string name="Body Freckles">Sommersprossen</string> - <string name="Body Thick">breit</string> - <string name="Body Thickness">Körperbreite</string> - <string name="Body Thin">schmal</string> - <string name="Bow Legged">o-beinig</string> - <string name="Breast Buoyancy">Brust, Straffheit</string> - <string name="Breast Cleavage">Dekolleté</string> - <string name="Breast Size">Brustgröße</string> - <string name="Bridge Width">Rückenbreite</string> - <string name="Broad">Breit</string> - <string name="Brow Size">Brauengröße</string> - <string name="Bug Eyes">Glubschaugen</string> - <string name="Bugged Eyes">Hervortretend</string> - <string name="Bulbous">Knollennase</string> - <string name="Bulbous Nose">Knollennase</string> - <string name="Breast Physics Mass">Brust – Masse</string> - <string name="Breast Physics Smoothing">Brust – Glättung</string> - <string name="Breast Physics Gravity">Brust – Schwerkraft</string> - <string name="Breast Physics Drag">Brust – Luftwiderstand</string> - <string name="Breast Physics InOut Max Effect">Max. Effekt</string> - <string name="Breast Physics InOut Spring">Federn</string> - <string name="Breast Physics InOut Gain">Verstärkung</string> - <string name="Breast Physics InOut Damping">Dämpfung</string> - <string name="Breast Physics UpDown Max Effect">Max. Effekt</string> - <string name="Breast Physics UpDown Spring">Federn</string> - <string name="Breast Physics UpDown Gain">Verstärkung</string> - <string name="Breast Physics UpDown Damping">Dämpfung</string> - <string name="Breast Physics LeftRight Max Effect">Max. Effekt</string> - <string name="Breast Physics LeftRight Spring">Federn</string> - <string name="Breast Physics LeftRight Gain">Verstärkung</string> - <string name="Breast Physics LeftRight Damping">Dämpfung</string> - <string name="Belly Physics Mass">Bauch – Masse</string> - <string name="Belly Physics Smoothing">Bauch – Glättung</string> - <string name="Belly Physics Gravity">Bauch – Schwerkraft</string> - <string name="Belly Physics Drag">Bauch – Luftwiderstand</string> - <string name="Belly Physics UpDown Max Effect">Max. Effekt</string> - <string name="Belly Physics UpDown Spring">Federn</string> - <string name="Belly Physics UpDown Gain">Verstärkung</string> - <string name="Belly Physics UpDown Damping">Dämpfung</string> - <string name="Butt Physics Mass">Po – Masse</string> - <string name="Butt Physics Smoothing">Po – Glättung</string> - <string name="Butt Physics Gravity">Po – Schwerkraft</string> - <string name="Butt Physics Drag">Po – Luftwiderstand</string> - <string name="Butt Physics UpDown Max Effect">Max. Effekt</string> - <string name="Butt Physics UpDown Spring">Federn</string> - <string name="Butt Physics UpDown Gain">Verstärkung</string> - <string name="Butt Physics UpDown Damping">Dämpfung</string> - <string name="Butt Physics LeftRight Max Effect">Max. Effekt</string> - <string name="Butt Physics LeftRight Spring">Federn</string> - <string name="Butt Physics LeftRight Gain">Verstärkung</string> - <string name="Butt Physics LeftRight Damping">Dämpfung</string> - <string name="Bushy Eyebrows">Buschige Augenbrauen</string> - <string name="Bushy Hair">Buschiges Haar</string> - <string name="Butt Size">Hintern, Größe</string> - <string name="Butt Gravity">Po – Schwerkraft</string> - <string name="bustle skirt">Tournürenrock</string> - <string name="no bustle">Ohne</string> - <string name="more bustle">Mit</string> - <string name="Chaplin">Chaplin</string> - <string name="Cheek Bones">Wangenknochen</string> - <string name="Chest Size">Brustgröße</string> - <string name="Chin Angle">Kinnwinkel</string> - <string name="Chin Cleft">Kinnspalte</string> - <string name="Chin Curtains">Schifferfräse</string> - <string name="Chin Depth">Kinnlänge</string> - <string name="Chin Heavy">Kinn ausgeprägt</string> - <string name="Chin In">Kinn zurück</string> - <string name="Chin Out">Kinn nach vorne</string> - <string name="Chin-Neck">Kinn-Hals</string> - <string name="Clear">Transparent</string> - <string name="Cleft">Spalte</string> - <string name="Close Set Eyes">Eng stehende Augen</string> - <string name="Closed">Geschlossen</string> - <string name="Closed Back">Hinten geschlossen</string> - <string name="Closed Front">Vorne geschlossen</string> - <string name="Closed Left">Links geschlossen</string> - <string name="Closed Right">Rechts geschlossen</string> - <string name="Coin Purse">Klein</string> - <string name="Collar Back">Kragen hinten</string> - <string name="Collar Front">Kragen vorne</string> - <string name="Corner Down">Nach unten</string> - <string name="Corner Up">Nach oben</string> - <string name="Creased">Schlupflid</string> - <string name="Crooked Nose">Krumme Nase</string> - <string name="Cuff Flare">Hosenaufschlag</string> - <string name="Dark">Dunkel</string> - <string name="Dark Green">Dunkelgrün</string> - <string name="Darker">Dunkler</string> - <string name="Deep">Tief</string> - <string name="Default Heels">Standardabsätze</string> - <string name="Dense">Dicht</string> - <string name="Double Chin">Doppelkinn</string> - <string name="Downturned">Nach unten</string> - <string name="Duffle Bag">Groß</string> - <string name="Ear Angle">Ohrenwinkel</string> - <string name="Ear Size">Ohrengröße</string> - <string name="Ear Tips">Ohrenspitzen</string> - <string name="Egg Head">Eierkopf</string> - <string name="Eye Bags">Augenränder</string> - <string name="Eye Color">Augenfarbe</string> - <string name="Eye Depth">Augentiefe</string> - <string name="Eye Lightness">Helligkeit</string> - <string name="Eye Opening">Öffnung</string> - <string name="Eye Pop">Symmetrie</string> - <string name="Eye Size">Augengröße</string> - <string name="Eye Spacing">Augenstand</string> - <string name="Eyebrow Arc">Brauenbogen</string> - <string name="Eyebrow Density">Brauendichte</string> - <string name="Eyebrow Height">Brauenhöhe</string> - <string name="Eyebrow Points">Brauenenden</string> - <string name="Eyebrow Size">Brauengröße</string> - <string name="Eyelash Length">Wimpernlänge</string> - <string name="Eyeliner">Eyeliner</string> - <string name="Eyeliner Color">Farbe des Eyeliners</string> - <string name="Eyes Bugged">Glubschaugen</string> - <string name="Face Shear">Gesichtsverzerrung</string> - <string name="Facial Definition">Gesichtskonturen</string> - <string name="Far Set Eyes">Weit auseinander</string> - <string name="Fat Lips">Volle Lippen</string> - <string name="Female">weiblich</string> - <string name="Fingerless">Ohne Finger</string> - <string name="Fingers">Finger</string> - <string name="Flared Cuffs">Ausgestellt</string> - <string name="Flat">Flach</string> - <string name="Flat Butt">Flacher Hintern</string> - <string name="Flat Head">Flacher Kopf</string> - <string name="Flat Toe">Flache Spitze</string> - <string name="Foot Size">Fußgröße</string> - <string name="Forehead Angle">Stirnwinkel</string> - <string name="Forehead Heavy">Stirn ausgeprägt</string> - <string name="Freckles">Sommersprossen</string> - <string name="Front Fringe">Fransen, vorne</string> - <string name="Full Back">Hinten volles Haar</string> - <string name="Full Eyeliner">Starker Eyeliner</string> - <string name="Full Front">Vorne volles Haar</string> - <string name="Full Hair Sides">Seitlich volles Haar</string> - <string name="Full Sides">Volle Seiten</string> - <string name="Glossy">Glänzend</string> - <string name="Glove Fingers">Handschuhfinger</string> - <string name="Glove Length">Handschuhlänge</string> - <string name="Hair">Haare</string> - <string name="Hair Back">Haare: Hinten</string> - <string name="Hair Front">Haare: Vorne</string> - <string name="Hair Sides">Haare: Seiten</string> - <string name="Hair Sweep">Haartolle</string> - <string name="Hair Thickess">Haardicke</string> - <string name="Hair Thickness">Haardicke</string> - <string name="Hair Tilt">Haarneigung</string> - <string name="Hair Tilted Left">Nach links</string> - <string name="Hair Tilted Right">Nach rechts</string> - <string name="Hair Volume">Haare: Volumen</string> - <string name="Hand Size">Handgröße</string> - <string name="Handlebars">Zwirbelbart</string> - <string name="Head Length">Kopflänge</string> - <string name="Head Shape">Kopfform</string> - <string name="Head Size">Kopfgröße</string> - <string name="Head Stretch">Kopfstreckung</string> - <string name="Heel Height">Absatzhöhe</string> - <string name="Heel Shape">Absatzform</string> - <string name="Height">Größe</string> - <string name="High">Hoch</string> - <string name="High Heels">Hohe Absätze</string> - <string name="High Jaw">Hoch</string> - <string name="High Platforms">Hohe Plattformsohlen</string> - <string name="High and Tight">Hoch und eng</string> - <string name="Higher">Höhere</string> - <string name="Hip Length">Länge der Hüfte</string> - <string name="Hip Width">Breite der Hüfte</string> - <string name="Hover">Schweben</string> - <string name="In">In</string> - <string name="In Shdw Color">Farbe Innenseite</string> - <string name="In Shdw Opacity">Deckkraft: innen</string> - <string name="Inner Eye Corner">Ecke: Nasenseite</string> - <string name="Inner Eye Shadow">Innenlid</string> - <string name="Inner Shadow">Innenlid</string> - <string name="Jacket Length">Jackenlänge</string> - <string name="Jacket Wrinkles">Jackenfalten</string> - <string name="Jaw Angle">Kinnansatz</string> - <string name="Jaw Jut">Kinnposition</string> - <string name="Jaw Shape">Kinnform</string> - <string name="Join">Zusammen</string> - <string name="Jowls">Hängebacken</string> - <string name="Knee Angle">Kniewinkel</string> - <string name="Knock Kneed">X-beinig</string> - <string name="Large">Groß</string> - <string name="Large Hands">Große Hände</string> - <string name="Left Part">Linksscheitel</string> - <string name="Leg Length">Beinlänge</string> - <string name="Leg Muscles">Beinmuskeln</string> - <string name="Less">Weniger</string> - <string name="Less Body Fat">Weniger Speck</string> - <string name="Less Curtains">Weniger</string> - <string name="Less Freckles">Weniger</string> - <string name="Less Full">Weniger</string> - <string name="Less Gravity">Weniger</string> - <string name="Less Love">Weniger</string> - <string name="Less Muscles">Weniger</string> - <string name="Less Muscular">Weniger</string> - <string name="Less Rosy">Weniger</string> - <string name="Less Round">Weniger</string> - <string name="Less Saddle">Weniger</string> - <string name="Less Square">Weniger</string> - <string name="Less Volume">Weniger</string> - <string name="Less soul">Weniger</string> - <string name="Lighter">Heller</string> - <string name="Lip Cleft">Amorbogen</string> - <string name="Lip Cleft Depth">Tiefe: Amorbogen</string> - <string name="Lip Fullness">Fülle</string> - <string name="Lip Pinkness">Pinkton</string> - <string name="Lip Ratio">Lippenproportionen</string> - <string name="Lip Thickness">Lippendicke</string> - <string name="Lip Width">Mundbreite</string> - <string name="Lipgloss">Lipgloss</string> - <string name="Lipstick">Lippenstift</string> - <string name="Lipstick Color">Farbe</string> - <string name="Long">Lang</string> - <string name="Long Head">Langer Kopf</string> - <string name="Long Hips">Lange Hüften</string> - <string name="Long Legs">Lange Beine</string> - <string name="Long Neck">Langer Hals</string> - <string name="Long Pigtails">Lange Zöpfe</string> - <string name="Long Ponytail">Langer Pferdeschwanz</string> - <string name="Long Torso">Langer Oberkörper</string> - <string name="Long arms">Lange Arme</string> - <string name="Loose Pants">Weite Hosen</string> - <string name="Loose Shirt">Weites Hemd</string> - <string name="Loose Sleeves">Weite Ärmel</string> - <string name="Love Handles">Fettpölsterchen</string> - <string name="Low">Niedrig</string> - <string name="Low Heels">Niedrig</string> - <string name="Low Jaw">Niedrig</string> - <string name="Low Platforms">Niedrig</string> - <string name="Low and Loose">Weit</string> - <string name="Lower">Absenken</string> - <string name="Lower Bridge">Brücke, Unterer Teil</string> - <string name="Lower Cheeks">Wangen, unterer Bereich</string> - <string name="Male">Männlich</string> - <string name="Middle Part">Mittelscheitel</string> - <string name="More">Mehr</string> - <string name="More Blush">Mehr</string> - <string name="More Body Fat">Mehr Speck</string> - <string name="More Curtains">Mehr</string> - <string name="More Eyeshadow">Mehr</string> - <string name="More Freckles">Mehr</string> - <string name="More Full">Voller</string> - <string name="More Gravity">Mehr</string> - <string name="More Lipstick">Mehr</string> - <string name="More Love">Mehr</string> - <string name="More Lower Lip">Größer</string> - <string name="More Muscles">Mehr</string> - <string name="More Muscular">Mehr</string> - <string name="More Rosy">Mehr</string> - <string name="More Round">Runder</string> - <string name="More Saddle">Mehr</string> - <string name="More Sloped">Flach</string> - <string name="More Square">Eckiger</string> - <string name="More Upper Lip">Mehr</string> - <string name="More Vertical">Steil</string> - <string name="More Volume">Mehr</string> - <string name="More soul">Mehr</string> - <string name="Moustache">Schnauzer</string> - <string name="Mouth Corner">Mundwinkel</string> - <string name="Mouth Position">Mundposition</string> - <string name="Mowhawk">Irokese</string> - <string name="Muscular">Muskulös</string> - <string name="Mutton Chops">Koteletten</string> - <string name="Nail Polish">Nagellack</string> - <string name="Nail Polish Color">Farbe</string> - <string name="Narrow">Schmal</string> - <string name="Narrow Back">Wenig</string> - <string name="Narrow Front">Wenig</string> - <string name="Narrow Lips">Schmale Lippen</string> - <string name="Natural">Natürlich</string> - <string name="Neck Length">Halslänge</string> - <string name="Neck Thickness">Halsdicke</string> - <string name="No Blush">Kein Rouge</string> - <string name="No Eyeliner">Kein Eyeliner</string> - <string name="No Eyeshadow">Kein Lidschatten</string> - <string name="No Lipgloss">Kein Lipgloss</string> - <string name="No Lipstick">Kein Lippenstift</string> - <string name="No Part">Kein Scheitel</string> - <string name="No Polish">Kein Nagellack</string> - <string name="No Red">Nicht rot</string> - <string name="No Spikes">Keine Stachel</string> - <string name="No White">Kein Weiß</string> - <string name="No Wrinkles">Keine Falten</string> - <string name="Normal Lower">Normal unten</string> - <string name="Normal Upper">Normal oben</string> - <string name="Nose Left">Links</string> - <string name="Nose Right">Rechts</string> - <string name="Nose Size">Größe</string> - <string name="Nose Thickness">Dicke</string> - <string name="Nose Tip Angle">Nasenspitze</string> - <string name="Nose Tip Shape">Nasenspitze</string> - <string name="Nose Width">Nasenbreite</string> - <string name="Nostril Division">Teilung</string> - <string name="Nostril Width">Größe</string> - <string name="Opaque">Deckend</string> - <string name="Open">Öffnen</string> - <string name="Open Back">Hinten offen</string> - <string name="Open Front">Vorne offen</string> - <string name="Open Left">Links offen</string> - <string name="Open Right">Rechts offen</string> - <string name="Orange">Orange</string> - <string name="Out">Aus</string> - <string name="Out Shdw Color">Farbe: Oben</string> - <string name="Out Shdw Opacity">Deckkraft: Oben</string> - <string name="Outer Eye Corner">Äußerer Augenwinkel</string> - <string name="Outer Eye Shadow">Lidschatten: Oben</string> - <string name="Outer Shadow">Lidschatten: Oben</string> - <string name="Overbite">Überbiss</string> - <string name="Package">Ausbeulung</string> - <string name="Painted Nails">Lackierte Nägel</string> - <string name="Pale">Blass</string> - <string name="Pants Crotch">Schritt</string> - <string name="Pants Fit">Passform</string> - <string name="Pants Length">Hosenlänge</string> - <string name="Pants Waist">Hüfte</string> - <string name="Pants Wrinkles">Falten</string> - <string name="Part">Scheitel</string> - <string name="Part Bangs">Pony scheiteln</string> - <string name="Pectorals">Brustmuskel</string> - <string name="Pigment">Pigmentierung</string> - <string name="Pigtails">Zöpfe</string> - <string name="Pink">Pink</string> - <string name="Pinker">Mehr Pink</string> - <string name="Platform Height">Höhe</string> - <string name="Platform Width">Breite</string> - <string name="Pointy">Spitz</string> - <string name="Pointy Heels">Pfennigabsätze</string> - <string name="Ponytail">Pferdeschwanz</string> - <string name="Poofy Skirt">Weit ausgestellt</string> - <string name="Pop Left Eye">Linkes Auge größer</string> - <string name="Pop Right Eye">Rechtes Auge größer</string> - <string name="Puffy">Geschwollen</string> - <string name="Puffy Eyelids">Geschwollene Lider</string> - <string name="Rainbow Color">Regenbogenfarben</string> - <string name="Red Hair">Rote Haare</string> - <string name="Regular">Normal</string> - <string name="Right Part">Scheitel rechts</string> - <string name="Rosy Complexion">Rosiger Teint</string> - <string name="Round">Rund</string> - <string name="Ruddiness">Röte</string> - <string name="Ruddy">Rötlich</string> - <string name="Rumpled Hair">Zerzauste Haare</string> - <string name="Saddle Bags">Hüftspeck</string> - <string name="Scrawny Leg">Dürres Bein</string> - <string name="Separate">Auseinander</string> - <string name="Shallow">Flach</string> - <string name="Shear Back">Hinterkopf rasiert</string> - <string name="Shear Face">Gesicht verzerren</string> - <string name="Shear Front">Vorne rasiert</string> - <string name="Shear Left Up">Links</string> - <string name="Shear Right Up">Rechts</string> - <string name="Sheared Back">Hinterkopf rasiert</string> - <string name="Sheared Front">Vorne rasiert</string> - <string name="Shift Left">Nach links</string> - <string name="Shift Mouth">Mund verschieben</string> - <string name="Shift Right">Nach rechts</string> - <string name="Shirt Bottom">Hemdlänge</string> - <string name="Shirt Fit">Passform</string> - <string name="Shirt Wrinkles">Falten</string> - <string name="Shoe Height">Schuhart</string> - <string name="Short">Klein</string> - <string name="Short Arms">Kurze Arme</string> - <string name="Short Legs">Kurze Beine</string> - <string name="Short Neck">Kurzer Hals</string> - <string name="Short Pigtails">Kurze Zöpfe</string> - <string name="Short Ponytail">Kurzer Pferdeschwanz</string> - <string name="Short Sideburns">Kurze Koteletten</string> - <string name="Short Torso">Kurzer Oberkörper</string> - <string name="Short hips">Kurze Hüften</string> - <string name="Shoulders">Schultern</string> - <string name="Side Fringe">Seitliche Fransen</string> - <string name="Sideburns">Koteletten</string> - <string name="Sides Hair">Seitliches Haar</string> - <string name="Sides Hair Down">Lang</string> - <string name="Sides Hair Up">Kurz</string> - <string name="Skinny Neck">Dünner Hals</string> - <string name="Skirt Fit">Passform</string> - <string name="Skirt Length">Rocklänge</string> - <string name="Slanted Forehead">Fliehende Stirn</string> - <string name="Sleeve Length">Ärmellänge</string> - <string name="Sleeve Looseness">Passform Ärmel</string> - <string name="Slit Back">Schlitz: Hinten</string> - <string name="Slit Front">Schlitz: Vorne</string> - <string name="Slit Left">Schlitz: Links</string> - <string name="Slit Right">Schlitz: Rechts</string> - <string name="Small">Klein</string> - <string name="Small Hands">Kleine Hände</string> - <string name="Small Head">Klein</string> - <string name="Smooth">Glätten</string> - <string name="Smooth Hair">Glattes Haar</string> - <string name="Socks Length">Strumpflänge</string> - <string name="Soulpatch">Unterlippenbart</string> - <string name="Sparse">Wenig</string> - <string name="Spiked Hair">Stachelhaare</string> - <string name="Square">Rechteck</string> - <string name="Square Toe">Eckig</string> - <string name="Squash Head">Gestaucht</string> - <string name="Stretch Head">Gestreckt</string> - <string name="Sunken">Eingefallen</string> - <string name="Sunken Chest">Trichterbrust</string> - <string name="Sunken Eyes">Eingesunkene Augen</string> - <string name="Sweep Back">Nach hinten</string> - <string name="Sweep Forward">Nach vorne</string> - <string name="Tall">Groß</string> - <string name="Taper Back">Ansatzbreite hinten</string> - <string name="Taper Front">Ansatzbreite vorne</string> - <string name="Thick Heels">Dicke Absätze</string> - <string name="Thick Neck">Dicker Hals</string> - <string name="Thick Toe">Dick</string> - <string name="Thin">Dünn</string> - <string name="Thin Eyebrows">Dünne Augenbrauen</string> - <string name="Thin Lips">Dünne Lippen</string> - <string name="Thin Nose">Dünne Nase</string> - <string name="Tight Chin">Straffes Kinn</string> - <string name="Tight Cuffs">Eng</string> - <string name="Tight Pants">Enge Hosen</string> - <string name="Tight Shirt">Enges Hemd</string> - <string name="Tight Skirt">Enger Rock</string> - <string name="Tight Sleeves">Enge Ärmel</string> - <string name="Toe Shape">Spitze</string> - <string name="Toe Thickness">Dicke</string> - <string name="Torso Length">Länge des Oberkörpers</string> - <string name="Torso Muscles">Muskeln</string> - <string name="Torso Scrawny">Dürr</string> - <string name="Unattached">Frei</string> - <string name="Uncreased">Straffes Lid</string> - <string name="Underbite">Unterbiss</string> - <string name="Unnatural">Unnatürlich</string> - <string name="Upper Bridge">Brücke, oberer Teil</string> - <string name="Upper Cheeks">Obere Wangen</string> - <string name="Upper Chin Cleft">Obere Kinnspalte</string> - <string name="Upper Eyelid Fold">Obere Lidfalte</string> - <string name="Upturned">Stupsnase</string> - <string name="Very Red">Sehr rot</string> - <string name="Waist Height">Bund</string> - <string name="Well-Fed">Gut genährt</string> - <string name="White Hair">Weiße Haare</string> - <string name="Wide">Breit</string> - <string name="Wide Back">Breit</string> - <string name="Wide Front">Breit</string> - <string name="Wide Lips">Breit</string> - <string name="Wild">Wild</string> - <string name="Wrinkles">Falten</string> - <string name="LocationCtrlAddLandmarkTooltip">Zu meinen Landmarken hinzufügen</string> - <string name="LocationCtrlEditLandmarkTooltip">Meine Landmarken bearbeiten</string> - <string name="LocationCtrlInfoBtnTooltip">Weitere Informationen über die aktuelle Position</string> - <string name="LocationCtrlComboBtnTooltip">Mein Reiseverlauf</string> - <string name="LocationCtrlForSaleTooltip">Dieses Land kaufen</string> - <string name="LocationCtrlVoiceTooltip">Voice hier nicht möglich</string> - <string name="LocationCtrlFlyTooltip">Fliegen ist unzulässig</string> - <string name="LocationCtrlPushTooltip">Kein Stoßen</string> - <string name="LocationCtrlBuildTooltip">Bauen/Fallen lassen von Objekten ist verboten</string> - <string name="LocationCtrlScriptsTooltip">Skripte sind unzulässig</string> - <string name="LocationCtrlDamageTooltip">Gesundheit</string> - <string name="LocationCtrlAdultIconTooltip">Adult-Region</string> - <string name="LocationCtrlModerateIconTooltip">Moderate Region</string> - <string name="LocationCtrlGeneralIconTooltip">Generelle Region</string> - <string name="LocationCtrlSeeAVsTooltip">Avatare in dieser Parzelle können von Avataren außerhalb dieser Parzelle weder gesehen noch gehört werden</string> - <string name="LocationCtrlPathfindingDirtyTooltip">Bewegliche Objekte verhalten sich in dieser Region u. U. erst dann korrekt, wenn die Region neu geformt wird.</string> - <string name="LocationCtrlPathfindingDisabledTooltip">Dynamisches Pathfinding ist in dieser Region nicht aktiviert.</string> - <string name="UpdaterWindowTitle">[APP_NAME] Aktualisierung</string> - <string name="UpdaterNowUpdating">[APP_NAME] wird aktualisiert...</string> - <string name="UpdaterNowInstalling">[APP_NAME] wird installiert...</string> - <string name="UpdaterUpdatingDescriptive">Ihr [APP_NAME]-Viewer wird aktualisiert. Dies kann einen Moment dauern. Wir bitten um Ihr Verständnis.</string> - <string name="UpdaterProgressBarTextWithEllipses">Aktualisierung wird heruntergeladen...</string> - <string name="UpdaterProgressBarText">Aktualisierung wird heruntergeladen</string> - <string name="UpdaterFailDownloadTitle">Herunterladen ist fehlgeschlagen</string> - <string name="UpdaterFailUpdateDescriptive">Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte laden Sie die aktuellste Version von www.secondlife.com herunter.</string> - <string name="UpdaterFailInstallTitle">Aktualisierung konnte nicht installiert werden</string> - <string name="UpdaterFailStartTitle">Viewer konnte nicht gestartet werden</string> - <string name="ItemsComingInTooFastFrom">[APP_NAME]: Zuviele Objekte auf einmal von [FROM_NAME]. Automaitsche Vorschau ist für [TIME] Sekunden nicht verfügbar.</string> - <string name="ItemsComingInTooFast">[APP_NAME]: Zuviele Objekte auf einmal. Automaitsche Vorschau ist für [TIME] Sekunden nicht verfügbar.</string> - <string name="IM_logging_string">-- Instant-Message-Protokoll aktiviert --</string> - <string name="IM_typing_start_string">[NAME] tippt...</string> - <string name="Unnamed">(Nicht benannt)</string> - <string name="IM_moderated_chat_label">(Moderiert: Stimmen in der Standardeinstellung stummgeschaltet)</string> - <string name="IM_unavailable_text_label">Für diese Verbindung ist kein Text-Chat verfügbar.</string> - <string name="IM_muted_text_label">Ihr Text-Chat wurde von einem Gruppenmoderator deaktiviert.</string> - <string name="IM_default_text_label">Für Instant Message hier klicken.</string> - <string name="IM_to_label">An</string> - <string name="IM_moderator_label">(Moderator)</string> - <string name="Saved_message">(Gespeichert am [LONG_TIMESTAMP])</string> - <string name="IM_unblock_only_groups_friends">Wenn Sie diese Meldung sehen, müssen Sie unter „Einstellungen“ > „Privatsphäre“ die Option „Nur IMs und Anrufe von Freunden oder Gruppen durchstellen“ deaktivieren.</string> - <string name="OnlineStatus">Online</string> - <string name="OfflineStatus">Offline</string> - <string name="not_online_msg">Benutzer nicht online – Nachricht wird gespeichert und später zugestellt.</string> - <string name="not_online_inventory">Benutzer nicht online – Inventar gespeichert.</string> - <string name="answered_call">Ihr Anruf wurde entgegengenommen</string> - <string name="you_started_call">Sie haben einen Voice-Anruf begonnen</string> - <string name="you_joined_call">Sie sind dem Gespräch beigetreten</string> - <string name="you_auto_rejected_call-im">Sie haben den Voice-Anruf automatisch abgelehnt, während der Nicht-stören-Modus aktiviert war.</string> - <string name="name_started_call">[NAME] hat einen Voice-Anruf begonnen</string> - <string name="ringing-im">Verbindung wird hergestellt...</string> - <string name="connected-im">Verbunden. Klicken Sie auf Anruf beenden, um die Verbindung zu trennen</string> - <string name="hang_up-im">Anruf wurde beendet</string> - <string name="answering-im">Wird verbunden...</string> - <string name="conference-title">Chat mit mehreren Personen</string> - <string name="conference-title-incoming">Konferenz mit [AGENT_NAME]</string> - <string name="inventory_item_offered-im">Inventarobjekt „[ITEM_NAME]“ angeboten</string> - <string name="inventory_folder_offered-im">Inventarordner „[ITEM_NAME]“ angeboten</string> - <string name="share_alert">Objekte aus dem Inventar hier her ziehen</string> - <string name="facebook_post_success">Sie haben auf Facebook gepostet.</string> - <string name="flickr_post_success">Sie haben auf Flickr gepostet.</string> - <string name="twitter_post_success">Sie haben auf Twitter gepostet.</string> - <string name="no_session_message">(IM-Session nicht vorhanden)</string> - <string name="only_user_message">Sie sind der einzige Benutzer in dieser Sitzung.</string> - <string name="offline_message">[NAME] ist offline.</string> - <string name="invite_message">Klicken Sie auf [BUTTON NAME], um eine Verbindung zu diesem Voice-Chat herzustellen.</string> - <string name="muted_message">Sie haben diesen Einwohner ignoriert. Wenn Sie eine Nachricht senden, wird dieser freigeschaltet.</string> - <string name="generic">Fehler bei Anfrage, bitte versuchen Sie es später.</string> - <string name="generic_request_error">Fehler bei Anfrage, bitte versuchen Sie es später.</string> - <string name="insufficient_perms_error">Sie sind dazu nicht berechtigt.</string> - <string name="session_does_not_exist_error">Die Sitzung ist abgelaufen</string> - <string name="no_ability_error">Sie besitzen diese Fähigkeit nicht.</string> - <string name="no_ability">Sie besitzen diese Fähigkeit nicht.</string> - <string name="not_a_mod_error">Sie sind kein Sitzungsmoderator.</string> - <string name="muted">Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert.</string> - <string name="muted_error">Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert.</string> - <string name="add_session_event">Es konnten keine Benutzer zur Chat-Sitzung mit [RECIPIENT] hinzugefügt werden.</string> - <string name="message">Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden.</string> - <string name="message_session_event">Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden.</string> - <string name="mute">Fehler während Moderation.</string> - <string name="removed">Sie wurden von der Gruppe ausgeschlossen.</string> - <string name="removed_from_group">Sie wurden von der Gruppe ausgeschlossen.</string> - <string name="close_on_no_ability">Sie haben nicht mehr die Berechtigung an der Chat-Sitzung teilzunehmen.</string> - <string name="unread_chat_single">[SOURCES] hat etwas Neues gesagt</string> - <string name="unread_chat_multiple">[SOURCES] haben etwas Neues gesagt</string> - <string name="session_initialization_timed_out_error">Die Initialisierung der Sitzung ist fehlgeschlagen</string> - <string name="Home position set.">Position für Zuhause festgelegt.</string> - <string name="voice_morphing_url">https://secondlife.com/destination/voice-island</string> - <string name="premium_voice_morphing_url">https://secondlife.com/destination/voice-morphing-premium</string> - <string name="paid_you_ldollars">[NAME] hat Ihnen [REASON] [AMOUNT] L$ bezahlt.</string> - <string name="paid_you_ldollars_gift">[NAME] hat Ihnen [AMOUNT] L$ bezahlt: [REASON]</string> - <string name="paid_you_ldollars_no_reason">[NAME] hat Ihnen [AMOUNT] L$ bezahlt.</string> - <string name="you_paid_ldollars">Sie haben [REASON] [AMOUNT] L$ an [NAME] bezahlt.</string> - <string name="you_paid_ldollars_gift">Sie haben [NAME] [AMOUNT] L$ bezahlt: [REASON]</string> - <string name="you_paid_ldollars_no_info">Sie haben [AMOUNT] L$ bezahlt.</string> - <string name="you_paid_ldollars_no_reason">Sie haben [AMOUNT] L$ an [NAME] bezahlt.</string> - <string name="you_paid_ldollars_no_name">Sie haben [REASON] [AMOUNT] L$ bezahlt.</string> - <string name="you_paid_failure_ldollars">Sie haben [NAME] [AMOUNT] L$ [REASON] nicht bezahlt.</string> - <string name="you_paid_failure_ldollars_gift">Sie haben [NAME] [AMOUNT] L$ nicht bezahlt: [REASON]</string> - <string name="you_paid_failure_ldollars_no_info">Sie haben [AMOUNT] L$ nicht bezahlt.</string> - <string name="you_paid_failure_ldollars_no_reason">Sie haben [NAME] [AMOUNT] L$ nicht bezahlt.</string> - <string name="you_paid_failure_ldollars_no_name">Sie haben [AMOUNT] L$ [REASON] nicht bezahlt.</string> - <string name="for item">für [ITEM]</string> - <string name="for a parcel of land">für eine Landparzelle</string> - <string name="for a land access pass">für einen Pass</string> - <string name="for deeding land">für die Landübertragung</string> - <string name="to create a group">für die Gründung einer Gruppe</string> - <string name="to join a group">für den Beitritt zur Gruppe</string> - <string name="to upload">fürs Hochladen</string> - <string name="to publish a classified ad">um eine Anzeige aufzugeben</string> - <string name="giving">[AMOUNT] L$ werden bezahlt</string> - <string name="uploading_costs">Kosten für Hochladen [AMOUNT] L$</string> - <string name="this_costs">Kosten: [AMOUNT] L$</string> - <string name="buying_selected_land">Ausgewähltes Land wird für [AMOUNT] L$ gekauft.</string> - <string name="this_object_costs">Dieses Objekt kostet [AMOUNT] L$</string> - <string name="group_role_everyone">Jeder</string> - <string name="group_role_officers">Offiziere</string> - <string name="group_role_owners">Eigentümer</string> - <string name="group_member_status_online">Online</string> - <string name="uploading_abuse_report">Hochladen... +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. + </string> + <string name="5 O'Clock Shadow"> + Bartschatten + </string> + <string name="All White"> + Ganz weiß + </string> + <string name="Anime Eyes"> + Anime-Augen + </string> + <string name="Arced"> + Gewölbt + </string> + <string name="Arm Length"> + Armlänge + </string> + <string name="Attached"> + Angewachsen + </string> + <string name="Attached Earlobes"> + Angewachsene Ohrläppchen + </string> + <string name="Back Fringe"> + Nackenfransen + </string> + <string name="Baggy"> + Tränensäcke + </string> + <string name="Bangs"> + Pony + </string> + <string name="Beady Eyes"> + Knopfaugen + </string> + <string name="Belly Size"> + Bauchgröße + </string> + <string name="Big"> + Groß + </string> + <string name="Big Butt"> + Großer Hintern + </string> + <string name="Big Hair Back"> + Volumen: Hinten + </string> + <string name="Big Hair Front"> + Volumen: Vorne + </string> + <string name="Big Hair Top"> + Volumen: Oben + </string> + <string name="Big Head"> + Groß + </string> + <string name="Big Pectorals"> + Große Brustmuskeln + </string> + <string name="Big Spikes"> + Große Stacheln + </string> + <string name="Black"> + Schwarz + </string> + <string name="Blonde"> + Blond + </string> + <string name="Blonde Hair"> + Blondes Haar + </string> + <string name="Blush"> + Rouge + </string> + <string name="Blush Color"> + Rougefarbe + </string> + <string name="Blush Opacity"> + Rouge Deckkraft + </string> + <string name="Body Definition"> + Körperkonturen + </string> + <string name="Body Fat"> + Körperfett + </string> + <string name="Body Freckles"> + Sommersprossen + </string> + <string name="Body Thick"> + breit + </string> + <string name="Body Thickness"> + Körperbreite + </string> + <string name="Body Thin"> + schmal + </string> + <string name="Bow Legged"> + o-beinig + </string> + <string name="Breast Buoyancy"> + Brust, Straffheit + </string> + <string name="Breast Cleavage"> + Dekolleté + </string> + <string name="Breast Size"> + Brustgröße + </string> + <string name="Bridge Width"> + Rückenbreite + </string> + <string name="Broad"> + Breit + </string> + <string name="Brow Size"> + Brauengröße + </string> + <string name="Bug Eyes"> + Glubschaugen + </string> + <string name="Bugged Eyes"> + Hervortretend + </string> + <string name="Bulbous"> + Knollennase + </string> + <string name="Bulbous Nose"> + Knollennase + </string> + <string name="Breast Physics Mass"> + Brust – Masse + </string> + <string name="Breast Physics Smoothing"> + Brust – Glättung + </string> + <string name="Breast Physics Gravity"> + Brust – Schwerkraft + </string> + <string name="Breast Physics Drag"> + Brust – Luftwiderstand + </string> + <string name="Breast Physics InOut Max Effect"> + Max. Effekt + </string> + <string name="Breast Physics InOut Spring"> + Federn + </string> + <string name="Breast Physics InOut Gain"> + Verstärkung + </string> + <string name="Breast Physics InOut Damping"> + Dämpfung + </string> + <string name="Breast Physics UpDown Max Effect"> + Max. Effekt + </string> + <string name="Breast Physics UpDown Spring"> + Federn + </string> + <string name="Breast Physics UpDown Gain"> + Verstärkung + </string> + <string name="Breast Physics UpDown Damping"> + Dämpfung + </string> + <string name="Breast Physics LeftRight Max Effect"> + Max. Effekt + </string> + <string name="Breast Physics LeftRight Spring"> + Federn + </string> + <string name="Breast Physics LeftRight Gain"> + Verstärkung + </string> + <string name="Breast Physics LeftRight Damping"> + Dämpfung + </string> + <string name="Belly Physics Mass"> + Bauch – Masse + </string> + <string name="Belly Physics Smoothing"> + Bauch – Glättung + </string> + <string name="Belly Physics Gravity"> + Bauch – Schwerkraft + </string> + <string name="Belly Physics Drag"> + Bauch – Luftwiderstand + </string> + <string name="Belly Physics UpDown Max Effect"> + Max. Effekt + </string> + <string name="Belly Physics UpDown Spring"> + Federn + </string> + <string name="Belly Physics UpDown Gain"> + Verstärkung + </string> + <string name="Belly Physics UpDown Damping"> + Dämpfung + </string> + <string name="Butt Physics Mass"> + Po – Masse + </string> + <string name="Butt Physics Smoothing"> + Po – Glättung + </string> + <string name="Butt Physics Gravity"> + Po – Schwerkraft + </string> + <string name="Butt Physics Drag"> + Po – Luftwiderstand + </string> + <string name="Butt Physics UpDown Max Effect"> + Max. Effekt + </string> + <string name="Butt Physics UpDown Spring"> + Federn + </string> + <string name="Butt Physics UpDown Gain"> + Verstärkung + </string> + <string name="Butt Physics UpDown Damping"> + Dämpfung + </string> + <string name="Butt Physics LeftRight Max Effect"> + Max. Effekt + </string> + <string name="Butt Physics LeftRight Spring"> + Federn + </string> + <string name="Butt Physics LeftRight Gain"> + Verstärkung + </string> + <string name="Butt Physics LeftRight Damping"> + Dämpfung + </string> + <string name="Bushy Eyebrows"> + Buschige Augenbrauen + </string> + <string name="Bushy Hair"> + Buschiges Haar + </string> + <string name="Butt Size"> + Hintern, Größe + </string> + <string name="Butt Gravity"> + Po – Schwerkraft + </string> + <string name="bustle skirt"> + Tournürenrock + </string> + <string name="no bustle"> + Ohne + </string> + <string name="more bustle"> + Mit + </string> + <string name="Chaplin"> + Chaplin + </string> + <string name="Cheek Bones"> + Wangenknochen + </string> + <string name="Chest Size"> + Brustgröße + </string> + <string name="Chin Angle"> + Kinnwinkel + </string> + <string name="Chin Cleft"> + Kinnspalte + </string> + <string name="Chin Curtains"> + Schifferfräse + </string> + <string name="Chin Depth"> + Kinnlänge + </string> + <string name="Chin Heavy"> + Kinn ausgeprägt + </string> + <string name="Chin In"> + Kinn zurück + </string> + <string name="Chin Out"> + Kinn nach vorne + </string> + <string name="Chin-Neck"> + Kinn-Hals + </string> + <string name="Clear"> + Transparent + </string> + <string name="Cleft"> + Spalte + </string> + <string name="Close Set Eyes"> + Eng stehende Augen + </string> + <string name="Closed"> + Geschlossen + </string> + <string name="Closed Back"> + Hinten geschlossen + </string> + <string name="Closed Front"> + Vorne geschlossen + </string> + <string name="Closed Left"> + Links geschlossen + </string> + <string name="Closed Right"> + Rechts geschlossen + </string> + <string name="Coin Purse"> + Klein + </string> + <string name="Collar Back"> + Kragen hinten + </string> + <string name="Collar Front"> + Kragen vorne + </string> + <string name="Corner Down"> + Nach unten + </string> + <string name="Corner Up"> + Nach oben + </string> + <string name="Creased"> + Schlupflid + </string> + <string name="Crooked Nose"> + Krumme Nase + </string> + <string name="Cuff Flare"> + Hosenaufschlag + </string> + <string name="Dark"> + Dunkel + </string> + <string name="Dark Green"> + Dunkelgrün + </string> + <string name="Darker"> + Dunkler + </string> + <string name="Deep"> + Tief + </string> + <string name="Default Heels"> + Standardabsätze + </string> + <string name="Dense"> + Dicht + </string> + <string name="Double Chin"> + Doppelkinn + </string> + <string name="Downturned"> + Nach unten + </string> + <string name="Duffle Bag"> + Groß + </string> + <string name="Ear Angle"> + Ohrenwinkel + </string> + <string name="Ear Size"> + Ohrengröße + </string> + <string name="Ear Tips"> + Ohrenspitzen + </string> + <string name="Egg Head"> + Eierkopf + </string> + <string name="Eye Bags"> + Augenränder + </string> + <string name="Eye Color"> + Augenfarbe + </string> + <string name="Eye Depth"> + Augentiefe + </string> + <string name="Eye Lightness"> + Helligkeit + </string> + <string name="Eye Opening"> + Öffnung + </string> + <string name="Eye Pop"> + Symmetrie + </string> + <string name="Eye Size"> + Augengröße + </string> + <string name="Eye Spacing"> + Augenstand + </string> + <string name="Eyebrow Arc"> + Brauenbogen + </string> + <string name="Eyebrow Density"> + Brauendichte + </string> + <string name="Eyebrow Height"> + Brauenhöhe + </string> + <string name="Eyebrow Points"> + Brauenenden + </string> + <string name="Eyebrow Size"> + Brauengröße + </string> + <string name="Eyelash Length"> + Wimpernlänge + </string> + <string name="Eyeliner"> + Eyeliner + </string> + <string name="Eyeliner Color"> + Farbe des Eyeliners + </string> + <string name="Eyes Bugged"> + Glubschaugen + </string> + <string name="Face Shear"> + Gesichtsverzerrung + </string> + <string name="Facial Definition"> + Gesichtskonturen + </string> + <string name="Far Set Eyes"> + Weit auseinander + </string> + <string name="Fat Lips"> + Volle Lippen + </string> + <string name="Female"> + weiblich + </string> + <string name="Fingerless"> + Ohne Finger + </string> + <string name="Fingers"> + Finger + </string> + <string name="Flared Cuffs"> + Ausgestellt + </string> + <string name="Flat"> + Flach + </string> + <string name="Flat Butt"> + Flacher Hintern + </string> + <string name="Flat Head"> + Flacher Kopf + </string> + <string name="Flat Toe"> + Flache Spitze + </string> + <string name="Foot Size"> + Fußgröße + </string> + <string name="Forehead Angle"> + Stirnwinkel + </string> + <string name="Forehead Heavy"> + Stirn ausgeprägt + </string> + <string name="Freckles"> + Sommersprossen + </string> + <string name="Front Fringe"> + Fransen, vorne + </string> + <string name="Full Back"> + Hinten volles Haar + </string> + <string name="Full Eyeliner"> + Starker Eyeliner + </string> + <string name="Full Front"> + Vorne volles Haar + </string> + <string name="Full Hair Sides"> + Seitlich volles Haar + </string> + <string name="Full Sides"> + Volle Seiten + </string> + <string name="Glossy"> + Glänzend + </string> + <string name="Glove Fingers"> + Handschuhfinger + </string> + <string name="Glove Length"> + Handschuhlänge + </string> + <string name="Hair"> + Haare + </string> + <string name="Hair Back"> + Haare: Hinten + </string> + <string name="Hair Front"> + Haare: Vorne + </string> + <string name="Hair Sides"> + Haare: Seiten + </string> + <string name="Hair Sweep"> + Haartolle + </string> + <string name="Hair Thickess"> + Haardicke + </string> + <string name="Hair Thickness"> + Haardicke + </string> + <string name="Hair Tilt"> + Haarneigung + </string> + <string name="Hair Tilted Left"> + Nach links + </string> + <string name="Hair Tilted Right"> + Nach rechts + </string> + <string name="Hair Volume"> + Haare: Volumen + </string> + <string name="Hand Size"> + Handgröße + </string> + <string name="Handlebars"> + Zwirbelbart + </string> + <string name="Head Length"> + Kopflänge + </string> + <string name="Head Shape"> + Kopfform + </string> + <string name="Head Size"> + Kopfgröße + </string> + <string name="Head Stretch"> + Kopfstreckung + </string> + <string name="Heel Height"> + Absatzhöhe + </string> + <string name="Heel Shape"> + Absatzform + </string> + <string name="Height"> + Größe + </string> + <string name="High"> + Hoch + </string> + <string name="High Heels"> + Hohe Absätze + </string> + <string name="High Jaw"> + Hoch + </string> + <string name="High Platforms"> + Hohe Plattformsohlen + </string> + <string name="High and Tight"> + Hoch und eng + </string> + <string name="Higher"> + Höhere + </string> + <string name="Hip Length"> + Länge der Hüfte + </string> + <string name="Hip Width"> + Breite der Hüfte + </string> + <string name="Hover"> + Schweben + </string> + <string name="In"> + In + </string> + <string name="In Shdw Color"> + Farbe Innenseite + </string> + <string name="In Shdw Opacity"> + Deckkraft: innen + </string> + <string name="Inner Eye Corner"> + Ecke: Nasenseite + </string> + <string name="Inner Eye Shadow"> + Innenlid + </string> + <string name="Inner Shadow"> + Innenlid + </string> + <string name="Jacket Length"> + Jackenlänge + </string> + <string name="Jacket Wrinkles"> + Jackenfalten + </string> + <string name="Jaw Angle"> + Kinnansatz + </string> + <string name="Jaw Jut"> + Kinnposition + </string> + <string name="Jaw Shape"> + Kinnform + </string> + <string name="Join"> + Zusammen + </string> + <string name="Jowls"> + Hängebacken + </string> + <string name="Knee Angle"> + Kniewinkel + </string> + <string name="Knock Kneed"> + X-beinig + </string> + <string name="Large"> + Groß + </string> + <string name="Large Hands"> + Große Hände + </string> + <string name="Left Part"> + Linksscheitel + </string> + <string name="Leg Length"> + Beinlänge + </string> + <string name="Leg Muscles"> + Beinmuskeln + </string> + <string name="Less"> + Weniger + </string> + <string name="Less Body Fat"> + Weniger Speck + </string> + <string name="Less Curtains"> + Weniger + </string> + <string name="Less Freckles"> + Weniger + </string> + <string name="Less Full"> + Weniger + </string> + <string name="Less Gravity"> + Weniger + </string> + <string name="Less Love"> + Weniger + </string> + <string name="Less Muscles"> + Weniger + </string> + <string name="Less Muscular"> + Weniger + </string> + <string name="Less Rosy"> + Weniger + </string> + <string name="Less Round"> + Weniger + </string> + <string name="Less Saddle"> + Weniger + </string> + <string name="Less Square"> + Weniger + </string> + <string name="Less Volume"> + Weniger + </string> + <string name="Less soul"> + Weniger + </string> + <string name="Lighter"> + Heller + </string> + <string name="Lip Cleft"> + Amorbogen + </string> + <string name="Lip Cleft Depth"> + Tiefe: Amorbogen + </string> + <string name="Lip Fullness"> + Fülle + </string> + <string name="Lip Pinkness"> + Pinkton + </string> + <string name="Lip Ratio"> + Lippenproportionen + </string> + <string name="Lip Thickness"> + Lippendicke + </string> + <string name="Lip Width"> + Mundbreite + </string> + <string name="Lipgloss"> + Lipgloss + </string> + <string name="Lipstick"> + Lippenstift + </string> + <string name="Lipstick Color"> + Farbe + </string> + <string name="Long"> + Lang + </string> + <string name="Long Head"> + Langer Kopf + </string> + <string name="Long Hips"> + Lange Hüften + </string> + <string name="Long Legs"> + Lange Beine + </string> + <string name="Long Neck"> + Langer Hals + </string> + <string name="Long Pigtails"> + Lange Zöpfe + </string> + <string name="Long Ponytail"> + Langer Pferdeschwanz + </string> + <string name="Long Torso"> + Langer Oberkörper + </string> + <string name="Long arms"> + Lange Arme + </string> + <string name="Loose Pants"> + Weite Hosen + </string> + <string name="Loose Shirt"> + Weites Hemd + </string> + <string name="Loose Sleeves"> + Weite Ärmel + </string> + <string name="Love Handles"> + Fettpölsterchen + </string> + <string name="Low"> + Niedrig + </string> + <string name="Low Heels"> + Niedrig + </string> + <string name="Low Jaw"> + Niedrig + </string> + <string name="Low Platforms"> + Niedrig + </string> + <string name="Low and Loose"> + Weit + </string> + <string name="Lower"> + Absenken + </string> + <string name="Lower Bridge"> + Brücke, Unterer Teil + </string> + <string name="Lower Cheeks"> + Wangen, unterer Bereich + </string> + <string name="Male"> + Männlich + </string> + <string name="Middle Part"> + Mittelscheitel + </string> + <string name="More"> + Mehr + </string> + <string name="More Blush"> + Mehr + </string> + <string name="More Body Fat"> + Mehr Speck + </string> + <string name="More Curtains"> + Mehr + </string> + <string name="More Eyeshadow"> + Mehr + </string> + <string name="More Freckles"> + Mehr + </string> + <string name="More Full"> + Voller + </string> + <string name="More Gravity"> + Mehr + </string> + <string name="More Lipstick"> + Mehr + </string> + <string name="More Love"> + Mehr + </string> + <string name="More Lower Lip"> + Größer + </string> + <string name="More Muscles"> + Mehr + </string> + <string name="More Muscular"> + Mehr + </string> + <string name="More Rosy"> + Mehr + </string> + <string name="More Round"> + Runder + </string> + <string name="More Saddle"> + Mehr + </string> + <string name="More Sloped"> + Flach + </string> + <string name="More Square"> + Eckiger + </string> + <string name="More Upper Lip"> + Mehr + </string> + <string name="More Vertical"> + Steil + </string> + <string name="More Volume"> + Mehr + </string> + <string name="More soul"> + Mehr + </string> + <string name="Moustache"> + Schnauzer + </string> + <string name="Mouth Corner"> + Mundwinkel + </string> + <string name="Mouth Position"> + Mundposition + </string> + <string name="Mowhawk"> + Irokese + </string> + <string name="Muscular"> + Muskulös + </string> + <string name="Mutton Chops"> + Koteletten + </string> + <string name="Nail Polish"> + Nagellack + </string> + <string name="Nail Polish Color"> + Farbe + </string> + <string name="Narrow"> + Schmal + </string> + <string name="Narrow Back"> + Wenig + </string> + <string name="Narrow Front"> + Wenig + </string> + <string name="Narrow Lips"> + Schmale Lippen + </string> + <string name="Natural"> + Natürlich + </string> + <string name="Neck Length"> + Halslänge + </string> + <string name="Neck Thickness"> + Halsdicke + </string> + <string name="No Blush"> + Kein Rouge + </string> + <string name="No Eyeliner"> + Kein Eyeliner + </string> + <string name="No Eyeshadow"> + Kein Lidschatten + </string> + <string name="No Lipgloss"> + Kein Lipgloss + </string> + <string name="No Lipstick"> + Kein Lippenstift + </string> + <string name="No Part"> + Kein Scheitel + </string> + <string name="No Polish"> + Kein Nagellack + </string> + <string name="No Red"> + Nicht rot + </string> + <string name="No Spikes"> + Keine Stachel + </string> + <string name="No White"> + Kein Weiß + </string> + <string name="No Wrinkles"> + Keine Falten + </string> + <string name="Normal Lower"> + Normal unten + </string> + <string name="Normal Upper"> + Normal oben + </string> + <string name="Nose Left"> + Links + </string> + <string name="Nose Right"> + Rechts + </string> + <string name="Nose Size"> + Größe + </string> + <string name="Nose Thickness"> + Dicke + </string> + <string name="Nose Tip Angle"> + Nasenspitze + </string> + <string name="Nose Tip Shape"> + Nasenspitze + </string> + <string name="Nose Width"> + Nasenbreite + </string> + <string name="Nostril Division"> + Teilung + </string> + <string name="Nostril Width"> + Größe + </string> + <string name="Opaque"> + Deckend + </string> + <string name="Open"> + Öffnen + </string> + <string name="Open Back"> + Hinten offen + </string> + <string name="Open Front"> + Vorne offen + </string> + <string name="Open Left"> + Links offen + </string> + <string name="Open Right"> + Rechts offen + </string> + <string name="Orange"> + Orange + </string> + <string name="Out"> + Aus + </string> + <string name="Out Shdw Color"> + Farbe: Oben + </string> + <string name="Out Shdw Opacity"> + Deckkraft: Oben + </string> + <string name="Outer Eye Corner"> + Äußerer Augenwinkel + </string> + <string name="Outer Eye Shadow"> + Lidschatten: Oben + </string> + <string name="Outer Shadow"> + Lidschatten: Oben + </string> + <string name="Overbite"> + Überbiss + </string> + <string name="Package"> + Ausbeulung + </string> + <string name="Painted Nails"> + Lackierte Nägel + </string> + <string name="Pale"> + Blass + </string> + <string name="Pants Crotch"> + Schritt + </string> + <string name="Pants Fit"> + Passform + </string> + <string name="Pants Length"> + Hosenlänge + </string> + <string name="Pants Waist"> + Hüfte + </string> + <string name="Pants Wrinkles"> + Falten + </string> + <string name="Part"> + Scheitel + </string> + <string name="Part Bangs"> + Pony scheiteln + </string> + <string name="Pectorals"> + Brustmuskel + </string> + <string name="Pigment"> + Pigmentierung + </string> + <string name="Pigtails"> + Zöpfe + </string> + <string name="Pink"> + Pink + </string> + <string name="Pinker"> + Mehr Pink + </string> + <string name="Platform Height"> + Höhe + </string> + <string name="Platform Width"> + Breite + </string> + <string name="Pointy"> + Spitz + </string> + <string name="Pointy Heels"> + Pfennigabsätze + </string> + <string name="Ponytail"> + Pferdeschwanz + </string> + <string name="Poofy Skirt"> + Weit ausgestellt + </string> + <string name="Pop Left Eye"> + Linkes Auge größer + </string> + <string name="Pop Right Eye"> + Rechtes Auge größer + </string> + <string name="Puffy"> + Geschwollen + </string> + <string name="Puffy Eyelids"> + Geschwollene Lider + </string> + <string name="Rainbow Color"> + Regenbogenfarben + </string> + <string name="Red Hair"> + Rote Haare + </string> + <string name="Regular"> + Normal + </string> + <string name="Right Part"> + Scheitel rechts + </string> + <string name="Rosy Complexion"> + Rosiger Teint + </string> + <string name="Round"> + Rund + </string> + <string name="Ruddiness"> + Röte + </string> + <string name="Ruddy"> + Rötlich + </string> + <string name="Rumpled Hair"> + Zerzauste Haare + </string> + <string name="Saddle Bags"> + Hüftspeck + </string> + <string name="Scrawny Leg"> + Dürres Bein + </string> + <string name="Separate"> + Auseinander + </string> + <string name="Shallow"> + Flach + </string> + <string name="Shear Back"> + Hinterkopf rasiert + </string> + <string name="Shear Face"> + Gesicht verzerren + </string> + <string name="Shear Front"> + Vorne rasiert + </string> + <string name="Shear Left Up"> + Links + </string> + <string name="Shear Right Up"> + Rechts + </string> + <string name="Sheared Back"> + Hinterkopf rasiert + </string> + <string name="Sheared Front"> + Vorne rasiert + </string> + <string name="Shift Left"> + Nach links + </string> + <string name="Shift Mouth"> + Mund verschieben + </string> + <string name="Shift Right"> + Nach rechts + </string> + <string name="Shirt Bottom"> + Hemdlänge + </string> + <string name="Shirt Fit"> + Passform + </string> + <string name="Shirt Wrinkles"> + Falten + </string> + <string name="Shoe Height"> + Schuhart + </string> + <string name="Short"> + Klein + </string> + <string name="Short Arms"> + Kurze Arme + </string> + <string name="Short Legs"> + Kurze Beine + </string> + <string name="Short Neck"> + Kurzer Hals + </string> + <string name="Short Pigtails"> + Kurze Zöpfe + </string> + <string name="Short Ponytail"> + Kurzer Pferdeschwanz + </string> + <string name="Short Sideburns"> + Kurze Koteletten + </string> + <string name="Short Torso"> + Kurzer Oberkörper + </string> + <string name="Short hips"> + Kurze Hüften + </string> + <string name="Shoulders"> + Schultern + </string> + <string name="Side Fringe"> + Seitliche Fransen + </string> + <string name="Sideburns"> + Koteletten + </string> + <string name="Sides Hair"> + Seitliches Haar + </string> + <string name="Sides Hair Down"> + Lang + </string> + <string name="Sides Hair Up"> + Kurz + </string> + <string name="Skinny Neck"> + Dünner Hals + </string> + <string name="Skirt Fit"> + Passform + </string> + <string name="Skirt Length"> + Rocklänge + </string> + <string name="Slanted Forehead"> + Fliehende Stirn + </string> + <string name="Sleeve Length"> + Ärmellänge + </string> + <string name="Sleeve Looseness"> + Passform Ärmel + </string> + <string name="Slit Back"> + Schlitz: Hinten + </string> + <string name="Slit Front"> + Schlitz: Vorne + </string> + <string name="Slit Left"> + Schlitz: Links + </string> + <string name="Slit Right"> + Schlitz: Rechts + </string> + <string name="Small"> + Klein + </string> + <string name="Small Hands"> + Kleine Hände + </string> + <string name="Small Head"> + Klein + </string> + <string name="Smooth"> + Glätten + </string> + <string name="Smooth Hair"> + Glattes Haar + </string> + <string name="Socks Length"> + Strumpflänge + </string> + <string name="Soulpatch"> + Unterlippenbart + </string> + <string name="Sparse"> + Wenig + </string> + <string name="Spiked Hair"> + Stachelhaare + </string> + <string name="Square"> + Rechteck + </string> + <string name="Square Toe"> + Eckig + </string> + <string name="Squash Head"> + Gestaucht + </string> + <string name="Stretch Head"> + Gestreckt + </string> + <string name="Sunken"> + Eingefallen + </string> + <string name="Sunken Chest"> + Trichterbrust + </string> + <string name="Sunken Eyes"> + Eingesunkene Augen + </string> + <string name="Sweep Back"> + Nach hinten + </string> + <string name="Sweep Forward"> + Nach vorne + </string> + <string name="Tall"> + Groß + </string> + <string name="Taper Back"> + Ansatzbreite hinten + </string> + <string name="Taper Front"> + Ansatzbreite vorne + </string> + <string name="Thick Heels"> + Dicke Absätze + </string> + <string name="Thick Neck"> + Dicker Hals + </string> + <string name="Thick Toe"> + Dick + </string> + <string name="Thin"> + Dünn + </string> + <string name="Thin Eyebrows"> + Dünne Augenbrauen + </string> + <string name="Thin Lips"> + Dünne Lippen + </string> + <string name="Thin Nose"> + Dünne Nase + </string> + <string name="Tight Chin"> + Straffes Kinn + </string> + <string name="Tight Cuffs"> + Eng + </string> + <string name="Tight Pants"> + Enge Hosen + </string> + <string name="Tight Shirt"> + Enges Hemd + </string> + <string name="Tight Skirt"> + Enger Rock + </string> + <string name="Tight Sleeves"> + Enge Ärmel + </string> + <string name="Toe Shape"> + Spitze + </string> + <string name="Toe Thickness"> + Dicke + </string> + <string name="Torso Length"> + Länge des Oberkörpers + </string> + <string name="Torso Muscles"> + Muskeln + </string> + <string name="Torso Scrawny"> + Dürr + </string> + <string name="Unattached"> + Frei + </string> + <string name="Uncreased"> + Straffes Lid + </string> + <string name="Underbite"> + Unterbiss + </string> + <string name="Unnatural"> + Unnatürlich + </string> + <string name="Upper Bridge"> + Brücke, oberer Teil + </string> + <string name="Upper Cheeks"> + Obere Wangen + </string> + <string name="Upper Chin Cleft"> + Obere Kinnspalte + </string> + <string name="Upper Eyelid Fold"> + Obere Lidfalte + </string> + <string name="Upturned"> + Stupsnase + </string> + <string name="Very Red"> + Sehr rot + </string> + <string name="Waist Height"> + Bund + </string> + <string name="Well-Fed"> + Gut genährt + </string> + <string name="White Hair"> + Weiße Haare + </string> + <string name="Wide"> + Breit + </string> + <string name="Wide Back"> + Breit + </string> + <string name="Wide Front"> + Breit + </string> + <string name="Wide Lips"> + Breit + </string> + <string name="Wild"> + Wild + </string> + <string name="Wrinkles"> + Falten + </string> + <string name="LocationCtrlAddLandmarkTooltip"> + Zu meinen Landmarken hinzufügen + </string> + <string name="LocationCtrlEditLandmarkTooltip"> + Meine Landmarken bearbeiten + </string> + <string name="LocationCtrlInfoBtnTooltip"> + Weitere Informationen über die aktuelle Position + </string> + <string name="LocationCtrlComboBtnTooltip"> + Mein Reiseverlauf + </string> + <string name="LocationCtrlForSaleTooltip"> + Dieses Land kaufen + </string> + <string name="LocationCtrlVoiceTooltip"> + Voice hier nicht möglich + </string> + <string name="LocationCtrlFlyTooltip"> + Fliegen ist unzulässig + </string> + <string name="LocationCtrlPushTooltip"> + Kein Stoßen + </string> + <string name="LocationCtrlBuildTooltip"> + Bauen/Fallen lassen von Objekten ist verboten + </string> + <string name="LocationCtrlScriptsTooltip"> + Skripte sind unzulässig + </string> + <string name="LocationCtrlDamageTooltip"> + Gesundheit + </string> + <string name="LocationCtrlAdultIconTooltip"> + Adult-Region + </string> + <string name="LocationCtrlModerateIconTooltip"> + Moderate Region + </string> + <string name="LocationCtrlGeneralIconTooltip"> + Generelle Region + </string> + <string name="LocationCtrlSeeAVsTooltip"> + Avatare in dieser Parzelle können von Avataren außerhalb dieser Parzelle weder gesehen noch gehört werden + </string> + <string name="LocationCtrlPathfindingDirtyTooltip"> + Bewegliche Objekte verhalten sich in dieser Region u. U. erst dann korrekt, wenn die Region neu geformt wird. + </string> + <string name="LocationCtrlPathfindingDisabledTooltip"> + Dynamisches Pathfinding ist in dieser Region nicht aktiviert. + </string> + <string name="UpdaterWindowTitle"> + [APP_NAME] Aktualisierung + </string> + <string name="UpdaterNowUpdating"> + [APP_NAME] wird aktualisiert... + </string> + <string name="UpdaterNowInstalling"> + [APP_NAME] wird installiert... + </string> + <string name="UpdaterUpdatingDescriptive"> + Ihr [APP_NAME]-Viewer wird aktualisiert. Dies kann einen Moment dauern. Wir bitten um Ihr Verständnis. + </string> + <string name="UpdaterProgressBarTextWithEllipses"> + Aktualisierung wird heruntergeladen... + </string> + <string name="UpdaterProgressBarText"> + Aktualisierung wird heruntergeladen + </string> + <string name="UpdaterFailDownloadTitle"> + Herunterladen ist fehlgeschlagen + </string> + <string name="UpdaterFailUpdateDescriptive"> + Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte laden Sie die aktuellste Version von www.secondlife.com herunter. + </string> + <string name="UpdaterFailInstallTitle"> + Aktualisierung konnte nicht installiert werden + </string> + <string name="UpdaterFailStartTitle"> + Viewer konnte nicht gestartet werden + </string> + <string name="ItemsComingInTooFastFrom"> + [APP_NAME]: Zuviele Objekte auf einmal von [FROM_NAME]. Automaitsche Vorschau ist für [TIME] Sekunden nicht verfügbar. + </string> + <string name="ItemsComingInTooFast"> + [APP_NAME]: Zuviele Objekte auf einmal. Automaitsche Vorschau ist für [TIME] Sekunden nicht verfügbar. + </string> + <string name="IM_logging_string"> + -- Instant-Message-Protokoll aktiviert -- + </string> + <string name="IM_typing_start_string"> + [NAME] tippt... + </string> + <string name="Unnamed"> + (Nicht benannt) + </string> + <string name="IM_moderated_chat_label"> + (Moderiert: Stimmen in der Standardeinstellung stummgeschaltet) + </string> + <string name="IM_unavailable_text_label"> + Für diese Verbindung ist kein Text-Chat verfügbar. + </string> + <string name="IM_muted_text_label"> + Ihr Text-Chat wurde von einem Gruppenmoderator deaktiviert. + </string> + <string name="IM_default_text_label"> + Für Instant Message hier klicken. + </string> + <string name="IM_to_label"> + An + </string> + <string name="IM_moderator_label"> + (Moderator) + </string> + <string name="Saved_message"> + (Gespeichert am [LONG_TIMESTAMP]) + </string> + <string name="IM_unblock_only_groups_friends"> + Wenn Sie diese Meldung sehen, müssen Sie unter „Einstellungen“ > „Privatsphäre“ die Option „Nur IMs und Anrufe von Freunden oder Gruppen durchstellen“ deaktivieren. + </string> + <string name="OnlineStatus"> + Online + </string> + <string name="OfflineStatus"> + Offline + </string> + <string name="not_online_msg"> + Benutzer nicht online – Nachricht wird gespeichert und später zugestellt. + </string> + <string name="not_online_inventory"> + Benutzer nicht online – Inventar gespeichert. + </string> + <string name="answered_call"> + Ihr Anruf wurde entgegengenommen + </string> + <string name="you_started_call"> + Sie haben einen Voice-Anruf begonnen + </string> + <string name="you_joined_call"> + Sie sind dem Gespräch beigetreten + </string> + <string name="you_auto_rejected_call-im"> + Sie haben den Voice-Anruf automatisch abgelehnt, während der Nicht-stören-Modus aktiviert war. + </string> + <string name="name_started_call"> + [NAME] hat einen Voice-Anruf begonnen + </string> + <string name="ringing-im"> + Verbindung wird hergestellt... + </string> + <string name="connected-im"> + Verbunden. Klicken Sie auf Anruf beenden, um die Verbindung zu trennen + </string> + <string name="hang_up-im"> + Anruf wurde beendet + </string> + <string name="answering-im"> + Wird verbunden... + </string> + <string name="conference-title"> + Chat mit mehreren Personen + </string> + <string name="conference-title-incoming"> + Konferenz mit [AGENT_NAME] + </string> + <string name="inventory_item_offered-im"> + Inventarobjekt „[ITEM_NAME]“ angeboten + </string> + <string name="inventory_folder_offered-im"> + Inventarordner „[ITEM_NAME]“ angeboten + </string> + <string name="bot_warning"> + Sie chatten mit einem Bot, [NAME]. Geben Sie keine persönlichen Informationen weiter. +Erfahren Sie mehr unter https://second.life/scripted-agents. + </string> + <string name="share_alert"> + Objekte aus dem Inventar hier her ziehen + </string> + <string name="facebook_post_success"> + Sie haben auf Facebook gepostet. + </string> + <string name="flickr_post_success"> + Sie haben auf Flickr gepostet. + </string> + <string name="twitter_post_success"> + Sie haben auf Twitter gepostet. + </string> + <string name="no_session_message"> + (IM-Session nicht vorhanden) + </string> + <string name="only_user_message"> + Sie sind der einzige Benutzer in dieser Sitzung. + </string> + <string name="offline_message"> + [NAME] ist offline. + </string> + <string name="invite_message"> + Klicken Sie auf [BUTTON NAME], um eine Verbindung zu diesem Voice-Chat herzustellen. + </string> + <string name="muted_message"> + Sie haben diesen Einwohner ignoriert. Wenn Sie eine Nachricht senden, wird dieser freigeschaltet. + </string> + <string name="generic"> + Fehler bei Anfrage, bitte versuchen Sie es später. + </string> + <string name="generic_request_error"> + Fehler bei Anfrage, bitte versuchen Sie es später. + </string> + <string name="insufficient_perms_error"> + Sie sind dazu nicht berechtigt. + </string> + <string name="session_does_not_exist_error"> + Die Sitzung ist abgelaufen + </string> + <string name="no_ability_error"> + Sie besitzen diese Fähigkeit nicht. + </string> + <string name="no_ability"> + Sie besitzen diese Fähigkeit nicht. + </string> + <string name="not_a_mod_error"> + Sie sind kein Sitzungsmoderator. + </string> + <string name="muted"> + Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert. + </string> + <string name="muted_error"> + Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert. + </string> + <string name="add_session_event"> + Es konnten keine Benutzer zur Chat-Sitzung mit [RECIPIENT] hinzugefügt werden. + </string> + <string name="message"> + Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden. + </string> + <string name="message_session_event"> + Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden. + </string> + <string name="mute"> + Fehler während Moderation. + </string> + <string name="removed"> + Sie wurden von der Gruppe ausgeschlossen. + </string> + <string name="removed_from_group"> + Sie wurden von der Gruppe ausgeschlossen. + </string> + <string name="close_on_no_ability"> + Sie haben nicht mehr die Berechtigung an der Chat-Sitzung teilzunehmen. + </string> + <string name="unread_chat_single"> + [SOURCES] hat etwas Neues gesagt + </string> + <string name="unread_chat_multiple"> + [SOURCES] haben etwas Neues gesagt + </string> + <string name="session_initialization_timed_out_error"> + Die Initialisierung der Sitzung ist fehlgeschlagen + </string> + <string name="Home position set."> + Position für Zuhause festgelegt. + </string> + <string name="voice_morphing_url"> + https://secondlife.com/destination/voice-island + </string> + <string name="premium_voice_morphing_url"> + https://secondlife.com/destination/voice-morphing-premium + </string> + <string name="paid_you_ldollars"> + [NAME] hat Ihnen [REASON] [AMOUNT] L$ bezahlt. + </string> + <string name="paid_you_ldollars_gift"> + [NAME] hat Ihnen [AMOUNT] L$ bezahlt: [REASON] + </string> + <string name="paid_you_ldollars_no_reason"> + [NAME] hat Ihnen [AMOUNT] L$ bezahlt. + </string> + <string name="you_paid_ldollars"> + Sie haben [REASON] [AMOUNT] L$ an [NAME] bezahlt. + </string> + <string name="you_paid_ldollars_gift"> + Sie haben [NAME] [AMOUNT] L$ bezahlt: [REASON] + </string> + <string name="you_paid_ldollars_no_info"> + Sie haben [AMOUNT] L$ bezahlt. + </string> + <string name="you_paid_ldollars_no_reason"> + Sie haben [AMOUNT] L$ an [NAME] bezahlt. + </string> + <string name="you_paid_ldollars_no_name"> + Sie haben [REASON] [AMOUNT] L$ bezahlt. + </string> + <string name="you_paid_failure_ldollars"> + Sie haben [NAME] [AMOUNT] L$ [REASON] nicht bezahlt. + </string> + <string name="you_paid_failure_ldollars_gift"> + Sie haben [NAME] [AMOUNT] L$ nicht bezahlt: [REASON] + </string> + <string name="you_paid_failure_ldollars_no_info"> + Sie haben [AMOUNT] L$ nicht bezahlt. + </string> + <string name="you_paid_failure_ldollars_no_reason"> + Sie haben [NAME] [AMOUNT] L$ nicht bezahlt. + </string> + <string name="you_paid_failure_ldollars_no_name"> + Sie haben [AMOUNT] L$ [REASON] nicht bezahlt. + </string> + <string name="for item"> + für [ITEM] + </string> + <string name="for a parcel of land"> + für eine Landparzelle + </string> + <string name="for a land access pass"> + für einen Pass + </string> + <string name="for deeding land"> + für die Landübertragung + </string> + <string name="to create a group"> + für die Gründung einer Gruppe + </string> + <string name="to join a group"> + für den Beitritt zur Gruppe + </string> + <string name="to upload"> + fürs Hochladen + </string> + <string name="to publish a classified ad"> + um eine Anzeige aufzugeben + </string> + <string name="giving"> + [AMOUNT] L$ werden bezahlt + </string> + <string name="uploading_costs"> + Kosten für Hochladen [AMOUNT] L$ + </string> + <string name="this_costs"> + Kosten: [AMOUNT] L$ + </string> + <string name="buying_selected_land"> + Ausgewähltes Land wird für [AMOUNT] L$ gekauft. + </string> + <string name="this_object_costs"> + Dieses Objekt kostet [AMOUNT] L$ + </string> + <string name="group_role_everyone"> + Jeder + </string> + <string name="group_role_officers"> + Offiziere + </string> + <string name="group_role_owners"> + Eigentümer + </string> + <string name="group_member_status_online"> + Online + </string> + <string name="uploading_abuse_report"> + Hochladen... -Missbrauchsbericht</string> - <string name="New Shape">Neue Form/Gestalt</string> - <string name="New Skin">Neue Haut</string> - <string name="New Hair">Neues Haar</string> - <string name="New Eyes">Neue Augen</string> - <string name="New Shirt">Neues Hemd</string> - <string name="New Pants">Neue Hose</string> - <string name="New Shoes">Neue Schuhe</string> - <string name="New Socks">Neue Socken</string> - <string name="New Jacket">Neue Jacke</string> - <string name="New Gloves">Neue Handschuhe</string> - <string name="New Undershirt">Neues Unterhemd</string> - <string name="New Underpants">Neue Unterhose</string> - <string name="New Skirt">Neuer Rock</string> - <string name="New Alpha">Neues Alpha</string> - <string name="New Tattoo">Neue Tätowierung</string> - <string name="New Universal">Neues Universal</string> - <string name="New Physics">Neue Physik</string> - <string name="Invalid Wearable">Ungültiges Objekt</string> - <string name="New Gesture">Neue Geste</string> - <string name="New Script">Neues Skript</string> - <string name="New Note">Neue Notiz</string> - <string name="New Folder">Neuer Ordner</string> - <string name="Contents">Inhalt</string> - <string name="Gesture">Gesten</string> - <string name="Male Gestures">Männliche Gesten</string> - <string name="Female Gestures">Weibliche Gesten</string> - <string name="Other Gestures">Andere Gesten</string> - <string name="Speech Gestures">Sprachgesten</string> - <string name="Common Gestures">Häufig verwendete Gesten</string> - <string name="Male - Excuse me">Männlich - Excuse me</string> - <string name="Male - Get lost">Männlich - Get lost</string> - <string name="Male - Blow kiss">Männlich - Kusshand</string> - <string name="Male - Boo">Männlich - Buh</string> - <string name="Male - Bored">Männlich - Gelangweilt</string> - <string name="Male - Hey">Männlich - Hey</string> - <string name="Male - Laugh">Männlich - Lachen</string> - <string name="Male - Repulsed">Männlich - Angewidert</string> - <string name="Male - Shrug">Männlich - Achselzucken</string> - <string name="Male - Stick tougue out">Männlich - Zunge herausstrecken</string> - <string name="Male - Wow">Männlich - Wow</string> - <string name="Female - Chuckle">Weiblich - Kichern</string> - <string name="Female - Cry">Weiblich - Weinen</string> - <string name="Female - Embarrassed">Weiblich - Verlegen</string> - <string name="Female - Excuse me">Weiblich - Räuspern</string> - <string name="Female - Get lost">Weiblich - Get lost</string> - <string name="Female - Blow kiss">Weiblich - Kusshand</string> - <string name="Female - Boo">Weiblich - Buh</string> - <string name="Female - Bored">Weiblich - Gelangweilt</string> - <string name="Female - Hey">Weiblich - Hey</string> - <string name="Female - Hey baby">Weiblich - Hey Süße(r)</string> - <string name="Female - Laugh">Weiblich - Lachen</string> - <string name="Female - Looking good">Weiblich - Looking good</string> - <string name="Female - Over here">Weiblich - Over here</string> - <string name="Female - Please">Weiblich - Please</string> - <string name="Female - Repulsed">Weiblich - Angewidert</string> - <string name="Female - Shrug">Weiblich - Achselzucken</string> - <string name="Female - Stick tougue out">Weiblich - Zunge herausstrecken</string> - <string name="Female - Wow">Weiblich - Wow</string> - <string name="New Daycycle">Neuer Tageszyklus</string> - <string name="New Water">Neues Wasser</string> - <string name="New Sky">Neuer Himmel</string> - <string name="/bow">/verbeugen</string> - <string name="/clap">/klatschen</string> - <string name="/count">/zählen</string> - <string name="/extinguish">/löschen</string> - <string name="/kmb">/lmaa</string> - <string name="/muscle">/Muskel</string> - <string name="/no">/nein</string> - <string name="/no!">/nein!</string> - <string name="/paper">/Papier</string> - <string name="/pointme">/auf mich zeigen</string> - <string name="/pointyou">/auf dich zeigen</string> - <string name="/rock">/Stein</string> - <string name="/scissor">/Schere</string> - <string name="/smoke">/rauchen</string> - <string name="/stretch">/dehnen</string> - <string name="/whistle">/pfeifen</string> - <string name="/yes">/ja</string> - <string name="/yes!">/ja!</string> - <string name="afk">afk</string> - <string name="dance1">Tanzen1</string> - <string name="dance2">Tanzen2</string> - <string name="dance3">Tanzen3</string> - <string name="dance4">Tanzen4</string> - <string name="dance5">Tanzen5</string> - <string name="dance6">Tanzen6</string> - <string name="dance7">Tanzen7</string> - <string name="dance8">Tanzen8</string> - <string name="AvatarBirthDateFormat">[mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]</string> - <string name="DefaultMimeType">Keine/Keiner</string> - <string name="texture_load_dimensions_error">Bilder, die größer sind als [WIDTH]*[HEIGHT] können nicht geladen werden</string> - <string name="outfit_photo_load_dimensions_error">Max. Fotogröße für Outfit ist [WIDTH]*[HEIGHT]. Bitte verkleinern Sie das Bild oder verwenden Sie ein anderes.</string> - <string name="outfit_photo_select_dimensions_error">Max. Fotogröße für Outfit ist [WIDTH]*[HEIGHT]. Bitte wählen Sie eine andere Textur aus.</string> - <string name="outfit_photo_verify_dimensions_error">Fotoabmessungen können nicht bestätigt werden. Bitte warten Sie, bis die Fotogröße im Auswahlfenster angezeigt wird.</string> +Missbrauchsbericht + </string> + <string name="New Shape"> + Neue Form/Gestalt + </string> + <string name="New Skin"> + Neue Haut + </string> + <string name="New Hair"> + Neues Haar + </string> + <string name="New Eyes"> + Neue Augen + </string> + <string name="New Shirt"> + Neues Hemd + </string> + <string name="New Pants"> + Neue Hose + </string> + <string name="New Shoes"> + Neue Schuhe + </string> + <string name="New Socks"> + Neue Socken + </string> + <string name="New Jacket"> + Neue Jacke + </string> + <string name="New Gloves"> + Neue Handschuhe + </string> + <string name="New Undershirt"> + Neues Unterhemd + </string> + <string name="New Underpants"> + Neue Unterhose + </string> + <string name="New Skirt"> + Neuer Rock + </string> + <string name="New Alpha"> + Neues Alpha + </string> + <string name="New Tattoo"> + Neue Tätowierung + </string> + <string name="New Universal"> + Neues Universal + </string> + <string name="New Physics"> + Neue Physik + </string> + <string name="Invalid Wearable"> + Ungültiges Objekt + </string> + <string name="New Gesture"> + Neue Geste + </string> + <string name="New Script"> + Neues Skript + </string> + <string name="New Note"> + Neue Notiz + </string> + <string name="New Folder"> + Neuer Ordner + </string> + <string name="Contents"> + Inhalt + </string> + <string name="Gesture"> + Gesten + </string> + <string name="Male Gestures"> + Männliche Gesten + </string> + <string name="Female Gestures"> + Weibliche Gesten + </string> + <string name="Other Gestures"> + Andere Gesten + </string> + <string name="Speech Gestures"> + Sprachgesten + </string> + <string name="Common Gestures"> + Häufig verwendete Gesten + </string> + <string name="Male - Excuse me"> + Männlich - Excuse me + </string> + <string name="Male - Get lost"> + Männlich - Get lost + </string> + <string name="Male - Blow kiss"> + Männlich - Kusshand + </string> + <string name="Male - Boo"> + Männlich - Buh + </string> + <string name="Male - Bored"> + Männlich - Gelangweilt + </string> + <string name="Male - Hey"> + Männlich - Hey + </string> + <string name="Male - Laugh"> + Männlich - Lachen + </string> + <string name="Male - Repulsed"> + Männlich - Angewidert + </string> + <string name="Male - Shrug"> + Männlich - Achselzucken + </string> + <string name="Male - Stick tougue out"> + Männlich - Zunge herausstrecken + </string> + <string name="Male - Wow"> + Männlich - Wow + </string> + <string name="Female - Chuckle"> + Weiblich - Kichern + </string> + <string name="Female - Cry"> + Weiblich - Weinen + </string> + <string name="Female - Embarrassed"> + Weiblich - Verlegen + </string> + <string name="Female - Excuse me"> + Weiblich - Räuspern + </string> + <string name="Female - Get lost"> + Weiblich - Get lost + </string> + <string name="Female - Blow kiss"> + Weiblich - Kusshand + </string> + <string name="Female - Boo"> + Weiblich - Buh + </string> + <string name="Female - Bored"> + Weiblich - Gelangweilt + </string> + <string name="Female - Hey"> + Weiblich - Hey + </string> + <string name="Female - Hey baby"> + Weiblich - Hey Süße(r) + </string> + <string name="Female - Laugh"> + Weiblich - Lachen + </string> + <string name="Female - Looking good"> + Weiblich - Looking good + </string> + <string name="Female - Over here"> + Weiblich - Over here + </string> + <string name="Female - Please"> + Weiblich - Please + </string> + <string name="Female - Repulsed"> + Weiblich - Angewidert + </string> + <string name="Female - Shrug"> + Weiblich - Achselzucken + </string> + <string name="Female - Stick tougue out"> + Weiblich - Zunge herausstrecken + </string> + <string name="Female - Wow"> + Weiblich - Wow + </string> + <string name="New Daycycle"> + Neuer Tageszyklus + </string> + <string name="New Water"> + Neues Wasser + </string> + <string name="New Sky"> + Neuer Himmel + </string> + <string name="/bow"> + /verbeugen + </string> + <string name="/clap"> + /klatschen + </string> + <string name="/count"> + /zählen + </string> + <string name="/extinguish"> + /löschen + </string> + <string name="/kmb"> + /lmaa + </string> + <string name="/muscle"> + /Muskel + </string> + <string name="/no"> + /nein + </string> + <string name="/no!"> + /nein! + </string> + <string name="/paper"> + /Papier + </string> + <string name="/pointme"> + /auf mich zeigen + </string> + <string name="/pointyou"> + /auf dich zeigen + </string> + <string name="/rock"> + /Stein + </string> + <string name="/scissor"> + /Schere + </string> + <string name="/smoke"> + /rauchen + </string> + <string name="/stretch"> + /dehnen + </string> + <string name="/whistle"> + /pfeifen + </string> + <string name="/yes"> + /ja + </string> + <string name="/yes!"> + /ja! + </string> + <string name="afk"> + afk + </string> + <string name="dance1"> + Tanzen1 + </string> + <string name="dance2"> + Tanzen2 + </string> + <string name="dance3"> + Tanzen3 + </string> + <string name="dance4"> + Tanzen4 + </string> + <string name="dance5"> + Tanzen5 + </string> + <string name="dance6"> + Tanzen6 + </string> + <string name="dance7"> + Tanzen7 + </string> + <string name="dance8"> + Tanzen8 + </string> + <string name="AvatarBirthDateFormat"> + [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt] + </string> + <string name="DefaultMimeType"> + Keine/Keiner + </string> + <string name="texture_load_dimensions_error"> + Bilder, die größer sind als [WIDTH]*[HEIGHT] können nicht geladen werden + </string> + <string name="outfit_photo_load_dimensions_error"> + Max. Fotogröße für Outfit ist [WIDTH]*[HEIGHT]. Bitte verkleinern Sie das Bild oder verwenden Sie ein anderes. + </string> + <string name="outfit_photo_select_dimensions_error"> + Max. Fotogröße für Outfit ist [WIDTH]*[HEIGHT]. Bitte wählen Sie eine andere Textur aus. + </string> + <string name="outfit_photo_verify_dimensions_error"> + Fotoabmessungen können nicht bestätigt werden. Bitte warten Sie, bis die Fotogröße im Auswahlfenster angezeigt wird. + </string> <string name="words_separator" value=","/> - <string name="server_is_down">Trotz all unserer Bemühungen ist ein unerwarteter Fehler aufgetreten. + <string name="server_is_down"> + Trotz all unserer Bemühungen ist ein unerwarteter Fehler aufgetreten. Bitte überprüfen Sie http://status.secondlifegrid.net, um herauszufinden, ob ein Problem mit dem Service vorliegt. - Falls Sie weiterhin Problem haben, überprüfen Sie bitte Ihre Netzwerk- und Firewalleinstellungen.</string> - <string name="dateTimeWeekdaysNames">Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag</string> - <string name="dateTimeWeekdaysShortNames">So:Mo:Di:Mi:Do:Fr:Sa</string> - <string name="dateTimeMonthNames">Januar:Februar:März:April:Mai:Juni:Juli:August:September:Oktober:November:Dezember</string> - <string name="dateTimeMonthShortNames">Jan:Feb:Mär:Apr:Mai:Jun:Jul:Aug:Sep:Okt:Nov:Dez</string> - <string name="dateTimeDayFormat">[MDAY]</string> - <string name="dateTimeAM">Uhr</string> - <string name="dateTimePM">Uhr</string> - <string name="LocalEstimateUSD">[AMOUNT] US$</string> - <string name="Group Ban">Gruppenverbannung</string> - <string name="Membership">Mitgliedschaft</string> - <string name="Roles">Rollen</string> - <string name="Group Identity">Gruppenidentität</string> - <string name="Parcel Management">Parzellenverwaltung</string> - <string name="Parcel Identity">Parzellenidentität</string> - <string name="Parcel Settings">Parzelleneinstellungen</string> - <string name="Parcel Powers">Parzellenfähigkeiten</string> - <string name="Parcel Access">Parzellenzugang</string> - <string name="Parcel Content">Parzelleninhalt</string> - <string name="Object Management">Objektmanagement</string> - <string name="Accounting">Kontoführung</string> - <string name="Notices">Mitteilungen</string> - <string name="Chat" value=" Chat:">Chat</string> - <string name="BaseMembership">Basis</string> - <string name="PremiumMembership">Premium</string> - <string name="Premium_PlusMembership">Premium Plus</string> - <string name="DeleteItems">Ausgewählte Objekte löschen?</string> - <string name="DeleteItem">Ausgewähltes Objekt löschen?</string> - <string name="EmptyOutfitText">Keine Objekte in diesem Outfit</string> - <string name="ExternalEditorNotSet">Wählen Sie über die Einstellung „ExternalEditor“ einen Editor aus</string> - <string name="ExternalEditorNotFound">Angegebener externer Editor nicht gefunden. + Falls Sie weiterhin Problem haben, überprüfen Sie bitte Ihre Netzwerk- und Firewalleinstellungen. + </string> + <string name="dateTimeWeekdaysNames"> + Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag + </string> + <string name="dateTimeWeekdaysShortNames"> + So:Mo:Di:Mi:Do:Fr:Sa + </string> + <string name="dateTimeMonthNames"> + Januar:Februar:März:April:Mai:Juni:Juli:August:September:Oktober:November:Dezember + </string> + <string name="dateTimeMonthShortNames"> + Jan:Feb:Mär:Apr:Mai:Jun:Jul:Aug:Sep:Okt:Nov:Dez + </string> + <string name="dateTimeDayFormat"> + [MDAY] + </string> + <string name="dateTimeAM"> + AM + </string> + <string name="dateTimePM"> + PM + </string> + <string name="LocalEstimateUSD"> + [AMOUNT] US$ + </string> + <string name="Group Ban"> + Gruppenverbannung + </string> + <string name="Membership"> + Mitgliedschaft + </string> + <string name="Roles"> + Rollen + </string> + <string name="Group Identity"> + Gruppenidentität + </string> + <string name="Parcel Management"> + Parzellenverwaltung + </string> + <string name="Parcel Identity"> + Parzellenidentität + </string> + <string name="Parcel Settings"> + Parzelleneinstellungen + </string> + <string name="Parcel Powers"> + Parzellenfähigkeiten + </string> + <string name="Parcel Access"> + Parzellenzugang + </string> + <string name="Parcel Content"> + Parzelleninhalt + </string> + <string name="Object Management"> + Objektmanagement + </string> + <string name="Accounting"> + Kontoführung + </string> + <string name="Notices"> + Mitteilungen + </string> + <string name="Chat" value=" Chat:"> + Chat + </string> + <string name="BaseMembership"> + Basis + </string> + <string name="PremiumMembership"> + Premium + </string> + <string name="Premium_PlusMembership"> + Premium Plus + </string> + <string name="DeleteItems"> + Ausgewählte Objekte löschen? + </string> + <string name="DeleteItem"> + Ausgewähltes Objekt löschen? + </string> + <string name="EmptyOutfitText"> + Keine Objekte in diesem Outfit + </string> + <string name="ExternalEditorNotSet"> + Wählen Sie über die Einstellung „ExternalEditor“ einen Editor aus + </string> + <string name="ExternalEditorNotFound"> + Angegebener externer Editor nicht gefunden. Setzen Sie den Editorpfad in Anführungszeichen -(z. B. "/pfad/editor" "%s").</string> - <string name="ExternalEditorCommandParseError">Fehler beim Parsen des externen Editorbefehls.</string> - <string name="ExternalEditorFailedToRun">Externer Editor konnte nicht ausgeführt werden.</string> - <string name="TranslationFailed">Übersetzung fehlgeschlagen: [REASON]</string> - <string name="TranslationResponseParseError">Fehler beim Parsen der Übersetzungsantwort.</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">Zuhause</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">Addieren</string> - <string name="Subtract">Subtrahieren</string> - <string name="Multiply">Multiplizieren</string> - <string name="Divide">Dividieren</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">Partikel-Beacons werden angezeigt (blau)</string> - <string name="BeaconPhysical">Beacons für physische Objekte werden angezeigt (grün)</string> - <string name="BeaconScripted">Beacons für Skriptobjekte werden angezeigt (rot)</string> - <string name="BeaconScriptedTouch">Beacons für Skriptobjekte mit Berührungsfunktion werden angezeigt (rot)</string> - <string name="BeaconSound">Sound-Beacons werden angezeigt (gelb)</string> - <string name="BeaconMedia">Medien-Beacons werden angezeigt (weiß)</string> - <string name="BeaconSun">Sonnenrichtungs-Beacon ansehen (orange)</string> - <string name="BeaconMoon">Mondrichtungs-Beacon ansehen (lila)</string> - <string name="ParticleHiding">Partikel werden ausgeblendet</string> - <string name="Command_AboutLand_Label">Landinformationen</string> - <string name="Command_Appearance_Label">Aussehen</string> - <string name="Command_Avatar_Label">Avatar</string> - <string name="Command_Build_Label">Bauen</string> - <string name="Command_Chat_Label">Chat</string> - <string name="Command_Conversations_Label">Unterhaltungen</string> - <string name="Command_Compass_Label">Kompass</string> - <string name="Command_Destinations_Label">Ziele</string> - <string name="Command_Environments_Label">Meine Umgebungen</string> - <string name="Command_Facebook_Label">Facebook</string> - <string name="Command_Flickr_Label">Flickr</string> - <string name="Command_Gestures_Label">Gesten</string> - <string name="Command_Grid_Status_Label">Grid-Status</string> - <string name="Command_HowTo_Label">Infos</string> - <string name="Command_Inventory_Label">Inventar</string> - <string name="Command_Map_Label">Karte</string> - <string name="Command_Marketplace_Label">Marktplatz</string> - <string name="Command_MarketplaceListings_Label">Marktplatz</string> - <string name="Command_MiniMap_Label">Minikarte</string> - <string name="Command_Move_Label">Gehen / Rennen / Fliegen</string> - <string name="Command_Outbox_Label">Händler-Outbox</string> - <string name="Command_People_Label">Leute</string> - <string name="Command_Picks_Label">Auswahlen</string> - <string name="Command_Places_Label">Orte</string> - <string name="Command_Preferences_Label">Einstellungen</string> - <string name="Command_Profile_Label">Profil</string> - <string name="Command_Report_Abuse_Label">Missbrauch melden</string> - <string name="Command_Search_Label">Suchen</string> - <string name="Command_Snapshot_Label">Foto</string> - <string name="Command_Speak_Label">Sprechen</string> - <string name="Command_Twitter_Label">Twitter</string> - <string name="Command_View_Label">Kamerasteuerungen</string> - <string name="Command_Voice_Label">Voice-Einstellungen</string> - <string name="Command_AboutLand_Tooltip">Informationen zu dem von Ihnen besuchten Land</string> - <string name="Command_Appearance_Tooltip">Avatar ändern</string> - <string name="Command_Avatar_Tooltip">Kompletten Avatar auswählen</string> - <string name="Command_Build_Tooltip">Objekte bauen und Terrain umformen</string> - <string name="Command_Chat_Tooltip">Mit Leuten in der Nähe chatten</string> - <string name="Command_Conversations_Tooltip">Mit allen unterhalten</string> - <string name="Command_Compass_Tooltip">Kompass</string> - <string name="Command_Destinations_Tooltip">Ziele von Interesse</string> - <string name="Command_Environments_Tooltip">Meine Umgebungen</string> - <string name="Command_Facebook_Tooltip">Auf Facebook posten</string> - <string name="Command_Flickr_Tooltip">Auf Flickr hochladen</string> - <string name="Command_Gestures_Tooltip">Gesten für Ihren Avatar</string> - <string name="Command_Grid_Status_Tooltip">Aktuellen Grid-Status anzeigen</string> - <string name="Command_HowTo_Tooltip">Wie führe ich gängige Aufgaben aus?</string> - <string name="Command_Inventory_Tooltip">Ihr Eigentum anzeigen und benutzen</string> - <string name="Command_Map_Tooltip">Weltkarte</string> - <string name="Command_Marketplace_Tooltip">Einkaufen gehen</string> - <string name="Command_MarketplaceListings_Tooltip">Ihre Kreation verkaufen</string> - <string name="Command_MiniMap_Tooltip">Leute in der Nähe anzeigen</string> - <string name="Command_Move_Tooltip">Ihren Avatar bewegen</string> - <string name="Command_Outbox_Tooltip">Artikel zum Verkauf in den Marktplatz übertragen</string> - <string name="Command_People_Tooltip">Freunde, Gruppen und Leute in der Nähe</string> - <string name="Command_Picks_Tooltip">Orte, die in Ihrem Profil als Favoriten angezeigt werden sollen</string> - <string name="Command_Places_Tooltip">Von Ihnen gespeicherte Orte</string> - <string name="Command_Preferences_Tooltip">Einstellungen</string> - <string name="Command_Profile_Tooltip">Ihr Profil bearbeiten oder anzeigen</string> - <string name="Command_Report_Abuse_Tooltip">Missbrauch melden</string> - <string name="Command_Search_Tooltip">Orte, Veranstaltungen, Leute finden</string> - <string name="Command_Snapshot_Tooltip">Foto aufnehmen</string> - <string name="Command_Speak_Tooltip">Über Ihr Mikrofon mit Leuten in der Nähe sprechen</string> - <string name="Command_Twitter_Tooltip">Twitter</string> - <string name="Command_View_Tooltip">Kamerawinkel ändern</string> - <string name="Command_Voice_Tooltip">Lautstärkeregler für Anrufe und Leute in Ihrer Nähe in SL</string> - <string name="Toolbar_Bottom_Tooltip">gegenwärtig in der unteren Symbolleiste</string> - <string name="Toolbar_Left_Tooltip">gegenwärtig in der linken Symbolleiste</string> - <string name="Toolbar_Right_Tooltip">gegenwärtig in der rechten Symbolleiste</string> - <string name="Retain%">% zurückbehalten</string> - <string name="Detail">Details</string> - <string name="Better Detail">Bessere Details</string> - <string name="Surface">Oberfläche</string> - <string name="Solid">Fest</string> - <string name="Wrap">Wickeln</string> - <string name="Preview">Vorschau</string> - <string name="Normal">Normal</string> - <string name="Pathfinding_Wiki_URL">http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer</string> - <string name="Pathfinding_Object_Attr_None">Keine</string> - <string name="Pathfinding_Object_Attr_Permanent">Wirkt sich auf Navmesh aus</string> - <string name="Pathfinding_Object_Attr_Character">Figur</string> - <string name="Pathfinding_Object_Attr_MultiSelect">(mehrere)</string> - <string name="snapshot_quality_very_low">Sehr niedrig</string> - <string name="snapshot_quality_low">Niedrig</string> - <string name="snapshot_quality_medium">Mittel</string> - <string name="snapshot_quality_high">Hoch</string> - <string name="snapshot_quality_very_high">Sehr hoch</string> - <string name="TeleportMaturityExceeded">Der Einwohner kann diese Region nicht besuchen.</string> - <string name="UserDictionary">[Benutzer]</string> - <string name="experience_tools_experience">Erlebnis</string> - <string name="ExperienceNameNull">(kein Erlebnis)</string> - <string name="ExperienceNameUntitled">(unbenanntes Erlebnis)</string> - <string name="Land-Scope">Landumfang</string> - <string name="Grid-Scope">Gridumfang</string> - <string name="Allowed_Experiences_Tab">ZULäSSIG</string> - <string name="Blocked_Experiences_Tab">BLOCKIERT</string> - <string name="Contrib_Experiences_Tab">CONTRIBUTOR</string> - <string name="Admin_Experiences_Tab">ADMIN</string> - <string name="Recent_Experiences_Tab">AKTUELL</string> - <string name="Owned_Experiences_Tab">EIGENE</string> - <string name="ExperiencesCounter">([EXPERIENCES], max. [MAXEXPERIENCES])</string> - <string name="ExperiencePermission1">Ihre Steuerungen übernehmen</string> - <string name="ExperiencePermission3">Animationen Ihres Avatars auslösen</string> - <string name="ExperiencePermission4">an Ihren Avatar anhängen</string> - <string name="ExperiencePermission9">Ihre Kamera vorfolgen</string> - <string name="ExperiencePermission10">Ihre Kamera steuern</string> - <string name="ExperiencePermission11">Sie teleportieren</string> - <string name="ExperiencePermission12">automatisch Erlebnisberechtigungen akzeptieren</string> - <string name="ExperiencePermission16">ihren Avatar zwingen, sich zu setzen</string> - <string name="ExperiencePermission17">Ändern Ihrer Umgebungseinstellungen</string> - <string name="ExperiencePermissionShortUnknown">unbekannten Vorgang durchführen: [Permission]</string> - <string name="ExperiencePermissionShort1">Steuerungen übernehmen</string> - <string name="ExperiencePermissionShort3">Animationen auslösen</string> - <string name="ExperiencePermissionShort4">Anhängen</string> - <string name="ExperiencePermissionShort9">Kamera verfolgen</string> - <string name="ExperiencePermissionShort10">Kamera steuern</string> - <string name="ExperiencePermissionShort11">Teleportieren</string> - <string name="ExperiencePermissionShort12">Berechtigung</string> - <string name="ExperiencePermissionShort16">Sitzen</string> - <string name="ExperiencePermissionShort17">Umgebung</string> - <string name="logging_calls_disabled_log_empty">Unterhaltungen werden nicht protokolliert. Um ein Protokoll zu starten, wählen Sie „Speichern: nur Protokoll“ oder „Speichern: Protokoll und Transkripte“ unter „Einstellungen“ > „Chat“.</string> - <string name="logging_calls_disabled_log_not_empty">Es werden keine Unterhaltungen mehr protokolliert. Um weiterhin ein Protokoll zu führen, wählen Sie „Speichern: nur Protokoll“ oder „Speichern: Protokoll und Transkripte“ unter „Einstellungen“ > „Chat“.</string> - <string name="logging_calls_enabled_log_empty">Keine protokollierten Unterhaltungen verfügbar. Hier erscheint ein Protokolleintrag, wenn Sie eine Person kontaktieren oder von einer Person kontaktiert werden.</string> - <string name="loading_chat_logs">Laden...</string> - <string name="na">Nicht zutreffend</string> - <string name="preset_combo_label">-Leere Liste-</string> - <string name="Default">Standard</string> - <string name="none_paren_cap">(Keine)</string> - <string name="no_limit">Keine Begrenzung</string> - <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">Die Physikform enthält Dreiecke, die zu klein sind. Versuchen Sie, das Physikmodell zu vereinfachen.</string> - <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH">Die Physikform enthält ungültige Bestätigungsdaten. Versuchen Sie, das Physikmodell zu korrigieren.</string> - <string name="Mav_Details_MAV_UNKNOWN_VERSION">Die Physikform hat keine korrekte Version. Legen Sie die korrekte Version für das Physikmodell fest.</string> - <string name="couldnt_resolve_host">Der DNS konnte den Hostnamen ([HOSTNAME]) nicht auflösen Prüfen +(z. B. "/pfad/editor" "%s"). + </string> + <string name="ExternalEditorCommandParseError"> + Fehler beim Parsen des externen Editorbefehls. + </string> + <string name="ExternalEditorFailedToRun"> + Externer Editor konnte nicht ausgeführt werden. + </string> + <string name="TranslationFailed"> + Übersetzung fehlgeschlagen: [REASON] + </string> + <string name="TranslationResponseParseError"> + Fehler beim Parsen der Übersetzungsantwort. + </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"> + Zuhause + </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"> + Addieren + </string> + <string name="Subtract"> + Subtrahieren + </string> + <string name="Multiply"> + Multiplizieren + </string> + <string name="Divide"> + Dividieren + </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"> + Partikel-Beacons werden angezeigt (blau) + </string> + <string name="BeaconPhysical"> + Beacons für physische Objekte werden angezeigt (grün) + </string> + <string name="BeaconScripted"> + Beacons für Skriptobjekte werden angezeigt (rot) + </string> + <string name="BeaconScriptedTouch"> + Beacons für Skriptobjekte mit Berührungsfunktion werden angezeigt (rot) + </string> + <string name="BeaconSound"> + Sound-Beacons werden angezeigt (gelb) + </string> + <string name="BeaconMedia"> + Medien-Beacons werden angezeigt (weiß) + </string> + <string name="BeaconSun"> + Sonnenrichtungs-Beacon ansehen (orange) + </string> + <string name="BeaconMoon"> + Mondrichtungs-Beacon ansehen (lila) + </string> + <string name="ParticleHiding"> + Partikel werden ausgeblendet + </string> + <string name="Command_AboutLand_Label"> + Landinformationen + </string> + <string name="Command_Appearance_Label"> + Aussehen + </string> + <string name="Command_Avatar_Label"> + Avatar + </string> + <string name="Command_Build_Label"> + Bauen + </string> + <string name="Command_Chat_Label"> + Chat + </string> + <string name="Command_Conversations_Label"> + Unterhaltungen + </string> + <string name="Command_Compass_Label"> + Kompass + </string> + <string name="Command_Destinations_Label"> + Ziele + </string> + <string name="Command_Environments_Label"> + Meine Umgebungen + </string> + <string name="Command_Facebook_Label"> + Facebook + </string> + <string name="Command_Flickr_Label"> + Flickr + </string> + <string name="Command_Gestures_Label"> + Gesten + </string> + <string name="Command_Grid_Status_Label"> + Grid-Status + </string> + <string name="Command_HowTo_Label"> + Infos + </string> + <string name="Command_Inventory_Label"> + Inventar + </string> + <string name="Command_Map_Label"> + Karte + </string> + <string name="Command_Marketplace_Label"> + Marktplatz + </string> + <string name="Command_MarketplaceListings_Label"> + Marktplatz + </string> + <string name="Command_MiniMap_Label"> + Minikarte + </string> + <string name="Command_Move_Label"> + Gehen / Rennen / Fliegen + </string> + <string name="Command_Outbox_Label"> + Händler-Outbox + </string> + <string name="Command_People_Label"> + Leute + </string> + <string name="Command_Picks_Label"> + Auswahlen + </string> + <string name="Command_Places_Label"> + Orte + </string> + <string name="Command_Preferences_Label"> + Einstellungen + </string> + <string name="Command_Profile_Label"> + Profil + </string> + <string name="Command_Report_Abuse_Label"> + Missbrauch melden + </string> + <string name="Command_Search_Label"> + Suchen + </string> + <string name="Command_Snapshot_Label"> + Foto + </string> + <string name="Command_Speak_Label"> + Sprechen + </string> + <string name="Command_Twitter_Label"> + Twitter + </string> + <string name="Command_View_Label"> + Kamerasteuerungen + </string> + <string name="Command_Voice_Label"> + Voice-Einstellungen + </string> + <string name="Command_AboutLand_Tooltip"> + Informationen zu dem von Ihnen besuchten Land + </string> + <string name="Command_Appearance_Tooltip"> + Avatar ändern + </string> + <string name="Command_Avatar_Tooltip"> + Kompletten Avatar auswählen + </string> + <string name="Command_Build_Tooltip"> + Objekte bauen und Terrain umformen + </string> + <string name="Command_Chat_Tooltip"> + Mit Leuten in der Nähe chatten + </string> + <string name="Command_Conversations_Tooltip"> + Mit allen unterhalten + </string> + <string name="Command_Compass_Tooltip"> + Kompass + </string> + <string name="Command_Destinations_Tooltip"> + Ziele von Interesse + </string> + <string name="Command_Environments_Tooltip"> + Meine Umgebungen + </string> + <string name="Command_Facebook_Tooltip"> + Auf Facebook posten + </string> + <string name="Command_Flickr_Tooltip"> + Auf Flickr hochladen + </string> + <string name="Command_Gestures_Tooltip"> + Gesten für Ihren Avatar + </string> + <string name="Command_Grid_Status_Tooltip"> + Aktuellen Grid-Status anzeigen + </string> + <string name="Command_HowTo_Tooltip"> + Wie führe ich gängige Aufgaben aus? + </string> + <string name="Command_Inventory_Tooltip"> + Ihr Eigentum anzeigen und benutzen + </string> + <string name="Command_Map_Tooltip"> + Weltkarte + </string> + <string name="Command_Marketplace_Tooltip"> + Einkaufen gehen + </string> + <string name="Command_MarketplaceListings_Tooltip"> + Ihre Kreation verkaufen + </string> + <string name="Command_MiniMap_Tooltip"> + Leute in der Nähe anzeigen + </string> + <string name="Command_Move_Tooltip"> + Ihren Avatar bewegen + </string> + <string name="Command_Outbox_Tooltip"> + Artikel zum Verkauf in den Marktplatz übertragen + </string> + <string name="Command_People_Tooltip"> + Freunde, Gruppen und Leute in der Nähe + </string> + <string name="Command_Picks_Tooltip"> + Orte, die in Ihrem Profil als Favoriten angezeigt werden sollen + </string> + <string name="Command_Places_Tooltip"> + Von Ihnen gespeicherte Orte + </string> + <string name="Command_Preferences_Tooltip"> + Einstellungen + </string> + <string name="Command_Profile_Tooltip"> + Ihr Profil bearbeiten oder anzeigen + </string> + <string name="Command_Report_Abuse_Tooltip"> + Missbrauch melden + </string> + <string name="Command_Search_Tooltip"> + Orte, Veranstaltungen, Leute finden + </string> + <string name="Command_Snapshot_Tooltip"> + Foto aufnehmen + </string> + <string name="Command_Speak_Tooltip"> + Über Ihr Mikrofon mit Leuten in der Nähe sprechen + </string> + <string name="Command_Twitter_Tooltip"> + Twitter + </string> + <string name="Command_View_Tooltip"> + Kamerawinkel ändern + </string> + <string name="Command_Voice_Tooltip"> + Lautstärkeregler für Anrufe und Leute in Ihrer Nähe in SL + </string> + <string name="Toolbar_Bottom_Tooltip"> + gegenwärtig in der unteren Symbolleiste + </string> + <string name="Toolbar_Left_Tooltip"> + gegenwärtig in der linken Symbolleiste + </string> + <string name="Toolbar_Right_Tooltip"> + gegenwärtig in der rechten Symbolleiste + </string> + <string name="Retain%"> + % zurückbehalten + </string> + <string name="Detail"> + Details + </string> + <string name="Better Detail"> + Bessere Details + </string> + <string name="Surface"> + Oberfläche + </string> + <string name="Solid"> + Fest + </string> + <string name="Wrap"> + Wickeln + </string> + <string name="Preview"> + Vorschau + </string> + <string name="Normal"> + Normal + </string> + <string name="Pathfinding_Wiki_URL"> + http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer + </string> + <string name="Pathfinding_Object_Attr_None"> + Keine + </string> + <string name="Pathfinding_Object_Attr_Permanent"> + Wirkt sich auf Navmesh aus + </string> + <string name="Pathfinding_Object_Attr_Character"> + Figur + </string> + <string name="Pathfinding_Object_Attr_MultiSelect"> + (mehrere) + </string> + <string name="snapshot_quality_very_low"> + Sehr niedrig + </string> + <string name="snapshot_quality_low"> + Niedrig + </string> + <string name="snapshot_quality_medium"> + Mittel + </string> + <string name="snapshot_quality_high"> + Hoch + </string> + <string name="snapshot_quality_very_high"> + Sehr hoch + </string> + <string name="TeleportMaturityExceeded"> + Der Einwohner kann diese Region nicht besuchen. + </string> + <string name="UserDictionary"> + [Benutzer] + </string> + <string name="experience_tools_experience"> + Erlebnis + </string> + <string name="ExperienceNameNull"> + (kein Erlebnis) + </string> + <string name="ExperienceNameUntitled"> + (unbenanntes Erlebnis) + </string> + <string name="Land-Scope"> + Landumfang + </string> + <string name="Grid-Scope"> + Gridumfang + </string> + <string name="Allowed_Experiences_Tab"> + ZULäSSIG + </string> + <string name="Blocked_Experiences_Tab"> + BLOCKIERT + </string> + <string name="Contrib_Experiences_Tab"> + CONTRIBUTOR + </string> + <string name="Admin_Experiences_Tab"> + ADMIN + </string> + <string name="Recent_Experiences_Tab"> + AKTUELL + </string> + <string name="Owned_Experiences_Tab"> + EIGENE + </string> + <string name="ExperiencesCounter"> + ([EXPERIENCES], max. [MAXEXPERIENCES]) + </string> + <string name="ExperiencePermission1"> + Ihre Steuerungen übernehmen + </string> + <string name="ExperiencePermission3"> + Animationen Ihres Avatars auslösen + </string> + <string name="ExperiencePermission4"> + an Ihren Avatar anhängen + </string> + <string name="ExperiencePermission9"> + Ihre Kamera vorfolgen + </string> + <string name="ExperiencePermission10"> + Ihre Kamera steuern + </string> + <string name="ExperiencePermission11"> + Sie teleportieren + </string> + <string name="ExperiencePermission12"> + automatisch Erlebnisberechtigungen akzeptieren + </string> + <string name="ExperiencePermission16"> + ihren Avatar zwingen, sich zu setzen + </string> + <string name="ExperiencePermission17"> + Ändern Ihrer Umgebungseinstellungen + </string> + <string name="ExperiencePermissionShortUnknown"> + unbekannten Vorgang durchführen: [Permission] + </string> + <string name="ExperiencePermissionShort1"> + Steuerungen übernehmen + </string> + <string name="ExperiencePermissionShort3"> + Animationen auslösen + </string> + <string name="ExperiencePermissionShort4"> + Anhängen + </string> + <string name="ExperiencePermissionShort9"> + Kamera verfolgen + </string> + <string name="ExperiencePermissionShort10"> + Kamera steuern + </string> + <string name="ExperiencePermissionShort11"> + Teleportieren + </string> + <string name="ExperiencePermissionShort12"> + Berechtigung + </string> + <string name="ExperiencePermissionShort16"> + Sitzen + </string> + <string name="ExperiencePermissionShort17"> + Umgebung + </string> + <string name="logging_calls_disabled_log_empty"> + Unterhaltungen werden nicht protokolliert. Um ein Protokoll zu starten, wählen Sie „Speichern: nur Protokoll“ oder „Speichern: Protokoll und Transkripte“ unter „Einstellungen“ > „Chat“. + </string> + <string name="logging_calls_disabled_log_not_empty"> + Es werden keine Unterhaltungen mehr protokolliert. Um weiterhin ein Protokoll zu führen, wählen Sie „Speichern: nur Protokoll“ oder „Speichern: Protokoll und Transkripte“ unter „Einstellungen“ > „Chat“. + </string> + <string name="logging_calls_enabled_log_empty"> + Keine protokollierten Unterhaltungen verfügbar. Hier erscheint ein Protokolleintrag, wenn Sie eine Person kontaktieren oder von einer Person kontaktiert werden. + </string> + <string name="loading_chat_logs"> + Laden... + </string> + <string name="na"> + Nicht zutreffend + </string> + <string name="preset_combo_label"> + -Leere Liste- + </string> + <string name="Default"> + Standard + </string> + <string name="none_paren_cap"> + (Keine) + </string> + <string name="no_limit"> + Keine Begrenzung + </string> + <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES"> + Die Physikform enthält Dreiecke, die zu klein sind. Versuchen Sie, das Physikmodell zu vereinfachen. + </string> + <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH"> + Die Physikform enthält ungültige Bestätigungsdaten. Versuchen Sie, das Physikmodell zu korrigieren. + </string> + <string name="Mav_Details_MAV_UNKNOWN_VERSION"> + Die Physikform hat keine korrekte Version. Legen Sie die korrekte Version für das Physikmodell fest. + </string> + <string name="couldnt_resolve_host"> + Der DNS konnte den Hostnamen ([HOSTNAME]) nicht auflösen Prüfen Sie bitte, ob Sie die Website www.secondlife.com aufrufen können. Wenn Sie die Website aufrufen können, jedoch weiterhin diese Fehlermeldung erhalten, -besuchen Sie bitte den Support-Bereich und melden Sie das Problem.</string> - <string name="ssl_peer_certificate">Der Anmeldeserver konnte sich nicht per SSL verifizieren. +besuchen Sie bitte den Support-Bereich und melden Sie das Problem. + </string> + <string name="ssl_peer_certificate"> + Der Anmeldeserver konnte sich nicht per SSL verifizieren. Wenn Sie diese Fehlermeldung weiterhin erhalten, besuchen Sie bitte den Support-Bereich der Website Secondlife.com -und melden Sie das Problem.</string> - <string name="ssl_connect_error">Die Ursache hierfür ist häufig eine falsch eingestellte Uhrzeit auf Ihrem Computer. +und melden Sie das Problem. + </string> + <string name="ssl_connect_error"> + Die Ursache hierfür ist häufig eine falsch eingestellte Uhrzeit auf Ihrem Computer. Bitte vergewissern Sie sich, dass Datum und Uhrzeit in der Systemsteuerung korrekt eingestellt sind. Überprüfen Sie außerdem, ob Ihre Netzwerk- und Firewall-Einstellungen korrekt sind. Wenn Sie diese Fehlermeldung weiterhin erhalten, besuchen Sie bitte den Support-Bereich der Website Secondlife.com und melden Sie das Problem. -[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Knowledge-Base]</string> +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Knowledge-Base] + </string> </strings> diff --git a/indra/newview/skins/default/xui/de/teleport_strings.xml b/indra/newview/skins/default/xui/de/teleport_strings.xml index 9f8a7a8045..1ed09f24b5 100644 --- a/indra/newview/skins/default/xui/de/teleport_strings.xml +++ b/indra/newview/skins/default/xui/de/teleport_strings.xml @@ -1,41 +1,97 @@ <?xml version="1.0" ?> <teleport_messages> <message_set name="errors"> - <message name="invalid_tport">Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden. -Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].</message> - <message name="invalid_region_handoff">Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen eventuell neu anmelden, um die Region wechseln zu können. -Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].</message> - <message name="blocked_tport">Teleportieren ist zurzeit leider nicht möglich. Versuchen Sie es später noch einmal. -Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab und wieder an.</message> - <message name="nolandmark_tport">Das System konnte das Landmarken-Ziel nicht finden.</message> - <message name="timeout_tport">Das System konnte keine Teleport-Verbindung herstellen. -Versuchen Sie es später noch einmal.</message> - <message name="NoHelpIslandTP">Sie können nicht zurück nach Welcome Island teleportieren. -Gehen Sie zu „Welcome Island Public“, um das Tutorial zu wiederholen.</message> - <message name="noaccess_tport">Sie haben leider keinen Zugang zu diesem Teleport-Ziel.</message> - <message name="missing_attach_tport">Ihre Anhänge sind noch nicht eingetroffen. Warten Sie kurz oder melden Sie sich ab und wieder an, bevor Sie einen neuen Teleport-Versuch unternehmen.</message> - <message name="too_many_uploads_tport">Die Asset-Warteschlange in dieser Region ist zurzeit überlastet. -Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in einigen Minuten erneut oder besuchen Sie eine weniger überfüllte Region.</message> - <message name="expired_tport">Das System konnte Ihre Teleport-Anfrage nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut.</message> - <message name="expired_region_handoff">Das System konnte Ihre Anfrage zum Regionswechsel nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut.</message> - <message name="no_host">Teleport-Ziel wurde nicht gefunden. Das Ziel ist entweder im Moment nicht verfügbar oder existiert nicht mehr. Versuchen Sie es in einigen Minuten erneut.</message> - <message name="no_inventory_host">Das Inventarsystem ist zurzeit nicht verfügbar.</message> - <message name="MustGetAgeRegion">Sie müssen mindestens 18 Jahre alt sein, um diese Region betreten zu können.</message> - <message name="RegionTPSpecialUsageBlocked">Betreten der Region nicht gestattet. „[REGION_NAME]“ ist eine Region für Geschicklichkeitsspiele. Der Zutritt ist Einwohnern vorbehalten, die bestimmte Kriterien erfüllen. Weitere Details finden Sie unter [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ].</message> - <message name="preexisting_tport">Entschuldigung, aber das System konnte deinen Teleport nicht starten. Versuche es bitte in ein paar Minuten noch einmal.</message> + <message name="invalid_tport"> + Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden. +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. + </message> + <message name="invalid_region_handoff"> + Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen eventuell neu anmelden, um die Region wechseln zu können. +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. + </message> + <message name="blocked_tport"> + Teleportieren ist zurzeit leider nicht möglich. Versuchen Sie es später noch einmal. +Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab und wieder an. + </message> + <message name="nolandmark_tport"> + Das System konnte das Landmarken-Ziel nicht finden. + </message> + <message name="timeout_tport"> + Das System konnte keine Teleport-Verbindung herstellen. +Versuchen Sie es später noch einmal. + </message> + <message name="NoHelpIslandTP"> + Sie können nicht zurück nach Welcome Island teleportieren. +Gehen Sie zu „Welcome Island Public“, um das Tutorial zu wiederholen. + </message> + <message name="noaccess_tport"> + Sie haben leider keinen Zugang zu diesem Teleport-Ziel. + </message> + <message name="missing_attach_tport"> + Ihre Anhänge sind noch nicht eingetroffen. Warten Sie kurz oder melden Sie sich ab und wieder an, bevor Sie einen neuen Teleport-Versuch unternehmen. + </message> + <message name="too_many_uploads_tport"> + Die Asset-Warteschlange in dieser Region ist zurzeit überlastet. +Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in einigen Minuten erneut oder besuchen Sie eine weniger überfüllte Region. + </message> + <message name="expired_tport"> + Das System konnte Ihre Teleport-Anfrage nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. + </message> + <message name="expired_region_handoff"> + Das System konnte Ihre Anfrage zum Regionswechsel nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. + </message> + <message name="no_host"> + Teleport-Ziel wurde nicht gefunden. Das Ziel ist entweder im Moment nicht verfügbar oder existiert nicht mehr. Versuchen Sie es in einigen Minuten erneut. + </message> + <message name="no_inventory_host"> + Das Inventarsystem ist zurzeit nicht verfügbar. + </message> + <message name="MustGetAgeRegion"> + Sie müssen mindestens 18 Jahre alt sein, um diese Region betreten zu können. + </message> + <message name="RegionTPSpecialUsageBlocked"> + Betreten der Region nicht gestattet. „[REGION_NAME]“ ist eine Region für Geschicklichkeitsspiele. Der Zutritt ist Einwohnern vorbehalten, die bestimmte Kriterien erfüllen. Weitere Details finden Sie unter [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ]. + </message> + <message name="preexisting_tport"> + Entschuldigung, aber das System konnte deinen Teleport nicht starten. Versuche es bitte in ein paar Minuten noch einmal. + </message> </message_set> <message_set name="progress"> - <message name="sending_dest">Transport zum Ziel.</message> - <message name="redirecting">Weiterleitung an anderes Ziel.</message> - <message name="relaying">Weiterleitung zum Ziel.</message> - <message name="sending_home">Zuhause-Position wird ermittelt.</message> - <message name="sending_landmark">Landmarken-Position wird ermittelt.</message> - <message name="completing">Teleport wird abgeschlossen.</message> - <message name="completed_from">Teleport aus [T_SLURL] wurde erfolgreich abgeschlossen.</message> - <message name="resolving">Ziel wird ermittelt.</message> - <message name="contacting">Verbindung zu neuer Region.</message> - <message name="arriving">Ziel erreicht...</message> - <message name="requesting">Teleport wird initialisiert...</message> - <message name="pending">Anstehender Teleport...</message> + <message name="sending_dest"> + Transport zum Ziel. + </message> + <message name="redirecting"> + Weiterleitung an anderes Ziel. + </message> + <message name="relaying"> + Weiterleitung zum Ziel. + </message> + <message name="sending_home"> + Zuhause-Position wird ermittelt. + </message> + <message name="sending_landmark"> + Landmarken-Position wird ermittelt. + </message> + <message name="completing"> + Teleport wird abgeschlossen. + </message> + <message name="completed_from"> + Teleport aus [T_SLURL] wurde erfolgreich abgeschlossen. + </message> + <message name="resolving"> + Ziel wird ermittelt. + </message> + <message name="contacting"> + Verbindung zu neuer Region. + </message> + <message name="arriving"> + Ziel erreicht... + </message> + <message name="requesting"> + Teleport wird initialisiert... + </message> + <message name="pending"> + Anstehender Teleport... + </message> </message_set> </teleport_messages> diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml index 89c6e41a85..9c932ac034 100644 --- a/indra/newview/skins/default/xui/en/floater_about.xml +++ b/indra/newview/skins/default/xui/en/floater_about.xml @@ -81,36 +81,30 @@ top="0" width="435" wrap="true"> -Megapahit is brought to you by (in order of appearance): +Megapahit is brought to you by: </text> <text_editor enabled="false" + font="Monospace" follows="top|left" - height="245" + height="200" bg_readonly_color="Transparent" left="5" text_color="LtGray" max_length="65536" top_pad="5" - width="545" - word_wrap="true"> -Erik Kundiman -LinneNoir -milo (observeur) -Fritigern Gothly -Kou Ayashi -Hadet Sonnenkern -Remmy (Secret Foxtail) -Eris Ravenwood -gwigz (nya) -EmilyAmiee -Bavid Dailey -Aria (Tashia Redrose) -Cate (32a) -Hiroo Ono -Melodey -Keysin (scoutkeysin) -Yikes Lopez + width="475" + word_wrap="false"> +Erik Kundiman LinneNoir +milo (observeur) Fritigern Gothly +Kou Ayashi Hadet Sonnenkern +Remmy (Secret Foxtail) Eris Ravenwood +gwigz (nya) EmilyAmiee +Bavid Dailey Aria (Tashia Redrose) +Cate (32a) Hiroo Ono +Melodey Keysin (scoutkeysin) +Padoria Teuden ~ ( ^-^ ) ~ (cutie_qu) +Markus Teuden </text_editor> <text follows="top|left" @@ -121,7 +115,7 @@ Yikes Lopez top_pad="5" width="465" wrap="true"> -with special thanks to (in order of appearance): +with special thanks to: </text> <text_editor enabled="false" @@ -135,12 +129,13 @@ with special thanks to (in order of appearance): top_pad="5" width="450" word_wrap="true"> -Chorazin Allen and Nicky Perian for involving Erik Kundiman in viewer developments; -JenniWindrider for the pre-MP donation that was used to help build the website; -Vir Linden for making it possible for the project to have a place (in every sense of the word) in SL; -nutsobvious for the early testing and video proof; -Soft Linden for the security testing; and -Kyle Linden for selling TPV parcel 2 to Erik Kundiman at L$0 price. +Chorazin Allen and Nicky Perian - Involving Erik Kundiman in viewer development +JenniWindrider - Pre-MP donation used to help build the website +Vir Linden - Making it possible for the project to have a place in SL +nutsobvious - Early testing and video proof +Soft Linden - Security testing +Kyle Linden - Giving TPV parcel 2 to Erik Kundiman +Signal Linden - Opening opportunities for Megapahit to contribute more </text_editor> </panel> </accordion_tab> @@ -196,7 +191,7 @@ Dummy Name replaced at run time <text_editor enabled="false" follows="left|top" - height="375" + height="450" bg_readonly_color="Transparent" left="5" text_color="LtGray" @@ -205,27 +200,51 @@ Dummy Name replaced at run time top="5" width="465" word_wrap="true"> - 3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion - APR Copyright (C) 2011 The Apache Software Foundation - Collada DOM Copyright 2006 Sony Computer Entertainment Inc. - cURL Copyright (C) 1996-2010, Daniel Stenberg, (daniel@haxx.se) - expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. - FreeType Copyright (C) 1996-2002, 2006 David Turner, Robert Wilhelm, and Werner Lemberg. - GL Copyright (C) 1999-2004 Brian Paul. - jpeglib Copyright (C) 1991-1998, Thomas G. Lane. - llphysicsextensions_tpv Copyright (c) 2010, Linden Research, Inc. - meshoptimizer Copyright (c) 2016-2021 Arseny Kapoulkine - ogg/vorbis Copyright (C) 2002, Xiphophorus - OpenSSL Copyright (C) 1998-2008 The OpenSSL Project. - PCRE Copyright (c) 1997-2012 University of Cambridge - SDL Copyright (C) 1997-2024 Sam Lantinga - SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - xxHash Copyright (C) 2012-2020 Yann Collet. - zlib Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler. +3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion + +APR Copyright (C) 2011 The Apache Software Foundation + +Collada DOM Copyright 2006 Sony Computer Entertainment Inc. + +cURL Copyright (C) 1996-2010, Daniel Stenberg, (daniel@haxx.se) + +Discord Social SDK Copyright (c) 2025, Discord, Inc. + +expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. + +FreeType Copyright (C) 1996-2002, 2006 David Turner, Robert Wilhelm, and Werner Lemberg. + +GL Copyright (C) 1999-2004 Brian Paul. + +jpeglib Copyright (C) 1991-1998, Thomas G. Lane. + +llphysicsextensions_tpv Copyright (c) 2010, Linden Research, Inc. + +Megapahit Copyright (c) 2023-2026 Megapahit. + +meshoptimizer Copyright (c) 2016-2021 Arseny Kapoulkine + +ogg/vorbis Copyright (C) 2002, Xiphophorus + +OpenSSL Copyright (C) 1998-2008 The OpenSSL Project. + +PCRE Copyright (c) 1997-2012 University of Cambridge + +SDL Copyright (C) 1997-2024 Sam Lantinga + +sse2neon Copyright (c) 2015-2026 SSE2NEON Contributors. + +SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + +V-HACD Copyright (c) 2011, Khaled Mamou (kmamou at gmail dot com) + +xxHash Copyright (C) 2012-2020 Yann Collet. + +zlib Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler. - This software contains source code provided by NVIDIA Corporation. +This software contains source code provided by NVIDIA Corporation. - All rights reserved. See licenses.txt for details. +All rights reserved. See licenses.txt for details. </text_editor> </panel> </tab_container> diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index 508aba6ae1..c5b42b6dae 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -125,6 +125,9 @@ name="no_selection_text"> No parcel selected. </panel.string> + <panel.string name="time_stamp_template_ampm"> + [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour12,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [ampm,datetime,slt] [year,datetime,slt] + </panel.string> <panel.string name="time_stamp_template"> [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [year,datetime,slt] </panel.string> diff --git a/indra/newview/skins/default/xui/en/floater_avatar_textures.xml b/indra/newview/skins/default/xui/en/floater_avatar_textures.xml index 09026884b9..831368f4de 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar_textures.xml @@ -70,13 +70,13 @@ Textures width="150" /> <panel - name="scroll_content_panel" + name="scroll_content_panel2" follows="left|top" min_height="300" layout="topleft" - top="43" + top="60" background_visible="false" - height="930" + height="1113" left="0" width="1230"> @@ -86,7 +86,7 @@ Textures layout="topleft" left="10" name="hair-baked" - top="17" + top="3" width="92" /> <texture_picker height="103" diff --git a/indra/newview/skins/default/xui/en/floater_avatar_welcome_pack.xml b/indra/newview/skins/default/xui/en/floater_avatar_welcome_pack.xml new file mode 100644 index 0000000000..795d642755 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_avatar_welcome_pack.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater + positioning="cascading" + legacy_header_height="225" + can_minimize="true" + can_close="true" + can_resize="false" + min_height="438" + min_width="530" + height="438" + layout="topleft" + name="Avatar Welcome Pack" + single_instance="true" + save_rect="true" + save_visibility="true" + title="AVATAR WELCOME PACK" + width="530"> + <web_browser + top="25" + height="438" + width="530" + follows="all" + name="avatar_picker_contents" + trusted_content="true"/> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_chat_mention_picker.xml b/indra/newview/skins/default/xui/en/floater_chat_mention_picker.xml new file mode 100644 index 0000000000..bbad99f932 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_chat_mention_picker.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + name="chat_mention_picker" + title="CHOOSE RESIDENT" + single_instance="true" + can_minimize="false" + can_tear_off="false" + can_resize="true" + auto_close="true" + layout="topleft" + min_width="250" + chrome="true" + height="125" + width="310"> + <avatar_list + allow_select="true" + follows="all" + height="120" + width="306" + ignore_online_status="true" + layout="topleft" + left="3" + keep_one_selected="true" + multi_select="false" + show_info_btn="false" + show_profile_btn="false" + show_speaking_indicator="false" + name="avatar_list" + right="-1" + top="2" /> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_directory.xml b/indra/newview/skins/default/xui/en/floater_directory.xml new file mode 100644 index 0000000000..3274474337 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_directory.xml @@ -0,0 +1,150 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + can_close="true" + can_drag_on_left="false" + single_instance="true" + can_resize="true" + height="570" + min_height="570" + width="780" + min_width="780" + name="directory" + title="Search"> + <tab_container + top="0" + left="0" + follows="left|top|right|bottom" + height="550" + width="780" + mouse_opaque="false" + name="Directory Tabs" + tab_position="top"> + <panel + border="false" + label="People" + filename="panel_dir_people.xml" + class="panel_dir_people" + name="panel_dir_people" + follows="left|top|right" + layout="topleft" + left="0" + top="0" + bottom="-1" /> + <panel + border="false" + label="Groups" + filename="panel_dir_groups.xml" + class="panel_dir_groups" + name="panel_dir_groups" + follows="left|top|right" + layout="topleft" + left="0" + top="0" + bottom="-1" /> + <panel + border="false" + label="Places" + filename="panel_dir_places.xml" + class="panel_dir_places" + name="panel_dir_places" + follows="left|top|right" + layout="topleft" + left="0" + top="0" + bottom="-1" /> + <panel + border="false" + label="Land Sales" + filename="panel_dir_land.xml" + class="panel_dir_land" + name="panel_dir_land" + follows="left|top|right" + layout="topleft" + left="0" + top="0" + bottom="-1" /> + <panel + border="false" + label="Events" + filename="panel_dir_events.xml" + class="panel_dir_events" + name="panel_dir_events" + follows="left|top|right" + layout="topleft" + left="0" + top="0" + bottom="-1" /> + <panel + border="false" + label="Classifieds" + filename="panel_dir_classified.xml" + class="panel_dir_classified" + name="panel_dir_classified" + follows="left|top|right" + layout="topleft" + left="0" + top="0" + bottom="-1" /> + <panel + border="false" + label="Web" + filename="panel_dir_web.xml" + class="panel_dir_web" + name="panel_dir_web" + follows="left|top|right" + layout="topleft" + left="0" + top="0" + bottom="-1" /> +</tab_container> + <panel + top="65" + follows="right|top" + height="486" + left="345" + visible="false" + name="panel_profile_secondlife" + class="panel_profile_secondlife" + filename="panel_profile_secondlife.xml" + width="425" /> + <panel + top="70" + follows="bottom|right|top" + height="482" + left="345" + visible="false" + name="panel_group_info_sidetray" + class="panel_group_info_sidetray" + filename="panel_group_info_sidetray.xml" + width="425" /> + <panel + top="70" + follows="bottom|right|top" + height="484" + left="345" + visible="false" + name="panel_places" + class="panel_places" + filename="panel_places.xml" + width="425" /> + <panel + top="70" + follows="bottom|right|top" + height="481" + left="345" + visible="false" + name="panel_classified_info" + class="panel_classified_info" + filename="panel_classified_info.xml" + width="425" /> + <panel + top="70" + follows="bottom|right|top" + height="480" + left="345" + visible="false" + name="panel_event_info" + class="panel_event_info" + filename="panel_event_info.xml" + width="425" /> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_fast_timers.xml b/indra/newview/skins/default/xui/en/floater_fast_timers.xml index 00411ba20b..ae907bcb5f 100644 --- a/indra/newview/skins/default/xui/en/floater_fast_timers.xml +++ b/indra/newview/skins/default/xui/en/floater_fast_timers.xml @@ -75,7 +75,7 @@ step_size="16" doc_pos="0" doc_size="3000" - page_size="0" + page_size="50" /> </layout_panel> <layout_panel name="timers_panel" diff --git a/indra/newview/skins/default/xui/en/floater_fs_search.xml b/indra/newview/skins/default/xui/en/floater_fs_search.xml deleted file mode 100644 index 2372bc03ba..0000000000 --- a/indra/newview/skins/default/xui/en/floater_fs_search.xml +++ /dev/null @@ -1,337 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater - can_resize="true" - default_tab_group="1" - height="590" - help_topic="search" - layout="topleft" - legacy_header_height="0" - min_height="590" - min_width="660" - name="floater_search" - positioning="centered" - save_rect="true" - single_instance="true" - title="SEARCH" - width="780"> - <!-- Strings --> - <floater.string name="string.location"> - Location: [LOCATION] - </floater.string> - <floater.string name="string.traffic"> - Traffic: [DWELL] - </floater.string> - <floater.string name="string.area"> - Area: [AREA] - </floater.string> - <floater.string name="string.members"> - Members: [MEMBER_COUNT] - </floater.string> - <floater.string name="string.founder"> - Founder: [FOUNDER] - </floater.string> - <floater.string name="string.age"> - Age: [AGE] - </floater.string> - <floater.string name="string.partner"> - Partner: [PARTNER] - </floater.string> - <floater.string name="string.listing_price"> - Listing Price: [LISTING_PRICE] - </floater.string> - <floater.string name="string.slurl"> - [SLURL] - </floater.string> - <floater.string name="string.duration"> - Duration: [DURATION] - </floater.string> - <floater.string name="string.covercharge"> - Cover: [COVERCHARGE] - </floater.string> - <!-- Tab time --> - <tab_container - layout="topleft" - follows="all" - top="1" - left="0" - name="ls_tabs" - tab_min_width="90" - tab_position="top" - width="780" - height="585"> - <panel - class="panel_ls_web" - filename="panel_fs_search_legacy_web.xml" - label="Websearch" - layout="topleft" - name="panel_ls_web" /> - <panel - class="panel_ls_people" - filename="panel_fs_search_legacy_people.xml" - label="People" - layout="topleft" - name="panel_ls_people" /> - <panel - class="panel_ls_groups" - filename="panel_fs_search_legacy_groups.xml" - label="Groups" - layout="topleft" - name="panel_ls_groups" /> - <panel - class="panel_ls_places" - filename="panel_fs_search_legacy_places.xml" - label="Places" - layout="topleft" - name="panel_ls_places" /> - <panel - class="panel_ls_land" - filename="panel_fs_search_legacy_land.xml" - label="Land Sales" - layout="topleft" - name="panel_ls_land" /> - <panel - class="panel_ls_events" - filename="panel_fs_search_legacy_events.xml" - label="Events" - layout="topleft" - name="panel_ls_events" /> - <panel - class="panel_ls_classifieds" - filename="panel_fs_search_legacy_classifieds.xml" - label="Classifieds" - layout="topleft" - name="panel_ls_classifieds" /> - </tab_container> - <!-- Details/Action Panes --> - <panel - border="true" - follows="top|right|bottom" - height="508" - layout="topleft" - left="412" - top="80" - width="366" - name="panel_ls_details"> - <text_editor - left="12" - top="5" - height="24" - width="340" - layout="topleft" - follows="left|top|right" - name="title" - bg_visible="false" - border_visible="false" - allow_scroll="false" - h_pad="0" - v_pad="0" - halign="center" - enabled="false" - use_ellipses="true" - font="SansSerifHugeBold" - value="Undefined name" /> - <texture_picker - enabled="false" - fallback_image="Generic_Person_Large" - follows="left|top|right" - height="210" - layout="topleft" - left="78" - name="snapshot" - top_pad="4" - width="210"/> - <texture_picker - enabled="false" - fallback_image="default_land_picture.j2c" - follows="left|top|right" - height="210" - layout="topleft" - left_delta="0" - name="snapshot_parcel" - top_delta="0" - visible="false" - width="210"/> - <text_editor - left="20" - top_pad="2" - height="16" - width="180" - layout="topleft" - follows="left|top|right" - name="aux1" - bg_visible="false" - border_visible="false" - h_pad="0" - v_pad="0" - word_wrap="true" - enabled="false" - max_length="117" - allow_scroll="false" - parse_urls="true" - value="Auxilary info field 1"/> - <text_editor - left_pad="4" - top_delta="0" - height="16" - width="140" - layout="topleft" - follows="left|top|right" - name="aux2" - bg_visible="false" - border_visible="false" - h_pad="0" - v_pad="0" - word_wrap="true" - enabled="false" - max_length="117" - allow_scroll="false" - parse_urls="true" - value="Auxilary info field 2"/> - <icon - follows="top|right" - height="16" - image_name="Unknown_Icon" - layout="topleft" - left="20" - top_pad="2" - name="maturity_icon" - width="18" /> - <text_editor - left_pad="4" - top_delta="0" - height="28" - width="302" - layout="topleft" - follows="left|top|right" - name="location" - bg_visible="false" - border_visible="false" - h_pad="0" - v_pad="0" - word_wrap="true" - enabled="false" - max_length="117" - allow_scroll="false" - parse_urls="true" - value="Location info field"/> - <text_editor - left="20" - top_pad="12" - height="154" - width="324" - layout="topleft" - follows="left|top|right" - name="desc" - bg_visible="false" - border_visible="false" - h_pad="0" - v_pad="0" - word_wrap="true" - parse_urls="true" - enabled="false" - max_length="1000" - trusted_content="false" - value="You unlock this door with the key of imagination. Beyond it is another dimension: a dimension of sound, a dimension of sight, a dimension of mind. You're moving into a land of both shadow and substance, of things and ideas; you've just crossed over into the Twilight Zone. What you are about to see is real; the litigants on the screen are not actors. They are genuine citizens who, having filed their claims in a real small claims court, have been persuaded to drop their suits there and have them settled here, in this forum... the People's Court."/> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Open Profile" - name="people_profile_btn" - top="484" - left="3" - width="120" /> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Send Message" - name="people_message_btn" - width="120" - left_pad="1" /> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Add Friend" - name="people_friend_btn" - width="120" - left_pad="1" /> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Open Profile" - name="group_profile_btn" - top="484" - left="3" - width="120" /> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Join Chat" - name="group_message_btn" - width="120" - left_pad="1" /> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Join Group" - name="group_join_btn" - width="120" - left_pad="1" /> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Teleport" - name="teleport_btn" - top="484" - left="3" - width="120" /> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Show on Map" - name="map_btn" - width="120" - left_pad="1" /> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Remind me" - name="event_reminder_btn" - width="120" - left_pad="1" /> - <loading_indicator - left="134" - top="320" - follows="left|top|right" - mouse_opaque="false" - name="loading" - images_per_sec="1.0" - tab_stop="false" - height="100" - width="100" - visible="false" > - <images> - <image name="ProgressLarge_1"/> - <image name="ProgressLarge_2"/> - <image name="ProgressLarge_3"/> - <image name="ProgressLarge_4"/> - <image name="ProgressLarge_5"/> - <image name="ProgressLarge_6"/> - <image name="ProgressLarge_7"/> - <image name="ProgressLarge_8"/> - <image name="ProgressLarge_9"/> - <image name="ProgressLarge_10"/> - <image name="ProgressLarge_11"/> - <image name="ProgressLarge_12"/> - </images> - </loading_indicator> - </panel> -</floater> diff --git a/indra/newview/skins/default/xui/en/floater_gesture.xml b/indra/newview/skins/default/xui/en/floater_gesture.xml index 7fce91a2c3..4054e540c3 100644 --- a/indra/newview/skins/default/xui/en/floater_gesture.xml +++ b/indra/newview/skins/default/xui/en/floater_gesture.xml @@ -35,9 +35,13 @@ top="20" name="gesture_list"> <scroll_list.columns + label="" + name="active" + width="10" /> + <scroll_list.columns label="Name" name="name" - width="153" /> + width="143" /> <scroll_list.columns label="Chat" name="trigger" diff --git a/indra/newview/skins/default/xui/en/floater_inspect.xml b/indra/newview/skins/default/xui/en/floater_inspect.xml index 9403d58441..a083683c23 100644 --- a/indra/newview/skins/default/xui/en/floater_inspect.xml +++ b/indra/newview/skins/default/xui/en/floater_inspect.xml @@ -12,6 +12,10 @@ title="INSPECT OBJECTS" width="400"> <floater.string + name="timeStampAMPM"> + [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour12,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [ampm,datetime,slt] [year,datetime,slt] + </floater.string> + <floater.string name="timeStamp"> [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [year,datetime,slt] </floater.string> diff --git a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml deleted file mode 100644 index 6c3214a76d..0000000000 --- a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml +++ /dev/null @@ -1,421 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater - legacy_header_height="18" - height="340" - layout="topleft" - name="item properties" - help_topic="item_properties" - save_rect="true" - title="INVENTORY ITEM PROPERTIES" - width="350"> - <floater.string - name="unknown"> - (unknown) - </floater.string> - <floater.string - name="public"> - (public) - </floater.string> - <floater.string - name="you_can"> - You can: - </floater.string> - <floater.string - name="owner_can"> - Owner can: - </floater.string> - <floater.string - name="acquiredDate"> - [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] - </floater.string> - <icon - follows="top|right" - height="18" - image_name="Lock" - layout="topleft" - left="276" - mouse_opaque="true" - name="IconLocked" - top="4" - width="18" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="LabelItemNameTitle" - top="25" - width="78"> - Name: - </text> - <line_editor - border_style="line" - border_thickness="1" - follows="left|top|right" - height="16" - layout="topleft" - left_delta="78" - max_length_bytes="63" - name="LabelItemName" - top_delta="0" - width="252" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="LabelItemDescTitle" - top="45" - width="78"> - Description: - </text> - <line_editor - border_style="line" - border_thickness="1" - follows="left|top|right" - height="16" - layout="topleft" - left_delta="78" - max_length_bytes="127" - name="LabelItemDesc" - top_delta="0" - width="252" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - name="LabelCreatorTitle" - top="65" - width="78"> - Creator: - </text> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left_delta="78" - name="LabelCreatorName" - top_delta="0" - translate="false" - use_ellipses="true" - width="170"> - TestString PleaseIgnore - </text> - <button - follows="top|right" - height="16" - label="Profile..." - layout="topleft" - left_delta="174" - name="BtnCreator" - top_delta="0" - width="78" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - name="LabelOwnerTitle" - top="85" - width="78"> - Owner: - </text> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left_delta="78" - name="LabelOwnerName" - top_delta="0" - translate="false" - use_ellipses="true" - width="170"> - TestString PleaseIgnore - </text> - <button - follows="top|right" - height="16" - label="Profile..." - layout="topleft" - left_delta="174" - name="BtnOwner" - top_delta="0" - width="78" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - name="LabelAcquiredTitle" - top="105" - width="78"> - Acquired: - </text> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left_delta="78" - name="LabelAcquiredDate" - top_delta="0" - width="252"> - Wed May 24 12:50:46 2006 - </text> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="OwnerLabel" - top="125" - width="78"> - You: - </text> - <check_box - height="16" - label="Edit" - layout="topleft" - left_pad="5" - name="CheckOwnerModify" - top_delta="0" - width="78" /> - <check_box - height="16" - label="Copy" - layout="topleft" - left_delta="0" - name="CheckOwnerCopy" - top_pad="5" - width="88" /> - <check_box - height="16" - label="Resell" - layout="topleft" - left_delta="0" - name="CheckOwnerTransfer" - top_pad="5" - width="106" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="AnyoneLabel" - top_pad="5" - width="78"> - Anyone: - </text> - <check_box - height="16" - label="Copy" - layout="topleft" - left_pad="5" - name="CheckEveryoneCopy" - top_delta="0" - width="130" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="GroupLabel" - top_pad="5" - width="78"> - Group: - </text> - <check_box - height="16" - label="Share" - layout="topleft" - left_pad="5" - name="CheckShareWithGroup" - top_delta="5" - width="106" /> - <text - type="string" - length="1" - follows="left|top" - height="25" - layout="topleft" - left="10" - name="NextOwnerLabel" - top_pad="5" - width="78" - word_wrap="true"> - Next owner: - </text> - <check_box - height="16" - label="Edit" - layout="topleft" - left_pad="5" - name="CheckNextOwnerModify" - top_delta="0" - width="78" /> - <check_box - height="16" - label="Copy" - layout="topleft" - left_delta="0" - name="CheckNextOwnerCopy" - top_pad="5" - width="88" /> - <check_box - height="16" - label="Resell" - layout="topleft" - left_delta="0" - name="CheckNextOwnerTransfer" - top_pad="5" - width="106" /> - <check_box - height="16" - label="For Sale" - layout="topleft" - left="10" - name="CheckPurchase" - top_pad="5" - width="78" /> - <combo_box - height="19" - left_pad="5" - layout="topleft" - follows="left|top" - name="ComboBoxSaleType" - width="110"> - <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> - <spinner - follows="left|top" - decimal_digits="0" - increment="1" - name="Edit Cost" - label="Price:" - label_width="100" - left="10" - width="192" - min_val="1" - height="19" - max_val="999999999" - top_pad="5"/> - <text - type="string" - length="1" - height="15" - follows="left|top" - layout="topleft" - left_delta="82" - name="CurrencySymbol" - top_delta="1" - width="18"> - L$ - </text> - - <!--line_editor - border_style="line" - border_thickness="1" - follows="left|top|right" - height="16" - layout="topleft" - left_pad="5" - max_length_bytes="25" - name="EditPrice" - top_delta="0" - width="242" /--> - - <!--text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="BaseMaskDebug" - top="155" - width="330"> - B: - </text> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="60" - name="OwnerMaskDebug" - top_delta="0" - width="270"> - O: - </text> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="60" - name="GroupMaskDebug" - top_delta="0" - width="210"> - G: - </text> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="60" - name="EveryoneMaskDebug" - top_delta="0" - width="150"> - E: - </text> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="60" - name="NextMaskDebug" - top_delta="0" - width="90"> - N: - </text--> - -</floater> diff --git a/indra/newview/skins/default/xui/en/floater_inventory_settings.xml b/indra/newview/skins/default/xui/en/floater_inventory_settings.xml index 156bba6c27..a51e7a844a 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory_settings.xml @@ -4,8 +4,8 @@ can_minimize="true" can_resize="false" save_rect="true" - height="370" - width="370" + height="483" + width="483" name="inventory_settings" title="INVENTORY SETTINGS"> <icon @@ -16,7 +16,7 @@ left="18" mouse_opaque="true" name="multi_folder_icon" - top="25" + top="20" width="18" /> <text type="string" @@ -40,10 +40,10 @@ font="SansSerifMedium" left="60" width="300" - height="70" + height="66" name="multi_double_click_setting"> <radio_item - height="20" + height="18" label="Expands & collapses folder" label_text.text_color="White" follows="left|top" @@ -51,24 +51,24 @@ name="0" width="200"/> <radio_item - height="20" + height="18" follows="left|top" label="Opens a new window" label_text.text_color="White" layout="topleft" left_delta="0" name="1" - top_pad ="5" + top_pad ="3" width="200" /> <radio_item - height="20" + height="18" follows="left|top" label="Switches view" label_text.text_color="White" layout="topleft" left_delta="0" name="2" - top_pad ="5" + top_pad ="3" width="200" /> </radio_group> <icon @@ -79,7 +79,7 @@ left="18" mouse_opaque="true" name="single_folder_icon" - top_pad="30" + top_pad="19" width="18" /> <text type="string" @@ -103,10 +103,10 @@ font="SansSerifMedium" left="60" width="300" - height="45" + height="44" name="single_double_click_setting"> <radio_item - height="20" + height="18" label="Stays in current window" label_text.text_color="White" follows="left|top" @@ -114,27 +114,37 @@ name="false" width="200"/> <radio_item - height="20" + height="18" follows="left|top" label="Opens a new window" label_text.text_color="White" layout="topleft" left_delta="0" name="true" - top_pad ="5" + top_pad ="3" width="200" /> </radio_group> + <icon + follows="top|left" + height="15" + image_name="Icon_Pointer" + layout="topleft" + left="20" + mouse_opaque="true" + name="single_folder_icon" + top_pad="20" + width="15" /> <text type="string" length="1" follows="left|top|right" height="13" layout="topleft" - left="48" + left_pad="13" name="find_original_txt" font="SansSerifMedium" text_color="White" - top_pad="30" + top_delta="1" width="300"> Clicking on "Show in inventory" or "Find original" </text> @@ -146,10 +156,10 @@ font="SansSerifMedium" left="60" width="300" - height="45" + height="44" name="find_original_settings"> <radio_item - height="20" + height="18" label="Shows item in main inventory window" label_text.text_color="White" follows="left|top" @@ -157,23 +167,136 @@ name="false" width="200"/> <radio_item - height="20" + height="18" follows="left|top" label="Opens a new single-folder window" label_text.text_color="White" layout="topleft" left_delta="0" name="true" - top_pad ="5" + top_pad ="3" width="200" /> </radio_group> - <button - height="20" - label="OK" - layout="topleft" - left="140" - bottom="-20" - name="ok_btn" - label_color="White" - width="90" /> + <icon + follows="top|left" + height="18" + image_name="Inv_Favorite_Star_Full" + layout="topleft" + left="18" + mouse_opaque="true" + name="favorites_icon" + top_pad="19" + width="18" /> + <text + type="string" + length="1" + layout="topleft" + follows="left|top|right" + height="13" + left_pad="12" + top_delta="2" + name="favorites_txt" + font="SansSerifMedium" + text_color="White" + width="300"> + Favorites + </text> + <check_box + control_name="InventoryFavoritesUseStar" + layout="topleft" + follows="left|top" + top_pad="8" + font="SansSerifMedium" + left="60" + width="300" + height="18" + label="Star on favorite items" + name="favorite_star" + label_text.text_color="White" + initial_value="false"/> + <check_box + control_name="InventoryFavoritesUseHollowStar" + follows="left|top" + top_pad="5" + layout="topleft" + font="SansSerifMedium" + left="60" + width="150" + height="18" + label="Star on folders containing a favorite" + name="favorite_hollow_star" + label_text.text_color="White" + initial_value="false"/> + <check_box + control_name="InventoryFavoritesColorText" + follows="left|top" + top_pad="5" + layout="topleft" + font="SansSerifMedium" + left="60" + width="150" + height="18" + label="Colored text" + name="favorites_color" + label_text.text_color="White" + initial_value="false"/> + <color_swatch + can_apply_immediately="true" + follows="left|top" + layout="topleft" + height="24" + label_height="0" + left_pad="40" + name="favorites_swatch" + top_delta="-6" + width="44" > + <color_swatch.init_callback + function="ScriptPref.getUIColor" + parameter="InventoryFavoriteColor" /> + <color_swatch.commit_callback + function="ScriptPref.applyUIColor" + parameter="InventoryFavoriteColor" /> + </color_swatch> + <icon + follows="top|left" + height="18" + image_name="Inv_Object" + layout="topleft" + left="18" + mouse_opaque="true" + name="obj_icon" + top_pad="19" + width="18" /> + <text + type="string" + length="1" + follows="left|top|right" + height="13" + layout="topleft" + left_pad="12" + top_delta="2" + name="single_folder_txt" + font="SansSerifMedium" + text_color="White" + width="300"> + Pressing enter on an avatar attachment + </text> + <combo_box + control_name="InventoryAddAttachmentBehavior" + layout="topleft" + follows="left|top" + top_pad="8" + height="24" + left="60" + name="attach_combo" + width="300"> + <combo_box.item + label="Adds attachment (recommended)" + name="0" + value="0"/> + <combo_box.item + label="Wear (removes attachment at that point)" + name="1" + value="1"/> + </combo_box> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_marketplace.xml b/indra/newview/skins/default/xui/en/floater_marketplace.xml new file mode 100644 index 0000000000..40bf674d2d --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_marketplace.xml @@ -0,0 +1,201 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater + legacy_header_height="18" + can_minimize="true" + can_close="true" + can_resize="true" + height="775" + layout="topleft" + min_height="500" + min_width="600" + name="Marketplace" + save_rect="true" + single_instance="true" + save_visibility="true" + title="MARKETPLACE" + tab_stop="true" + width="780"> + <layout_stack + bottom="775" + follows="left|right|top|bottom" + layout="topleft" + left="5" + animate="false" + name="stack1" + orientation="vertical" + top="20" + width="770"> + <layout_panel + auto_resize="false" + default_tab_group="1" + height="22" + layout="topleft" + left="0" + min_height="20" + name="nav_controls" + top="400" + width="770"> + <button + image_overlay="Arrow_Left_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + hover_glow_amount="0.15" + tool_tip="Navigate back" + follows="left|top" + height="22" + layout="topleft" + left="1" + name="back" + top="0" + width="22"> + <button.commit_callback + function="WebContent.Back" /> + </button> + <button + image_overlay="Arrow_Right_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Navigate forward" + follows="left|top" + height="22" + layout="topleft" + left="27" + name="forward" + top_delta="0" + width="22"> + <button.commit_callback + function="WebContent.Forward" /> + </button> + <button + image_overlay="Stop_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Stop navigation" + enabled="true" + follows="left|top" + height="22" + layout="topleft" + left="51" + name="stop" + top_delta="0" + width="22"> + <button.commit_callback + function="WebContent.Stop" /> + </button> + <button + image_overlay="Refresh_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Reload page" + follows="left|top" + height="22" + layout="topleft" + left="51" + name="reload" + top_delta="0" + width="22"> + <button.commit_callback + function="WebContent.Reload" /> + </button> + <combo_box + allow_text_entry="true" + follows="left|top|right" + tab_group="1" + height="22" + layout="topleft" + left_pad="4" + max_chars="1024" + name="address" + combo_editor.select_on_focus="true" + tool_tip="Enter URL here" + top_delta="0" + width="672"> + <combo_box.commit_callback + function="WebContent.EnterAddress" /> + </combo_box> + <icon + name="media_secure_lock_flag" + height="16" + follows="top|left" + image_name="Lock2" + layout="topleft" + left_delta="2" + top_delta="2" + visible="false" + tool_tip="Secured Browsing" + width="16" /> + <button + image_overlay="ExternalBrowser_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Open current URL in your desktop browser" + follows="right|top" + enabled="true" + height="22" + layout="topleft" + name="popexternal" + right="770" + top_delta="-2" + width="22"> + <button.commit_callback + function="WebContent.PopExternal" /> + </button> + </layout_panel> + <layout_panel + height="40" + layout="topleft" + left_delta="0" + name="external_controls" + top_delta="0" + auto_resize="true" + width="585"> + <web_browser + bottom="-2" + follows="all" + layout="topleft" + left="0" + name="webbrowser" + top="0"/> + </layout_panel> + <layout_panel name="status_bar" + height="23" + auto_resize="false"> + <text + type="string" + length="200" + follows="bottom|left" + height="20" + layout="topleft" + left_delta="0" + name="statusbartext" + parse_urls="false" + text_color="0.4 0.4 0.4 1" + top_pad="3" + width="495"/> + <progress_bar + color_bar="0.3 1.0 0.3 1" + follows="bottom|right" + height="16" + top_delta="-1" + left_pad="24" + layout="topleft" + name="statusbarprogress" + width="64"/> + </layout_panel> + </layout_stack> +</floater> 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 90223fcda8..39e9de0980 100644 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -14,7 +14,7 @@ legacy_header_height="25"> <string name="status_idle"></string> - <string name="status_parse_error">Error: Dae parsing issue - see log for details.</string> + <string name="status_parse_error">Error: Model parsing issue - see log for details.</string> <string name="status_bind_shape_orientation">Warning: bind shape matrix is not in standard X-forward orientation.</string> <string name="status_material_mismatch">Error: Material of model is not a subset of reference model.</string> <string name="status_reading_file">Loading...</string> @@ -39,12 +39,14 @@ <string name="decomposing">Analyzing...</string> <string name="simplifying">Simplifying...</string> <string name="tbd">TBD</string> - + <string name="ModelTextureScaling">One or more textures in this model were scaled to be within the allowed limits.</string> + <!-- Warnings and info from model loader--> <string name="TooManyJoint">Skinning disabled due to too many joints: [JOINTS], maximum: [MAX]</string> <string name="UnrecognizedJoint">Rigged to unrecognized joint name [NAME]</string> <string name="UnknownJoints">Skinning disabled due to [COUNT] unknown joints</string> <string name="ModelLoaded">Model [MODEL_NAME] loaded</string> + <string name="InvBindCountMismatch">Bind matrices count mismatch joints count</string> <string name="IncompleteTC">Texture coordinates data is not complete.</string> <string name="PositionNaN">Found NaN while loading position data from DAE-Model, invalid model.</string> @@ -60,6 +62,27 @@ <string name="ParsingErrorNoRoot">Document has no root</string> <string name="ParsingErrorNoScene">Document has no visual_scene</string> <string name="ParsingErrorPositionInvalidModel">Unable to process mesh without position data. Invalid model.</string> + <string name="UnknownException">Importer crashed while processing [FILENAME], if you encounter this and file is valid, please report the issue to Second Life Support. Exception: [EXCEPTION].</string> + + <!-- GLTF specific messages --> + <string name="NoScenesFound">No scenes defined in GLTF file</string> + <string name="InvalidMeshReference">Node [NODE_NAME] references invalid mesh [MESH_INDEX] (total meshes: [TOTAL_MESHES])</string> + <string name="InvalidGeometryNonTriangulated">Mesh [MESH_NAME] primitive [PRIMITIVE_INDEX]: Invalid geometry with [INDEX_COUNT] indices (must be triangulated)</string> + <string name="EmptyVertexArray">Mesh [MESH_NAME] primitive [PRIMITIVE_INDEX]: Empty vertex array</string> + <string name="ErrorIndexLimit">Unable to process mesh [MESH_NAME] due to 65,534 vertex limit. Vertex count: [VERTEX_COUNT]</string> + <string name="TextureFound">Found texture: [TEXTURE_NAME] for material: [MATERIAL_NAME]</string> + <string name="IgnoredExtension">Model uses unsupported extension: [EXT], related material properties are ignored</string> + <string name="UnsupportedExtension">Unable to load model, unsupported extension: [EXT]</string> + <string name="FailedToCreateTempFile">Failed to create temporary file for embedded [TEXTURE_TYPE] texture [TEXTURE_INDEX]: [TEMP_FILE]</string> + <string name="SkinJointsOverLimit">Skin [SKIN_INDEX] defines [JOINT_COUNT] compatible joints, maximum is: [MAX]. Unused joints will be stripped on per model basis.</string> + <string name="SkinUsupportedJoints">Skin [SKIN_INDEX] defines [JOINT_COUNT] joints, but only [LEGAL_COUNT] were recognized and are compatible</string> + <string name="SkinUnusedJoints">Skin [SKIN_INDEX] defines [JOINT_COUNT] compatible joints, of them only [USED_COUNT] were used</string> + <string name="ModelTooManyJoints">Model [MODEL_NAME] uses [JOINT_COUNT], maximum: [MAX], upload might fail</string> + <string name="ModelSplitPrimitive">Too many vertices in primitive [MODEL_NAME], it was split into [FACE_COUNT] faces</string> + <string name="ModelTooManySubmodels">Model [MODEL_NAME] contains [SUBMODEL_COUNT] generated mesh parts, parts were trimmed to [SUBMODEL_LIMIT]</string> + <string name="ParsingErrorMissingBuffer">Buffer is either missing or empty [BUFFER_NAME].</string> + <string name="ParsingErrorMissingBufferBin">Buffer is either missing or empty. Check presence of [BUFFER_URI] file.</string> + <string name="ParsingErrorException">Parser failed to process [FILENAME], file might be corrupt, incomplete or protected from reading. Exception: [EXCEPTION].</string> <panel follows="top|left" @@ -784,7 +807,7 @@ help_topic="upload_model_physics" label="Physics" name="physics_panel"> - + <!-- ==== STEP 1: Level of Detail ==== --> <view_border bevel_style="none" @@ -850,7 +873,7 @@ <!-- <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> - + <!-- ==== STEP 2: Analyze ==== --> <view_border bevel_style="none" @@ -867,9 +890,9 @@ height="65" follows="top|left" left="18" - name="physics analysis" + name="physics analysis havok" top_pad="10" - visible="true" + visible="false" width="589"> <text follows="left|top" @@ -957,7 +980,131 @@ visible="false" width="90"/> </panel> - + <panel + bg_alpha_color="0 0 0 0" + bg_opaque_color="0 0 0 0.3" + height="65" + follows="top|left" + left="18" + name="physics analysis vhacd" + top_delta="0" + visible="false" + width="589"> + <text + follows="left|top" + font="SansSerif" + height="20" + layout="topleft" + left="0" + name="method_label" + text_color="White" + top_pad="0"> + Step 2: Convert to hulls (optional) + </text> + <text + follows="top|left" + height="15" + layout="topleft" + name="analysis_method_label" + top_pad="10" + width="100"> + Fill Mode: + </text> + <text + follows="top|left" + height="15" + name="quality_label" + layout="topleft" + left_pad="5" + width="85"> + Resolution: + </text> + <text + follows="top|left" + height="15" + name="quality_label" + layout="topleft" + left_pad="25" + width="95"> + Hulls per Mesh: + </text> + <text + follows="top|left" + height="15" + name="smooth_method_label" + layout="topleft" + left_pad="5" + width="95"> + Vertices per hull: + </text> + <text + follows="top|left" + height="15" + name="tolerance_label" + layout="topleft" + left_pad="5" + width="100"> + Error tolerance: + </text> + <combo_box + follows="top|left" + layout="topleft" + left="0" + name="Fill Mode" + top_pad="0" + height="20" + width="100"/> + <combo_box + follows="top|left" + layout="topleft" + left_pad="5" + name="Voxel Resolution" + height="20" + width="100"/> + <spinner + follows="top|left" + name="Num Hulls" + height="20" + left_pad="10" + width="60" + decimal_digits="0" + allow_digits_only="true"/> + <spinner + follows="top|left" + name="Num Vertices" + height="20" + left_pad="40" + width="60" + decimal_digits="0" + allow_digits_only="true"/> + <spinner + follows="top|left" + name="Error Tolerance" + height="20" + left_pad="40" + width="60" + decimal_digits="4" + allow_digits_only="true"/> + <button + bottom="1" + follows="top|right" + height="20" + label="Analyze" + layout="bottomleft" + name="Analyze" + right="-1" + width="90"/> + <button + follows="top|left" + height="20" + label="Cancel" + layout="topleft" + left_delta="0" + name="analyze_cancel" + visible="false" + width="90"/> + </panel> + <!-- ==== STEP 3: Simplify ==== --> <view_border bevel_style="none" @@ -976,7 +1123,8 @@ left="18" name="physics simplification" top_pad="10" - width="589"> + width="589" + visible="false"> <text text_color="White" follows="left|top" @@ -1065,7 +1213,7 @@ name="simplify_cancel" width="90"/> </panel> - + <!-- ==== Results ==== --> <view_border bevel_style="none" @@ -1163,7 +1311,7 @@ name="modifiers_panel" help_topic="upload_model_modifiers"> <view_border - bevel_style="none" + bevel_style="none" follows="top|left" height="306" layout="topleft" @@ -1404,7 +1552,7 @@ word_wrap="true"> </text_editor> <check_box - control_name="ImporterDebug" + control_name="ImporterDebugVerboseLogging" follows="top|left" top_pad="9" left="6" @@ -1570,7 +1718,7 @@ Model: [MODEL] </text> </panel> - <!-- + <!-- Streaming breakdown numbers are available but not fully understood uncommenting the following sections will display the numbers for debugging purposes <text @@ -1672,7 +1820,7 @@ Analysed: width="462" visible="true"> You don't have rights to upload mesh models. [[VURL] Find out how] to get certified. - </text> + </text> <text text_color="Yellow" layout="topleft" @@ -1683,7 +1831,7 @@ Analysed: </text> </panel> </panel> - + <text follows="left|top" layout="topleft" @@ -1706,7 +1854,6 @@ Analysed: height="408"/> <panel follows="right|bottom" - can_resize="false" height="140" layout="topleft" name="right_panel" diff --git a/indra/newview/skins/default/xui/en/floater_mp_performance.xml b/indra/newview/skins/default/xui/en/floater_mp_performance.xml index 1b5cf82dcb..13a32479fa 100644 --- a/indra/newview/skins/default/xui/en/floater_mp_performance.xml +++ b/indra/newview/skins/default/xui/en/floater_mp_performance.xml @@ -1,65 +1,66 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater - positioning="cascading" - legacy_header_height="40" - top="12" - right="-334" - height="80" - min_height="120" - width="330" - min_width="330" - can_minimize="true" - can_close="true" - can_resize="false" - layout="topright" - name="mpv_performance" - single_instance="true" - save_rect="true" - save_visibility="true" - title="FPS Limiter"> +positioning="cascading" +legacy_header_height="40" +top="12" +right="-334" +height="80" +min_height="120" +width="330" +min_width="330" +can_minimize="true" +can_close="true" +can_resize="false" +layout="topright" +name="mpv_performance" +single_instance="true" +save_rect="true" +save_visibility="true" +title="FPS Limiter"> - <panel - name="panel_fps" - border="false" - width="320" - height="60" - left="10" - top="40" - follows="left|top|right|bottom" - layout="topleft" - > +<panel + name="panel_fps" + border="false" + width="320" + height="60" + left="10" + top="40" + follows="left|top|right|bottom" + layout="topleft" + > - <slider - follows="left|top" - width="240" - height="15" - left="12" - layout="topleft" - name="fpsSlider" - enabled="true" - control_name="fpsSlider" - decimal_digits="0" - increment="12" - initial_value="0" - label="Max FPS:" - label_width="50" - text_width="2" - can_edit_text="false" - show_text="false" - > - </slider> + <slider + follows="left|top" + width="240" + height="15" + left="12" + layout="topleft" + name="fpsSliderCtrl" + enabled="true" + decimal_digits="0" + min_val="0" + max_val="132" + increment="12" + initial_value="132" + label="Max FPS:" + label_width="50" + text_width="2" + can_edit_text="false" + show_text="false" + > + </slider> - <text - follows="left|top" - width="50" - height="15" - left_delta="252" - layout="topleft" - type="string" - name="fpsText" - > - no limit - </text> + <text + follows="left|top" + width="50" + height="15" + left_delta="252" + layout="topleft" + type="string" + name="fpsTextCtrl" + > + no limit + </text> </panel> diff --git a/indra/newview/skins/default/xui/en/floater_my_inventory.xml b/indra/newview/skins/default/xui/en/floater_my_inventory.xml index a9900f05b7..881c1f7469 100644 --- a/indra/newview/skins/default/xui/en/floater_my_inventory.xml +++ b/indra/newview/skins/default/xui/en/floater_my_inventory.xml @@ -12,7 +12,7 @@ save_visibility="true" reuse_instance="true" title="INVENTORY" - width="363" > + width="418" > <panel class="sidepanel_inventory" name="main_panel" diff --git a/indra/newview/skins/default/xui/en/floater_new_feature_notification.xml b/indra/newview/skins/default/xui/en/floater_new_feature_notification.xml index 57b74b360a..9981e5d893 100644 --- a/indra/newview/skins/default/xui/en/floater_new_feature_notification.xml +++ b/indra/newview/skins/default/xui/en/floater_new_feature_notification.xml @@ -17,17 +17,7 @@ New inventory features </floater.string> <floater.string name="description_txt_inventory"> -You can now add preview images to inventory items and view a folder in its own window. -Learn more in this [https://community.secondlife.com/blogs/entry/13637-new-features-inventory-item-preview-and-single-folder-view/ blogpost] - </floater.string> - <floater.string name="title_txt_gltf"> -New GLTF PBR materials support - </floater.string> - <floater.string name="description_txt_gltf"> -You can now use expanded material support with the ability to import and edit GLTF Physically Based Rendering (PBR) Materials. -In order to support the addition of the GLTF format, some areas in the viewer may appear darker than usual. - -Learn more about [https://wiki.secondlife.com/wiki/PBR_Materials Physically Based Rendering (PBR)] +You can now mark items and folders as favorites. Favorited items will appear in the Favorites tab of inventory and by default will be highlighted with a star in the main inventory view. </floater.string> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_object_weights.xml b/indra/newview/skins/default/xui/en/floater_object_weights.xml index 5e4b017590..709fbdd27e 100644 --- a/indra/newview/skins/default/xui/en/floater_object_weights.xml +++ b/indra/newview/skins/default/xui/en/floater_object_weights.xml @@ -2,7 +2,7 @@ <floater can_close="true" can_tear_off="false" - height="289" + height="372" help_topic="object_weights" layout="topleft" name="object_weights" @@ -13,6 +13,21 @@ <floater.string name="nothing_selected" value="--"/> + <floater.string + name="lowest_lod" + value="Lowest"/> + <floater.string + name="low_lod" + value="Low"/> + <floater.string + name="medium_lod" + value="Medium"/> + <floater.string + name="high_lod" + value="High"/> + <floater.string + name="multiple_lods" + value="Multiple"/> <text follows="left|top" @@ -320,4 +335,97 @@ top_delta="0" value="Total capacity" width="130" /> + + + <text + follows="left|top" + height="16" + layout="topleft" + left="10" + name="rendering_info_text" + text_color="EmphasisColor" + top_pad="10" + value="RENDERING INFO" + width="180" /> + <text + follows="left|top" + halign="right" + height="16" + layout="topleft" + left="10" + name="lod_level" + top_pad="3" + value="--" + width="40" /> + <loading_indicator + follows="left|top" + height="16" + layout="topleft" + left="34" + name="lod_level_loading_indicator" + top_delta="0" + width="16" /> + <text + follows="left|top" + height="16" + layout="topleft" + left_pad="10" + name="lod_level_label" + top_delta="0" + value="LOD (Level of detail)" + width="130" /> + <text + follows="left|top" + halign="right" + height="16" + layout="topleft" + left="10" + name="triangles_shown" + top_pad="3" + value="--" + width="40" /> + <loading_indicator + follows="left|top" + height="16" + layout="topleft" + left="34" + name="triangles_shown_loading_indicator" + top_delta="0" + width="16" /> + <text + follows="left|top" + height="16" + layout="topleft" + left_pad="10" + name="triangles_shown_label" + top_delta="0" + value="Triangles Shown" + width="130" /> + <text + follows="left|top" + halign="right" + height="16" + layout="topleft" + left="10" + name="pixel_area" + top_pad="3" + value="--" + width="40" /> + <loading_indicator + follows="left|top" + height="16" + layout="topleft" + left="34" + name="pixel_area_loading_indicator" + top_delta="0" + width="16" /> + <text + follows="left|top" + height="16" + layout="topleft" + left_pad="10" + name="pixel_area_label" + top_delta="0" + value="Pixel Area" + width="130" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index 4b0e0bb221..97ff1fd5a2 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -100,6 +100,15 @@ layout="topleft" help_topic="preferences_display_tab" name="display" /> + + <panel + class="panel_preference_graphics3" + filename="panel_preferences_graphics3.xml" + label="Visual Effects" + layout="topleft" + help_topic="preferences_display_tab" + name="display3" /> + <panel class="panel_preference" filename="panel_preferences_sound.xml" diff --git a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml index 9db5502387..0e37472990 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater - height="452" + height="492" layout="topleft" name="prefs_graphics_advanced" help_topic="Preferences_Graphics_Advanced" @@ -29,13 +29,13 @@ decimal_digits="0" follows="left|top" height="16" - increment="32" - initial_value="160" + increment="8" + initial_value="128" label="Draw distance:" label_width="185" layout="topleft" left="30" - min_val="32" + min_val="8" max_val="512" name="DrawDistance" top_delta="16" @@ -52,7 +52,7 @@ left_delta="330" width="20"> m - </text> + </text> <slider control_name="RenderMaxPartCount" decimal_digits="0" @@ -141,6 +141,14 @@ tool_tip="Maximum resolution for 'level of detail' textures" width="90"> <combo_box.item + label="128" + name="128" + value="128"/> + <combo_box.item + label="256" + name="256" + value="256"/> + <combo_box.item label="512" name="512" value="512"/> @@ -626,9 +634,9 @@ layout="topleft" left="385" name="vert_border" - top="16" + top="16" width="0"/> - + <text type="string" length="1" @@ -732,7 +740,7 @@ <check_box.commit_callback function="Pref.RenderOptionUpdate" /> </check_box> - + <text type="string" length="1" @@ -744,14 +752,14 @@ text_readonly_color="LabelDisabledColor" top_delta="22" width="128"> - Shadows: + Shadows source: </text> <combo_box control_name="RenderShadowDetail" height="18" layout="topleft" left_delta="130" - top_delta="0" + top_delta="0" name="ShadowDetail" width="150"> <combo_box.item @@ -766,6 +774,10 @@ label="Sun/Moon + Projectors" name="2" value="2"/> + <combo_box.item + label="Projectors only" + name="3" + value="3"/> </combo_box> <check_box @@ -781,7 +793,7 @@ <check_box.commit_callback function="Pref.RenderOptionUpdate" /> </check_box> - + <text type="string" length="1" @@ -858,6 +870,51 @@ value="3"/> </combo_box> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="420" + name="ReflectionProbeCount" + text_readonly_color="LabelDisabledColor" + top_delta="22" + width="128"> + Max Reflection Probes: + </text> + + <combo_box + control_name="RenderReflectionProbeCount" + height="18" + layout="topleft" + label="Max. Reflection Probes:" + left_delta="130" + top_delta="0" + name="ProbeCount" + width="150"> + <combo_box.item + label="None" + name="1" + value="1"/> + <combo_box.item + label="Low" + name="32" + value="32"/> + <combo_box.item + label="Medium" + name="64" + value="64"/> + <combo_box.item + label="High" + name="128" + value="128"/> + <combo_box.item + label="Ultra" + name="256" + value="256"/> + </combo_box> + <slider control_name="RenderExposure" decimal_digits="1" @@ -886,7 +943,7 @@ layout="topleft" left="420" name="Mirrors" - top_delta="24" + top_delta="22" width="240"> <check_box.commit_callback function="Pref.RenderOptionUpdate" /> @@ -988,7 +1045,7 @@ max_val="1.0" name="RenderSharpness" show_text="true" - top_delta="24" + top_delta="20" width="260"> </slider> <!-- End of Sharpening Settings--> @@ -1039,7 +1096,7 @@ max_val="1.0" name="TonemapMix" show_text="true" - top_delta="22" + top_delta="20" width="260"> </slider> <!-- End of Tone Mapping Settings--> @@ -1050,7 +1107,7 @@ layout="topleft" left="13" name="horiz_border" - top="415" + top="448" top_delta="5" width="774"/> <button diff --git a/indra/newview/skins/default/xui/en/floater_preview_trash.xml b/indra/newview/skins/default/xui/en/floater_preview_trash.xml index f1c87c8c5a..ebb5cd9251 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_trash.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_trash.xml @@ -29,6 +29,8 @@ bevel_style="none" scroll.reserve_scroll_corner="false"> <folder folder_arrow_image="Folder_Arrow" + favorite_image="Inv_Favorite_Star_Full" + favorite_content_image="Inv_Favorite_Star_Content" folder_indentation="8" item_height="20" item_top_pad="4" diff --git a/indra/newview/skins/default/xui/en/floater_rlv_console.xml b/indra/newview/skins/default/xui/en/floater_rlv_console.xml new file mode 100644 index 0000000000..708055d1b6 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_rlv_console.xml @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + can_resize="true" + height="400" + layout="topleft" + min_height="300" + min_width="300" + name="rlv_console" + title="RLVa console" + width="600" + > + <layout_stack + animate="false" + bottom="-1" + default_tab_group="2" + follows="all" + left="5" + layout="topleft" + mouse_opaque="false" + name="main_stack" + right="-5" + orientation="vertical" + tab_group="1" + top="1" + > + <layout_panel + name="body_panel" + height="235"> + <text_editor + follows="all" + left="1" + right="-1" + top="0" + length="1" + font="Monospace" + bottom="-1" + ignore_tab="false" + layout="topleft" + max_length="65536" + name="console_output" + read_only="true" + track_end="true" + type="string" + word_wrap="true" + > + </text_editor> + </layout_panel> + + <layout_panel + height="26" + auto_resize="false" + name="input_panel"> + <chat_editor + layout="topleft" + expand_lines_count="5" + follows="left|right|bottom" + font="SansSerifSmall" + height="20" + is_expandable="true" + text_tentative_color="TextFgTentativeColor" + name="console_input" + max_length="1023" + spellcheck="true" + tab_group="3" + bottom_delta="20" + left="1" + top="1" + right="-1" + show_emoji_helper="false" + wrap="true" + /> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml index fc1e32915a..8891ebcd87 100644 --- a/indra/newview/skins/default/xui/en/floater_search.xml +++ b/indra/newview/skins/default/xui/en/floater_search.xml @@ -1,18 +1,202 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater - positioning="cascading" legacy_header_height="18" + can_minimize="true" + can_close="true" can_resize="true" height="775" layout="topleft" - min_height="400" - min_width="500" - name="floater_search" - help_topic="floater_search" + min_height="500" + min_width="600" + name="Search" save_rect="true" + single_instance="true" save_visibility="true" - title="" - initial_mime_type="text/html" - width="780" + title="SEARCH" tab_stop="true" - filename="floater_web_content.xml"/> + width="780"> + <layout_stack + bottom="775" + follows="left|right|top|bottom" + layout="topleft" + left="5" + animate="false" + name="stack1" + orientation="vertical" + top="20" + width="770"> + <layout_panel + auto_resize="false" + default_tab_group="1" + height="22" + layout="topleft" + left="0" + min_height="20" + name="nav_controls" + top="400" + width="770"> + <button + image_overlay="Arrow_Left_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + hover_glow_amount="0.15" + tool_tip="Navigate back" + follows="left|top" + height="22" + layout="topleft" + left="1" + name="back" + top="0" + width="22"> + <button.commit_callback + function="WebContent.Back" /> + </button> + <button + image_overlay="Arrow_Right_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Navigate forward" + follows="left|top" + height="22" + layout="topleft" + left="27" + name="forward" + top_delta="0" + width="22"> + <button.commit_callback + function="WebContent.Forward" /> + </button> + <button + image_overlay="Stop_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Stop navigation" + enabled="true" + follows="left|top" + height="22" + layout="topleft" + left="51" + name="stop" + top_delta="0" + width="22"> + <button.commit_callback + function="WebContent.Stop" /> + </button> + <button + image_overlay="Refresh_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Reload page" + follows="left|top" + height="22" + layout="topleft" + left="51" + name="reload" + top_delta="0" + width="22"> + <button.commit_callback + function="WebContent.Reload" /> + </button> + <combo_box + allow_text_entry="true" + follows="left|top|right" + tab_group="1" + height="22" + layout="topleft" + left_pad="4" + max_chars="1024" + name="address" + combo_editor.select_on_focus="true" + tool_tip="Enter URL here" + top_delta="0" + width="672"> + <combo_box.commit_callback + function="WebContent.EnterAddress" /> + </combo_box> + <icon + name="media_secure_lock_flag" + height="16" + follows="top|left" + image_name="Lock2" + layout="topleft" + left_delta="2" + top_delta="2" + visible="false" + tool_tip="Secured Browsing" + width="16" /> + <button + image_overlay="ExternalBrowser_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Open current URL in your desktop browser" + follows="right|top" + enabled="true" + height="22" + layout="topleft" + name="popexternal" + right="770" + top_delta="-2" + width="22"> + <button.commit_callback + function="WebContent.PopExternal" /> + </button> + </layout_panel> + <layout_panel + height="40" + layout="topleft" + left_delta="0" + name="external_controls" + top_delta="0" + auto_resize="true" + width="585"> + <web_browser + bottom="-2" + follows="all" + layout="topleft" + left="0" + trusted_content="true" + name="webbrowser" + top="0"/> + </layout_panel> + <layout_panel name="status_bar" + height="23" + auto_resize="false"> + <text + type="string" + length="200" + follows="bottom|left" + height="20" + layout="topleft" + left_delta="0" + name="statusbartext" + parse_urls="false" + text_color="0.4 0.4 0.4 1" + top_pad="3" + width="495"/> + <progress_bar + color_bar="0.3 1.0 0.3 1" + follows="bottom|right" + height="16" + top_delta="-1" + left_pad="24" + layout="topleft" + name="statusbarprogress" + width="64"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_settings_debug.xml b/indra/newview/skins/default/xui/en/floater_settings_debug.xml index a93be6a18d..c40ae3ea06 100644 --- a/indra/newview/skins/default/xui/en/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/en/floater_settings_debug.xml @@ -66,6 +66,7 @@ visible="false" name="comment_text" follows="left|top" + max_length="1024" width="240" top_delta="20" word_wrap="true" /> diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index e6b780728c..acdccdc03a 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -167,8 +167,19 @@ left="30" height="16" top_pad="8" - width="180" + width="80" + control_name="RenderUIInSnapshot" name="ui_check" /> + <check_box + label="L$ Balance" + layout="topleft" + left_pad="16" + height="16" + top_delta="0" + width="80" + control_name="RenderBalanceInSnapshot" + enabled_control="RenderUIInSnapshot" + name="balance_check" /> <check_box label="HUDs" layout="topleft" @@ -176,6 +187,7 @@ left="30" top_pad="1" width="180" + control_name="RenderHUDInSnapshot" name="hud_check" /> <check_box label="Freeze frame (fullscreen)" diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml index 6633e25099..1600c422c3 100644 --- a/indra/newview/skins/default/xui/en/floater_stats.xml +++ b/indra/newview/skins/default/xui/en/floater_stats.xml @@ -54,6 +54,27 @@ label="jitter" decimal_digits="1" stat="frametimejitter"/> + <stat_bar name="normalized_cumulative_frametime" + label="normalized sess. jitter" + decimal_digits="4" + stat="normalizedframetimejitter"/> + <stat_bar name="normalized_period_jitter" + label="normalized period jitter" + decimal_digits="4" + stat="normalizedframetimejitterperiod"/> + <stat_bar name="normalized_frametime_variation" + label="normalized frametime variation" + decimal_digits="4" + stat="nftv"/> + <stat_bar name="frame_events_per_minute" + label="frame events/minute" + decimal_digits="2" + stat="frametimeeventspm"/> + <stat_bar name="frame_events_last_minute" + label="frame events last min." + decimal_digits="0" + stat="frametimeeventslastmin"/> + <stat_bar name="bandwidth" label="UDP Data Received" stat="activemessagedatareceived" @@ -74,6 +95,38 @@ <stat_view name="render" label="Render" setting="OpenDebugStatRender"> + <stat_bar name="framet_cumulative" + label="jitter cumulative" + decimal_digits="1" + stat="frametimejitcumulative"/> + <stat_bar name="framet_jitter_99th" + label="jitter 99th percentile" + decimal_digits="1" + stat="frametimejitter99"/> + <stat_bar name="framet_jitter_95th" + label="jitter 95th percentile" + decimal_digits="1" + stat="frametimejitter95"/> + <stat_bar name="framet_jitter_stddev" + label="frametime jitter std dev" + decimal_digits="1" + stat="frametimejitterstddev"/> + <stat_bar name="framet_99th" + label="frametime 99th percentile" + decimal_digits="1" + stat="frametime99"/> + <stat_bar name="framet_95th" + label="frametime 95th percentile" + decimal_digits="1" + stat="frametime95"/> + <stat_bar name="framet_stddev" + label="frametime std dev" + decimal_digits="1" + stat="frametimestddev"/> + <stat_bar name="framet_events" + label="frametime events" + decimal_digits="0" + stat="frametimeevents"/> <stat_bar name="ktrisframe" label="KTris per Frame" unit_label="ktris/fr" diff --git a/indra/newview/skins/default/xui/en/floater_test_slapp.xml b/indra/newview/skins/default/xui/en/floater_test_slapp.xml new file mode 100644 index 0000000000..5a13a0147e --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_test_slapp.xml @@ -0,0 +1,123 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater + legacy_header_height="18" + height="300" + layout="topleft" + name="slapp_test" + title="SLAPP TEST" + width="500"> + <floater.string + name="remove_folder_slapp"> + secondlife:///app/remove_folder/?folder_id= + </floater.string> + <text + type="string" + length="1" + top="20" + follows="left|top|right" + height="16" + name="trusted_txt" + font="SansSerifMedium" + text_color="white" + layout="topleft" + left="16"> + Trusted source + </text> + <text + type="string" + length="1" + top_pad="8" + follows="left|top|right" + height="16" + layout="topleft" + left="16"> + /wear_folder + </text> + <text + type="string" + length="1" + top_pad="5" + follows="left|top|right" + height="16" + width="450" + layout="topleft" + left="16"> + secondlife:///app/wear_folder/?folder_name=Daisy + </text> + <text + type="string" + length="1" + top_pad="8 " + follows="left|top|right" + height="16" + layout="topleft" + left="16"> + /add_folder + </text> + <text + type="string" + length="1" + top_pad="5" + follows="left|top|right" + height="16" + width="450" + layout="topleft" + left="16"> + secondlife:///app/add_folder/?folder_name=Cardboard%20Boxbot + </text> + <text + type="string" + length="1" + top_pad="5" + follows="left|top|right" + height="16" + width="450" + layout="topleft"> + secondlife:///app/add_folder/?folder_id=59219db2-c260-87d3-213d-bb3bc298a3d8 + </text> + <text + type="string" + length="1" + top_pad="8 " + follows="left|top|right" + height="16" + layout="topleft" + left="16"> + /remove_folder + </text> + <text + type="string" + length="1" + top_pad="5" + follows="left|top|right" + height="16" + layout="topleft" + left="16"> + Folder ID: + </text> + <line_editor + border_style="line" + border_thickness="1" + follows="left|top" + font="SansSerif" + height="18" + layout="topleft" + left="75" + max_length_bytes="50" + prevalidate_callback="ascii" + name="remove_folder_id" + top_delta="-2" + width="270" /> + <text + type="string" + length="1" + top_pad="5" + follows="left|top|right" + height="16" + width="450" + name="remove_folder_txt" + layout="topleft" + left="16"> + secondlife:///app/remove_folder/?folder_id= + </text> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml index 51809793d3..c0d260ef59 100644 --- a/indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml +++ b/indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml @@ -22,7 +22,7 @@ increment="0.025" initial_value="0.5" label="Voice Chat" - label_width="50" + label_width="60" layout="topleft" left="15" top="50" diff --git a/indra/newview/skins/default/xui/en/floater_web_content.xml b/indra/newview/skins/default/xui/en/floater_web_content.xml index 2e1dfa00c7..53796f0959 100644 --- a/indra/newview/skins/default/xui/en/floater_web_content.xml +++ b/indra/newview/skins/default/xui/en/floater_web_content.xml @@ -178,7 +178,7 @@ width="22"> <button.commit_callback function="WebContent.TestURL" - parameter="https://sl-viewer-media-system.s3.amazonaws.com/index.html"/> + parameter="https://sl-viewer-media-system.s3.amazonaws.com/bookmarks/index.html"/> </button> </layout_panel> <layout_panel diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml index 08cc9ae19e..fb93d32ee4 100644 --- a/indra/newview/skins/default/xui/en/floater_world_map.xml +++ b/indra/newview/skins/default/xui/en/floater_world_map.xml @@ -89,7 +89,7 @@ height="22" width="238" follows="right|top" - top="6" + top="6" background_visible="false" bg_alpha_color="DkGray2"> <text @@ -455,7 +455,7 @@ <panel follows="right|top|bottom" - height="330" + height="235" top_pad="0" width="238" name="layout_panel_4"> @@ -532,9 +532,9 @@ width="16" /> <search_editor follows="top|right" - search_button_visible="false" + search_button_visible="false" height="22" - text_readonly_color="DkGray" + text_readonly_color="DkGray" label="Regions by Name" layout="topleft" top_delta="-2" @@ -542,10 +542,7 @@ name="location" select_on_focus="true" tool_tip="Type the name of a region" - width="152"> - <search_editor.commit_callback - function="WMap.Location" /> - </search_editor> + width="152"/> <button follows="top|right" height="23" @@ -594,6 +591,13 @@ <scroll_list.commit_callback function="WMap.SearchResult" /> </scroll_list> + </panel> + <panel + follows="right|bottom" + height="95" + top_pad="0" + width="238" + name="layout_panel_7"> <text type="string" length="1" @@ -608,7 +612,7 @@ Location: </text> <spinner - control_name="teleport_coordinate_x" + control_name="Teleport_Coordinate_X" decimal_digits="0" follows="right|bottom" height="23" @@ -620,11 +624,11 @@ min_val="0" name="teleport_coordinate_x" width="44" > - <spinner.commit_callback + <spinner.commit_callback function="WMap.Coordinates" /> </spinner> <spinner - control_name="teleport_coordinate_y" + control_name="Teleport_Coordinate_Y" decimal_digits="0" follows="right|bottom" height="23" @@ -640,7 +644,7 @@ function="WMap.Coordinates" /> </spinner> <spinner - control_name="teleport_coordinate_z" + control_name="Teleport_Coordinate_Z" decimal_digits="0" follows="right|bottom" height="23" diff --git a/indra/newview/skins/default/xui/en/menu_favorites.xml b/indra/newview/skins/default/xui/en/menu_favorites.xml index 6345394b46..f82f705fb7 100644 --- a/indra/newview/skins/default/xui/en/menu_favorites.xml +++ b/indra/newview/skins/default/xui/en/menu_favorites.xml @@ -35,6 +35,9 @@ <menu_item_call.on_click function="Favorites.DoToSelected" parameter="show_on_map" /> + <menu_item_call.on_enable + function="Favorites.EnableSelected" + parameter="show_on_map" /> </menu_item_call> <menu_item_call label="Copy SLurl" @@ -43,6 +46,9 @@ <menu_item_call.on_click function="Favorites.DoToSelected" parameter="copy_slurl" /> + <menu_item_call.on_enable + function="Favorites.EnableSelected" + parameter="copy_slurl" /> </menu_item_call> <menu_item_call label="Create Pick" diff --git a/indra/newview/skins/default/xui/en/menu_gallery_inventory.xml b/indra/newview/skins/default/xui/en/menu_gallery_inventory.xml index 99f84fe808..f01dee36ce 100644 --- a/indra/newview/skins/default/xui/en/menu_gallery_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_gallery_inventory.xml @@ -670,61 +670,177 @@ function="Inventory.DoToSelected" parameter="ungroup_folder_items" /> </menu_item_call> + <menu_item_call + label="Add to Favorites" + layout="topleft" + name="Add to Favorites"> + <menu_item_call.on_click + function="Inventory.DoToSelected" + parameter="add_to_favorites" /> + </menu_item_call> + <menu_item_call + label="Remove from Favorites" + layout="topleft" + name="Remove from Favorites"> + <menu_item_call.on_click + function="Inventory.DoToSelected" + parameter="remove_from_favorites" /> + </menu_item_call> + <menu + label="Upload to folder" + layout="topleft" + name="upload_options"> + <menu_item_call + label="Image..." + layout="topleft" + name="Upload Image"> + <menu_item_call.on_click + function="Inventory.FileUploadLocation" + parameter="upload_texture" /> + <menu_item_call.on_enable + function="File.EnableUpload" /> + <menu_item_call.on_visible + function="Upload.CalculateCosts" + parameter="Upload Image,texture" /> + </menu_item_call> + <menu_item_call + label="Sound (L$[COST])..." + layout="topleft" + name="Upload Sound"> + <menu_item_call.on_click + function="Inventory.FileUploadLocation" + parameter="upload_sound" /> + <menu_item_call.on_enable + function="File.EnableUpload" /> + <menu_item_call.on_visible + function="Upload.CalculateCosts" + parameter="Upload Sound,sound" /> + </menu_item_call> + <menu_item_call + label="Animation (L$[COST])..." + layout="topleft" + name="Upload Animation"> + <menu_item_call.on_click + function="Inventory.FileUploadLocation" + parameter="upload_animation" /> + <menu_item_call.on_enable + function="File.EnableUpload" /> + <menu_item_call.on_visible + function="Upload.CalculateCosts" + parameter="Upload Animation,animation" /> + </menu_item_call> + <menu_item_call + label="Model..." + layout="topleft" + name="Upload Model"> + <menu_item_call.on_click + function="Inventory.FileUploadLocation" + parameter="upload_model" /> + <menu_item_call.on_enable + function="File.EnableUploadModel" /> + <menu_item_call.on_visible + function="File.VisibleUploadModel"/> + </menu_item_call> + <menu_item_call + label="Material..." + layout="topleft" + name="Upload Material"> + <menu_item_call.on_click + function="Inventory.FileUploadLocation" + parameter="upload_pbr_material" /> + <menu_item_call.on_enable + function="File.EnableUploadMaterial" /> + </menu_item_call> + <menu_item_call + label="Bulk..." + layout="topleft" + name="Bulk Upload"> + <menu_item_call.on_click + function="Inventory.FileUploadLocation" + parameter="upload_bulk" /> + <menu_item_call.on_visible + function="Upload.CalculateCosts" + parameter="Bulk Upload,texture" /> + </menu_item_call> + </menu> <menu label="Use as default for" layout="topleft" name="upload_def"> - <menu_item_call + <menu_item_check label="Image uploads" layout="topleft" name="Image uploads"> - <menu_item_call.on_click + <on_click function="Inventory.FileUploadLocation" - parameter="texture" /> - <menu_item_call.on_visible + parameter="def_texture" /> + <on_visible function="Inventory.CanSetUploadLocation" /> - </menu_item_call> - <menu_item_call + <on_check + function="Inventory.FileUploadLocation.Check" + parameter="def_texture" /> + </menu_item_check> + <menu_item_check label="Sound uploads" layout="topleft" name="Sound uploads"> - <menu_item_call.on_click + <on_click function="Inventory.FileUploadLocation" - parameter="sound" /> - <menu_item_call.on_visible + parameter="def_sound" /> + <on_visible function="Inventory.CanSetUploadLocation" /> - </menu_item_call> - <menu_item_call + <on_check + function="Inventory.FileUploadLocation.Check" + parameter="def_sound" /> + </menu_item_check> + <menu_item_check label="Animation uploads" layout="topleft" name="Animation uploads"> - <menu_item_call.on_click + <on_click function="Inventory.FileUploadLocation" - parameter="animation" /> - <menu_item_call.on_visible + parameter="def_animation" /> + <on_visible function="Inventory.CanSetUploadLocation" /> - </menu_item_call> - <menu_item_call + <on_check + function="Inventory.FileUploadLocation.Check" + parameter="def_animation" /> + </menu_item_check> + <menu_item_check label="Model uploads" layout="topleft" name="Model uploads"> - <menu_item_call.on_click + <on_click function="Inventory.FileUploadLocation" - parameter="model" /> - <menu_item_call.on_visible + parameter="def_model" /> + <on_visible function="Inventory.CanSetUploadLocation" /> - </menu_item_call> + <on_check + function="Inventory.FileUploadLocation.Check" + parameter="def_model" /> + </menu_item_check> + <menu_item_check + label="PBR material uploads" + layout="topleft" + name="PBR uploads"> + <on_click + function="Inventory.FileUploadLocation" + parameter="def_pbr_material" /> + <on_check + function="Inventory.FileUploadLocation.Check" + parameter="def_pbr_material" /> + </menu_item_check> + <menu_item_check + label="Use as favorite folder" + layout="topleft" + name="Set favorite folder"> + <on_click + function="Inventory.SetFavoriteFolder" + parameter="favorite" /> + <on_visible + function="Inventory.CanSetFavoriteFolder" /> + </menu_item_check> </menu> - <menu_item_call - label="Use as favorite folder" - layout="topleft" - name="Set favorite folder"> - <menu_item_call.on_click - function="Inventory.SetFavoriteFolder" - parameter="favorite" /> - <menu_item_call.on_visible - function="Inventory.CanSetFavoriteFolder" /> - </menu_item_call> <menu_item_separator layout="topleft" name="Marketplace Separator" /> diff --git a/indra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml b/indra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml index 99cee83f4e..fb68193006 100755 --- a/indra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml +++ b/indra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml @@ -50,6 +50,26 @@ function="Outfit.Thumbnail" /> </menu_item_call> <menu_item_call + label="Add to favorites" + layout="topleft" + name="favorites_add"> + <on_visible + function="Outfit.OnVisible" + parameter="favorites_add" /> + <on_click + function="Outfit.Favorite" /> + </menu_item_call> + <menu_item_call + label="Remove from favorites" + layout="topleft" + name="favorites_remove"> + <on_visible + function="Outfit.OnVisible" + parameter="favorites_remove" /> + <on_click + function="Outfit.Favorite" /> + </menu_item_call> + <menu_item_call label="Edit outfit" layout="topleft" name="edit"> diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index a72f610abb..087424b469 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -152,6 +152,14 @@ parameter="category" /> </menu_item_call> <menu_item_call + label="New Folder" + layout="topleft" + name="New Outfit Folder"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="category" /> + </menu_item_call> + <menu_item_call label="New Outfit" layout="topleft" name="New Outfit"> @@ -371,6 +379,14 @@ parameter="copy_uuid" /> </menu_item_call> <menu_item_call + label="Copy UUID" + layout="topleft" + name="Copy UUID"> + <menu_item_call.on_click + function="Inventory.DoToSelected" + parameter="copy_folder_uuid" /> + </menu_item_call> + <menu_item_call label="Show in Main Panel" layout="topleft" name="Show in Main Panel"> @@ -934,7 +950,7 @@ function="Inventory.EnvironmentEnabled" /> </menu_item_call> </menu> - </menu> + </menu> <menu_item_call label="Create folder from selected" layout="topleft" @@ -951,50 +967,158 @@ function="Inventory.DoToSelected" parameter="ungroup_folder_items" /> </menu_item_call> + <menu_item_call + label="Add to Favorites" + layout="topleft" + name="Add to Favorites"> + <menu_item_call.on_click + function="Inventory.DoToSelected" + parameter="add_to_favorites" /> + </menu_item_call> + <menu_item_call + label="Remove from Favorites" + layout="topleft" + name="Remove from Favorites"> + <menu_item_call.on_click + function="Inventory.DoToSelected" + parameter="remove_from_favorites" /> + </menu_item_call> + <menu + label="Upload to folder" + layout="topleft" + name="upload_options"> + <menu_item_call + label="Image..." + layout="topleft" + name="Upload Image"> + <menu_item_call.on_click + function="Inventory.FileUploadLocation" + parameter="upload_texture" /> + <menu_item_call.on_enable + function="File.EnableUpload" /> + <menu_item_call.on_visible + function="Upload.CalculateCosts" + parameter="Upload Image,texture" /> + </menu_item_call> + <menu_item_call + label="Sound (L$[COST])..." + layout="topleft" + name="Upload Sound"> + <menu_item_call.on_click + function="Inventory.FileUploadLocation" + parameter="upload_sound" /> + <menu_item_call.on_enable + function="File.EnableUpload" /> + <menu_item_call.on_visible + function="Upload.CalculateCosts" + parameter="Upload Sound,sound" /> + </menu_item_call> + <menu_item_call + label="Animation (L$[COST])..." + layout="topleft" + name="Upload Animation"> + <menu_item_call.on_click + function="Inventory.FileUploadLocation" + parameter="upload_animation" /> + <menu_item_call.on_enable + function="File.EnableUpload" /> + <menu_item_call.on_visible + function="Upload.CalculateCosts" + parameter="Upload Animation,animation" /> + </menu_item_call> + <menu_item_call + label="Model..." + layout="topleft" + name="Upload Model"> + <menu_item_call.on_click + function="Inventory.FileUploadLocation" + parameter="upload_model" /> + <menu_item_call.on_enable + function="File.EnableUploadModel" /> + <menu_item_call.on_visible + function="File.VisibleUploadModel"/> + </menu_item_call> + <menu_item_call + label="Material..." + layout="topleft" + name="Upload Material"> + <menu_item_call.on_click + function="Inventory.FileUploadLocation" + parameter="upload_pbr_material" /> + <menu_item_call.on_enable + function="File.EnableUploadMaterial" /> + </menu_item_call> + <menu_item_call + label="Bulk..." + layout="topleft" + name="Bulk Upload"> + <menu_item_call.on_click + function="Inventory.FileUploadLocation" + parameter="upload_bulk" /> + <menu_item_call.on_visible + function="Upload.CalculateCosts" + parameter="Bulk Upload,texture" /> + </menu_item_call> + </menu> <menu label="Use as default for" layout="topleft" name="upload_def"> - <menu_item_call + <menu_item_check label="Image uploads" layout="topleft" name="Image uploads"> - <menu_item_call.on_click + <on_click function="Inventory.FileUploadLocation" - parameter="texture" /> - </menu_item_call> - <menu_item_call + parameter="def_texture" /> + <on_check + function="Inventory.FileUploadLocation.Check" + parameter="def_texture" /> + </menu_item_check> + <menu_item_check label="Sound uploads" layout="topleft" name="Sound uploads"> - <menu_item_call.on_click - function="Inventory.FileUploadLocation" - parameter="sound" /> - </menu_item_call> - <menu_item_call + <on_click + function="Inventory.FileUploadLocation" + parameter="def_sound" /> + <on_check + function="Inventory.FileUploadLocation.Check" + parameter="def_sound" /> + </menu_item_check> + <menu_item_check label="Animation uploads" layout="topleft" name="Animation uploads"> - <menu_item_call.on_click - function="Inventory.FileUploadLocation" - parameter="animation" /> - </menu_item_call> - <menu_item_call + <on_click + function="Inventory.FileUploadLocation" + parameter="def_animation" /> + <on_check + function="Inventory.FileUploadLocation.Check" + parameter="def_animation" /> + </menu_item_check> + <menu_item_check label="Model uploads" layout="topleft" name="Model uploads"> - <menu_item_call.on_click - function="Inventory.FileUploadLocation" - parameter="model" /> - </menu_item_call> - <menu_item_call + <on_click + function="Inventory.FileUploadLocation" + parameter="def_model" /> + <on_check + function="Inventory.FileUploadLocation.Check" + parameter="def_model" /> + </menu_item_check> + <menu_item_check label="PBR material uploads" layout="topleft" name="PBR uploads"> - <menu_item_call.on_click - function="Inventory.FileUploadLocation" - parameter="pbr_material" /> - </menu_item_call> + <on_click + function="Inventory.FileUploadLocation" + parameter="def_pbr_material" /> + <on_check + function="Inventory.FileUploadLocation.Check" + parameter="def_pbr_material" /> + </menu_item_check> </menu> <menu_item_call label="Use as favorite folder" diff --git a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml index e249acaccd..d17fbf84b3 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml @@ -138,4 +138,15 @@ function="Inventory.GearDefault.Visible" parameter="multi_folder_view" /> </menu_item_call> + <menu_item_separator/> + <menu_item_check + label="Inventory settings..." + name="inv_settings"> + <menu_item_check.on_check + function="Floater.Visible" + parameter="inventory_settings" /> + <menu_item_check.on_click + function="Floater.Toggle" + parameter="inventory_settings" /> + </menu_item_check> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_inventory_view_default.xml b/indra/newview/skins/default/xui/en/menu_inventory_view_default.xml index 33cf01493d..97f53d3a17 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory_view_default.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory_view_default.xml @@ -100,15 +100,4 @@ function="Inventory.GearDefault.Visible" parameter="single_folder_view" /> </menu_item_check> - <menu_item_separator/> - <menu_item_check - label="Inventory settings..." - name="inv_settings"> - <menu_item_check.on_check - function="Floater.Visible" - parameter="inventory_settings" /> - <menu_item_check.on_click - function="Floater.Toggle" - parameter="inventory_settings" /> - </menu_item_check> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_media_ctrl.xml b/indra/newview/skins/default/xui/en/menu_media_ctrl.xml index f9864637a0..e687ae93e8 100644 --- a/indra/newview/skins/default/xui/en/menu_media_ctrl.xml +++ b/indra/newview/skins/default/xui/en/menu_media_ctrl.xml @@ -40,4 +40,12 @@ <menu_item_call.on_click function="Open.WebInspector" /> </menu_item_call> + <menu_item_call + label="Show Source" + layout="topleft" + name="show_page_source" + visible="false"> + <menu_item_call.on_click + function="Open.ShowSource" /> + </menu_item_call> </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_object_icon.xml b/indra/newview/skins/default/xui/en/menu_object_icon.xml index f3e520700b..d43ce26e56 100644 --- a/indra/newview/skins/default/xui/en/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/en/menu_object_icon.xml @@ -41,6 +41,17 @@ <menu_item_separator layout="topleft" /> <menu_item_call + label="Zoom in" + layout="topleft" + name="zoom_in"> + <menu_item_call.on_click + function="ObjectIcon.Action" + parameter="obj_zoom_in" /> + <menu_item_call.on_enable + function="ObjectIcon.Visible" + parameter="obj_zoom_in" /> + </menu_item_call> + <menu_item_call label="Show on Map" layout="topleft" name="show_on_map"> diff --git a/indra/newview/skins/default/xui/en/menu_outfit_gallery_sort.xml b/indra/newview/skins/default/xui/en/menu_outfit_gallery_sort.xml new file mode 100644 index 0000000000..aa4cd1483d --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_outfit_gallery_sort.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu + layout="topleft" + visible="false" + name="Sort Outfit"> + <menu_item_check + label="Sort favorites to top" + layout="topleft" + visible="true" + name="sort_favorites_to_top"> + <on_click + function="Sort.OnSort" + parameter="favorites_to_top" /> + <on_check + function="Sort.OnEnable" + parameter="favorites_to_top" /> + </menu_item_check> + <menu_item_check + label="Sort images to top" + layout="topleft" + visible="true" + name="sort_images_to_top"> + <on_click + function="Sort.OnSort" + parameter="images_to_top" /> + <on_check + function="Sort.OnEnable" + parameter="images_to_top" /> + </menu_item_check> + <menu_item_check + label="Sort by name" + layout="topleft" + visible="true" + name="sort_by_name"> + <on_click + function="Sort.OnSort" + parameter="by_name" /> + <on_check + function="Sort.OnEnable" + parameter="by_name" /> + </menu_item_check> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml index 8f36c7a00a..e333b05d3e 100644 --- a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml @@ -50,6 +50,26 @@ function="Gear.Thumbnail" /> </menu_item_call> <menu_item_call + label="Add to favorite outfits" + layout="topleft" + name="favorites_add"> + <on_visible + function="Gear.OnVisible" + parameter="favorites_add" /> + <on_click + function="Gear.Favorite" /> + </menu_item_call> + <menu_item_call + label="Remove from favorite outfits" + layout="topleft" + name="favorites_remove"> + <on_visible + function="Gear.OnVisible" + parameter="favorites_remove" /> + <on_click + function="Gear.Favorite" /> + </menu_item_call> + <menu_item_call label="Rename outfit" layout="topleft" name="rename"> @@ -89,34 +109,6 @@ function="Gear.OnVisible" parameter="delete" /> </menu_item_call> - <menu_item_separator> - <on_visible - function="Gear.OnVisible"/> - </menu_item_separator> - <menu_item_check - label="Sort folders always by name" - layout="topleft" - name="sort_folders_by_name"> - <on_click - function="Gear.SortByName" /> - <on_check - function="CheckControl" - parameter="OutfitGallerySortByName" /> - </menu_item_check> - <menu_item_call - label="Expand all folders" - layout="topleft" - name="expand"> - <on_click - function="Gear.Expand" /> - </menu_item_call> - <menu_item_call - label="Collapse all folders" - layout="topleft" - name="collapse"> - <on_click - function="Gear.Collapse" /> - </menu_item_call> <menu_item_separator/> <!-- copied (with minor modifications) from menu_inventory_add.xml --> <!-- *TODO: generate dynamically? --> @@ -277,4 +269,19 @@ </menu_item_call> </menu> <!-- copied from menu_inventory_add.xml --> + + <menu_item_separator/> + + <menu_item_check + label="Inventory settings..." + layout="topleft" + visible="true" + name="inventory_settings"> + <menu_item_check.on_check + function="Floater.Visible" + parameter="inventory_settings" /> + <menu_item_check.on_click + function="Floater.Toggle" + parameter="inventory_settings" /> + </menu_item_check> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_outfit_list_sort.xml b/indra/newview/skins/default/xui/en/menu_outfit_list_sort.xml new file mode 100644 index 0000000000..0a4d1ea877 --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_outfit_list_sort.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu + layout="topleft" + visible="false" + name="Sort Outfit"> + <menu_item_call + label="Expand all folders" + layout="topleft" + name="expand"> + <on_click + function="Sort.Expand" /> + </menu_item_call> + <menu_item_call + label="Collapse all folders" + layout="topleft" + visible="true" + name="collapse"> + <on_click + function="Sort.Collapse" /> + </menu_item_call> + + <menu_item_separator/> + + <menu_item_check + label="Sort favorites to top" + layout="topleft" + name="sort_favorites_to_top"> + <on_click + function="Sort.OnSort" + parameter="favorites_to_top" /> + <on_check + function="Sort.OnEnable" + parameter="favorites_to_top" /> + </menu_item_check> + + <menu_item_separator/> + + <menu_item_check + label="Show entire outfit in search" + layout="topleft" + name="show_entire_outfit_in_search"> + <on_click + function="Sort.OnSort" + parameter="show_entire_outfit" /> + <on_check + function="Sort.OnEnable" + parameter="show_entire_outfit" /> + </menu_item_check> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_outfit_tab.xml b/indra/newview/skins/default/xui/en/menu_outfit_tab.xml index c6805edd63..0d45e7c95c 100644 --- a/indra/newview/skins/default/xui/en/menu_outfit_tab.xml +++ b/indra/newview/skins/default/xui/en/menu_outfit_tab.xml @@ -50,6 +50,26 @@ function="Outfit.Thumbnail" /> </menu_item_call> <menu_item_call + label="Add to favorites" + layout="topleft" + name="favorites_add"> + <on_visible + function="Outfit.OnVisible" + parameter="favorites_add" /> + <on_click + function="Outfit.Favorite" /> + </menu_item_call> + <menu_item_call + label="Remove from favorites" + layout="topleft" + name="favorites_remove"> + <on_visible + function="Outfit.OnVisible" + parameter="favorites_remove" /> + <on_click + function="Outfit.Favorite" /> + </menu_item_call> + <menu_item_call label="Edit outfit" layout="topleft" name="edit"> diff --git a/indra/newview/skins/default/xui/en/menu_settings_gear.xml b/indra/newview/skins/default/xui/en/menu_settings_gear.xml index 57f4aa8655..96cbac4478 100644 --- a/indra/newview/skins/default/xui/en/menu_settings_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_settings_gear.xml @@ -24,6 +24,9 @@ <menu_item_call.on_click function="MyEnvironments.DoApply" parameter="local" /> + <menu_item_call.on_enable + function="MyEnvironments.CanApply" + parameter="local"/> </menu_item_call> <menu_item_call name="Settings Apply Parcel" diff --git a/indra/newview/skins/default/xui/en/menu_url_objectim.xml b/indra/newview/skins/default/xui/en/menu_url_objectim.xml index 1874c01f8d..fb6081e1fb 100644 --- a/indra/newview/skins/default/xui/en/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/en/menu_url_objectim.xml @@ -26,6 +26,13 @@ <menu_item_separator layout="topleft" /> <menu_item_call + label="Zoom in" + layout="topleft" + name="zoom_in"> + <menu_item_call.on_click + function="Url.ZoomInObject" /> + </menu_item_call> + <menu_item_call label="Show on Map" layout="topleft" name="show_on_map"> diff --git a/indra/newview/skins/default/xui/en/menu_url_parcel.xml b/indra/newview/skins/default/xui/en/menu_url_parcel.xml index e0f1fcf9c3..95752dab66 100644 --- a/indra/newview/skins/default/xui/en/menu_url_parcel.xml +++ b/indra/newview/skins/default/xui/en/menu_url_parcel.xml @@ -16,7 +16,7 @@ layout="topleft" name="show_on_map"> <menu_item_call.on_click - function="Url.ShowOnMap" /> + function="Url.ShowParcelOnMap" /> </menu_item_call> <menu_item_separator layout="topleft" /> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 607c7698c3..f444275878 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -132,7 +132,6 @@ </menu_item_call> <menu_item_separator/> - <menu_item_call label="Preferences..." name="Preferences" @@ -418,11 +417,11 @@ </menu_item_call> <menu_item_separator/> <menu_item_call - label="Complete avatars..." - name="Avatar Picker"> + label="Avatar Welcome Pack..." + name="Avatar Welcome Pack"> <menu_item_call.on_click function="Floater.ToggleOrBringToFront" - parameter="avatar" /> + parameter="avatar_welcome_pack" /> </menu_item_call> <menu_item_separator/> @@ -710,6 +709,13 @@ <menu_item_check.on_click function="Avatar.ToggleSearch"/> </menu_item_check> + <menu_item_call + label="Legacy Search..." + name="LegacySearch"> + <menu_item_call.on_click + function="Floater.Toggle" + parameter="legacy_search" /> + </menu_item_call> <menu_item_separator/> <menu_item_call label="Teleport home" @@ -740,8 +746,7 @@ <menu_item_call label="360 snapshot" - name="Capture 360" - shortcut="control|alt|shift|s"> + name="Capture 360"> <menu_item_call.on_click function="Floater.Show" parameter="360capture" /> @@ -1574,6 +1579,18 @@ function="World.EnvPreset" <menu_item_check.on_click function="View.HighlightTransparent" /> </menu_item_check> + <menu_item_check + label="Highlight Transparent Probes" + name="Highlight Transparent Probes" + shortcut="alt|shift|T"> + <menu_item_check.on_check + function="CheckControl" + parameter="RenderReflectionProbeShowTransparent" /> + <menu_item_check.on_click + function="View.HighlightTransparentProbe" /> + <menu_item_check.on_enable + function="View.CheckHighlightTransparent"/> + </menu_item_check> <menu_item_separator/> <menu_item_check @@ -1586,6 +1603,64 @@ function="World.EnvPreset" parameter="RenderDisablePostProcessing" /> </menu_item_check> + + <menu + create_jump_keys="true" + label="Selection level of detail" + name="Selection level of detail" + tear_off="true"> + + <menu_item_check + label="Default" + name="Default lod setting"> + <menu_item_check.on_check + function="Tools.ToolsCheckSelectionLODMode" + parameter="default" /> + <menu_item_check.on_click + function="Tools.SelectionLODMode" + parameter="default" /> + </menu_item_check> + <menu_item_check + label="High" + name="High lod setting"> + <menu_item_check.on_check + function="Tools.ToolsCheckSelectionLODMode" + parameter="high" /> + <menu_item_check.on_click + function="Tools.SelectionLODMode" + parameter="high" /> + </menu_item_check> + <menu_item_check + label="Medium" + name="Medium lod setting"> + <menu_item_check.on_check + function="Tools.ToolsCheckSelectionLODMode" + parameter="medium" /> + <menu_item_check.on_click + function="Tools.SelectionLODMode" + parameter="medium" /> + </menu_item_check> + <menu_item_check + label="Low" + name="Low lod setting"> + <menu_item_check.on_check + function="Tools.ToolsCheckSelectionLODMode" + parameter="low" /> + <menu_item_check.on_click + function="Tools.SelectionLODMode" + parameter="low" /> + </menu_item_check> + <menu_item_check + label="Lowest" + name="Lowest lod setting"> + <menu_item_check.on_check + function="Tools.ToolsCheckSelectionLODMode" + parameter="lowest" /> + <menu_item_check.on_click + function="Tools.SelectionLODMode" + parameter="lowest" /> + </menu_item_check> + </menu> <menu_item_separator/> <menu_item_check @@ -1836,6 +1911,71 @@ function="World.EnvPreset" </menu> <menu create_jump_keys="true" + label="RLVa" + name="RLVa Main" + tear_off="true" + visible="true"> + <menu + label="Debug" + name="Debug" + tear_off="true"> + <menu_item_check + label="Show Top-level RLVa Menu" + name="Show Top-level RLVa Menu"> + <menu_item_check.on_check + function="CheckControl" + parameter="RLVaTopLevelMenu" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="RLVaTopLevelMenu" /> + </menu_item_check> + <menu_item_separator/> + <menu_item_check + label="Show Debug Messages" + name="Show Debug Messages"> + <menu_item_check.on_check + function="CheckControl" + parameter="RestrainedLoveDebug" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="RestrainedLoveDebug" /> + </menu_item_check> + <menu_item_check + label="Hide Unset or Duplicate Messages" + name="Hide Unset or Duplicate Messages"> + <menu_item_check.on_check + function="CheckControl" + parameter="RLVaDebugHideUnsetDuplicate" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="RLVaDebugHideUnsetDuplicate" /> + </menu_item_check> + </menu> + <menu_item_separator/> + <menu_item_check + label="Allow Temporary Attachments" + name="Allow Temporary Attachments"> + <menu_item_check.on_check + function="CheckControl" + parameter="RLVaEnableTemporaryAttachments" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="RLVaEnableTemporaryAttachments" /> + </menu_item_check> + <menu_item_separator /> + <menu_item_check + label="Console..." + name="Console"> + <menu_item_check.on_check + function="Floater.Visible" + parameter="rlv_console" /> + <menu_item_check.on_click + function="Floater.Toggle" + parameter="rlv_console" /> + </menu_item_check> + </menu> + <menu + create_jump_keys="true" label="Advanced" name="Advanced" tear_off="true" @@ -2239,6 +2379,7 @@ function="World.EnvPreset" </menu_item_check> <menu_item_check label="PBR" + shortcut="control|alt|shift|]" name="Rendering Type PBR"> <menu_item_check.on_check function="Advanced.CheckRenderType" @@ -2342,6 +2483,11 @@ function="World.EnvPreset" parameter="flexible" /> </menu_item_check> </menu> + <menu + label="RLVa" + name="RLVa Embedded" + tear_off="true" + visible="true" /> <menu_item_check label="Use Plugin Read Thread" name="Use Plugin Read Thread"> @@ -2811,7 +2957,7 @@ function="World.EnvPreset" function="Advanced.ForceErrorOSException" /> <menu_item_call.on_visible function="Advanced.EnableErrorOSException" /> - </menu_item_call> + </menu_item_call> <menu_item_call label="Force a Crash in a Coroutine" name="Force a Crash in a Coroutine"> @@ -2819,12 +2965,30 @@ function="World.EnvPreset" function="Advanced.ForceErrorCoroutineCrash" /> </menu_item_call> <menu_item_call - label="Force a Crash in a Thread" - name="Force a Crash in a Thread"> + label="Force a Crash in a Coroprocedure" + name="Force a Crash in a Coroprocedure"> + <menu_item_call.on_click + function="Advanced.ForceErrorCoroprocedureCrash" /> + </menu_item_call> + <menu_item_call + label="Force a Crash in a Work Queue" + name="Force a Crash in a Work Queue"> + <menu_item_call.on_click + function="Advanced.ForceErrorWorkQueueCrash" /> + </menu_item_call> + <menu_item_call + label="Force an LLError Crash in a Thread" + name="Force an LLError Crash in a Thread"> <menu_item_call.on_click function="Advanced.ForceErrorThreadCrash" /> </menu_item_call> <menu_item_call + label="Force an Exception Crash in a Thread" + name="Force an Exception Crash in a Thread"> + <menu_item_call.on_click + function="Advanced.ForceExceptionThreadCrash" /> + </menu_item_call> + <menu_item_call label="Force Disconnect Viewer" name="Force Disconnect Viewer"> <menu_item_call.on_click @@ -3306,8 +3470,7 @@ function="World.EnvPreset" </menu_item_check> <menu_item_check label="Object-Object Occlusion" - name="Object-Object Occlusion" - shortcut="control|shift|O"> + name="Object-Object Occlusion"> <menu_item_check.on_check function="CheckControl" parameter="UseOcclusion" /> @@ -3434,6 +3597,16 @@ function="World.EnvPreset" parameter="RenderAttachedParticles" /> </menu_item_check> <menu_item_check + label="Render Avatar Cloth" + name="Render Avatar Cloth"> + <menu_item_check.on_check + function="CheckControl" + parameter="RenderAvatarCloth" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="RenderAvatarCloth" /> + </menu_item_check> + <menu_item_check label="Collect Font Vertex Buffers" name="Collect Font Vertex Buffers"> <menu_item_check.on_check @@ -3900,6 +4073,13 @@ function="World.EnvPreset" function="Floater.Show" parameter="font_test" /> </menu_item_call> + <menu_item_call + label="Show SLapps Test" + name="Show SLapps Test"> + <menu_item_call.on_click + function="Floater.Show" + parameter="slapp_test" /> + </menu_item_call> <menu_item_check label="Show XUI Names" name="Show XUI Names"> diff --git a/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml index ee77ef23f0..63d37edf38 100644 --- a/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml +++ b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml @@ -80,6 +80,20 @@ function="Attachment.Profile" /> </menu_item_call> <menu_item_call + label="Add to favorites" + layout="topleft" + name="favorites_add"> + <on_click + function="Attachment.Favorite" /> + </menu_item_call> + <menu_item_call + label="Remove from favorites" + layout="topleft" + name="favorites_remove"> + <on_click + function="Attachment.Favorite" /> + </menu_item_call> + <menu_item_call label="Show Original" layout="topleft" visible="false" diff --git a/indra/newview/skins/default/xui/en/menu_wearing_tab.xml b/indra/newview/skins/default/xui/en/menu_wearing_tab.xml index 321e8a0831..9a752a1643 100644 --- a/indra/newview/skins/default/xui/en/menu_wearing_tab.xml +++ b/indra/newview/skins/default/xui/en/menu_wearing_tab.xml @@ -31,6 +31,20 @@ function="Wearing.Detach" parameter="detach"/> </menu_item_call> + <menu_item_call + label="Add to favorites" + layout="topleft" + name="favorites_add"> + <on_click + function="Wearing.Favorite" /> + </menu_item_call> + <menu_item_call + label="Remove from favorites" + layout="topleft" + name="favorites_remove"> + <on_click + function="Wearing.Favorite" /> + </menu_item_call> <menu_item_separator layout="topleft" name="edit_outfit_separator" /> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index b035360206..fe2f1ec1e3 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -1322,6 +1322,14 @@ Error encoding snapshot. <notification icon="alertmodal.tga" + name="ErrorEncodingImage" + type="alertmodal"> + Failed to encode image, reason: [REASON] + <tag>fail</tag> + </notification> + + <notification + icon="alertmodal.tga" name="ErrorTextureCannotAfford" type="alertmodal"> You need L$[COST] to save a texture to your inventory. You may either buy L$ or save the photo to your computer instead. @@ -1662,7 +1670,7 @@ The new skin will appear after you restart [APP_NAME]. icon="alertmodal.tga" name="ChangeLanguage" type="alertmodal"> -Changing language will take effect after you restart [APP_NAME]. +Changing language or time format will take effect after you restart [APP_NAME]. </notification> <notification @@ -2231,6 +2239,25 @@ Couldn't open uploaded sound file for reading: <notification icon="alertmodal.tga" + name="ModelUploaderMissingPhysicsApple" + type="alertmodal"> +Model upload is not yet available on Apple Silicon, but will be supported in an upcoming release. + +Workaround: Right-click the Second Life app in Finder, select +'Get Info', then check 'Open using Rosetta' + <tag>fail</tag> + </notification> + + <notification + icon="alertmodal.tga" + name="ModelUploaderMissingPhysics" + type="alertmodal"> +Physics library is not present, some of the model uploader's functionality might not work or might not work correctly. + <tag>fail</tag> + </notification> + + <notification + icon="alertmodal.tga" name="SoundFileNotRIFF" type="alertmodal"> File does not appear to be a RIFF WAVE file: @@ -2408,6 +2435,16 @@ Unable to upload snapshot. File might be too big, try reducing resolution or try again later. <tag>fail</tag> </notification> + + <notification + icon="alertmodal.tga" + name="CannotOpenFileTooBig" + type="alertmodal"> +Unable to open file. + +Viewer run out of memory while opening file. File might be too big. + <tag>fail</tag> + </notification> <notification icon="notifytip.tga" @@ -2429,6 +2466,17 @@ You already have a landmark for this location. </notification> <notification + icon="alert.tga" + name="LandmarkLocationUnknown" + type="alert"> +Viewer wasn't able to get region's location. Region might be temporarily unavailable, was removed or landmark failed to load. + <usetemplate + name="okbutton" + yestext="OK"/> + <tag>fail</tag> + </notification> + + <notification icon="alertmodal.tga" name="CannotCreateLandmarkNotOwner" type="alertmodal"> @@ -3129,9 +3177,13 @@ Would you be my friend? <input name="listname" type="text"/> <button default="true" - index="0" + index="1" name="SetName" text="OK"/> + <button + index="0" + name="Cancel" + text="Cancel"/> </form> </notification> @@ -3160,6 +3212,29 @@ Would you be my friend? <notification icon="alertmodal.tga" + label="Rename Auto-Replace List" + name="RemoveAutoReplaceList" + type="alertmodal"> +'[LIST_NAME]' contains [MAP_SIZE] entries. + +Are you sure you want to delete this list? + <tag>confirm</tag> + <form name="form"> + <button + default="true" + index="1" + name="DeleteList" + text="Delete"/> + <button + default="false" + index="0" + name="Cancel" + text="Cancel"/> + </form> + </notification> + + <notification + icon="alertmodal.tga" name="InvalidAutoReplaceEntry" type="alertmodal"> The keyword must be a single word, and the replacement may not be empty. @@ -4618,13 +4693,12 @@ You already have blocked this name. <notification icon="alert.tga" - name="RemoveItemWarn" + name="CantModifyContentInNoModTask" type="alert"> -Though permitted, deleting contents may damage the object. Do you want to delete that item? +You don't have permission to modify content of this object <tag>confirm</tag> <usetemplate - name="okcancelbuttons" - notext="Cancel" + name="okbutton" yestext="OK"/> </notification> @@ -6532,6 +6606,22 @@ Do you want to replace it with the selected object? </notification> <notification + icon="alertmodal.tga" + name="CantLinkNotecard" + type="alertmodal"> + You must save the notecard before creating a link to it. + <tag>fail</tag> + </notification> + + <notification + icon="alertmodal.tga" + name="CantLinkMaterial" + type="alertmodal"> + You must save the material before creating a link to it. + <tag>fail</tag> + </notification> + + <notification icon="alert.tga" label="Do Not Disturb Mode Warning" name="DoNotDisturbModePay" @@ -7126,6 +7216,20 @@ You don't have permission to view this notecard. </notification> <notification + icon="alertmodal.tga" + name="MaterialImagesWereScaled" + type="alertmodal"> +One or more textures in this material were scaled to be within the allowed limits. +Textures must have power of two dimensions and must not exceed [MAX_SIZE]x[MAX_SIZE] pixels. + <unique/> + <tag>confirm</tag> + <usetemplate + ignoretext="Warn if textures will be scaled during upload." + name="okignore" + yestext="OK"/> + </notification> + + <notification icon="notifytip.tga" name="RezItemNoPermissions" type="notifytip"> @@ -9443,8 +9547,11 @@ Unable to upload texture: '[NAME]' icon="alertmodal.tga" name="CannotUploadMaterial" type="alertmodal"> -There was a problem uploading the file +Unable to upload material file. The file may be corrupted, in an unsupported format, or contain invalid data. Please check that you're using a valid GLTF/GLB file with proper material definitions. <tag>fail</tag> + <usetemplate + name="okbutton" + yestext="OK"/> </notification> <notification @@ -10326,6 +10433,14 @@ You are now the owner of object [OBJECT_NAME] <notification icon="alertmodal.tga" + name="NowOwnObjectInv" + type="notify"> + <tag>fail</tag> +You are now the owner of object [OBJECT_NAME] and it has been placed in your inventory. + </notification> + + <notification + icon="alertmodal.tga" name="CantRezOnLand" type="notify"> <tag>fail</tag> @@ -12078,6 +12193,17 @@ Cannot create large prims that intersect other residents. Please re-try when ot <notification icon="alertmodal.tga" + name="PreferenceQualityWithLowMemory" + type="alert"> +Your system has [TOTAL_MEM]MB of memory, which might not be enough to run viewer at higher settings and might result in issues. + <usetemplate + name="okcancelbuttons" + notext="Cancel" + yestext="Continue"/> + </notification> + + <notification + icon="alertmodal.tga" name="DefaultObjectPermissions" type="alert"> There was a problem saving the default object permissions: [REASON]. Please try setting the default permissions later. @@ -12592,4 +12718,36 @@ Select the "use as favorite folder" from a folder's menu to set it as the favori name="okbutton" yestext="OK"/> </notification> + + <notification + icon="alertmodal.tga" + name="WaterExclusionSurfacesWarning" + type="alertmodal"> + Checking the hide water box will overwrite the texture, bumpiness, and shininess choices. + <tag>confirm</tag> + <usetemplate + name="okcancelbuttons" + notext="Cancel" + yestext="Continue"/> + </notification> + + <notification + icon="notify.tga" + name="WaterExclusionNoMaterial" + persist="true" + type="notify"> + Unable to apply material to the water exclusion surface. + <tag>fail</tag> + </notification> + + <notification + icon="notify.tga" + name="ImageUploadResized" + type="alertmodal"> + The texture you are uploading has been resized from [ORIGINAL_WIDTH]x[ORIGINAL_HEIGHT] to [NEW_WIDTH]x[NEW_HEIGHT] in order to to fit the maximum size of [MAX_WIDTH]x[MAX_HEIGHT] pixels. + <usetemplate + ignoretext="Image Upload Resized" + name="okignore" + yestext="OK"/> + </notification> </notifications> diff --git a/indra/newview/skins/default/xui/en/panel_classified_info.xml b/indra/newview/skins/default/xui/en/panel_classified_info.xml index afd3f9410b..b05904cd28 100644 --- a/indra/newview/skins/default/xui/en/panel_classified_info.xml +++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml @@ -344,7 +344,6 @@ width="290" height="215"> <text - auto_resize="false" follows="left|top" font.style="BOLD" height="10" diff --git a/indra/newview/skins/default/xui/en/panel_dir_classified.xml b/indra/newview/skins/default/xui/en/panel_dir_classified.xml new file mode 100644 index 0000000000..f4d3ccf748 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_dir_classified.xml @@ -0,0 +1,215 @@ +<panel + border="true" + top="30" + follows="left|top|right|bottom" + height="533" + label="Classifieds" + left="1" + left_delta="68" + mouse_opaque="false" + name="panel_dir_classified" + width="778"> + <string name="searching_text"> + Searching... + </string> + <string name="not_found_text"> + None Found. + </string> + <text + bg_visible="false" + border_visible="false" + top="8" + layout="topleft" + follows="left|top" + font="SansSerif" + h_pad="0" + halign="left" + height="16" + left="5" + mouse_opaque="true" + name="find" + v_pad="0" + width="150"> + Enter search terms: + </text> + <combo_box + allow_text_entry="false" + top_delta="0" + left="525" + layout="topleft" + follows="right|top" + height="18" + max_chars="20" + mouse_opaque="true" + name="Category" + width="128"> + <combo_item name="AnyCategory" value="0" label="Any Category"/> + <combo_item name="Shopping" value="1" label="Shopping"/> + <combo_item name="LandRental" value="2" label="Land Rental"/> + <combo_item name="PropertyRental" value="3" label="Property Rental"/> + <combo_item name="SpecialAttraction" value="4" label="Special Attraction"/> + <combo_item name="NewProducts" value="5" label="New Products"/> + <combo_item name="Employment" value="6" label="Employment"/> + <combo_item name="Wanted" value="7" label="Wanted"/> + <combo_item name="Service" value="8" label="Service"/> + <combo_item name="Personal" value="9" label="Personal"/> + </combo_box> + <check_box + left_pad="5" + control_name="ShowPGClassifieds" + follows="right|top" + layout="topleft" + font="SansSerifSmall" + height="16" + initial_value="true" + label="" + mouse_opaque="true" + name="incpg" + width="15" /> + <icon + follows="right|top" + height="16" + top_delta="-1" + image_name="Parcel_PG_Dark" + tool_tip="General" + layout="topleft" + left_pad="2" + name="rating_icon_general" + width="16"/> + <check_box + left_pad="4" + top_delta="1" + layout="topleft" + control_name="ShowMatureClassifieds" + follows="right|top" + font="SansSerifSmall" + height="16" + initial_value="true" + label="" + mouse_opaque="true" + name="incmature" + width="15" /> + <icon + follows="right|top" + height="16" + top_delta="-1" + image_name="Parcel_M_Dark" + tool_tip="Moderate" + layout="topleft" + left_pad="2" + name="rating_icon_moderate" + width="16"/> + <check_box + left_pad="4" + top_delta="1" + layout="topleft" + control_name="ShowAdultClassifieds" + follows="right|top" + font="SansSerifSmall" + height="16" + initial_value="false" + label="" + mouse_opaque="true" + name="incadult" + width="15" /> + <icon + follows="right|top" + height="16" + top_delta="-1" + image_name="Parcel_R_Dark" + tool_tip="Adult" + layout="topleft" + left_pad="2" + name="rating_icon_adult" + width="16"/> + <line_editor + bevel_style="in" + border_style="line" + border_thickness="1" + top_pad="3" + follows="left|right|top" + layout="topleft" + font="SansSerif" + height="18" + left="5" + max_length="63" + mouse_opaque="true" + name="name" + width="650" /> + <button + follows="right|top" + layout="topleft" + font="SansSerif" + halign="center" + height="20" + label="Search" + top_delta="0" + left_pad="5" + mouse_opaque="true" + name="Search" + width="105" /> + <scroll_list + background_visible="true" + layout="topleft" + top_pad="3" + column_padding="0" + draw_border="true" + draw_heading="true" + follows="left|top|right|bottom" + height="450" + left="5" + mouse_opaque="true" + multi_select="false" + name="results" + search_column="2" + width="336"> + <column label="" name="icon" width="24" /> + <column label="" name="type" width="-1" /> + <column label="Name" name="name" width="225" /> + <column label="Price" name="price" width="55" /> + </scroll_list> + <text + bg_visible="false" + border_visible="false" + bottom_delta="-20" + follows="left|bottom" + font="SansSerifSmall" + h_pad="0" + halign="left" + height="16" + left="4" + mouse_opaque="true" + name="result_text" + v_pad="0" + width="80" /> + <button + image_overlay="Arrow_Left_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + hover_glow_amount="0.15" + tool_tip="Previous page" + follows="right|bottom" + height="22" + right="305" + bottom="-533" + name="prev_btn" + width="32" /> + <button + image_overlay="Arrow_Right_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Next page" + follows="right|bottom" + height="22" + layout="topleft" + left_pad="5" + name="next_btn" + top_delta="0" + width="32"/> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_dir_events.xml b/indra/newview/skins/default/xui/en/panel_dir_events.xml new file mode 100644 index 0000000000..b194ce5646 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_dir_events.xml @@ -0,0 +1,300 @@ +<panel + border="true" + top="30" + default_tab_group="1" + follows="left|top|right|bottom" + height="533" + label="Events" + left="1" + mouse_opaque="false" + name="panel_dir_events" + width="778"> + <string name="searching_text"> + Searching... + </string> + <string name="not_found_text"> + None Found. + </string> + <text + bg_visible="false" + border_visible="false" + top="8" + layout="topleft" + follows="left|top" + font="SansSerif" + h_pad="0" + halign="left" + height="16" + left="5" + mouse_opaque="true" + name="find" + width="150"> + Enter search terms: + </text> + <combo_box + allow_text_entry="false" + top_delta="0" + left="525" + layout="topleft" + follows="right|top" + height="18" + max_chars="20" + mouse_opaque="true" + name="category_combo" + width="128"> + <combo_item name="All" value="0" label="Any Category"/> + <combo_item name="Discussion" value="18" label="Discussion"/> + <combo_item name="Sports" value="19" label="Sports"/> + <combo_item name="LiveMusic" value="20" label="Live Music"/> + <combo_item name="LiveDJ" value="30" label="Live DJ"/> + <combo_item name="Commercial" value="22" label="Commercial"/> + <combo_item name="Nightlife/Entertainment" value="23" label="Nightlife/Entertainment"/> + <combo_item name="Games/Contests" value="24" label="Games/Contests"/> + <combo_item name="Pageants" value="25" label="Pageants"/> + <combo_item name="Education" value="26" label="Education"/> + <combo_item name="ArtsandCulture" value="27" label="Arts and Culture"/> + <combo_item name="Charity/SupportGroups" value="28" label="Charity/Support Groups"/> + <combo_item name="Miscellaneous" value="29" label="Miscellaneous"/> + </combo_box> + <check_box + left_pad="5" + control_name="ShowPGEvents" + follows="right|top" + layout="topleft" + font="SansSerifSmall" + height="16" + initial_value="true" + label="" + mouse_opaque="true" + name="incpg" + width="15" /> + <icon + follows="right|top" + height="16" + top_delta="-1" + image_name="Parcel_PG_Dark" + tool_tip="General" + layout="topleft" + left_pad="2" + name="rating_icon_general" + width="16"/> + <check_box + left_pad="4" + top_delta="1" + layout="topleft" + control_name="ShowMatureEvents" + follows="right|top" + font="SansSerifSmall" + height="16" + initial_value="true" + label="" + mouse_opaque="true" + name="incmature" + width="15" /> + <icon + follows="right|top" + height="16" + top_delta="-1" + image_name="Parcel_M_Dark" + tool_tip="Moderate" + layout="topleft" + left_pad="2" + name="rating_icon_moderate" + width="16"/> + <check_box + left_pad="4" + top_delta="1" + layout="topleft" + control_name="ShowAdultEvents" + follows="right|top" + font="SansSerifSmall" + height="16" + initial_value="false" + label="" + mouse_opaque="true" + name="incadult" + width="15" /> + <icon + follows="right|top" + height="16" + top_delta="-1" + image_name="Parcel_R_Dark" + tool_tip="Adult" + layout="topleft" + left_pad="2" + name="rating_icon_adult" + width="16"/> + <line_editor + bevel_style="in" + border_style="line" + border_thickness="1" + top_pad="3" + follows="left|right|top" + layout="topleft" + font="SansSerif" + height="18" + left="5" + max_length="63" + mouse_opaque="true" + name="event_search_text" + width="650" /> + <button + follows="right|top" + layout="topleft" + font="SansSerif" + halign="center" + height="20" + label="Search" + top_delta="0" + left_pad="5" + mouse_opaque="true" + name="Search" + width="105" /> + <scroll_list + background_visible="true" + layout="topleft" + top_pad="3" + column_padding="0" + draw_border="true" + draw_heading="true" + follows="left|top|right|bottom" + height="450" + left="5" + mouse_opaque="true" + multi_select="false" + name="results" + search_column="2" + width="336"> + <column label="" name="icon" width="24" /> + <column label="" name="type" width="-1" /> + <column dynamicwidth="true" label="Name" name="name" /> + <column label="Time (PT)" name="date" sort="time" width="106" /> + <column label="" name="event_id" width="-1" /> + <column label="Time" name="time" width="-1" /> + </scroll_list> + <text + bg_visible="false" + border_visible="false" + bottom_delta="-20" + drop_shadow_visible="true" + follows="left|bottom" + font="SansSerifSmall" + h_pad="0" + halign="left" + height="16" + left="4" + mouse_opaque="true" + name="result_text" + v_pad="0" + width="80" /> + <button + image_overlay="Arrow_Left_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + hover_glow_amount="0.15" + tool_tip="Previous page" + follows="right|bottom" + height="22" + right="305" + bottom="-533" + name="prev_btn" + width="32" /> + <button + image_overlay="Arrow_Right_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Next page" + follows="right|bottom" + height="22" + layout="topleft" + left_pad="5" + name="next_btn" + top_delta="0" + width="32"/> + <radio_group + top="5" + draw_border="false" + follows="top|left" + layout="topleft" + height="16" + left="160" + mouse_opaque="true" + name="date_mode" + initial_value="current" + width="200"> + <radio_item + layout="topleft" + left="3" + top="0" + follows="left|top" + height="20" + mouse_opaque="true" + name="current" + width="170" + label="In-Progress & Upcoming"/> + <radio_item + layout="topleft" + follows="left|top" + height="20" + top_delta="0" + left_delta="151" + mouse_opaque="true" + name="date" + width="56" + label="Date"/> + </radio_group> + <button + top="6" + left_pad="15" + layout="topleft" + follows="left|top" + font="SansSerif" + halign="center" + height="20" + label="<<" + label_selected="<<" + left_delta="54" + mouse_opaque="true" + name="back_btn" + tool_tip="Go back a day" + width="20" /> + <text + top="8" + bg_visible="false" + border_visible="false" + left_pad="1" + layout="topleft" + drop_shadow_visible="true" + follows="left|top" + font="SansSerif" + h_pad="0" + halign="center" + height="14" + mouse_opaque="true" + name="date_text" + v_pad="0" + width="48"> + 6/6 + </text> + <button + top="6" + left_pad="1" + layout="topleft" + follows="left|top" + font="SansSerif" + halign="center" + height="20" + label=">>" + label_selected=">>" + left_delta="50" + mouse_opaque="true" + name="forward_btn" + tool_tip="Go forward a day" + width="20" /> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_dir_groups.xml b/indra/newview/skins/default/xui/en/panel_dir_groups.xml new file mode 100644 index 0000000000..ed3f709005 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_dir_groups.xml @@ -0,0 +1,129 @@ +<panel + border="true" + top="30" + follows="left|top|right|bottom" + height="533" + label="Groups" + left="1" + mouse_opaque="false" + name="panel_dir_groups" + width="778"> + <button + image_overlay="Arrow_Left_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + hover_glow_amount="0.15" + tool_tip="Previous page" + follows="right|bottom" + height="22" + right="305" + bottom="-533" + name="prev_btn" + width="32" /> + <button + image_overlay="Arrow_Right_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Next page" + follows="right|bottom" + height="22" + layout="topleft" + left_pad="5" + name="next_btn" + top_delta="0" + width="32"/> + <text + bg_visible="false" + border_visible="false" + top="8" + layout="topleft" + follows="left|top" + font="SansSerif" + h_pad="0" + halign="left" + height="16" + left="5" + mouse_opaque="true" + name="find" + v_pad="0" + width="150"> + Enter search terms: + </text> + <check_box + top_delta="0" + control_name="ShowMatureGroups" + follows="right|top" + layout="topleft" + font="SansSerifSmall" + height="16" + initial_value="false" + label="Include Mature groups" + left="510" + mouse_opaque="true" + name="incmature" + width="100" /> + <line_editor + bevel_style="in" + border_style="line" + border_thickness="1" + top_pad="5" + follows="left|right|top" + font="SansSerif" + height="18" + left="5" + max_length="63" + mouse_opaque="true" + name="name" + width="650" /> + <button + follows="right|top" + layout="topleft" + font="SansSerif" + halign="center" + height="20" + label="Search" + top_delta="0" + left_pad="5" + mouse_opaque="true" + name="Search" + width="105" /> + <scroll_list + background_visible="true" + layout="topleft" + top_pad="3" + column_padding="0" + draw_border="true" + draw_heading="true" + follows="left|top|right|bottom" + height="450" + left="5" + mouse_opaque="true" + multi_select="false" + name="results" + search_column="2" + width="336"> + <column label="" name="icon" width="24" sort="score" sort_ascending="false" /> + <column label="" name="type" width="-1" /> + <column label="Name" name="name" dynamicwidth="true" /> + <column label="Members" name="members" width="100" halign="left" sort_ascending="false" /> + <column label="" name="score" width="-1"/> + </scroll_list> + <text + bg_visible="false" + border_visible="false" + bottom_delta="-20" + follows="left|bottom" + font="SansSerifSmall" + h_pad="0" halign="left" + height="16" left="4" + mouse_opaque="true" + name="result_text" + v_pad="0" + width="328" /> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_dir_land.xml b/indra/newview/skins/default/xui/en/panel_dir_land.xml new file mode 100644 index 0000000000..61629f3033 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_dir_land.xml @@ -0,0 +1,268 @@ +<panel border="true" top="30" follows="left|top|right|bottom" height="533" + label="Land Sales" left="1" mouse_opaque="false" name="panel_dir_land" + width="778"> + <string name="searching_text"> + Searching... + </string> + <string name="not_found_text"> + None Found. + </string> + <text + bg_visible="false" + border_visible="false" + top="8" + layout="topleft" + follows="left|top" + font="SansSerif" + h_pad="0" + halign="left" + height="16" + left="5" + mouse_opaque="true" + name="find" + width="150"> + Enter search terms: + </text> + <combo_box + allow_text_entry="false" + follows="top|right" + layout="topleft" + height="18" + top_delta="0" + left="525" + max_chars="20" + mouse_opaque="true" + name="type" + width="128"> + <combo_item name="AllTypes" value="All Types" label="All Types"/> + <combo_item name="Auction" value="Auction" label="Auction"/> + <combo_item name="MainlandSales" value="Mainland Sales" label="For Sale - Mainland"/> + <combo_item name="EstateSales" value="Estate Sales" label="For Sale - Estate"/> + </combo_box> + <check_box + left_pad="5" + control_name="ShowPGLand" + follows="right|top" + layout="topleft" + font="SansSerifSmall" + height="16" + initial_value="true" + label="" + mouse_opaque="true" + name="incpg" + width="15" /> + <icon + follows="right|top" + height="16" + top_delta="-1" + image_name="Parcel_PG_Dark" + tool_tip="General" + layout="topleft" + left_pad="2" + name="rating_icon_general" + width="16"/> + <check_box + left_pad="4" + top_delta="1" + layout="topleft" + control_name="ShowMatureLand" + follows="right|top" + font="SansSerifSmall" + height="16" + initial_value="true" + label="" + mouse_opaque="true" + name="incmature" + width="15" /> + <icon + follows="right|top" + height="16" + top_delta="-1" + image_name="Parcel_M_Dark" + tool_tip="Moderate" + layout="topleft" + left_pad="2" + name="rating_icon_moderate" + width="16"/> + <check_box + left_pad="4" + top_delta="1" + layout="topleft" + control_name="ShowAdultLand" + follows="right|top" + font="SansSerifSmall" + height="16" + initial_value="false" + label="" + mouse_opaque="true" + name="incadult" + width="15" /> + <icon + follows="right|top" + height="16" + top_delta="-1" + image_name="Parcel_R_Dark" + tool_tip="Adult" + layout="topleft" + left_pad="2" + name="rating_icon_adult" + width="16"/> + <check_box + top_pad="3" + layout="topleft" + control_name="FindLandPrice" + follows="left|top" + font="SansSerifSmall" + height="16" + initial_value="true" + label="Price ≤ " + left="5" + mouse_opaque="true" + name="pricecheck" + width="60" /> + <line_editor + bevel_style="in" + border_style="line" + border_thickness="1" + follows="left|top" + layout="topleft" + font="SansSerifSmall" + height="16" + left_pad="1" + max_length="10" + mouse_opaque="true" + name="priceedit" + width="50" /> + <text + bg_visible="false" + border_visible="false" + follows="left|top" + layout="topleft" + font="SansSerifSmall" + halign="left" + height="16" + left_pad="3" + mouse_opaque="true" + name="pricecheck_symbol" + width="15"> + L$ + </text> + <check_box + control_name="FindLandArea" + follows="left|top" + layout="topleft" + font="SansSerifSmall" + height="16" + initial_value="true" + label="Area ≥ " + left_pad="10" + mouse_opaque="true" + name="areacheck" + width="60" /> + <line_editor + bevel_style="in" + border_style="line" + border_thickness="1" + follows="left|top" + layout="topleft" + font="SansSerifSmall" + height="16" + left_pad="1" + max_length="10" + mouse_opaque="true" + name="areaedit" + width="50" /> + <text + bg_visible="false" + border_visible="false" + follows="left|top" + layout="topleft" + left_pad="3" + font="SansSerifSmall" + halign="left" + height="16" + mouse_opaque="true" + name="areacheck_symbol" + width="15"> + m² + </text> + <button + follows="right|top" + layout="topleft" + font="SansSerif" + halign="center" + height="20" + label="Search" + top_delta="0" + left="660" + mouse_opaque="true" + name="Search" + width="105" /> + <scroll_list + background_visible="true" + layout="topleft" + top_pad="3" + column_padding="0" + draw_border="true" + draw_heading="true" + follows="left|top|right|bottom" + height="450" + left="5" + mouse_opaque="true" + multi_select="false" + name="results" + search_column="2" + width="336"> + <column label="" name="icon" width="24" /> + <column dynamicwidth="true" label="Name" name="name" /> + <column label="Type" name="landtype" width="50" /> + <column label="L$ Price" name="price" width="65" /> + <column label="Area" name="area" width="50" /> + <column label="L$/m²" name="per_meter" width="65" /> + </scroll_list> + <text + bg_visible="false" + border_visible="false" + bottom_delta="-20" + drop_shadow_visible="true" + follows="left|bottom" + font="SansSerifSmall" + h_pad="0" + halign="left" + height="16" + left="4" + mouse_opaque="true" + name="result_text" + v_pad="0" + width="328" /> + <button + image_overlay="Arrow_Left_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + hover_glow_amount="0.15" + tool_tip="Previous page" + follows="right|bottom" + height="22" + right="305" + bottom="-533" + name="prev_btn" + width="32" /> + <button + image_overlay="Arrow_Right_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Next page" + follows="right|bottom" + height="22" + layout="topleft" + left_pad="5" + name="next_btn" + top_delta="0" + width="32"/> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_dir_people.xml b/indra/newview/skins/default/xui/en/panel_dir_people.xml new file mode 100644 index 0000000000..fe1a7e9d94 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_dir_people.xml @@ -0,0 +1,120 @@ +<panel + border="true" + top="30" + follows="left|top|right|bottom" + height="533" + label="People" + left="1" + mouse_opaque="false" + name="panel_dir_people" + width="778"> + <string name="searching_text"> + Searching... + </string> + <string name="not_found_text"> + None Found. + </string> + <text + bg_visible="false" + border_visible="false" + top="8" + layout="topleft" + follows="left|top" + font="SansSerif" + h_pad="0" + halign="left" + height="16" + left="5" + mouse_opaque="true" + name="find" + width="150"> + Enter search terms: + </text> + <line_editor + bevel_style="in" + border_style="line" + border_thickness="1" + top_pad="5" + follows="left|right|top" + font="SansSerif" + height="18" + left="5" + max_length="63" + mouse_opaque="true" + name="name" + width="650" /> + <button + follows="right|top" + layout="topleft" + font="SansSerif" + top_delta="0" + left_pad="5" + height="20" + label="Search" + mouse_opaque="true" + name="Search" + width="105" /> + <scroll_list + background_visible="true" + layout="topleft" + top_pad="3" + column_padding="0" + draw_border="true" + draw_heading="true" + follows="left|top|right|bottom" + height="450" + left="5" + mouse_opaque="true" + multi_select="false" + name="results" + search_column="2" + width="336"> + <column label="" name="icon" width="24" /> + <column label="" name="type" width="-1" /> + <column label="Name" name="name" width="274" /> + </scroll_list> + <text + bg_visible="false" + border_visible="false" + bottom_delta="-20" + follows="left|bottom" + font="SansSerifSmall" + h_pad="0" + halign="left" + height="16" + left="4" + mouse_opaque="true" + name="result_text" + v_pad="0" + width="328" /> + <button + image_overlay="Arrow_Left_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + hover_glow_amount="0.15" + tool_tip="Previous page" + follows="right|bottom" + height="22" + right="305" + bottom="-533" + name="prev_btn" + width="32" /> + <button + image_overlay="Arrow_Right_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Next page" + follows="right|bottom" + height="22" + layout="topleft" + left_pad="5" + name="next_btn" + top_delta="0" + width="32"/> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_dir_places.xml b/indra/newview/skins/default/xui/en/panel_dir_places.xml new file mode 100644 index 0000000000..d337f3addf --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_dir_places.xml @@ -0,0 +1,215 @@ +<panel + border="true" + top="30" + follows="left|top|right|bottom" + height="533" + label="Places" + left="1" + mouse_opaque="false" + name="panel_dir_places" + width="778"> + <string name="searching_text"> + Searching... + </string> + <string name="not_found_text"> + None Found. + </string> + <text + bg_visible="false" + border_visible="false" + top="8" + layout="topleft" + follows="left|top" + font="SansSerif" + h_pad="0" + halign="left" + height="16" + left="5" + mouse_opaque="true" + name="find" + width="150"> + Enter search terms: + </text> + <combo_box + allow_text_entry="false" + follows="right|top" + layout="topleft" + height="18" + top_delta="0" + left="525" + max_chars="20" + mouse_opaque="true" + name="Category" + width="128"> + <combo_item name="AnyCategory" value="any" label="Any Category"/> + <combo_item name="LindenLocation" value="linden" label="Linden Location"/> + <combo_item name="Arts&Culture" value="arts" label="Arts & Culture"/> + <combo_item name="Business" value="store" label="Business"/> + <combo_item name="Educational" value="educational" label="Educational"/> + <combo_item name="Gaming" value="game" label="Gaming"/> + <combo_item name="Hangout" value="gather" label="Hangout"/> + <combo_item name="NewcomerFriendly" value="newcomer" label="Newcomer Friendly"/> + <combo_item name="Parks&Nature" value="park" label="Parks & Nature"/> + <combo_item name="Residential" value="home" label="Residential"/> + <combo_item name="Shopping" value="shopping" label="Shopping"/> + <combo_item name="Adult" value="adult" label="Adult"/> + <combo_item name="Other" value="other" label="Other"/> + </combo_box> + <check_box + left_pad="5" + control_name="ShowPGSims" + follows="right|top" + layout="topleft" + font="SansSerifSmall" + height="16" + initial_value="true" + label="" + mouse_opaque="true" + name="incpg" + width="15" /> + <icon + follows="right|top" + height="16" + top_delta="-1" + image_name="Parcel_PG_Dark" + tool_tip="General" + layout="topleft" + left_pad="2" + name="rating_icon_general" + width="16"/> + <check_box + left_pad="4" + top_delta="1" + layout="topleft" + control_name="ShowMatureSims" + follows="right|top" + font="SansSerifSmall" + height="16" + initial_value="true" + label="" + mouse_opaque="true" + name="incmature" + width="15" /> + <icon + follows="right|top" + height="16" + top_delta="-1" + image_name="Parcel_M_Dark" + tool_tip="Moderate" + layout="topleft" + left_pad="2" + name="rating_icon_moderate" + width="16"/> + <check_box + left_pad="4" + top_delta="1" + layout="topleft" + control_name="ShowAdultSims" + follows="right|top" + font="SansSerifSmall" + height="16" + initial_value="false" + label="" + mouse_opaque="true" + name="incadult" + width="15" /> + <icon + follows="right|top" + height="16" + top_delta="-1" + image_name="Parcel_R_Dark" + tool_tip="Adult" + layout="topleft" + left_pad="2" + name="rating_icon_adult" + width="16"/> + <line_editor + bevel_style="in" + border_style="line" + border_thickness="1" + top_pad="3" + follows="left|right|top" + layout="topleft" + font="SansSerif" + height="18" + left="5" + max_length="63" + mouse_opaque="true" + name="name" + width="650" /> + <button + follows="right|top" + layout="topleft" + font="SansSerif" + halign="center" + height="20" + label="Search" + top_delta="0" + left_pad="5" + mouse_opaque="true" + name="Search" + width="105" /> + <scroll_list + background_visible="true" + layout="topleft" + top_pad="3" + column_padding="0" + draw_border="true" + draw_heading="true" + follows="left|top|right|bottom" + height="450" + left="5" + mouse_opaque="true" + multi_select="false" + name="results" + search_column="2" + width="336"> + <column label="" name="icon" width="24" /> + <column dynamicwidth="true" label="Name" name="name" /> + <column label="Traffic" name="dwell" width="75" /> + </scroll_list> + <text + bg_visible="false" + border_visible="false" + bottom_delta="-20" + follows="left|bottom" + font="SansSerifSmall" + h_pad="0" + halign="left" + height="16" + left="4" + mouse_opaque="true" + name="result_text" + v_pad="0" + width="328" /> + <button + image_overlay="Arrow_Left_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + hover_glow_amount="0.15" + tool_tip="Previous page" + follows="right|bottom" + height="22" + right="305" + bottom="-533" + name="prev_btn" + width="32" /> + <button + image_overlay="Arrow_Right_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Next page" + follows="right|bottom" + height="22" + layout="topleft" + left_pad="5" + name="next_btn" + top_delta="0" + width="32"/> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_dir_web.xml b/indra/newview/skins/default/xui/en/panel_dir_web.xml new file mode 100644 index 0000000000..0dde67681a --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_dir_web.xml @@ -0,0 +1,76 @@ +<panel + border="true" + top="30" + follows="all" + height="543" + label="Web" + left="1" + mouse_opaque="false" + name="panel_dir_web" + width="778"> + <web_browser + top="0" + left="0" + height="515" + width="778" + follows="all" + layout="topleft" + name="web_search" + trusted_content="true"/> + <button + image_overlay="Arrow_Left_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + hover_glow_amount="0.15" + tool_tip="Navigate back" + follows="left|bottom" + height="22" + layout="topleft" + left="5" + name="back_btn" + top_pad="7" + width="22" /> + <button + image_overlay="Arrow_Right_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Navigate forward" + follows="left|bottom" + height="22" + layout="topleft" + left_pad="5" + name="forward_btn" + top_delta="0" + width="22"/> + <button + name="home_btn" + follows="left|bottom" + image_overlay="Home_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + layout="topleft" + tool_tip="Search page" + left_pad="5" + height="22" + width="22"/> + <text + type="string" + length="200" + follows="bottom|left" + height="20" + layout="topleft" + left_pad="20" + top_delta="5" + name="statusbartext" + parse_urls="false" + text_color="0.4 0.4 0.4 1" + width="495"/> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_event_info.xml b/indra/newview/skins/default/xui/en/panel_event_info.xml new file mode 100644 index 0000000000..b31918b919 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_event_info.xml @@ -0,0 +1,212 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + border="false" + follows="all" + height="570" + left="0" + top="0" + name="panel_event_info" + title="Event" + width="330"> + <string name="none"> + none + </string> + <string name="notify"> + Notify + </string> + <string name="dont_notify"> + Don't Notify + </string> + <text + top="4" + follows="top|left" + layout="topleft" + font="SansSerifBig" + left="5" + width="417" + height="18" + use_ellipses="true" + name="event_name"> + (none) + </text> + <text + top_pad="10" + follows="top|left" + layout="topleft" + font="SansSerif" + left="20" + name="event_category_label"> + Type: + </text> + <text + top_delta="0" + follows="top|left" + layout="topleft" + font="SansSerif" + left="120" + name="event_category"> + (none) + </text> + <text + top_pad="10" + follows="top|left" + layout="topleft" + font="SansSerif" + left="20" + name="event_mature_label"> + Mature Content: + </text> + <text + top_delta="0" + follows="top|left" + layout="topleft" + font="SansSerif" + left="120" + name="event_mature_yes" + visible="false"> + Yes + </text> + <text + top_delta="0" + follows="top|left" + layout="topleft" + font="SansSerif" + left="120" + name="event_mature_no" + visible="false"> + No + </text> + <text + top_pad="10" + follows="top|left" + layout="topleft" + font="SansSerif" + left="20" + name="event_date_label"> + Date: + </text> + <text + top_delta="0" + follows="top|left" + layout="topleft" + font="SansSerif" + left="120" + name="event_date"> + (none) + </text> + <text + top_pad="10" + follows="top|left" + layout="topleft" + font="SansSerif" + left="20" + name="event_duration_label"> + Event Duration: + </text> + <text + top_delta="0" + follows="top|left" + layout="topleft" + font="SansSerif" + left="120" + name="event_duration"> + (none) + </text> + <text + top_pad="10" + follows="top|left" + layout="topleft" + font="SansSerif" + left="20" + name="event_runby_label"> + Run By: + </text> + <text + top_delta="0" + follows="top|left" + layout="topleft" + font="SansSerif" + left="116" + name="event_runby"> + (none) + </text> + <text + top_pad="10" + follows="top|left" + layout="topleft" + font="SansSerif" + left="20" + name="event_location_label"> + Location: + </text> + <text + top_delta="0" + follows="top|left" + layout="topleft" + font="SansSerif" + left="120" + name="event_location"> + (none) + </text> + <text + top_pad="10" + follows="top|left" + layout="topleft" + font="SansSerif" + left="20" + name="event_cover_label"> + Cover Charge: + </text> + <text + top_delta="0" + follows="top|left" + layout="topleft" + font="SansSerif" + left="120" + name="event_cover"> + (none) + </text> + <text + top_pad="20" + follows="top|left" + layout="topleft" + font="SansSerif" + left="20" + name="event_desc_label"> + Description: + </text> + <text_editor + top_pad="10" + follows="left|top" + layout="topleft" + height="220" + left="20" + enabled="false" + max_length="1024" + name="event_desc" + width="400" /> + <button + bottom_delta="-24" + follows="left|top" + height="20" + label="Teleport" + left="20" + name="teleport_btn" + width="130" /> + <button + bottom_delta="0" + follows="left|top" + height="20" + label="Show on Map" + left="155" + name="map_btn" + width="130" /> + <button + bottom_delta="0" + follows="left|top" + height="20" + label="Notify" + left="290" + name="notify_btn" + width="130" /> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_classifieds.xml b/indra/newview/skins/default/xui/en/panel_fs_search_legacy_classifieds.xml deleted file mode 100644 index 66c35558b1..0000000000 --- a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_classifieds.xml +++ /dev/null @@ -1,169 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - border="false" - follows="all" - height="566" - layout="topleft" - left="1" - width="780" - label="Classifieds" - name="panel_ls_classifieds"> - <panel - border="false" - follows="top|left|right" - height="53" - layout="topleft" - left="0" - width="780" - name="panel_ls_input"> - <text - type="string" - length="1" - follows="left|top" - top_pad="5" - layout="topleft" - left="6" - name="search_text" - top="12" - height="16" - width="156"> - Enter search terms: - </text> - <search_combo_box - layout="topleft" - follows="left|top|right" - height="23" - left_delta="0" - name="classifieds_edit" - top="29" - width="651" /> - <combo_box - follows="right|top" - layout="topleft" - height="23" - allow_text_entry="false" - top_delta="0" - left_pad="2" - name="classifieds_category" - width="122"> - <combo_box.commit_callback - function="CommitSearch" /> - </combo_box> - <check_box - control_name="ShowPGClassifieds" - follows="right|top" - height="16" - label="" - layout="topleft" - left="660" - name="pg_all" - top="12" - width="15"> - <check_box.commit_callback - function="CommitSearch" /> - </check_box> - <icon - follows="right|top" - height="16" - image_name="Parcel_PG_Dark" - layout="topleft" - left_pad="2" - name="rating_icon_general" - top_delta="-1" - width="18"/> - <check_box - control_name="ShowMatureClassifieds" - follows="right|top" - height="16" - label="" - layout="topleft" - left_pad="2" - name="mature_all" - top_delta="1" - width="15"> - <check_box.commit_callback - function="CommitSearch" /> - </check_box> - <icon - follows="right|top" - height="16" - image_name="Parcel_M_Dark" - layout="topleft" - left_pad="2" - name="rating_icon_moderate" - top_delta="-1" - width="18"/> - <check_box - control_name="ShowAdultClassifieds" - follows="right|top" - height="16" - label="" - layout="topleft" - left_pad="2" - name="adult_all" - top_delta="1" - width="15"> - <check_box.commit_callback - function="CommitSearch" /> - </check_box> - <icon - follows="right|top" - height="16" - image_name="Parcel_R_Dark" - layout="topleft" - left_pad="2" - name="rating_icon_adult" - top_delta="-1" - width="18"/> - </panel> - <!-- Search Pane --> - <panel - border="true" - follows="all" - height="510" - layout="topleft" - left="1" - width="410" - top_pad="1" - name="panel_ls_scrolllist"> - <scroll_list - draw_heading="true" - follows="all" - height="485" - layout="topleft" - left="0" - name="search_results_classifieds" - top="0" - width="410"> - <columns - label="" - name="icon" - width="20" /> - <columns - label="Name" - name="classified_name" - relwidth="0.70" /> - <columns - label="Listing Price" - name="price" - relwidth="0.3"/> - </scroll_list> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Back" - name="classifieds_back" - top_pad="2" - left="3" - width="100" /> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Next" - name="classifieds_next" - width="100" - left_pad="1" /> - </panel> -</panel> diff --git a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_events.xml b/indra/newview/skins/default/xui/en/panel_fs_search_legacy_events.xml deleted file mode 100644 index 57cb4990e4..0000000000 --- a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_events.xml +++ /dev/null @@ -1,258 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - border="false" - follows="all" - height="566" - layout="topleft" - left="1" - width="780" - label="Events" - name="panel_ls_events"> - <panel - border="false" - follows="top|left|right" - height="53" - layout="topleft" - left="0" - width="780" - name="panel_ls_input"> - <text - type="string" - length="1" - follows="left|top" - top_pad="5" - layout="topleft" - left="6" - name="search_text" - top="12" - height="16" - width="156"> - Enter search terms: - </text> - <radio_group - left_pad="20" - height="16" - width="300" - layout="topleft" - name="events_search_mode"> - <radio_item - height="16" - label="Ongoing and Upcoming" - layout="topleft" - name="current" - value="current" - top_pad="0" - width="120" /> - <radio_item - height="16" - label="By Date" - layout="topleft" - name="date" - value="date" - left_pad="70" - width="120" /> - <radio_group.commit_callback - function="CommitSearch" /> - </radio_group> - <text - type="string" - length="1" - follows="left|top" - top_delta="0" - layout="topleft" - left_pad="5" - name="events_date" - font.style="BOLD" - height="16" - width="80"> - 4/20 - </text> - <search_combo_box - layout="topleft" - follows="left|top|right" - height="23" - left="6" - name="events_edit" - top="29" - width="651" /> - <combo_box - follows="right|top" - layout="topleft" - height="23" - top_delta="0" - left_pad="2" - name="events_category" - width="122"> - <combo_box.item label="Any Category" name="any" value="0" /> - <combo_box.item label="" value="filter_separator" enabled="false" /> - <combo_box.item label="Discussion" name="discussion" value="18" /> - <combo_box.item label="Sports" name="sports" value="19" /> - <combo_box.item label="Live DJ" name="dj" value="30" /> - <combo_box.item label="Live Music" name="music" value="20" /> - <!-- <combo_box.item label="???" name="mystery_category" value="21" /> --> - <combo_box.item label="Commercial" name="commercial" value="22" /> - <combo_box.item label="Nightlife/Entertainment" name="nightlife" value="23" /> - <combo_box.item label="Games/Contests" name="games" value="24" /> - <combo_box.item label="Pageants" name="pageants" value="25" /> - <combo_box.item label="Education" name="education" value="26" /> - <combo_box.item label="Arts and Culture" name="arts" value="27" /> - <combo_box.item label="Charity/Support Groups" name="charity" value="28" /> - <combo_box.item label="Miscellaneous" name="misc" value="29" /> - <combo_box.commit_callback - function="CommitSearch" /> - </combo_box> - <check_box - control_name="ShowPGEvents" - follows="right|top" - height="16" - label="" - layout="topleft" - left="660" - name="pg_all" - top="12" - width="15" > - <check_box.commit_callback - function="CommitSearch" /> - </check_box> - <icon - follows="right|top" - height="16" - image_name="Parcel_PG_Dark" - layout="topleft" - left_pad="2" - name="rating_icon_general" - top_delta="-1" - width="18"/> - <check_box - control_name="ShowMatureEvents" - follows="right|top" - height="16" - label="" - layout="topleft" - left_pad="2" - name="mature_all" - top_delta="1" - width="15"> - <check_box.commit_callback - function="CommitSearch" /> - </check_box> - <icon - follows="right|top" - height="16" - image_name="Parcel_M_Dark" - layout="topleft" - left_pad="2" - name="rating_icon_moderate" - top_delta="-1" - width="18"/> - <check_box - control_name="ShowAdultEvents" - follows="right|top" - height="16" - label="" - layout="topleft" - left_pad="2" - name="adult_all" - top_delta="1" - width="15"> - <check_box.commit_callback - function="CommitSearch" /> - </check_box> - <icon - follows="right|top" - height="16" - image_name="Parcel_R_Dark" - layout="topleft" - left_pad="2" - name="rating_icon_adult" - top_delta="-1" - width="18"/> - </panel> - <!-- Search Pane --> - <panel - border="true" - follows="all" - height="510" - layout="topleft" - left="1" - width="410" - top_pad="1" - name="panel_ls_scrolllist"> - <scroll_list - draw_heading="true" - follows="all" - height="485" - layout="topleft" - left="0" - name="search_results_events" - sort_ascending="true" - sort_column="3" - top="0" - width="410"> - <columns - label="" - name="icon" - width="20" /> - <columns - label="Event Name" - name="name" - relwidth="0.72" /> - <columns - label="Date/Time" - name="date" - sort_column="time" - relwidth="0.28" /> - <columns - label="Time" - name="time" - width="0"/> - </scroll_list> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Yesterday" - name="events_yesterday" - top_pad="2" - left="3" - width="100" /> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Today" - name="events_today" - width="100" - left_pad="1" /> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Tomorrow" - name="events_tomorrow" - width="100" - left_pad="1" /> - <button - layout="topleft" - follows="left|bottom" - height="23" - image_bottom_pad="2" - image_overlay="Arrow_Left_Off" - image_overlay_alignment="left" - label="Back" - name="events_back" - width="25" - left_pad="1" /> - <button - layout="topleft" - follows="left|bottom" - height="23" - image_bottom_pad="2" - image_overlay="Arrow_Right_Off" - image_overlay_alignment="left" - label="Next" - name="events_next" - width="25" - left_pad="1" /> - </panel> -</panel> diff --git a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_groups.xml b/indra/newview/skins/default/xui/en/panel_fs_search_legacy_groups.xml deleted file mode 100644 index 90001952f7..0000000000 --- a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_groups.xml +++ /dev/null @@ -1,159 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - border="false" - follows="all" - height="566" - layout="topleft" - left="1" - width="780" - label="Groups" - name="panel_ls_groups"> - <panel - border="false" - follows="top|left|right" - height="53" - layout="topleft" - left="0" - width="780" - name="panel_ls_input"> - <text - type="string" - length="1" - follows="left|top" - top_pad="5" - layout="topleft" - left="6" - name="search_text" - top="12" - height="16" - width="156"> - Enter search terms: - </text> - <search_combo_box - layout="topleft" - follows="left|top|right" - height="23" - left_delta="0" - name="groups_edit" - top="29" - width="770"> - </search_combo_box> - <check_box - control_name="ShowPGGroups" - follows="right|top" - height="16" - label="" - layout="topleft" - left="660" - name="pg_all" - top="12" - width="15" - visible="false"/> - <icon - follows="right|top" - height="16" - image_name="Parcel_PG_Dark" - layout="topleft" - left_pad="2" - name="rating_icon_general" - top_delta="-1" - width="18" - visible="false"/> - <check_box - control_name="ShowMatureGroups" - follows="right|top" - height="16" - label="" - layout="topleft" - left_pad="2" - name="mature_all" - top_delta="1" - width="15" - visible="false"/> - <icon - follows="right|top" - height="16" - image_name="Parcel_M_Dark" - layout="topleft" - left_pad="2" - name="rating_icon_moderate" - top_delta="-1" - width="18" - visible="false"/> - <check_box - control_name="ShowAdultGroups" - follows="right|top" - height="16" - label="" - layout="topleft" - left_pad="2" - name="adult_all" - top_delta="1" - width="15" - visible="false"/> - <icon - follows="right|top" - height="16" - image_name="Parcel_R_Dark" - layout="topleft" - left_pad="2" - name="rating_icon_adult" - top_delta="-1" - width="18" - visible="false"/> - </panel> - <!-- Search Pane --> - <panel - border="true" - follows="all" - height="510" - layout="topleft" - left="1" - width="410" - top_pad="1" - name="panel_ls_scrolllist"> - <scroll_list - draw_heading="true" - follows="all" - height="485" - layout="topleft" - left="0" - name="search_results_groups" - top="0" - width="410"> - <columns - label="" - name="icon" - width="20" /> - <columns - label="Group Name" - name="group_name" - relwidth="0.72" /> - <columns - label="Members" - name="members" - relwidth="0.25" /> - <columns - label="Score" - name="score" - width="0" /> - </scroll_list> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Back" - name="groups_back" - top_pad="2" - left="3" - width="100" /> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Next" - name="groups_next" - width="100" - left_pad="1" /> - </panel> -</panel> diff --git a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_land.xml b/indra/newview/skins/default/xui/en/panel_fs_search_legacy_land.xml deleted file mode 100644 index bb03a1e999..0000000000 --- a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_land.xml +++ /dev/null @@ -1,281 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - border="false" - follows="all" - height="566" - layout="topleft" - left="1" - width="780" - label="Land Sales" - name="panel_ls_land"> - <panel - border="false" - follows="top|left|right" - height="53" - layout="topleft" - left="0" - width="780" - name="panel_ls_input"> - <check_box - control_name="ShowPGLand" - follows="right|top" - height="16" - label="" - layout="topleft" - left="660" - name="pg_all" - top="12" - width="15"> - <check_box.commit_callback - function="CommitSearch" /> - </check_box> - <icon - follows="right|top" - height="16" - image_name="Parcel_PG_Dark" - layout="topleft" - left_pad="2" - name="rating_icon_general" - top_delta="-1" - width="18"/> - <check_box - control_name="ShowMatureLand" - follows="right|top" - height="16" - label="" - layout="topleft" - left_pad="2" - name="mature_all" - top_delta="1" - width="15"> - <check_box.commit_callback - function="CommitSearch" /> - </check_box> - <icon - follows="right|top" - height="16" - image_name="Parcel_M_Dark" - layout="topleft" - left_pad="2" - name="rating_icon_moderate" - top_delta="-1" - width="18"/> - <check_box - control_name="ShowAdultLand" - follows="right|top" - height="16" - label="" - layout="topleft" - left_pad="2" - name="adult_all" - top_delta="1" - width="15"> - <check_box.commit_callback - function="CommitSearch" /> - </check_box> - <icon - follows="right|top" - height="16" - image_name="Parcel_R_Dark" - layout="topleft" - left_pad="2" - name="rating_icon_adult" - top_delta="-1" - width="18"/> - <text - type="string" - length="1" - follows="left|top" - layout="topleft" - left="6" - name="search_text" - top="12" - height="16" - width="256"> - Enter search terms: - </text> - <combo_box - control_name="FindLandType" - follows="left|top" - layout="topleft" - height="23" - allow_text_entry="false" - top_pad="2" - left="6" - name="land_category" - width="122"> - <combo_box.item label="All Categories" name="All" value="All"/> - <combo_box.item label="Auction" name="Auction" value="Auction"/> - <combo_box.item label="Mainland Sales" name="Mainland" value="Mainland"/> - <combo_box.item label="Estate Sales" name="Estate" value="Estate"/> - <combo_box.commit_callback - function="CommitSearch" /> - </combo_box> - <check_box - control_name="FindLandPrice" - follows="left|top" - height="16" - label="Price <" - layout="topleft" - left_pad="3" - name="price_check" - top_delta="3" - width="40" > - <check_box.commit_callback - function="CommitSearch" /> - </check_box> - <line_editor - enabled_control="FindLandPrice" - bevel_style="none" - border_style="line" - border.border_thickness="0" - commit_on_focus_lost="false" - follows="left|top" - height="18" - left_pad="20" - name="edit_price" - top_delta="-1" - width="40" > - <line_editor.commit_callback - function="CommitSearch" /> - </line_editor> - <check_box - control_name="FindLandArea" - follows="left|top" - height="16" - label="Area >" - layout="topleft" - left_pad="3" - name="area_check" - top_delta="1" - width="40" > - <check_box.commit_callback - function="CommitSearch" /> - </check_box> - <line_editor - enabled_control="FindLandArea" - bevel_style="none" - border_style="line" - border.border_thickness="0" - commit_on_focus_lost="false" - follows="left|top" - height="18" - left_pad="20" - name="edit_area" - top_delta="-1" - width="40" > - <line_editor.commit_callback - function="CommitSearch" /> - </line_editor> - <text - type="string" - length="1" - follows="left|top" - layout="topleft" - left="365" - name="sort_text" - top="12" - height="16" - width="98"> - Sort results by: - </text> - <check_box - follows="left|top" - height="16" - label="Ascending" - layout="topleft" - left_pad="3" - name="ascending_check" - width="100" > - <check_box.commit_callback - function="CommitSearch" /> - </check_box> - <combo_box - follows="left|top" - layout="topleft" - height="23" - allow_text_entry="false" - left_delta="-102" - top_pad="1" - name="land_sort_combo" - width="118"> - <combo_box.item label="Name" name="Name_item" value="Name"/> - <combo_box.item label="Price" name="Price_item" value="Price"/> - <combo_box.item label="Price per meter" name="PPM_item" value="PPM"/> - <combo_box.item label="Area" name="Area_item" value="Area"/> - <combo_box.commit_callback - function="CommitSearch" /> - </combo_box> - <button - follows="top|right" - height="23" - label="Search" - layout="topleft" - left="678" - top_delta="0" - name="land_find" - width="100" /> - </panel> - <!-- Search Pane --> - <panel - border="true" - follows="all" - height="510" - layout="topleft" - left="1" - width="410" - top_pad="1" - name="panel_ls_scrolllist"> - <scroll_list - draw_heading="true" - follows="all" - height="485" - layout="topleft" - left="0" - name="search_results_land" - top="0" - width="410"> - <columns - label="" - name="icon" - width="20" /> - <columns - label="Name" - name="land_name" - relwidth="0.45" /> - <columns - label="Price" - name="price" - relwidth="0.1" /> - <columns - label="Area" - name="area" - relwidth="0.1" /> - <columns - label="L$/m" - name="ppm" - relwidth="0.1" /> - <columns - label="Type" - name="land_type" - relwidth="0.2" /> - </scroll_list> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Back" - name="land_back" - top_pad="2" - left="3" - width="100" /> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Next" - name="land_next" - width="100" - left_pad="1" /> - </panel> -</panel> diff --git a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_people.xml b/indra/newview/skins/default/xui/en/panel_fs_search_legacy_people.xml deleted file mode 100644 index 28df02a7e3..0000000000 --- a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_people.xml +++ /dev/null @@ -1,89 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - border="false" - follows="all" - height="566" - layout="topleft" - left="1" - width="780" - label="People" - name="panel_ls_people"> - <panel - border="false" - follows="top|left|right" - height="53" - layout="topleft" - left="0" - width="780" - name="panel_ls_input"> - <text - type="string" - length="1" - follows="left|top" - top_pad="5" - layout="topleft" - left="6" - name="search_text" - top="12" - height="16" - width="156"> - Enter search terms: - </text> - <search_combo_box - layout="topleft" - follows="left|top|right" - height="23" - left_delta="0" - name="people_edit" - top="29" - width="770"> - </search_combo_box> - </panel> - <!-- Search Pane --> - <panel - border="true" - follows="all" - height="510" - layout="topleft" - left="1" - width="410" - top_pad="1" - name="panel_ls_scrolllist"> - <scroll_list - content_type="Agents" - draw_heading="true" - follows="all" - height="485" - layout="topleft" - left="0" - name="search_results_people" - top="0" - width="410"> - <columns - label="" - name="icon" - width="20" /> - <columns - label="Name" - name="username" - relwidth="1" /> - </scroll_list> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Back" - name="people_back" - top_pad="2" - left="3" - width="100" /> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Next" - name="people_next" - width="100" - left_pad="1" /> - </panel> -</panel>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_places.xml b/indra/newview/skins/default/xui/en/panel_fs_search_legacy_places.xml deleted file mode 100644 index 09c142b8fc..0000000000 --- a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_places.xml +++ /dev/null @@ -1,169 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - border="false" - follows="all" - height="566" - layout="topleft" - left="1" - width="780" - label="Places" - name="panel_ls_places"> - <panel - border="false" - follows="top|left|right" - height="53" - layout="topleft" - left="0" - width="780" - name="panel_ls_input"> - <text - type="string" - length="1" - follows="left|top" - top_pad="5" - layout="topleft" - left="6" - name="search_text" - top="12" - height="16" - width="156"> - Enter search terms: - </text> - <search_combo_box - layout="topleft" - follows="left|top|right" - height="23" - left_delta="0" - name="places_edit" - top="29" - width="651" /> - <combo_box - follows="right|top" - layout="topleft" - height="23" - allow_text_entry="false" - top_delta="0" - left_pad="2" - name="places_category" - width="122"> - <combo_box.commit_callback - function="CommitSearch" /> - </combo_box> - <check_box - control_name="ShowPGSims" - follows="right|top" - height="16" - label="" - layout="topleft" - left="660" - name="pg_all" - top="12" - width="15"> - <check_box.commit_callback - function="CommitSearch" /> - </check_box> - <icon - follows="right|top" - height="16" - image_name="Parcel_PG_Dark" - layout="topleft" - left_pad="2" - name="rating_icon_general" - top_delta="-1" - width="18"/> - <check_box - control_name="ShowMatureSims" - follows="right|top" - height="16" - label="" - layout="topleft" - left_pad="2" - name="mature_all" - top_delta="1" - width="15"> - <check_box.commit_callback - function="CommitSearch" /> - </check_box> - <icon - follows="right|top" - height="16" - image_name="Parcel_M_Dark" - layout="topleft" - left_pad="2" - name="rating_icon_moderate" - top_delta="-1" - width="18"/> - <check_box - control_name="ShowAdultSims" - follows="right|top" - height="16" - label="" - layout="topleft" - left_pad="2" - name="adult_all" - top_delta="1" - width="15"> - <check_box.commit_callback - function="CommitSearch" /> - </check_box> - <icon - follows="right|top" - height="16" - image_name="Parcel_R_Dark" - layout="topleft" - left_pad="2" - name="rating_icon_adult" - top_delta="-1" - width="18"/> - </panel> - <!-- Search Pane --> - <panel - border="true" - follows="all" - height="510" - layout="topleft" - left="1" - width="410" - top_pad="1" - name="panel_ls_scrolllist"> - <scroll_list - draw_heading="true" - follows="all" - height="485" - layout="topleft" - left="0" - name="search_results_places" - top="0" - width="410"> - <columns - label="" - name="icon" - width="20" /> - <columns - label="Name" - name="place_name" - relwidth="0.81" /> - <columns - label="Traffic" - name="dwell" - relwidth="0.16" /> - </scroll_list> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Back" - name="places_back" - top_pad="2" - left="3" - width="100" /> - <button - layout="topleft" - follows="left|bottom" - height="23" - label="Next" - name="places_next" - width="100" - left_pad="1" /> - </panel> -</panel> diff --git a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_web.xml b/indra/newview/skins/default/xui/en/panel_fs_search_legacy_web.xml deleted file mode 100644 index 382a5e8945..0000000000 --- a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_web.xml +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel -border="false" -follows="all" -height="566" -layout="topleft" -left="1" -width="780" -label="Websearch" -name="panel_ls_web"> - <web_browser - top="5" - bottom="-1" - left="5" - right="-5" - layout="topleft" - follows="all" - name="search_browser" - trusted_content="true" - start_url="about:blank" /> -</panel>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml index da900c783b..7b404ef5ca 100644 --- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml @@ -203,7 +203,7 @@ background_visible="false" name="button_row_ls" left="6" orientation="horizontal" - top_pad="5" + top_pad="2" width="297"> <layout_panel diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml index ad9ce8f37e..ed6f98fb2b 100644 --- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml @@ -67,23 +67,23 @@ <scroll_list.columns label="Parcel" name="name" - relative_width="0.2" /> + relative_width="0.25" /> <scroll_list.columns label="Region" name="location" - relative_width="0.2" /> + relative_width="0.25" /> <scroll_list.columns label="Type" name="type" - relative_width="0.2" /> + relative_width="0.25" /> <scroll_list.columns label="Area" name="area" - relative_width="0.2" /> + relative_width="0.25" /> <scroll_list.columns label="Hidden" name="hidden" - relative_width="0.2" /> + width="-1" /> </scroll_list> <text type="string" diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index 02e135a2c7..868d54401e 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel - height="750" + height="770" label="Members & Roles" layout="topleft" left="0" @@ -18,9 +18,9 @@ <panel.string name="help_text" /> <tab_container - border="false" + border="false" follows="left|top|right" - height="552" + height="770" halign="center" layout="topleft" left="0" @@ -29,16 +29,10 @@ tab_position="top" tab_height="22" tab_min_width="90" - top="0" - width="304"> + top="0"> <panel border="false" - follows="all" - height="303" label="MEMBERS" - layout="topleft" - left="0" - right="-1" help_topic="roles_members_tab" name="members_sub_tab" tool_tip="Members" @@ -65,16 +59,16 @@ clicking on their names. name="power_partial_icon" translate="false"> Checkbox_Off </panel.string> - <filter_editor - layout="topleft" - top="5" - left="5" - right="-5" - height="22" - search_button_visible="false" - follows="left|top|right" - label="Filter Members" - name="filter_input" /> + <filter_editor + layout="topleft" + top="5" + left="5" + right="-5" + height="22" + search_button_visible="false" + follows="left|top|right" + label="Filter Members" + name="filter_input" /> <name_list column_padding="2" draw_heading="true" @@ -90,11 +84,11 @@ clicking on their names. <name_list.columns label="Member" name="name" - relative_width="0.44" /> + relative_width="0.44" /> <name_list.columns label="Donation" name="donated" - relative_width="0.2" /> + relative_width="0.2" /> <name_list.columns label="Status" name="online" @@ -118,25 +112,21 @@ clicking on their names. left_pad="10" name="member_eject" width="100" /> - <button - height="23" - label="Ban Member(s)" - follows="top|left" - left_pad="10" - name="member_ban" - width="100" /> + <button + height="23" + label="Ban Member(s)" + follows="top|left" + left_pad="10" + name="member_ban" + width="100" /> </panel> <panel border="false" - height="303" label="ROLES" - layout="topleft" - left="0" - right="-1" help_topic="roles_roles_tab" name="roles_sub_tab" class="panel_group_roles_subtab"> - <!-- <button + <!--<button enabled="false" height="20" label="Show All" @@ -145,411 +135,393 @@ clicking on their names. right="-5" name="show_all_button" width="100" />--> - <panel.string - name="help_text"> - Roles have a title and an allowed list of Abilities - that Members can perform. Members can belong to - one or more Roles. A group can have up to 10 Roles, - including the Everyone and Owner Roles. - </panel.string> - <panel.string - name="cant_delete_role"> - The 'Everyone' and 'Owners' Roles are special and can't be deleted. - </panel.string> - <panel.string - name="power_folder_icon" translate="false"> - Inv_FolderClosed - </panel.string> - <panel.string - name="power_all_have_icon" translate="false"> - Checkbox_On - </panel.string> - <panel.string - name="power_partial_icon" translate="false"> - Checkbox_Off - </panel.string> - <filter_editor - layout="topleft" - top="5" - left="5" - right="-5" - height="22" - search_button_visible="false" - follows="left|top|right" - label="Filter Roles" - name="filter_input" /> - <scroll_list - column_padding="0" - draw_heading="true" - draw_stripes="false" - heading_height="23" - height="132" - layout="topleft" - search_column="1" - left="0" - follows="left|top|right" - right="-1" - name="role_list" - top_pad="2" - width="310"> - <scroll_list.columns - label="Role" - name="name" - relative_width="0.45" /> - <scroll_list.columns - label="Title" - name="title" - relative_width="0.45" /> - <scroll_list.columns - label="#" - name="members" - relative_width="0.15" /> - </scroll_list> - <button - follows="top|left" - height="23" - label="New Role" - layout="topleft" - left="0" - name="role_create" - width="100" /> - <button - follows="top|left" - height="23" - label="Copy Role" - layout="topleft" - left_pad="10" - name="role_copy" - width="100" /> - <button - height="23" - follows="top|left" - label="Delete Role" - layout="topleft" - left_pad="10" - name="role_delete" - width="100" /> - </panel> + <panel.string + name="help_text"> + Roles have a title and an allowed list of Abilities +that Members can perform. Members can belong to +one or more Roles. A group can have up to 10 Roles, +including the Everyone and Owner Roles. + </panel.string> + <panel.string + name="cant_delete_role"> + The 'Everyone' and 'Owners' Roles are special and can't be deleted. + </panel.string> + <panel.string + name="power_folder_icon" translate="false"> + Inv_FolderClosed + </panel.string> + <panel.string + name="power_all_have_icon" translate="false"> + Checkbox_On + </panel.string> + <panel.string + name="power_partial_icon" translate="false"> + Checkbox_Off + </panel.string> + <filter_editor + layout="topleft" + top="5" + left="5" + right="-5" + height="22" + search_button_visible="false" + follows="left|top|right" + label="Filter Roles" + name="filter_input" /> + <scroll_list + column_padding="0" + draw_heading="true" + draw_stripes="false" + heading_height="23" + height="138" + layout="topleft" + search_column="1" + left="0" + follows="left|top|right" + right="-1" + name="role_list" + top_pad="2"> + <scroll_list.columns + label="Role" + name="name" + relative_width="0.45" /> + <scroll_list.columns + label="Title" + name="title" + relative_width="0.45" /> + <scroll_list.columns + label="#" + name="members" + relative_width="0.15" /> + </scroll_list> + <button + follows="top|left" + height="23" + label="New Role" + layout="topleft" + left="0" + name="role_create" + width="100" /> + <button + follows="top|left" + height="23" + label="Copy Role" + layout="topleft" + left_pad="10" + name="role_copy" + width="100" /> + <button + height="23" + follows="top|left" + label="Delete Role" + layout="topleft" + left_pad="10" + name="role_delete" + width="100" /> + </panel> + <panel + border="false" + label="ABILITIES" + help_topic="roles_actions_tab" + name="actions_sub_tab" + class="panel_group_actions_subtab" + tool_tip="You can view an Ability's Description and which Roles and Members can execute the Ability."> + <panel.string + name="help_text"> + Abilities allow Members in Roles to do specific +things in this group. There's a broad variety of Abilities. + </panel.string> + <panel.string + name="power_folder_icon" translate="false"> + Inv_FolderClosed + </panel.string> + <panel.string + name="power_all_have_icon" translate="false"> + Checkbox_On + </panel.string> + <panel.string + name="power_partial_icon" translate="false"> + Checkbox_Off + </panel.string> + <filter_editor + layout="topleft" + top="5" + left="5" + right="-5" + height="22" + search_button_visible="false" + follows="left|top|right" + label="Filter Abilities" + name="filter_input" /> + <scroll_list + column_padding="0" + draw_stripes="true" + height="200" + follows="left|top|right" + layout="topleft" + left="0" + right="-1" + name="action_list" + search_column="2" + tool_tip="Select an Ability to view more details" + top_pad="5"> + <scroll_list.columns + label="" + name="icon" + width="2" /> + <scroll_list.columns + label="" + name="checkbox" + width="20" /> + <scroll_list.columns + label="" + name="action" /> + </scroll_list> + </panel> + <panel + border="false" + label="BANNED RESIDENTS" + help_topic="roles_banlist_tab" + name="banlist_sub_tab" + class="panel_group_banlist_subtab" + tool_tip="View the banned residents from this group."> + <panel.string + name="help_text"> + Any resident on the ban list will be unable to join the group. + </panel.string> + <panel.string + name="ban_count_template"> + Ban count: [COUNT]/[LIMIT] + </panel.string> + <name_list + column_padding="0" + draw_heading="true" + height="714" + follows="left|top|right" + layout="topleft" + left="0" + right="-1" + multi_select="true" + name="ban_list" + short_names="false" + top_pad="5"> + <name_list.columns + label="Resident" + name="name" + font.name="SANSSERIF_SMALL" + font.style="NORMAL" + relative_width="0.7" /> + <name_list.columns + label="Date Banned" + name="ban_date" + relative_width="0.3" /> + </name_list> + <button + follows="top|left" + height="23" + label="Ban Resident(s)" + layout="topleft" + left="3" + name="ban_create" + tool_tip="Ban residents from your group" + width="120" /> + <button + follows="top|left" + height="23" + label="Remove Ban(s)" + layout="topleft" + left_pad="5" + name="ban_delete" + tool_tip="Unban selected residents from your group" + width="120" /> + <button + follows="top|left" + height="23" + width="23" + image_overlay="Refresh_Off" + layout="topleft" + left_pad="5" + name="ban_refresh" + tool_tip="Refresh the ban list" /> + <text + type="string" + height="18" + left_pad="5" + follows="top|left" + layout="topleft" + name="ban_count" + width="100"> + </text> + </panel> + </tab_container> <panel - border="false" - height="303" - label="ABILITIES" + height="350" + background_visible="false" + bg_alpha_color="FloaterUnfocusBorderColor" layout="topleft" + follows="top|left|right" left="0" right="-1" - help_topic="roles_actions_tab" - name="actions_sub_tab" - class="panel_group_actions_subtab" - tool_tip="You can view an Ability's Description and which Roles and Members can execute the Ability." - width="310"> - <panel.string - name="help_text"> - Abilities allow Members in Roles to do specific - things in this group. There's a broad variety of Abilities. - </panel.string> - <panel.string - name="power_folder_icon" translate="false"> - Inv_FolderClosed - </panel.string> - <panel.string - name="power_all_have_icon" translate="false"> - Checkbox_On - </panel.string> - <panel.string - name="power_partial_icon" translate="false"> - Checkbox_Off - </panel.string> - <filter_editor - layout="topleft" - top="5" - left="5" - right="-5" - height="22" - search_button_visible="false" - follows="left|top|right" - label="Filter Abilities" - name="filter_input" /> - <scroll_list - column_padding="0" - draw_stripes="true" - height="200" - follows="left|top|right" - layout="topleft" - left="0" - right="-1" - name="action_list" - search_column="2" - tool_tip="Select an Ability to view more details" - top_pad="5" - width="300"> - <scroll_list.columns - label="" - name="icon" - width="2" /> - <scroll_list.columns - label="" - name="checkbox" - width="20" /> - <scroll_list.columns - label="" - name="action" /> - </scroll_list> + mouse_opaque="false" + name="members_footer" + top="325" + visible="false"> + <text + type="string" + height="16" + layout="topleft" + follows="left|top" + left="5" + top="8" + text_color="EmphasisColor" + name="static" + width="300"> + Assigned Roles + </text> + <scroll_list + draw_stripes="true" + follows="left|top|right" + height="150" + layout="topleft" + left="0" + right="-1" + name="member_assigned_roles" + top_pad="0"> + <scroll_list.columns + label="" + name="checkbox" + width="20" /> + <scroll_list.columns + label="" + name="role" + width="270" /> + </scroll_list> + <text + type="string" + height="16" + layout="topleft" + follows="left|top" + left="5" + top_pad="5" + text_color="EmphasisColor" + name="static2" + width="285"> + Allowed Abilities + </text> + <scroll_list + draw_stripes="true" + follows="left|top|right" + height="150" + layout="topleft" + left="0" + right="-1" + name="member_allowed_actions" + search_column="2" + tool_tip="For details of each allowed ability see the abilities tab" + top_pad="0"> + <scroll_list.columns + label="" + name="icon" + width="2" /> + <scroll_list.columns + label="" + name="checkbox" + width="20" /> + <scroll_list.columns + label="" + name="action" + width="270" /> + </scroll_list> </panel> <panel - border="false" - height="303" - label="BANNED RESIDENTS" + height="90" + background_visible="false" + bg_alpha_color="FloaterUnfocusBorderColor" layout="topleft" + follows="top|left|right" left="0" right="-1" - help_topic="roles_banlist_tab" - name="banlist_sub_tab" - class="panel_group_banlist_subtab" - tool_tip="View the banned residents from this group." - width="310"> - <panel.string - name="help_text"> - Any resident on the ban list will be unable to join the group. - </panel.string> - <panel.string - name="ban_count_template"> - Ban count: [COUNT]/[LIMIT] - </panel.string> - <name_list - column_padding="0" - draw_heading="true" - height="400" - follows="left|top|right" - layout="topleft" - left="0" - right="-1" - multi_select="true" - name="ban_list" - short_names="false" - top_pad="5"> - <name_list.columns - label="Resident" - name="name" - font.name="SANSSERIF_SMALL" - font.style="NORMAL" - relative_width="0.7" /> - <name_list.columns - label="Date Banned" - name="ban_date" - relative_width="0.3" /> - </name_list> - <button - follows="top|left" - height="23" - label="Ban Resident(s)" - layout="topleft" - left="3" - name="ban_create" - tool_tip="Ban residents from your group" - width="120" /> - <button - follows="top|left" - height="23" - label="Remove Ban(s)" - layout="topleft" - left_pad="5" - name="ban_delete" - tool_tip="Unban selected residents from your group" - width="120" /> - <button - follows="top|left" - height="23" - width="23" - image_overlay="Refresh_Off" - layout="topleft" - left_pad="5" - name="ban_refresh" - tool_tip="Refresh the ban list" - /> - <text - type="string" - height="18" - left_pad="5" - follows="top|left" - layout="topleft" - name="ban_count" - width="100"> - </text> + mouse_opaque="false" + name="members_header" + top_pad="3" + visible="false"> + <text_editor + bg_readonly_color="Transparent" + text_readonly_color="EmphasisColor" + font="SansSerifSmall" + type="string" + enabled="false" + halign="left" + layout="topleft" + top_pad="0" + follows="left|top|right" + left="0" + right="-1" + height="90" + max_length="512" + name="member_action_description" + word_wrap="true"> + This Ability is 'Eject Members from this Group'. Only an Owner can eject another Owner. + </text_editor> </panel> - </tab_container> - <panel - height="350" - background_visible="false" - bg_alpha_color="FloaterUnfocusBorderColor" - layout="topleft" - follows="top|left|right" - left="0" - right="-1" - width="313" - mouse_opaque="false" - name="members_footer" - top="325" - visible="false"> - <text - type="string" - height="16" - layout="topleft" - follows="left|top" - left="5" - top="8" - text_color="EmphasisColor" - name="static" - width="300"> - Assigned Roles - </text> - <scroll_list - draw_stripes="true" - follows="left|top|right" - height="150" + <panel + height="460" + background_visible="false" + bg_alpha_color="FloaterUnfocusBorderColor" layout="topleft" + follows="top|left|right" left="0" right="-1" - name="member_assigned_roles" - top_pad="0"> - <scroll_list.columns - label="" - name="checkbox" - width="20" /> - <scroll_list.columns - label="" - name="role" - width="270" /> - </scroll_list> - <text - type="string" - height="16" - layout="topleft" - follows="left|top" - left="5" - top_pad="5" - text_color="EmphasisColor" - name="static2" - width="285"> - Allowed Abilities - </text> - <scroll_list - draw_stripes="true" + mouse_opaque="false" + name="roles_footer" + top_delta="0" + top="215" + visible="false"> + <text + type="string" + height="16" + layout="topleft" + follows="left|top" + left="5" + top="5" + name="static" + width="300"> + Role Name + </text> + <line_editor + type="string" + height="20" + layout="topleft" + left="0" follows="left|top|right" - height="150" - layout="topleft" - left="0" - right="-1" - name="member_allowed_actions" - search_column="2" - tool_tip="For details of each allowed ability see the abilities tab" - top_pad="0"> - <scroll_list.columns - label="" - name="icon" - width="2" /> - <scroll_list.columns - label="" - name="checkbox" - width="20" /> - <scroll_list.columns - label="" - name="action" - width="270" /> - </scroll_list> - </panel> - <panel - height="90" - background_visible="false" - bg_alpha_color="FloaterUnfocusBorderColor" - layout="topleft" - follows="top|left|right" - left="0" - right="-1" - width="313" - mouse_opaque="false" - name="members_header" - top_pad="3" - visible="false"> - <text_editor - bg_readonly_color="Transparent" - text_readonly_color="EmphasisColor" - font="SansSerifSmall" - type="string" - enabled="false" - halign="left" - layout="topleft" - top_pad="0" - follows="left|top|right" - left="0" - right="-1" - height="90" - max_length="512" - name="member_action_description" - word_wrap="true"> - This Ability is 'Eject Members from this Group'. Only an Owner can eject another Owner. - </text_editor> - </panel> - <panel - height="460" - background_visible="false" - bg_alpha_color="FloaterUnfocusBorderColor" - layout="topleft" - follows="top|left|right" - left="0" - right="-1" - width="313" - mouse_opaque="false" - name="roles_footer" - top_delta="0" - top="209" - visible="false"> - <text - type="string" - height="16" - layout="topleft" - follows="left|top" - left="5" - top="5" - name="static" - width="300"> - Role Name - </text> - <line_editor - type="string" - height="20" - layout="topleft" - left="0" - follows="left|top|right" - right="-1" - max_length_bytes="20" - name="role_name" - top_pad="0" - width="300"> - </line_editor> - <text - type="string" - height="16" - layout="topleft" - follows="left|top" - left="5" - name="static3" - top_pad="5" - width="300"> - Role Title - </text> - <line_editor - type="string" - height="20" - layout="topleft" - left="0" - follows="left|top|right" - right="-1" - max_length_bytes="20" - name="role_title" - top_pad="0" - width="300"> - </line_editor> - <text + right="-1" + max_length_bytes="20" + name="role_name" + top_pad="0"> + </line_editor> + <text + type="string" + height="16" + layout="topleft" + follows="left|top" + left="5" + name="static3" + top_pad="5" + width="300"> + Role Title + </text> + <line_editor + type="string" + height="20" + layout="topleft" + left="0" + follows="left|top|right" + right="-1" + max_length_bytes="20" + name="role_title" + top_pad="0"> + </line_editor> + <text type="string" height="16" layout="topleft" @@ -558,192 +530,185 @@ clicking on their names. name="static2" top_pad="5" width="200"> - Description - </text> - <text_editor - type="string" - layout="topleft" - left="0" - follows="left|top|right" - right="-1" - max_length="295" - height="35" - name="role_description" - top_pad="0" - width="300" - word_wrap="true"> - </text_editor> - <text - type="string" - height="16" - layout="topleft" - follows="left|top" - left="5" - text_color="EmphasisColor" - name="static4" - top_pad="5" - width="300"> - Assigned Members - </text> - <name_list - draw_stripes="true" - height="128" - layout="topleft" - left="0" - follows="left|top|right" - right="-1" - name="role_assigned_members" - top_pad="0" - width="300" /> - <check_box - height="15" - label="Reveal members" - left="5" - layout="topleft" - name="role_visible_in_list" - tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group." - top_pad="4" - width="300" /> - <text - type="string" - height="16" - layout="topleft" - follows="left|top" - left="5" - text_color="EmphasisColor" - name="static5" - top_pad="2" - width="300"> - Allowed Abilities - </text> - <scroll_list - draw_stripes="true" - height="140" - layout="topleft" - left="0" - follows="left|top|right" - right="-1" - name="role_allowed_actions" - search_column="2" - tool_tip="For details of each allowed ability see the abilities tab" - top_pad="0" - width="300"> - <scroll_list.columns - label="" - name="icon" - width="2" /> - <scroll_list.columns - label="" - name="checkbox" - width="20" /> - <scroll_list.columns - label="" - name="action" /> - </scroll_list> - </panel> - <panel - height="90" - background_visible="false" - bg_alpha_color="FloaterUnfocusBorderColor" - layout="topleft" - follows="top|left|right" - left="0" - right="-1" - width="313" - mouse_opaque="false" - name="roles_header" - top_pad="3" - visible="false"> - <text_editor - bg_readonly_color="Transparent" - text_readonly_color="EmphasisColor" - font="SansSerifSmall" - type="string" - enabled="false" - halign="left" - layout="topleft" - top_pad="0" - follows="left|top|right" - left="0" - right="-1" + Description + </text> + <text_editor + type="string" + layout="topleft" + left="0" + follows="left|top|right" + right="-1" + max_length="295" + height="35" + name="role_description" + top_pad="0" + word_wrap="true"> + </text_editor> + <text + type="string" + height="16" + layout="topleft" + follows="left|top" + left="5" + text_color="EmphasisColor" + name="static4" + top_pad="5" + width="300"> + Assigned Members + </text> + <name_list + draw_stripes="true" + height="128" + layout="topleft" + left="0" + follows="left|top|right" + right="-1" + name="role_assigned_members" + top_pad="0" /> + <check_box + height="15" + label="Reveal members" + left="5" + layout="topleft" + name="role_visible_in_list" + tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group." + top_pad="4" + width="300" /> + <text + type="string" + height="16" + layout="topleft" + follows="left|top" + left="5" + text_color="EmphasisColor" + name="static5" + top_pad="2" + width="300"> + Allowed Abilities + </text> + <scroll_list + draw_stripes="true" + height="140" + layout="topleft" + left="0" + follows="left|top|right" + right="-1" + name="role_allowed_actions" + search_column="2" + tool_tip="For details of each allowed ability see the abilities tab" + top_pad="0"> + <scroll_list.columns + label="" + name="icon" + width="2" /> + <scroll_list.columns + label="" + name="checkbox" + width="20" /> + <scroll_list.columns + label="" + name="action" /> + </scroll_list> + </panel> + <panel height="90" - max_length="512" - name="role_action_description" - word_wrap="true"> - This Ability is 'Eject Members from this Group'. Only an Owner can eject another Owner. - </text_editor> - </panel> - <panel - height="424" - background_visible="false" - bg_alpha_color="FloaterUnfocusBorderColor" - layout="topleft" - follows="top|left|right" - left="0" - right="-1" - width="313" - mouse_opaque="false" - name="actions_footer" - top_delta="0" - top="255" - visible="false"> - <text_editor - bg_readonly_color="Transparent" - text_readonly_color="EmphasisColor" - font="SansSerifSmall" - type="string" - enabled="false" - halign="left" + background_visible="false" + bg_alpha_color="FloaterUnfocusBorderColor" layout="topleft" - follows="left|top|right" + follows="top|left|right" left="0" right="-1" - height="90" - max_length="512" - name="action_description" - top="0" - word_wrap="true"> - This Ability is 'Eject Members from this Group'. Only an Owner can eject another Owner. - </text_editor> - <text - type="string" - height="16" - layout="topleft" - follows="left|top" - left="5" - name="static2" - top_pad="1" - width="300"> - Roles with this ability - </text> - <scroll_list - height="172" - layout="topleft" - follows="left|top|right" - left="5" - right="-1" - name="action_roles" - top_pad="0" - width="300" /> - <text - type="string" - height="16" - layout="topleft" - follows="left|top" - left="5" - name="static3" - top_pad="5" - width="300"> - Members with this ability - </text> - <name_list - height="122" - follows="left|top|right" + mouse_opaque="false" + name="roles_header" + top_pad="3" + visible="false"> + <text_editor + bg_readonly_color="Transparent" + text_readonly_color="EmphasisColor" + font="SansSerifSmall" + type="string" + enabled="false" + halign="left" + layout="topleft" + top_pad="0" + follows="left|top|right" + left="0" + right="-1" + height="90" + max_length="512" + name="role_action_description" + word_wrap="true"> + This Ability is 'Eject Members from this Group'. Only an Owner can eject another Owner. + </text_editor> + </panel> + <panel + height="513" + background_visible="false" + bg_alpha_color="FloaterUnfocusBorderColor" layout="topleft" - left="5" + follows="top|left|right" + left="0" right="-1" - name="action_members" - top_pad="0" - width="300" /> - </panel> + mouse_opaque="false" + name="actions_footer" + top_delta="0" + top="255" + visible="false"> + <text_editor + bg_readonly_color="Transparent" + text_readonly_color="EmphasisColor" + font="SansSerifSmall" + type="string" + enabled="false" + halign="left" + layout="topleft" + follows="left|top|right" + left="0" + right="-1" + height="90" + max_length="512" + name="action_description" + top="0" + word_wrap="true"> + This Ability is 'Eject Members from this Group'. Only an Owner can eject another Owner. + </text_editor> + <text + type="string" + height="16" + layout="topleft" + follows="left|top" + left="5" + name="static2" + top_pad="1" + width="300"> + Roles with this ability + </text> + <scroll_list + height="216" + layout="topleft" + follows="left|top|right" + left="5" + right="-1" + name="action_roles" + top_pad="0" /> + <text + type="string" + height="16" + layout="topleft" + follows="left|top" + left="5" + name="static3" + top_pad="5" + width="300"> + Members with this ability + </text> + <name_list + height="167" + follows="left|top|right" + layout="topleft" + left="5" + right="-1" + name="action_members" + top_pad="0" /> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_inventory_gallery_item.xml b/indra/newview/skins/default/xui/en/panel_inventory_gallery_item.xml index 73cb9b080f..f5906c17fd 100644 --- a/indra/newview/skins/default/xui/en/panel_inventory_gallery_item.xml +++ b/indra/newview/skins/default/xui/en/panel_inventory_gallery_item.xml @@ -43,6 +43,16 @@ follows="left|top" visible="false" image_name="Inv_Link"/> + <icon + layout="topleft" + follows="left|top" + name="fav_icon" + left="110" + top_pad="-14" + height="14" + width="14" + visible="true" + image_name="Inv_Favorite_Star_Full"/> <panel background_visible="false" background_opaque="true" diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml index e25145dd2a..9cb64e7a13 100644 --- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -40,6 +40,10 @@ Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner. </string> <string + name="acquired_date_ampm"> + [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour12,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [ampm,datetime,slt] [year,datetime,slt] + </string> + <string name="acquired_date"> [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [year,datetime,slt] </string> diff --git a/indra/newview/skins/default/xui/en/panel_login_first.xml b/indra/newview/skins/default/xui/en/panel_login_first.xml index 0a8ae48b02..d6ac71db94 100644 --- a/indra/newview/skins/default/xui/en/panel_login_first.xml +++ b/indra/newview/skins/default/xui/en/panel_login_first.xml @@ -6,7 +6,7 @@ name="panel_login" focus_root="true" background_visible="true" - bg_opaque_color="0.0 0.0 0.0 1" + bg_opaque_color="0.16 0.16 0.16 1" background_opaque="true" width="1024"> <panel.string @@ -61,7 +61,7 @@ height="105"> <icon height="94" - image_name="login_mp_logo" + image_name="login_sl_logo" left="0" name="sl_logo" top="0" /> diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index 498dab1ef3..6e1e6facbe 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -269,6 +269,22 @@ scroll.reserve_scroll_corner="false"> <folder double_click_override="true"/> </inventory_panel> + <favorites_inventory_panel + bg_opaque_color="DkGray2" + bg_alpha_color="DkGray2" + background_visible="true" + border="false" + bevel_style="none" + follows="all" + label="FAVORITES" + help_topic="recent_inventory_tab" + layout="topleft" + name="Favorites" + show_item_link_overlays="true" + preinitialize_views="false" + scroll.reserve_scroll_corner="false"> + <folder double_click_override="true"/> + </favorites_inventory_panel> </tab_container> </panel> <panel diff --git a/indra/newview/skins/default/xui/en/panel_marketplace_listings_inventory.xml b/indra/newview/skins/default/xui/en/panel_marketplace_listings_inventory.xml index a8a306bea9..9586957694 100644 --- a/indra/newview/skins/default/xui/en/panel_marketplace_listings_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_marketplace_listings_inventory.xml @@ -21,5 +21,5 @@ border="false" bevel_style="none" show_item_link_overlays="true"> - <item allow_wear="false"/> + <item marketplace_item="true"/> </inventory_panel> diff --git a/indra/newview/skins/default/xui/en/panel_marketplace_listings_listed.xml b/indra/newview/skins/default/xui/en/panel_marketplace_listings_listed.xml index 0c665fb07e..5f64a5d47a 100644 --- a/indra/newview/skins/default/xui/en/panel_marketplace_listings_listed.xml +++ b/indra/newview/skins/default/xui/en/panel_marketplace_listings_listed.xml @@ -20,5 +20,5 @@ border="false" bevel_style="none" show_item_link_overlays="true"> - <item allow_wear="false"/> + <item marketplace_item="true"/> </inventory_panel> diff --git a/indra/newview/skins/default/xui/en/panel_marketplace_listings_unassociated.xml b/indra/newview/skins/default/xui/en/panel_marketplace_listings_unassociated.xml index 0be405c5b8..ab4d836ba9 100644 --- a/indra/newview/skins/default/xui/en/panel_marketplace_listings_unassociated.xml +++ b/indra/newview/skins/default/xui/en/panel_marketplace_listings_unassociated.xml @@ -19,5 +19,5 @@ border="false" bevel_style="none" show_item_link_overlays="true"> - <item allow_wear="false"/> + <item marketplace_item="true"/> </inventory_panel> diff --git a/indra/newview/skins/default/xui/en/panel_marketplace_listings_unlisted.xml b/indra/newview/skins/default/xui/en/panel_marketplace_listings_unlisted.xml index 58122db7f4..303601e65b 100644 --- a/indra/newview/skins/default/xui/en/panel_marketplace_listings_unlisted.xml +++ b/indra/newview/skins/default/xui/en/panel_marketplace_listings_unlisted.xml @@ -20,5 +20,5 @@ border="false" bevel_style="none" show_item_link_overlays="true"> - <item allow_wear="false"/> + <item marketplace_item="true"/> </inventory_panel> diff --git a/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml b/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml index 6166268206..d49bf19c5d 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml @@ -35,7 +35,7 @@ </text> <scroll_container follows="all" - height="400" + height="429" width="312" layout="topleft" left="4" @@ -44,49 +44,5 @@ name="gallery_scroll_panel" opaque="false" top_pad="0"> - </scroll_container> - <panel - background_visible="false" - follows="bottom|left|right" - height="28" - layout="topleft" - left="4" - top_pad="0" - visible="true" - name="bottom_panel" - width="312"> - <menu_button - follows="bottom|left" - tool_tip="Show additional options" - height="25" - image_hover_unselected="Toolbar_Left_Over" - image_overlay="OptionsMenu_Off" - image_selected="Toolbar_Left_Selected" - image_unselected="Toolbar_Left_Off" - layout="topleft" - left="0" - name="options_gear_btn" - top="1" - width="31" /> - <icon - follows="bottom|left|right" - height="25" - image_name="Toolbar_Middle_Off" - layout="topleft" - left_pad="1" - name="dummy_icon" - width="243"/> - <button - follows="bottom|right" - height="25" - image_hover_unselected="Toolbar_Right_Over" - image_overlay="TrashItem_Off" - image_selected="Toolbar_Right_Selected" - image_unselected="Toolbar_Right_Off" - layout="topleft" - left_pad="1" - name="trash_btn" - tool_tip="Delete selected outfit" - width="31"/> - </panel> + </scroll_container> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml index e8d8e8f3e2..cd4e5ef1f6 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_list.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml @@ -16,7 +16,7 @@ bg_opaque_color="DkGray2" follows="all" - height="400" + height="428" layout="topleft" left="3" name="outfits_accordion" @@ -30,48 +30,4 @@ name="no_outfits_msg" value="You don't have any outfits yet. Try [secondlife:///app/search/all/ Search]"/> </accordion> - <panel - background_visible="false" - follows="bottom|left|right" - height="28" - layout="topleft" - left="4" - top_pad="0" - visible="true" - name="bottom_panel" - width="312"> - <menu_button - follows="bottom|left" - tool_tip="Show additional options" - height="25" - image_hover_unselected="Toolbar_Left_Over" - image_overlay="OptionsMenu_Off" - image_selected="Toolbar_Left_Selected" - image_unselected="Toolbar_Left_Off" - layout="topleft" - left="0" - name="options_gear_btn" - top="1" - width="31" /> - <icon - follows="bottom|left|right" - height="25" - image_name="Toolbar_Middle_Off" - layout="topleft" - left_pad="1" - name="dummy_icon" - width="243"/> - <button - follows="bottom|right" - height="25" - image_hover_unselected="Toolbar_Right_Over" - image_overlay="TrashItem_Off" - image_selected="Toolbar_Right_Selected" - image_unselected="Toolbar_Right_Off" - layout="topleft" - left_pad="1" - name="trash_btn" - tool_tip="Delete selected outfit" - width="31"/> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml index 559917ec0a..10073f0461 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml @@ -16,7 +16,7 @@ <accordion fit_parent="true" follows="all" - height="400" + height="429" layout="topleft" left="3" single_expansion="true" @@ -62,35 +62,4 @@ </scroll_list> </accordion_tab> </accordion> - <panel - background_visible="false" - follows="bottom|left|right" - height="28" - layout="topleft" - left="4" - name="bottom_panel" - top_pad="0" - width="312"> - <menu_button - follows="bottom|left" - height="25" - image_hover_unselected="Toolbar_Left_Over" - image_overlay="OptionsMenu_Off" - image_selected="Toolbar_Left_Selected" - image_unselected="Toolbar_Left_Off" - layout="topleft" - left="0" - name="options_gear_btn" - tool_tip="Show additional options" - top="1" - width="31" /> - <icon - follows="bottom|left|right" - height="25" - image_name="Toolbar_Right_Off" - layout="topleft" - left_pad="1" - name="dummy_icon" - width="274" /> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index f1c03fdaa8..0766cc06ee 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -177,6 +177,25 @@ Learn about [https://community.secondlife.com/knowledgebase/joining-and-particip function="People.DelFriend" /> </dnd_button> </panel> + <slider + control_name="NearMeRange" + decimal_digits="0" + increment="1" + follows="left|top" + left="5" + min_val="0" + max_val="4096" + label="Range:" + name="near_me_range" + tool_tip="Nearby people range" + width="230"/> + <text + type="string" + follows="left|top" + left_delta="225" + name="near_me_range_text2"> + m + </text> <layout_stack clip="false" follows="all" @@ -216,7 +235,7 @@ Learn about [https://community.secondlife.com/knowledgebase/joining-and-particip <avatar_list allow_select="true" follows="all" - height="211" + height="197" ignore_online_status="true" layout="topleft" left="3" diff --git a/indra/newview/skins/default/xui/en/panel_performance_preferences.xml b/indra/newview/skins/default/xui/en/panel_performance_preferences.xml index c1260f3b4a..a412543251 100644 --- a/indra/newview/skins/default/xui/en/panel_performance_preferences.xml +++ b/indra/newview/skins/default/xui/en/panel_performance_preferences.xml @@ -209,11 +209,11 @@ follows="left|top" top_delta="-1" height="16" - increment="16" + increment="8" initial_value="128" label_width="90" layout="topleft" - min_val="32" + min_val="8" max_val="512" name="draw_distance" left_pad="5" @@ -427,6 +427,16 @@ layout="topleft" top="80" left="213" + name="0_lbl" + width="7"> + 0 + </text> + <text + follows="left|top" + font="SansSerifSmall" + height="18" + layout="topleft" + left_pad="31" name="1_lbl" width="7"> 1 @@ -436,7 +446,7 @@ font="SansSerifSmall" height="18" layout="topleft" - left_pad="31" + left_pad="30" name="2_lbl" width="7"> 2 @@ -479,16 +489,6 @@ left_pad="30" name="6_lbl" width="7"> - 6 - </text> - <text - follows="left|top" - font="SansSerifSmall" - height="18" - layout="topleft" - left_pad="30" - name="7_lbl" - width="7"> - 7 + 6 </text> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml index 9aa0907a38..66cd1cacf1 100644 --- a/indra/newview/skins/default/xui/en/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -89,6 +89,10 @@ Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner. </string> <string + name="acquired_date_ampm"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour12,datetime,local]:[min,datetime,local]:[second,datetime,local] [ampm,datetime,local] [year,datetime,local] + </string> + <string name="acquired_date"> [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] </string> diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml index 4d9a03823e..1005810145 100644 --- a/indra/newview/skins/default/xui/en/panel_places.xml +++ b/indra/newview/skins/default/xui/en/panel_places.xml @@ -19,7 +19,7 @@ background_visible="false" value="VISITED" /> <string name="favorites_tab_title" - value="FAVORITES" /> + value="FAVORITES BAR" /> <string name="tooltip_trash_items" value="Remove selected landmark or folder" /> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml index 8051ffa8ec..b27b6dd73a 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -32,15 +32,15 @@ height="23" increment="64" initial_value="1024" - label="Cache size (256 - 9984MB)" + label="Cache size (896 - 32768MB)" label_width="150" layout="topleft" left="80" - max_val="9984" - min_val="256" + max_val="32768" + min_val="896" top_pad="10" name="cachesizespinner" - width="200" /> + width="210" /> <text type="string" length="1" @@ -59,7 +59,7 @@ label="Clear Cache" label_selected="Clear Cache" layout="topleft" - left_pad="30" + left_pad="20" name="clear_cache" top_delta="0" width="100"> @@ -206,6 +206,41 @@ top_delta="0" width="315" /> </radio_group> + <check_box + control_name="StreamNotificationChannelEnabled" + height="16" + label="Custom stream notification channel" + layout="topleft" + left="30" + name="stream_notification_channel_enabled" + width="256"> + </check_box> + <spinner + control_name="StreamNotificationChannel" + enabled_control="StreamNotificationChannelEnabled" + decimal_digits="0" + follows="left|top" + height="23" + increment="1" + initial_value="751751" + label="Channel number:" + label_width="105" + layout="topleft" + left_pad="-25" + max_val="2147483647" + min_val="-2147483648" + name="stream_notification_channel" + top_pad="-15" + width="170" /> + <check_box + control_name="SnapshotTimestamp" + height="16" + label="Add timestamp to snapshot file names" + layout="topleft" + left="30" + name="snapshot_timestamp" + width="256"> + </check_box> <check_box control_name="AllowMultipleViewers" @@ -215,7 +250,7 @@ layout="topleft" left="30" name="allow_multiple_viewer_check" - top_pad="20" + top_pad="15" width="237"/> <check_box control_name="ForceShowGrid" 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 88716c7f96..0aa1af7de6 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -409,7 +409,7 @@ layout="topleft" left="0" name="play_sound" - width="100" + width="90" top_pad="8" visible="true"> Play sound: @@ -419,10 +419,10 @@ height="16" label="New conversation" layout="topleft" - left_pad="15" + left_pad="5" top_pad="-10" name="new_conversation" - width="150" /> + width="130" /> <check_box control_name="PlaySoundIncomingVoiceCall" height="16" @@ -430,16 +430,16 @@ layout="topleft" top_pad="6" name="incoming_voice_call" - width="150" /> + width="130" /> <check_box control_name="PlaySoundTeleportOffer" height="16" label="Teleport offer" layout="topleft" - left_pad="35" + left_pad="18" top_pad="-38" name="teleport_offer" - width="150" /> + width="130" /> <check_box control_name="PlaySoundInventoryOffer" height="16" @@ -447,14 +447,23 @@ layout="topleft" top_pad="6" name="inventory_offer" - width="150" /> + width="130" /> + <check_box + control_name="PlaySoundChatMention" + height="16" + label="Chat mention" + layout="topleft" + left_pad="7" + top_pad="-38" + name="chat_mention" + width="130" /> <view_border bevel_style="none" height="0" layout="topleft" left="0" name="cost_text_border" - top_pad="7" + top_pad="29" width="492"/> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml index b6fdef3475..df9f467fca 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml @@ -299,6 +299,107 @@ width="95"> URLs </text> + <color_swatch + can_apply_immediately="true" + color="EmphasisColor" + follows="left|top" + height="24" + label_height="0" + layout="topleft" + left="360" + name="mentions" + top_pad="-15" + width="44" > + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="ChatMentionFont" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="ChatMentionFont" /> + </color_swatch> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_pad="5" + mouse_opaque="false" + name="text_mentions" + top_delta="5" + width="95"> + Mentions + </text> + <text + follows="left|top" + layout="topleft" + left="30" + height="12" + name="mentions_colors" + top_pad="20" + width="170"> + Chat mentions highlight colors: + </text> + <color_swatch + can_apply_immediately="true" + follows="left|top" + height="24" + label_height="0" + layout="topleft" + left="40" + name="mention_self" + top_pad="10" + width="44" > + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="ChatSelfMentionHighlight" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="ChatSelfMentionHighlight" /> + </color_swatch> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_pad="5" + mouse_opaque="false" + name="text_mentions_self" + top_delta="5" + width="95"> + Me + </text> + <color_swatch + can_apply_immediately="true" + follows="left|top" + height="24" + label_height="0" + layout="topleft" + left="190" + name="mention_others" + top_pad="-15" + width="44" > + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="ChatMentionHighlight" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="ChatMentionHighlight" /> + </color_swatch> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_pad="5" + mouse_opaque="false" + name="text_mentions_others" + top_delta="5" + width="95"> + Others + </text> <text follows="left|top" layout="topleft" @@ -404,7 +505,6 @@ Skin </text> <radio_group - control_name="skin_selection" height="20" layout="topleft" left="35" @@ -420,14 +520,32 @@ value="default" width="75" /> <radio_item + label="gold" + left_pad="0" + layout="topleft" + top_delta="0" + height="16" + name="radio2" + value="gold" + width="75" /> + <radio_item label="contrast" left_pad="0" layout="topleft" top_delta="0" height="16" - name="radio2" + name="radio3" value="contrast" width="75" /> + <radio_item + label="contrast gold" + left_pad="0" + layout="topleft" + top_delta="0" + height="16" + name="radio2" + value="contrast_gold" + width="75" /> <radio_group.commit_callback function="Pref.SelectSkin" /> </radio_group> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml index 101c506309..ddddb4855f 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -91,6 +91,37 @@ name="Traditional Chinese" value="zh" /> </combo_box> + <text + type="string" + length="1" + follows="left|top" + height="15" + layout="topleft" + left="255" + name="time_format_textbox" + top="10" + width="200"> + Time Format: + </text> + <combo_box + follows="left|top" + height="23" + layout="topleft" + left="255" + max_chars="135" + name="time_format_combobox" + width="70"> + <combo_box.item + enabled="true" + label="1:00 AM" + name="12H" + value="0" /> + <combo_box.item + enabled="true" + label="13:00" + name="24H" + value="1" /> + </combo_box> <text font="SansSerifSmall" type="string" 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 fa692d7200..c78575cf82 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -207,13 +207,13 @@ decimal_digits="0" follows="left|top" height="16" - increment="32" - initial_value="160" + increment="8" + initial_value="128" label="Draw distance:" label_width="187" layout="topleft" left="30" - min_val="32" + min_val="8" max_val="512" name="DrawDistance" top_delta="40" @@ -230,40 +230,6 @@ width="128"> m </text> - <slider - control_name="IndirectMaxNonImpostors" - name="IndirectMaxNonImpostors" - decimal_digits="0" - increment="1" - initial_value="12" - show_text="false" - min_val="1" - max_val="66" - label="Maximum number of animated avatars:" - follows="left|top" - layout="topleft" - height="16" - label_width="240" - left="30" - top_delta="40" - width="393"> - <slider.commit_callback - function="Pref.UpdateIndirectMaxNonImpostors" - parameter="IndirectNonImpostorsText" /> - </slider> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - top_delta="0" - left_delta="397" - text_readonly_color="LabelDisabledColor" - name="IndirectMaxNonImpostorsText" - width="65"> - 0 - </text> <button height="23" @@ -347,6 +313,41 @@ 0 </text> + <slider + control_name="IndirectMaxNonImpostors" + name="IndirectMaxNonImpostors" + decimal_digits="0" + increment="1" + initial_value="12" + show_text="false" + min_val="1" + max_val="66" + label="Maximum number of animated avatars:" + follows="left|top" + layout="topleft" + height="16" + label_width="240" + left="30" + top_delta="20" + width="393"> + <slider.commit_callback + function="Pref.UpdateIndirectMaxNonImpostors" + parameter="IndirectNonImpostorsText" /> + </slider> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + top_delta="0" + left_delta="397" + text_readonly_color="LabelDisabledColor" + name="IndirectMaxNonImpostorsText" + width="65"> + 0 + </text> + <button height="23" label="Exceptions..." @@ -388,7 +389,7 @@ layout="topleft" left="10" name="PrefSaveButton" - top="310" + top="332" width="200"> <button.commit_callback function="Pref.PrefSave" @@ -430,7 +431,7 @@ layout="topleft" left="10" name="Defaults" - top_delta="65" + top_delta="42" width="210"> <button.commit_callback function="Pref.HardwareDefaults" /> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics3.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics3.xml new file mode 100644 index 0000000000..5a35d682ae --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics3.xml @@ -0,0 +1,2181 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> + +<panel +name="Visuals effects panel" +follows="left|top|right|bottom" +label="Visuals Effects" +layout="topleft" +width="517" +height="438" +left="102" +top="1" +border="true" +> + +<tab_container +name="preferences_visuals_tab_container" +enabled="true" +top_pad="0" +follows="left|top" +width="517" +height="430" +left_delta="0" +tab_position="top" +tab_stop="false"> + +<panel +label="Megapahit" +name="preferences_visuals_megapahit" +layout="topleft" +follows="top|left"> + +<text +follows="left|top" +layout="topleft" +top_pad="20" +width="400" +height="18" +left="20" +font="SansSerifSmall" +text_color="White" +> +Megapahit recommended settings: +</text> + +<text +follows="left|top" +layout="topleft" +width="400" +height="18" +left="120" +top_pad="55" +font="SansSerifSmall" +> +Clicking the button below is a good starting point +</text> + +<button +name="MPBalancedButton" +follows="top|left" +layout="topleft" +width="200" +height="23" +left="155" +top_pad="40" +label="Recommended Settings" +> +</button> + +<text +follows="left|top" +layout="topleft" +width="460" +height="18" +left="50" +top_pad="60" +font="SansSerifSmall" +> +We recommend capping the fps (touch the fps counter on the top right corner) +</text> + +</panel> + +<panel +label="Antialiasing" +name="preferences_visuals_aa" +layout="topleft" +follows="top|left"> + +<text +name="mp_aa_lbl" +follows="left|top" +layout="topleft" +top_pad="20" +width="100" +height="18" +left="20" +font="SansSerifSmall" +text_color="White" +> +Antialiasing: +</text> + +<text +name="mp_aa_type_lbl" +type="string" +layout="topleft" +follows="left|top" +width="140" +height="16" +left="32" +top_pad="10" +text_readonly_color="LabelDisabledColor" +> +Type: +</text> + +<combo_box +name="mp_aatype_ctrl" +control_name="RenderFSAAType" +label="Antialiasing" +layout="topleft" +width="150" +height="18" +left_delta="150" +top_delta="0" +initial_value="0" +> +<combo_box.item + label="Disabled" + name="FSAADisabled" + value="0" /> +<combo_box.item + label="FXAA" + name="FXAA" + value="1" /> +<combo_box.item + label="SMAA" + name="SMAA" + value="2" /> +</combo_box> + +<icon +name="mp_aa_bullet" +tool_tip="Low performance impact" +image_name="mp_blue_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="55" +top_delta="-2" +/> + +<icon +name="mp_aa_info_bullet" +tool_tip="Antialiasing method (FXAA is fast but blurry, SMAA is sharper)." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="mp_aa_quality_lbl" +tool_tip="Antialiasing quality: We recommend High or Ultra" +type="string" +length="1" +layout="topleft" +follows="left|top" +width="140" +height="16" +left="32" +top_pad="10" +text_readonly_color="LabelDisabledColor" +> +Quality: +</text> + +<combo_box +name="mp_aa_quality_ctrl" +control_name="RenderFSAASamples" +label="Antialiasing" +layout="topleft" +width="150" +height="18" +left_delta="150" +top_delta="0" +> +<combo_box.item +label="Low" +name="Low" +value="0" /> +<combo_box.item +label="Medium" +name="Medium" +value="1" /> +<combo_box.item +label="High" +name="High" +value="2" /> +<combo_box.item +label="Ultra" +name="Ultra" +value="3" /> +</combo_box> + +<icon +name="mp_aaq_bullet" +tool_tip="Low performance impact" +image_name="mp_blue_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="55" +top_delta="-2" +/> + +<icon +name="mp_aaq_info_bullet" +tool_tip="Quality of the selected antialiasing" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="mp_cas_lbl" +type="string" +length="1" +layout="topleft" +follows="left|top" +width="140" +height="16" +left="32" +top_pad="20" +text_readonly_color="LabelDisabledColor" +> +Sharpness: +</text> + +<slider +name="mp_cas_ctrl" +control_name="RenderCASSharpness" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="0" +initial_value="0.0" +min_val="0.0" +max_val="1.0" +decimal_digits="1" +label_width="2" +> +</slider> + +<icon +name="mp_cas_bullet" +tool_tip="No performance impact, except there is an issue currently with the combination of SMAA and Sharpness, where the performance is going down. We are investigating..." +image_name="mp_blue_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_cas_info_bullet" +tool_tip="Add sharpness to the image." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="aniso_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="20" +top_pad="40" +font="SansSerifSmall" +text_color="White" +> +Texture Filtering +</text> + +<check_box +name="mp_aniso_ctrl" +control_name="RenderAnisotropic" +label="Anisotropic Filtering" +layout="topleft" +width="200" +height="16" +left="20" +top_delta="32" +initial_value="true" +> +<check_box.commit_callback +function="Pref.RenderOptionUpdate" /> +</check_box> + +<icon +name="mp_aniso_bullet" +tool_tip="Low performance impact on PC/Linux, Medium performance impact on Mac (We are investigating)" +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_aniso_info_bullet" +tool_tip="Improves textures clarity at certain angles (i.e. ground). This should be on, but on Mac there is an abnormal performance penalty, currently." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +</panel> + +<panel +label="Shadows" +name="preferences_visuals_shadows" +layout="topleft" +follows="top|left"> + +<text +name="mp_shadows_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="20" +top_pad="20" +font="SansSerifSmall" +text_color="White" +> +Shadows +</text> + +<text +name="shadow_src_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall" +> +Shadows source: +</text> + +<combo_box +name="ShadowDetailCtrl" +control_name="RenderShadowDetail" +layout="topleft" +width="150" +height="18" +left_delta="150" +top_delta="0" +> +<combo_box.item +label="None" +name="0" +value="0"/> +<combo_box.item +label="Sun/Moon" +name="1" +value="1"/> +<combo_box.item +label="Sun/Moon + Projectors" +name="2" +value="2"/> +<combo_box.item +label="Projectors only" +name="3" +value="3"/> +</combo_box> + +<icon +name="mp_shadows_bullet" +tool_tip="High to extreme performance impact" +image_name="mp_red_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="55" +top_delta="-2" +/> + +<icon +name="mp_shadows_info_bullet" +tool_tip="Enables a shadow source (Projectors only is experimental)" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="shadow_dist_lbl" +tool_tip="Maximum Shadow Draw distance (Enormous performance penalty)" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall"> +Shadows Distance +</text> + +<slider +name="MPShadowDistCtrl" +control_name="MPRenderShadowMaxDist" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +increment="8" +initial_value="64" +min_val="16" +max_val="256" +decimal_digits="0" +label_width="2"> +</slider> + +<icon +name="mp_shadowd_bullet" +tool_tip="Move to the left to improve performance" +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_shadowd_info_bullet" +tool_tip="Limit the maximum shadow render distance" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="shadow_res_lbl" +tool_tip="Shadow Resolution (Important video memory impact. Lower this if you encounter performance drop, or instability.)" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall" +> +Shadows Resolution +</text> + +<slider +name="MPShadowResCtrl" +control_name="RenderShadowResolutionScale" +decimal_digits="1" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +increment="0.5" +initial_value="2.0" +min_val="1.0" +max_val="8.0" +label_width="2" +> +</slider> + +<icon +name="mp_shadowdd_bullet" +tool_tip="Move to the right to improve quality: High memory usage and potentially unstable on lower end gpus" +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_shadowdd_info_bullet" +tool_tip="Improves the shadow map resolution (Use carefully)" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="shadow_res_lbl" +tool_tip="Shadow smoothness (This will only work if you activate Ambient Occlusion)" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall" +> +Shadows Smoothness +</text> + +<slider +name="shadowBlurCtrl" +control_name="RenderShadowBlurSize" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +increment="0.1" +initial_value="1.0" +min_val="0.0" +max_val="3.0" +decimal_digits="1" +label_width="2" +> +</slider> + +<icon +name="mp_shadowsblur_bullet" +tool_tip="No performance impact" +image_name="mp_blue_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_shadowsblur_info_bullet" +tool_tip="Adjust the shadow smoothness. This only works if SSAO is turned on" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="shadow_ssao_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="20" +top_pad="40" +font="SansSerifSmall" +text_color="White" +> +Ambient Occlusion +</text> + +<check_box +name="mp_ssao_ctrl" +control_name="RenderDeferredSSAO" +label="Screen Space Ambient Occlusion" +layout="topleft" +width="200" +height="16" +left="20" +top_delta="32" +initial_value="true" +> +<check_box.commit_callback +function="Pref.RenderOptionUpdate" /> +</check_box> + +<icon +name="mp_ssao_bullet" +tool_tip="Low to Medium performance impact" +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_ssao_info_bullet" +tool_tip="Adds some shadow based on surface proximity." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +</panel> + +<panel +label="Bloom" +name="preferences_visuals_bloom" +layout="topleft" +follows="top|left"> + +<text +name="mp_bloom_lbl" +follows="left|top" +layout="topleft" +width="200" +height="18" +left="20" +top_pad="20" +font="SansSerifSmall" +text_color="White" +> +Bloom (experimental) +</text> + +<text +name="mp_bloom_level_lbl" +tool_tip="Bloom Level: The higher, the more diffuse (medium gpu cost)\n Note: This setting can fix a performance issue when antialiasing is turned on)" +type="string" +length="1" +follows="left|top" +width="140" +height="16" +layout="topleft" +left="32" +top_pad="20" +text_readonly_color="LabelDisabledColor" +> +Bloom level: +</text> + +<combo_box +name="MPBloomCtrl" +control_name="MPRenderBloom" +layout="topleft" +width="150" +height="18" +left_delta="150" +top_delta="0" +> +<combo_box.item +label="None" +name="0" +value="0"/> +<combo_box.item +label="Level 1" +name="1" +value="1"/> +<combo_box.item +label="Level 2" +name="2" +value="2"/> +<combo_box.item +label="Level 3" +name="3" +value="3"/> +</combo_box> + +<icon +name="mp_blooml_bullet" +tool_tip="Low to Medium performance impact" +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="55" +top_delta="-2" +/> + +<icon +name="mp_blooml_info_bullet" +tool_tip="Bloom adds a glowing effect around the brightest areas. The level affects the number of iterations, and the quality." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="bloom_radius_lbl" +tool_tip="Bloom Radius" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="20" +font="SansSerifSmall" +> +Bloom Radius +</text> + +<slider +name="MPBloomRadiusCtrl" +control_name="MPBloomBlurRadius" +decimal_digits="2" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +increment="0.01" +initial_value="1.0" +label_width="2" +min_val="0.0" +max_val="3.0" +> +</slider> + +<icon +name="mp_bloomr_bullet" +tool_tip="No performance impact" +image_name="mp_blue_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_bloomr_info_bullet" +tool_tip="Adjust the base radius of the effect" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="bloom_radiusadd_lbl" +tool_tip="Bloom Radius addition" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="20" +font="SansSerifSmall" +> +Bloom Radius addition +</text> + +<slider +name="MPBloomRadiusAddCtrl" +control_name="MPBloomBlurRadiusAdd" +decimal_digits="2" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +increment="0.01" +initial_value="1.0" +label_width="2" +min_val="-3.0" +max_val="3.0" +> +</slider> + +<icon +name="mp_bloomra_bullet" +tool_tip="No performance impact" +image_name="mp_blue_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_bloomra_info_bullet" +tool_tip="Adjust the added radius for each iteration" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="bloom_extract_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="20" +font="SansSerifSmall" +> +Bloom Range +</text> + +<slider +name="MPBloomRangeCtrl" +control_name="MPBloomExtractBrightness" +decimal_digits="2" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +increment="0.025" +initial_value="0.1" +label_width="2" +min_val="0.0" +max_val="0.5" +> +</slider> + +<icon +name="mp_bloomrange_bullet" +tool_tip="No performance impact" +image_name="mp_blue_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_bloomrange_info_bullet" +tool_tip="When moved to the right, it will take more of the bright areas." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="bloom_strength_lbl" +tool_tip="Bloom: Strength of the effect (no performance impact)" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="20" +font="SansSerifSmall"> +Bloom Strength +</text> + +<slider +name="MPBloomStrCtrl" +control_name="MPBloomStrength" +decimal_digits="1" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +increment="0.1" +initial_value="1.0" +min_val="0.5" +max_val="4.0" +label_width="2" +> +</slider> + +<icon +name="mp_bloomstr_bullet" +tool_tip="No performance impact" +image_name="mp_blue_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_bloomstr_info_bullet" +tool_tip="Controls the effect strength" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="bloom_metal_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="20" +font="SansSerifSmall" +> +Bloom Metal +</text> + +<slider +name="MPBloomMetalCtrl" +control_name="MPBloomExtractMetal" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +increment="0.05" +initial_value="0.2" +decimal_digits="2" +min_val="0.0" +max_val="1.0" +label_width="2" +> +</slider> + +<icon +name="mp_bloommetal_bullet" +tool_tip="No performance impact" +image_name="mp_blue_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_bloommetal_info_bullet" +tool_tip="When moved to the right, the effect will apply on more metallic surfaces." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="bloom_nonmetal_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="20" +font="SansSerifSmall"> +Bloom Non Metal +</text> + +<slider +name="MPBloomNonMetalCtrl" +control_name="MPBloomExtractNonMetal" +layout="topleft" +follows="left|top" +width="200" +height="16" +left_delta="150" +top_delta="-1" +increment="0.05" +initial_value="0.2" +label_width="2" +decimal_digits="2" +min_val="0.0" +max_val="1.0" +> +</slider> + +<icon +name="mp_bloomnonmet_bullet" +tool_tip="No performance impact" +image_name="mp_blue_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_bloomnonmet_info_bullet" +tool_tip="When moved to the right, the effect will apply on more non-metallic surfaces." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +</panel> + +<panel +name="preferences_visuals_probes" +label="Probes" +layout="topleft" +follows="top|left" +> + +<text +name="mp_probes_lbl" +follows="left|top" +layout="topleft" +width="100" +height="18" +left="20" +top_pad="20" +font="SansSerifSmall" +text_color="White" +> +Reflection Probes +</text> + +<icon +name="mp_probedetail_info_bullet" +tool_tip="Reflection probes are a fundamental part of how pbr lighting is calculated" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="probes_detail_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="20" +font="SansSerifSmall" +> +Reflection Detail: +</text> + +<combo_box +name="mp_probes_detail_ctrl" +control_name="RenderReflectionProbeDetail" +layout="topleft" +width="150" +height="18" +left_delta="150" +top_delta="0" +> +<combo_box.item +label="Static Only" +name="0" +value="0"/> +<combo_box.item +label="Static+Dynamic" +name="1" +value="1"/> +<combo_box.item +label="Realtime" +name="2" +value="2"/> +</combo_box> + +<icon +name="mp_probedetail_bullet" +tool_tip="High to extreme performance impact" +image_name="mp_red_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="55" +top_delta="-2" +/> + +<icon +name="mp_probedetail_info_bullet" +tool_tip="Controls how often the reflection probes update with the surrounding. We recommend Static Only for daily usage (specially on Mac)" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="probes_coverage_lbl" +tool_tip="Reflection probes level (Important memory usage and performance penalty)" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="20" +font="SansSerifSmall" +> +Reflection Coverage: +</text> + +<combo_box +name="probes_level_ctrl" +control_name="RenderReflectionProbeLevel" +layout="topleft" +width="150" +height="18" +left_delta="150" +top_delta="0" +> +<combo_box.item +label="None" +name="0" +value="0"/> +<combo_box.item +label="Manual only" +name="1" +value="1"/> +<combo_box.item +label="Manual + terrain" +name="2" +value="2"/> +<combo_box.item +label="Full scene" +name="3" +value="3"/> +</combo_box> + +<icon +name="mp_probedetail_bullet" +tool_tip="Medium to High performance impact" +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="55" +top_delta="-2" +/> + +<icon +name="mp_probedetail_info_bullet" +tool_tip="Controls what part of the surrounding the reflections probes are capturing. We recommend Manual only." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="probes_count_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="20" +font="SansSerifSmall" +> +Max Reflection Probes: +</text> + +<combo_box +name="mp_probes_count_ctrl" +control_name="RenderReflectionProbeCount" +label="Max. Reflection Probes:" +layout="topleft" +width="150" +height="18" +left_delta="150" +top_delta="0" +> +<combo_box.item +label="None" +name="1" +value="1"/> +<combo_box.item +label="Low" +name="32" +value="32"/> +<combo_box.item +label="Medium" +name="64" +value="64"/> +<combo_box.item +label="High" +name="128" +value="128"/> +<combo_box.item +label="Ultra" +name="256" +value="256"/> +</combo_box> + +<icon +name="mp_probecount_bullet" +tool_tip="Medium to High performance and memory usage impact" +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="55" +top_delta="-2" +/> + +<icon +name="mp_probecount_info_bullet" +tool_tip="Limits the maximum number of active reflections probes" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="probes_res_lbl" +tool_tip="Sets the resolution used to calculate the probes (Important to extreme video memory impact and performance)" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="20" +font="SansSerifSmall" +> +Reflection Resolution: +</text> + +<combo_box +name="ProbeResCtrl" +control_name="RenderReflectionProbeResolution" +layout="topleft" +width="150" +height="18" +left_delta="150" +top_delta="0" +> +<combo_box.item +label="Low" +name="low" +value="64"/> +<combo_box.item +label="Default" +name="default" +value="128"/> +<combo_box.item +label="High" +name="high" +value="256"/> +<combo_box.item +label="Maximum" +name="maximum" +value="512"/> +</combo_box> + +<icon +name="mp_proberes_bullet" +tool_tip="Medium to Extreme performance and memory usage impact" +image_name="mp_red_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="55" +top_delta="-2" +/> + +<icon +name="mp_proberes_info_bullet" +tool_tip="Improves the quality of the probes" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="mp_probe_dd_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="20" +font="SansSerifSmall" +> +Draw Distance +</text> + +<slider +control_name="RenderReflectionProbeDrawDistance" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +initial_value="32" +min_val="8" +max_val="64" +increment="8" +decimal_digits="0" +label_width="2"> +</slider> + +<icon +name="mp_probedd_bullet" +tool_tip="Medium to High performance impact" +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_probedd_info_bullet" +tool_tip="Controls the draw distance at which the probes are calculating the surrounding" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="mp_probe_ud_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="32" +font="SansSerifSmall" +> +Default Probe Update +</text> + +<slider +control_name="RenderDefaultProbeUpdatePeriod" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +initial_value="15" +increment="1" +min_val="2" +max_val="60" +decimal_digits="0" +label_width="2" +> +</slider> + +<icon +name="mp_dprobeperiod_bullet" +tool_tip="When moved to the right, the performance will improve." +image_name="mp_green_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_dprobeperiod_info_bullet" +tool_tip="Controls how the default probe update is delayed." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="mp_probe_ud_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="20" +font="SansSerifSmall" +> +Other Probes delay +</text> + +<slider +name="MPProbeUpdCtrl" +control_name="MPRenderProbeUpdatePeriod" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +initial_value="15" +increment="1" +min_val="0" +max_val="60" +decimal_digits="0" +label_width="2" +> +</slider> + +<icon +name="mp_probeperiod_bullet" +tool_tip="When moved to the right, the performance will improve." +image_name="mp_green_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_probeperiod_info_bullet" +tool_tip="Controls how each probe update is delayed." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="mp_probe_slow_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="20" +font="SansSerifSmall" +> +Refresh delay +</text> + +<slider +name="MPProbeSlowCtrl" +control_name="MPRenderProbeSlowDown" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +initial_value="0.01" +increment="0.01" +min_val="0" +max_val="0.2" +decimal_digits="2" +label_width="2"> +</slider> + +<icon +name="mp_probeslowdown_bullet" +tool_tip="When moved to the right, the performance will improve." +image_name="mp_green_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_probeslowdown_info_bullet" +tool_tip="Controls how often the probes update process is called. When moved to the right, the update be slower." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +</panel> + +<panel +label="Quality" +name="preferences_visuals_others" +layout="topleft" +follows="top|left"> + +<text +name="mp_aa_lbl" +follows="left|top" +layout="topleft" +top_pad="20" +width="400" +height="18" +left="20" +font="SansSerifSmall" +text_color="White" +> +Visual Quality Settings: +</text> + +<check_box +name="VintageCtrl" +control_name="RenderDisableVintageMode" +label="HDR and Emissive" +layout="topleft" +width="360" +height="16" +left="20" +top_delta="32" +initial_value="false" +> +<check_box.commit_callback +function="Pref.RenderOptionUpdate" /> +</check_box> + +<icon +name="mp_hdr_bullet" +tool_tip="Low to Medium performance impact. We recommend it ON, unless you are using a weaker/older computer." +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="8" +top_delta="-2" +/> + +<icon +name="mp_hdr_info_bullet" +tool_tip="Enables Higher color fidelity, and several other post-processing effects." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<check_box +name="mp_transparent_water" +control_name="RenderTransparentWater" +label="Transparent Water" +layout="topleft" +width="360" +height="16" +left="20" +top_delta="32" +initial_value="true" +> +<check_box.commit_callback +function="Pref.RenderOptionUpdate" /> +</check_box> + +<icon +name="mp_twater_bullet" +tool_tip="Low to Medium performance impact. We recommend it ON, unless you are using a weaker/older computer." +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="8" +top_delta="-2" +/> + +<icon +name="mp_twater_info_bullet" +tool_tip="Enables higher quality water with transparency." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="mp_texlod_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="24" +top_pad="20" +font="SansSerifSmall" +> +Texture Max Resolution: +</text> + +<combo_box +name="MaxTextureResolutionCtrl" +control_name="RenderMaxTextureResolution" +height="19" +layout="topleft" +left_delta="150" +top_delta="0" +width="90"> +<combo_box.item +label="128x128" +name="128" +value="128"/> +<combo_box.item +label="256x256" +name="256" +value="256"/> +<combo_box.item +label="512x512" +name="512" +value="512"/> +<combo_box.item +label="1024x1024" +name="1024" +value="1024"/> +<combo_box.item +label="2048x2048" +name="2048" +value="2048"/> +</combo_box> + +<icon +name="mp_texlod_bullet" +tool_tip="Lowering this value will greatly help with gpus with lower vram." +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="124" +top_delta="-2" +/> + +<icon +name="mp_texlod_info_bullet" +tool_tip="Set this to a lower value if you have stutter in texture heavy sims." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="mp_meshlod_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="24" +top_pad="20" +font="SansSerifSmall" +> +Object Mesh LOD: +</text> + +<slider +name="MeshLoadCtrl" +control_name="RenderVolumeLODFactor" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="156" +top_delta="-1" +initial_value="160" +increment="0.125" +min_val="0.125" +max_val="4" +show_text="true" +decimal_digits="3" +> +</slider> + +<icon +name="mp_meshlod_bullet" +tool_tip="Better make this value higher than making the draw distance higher" +image_name="mp_green_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="8" +top_delta="-2" +/> + +<icon +name="mp_meshlod_info_bullet" +tool_tip="Controls the mesh complexity calculation vs the view distance" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="mp_resdiv_lbl" +follows="left|top" +layout="topleft" +width="400" +height="18" +left="24" +top_pad="30" +font="SansSerifSmall" +> +Resolution divisor +</text> + +<slider +control_name="RenderResolutionDivisor" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="156" +top_delta="-1" +initial_value="1.0" +increment="0.05" +min_val="0.75" +max_val="2.0" +decimal_digits="2" +label_width="2"> +</slider> + +<icon +name="mp_resdiv_bullet" +tool_tip="Move to the right to improve performance. Set to 1.0 for default." +image_name="mp_green_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="8" +top_delta="-2" +/> + +<icon +name="mp_resdiv_info_bullet" +tool_tip="Moving this to a value superior to 1.0 will lower the rendering resolution. Set to 1.0 for default." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + + +</panel> + +<panel +label="For nerds" +name="preferences_visuals_others" +layout="topleft" +follows="top|left"> + +<text +follows="left|top" +layout="topleft" +top_pad="20" +width="400" +height="18" +left="20" +font="SansSerifSmall" +text_color="White" +> +Advanced settings: +</text> + +<check_box +name="MultiTexCtrl" +control_name="RenderGLMultiThreadedTextures" +label="Multithreaded Textures (needs restart)" +layout="topleft" +width="400" +height="16" +left="20" +top_delta="32" +initial_value="false" +> +</check_box> + +<icon +name="mp_multitex_bullet" +tool_tip="Improves textures loading performance on certain hardware. But can be unstable!! Don't enable this on Linux and don't use it with Apple Multithreaded OpenGL activated." +image_name="mp_red_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_multitex_info_bullet" +tool_tip="Enables loading textures using multiple threads. Use with extreme caution! it's unstable." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<check_box +name="AppleMultGLCtrl" +control_name="RenderAppleUseMultGL" +label="Apple Multithreaded OpenGL" +layout="topleft" +width="400" +height="16" +left="20" +top_delta="32" +initial_value="false" +> +</check_box> + +<icon +name="mp_applemulti_bullet" +tool_tip="Variable performance impact. Can be unstable!" +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_applemulti_info_bullet" +tool_tip="Enables Apple OpenGL Multithreaded optimisations. Can be unstable!!" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="color_precision_lbl" +follows="left|top" +layout="topleft" +width="200" +height="18" +left="32" +top_pad="20" +font="SansSerifSmall" +> +Color precision (needs restart): +</text> + +<combo_box +name="colorPrecisionCtrl" +control_name="MPColorPrecision" +layout="topleft" +width="80" +height="18" +left_pad="8" +top_delta="0" +> +<combo_box.item +label="Low" +name="low" +value="1"/> +<combo_box.item +label="Default" +name="default" +value="0"/> +<combo_box.item +label="High" +name="high" +value="2"/> +</combo_box> + +<icon +name="mp_lowcolor_bullet" +tool_tip="Low setting can help performance specially in high resolution" +image_name="mp_green_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="104" +top_delta="-2" +/> + +<icon +name="mp_lowcolor_info_bullet" +tool_tip="Sets the internal color resolution. Influences the speed or quality." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +follows="left|top" +layout="topleft" +top_pad="30" +width="400" +height="18" +left="20" +font="SansSerifSmall" +text_color="White" +> +HDR Display (Experimental - Mac only): +</text> + +<icon +name="mp_hdrd_bullet" +tool_tip="You need an Apple hdr/xdr display" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<text +follows="left|top" +layout="topleft" +width="400" +height="18" +left="20" +top_pad="12" +font="SansSerifSmall" +text_color="White" +> +Warning: HDR shows extreme luminosity contrast. Use carefully! +</text> + +<check_box +name="HDRDisplayCtrl" +control_name="MPHDRDisplay" +label="HDR Display (Mac) - needs restart" +layout="topleft" +width="400" +height="16" +left="20" +top_delta="32" +initial_value="true" +> +</check_box> + +<icon +name="mp_hdrd2_bullet" +tool_tip="Medium performance impact" +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_hdrd2_info_bullet" +tool_tip="Make sure your color profile is Apple XDR" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="mp_hdrd_gamma_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="16" +font="SansSerifSmall" +> +Gamma +</text> + +<slider +control_name="MPHDRGamma" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +initial_value="2.2" +increment="0.05" +min_val="1.8" +max_val="2.6" +decimal_digits="2" +label_width="2"> +</slider> + +<text +follows="left|top" +layout="topleft" +top_pad="30" +width="400" +height="18" +left="20" +font="SansSerifSmall" +text_color="White" +> +Developer settings: +</text> + +<check_box +name="NoGLDebugCtrl" +control_name="MPNoGLDebug" +label="No GL Debug" +layout="topleft" +width="400" +height="16" +left="20" +top_delta="32" +initial_value="true" +> +</check_box> + +<icon +name="mp_nodebug_bullet" +tool_tip="Leave this always to ON for optimal performance" +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_nodebug_info_bullet" +tool_tip="Ensures there is no opengl debug. This should be set to ON!" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<check_box +name="MPAppleVBModeCtrl" +control_name="MPVertexBufferMode" +label="Alternative Vertex Buffer Mode (Mac only / needs restart)" +layout="topleft" +width="400" +height="16" +left="20" +top_delta="32" +initial_value="false" +> +</check_box> + +</panel> + + +</tab_container> + +</panel>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/panel_preferences_move.xml b/indra/newview/skins/default/xui/en/panel_preferences_move.xml index 8202bb9de3..eee55bd7bc 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_move.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_move.xml @@ -113,7 +113,7 @@ control_name="ArrowKeysAlwaysMove" follows="left|top" height="20" - label="Arrow keys always move me" + label="Arrow keys always move me while in chat" layout="topleft" left_delta="5" name="arrow_keys_move_avatar_check" @@ -202,9 +202,43 @@ height="10" layout="topleft" left="86" - name="single_click_action_lbl" + name="mouse_warp_lbl" width="150" top_pad="20"> + Mouse Warp: + </text> + <combo_box + control_name="MouseWarpMode" + height="23" + layout="topleft" + left_pad="10" + top_delta="-6" + name="mouse_warp_combo" + tool_tip="Controls warping of the mouse to the center of the screen during alt-zoom and mouse look." + width="200"> + <combo_box.item + label="Automatic" + name="0" + value="0"/> + <combo_box.item + label="On" + name="1" + value="1"/> + <combo_box.item + label="Off" + name="2" + value="2"/> + </combo_box> + <text + follows="left|top" + type="string" + length="1" + height="10" + layout="topleft" + left="86" + name="single_click_action_lbl" + width="150" + top_pad="12"> Single click on land: </text> <combo_box @@ -266,7 +300,7 @@ layout="topleft" left="83" name="sound_on_collisions" - top_pad="10" + top_pad="0" width="200" /> <check_box control_name="DoubleClickZoomIn" @@ -275,7 +309,7 @@ layout="topleft" left="83" name="double_click_zoom_in" - top_pad="10" + top_pad="0" width="200" /> <button height="23" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml index 5041fb4878..1c00837073 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -1,15 +1,31 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel + <panel border="true" follows="left|top|right|bottom" - height="408" - label="Communication" + height="438" + label="Privacy" layout="topleft" left="102" - name="im" + name="Privacy panel" top="1" width="517"> + <tab_container + top_pad="0" + enabled="true" + follows="left|top" + height="430" + width="517" + left_delta="0" + name="privacy_tab_container" + tab_position="top" + tab_stop="false"> + <panel + label="General" + name="privacy_preferences_general" + layout="topleft" + follows="top|left"> + <panel.string name="log_in_to_change"> log in to change @@ -63,7 +79,7 @@ name="online_visibility" top_pad="30" width="350" /> - + <check_box enabled_control="EnableVoiceChat" control_name="AutoDisengageMic" @@ -74,6 +90,37 @@ name="auto_disengage_mic_check" top_pad="10" width="350" /> + <check_box + control_name="EnableLookAtTarget" + height="16" + label="Enable LookAt" + tool_tip="Enable tracking cursor position with avatar head's rotation" + layout="topleft" + left="30" + name="enable_lookat_target" + top_pad="10" + width="350" /> + <check_box + enabled_control="EnableLookAtTarget" + control_name="LimitLookAtTarget" + height="16" + label="Limit LookAt Distance" + tool_tip="Limit the look at target's distance by restricting it around the avatar's head" + layout="topleft" + left="50" + name="limit_lookat_distance" + top_pad="10" + width="350" /> + <check_box + control_name="EnableSelectionHints" + height="16" + label="Enable Selection Hints" + tool_tip="Enable reporting and tracking current selection using 'beam' particles and character animations" + layout="topleft" + left="30" + name="enable_selection_hints" + top_pad="10" + width="350" /> <button follows="left|top" height="23" @@ -103,3 +150,48 @@ (People and/or Objects you have blocked) </text> </panel> + + <panel + label="Discord" + name="privacy_preferences_discord" + layout="topleft" + follows="top|left"> + + <check_box + control_name="EnableDiscord" + height="16" + enabled="true" + label="Enable Discord integration" + layout="topleft" + left="30" + name="enable_discord" + top_pad="20" + width="350" /> + + <check_box + enabled_control="EnableDiscord" + control_name="ShowDiscordActivityDetails" + height="16" + enabled="true" + label="Show avatar name" + layout="topleft" + left="30" + name="show_name" + top_pad="20" + width="350" /> + + <check_box + enabled_control="EnableDiscord" + control_name="ShowDiscordActivityState" + height="16" + enabled="false" + label="Show location" + layout="topleft" + left="30" + name="show_location" + top_pad="20" + width="350" /> + </panel> + </tab_container> + +</panel> 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 53ae764ba6..52413abe74 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -62,20 +62,9 @@ name="mute_when_minimized" top_delta="3" left_pad="5" - width="20" /> - <!-- *HACK - After storm-1109 will be fixed: instead of using this text_box, word_wrap should be applied for "mute_when_minimized" check_box's label.--> - <text - follows="top|left" - height="15" - layout="topleft" - left_pad="0" - name="mute_chb_label" - top_delta="-1" - width="150" - wrap="true"> - Mute when minimized - </text> + width="20" + label="Mute when minimized" + word_wrap="true"/> <slider control_name="AudioLevelUI" disabled_control="MuteAudio" @@ -321,104 +310,45 @@ left_pad="5" name="enable_voice_check" width="110"/> - <!-- --> <text type="string" length="1" follows="left|top" layout="topleft" left="23" - top_delta="22" + top_delta="25" name="Listen media from" height="15" - word_wrap="true" - width="112"> - Hear media and sounds from: + width="165" + halign="right"> + Hear media and sounds from </text> - <radio_group + <combo_box control_name="MediaSoundsEarLocation" follows="left|top" - top_delta="-6" layout="topleft" left_pad="5" - width="360" - height="40" - name="media_ear_location"> - <radio_item - height="19" - label="Camera position" - follows="left|top" - layout="topleft" - name="0" - width="200"/> - <radio_item - height="19" - follows="left|top" - label="Avatar position" - layout="topleft" - left_delta="0" - name="1" - top_delta ="18" - width="200" /> - </radio_group> - <text - type="string" - length="1" - follows="left|top" - layout="topleft" - left="270" - top_delta="6" - name="Listen from" - width="112"> - Hear voice from: - </text> - <radio_group - enabled_control="EnableVoiceChat" - control_name="VoiceEarLocation" - follows="left|top" - layout="topleft" - left_pad="2" - top_delta="-6" - width="360" - height="40" - name="ear_location"> - <radio_item - height="19" + width="130" + height="23" + top_delta="-4" + name="media_ear_location_combo"> + <item label="Camera position" - follows="left|top" - layout="topleft" - name="0" - width="200"/> - <radio_item - height="19" - follows="left|top" + name="camera_position" + value="0" /> + <item label="Avatar position" - layout="topleft" - left_delta="0" - name="1" - top_delta ="18" - width="200" /> - </radio_group> - <check_box - name="media_show_on_others_btn" - control_name="MediaShowOnOthers" - value="true" - follows="left|top" - layout="topleft" - height="15" - top_pad="8" - tool_tip="Uncheck this to hide media attached to other avatars nearby" - label="Play media attached to other avatars" - left="20" - width="230"/> + name="avatar_position" + value="1" /> +</combo_box> <text follows="left|top" layout="topleft" height="15" left="23" - top_pad="8" - width="120" - name="media_autoplay_label"> + width="165" + name="media_autoplay_label" + halign="right"> Auto-play media </text> <combo_box @@ -427,10 +357,10 @@ follows="left|top" layout="topleft" height="23" - left_pad="-15" + left_delta="170" top_delta="-4" name="media_auto_play_combo" - width="115"> + width="130"> <item label="Never" name="autoplay_disabled" @@ -444,50 +374,106 @@ name="autoplay_ask" value="2"/> </combo_box> + <text + follows="left|top" + layout="topleft" + height="15" + left="23" + width="165" + name="media_firstinteract_label" + halign="right"> + Media first-interact + </text> + <combo_box + control_name="MediaFirstClickInteract" + enabled_control="AudioStreamingMedia" + follows="left|top" + layout="topleft" + height="23" + left_delta="170" + top_delta="-4" + width="130" + name="media_first_interact_combo" + tool_tip="This setting controls which media (once loaded) does not require a first click to focus before interaction can begin. This allows clicks to be passed directly to media bypassing the focus click requirement. Each option also inherits the previous ones."> + <item + label="Disabled" + name="media_first_click_none" + value="0"/> + <item + label="Worn HUDs only" + name="media_first_click_hud" + value="1"/> + <item + label="Owned objects" + name="media_first_click_own" + value="3"/> + <item + label="Friends' objects" + name="media_first_click_friend" + value="7"/> + <item + label="Group objects" + name="media_first_click_group" + value="15"/> + <item + label="Landowner objects" + name="media_first_click_land" + value="31"/> + <item + label="Anyone's objects" + name="media_first_interact_any" + value="32767"/> + <item + label="All MOAP" + name="media_first_click_all" + value="65535"/> + </combo_box> + <check_box + name="media_show_on_others_btn" + control_name="MediaShowOnOthers" + enabled_control="AudioStreamingMedia" + value="true" + follows="left|top" + tool_tip="Uncheck this to hide media attached to other avatars nearby" + label="Play media attached to other avatars" + left="23" + width="15" + top_delta="30" + height="15"/> <check_box - control_name="StreamNotificationChannelEnabled" - height="30" - label="Custom stream notification channel" - layout="topleft" - left="20" - name="stream_notification_channel_enabled" - top_pad="-10" - width="256"> - </check_box> - <spinner - control_name="StreamNotificationChannel" - enabled_control="StreamNotificationChannelEnabled" - decimal_digits="0" - follows="left|top" - height="30" - increment="1" - initial_value="751751" - label="Channel number:" - label_width="105" - layout="topleft" - left_pad="0" - max_val="2147483647" - min_val="-2147483648" - name="stream_notification_channel" - top_pad="-20" - width="170" /> + name="media_huds_autoplay" + control_name="MediaAutoPlayHuds" + enabled_control="AudioStreamingMedia" + value="true" + follows="left|top" + layout="topleft" + tool_tip="Uncheck this to make HUDs follow the standard media auto-play setting" + label="Auto-play media attached to your HUD" + left="260" + top_pad="-15" + width="15" + height="15"/> <text layout="topleft" + follows="left" height="15" - left="260" - top_pad="-48" - width="100" - name="noise_suppression_label"> - Noise suppression + width="165" + name="noise_suppression_label" + left="23" + top_delta="22" + halign="right"> + Microphone Noise Suppression </text> <combo_box control_name="VoiceNoiseSuppressionLevel" + enabled_control="EnableVoiceChat" + follows="left|top" layout="topleft" + left_delta="170" + top_delta="-6" + width="130" height="23" - left_pad="10" - top_pad="-20" - name="noise_suppression_combo" - width="80"> + name="noise_suppression_combo"> <item label="Off" name="noise_suppression_none" @@ -509,21 +495,52 @@ name="noise_suppression_max" value="4"/> </combo_box> - <text> -<!-- spacer --> + <text + type="string" + length="1" + follows="left|top" + layout="topleft" + left="23" + top_delta="30" + name="Listen from" + width="165" + height="15" + halign="right"> + Hear voice from </text> + <combo_box + enabled_control="EnableVoiceChat" + control_name="VoiceEarLocation" + follows="left|top" + layout="topleft" + left_delta="170" + top_delta="-6" + width="130" + height="23" + name="ear_location_combo"> + <item + label="Camera position" + name="camera_position" + value="0" /> + <item + label="Avatar position" + name="avatar_position" + value="1" /> +</combo_box> <check_box control_name="LipSyncEnabled" - follows="top|left" + enabled_control="EnableVoiceChat" + follows="left|top" height="15" label="Move avatar lips when speaking" layout="topleft" left="20" name="enable_lip_sync" - top_pad="10" + top_pad="8" width="237"/> <check_box control_name="VoiceEchoCancellation" + enabled_control="EnableVoiceChat" height="15" tool_tip="Check to enable voice echo cancellation" label="Echo Cancellation" @@ -546,6 +563,7 @@ top_pad="5"/> <check_box control_name="VoiceAutomaticGainControl" + enabled_control="EnableVoiceChat" height="15" tool_tip="Check to enable automatic gain control" label="Automatic Gain Control" @@ -567,6 +585,7 @@ left="20"/> <check_box control_name="VoiceVisualizerEnabled" + enabled_control="EnableVoiceChat" height="15" tool_tip="Check to show voice dot indicator above avatars" label="Show voice dot above avatars" @@ -577,6 +596,7 @@ width="200"/> <button control_name="ShowDeviceSettings" + enabled_control="EnableVoiceChat" follows="left|top" height="23" is_toggle="true" diff --git a/indra/newview/skins/default/xui/en/panel_profile_firstlife.xml b/indra/newview/skins/default/xui/en/panel_profile_firstlife.xml index 6554dd0952..831b631505 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_firstlife.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_firstlife.xml @@ -22,7 +22,6 @@ <profile_image name="real_world_pic" image_name="Generic_Person_Large" - show_loading="false" follows="top|left" layout="topleft" top="10" diff --git a/indra/newview/skins/default/xui/en/panel_profile_pick.xml b/indra/newview/skins/default/xui/en/panel_profile_pick.xml index 024120931f..4f441b9b49 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_pick.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_pick.xml @@ -200,6 +200,26 @@ <layout_panel follows="all" + layout="bottomleft" + left_pad="2" + name="set_to_curr_location_btn_lp" + auto_resize="false" + width="100"> + <button + name="set_to_curr_location_btn" + label="Set Location" + tool_tip="Set to Current Location" + left="0" + top="0" + height="23" + width="100" + follows="left|top" + layout="topleft" + /> + </layout_panel> + + <layout_panel + follows="all" layout="topleft" name="util_resizer_right" auto_resize="true" diff --git a/indra/newview/skins/default/xui/en/panel_profile_secondlife.xml b/indra/newview/skins/default/xui/en/panel_profile_secondlife.xml index e361a0f28c..4d4c7f2252 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_secondlife.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_secondlife.xml @@ -74,7 +74,6 @@ Account: [ACCTTYPE] <profile_image name="2nd_life_pic" image_name="Generic_Person_Large" - show_loading="false" layout="topleft" follows="all" interactable="true" @@ -191,7 +190,7 @@ Account: [ACCTTYPE] visible="false"> <icon name="badge_icon" - image_name="Beta_Tester" + image_name="Profile_Badge_Beta" layout="topleft" follows="left|top" top="10" diff --git a/indra/newview/skins/default/xui/en/panel_progress.xml b/indra/newview/skins/default/xui/en/panel_progress.xml index 6b19907372..9f1f741b52 100644 --- a/indra/newview/skins/default/xui/en/panel_progress.xml +++ b/indra/newview/skins/default/xui/en/panel_progress.xml @@ -44,9 +44,9 @@ width="670" /> <layout_panel auto_resize="false" - height="220" + height="255" layout="topleft" - min_height="220" + min_height="255" name="panel4" width="670"> <icon @@ -56,11 +56,11 @@ layout="topleft" left="0" top="0" - height="220" + height="255" width="670" /> <layout_stack follows="left|right|top|bottom" - height="220" + height="255" layout="topleft" left="0" orientation="vertical" @@ -70,6 +70,14 @@ width="670"> <layout_panel auto_resize="false" + height="30" + layout="topleft" + min_height="30" + name="panel_top_spacer" + width="670"> + </layout_panel> + <layout_panel + auto_resize="false" height="100" layout="topleft" min_height="100" @@ -134,6 +142,30 @@ right="-90" word_wrap="true"/> </layout_panel> + <layout_panel + auto_resize="false" + height="40" + layout="topleft" + min_height="40" + name="panel_icons" + width="670"> + <!--Logos are tied to following label from code--> + <text + follows="left|right|top" + layout="topleft" + font="SansSerifLarge" + font_shadow="none" + halign="left" + height="16" + width="240" + left="47" + top="6" + line_spacing.pixels="2" + name="logos_lbl" + text_color="LoginProgressBoxTextColor"> + Megapahit uses + </text> + </layout_panel> </layout_stack> </layout_panel> <layout_panel diff --git a/indra/newview/skins/default/xui/en/panel_settings_sky_clouds.xml b/indra/newview/skins/default/xui/en/panel_settings_sky_clouds.xml index 7687f7cd96..23bbf45e88 100644 --- a/indra/newview/skins/default/xui/en/panel_settings_sky_clouds.xml +++ b/indra/newview/skins/default/xui/en/panel_settings_sky_clouds.xml @@ -139,7 +139,7 @@ max_val_x="30" min_val_y="-30" max_val_y="30" - logarithmic="1"/> + logarithmic="true"/> <text name="cloud_image_label" diff --git a/indra/newview/skins/default/xui/en/panel_settings_sky_sunmoon.xml b/indra/newview/skins/default/xui/en/panel_settings_sky_sunmoon.xml index bd68434aab..34b48574d5 100644 --- a/indra/newview/skins/default/xui/en/panel_settings_sky_sunmoon.xml +++ b/indra/newview/skins/default/xui/en/panel_settings_sky_sunmoon.xml @@ -248,29 +248,13 @@ </layout_panel> <layout_panel - name="moon_layout" - border="false" + border="true" bevel_style="in" + name="moon_layout" auto_resize="true" user_resize="false" visible="true" height="400"> - <layout_stack - name="moon_stack" - left="5" - top="5" - right="-5" - bottom="-5" - follows="left|top|right|bottom" - orientation="vertical"> - <layout_panel - border="true" - bevel_style="in" - auto_resize="true" - user_resize="false" - visible="true" - name="moon_layout" - height="220"> <text name="moon_label" follows="left|top" @@ -423,9 +407,7 @@ name="moonbeacon" top_pad="5" left_delta="-8"/> - - </layout_panel> - </layout_stack> + </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_settings_water.xml b/indra/newview/skins/default/xui/en/panel_settings_water.xml index 5e65b0e8a2..ffea470cfc 100644 --- a/indra/newview/skins/default/xui/en/panel_settings_water.xml +++ b/indra/newview/skins/default/xui/en/panel_settings_water.xml @@ -247,7 +247,7 @@ Reflection Wavelet Scale </text> <slider - decimal_digits="1" + decimal_digits="2" follows="left|top" increment="0.01" height="16" @@ -261,7 +261,7 @@ width="150" can_edit_text="true"/> <slider - decimal_digits="1" + decimal_digits="2" follows="left|top" increment="0.01" initial_value="0.7" @@ -274,7 +274,7 @@ width="150" can_edit_text="true"/> <slider - decimal_digits="1" + decimal_digits="2" follows="left|top" increment="0.01" initial_value="0.7" @@ -378,7 +378,7 @@ initial_value="0" layout="topleft" left_delta="5" - min_val="-0.5" + min_val="0" max_val="0.5" name="water_blur_multip" top_pad="5" diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml index f8040b9a65..90bdea93fa 100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml @@ -60,7 +60,11 @@ name="Large(512x512)" value="[i512,i512]" /> <combo_box.item - label="Current Window(512x512)" + label="Huge (1024x1024)" + name="Huge(1024x1024)" + value="[i1024,i1024]" /> + <combo_box.item + label="Current Window" name="CurrentWindow" value="[i0,i0]" /> <combo_box.item @@ -119,6 +123,8 @@ type="string" word_wrap="true"> To save your image as a texture select one of the square formats. + +Upload cost: L$[UPLOAD_COST] </text> <button follows="right|bottom" diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_local.xml b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml index 52f9068264..fb88b752ae 100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_local.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml @@ -74,6 +74,10 @@ label="1600x1200" name="1600x1200" value="[i1600,i1200]" /> + <combo_box.item + label="2048x2048" + name="2048x2048" + value="[i2048,i2048]" /> <combo_box.item label="Custom" name="Custom" diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml index 3a7731d235..2fb02af61c 100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml @@ -31,7 +31,7 @@ image_overlay_alignment="left" image_top_pad="-1" imgoverlay_label_space="10" - label="Save to Inventory (L$[AMOUNT])" + label="Save to Inventory" layout="topleft" left_delta="0" name="save_to_inventory_btn" diff --git a/indra/newview/skins/default/xui/en/panel_sound_devices.xml b/indra/newview/skins/default/xui/en/panel_sound_devices.xml index 7598f7d7e5..b858d0ed02 100644 --- a/indra/newview/skins/default/xui/en/panel_sound_devices.xml +++ b/indra/newview/skins/default/xui/en/panel_sound_devices.xml @@ -20,6 +20,10 @@ name="name_default_system_device"> Default System Device </string> + <string + name="device_not_loaded"> + Device not loaded + </string> <icon follows="left|top" height="18" diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index 5e05eb2837..c58cf97f3e 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -21,10 +21,14 @@ Bandwidth </panel.string> <panel.string - name="time"> + name="time_ampm"> [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] </panel.string> <panel.string + name="time"> + [hour, datetime, slt]:[min, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] </panel.string> @@ -86,7 +90,7 @@ height="18" left="0" name="balance" - tool_tip="Click to refresh your L$ balance" + tool_tip="L$ [AMT] Click to refresh your L$ balance. Double-click to display or hide your L$ balance." v_pad="4" top="0" wrap="false" @@ -188,15 +192,21 @@ <button type="string" font="SansSerif" + image_unselected="mp_fpsButton" + image_selected="mp_fpsButton" + image_hover_unselected="mp_fpsButton" + image_pressed="mp_fpsButton" + image_pressed_selected="mp_fpsButton" + image_color="White" label_color="FpsTextColor" follows="right|top" halign="center" valign="center" height="18" top="1" - left_pad="4" + left_pad="2" name="FpsText" - tool_tip="fps" + tool_tip="fps: Color indicates frametime fluctuations (Green is optimal)" width="32"> 60 </button> diff --git a/indra/newview/skins/default/xui/en/panel_tools_texture.xml b/indra/newview/skins/default/xui/en/panel_tools_texture.xml index e80f315259..1c70383bf9 100644 --- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml +++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml @@ -123,6 +123,14 @@ name="checkbox fullbright" top_pad="4" width="81" /> + <check_box + height="19" + label="Hide water" + layout="topleft" + left="172" + top_delta="0" + name="checkbox_hide_water" + width="81" /> <view_border bevel_style="none" follows="top|left" @@ -721,8 +729,8 @@ label_width="205" layout="topleft" left="10" - min_val="-100" - max_val="100" + min_val="-10000" + max_val="10000" name="TexScaleU" top_pad="5" width="265" /> @@ -734,8 +742,8 @@ label_width="205" layout="topleft" left="10" - min_val="-100" - max_val="100" + min_val="-10000" + max_val="10000" name="TexScaleV" width="265" /> <spinner @@ -797,8 +805,8 @@ label_width="205" layout="topleft" left="10" - min_val="-100" - max_val="100" + min_val="-10000" + max_val="10000" name="bumpyScaleU" top_delta="-115" width="265" /> @@ -810,8 +818,8 @@ label_width="205" layout="topleft" left="10" - min_val="-100" - max_val="100" + min_val="-10000" + max_val="10000" name="bumpyScaleV" width="265" /> <spinner @@ -861,8 +869,8 @@ label_width="205" layout="topleft" left="10" - min_val="-100" - max_val="100" + min_val="-10000" + max_val="10000" name="shinyScaleU" top_delta="-115" width="265" /> @@ -874,8 +882,8 @@ label_width="205" layout="topleft" left="10" - min_val="-100" - max_val="100" + min_val="-10000" + max_val="10000" name="shinyScaleV" width="265" /> <spinner @@ -960,8 +968,8 @@ label_width="205" layout="topleft" left="10" - min_val="-100" - max_val="100" + min_val="-10000" + max_val="10000" name="gltfTextureScaleU" top_delta="34" width="265" /> @@ -973,11 +981,24 @@ label_width="205" layout="topleft" left="10" - min_val="-100" - max_val="100" + min_val="-10000" + max_val="10000" name="gltfTextureScaleV" width="265" /> <spinner + decimal_digits="1" + follows="left|top" + height="19" + initial_value="" + label="Repeats per meter" + layout="topleft" + label_width="205" + left="10" + max_val="100" + min_val="-100" + name="gltfRptctrl" + width="265" /> + <spinner follows="left|top" height="19" initial_value="0" diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml index c03fac4aad..3e9efb6f8b 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml @@ -64,7 +64,7 @@ width="333"> font="SansSerifSmall" text_color="EmphasisColor" width="300" - height="10" + height="13" follows="top|left|right" layout="topleft" left="35" @@ -94,7 +94,7 @@ width="333"> image_overlay="Edit_Wrench" label="" layout="topleft" - left="265" + right="-3" name="edit_outfit_btn" tool_tip="Edit this outfit" top="3" @@ -108,17 +108,100 @@ width="333"> top="6" width="24" /> </panel> - <filter_editor - height="23" - follows="left|top|right" - layout="topleft" - left="10" - label="Filter Outfits" - max_length_chars="300" - name="Filter" - search_button_visible="true" - top_pad="10" - width="307" /> + <layout_stack + animate="false" + border_size="0" + follows="left|top|right" + height="27" + layout="topleft" + orientation="horizontal" + top_pad="6" + left="0" + name="top_menu_panel" + width="320"> + <layout_panel + auto_resize="true" + layout="topleft" + name="filter_panel" + width="193"> + <filter_editor + text_pad_left="10" + follows="left|top|right" + font="SansSerifSmall" + height="23" + layout="topleft" + left="10" + label="Filter Outfits" + max_length_chars="300" + name="Filter" + search_button_visible="true" + tab_group="1" + top="3" + width="181" /> + </layout_panel> + <layout_panel + auto_resize="false" + height="25" + layout="topleft" + name="options_gear_btn_panel" + width="32"> + <menu_button + follows="bottom|left" + tool_tip="Show additional options" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="OptionsMenu_Off" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" + menu_position="bottomleft" + layout="topleft" + left="0" + name="options_gear_btn" + top="0" + width="31" /> + </layout_panel> + <layout_panel + auto_resize="false" + height="25" + layout="topleft" + name="options_sort_btn_panel" + width="32"> + <menu_button + follows="bottom|left" + tool_tip="Show sorting options" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="Conv_toolbar_sort" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" + menu_position="bottomleft" + layout="topleft" + left="0" + name="sorting_menu_btn" + top="0" + width="31" /> + </layout_panel> + <layout_panel + auto_resize="false" + height="25" + layout="topleft" + name="trash_btn_panel" + width="31"> + <dnd_button + follows="bottom|left" + height="25" + image_hover_unselected="Toolbar_Right_Over" + image_overlay="TrashItem_Off" + image_selected="Toolbar_Right_Selected" + image_unselected="Toolbar_Right_Off" + left="0" + layout="topleft" + name="trash_btn" + tool_tip="Delete selected outfit" + top="0" + width="31"/> + </layout_panel> + </layout_stack> <panel class="panel_outfits_inventory" filename="panel_outfits_inventory.xml" @@ -129,7 +212,7 @@ width="333"> visible="false" left="0" tab_group="1" - top_pad="6" + top_pad="4" follows="all" /> <panel class="panel_outfit_edit" diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml index 1cb3eca2eb..40a88d4121 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -32,6 +32,10 @@ Owner can: </panel.string> <panel.string + name="acquiredDateAMPM"> + [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour12,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [ampm,datetime,slt] [year,datetime,slt] + </panel.string> + <panel.string name="acquiredDate"> [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [year,datetime,slt] </panel.string> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 44da9a8dac..b4b4ac4a86 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -13,7 +13,6 @@ <string name="SUPPORT_SITE">Second Life Support Portal</string> <!-- starting up --> - <string name="StartupDetectingHardware">Detecting hardware...</string> <string name="StartupLoading">Loading [APP_NAME]...</string> <string name="StartupClearingCache">Clearing cache...</string> <string name="StartupInitializingTextureCache">Initializing texture cache...</string> @@ -60,6 +59,7 @@ Disk cache: [DISK_CACHE_INFO] HiDPI display mode: [HIDPI] </string> <string name="AboutLibs"> +RestrainedLove API: [RLV_VERSION] J2C Decoder Version: [J2C_VERSION] Audio Driver Version: [AUDIO_DRIVER_VERSION] [LIBCEF_VERSION] @@ -71,7 +71,7 @@ Voice Server Version: [VOICE_VERSION] <string name="LocalTime">[month, datetime, local] [day, datetime, local] [year, datetime, local] [hour, datetime, local]:[min, datetime, local]:[second,datetime, local]</string> <string name="ErrorFetchingServerReleaseNotesURL">Error fetching server release notes URL.</string> <string name="BuildConfiguration">Build Configuration</string> - + <!-- progress --> <string name="ProgressRestoring">Restoring...</string> <string name="ProgressChangingResolution">Changing resolution...</string> @@ -114,10 +114,10 @@ Voice Server Version: [VOICE_VERSION] <string name="LoginFailedHeader">Login failed.</string> <string name="Quit">Quit</string> <string name="create_account_url">http://join.secondlife.com/?sourceid=[sourceid]</string> - + <string name="AgniGridLabel">Second Life Main Grid (Agni)</string> <string name="AditiGridLabel">Second Life Beta Test Grid (Aditi)</string> - + <string name="ViewerDownloadURL">http://secondlife.com/download</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: @@ -209,7 +209,7 @@ If you feel this is an error, please contact support@secondlife.com</string> <string name="YouHaveBeenDisconnected">You have been disconnected from the region you were in.</string> <string name="SentToInvalidRegion">You were sent to an invalid region.</string> <string name="TestingDisconnect">Testing viewer disconnect</string> - + <!-- SLShare: User Friendly Filter Names Translation --> <string name="BlackAndWhite">Black & White</string> <string name="Colors1970">1970's Colors</string> @@ -222,7 +222,7 @@ If you feel this is an error, please contact support@secondlife.com</string> <string name="LensFlare">Lens Flare</string> <string name="Miniature">Miniature</string> <string name="Toycamera">Toy Camera</string> - + <!-- Tooltip --> <string name="TooltipPerson">Person</string><!-- Object under mouse pointer is an avatar --> <string name="TooltipNoName">(no name)</string> <!-- No name on an object --> @@ -259,10 +259,11 @@ If you feel this is an error, please contact support@secondlife.com</string> <string name="TooltipOutboxMixedStock">All items in a stock folder must have the same type and permission</string> <string name="TooltipOutfitNotInInventory">You can only put items or outfits from your personal inventory into "My outfits"</string> <string name="TooltipCantCreateOutfit">One or more items can't be used inside "My outfits"</string> - + <string name="TooltipCantMoveOutfitIntoOutfit">Can not move an outfit into another outfit</string> + <string name="TooltipDragOntoOwnChild">You can't move a folder into its child</string> <string name="TooltipDragOntoSelf">You can't move a folder into itself</string> - + <!-- tooltips for Urls --> <string name="TooltipHttpUrl">Click to view this web page</string> <string name="TooltipSLURL">Click to view this location's information</string> @@ -327,6 +328,7 @@ are allowed. <!-- searching - generic --> <string name="Searching">Searching...</string> <string name="NoneFound">None found.</string> + <string name="ServerUnavailable">Service not available.</string> <!-- Indicates that an avatar name or other similar datum is being retrieved. General usage. --> <string name="RetrievingData">Retrieving...</string> @@ -370,7 +372,7 @@ are allowed. <string name="AssetUploadServerDifficulties">The server is experiencing unexpected difficulties.</string> <string name="AssetUploadServerUnavaliable">Service not available or upload timeout was reached.</string> <string name="AssetUploadRequestInvalid"> -Error in upload request. Please visit +Error in upload request. Please visit http://secondlife.com/support for help fixing this problem. </string> @@ -534,7 +536,7 @@ http://secondlife.com/support for help fixing this problem. <string name="ChangeYourDefaultAnimations">Change your default animations</string> <string name="ForceSitAvatar">Force your avatar to sit</string> <string name="ChangeEnvSettings">Change your environment settings</string> - + <string name="NotConnected">Not Connected</string> <string name="AgentNameSubst">(You)</string> <!-- Substitution for agent name --> <string name="JoinAnExperience"/><!-- intentionally blank --> @@ -2320,7 +2322,8 @@ For AI Character: Get the closest navigable point to the point provided. <!-- inventory --> <string name="InventoryNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search].</string> - <string name="InventoryNoMatchingRecentItems">Didn't find what you're looking for? Try [secondlife:///app/inventory/filters Show filters].</string> + <string name="InventoryNoMatchingRecentItems">Didn't find what you're looking for? Try [secondlife:///app/inventory/filters Show filters].</string> + <string name="InventoryNoMatchingFavorites">You haven't marked any items as favorites.</string> <string name="PlacesNoMatchingItems">To add a place to your landmarks, click the star to the right of the location name.</string> <string name="FavoritesNoMatchingItems">To add a place to your favorites, click the star to the right of the location name, then save the landmark to "Favorites bar".</string> <string name="MarketplaceNoListing">You have no listings yet.</string> @@ -2484,13 +2487,13 @@ If you continue to receive this message, please contact Second Life support for <string name="InvFolder Uncompressed Sounds">Uncompressed Sounds</string> <string name="InvFolder Animations">Animations</string> <string name="InvFolder Gestures">Gestures</string> - <string name="InvFolder Favorite">My Favorites</string> + <string name="InvFolder Favorite">Favorites Bar</string> <!-- historically default name of the Favorites folder can start from either "f" or "F" letter. Also, it can be written as "Favorite" or "Favorites". We should localize all variants of them with the same value --> - <string name="InvFolder favorite">My Favorites</string> - <string name="InvFolder Favorites">My Favorites</string> - <string name="InvFolder favorites">My Favorites</string> + <string name="InvFolder favorite">Favorites Bar</string> + <string name="InvFolder Favorites">Favorites Bar</string> + <string name="InvFolder favorites">Favorites Bar</string> <string name="InvFolder Current Outfit">Current Outfit</string> <string name="InvFolder Initial Outfits">Initial Outfits</string> <string name="InvFolder My Outfits">My Outfits</string> @@ -2503,7 +2506,7 @@ If you continue to receive this message, please contact Second Life support for <string name="InvFolder Materials">Materials</string> <!-- are used for Friends and Friends/All folders in Inventory "Calling cards" folder. See EXT-694--> - <string name="InvFolder Friends">Friends</string> + <string name="InvFolder Friends">Friends</string> <string name="InvFolder All">All</string> <string name="no_attachments">No attachments worn</string> @@ -2672,7 +2675,7 @@ If you continue to receive this message, please contact Second Life support for <string name="UploadFailed">File upload failed: </string> <string name="ObjectOutOfRange">Script (object out of range)</string> <string name="ScriptWasDeleted">Script (deleted from inventory)</string> - + <!-- god tools --> <string name="GodToolsObjectOwnedBy">Object [OBJECT] owned by [OWNER]</string> @@ -2942,14 +2945,12 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .anim <string name="Linden Location">Linden Location</string> <string name="Adult">Adult</string> <string name="Arts&Culture">Arts & Culture</string> - <string name="Arts and Culture">Arts & Culture</string> <string name="Business">Business</string> <string name="Educational">Educational</string> <string name="Gaming">Gaming</string> <string name="Hangout">Hangout</string> <string name="Newcomer Friendly">Newcomer Friendly</string> <string name="Parks&Nature">Parks & Nature</string> - <string name="Parks and Nature">Parks & Nature</string> <string name="Residential">Residential</string> <!--<string name="Shopping">Shopping</string> --> <string name="Stage">Stage</string> @@ -3719,6 +3720,10 @@ Please reinstall viewer from https://secondlife.com/support/downloads/ and cont <string name="inventory_folder_offered-im"> Inventory folder '[ITEM_NAME]' offered </string> + <string name="bot_warning"> + You are chatting with a bot, [NAME]. Do not share any personal information. +Learn more at https://second.life/scripted-agents. + </string> <string name="share_alert"> Drag items from inventory here </string> @@ -3851,7 +3856,7 @@ Please reinstall viewer from https://secondlife.com/support/downloads/ and cont <string name="uploading_costs">Uploading costs L$ [AMOUNT]</string> <string name="this_costs">This costs L$ [AMOUNT]</string> - + <string name="buying_selected_land">This land costs</string> <string name="this_object_costs">This item costs</string> <string name="giving">You want to give</string> @@ -3932,7 +3937,7 @@ Abuse Report</string> <string name="New Daycycle">New Daycycle</string> <string name="New Water">New Water</string> <string name="New Sky">New Sky</string> - + <string name="/bow">/bow</string> <string name="/clap">/clap</string> @@ -3967,6 +3972,7 @@ Abuse Report</string> <string name="AvatarBirthDateFormatShort">[mthnum,datetime,slt]/[day,datetime,slt]</string> <string name="DefaultMimeType">none/none</string> + <string name="texture_load_area_error">Can't load images larger than [PIXELS] pixels</string> <string name="texture_load_dimensions_error">Can't load images larger than [WIDTH]*[HEIGHT]</string> <string name="texture_load_format_error">Incorrect image format.</string> <string name="texture_load_empty_file">File is empty.</string> @@ -4014,7 +4020,7 @@ Please check http://status.secondlifegrid.net to see if there is a known problem <string name="Accounting">Accounting</string> <string name="Notices">Notices</string> <string name="Chat">Chat</string> - + <!-- SL Membership --> <string name="BaseMembership">Base</string> <string name="PremiumMembership">Premium</string> @@ -4180,11 +4186,11 @@ Try enclosing path to the editor with double quotes. <!-- commands --> - <string + <string name="Command_360_Capture_Label">360 snapshot</string> <string name="Command_AboutLand_Label">About land</string> <string name="Command_Appearance_Label">Outfits</string> - <string name="Command_Avatar_Label">Complete avatars</string> + <string name="Command_Avatar_Label">Avatar Welcome Pack</string> <string name="Command_Build_Label">Build</string> <string name="Command_Chat_Label">Chat</string> <string name="Command_Conversations_Label">Conversations</string> @@ -4213,9 +4219,9 @@ name="Command_360_Capture_Label">360 snapshot</string> <string name="Command_View_Label">Camera controls</string> <string name="Command_Voice_Label">Voice settings</string> <string name="Command_FavoriteFolder_Label">Favorite folder</string> - <string name="Command_ResyncAnimations_Label">Resync animations</string> + <string name="Command_ResyncAnimations_Label">Resync animations</string> - <string + <string name="Command_360_Capture_Tooltip">Capture a 360 equirectangular image</string> <string name="Command_AboutLand_Tooltip">Information about the land you're visiting</string> <string name="Command_Appearance_Tooltip">Change your avatar</string> @@ -4248,7 +4254,7 @@ name="Command_360_Capture_Tooltip">Capture a 360 equirectangular image</string> <string name="Command_View_Tooltip">Changing camera angle</string> <string name="Command_Voice_Tooltip">Volume controls for calls and people near you in world</string> <string name="Command_FavoriteFolder_Tooltip">Open your favorite inventory folder</string> - <string name="Command_ResyncAnimations_Tooltip">Synchronizes avatar animations</string> + <string name="Command_ResyncAnimations_Tooltip">Synchronizes avatar animations</string> <string name="Toolbar_Bottom_Tooltip">currently in your bottom toolbar</string> <string name="Toolbar_Left_Tooltip" >currently in your left toolbar</string> @@ -4282,7 +4288,7 @@ name="Command_360_Capture_Tooltip">Capture a 360 equirectangular image</string> <!-- Spell check settings floater --> <string name="UserDictionary">[User]</string> - + <!-- Experience Tools strings --> <string name="experience_tools_experience">Experience</string> <string name="ExperienceNameNull">(no experience)</string> @@ -4344,7 +4350,7 @@ name="Command_360_Capture_Tooltip">Capture a 360 equirectangular image</string> <string name="Default">Default</string> <string name="none_paren_cap">(None)</string> <string name="no_limit">No limit</string> - + <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES"> The physics shape contains triangles which are too small. Try simplifying the physics model. </string> @@ -4384,20 +4390,30 @@ and report the problem. [https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Knowledge Base] </string> - <!-- megapahit strings --> - <string name="not_found">'[TEXT]' not found</string> - <string name="no_results">No results</string> - <string name="searching">Searching...</string> - <string name="all_categories">All Categories</string> - <string name="search_banned">Some terms in your search query were excluded due to content restrictions as clarified in the Community Standards.</string> - <string name="search_short">Your search terms were too short so no search was performed.</string> - <string name="search_disabled">Legacy Search has been disabled in this region.</string> - <string name="NotifyIncomingMessage">Incoming message from [NAME]...</string> - <string name="NearbyChatTitleChannel">Nearby chat (on channel [CHANNEL])</string> - <string name="AvatarTyping">Typing</string> - <string name="UnknownAvatar">Unknown Avatar</string> - <string name="NotAvailableOnPlatform">Not available on this platform</string> - <string name="NowPlaying">Now Playing</string> - <string name="GridInfoTitle">GRID INFO</string> - + <!-- RLVa --> + <string name="RlvConsoleDisable">RLVa is disabled</string> + <string name="RlvConsoleInvalidCmd">Invalid command</string> + <string name="RlvConsoleExecuted">INFO</string> + <string name="RlvConsoleFailed">ERR</string> + <string name="RlvConsoleRetained">RET</string> + <string name="RlvDebugExecuted">executed</string> + <string name="RlvDebugFailed">failed</string> + <string name="RlvDebugRetained">retained</string> + <string name="RlvReturnCodeUnset">unset</string> + <string name="RlvReturnCodeDuplicate">duplicate</string> + <string name="RlvReturnCodeDelayed">delayed</string> + <string name="RlvReturnCodeDeprecated">deprecated</string> + <string name="RlvReturnCodeSyntax">thingy error</string> + <string name="RlvReturnCodeOption">invalid option</string> + <string name="RlvReturnCodeParam">invalid param</string> + <string name="RlvReturnCodeLock">locked command</string> + <string name="RlvReturnCodeDisabled">disabled command</string> + <string name="RlvReturnCodeUnknown">unknown command</string> + <string name="RlvReturnCodeNoSharedRoot">missing #RLV</string> + <string name="RlvReturnCodeDeprecatedAndDisabled">deprecated and disabled</string> + <string name="RlvReturnCodeNoBehaviour">no active behaviours</string> + <string name="RlvReturnCodeUnheldBehaviour">base behaviour not held</string> + <string name="RlvReturnCodeBlocked">blocked object</string> + <string name="RlvReturnCodeThrottled">throttled</string> + <string name="RlvReturnCodeNoProcessor">no command processor found</string> </strings> diff --git a/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml b/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml index b598bbccd8..50c5285e04 100644 --- a/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml +++ b/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <folder_view_item folder_arrow_image="Folder_Arrow" + favorite_image="Inv_Favorite_Star_Full" + favorite_content_image="Inv_Favorite_Star_Content" folder_indentation="8" item_height="20" item_top_pad="4" diff --git a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml index 27ec6ded81..865c145022 100644 --- a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml +++ b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <inbox_folder_view_folder folder_arrow_image="Folder_Arrow" + favorite_image="Inv_Favorite_Star_Full" + favorite_content_image="Inv_Favorite_Star_Content" folder_indentation="8" item_height="20" item_top_pad="4" diff --git a/indra/newview/skins/default/xui/en/widgets/sun_moon_trackball.xml b/indra/newview/skins/default/xui/en/widgets/sun_moon_trackball.xml index cdeff6ab05..f246ff764a 100644 --- a/indra/newview/skins/default/xui/en/widgets/sun_moon_trackball.xml +++ b/indra/newview/skins/default/xui/en/widgets/sun_moon_trackball.xml @@ -3,7 +3,6 @@ name="virtualtrackball" width="150" height="150" - user_resize="false" increment_angle_mouse="1.5f" increment_angle_btn="1.0f" image_sphere="VirtualTrackball_Sphere" diff --git a/indra/newview/skins/default/xui/en/widgets/xy_vector.xml b/indra/newview/skins/default/xui/en/widgets/xy_vector.xml index 23cde55f30..923895be5e 100644 --- a/indra/newview/skins/default/xui/en/widgets/xy_vector.xml +++ b/indra/newview/skins/default/xui/en/widgets/xy_vector.xml @@ -3,11 +3,9 @@ name="xyvector" width="120" height="140" - decimal_digits="1" label_width="16" padding="4" - edit_bar_height="18" - user_resize="false"> + edit_bar_height="18"> <xy_vector.border visible="true"/> diff --git a/indra/newview/skins/default/xui/es/floater_avatar_textures.xml b/indra/newview/skins/default/xui/es/floater_avatar_textures.xml index 0a52a70ff1..b043662975 100644 --- a/indra/newview/skins/default/xui/es/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/es/floater_avatar_textures.xml @@ -6,7 +6,7 @@ <text name="label">Texturas obtenidas mediante bake</text> <text name="composite_label">Texturas compuestas</text> <button label="Volcar IDs a la consola" label_selected="Volcado" name="Dump"/> - <panel name="scroll_content_panel"> + <panel name="scroll_content_panel2"> <texture_picker label="Pelo" name="hair-baked"/> <texture_picker label="Pelo" name="hair_grain"/> <texture_picker label="Alfa del pelo" name="hair_alpha"/> diff --git a/indra/newview/skins/default/xui/es/floater_search.xml b/indra/newview/skins/default/xui/es/floater_search.xml deleted file mode 100644 index e24d8064a1..0000000000 --- a/indra/newview/skins/default/xui/es/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> - <floater.string name="loading_text"> - Cargando... - </floater.string> - <floater.string name="done_text"> - Hecho - </floater.string> - <layout_stack name="stack1"> - <layout_panel name="browser_layout"> - <text name="refresh_search"> - Redo search to reflect current God level - </text> - </layout_panel> - </layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/es/panel_progress.xml b/indra/newview/skins/default/xui/es/panel_progress.xml index c9bed9fd9b..377badc89e 100644 --- a/indra/newview/skins/default/xui/es/panel_progress.xml +++ b/indra/newview/skins/default/xui/es/panel_progress.xml @@ -1,8 +1,10 @@ <?xml version="1.0" ?> <panel name="login_progress_panel"> + <layout_panel name="panel_icons"/> <layout_stack name="vertical_centering"/> <layout_panel name="panel4"/> <layout_panel name="center"/> <layout_stack name="horizontal_centering"> + <text name="logos_lbl">Usos de Megapahit</text> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml index b5cf57ade7..c9eea9a58e 100644 --- a/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@ Guardar una imagen en el inventario cuesta [UPLOAD_COST] L$. Para guardar una imagen como una textura, selecciona uno de los formatos cuadrados. </text> <combo_box label="Resolución" name="texture_size_combo"> - <combo_box.item label="Ventana actual (512 × 512)" name="CurrentWindow"/> + <combo_box.item label="Ventana actual" name="CurrentWindow"/> <combo_box.item label="Pequeña (128x128)" name="Small(128x128)"/> <combo_box.item label="Mediana (256x256)" name="Medium(256x256)"/> <combo_box.item label="Grande (512x512)" name="Large(512x512)"/> diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_options.xml b/indra/newview/skins/default/xui/es/panel_snapshot_options.xml index 4eb9ecf28f..f3119c739e 100644 --- a/indra/newview/skins/default/xui/es/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/es/panel_snapshot_options.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_snapshot_options"> <button label="Guardar en disco" name="save_to_computer_btn"/> - <button label="Guardar en inventario (L$[AMOUNT])" name="save_to_inventory_btn"/> + <button label="Guardar en inventario" name="save_to_inventory_btn"/> <button label="Compartir en los comentarios de Mi perfil" name="save_to_profile_btn"/> <button label="Compartir en Facebook" name="send_to_facebook_btn"/> <button label="Compartir en Twitter" name="send_to_twitter_btn"/> diff --git a/indra/newview/skins/default/xui/es/panel_status_bar.xml b/indra/newview/skins/default/xui/es/panel_status_bar.xml index bdedd04cc8..1e304e9c05 100644 --- a/indra/newview/skins/default/xui/es/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/es/panel_status_bar.xml @@ -6,7 +6,7 @@ <panel.string name="bandwidth_tooltip"> Ancho de banda </panel.string> - <panel.string name="time"> + <panel.string name="time_ampm"> [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] </panel.string> <panel.string name="timeTooltip"> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index c6c0e9e77d..c9bb93b315 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -1,609 +1,1660 @@ <?xml version="1.0" ?> <strings> - <string name="CAPITALIZED_APP_NAME">MEGAPAHIT</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="StartupRequireDriverUpdate">Error de inicialización de gráficos. Actualiza tu controlador de gráficos.</string> - <string name="AboutHeader">[CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) -[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]</string> - <string name="BuildConfig">Configuración de constitución [BUILD_CONFIG]</string> - <string name="AboutPosition">Estás en la posición [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1], de [REGION], alojada en <nolink>[HOSTNAME]</nolink> ([HOSTIP]) + <string name="CAPITALIZED_APP_NAME"> + MEGAPAHIT + </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="StartupRequireDriverUpdate"> + Error de inicialización de gráficos. Actualiza tu controlador de gráficos. + </string> + <string name="AboutHeader"> + [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) +[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] + </string> + <string name="BuildConfig"> + Configuración de constitución [BUILD_CONFIG] + </string> + <string name="AboutPosition"> + Estás en la posición [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1], de [REGION], alojada en <nolink>[HOSTNAME]</nolink> SLURL: <nolink>[SLURL]</nolink> (coordenadas globales [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] -[SERVER_RELEASE_NOTES_URL]</string> - <string name="AboutSystem">CPU: [CPU] +[SERVER_RELEASE_NOTES_URL] + </string> + <string name="AboutSystem"> + CPU: [CPU] Memoria: [MEMORY_MB] MB Versión del Sistema Operativo: [OS_VERSION] Fabricante de la tarjeta gráfica: [GRAPHICS_CARD_VENDOR] -Tarjeta gráfica: [GRAPHICS_CARD]</string> - <string name="AboutDriver">Versión de Windows Graphics Driver: [GRAPHICS_DRIVER_VERSION]</string> - <string name="AboutOGL">Versión de OpenGL: [OPENGL_VERSION]</string> - <string name="AboutSettings">Tamaño de la ventana: [WINDOW_WIDTH]x[WINDOW_HEIGHT] +Tarjeta gráfica: [GRAPHICS_CARD] + </string> + <string name="AboutDriver"> + Versión de Windows Graphics Driver: [GRAPHICS_DRIVER_VERSION] + </string> + <string name="AboutOGL"> + Versión de OpenGL: [OPENGL_VERSION] + </string> + <string name="AboutSettings"> + Tamaño de la ventana: [WINDOW_WIDTH]x[WINDOW_HEIGHT] Ajuste del tamaño de fuente: [FONT_SIZE_ADJUSTMENT]pt Escala UI: [UI_SCALE] Distancia de dibujo: [DRAW_DISTANCE]m Ancho de banda: [NET_BANDWITH]kbit/s Factor LOD: [LOD_FACTOR] Calidad de renderización: [RENDER_QUALITY] -Modelo de iluminación avanzado: [GPU_SHADERS] -Memoria de textura: [TEXTURE_MEMORY]MB</string> - <string name="AboutOSXHiDPI">Modo de visualización HiDPi: [HIDPI]</string> - <string name="AboutLibs">Versión de descodificador J2C: [J2C_VERSION] +Memoria de textura: [TEXTURE_MEMORY]MB + </string> + <string name="AboutOSXHiDPI"> + Modo de visualización HiDPi: [HIDPI] + </string> + <string name="AboutLibs"> + Versión de descodificador J2C: [J2C_VERSION] Versión del controlador audio: [AUDIO_DRIVER_VERSION] [LIBCEF_VERSION] Versión LibVLC: [LIBVLC_VERSION] -Versión del servidor de voz: [VOICE_VERSION]</string> - <string name="AboutTraffic">Paquetes perdidos: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)</string> - <string name="AboutTime">[month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]</string> - <string name="ErrorFetchingServerReleaseNotesURL">Error al obtener la URL de las notas de la versión del servidor.</string> - <string name="BuildConfiguration">Configuración de constitución</string> - <string name="ProgressRestoring">Restaurando...</string> - <string name="ProgressChangingResolution">Cambiando la resolución...</string> - <string name="Fullbright">Brillo al máximo (antiguo)</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="LoginRequestSeedCapGrant">Solicitando capacidades de la región...</string> - <string name="LoginRetrySeedCapGrant">Solicitando capacidades de la región, intento [NUMBER]...</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="LoginFailedHeader">Error en el inicio de sesión.</string> - <string name="Quit">Salir</string> - <string name="create_account_url">http://join.secondlife.com/?sourceid=[sourceid]</string> - <string name="AgniGridLabel">Grid principal de Second Life (Agni)</string> - <string name="AditiGridLabel">Grid de prueba beta de Second Life (Aditi)</string> - <string name="ViewerDownloadURL">http://secondlife.com/download.</string> - <string name="LoginFailedViewerNotPermitted">Ya no puedes acceder a Second Life con el visor que estás utilizando. Visita la siguiente página para descargar un nuevo visor: +Versión del servidor de voz: [VOICE_VERSION] + </string> + <string name="AboutTraffic"> + Paquetes perdidos: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) + </string> + <string name="AboutTime"> + [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt] + </string> + <string name="ErrorFetchingServerReleaseNotesURL"> + Error al obtener la URL de las notas de la versión del servidor. + </string> + <string name="BuildConfiguration"> + Configuración de constitución + </string> + <string name="ProgressRestoring"> + Restaurando... + </string> + <string name="ProgressChangingResolution"> + Cambiando la resolución... + </string> + <string name="Fullbright"> + Brillo al máximo (antiguo) + </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="LoginRequestSeedCapGrant"> + Solicitando capacidades de la región... + </string> + <string name="LoginRetrySeedCapGrant"> + Solicitando capacidades de la región, intento [NUMBER]... + </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="LoginFailedHeader"> + Error en el inicio de sesión. + </string> + <string name="Quit"> + Salir + </string> + <string name="create_account_url"> + http://join.secondlife.com/?sourceid=[sourceid] + </string> + <string name="AgniGridLabel"> + Grid principal de Second Life (Agni) + </string> + <string name="AditiGridLabel"> + Grid de prueba beta de Second Life (Aditi) + </string> + <string name="ViewerDownloadURL"> + http://secondlife.com/download. + </string> + <string name="LoginFailedViewerNotPermitted"> + Ya no puedes acceder a Second Life con el visor que estás utilizando. Visita la siguiente página para descargar un nuevo visor: http://secondlife.com/download. Si deseas obtener más información, consulta las preguntas frecuentes que aparecen a continuación: -http://secondlife.com/viewer-access-faq</string> - <string name="LoginIntermediateOptionalUpdateAvailable">Actualización opcional del visor disponible: [VERSION]</string> - <string name="LoginFailedRequiredUpdate">Actualización necesaria del visor: [VERSION]</string> - <string name="LoginFailedAlreadyLoggedIn">El agente ya ha iniciado sesión.</string> - <string name="LoginFailedAuthenticationFailed">Lo sentimos. No ha sido posible iniciar sesión. +http://secondlife.com/viewer-access-faq + </string> + <string name="LoginIntermediateOptionalUpdateAvailable"> + Actualización opcional del visor disponible: [VERSION] + </string> + <string name="LoginFailedRequiredUpdate"> + Actualización necesaria del visor: [VERSION] + </string> + <string name="LoginFailedAlreadyLoggedIn"> + El agente ya ha iniciado sesión. + </string> + <string name="LoginFailedAuthenticationFailed"> + Lo sentimos. No ha sido posible iniciar sesión. Comprueba si has introducido correctamente * El nombre de usuario (como juangarcia12 o estrella.polar) * Contraseña -Asimismo, asegúrate de que la tecla Mayús esté desactivada.</string> - <string name="LoginFailedPasswordChanged">Como precaución de seguridad, se ha modificado tu contraseña. +Asimismo, asegúrate de que la tecla Mayús esté desactivada. + </string> + <string name="LoginFailedPasswordChanged"> + Como precaución de seguridad, se ha modificado tu contraseña. DirÃgete a la página de tu cuenta en http://secondlife.com/password y responde a la pregunta de seguridad para restablecer la contraseña. -Lamentamos las molestias.</string> - <string name="LoginFailedPasswordReset">Hemos realizado unos cambios en nuestro sistema, por lo que deberás restablecer la contraseña. +Lamentamos las molestias. + </string> + <string name="LoginFailedPasswordReset"> + Hemos realizado unos cambios en nuestro sistema, por lo que deberás restablecer la contraseña. DirÃgete a la página de tu cuenta en http://secondlife.com/password y responde a la pregunta de seguridad para restablecer la contraseña. -Lamentamos las molestias.</string> - <string name="LoginFailedEmployeesOnly">Second Life no está disponible temporalmente debido a tareas de mantenimiento. +Lamentamos las molestias. + </string> + <string name="LoginFailedEmployeesOnly"> + Second Life no está disponible temporalmente debido a tareas de mantenimiento. Actualmente, solo se permite iniciar sesión a los empleados. -Consulta www.secondlife.com/status si deseas obtener actualizaciones.</string> - <string name="LoginFailedPremiumOnly">Las conexiones a Second Life se han restringido provisionalmente para garantizar que los usuarios que ya están conectados tengan la mejor experiencia posible. +Consulta www.secondlife.com/status si deseas obtener actualizaciones. + </string> + <string name="LoginFailedPremiumOnly"> + Las conexiones a Second Life se han restringido provisionalmente para garantizar que los usuarios que ya están conectados tengan la mejor experiencia posible. -Durante este tiempo, las personas con cuentas gratuitas no podrán acceder a Second Life, ya que tienen prioridad los usuarios con una cuenta de pago.</string> - <string name="LoginFailedComputerProhibited">No se puede acceder a Second Life desde este ordenador. +Durante este tiempo, las personas con cuentas gratuitas no podrán acceder a Second Life, ya que tienen prioridad los usuarios con una cuenta de pago. + </string> + <string name="LoginFailedComputerProhibited"> + No se puede acceder a Second Life desde este ordenador. Si crees que se trata de un error, ponte en contacto con -support@secondlife.com.</string> - <string name="LoginFailedAcountSuspended">No se podrá acceder a tu cuenta hasta las -[TIME] (horario de la costa del PacÃfico).</string> - <string name="LoginFailedAccountDisabled">En este momento no podemos completar la solicitud. -Por favor solicita ayuda al personal de asistencia de Second Life en http://support.secondlife.com.</string> - <string name="LoginFailedTransformError">Se han detectado datos incorrectos en el inicio de sesión. -Ponte en contacto con support@secondlife.com.</string> - <string name="LoginFailedAccountMaintenance">Se están realizando tareas rutinarias de mantenimiento en tu cuenta. +support@secondlife.com. + </string> + <string name="LoginFailedAcountSuspended"> + No se podrá acceder a tu cuenta hasta las +[TIME] (horario de la costa del PacÃfico). + </string> + <string name="LoginFailedAccountDisabled"> + En este momento no podemos completar la solicitud. +Por favor solicita ayuda al personal de asistencia de Second Life en http://support.secondlife.com. + </string> + <string name="LoginFailedTransformError"> + Se han detectado datos incorrectos en el inicio de sesión. +Ponte en contacto con support@secondlife.com. + </string> + <string name="LoginFailedAccountMaintenance"> + Se están realizando tareas rutinarias de mantenimiento en tu cuenta. No se podrá acceder a tu cuenta hasta las [TIME] (horario de la costa del PacÃfico). -Si crees que se trata de un error, ponte en contacto con support@secondlife.com.</string> - <string name="LoginFailedPendingLogoutFault">La solicitud de cierre de sesión ha obtenido como resultado un error del simulador.</string> - <string name="LoginFailedPendingLogout">El sistema te desconectará. -Por favor, aguarda un momento antes de intentar conectarte nuevamente.</string> - <string name="LoginFailedUnableToCreateSession">No se ha podido crear una sesión válida.</string> - <string name="LoginFailedUnableToConnectToSimulator">No se ha podido establecer la conexión con un simulador.</string> - <string name="LoginFailedRestrictedHours">Tu cuenta solo puede acceder a Second Life +Si crees que se trata de un error, ponte en contacto con support@secondlife.com. + </string> + <string name="LoginFailedPendingLogoutFault"> + La solicitud de cierre de sesión ha obtenido como resultado un error del simulador. + </string> + <string name="LoginFailedPendingLogout"> + El sistema te desconectará. +Por favor, aguarda un momento antes de intentar conectarte nuevamente. + </string> + <string name="LoginFailedUnableToCreateSession"> + No se ha podido crear una sesión válida. + </string> + <string name="LoginFailedUnableToConnectToSimulator"> + No se ha podido establecer la conexión con un simulador. + </string> + <string name="LoginFailedRestrictedHours"> + Tu cuenta solo puede acceder a Second Life entre las [START] y las [END] (horario de la costa del PacÃfico). Inténtalo de nuevo durante ese horario. -Si crees que se trata de un error, ponte en contacto con support@secondlife.com.</string> - <string name="LoginFailedIncorrectParameters">Parámetros incorrectos. -Si crees que se trata de un error, ponte en contacto con support@secondlife.com.</string> - <string name="LoginFailedFirstNameNotAlphanumeric">El parámetro correspondiente al nombre debe contener caracteres alfanuméricos. -Si crees que se trata de un error, ponte en contacto con support@secondlife.com.</string> - <string name="LoginFailedLastNameNotAlphanumeric">El parámetro correspondiente al apellido debe contener caracteres alfanuméricos. -Si crees que se trata de un error, ponte en contacto con support@secondlife.com.</string> - <string name="LogoutFailedRegionGoingOffline">La región se está desconectando. -Intenta iniciar sesión de nuevo en unos instantes.</string> - <string name="LogoutFailedAgentNotInRegion">El agente no se encuentra en la región. -Intenta iniciar sesión de nuevo en unos instantes.</string> - <string name="LogoutFailedPendingLogin">A esta región ya se ha accedido en otra sesión. -Intenta iniciar sesión de nuevo en unos instantes.</string> - <string name="LogoutFailedLoggingOut">Se ha salido de la región en la sesión anterior. -Intenta iniciar sesión de nuevo en unos instantes.</string> - <string name="LogoutFailedStillLoggingOut">La región aún está cerrando la sesión anterior. -Intenta iniciar sesión de nuevo en unos instantes.</string> - <string name="LogoutSucceeded">Se ha salido de la región en la última sesión. -Intenta iniciar sesión de nuevo en unos instantes.</string> - <string name="LogoutFailedLogoutBegun">La región ha comenzado el proceso de cierre de sesión. -Intenta iniciar sesión de nuevo en unos instantes.</string> - <string name="LoginFailedLoggingOutSession">El sistema ha comenzado a cerrar la última sesión. -Intenta iniciar sesión de nuevo en unos instantes.</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="SocialFacebookConnecting">Conectando con Facebook...</string> - <string name="SocialFacebookPosting">Publicando...</string> - <string name="SocialFacebookDisconnecting">Desconectando de Facebook...</string> - <string name="SocialFacebookErrorConnecting">Problema al conectar con Facebook</string> - <string name="SocialFacebookErrorPosting">Problema al publicar en Facebook</string> - <string name="SocialFacebookErrorDisconnecting">Problema al desconectar de Facebook</string> - <string name="SocialFlickrConnecting">Conectándose a Flickr...</string> - <string name="SocialFlickrPosting">Publicando...</string> - <string name="SocialFlickrDisconnecting">Desconectándose de Flickr...</string> - <string name="SocialFlickrErrorConnecting">Problema con la conexión a Flickr</string> - <string name="SocialFlickrErrorPosting">Problema al publicar en Flickr</string> - <string name="SocialFlickrErrorDisconnecting">Problema con la desconexión de Flickr</string> - <string name="SocialTwitterConnecting">Conectándose a Twitter...</string> - <string name="SocialTwitterPosting">Publicando...</string> - <string name="SocialTwitterDisconnecting">Desconectándose de Twitter...</string> - <string name="SocialTwitterErrorConnecting">Problema con la conexión a Twitter</string> - <string name="SocialTwitterErrorPosting">Problema al publicar en Twitter</string> - <string name="SocialTwitterErrorDisconnecting">Problema con la desconexión de Twitter</string> - <string name="BlackAndWhite">Blanco y negro</string> - <string name="Colors1970">Colores de los 70</string> - <string name="Intense">Intenso</string> - <string name="Newspaper">Periódico</string> - <string name="Sepia">Sepia</string> - <string name="Spotlight">Foco</string> - <string name="Video">VÃdeo</string> - <string name="Autocontrast">Contraste automático</string> - <string name="LensFlare">Destello de lente</string> - <string name="Miniature">Miniatura</string> - <string name="Toycamera">Cámara de juguete</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="TooltipTooManyWearables">No puedes tener una carpeta de prendas que contenga más de [AMOUNT] elementos. Puedes cambiar este lÃmite en Avanzado > Mostrar las configuraciones del depurador > WearFolderLimit.</string> +Si crees que se trata de un error, ponte en contacto con support@secondlife.com. + </string> + <string name="LoginFailedIncorrectParameters"> + Parámetros incorrectos. +Si crees que se trata de un error, ponte en contacto con support@secondlife.com. + </string> + <string name="LoginFailedFirstNameNotAlphanumeric"> + El parámetro correspondiente al nombre debe contener caracteres alfanuméricos. +Si crees que se trata de un error, ponte en contacto con support@secondlife.com. + </string> + <string name="LoginFailedLastNameNotAlphanumeric"> + El parámetro correspondiente al apellido debe contener caracteres alfanuméricos. +Si crees que se trata de un error, ponte en contacto con support@secondlife.com. + </string> + <string name="LogoutFailedRegionGoingOffline"> + La región se está desconectando. +Intenta iniciar sesión de nuevo en unos instantes. + </string> + <string name="LogoutFailedAgentNotInRegion"> + El agente no se encuentra en la región. +Intenta iniciar sesión de nuevo en unos instantes. + </string> + <string name="LogoutFailedPendingLogin"> + A esta región ya se ha accedido en otra sesión. +Intenta iniciar sesión de nuevo en unos instantes. + </string> + <string name="LogoutFailedLoggingOut"> + Se ha salido de la región en la sesión anterior. +Intenta iniciar sesión de nuevo en unos instantes. + </string> + <string name="LogoutFailedStillLoggingOut"> + La región aún está cerrando la sesión anterior. +Intenta iniciar sesión de nuevo en unos instantes. + </string> + <string name="LogoutSucceeded"> + Se ha salido de la región en la última sesión. +Intenta iniciar sesión de nuevo en unos instantes. + </string> + <string name="LogoutFailedLogoutBegun"> + La región ha comenzado el proceso de cierre de sesión. +Intenta iniciar sesión de nuevo en unos instantes. + </string> + <string name="LoginFailedLoggingOutSession"> + El sistema ha comenzado a cerrar la última sesión. +Intenta iniciar sesión de nuevo en unos instantes. + </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="SocialFacebookConnecting"> + Conectando con Facebook... + </string> + <string name="SocialFacebookPosting"> + Publicando... + </string> + <string name="SocialFacebookDisconnecting"> + Desconectando de Facebook... + </string> + <string name="SocialFacebookErrorConnecting"> + Problema al conectar con Facebook + </string> + <string name="SocialFacebookErrorPosting"> + Problema al publicar en Facebook + </string> + <string name="SocialFacebookErrorDisconnecting"> + Problema al desconectar de Facebook + </string> + <string name="SocialFlickrConnecting"> + Conectándose a Flickr... + </string> + <string name="SocialFlickrPosting"> + Publicando... + </string> + <string name="SocialFlickrDisconnecting"> + Desconectándose de Flickr... + </string> + <string name="SocialFlickrErrorConnecting"> + Problema con la conexión a Flickr + </string> + <string name="SocialFlickrErrorPosting"> + Problema al publicar en Flickr + </string> + <string name="SocialFlickrErrorDisconnecting"> + Problema con la desconexión de Flickr + </string> + <string name="SocialTwitterConnecting"> + Conectándose a Twitter... + </string> + <string name="SocialTwitterPosting"> + Publicando... + </string> + <string name="SocialTwitterDisconnecting"> + Desconectándose de Twitter... + </string> + <string name="SocialTwitterErrorConnecting"> + Problema con la conexión a Twitter + </string> + <string name="SocialTwitterErrorPosting"> + Problema al publicar en Twitter + </string> + <string name="SocialTwitterErrorDisconnecting"> + Problema con la desconexión de Twitter + </string> + <string name="BlackAndWhite"> + Blanco y negro + </string> + <string name="Colors1970"> + Colores de los 70 + </string> + <string name="Intense"> + Intenso + </string> + <string name="Newspaper"> + Periódico + </string> + <string name="Sepia"> + Sepia + </string> + <string name="Spotlight"> + Foco + </string> + <string name="Video"> + VÃdeo + </string> + <string name="Autocontrast"> + Contraste automático + </string> + <string name="LensFlare"> + Destello de lente + </string> + <string name="Miniature"> + Miniatura + </string> + <string name="Toycamera"> + Cámara de juguete + </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="TooltipTooManyWearables"> + No puedes tener una carpeta de prendas que contenga más de [AMOUNT] elementos. Puedes cambiar este lÃmite en Avanzado > Mostrar las configuraciones del depurador > WearFolderLimit. + </string> <string name="TooltipPrice" value="[AMOUNT] L$:"/> - <string name="TooltipSLIcon">Esto crea un vÃnculo a una página del dominio oficial SecondLife.com o LindenLab.com.</string> - <string name="TooltipOutboxDragToWorld">No se pueden mostrar artÃculos desde la carpeta ArtÃculos del mercado</string> - <string name="TooltipOutboxWorn">Los artÃculos que tienes puestos no se pueden colocar en la carpeta ArtÃculos del mercado</string> - <string name="TooltipOutboxFolderLevels">La profundidad de carpetas anidadas excede de [AMOUNT]. Disminuye la profundidad de las carpetas anidadas; si es necesario, agrupa los artÃculos.</string> - <string name="TooltipOutboxTooManyFolders">La cantidad de subcarpetas excede de [AMOUNT]. Disminuye la cantidad de carpetas de tu lista de artÃculos; si es necesario, agrupa los artÃculos.</string> - <string name="TooltipOutboxTooManyObjects">La cantidad de artÃculos excede de [AMOUNT]. Para vender más de [AMOUNT] artÃculos en la misma lista, debes agrupar algunos.</string> - <string name="TooltipOutboxTooManyStockItems">La cantidad de artÃculos en stock excede de [AMOUNT].</string> - <string name="TooltipOutboxCannotDropOnRoot">Solo se pueden soltar artÃculos o carpetas en las pestañas TODOS o SIN ASOCIAR. Selecciona una de estas pestañas y mueve otra vez los artÃculos o carpetas.</string> - <string name="TooltipOutboxNoTransfer">Uno o varios de estos objetos no se pueden vender o transferir</string> - <string name="TooltipOutboxNotInInventory">Solo puedes colocar en el mercado artÃculos de tu inventario</string> - <string name="TooltipOutboxLinked">No puedes poner carpetas o artÃculos vinculados en el Mercado</string> - <string name="TooltipOutboxCallingCard">No puedes colocar tarjetas de visita en el Mercado</string> - <string name="TooltipOutboxDragActive">No se puede mover una lista de artÃculos publicada</string> - <string name="TooltipOutboxCannotMoveRoot">No se puede mover la carpeta raÃz de artÃculos del Mercado</string> - <string name="TooltipOutboxMixedStock">Todos los artÃculos de una carpeta de stock deben tener el mismo tipo y permiso</string> - <string name="TooltipDragOntoOwnChild">No puedes mover una carpeta a su carpeta secundaria</string> - <string name="TooltipDragOntoSelf">No puedes mover una carpeta dentro de sà misma</string> - <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="TooltipSLIcon"> + Esto crea un vÃnculo a una página del dominio oficial SecondLife.com o LindenLab.com. + </string> + <string name="TooltipOutboxDragToWorld"> + No se pueden mostrar artÃculos desde la carpeta ArtÃculos del mercado + </string> + <string name="TooltipOutboxWorn"> + Los artÃculos que tienes puestos no se pueden colocar en la carpeta ArtÃculos del mercado + </string> + <string name="TooltipOutboxFolderLevels"> + La profundidad de carpetas anidadas excede de [AMOUNT]. Disminuye la profundidad de las carpetas anidadas; si es necesario, agrupa los artÃculos. + </string> + <string name="TooltipOutboxTooManyFolders"> + La cantidad de subcarpetas excede de [AMOUNT]. Disminuye la cantidad de carpetas de tu lista de artÃculos; si es necesario, agrupa los artÃculos. + </string> + <string name="TooltipOutboxTooManyObjects"> + La cantidad de artÃculos excede de [AMOUNT]. Para vender más de [AMOUNT] artÃculos en la misma lista, debes agrupar algunos. + </string> + <string name="TooltipOutboxTooManyStockItems"> + La cantidad de artÃculos en stock excede de [AMOUNT]. + </string> + <string name="TooltipOutboxCannotDropOnRoot"> + Solo se pueden soltar artÃculos o carpetas en las pestañas TODOS o SIN ASOCIAR. Selecciona una de estas pestañas y mueve otra vez los artÃculos o carpetas. + </string> + <string name="TooltipOutboxNoTransfer"> + Uno o varios de estos objetos no se pueden vender o transferir + </string> + <string name="TooltipOutboxNotInInventory"> + Solo puedes colocar en el mercado artÃculos de tu inventario + </string> + <string name="TooltipOutboxLinked"> + No puedes poner carpetas o artÃculos vinculados en el Mercado + </string> + <string name="TooltipOutboxCallingCard"> + No puedes colocar tarjetas de visita en el Mercado + </string> + <string name="TooltipOutboxDragActive"> + No se puede mover una lista de artÃculos publicada + </string> + <string name="TooltipOutboxCannotMoveRoot"> + No se puede mover la carpeta raÃz de artÃculos del Mercado + </string> + <string name="TooltipOutboxMixedStock"> + Todos los artÃculos de una carpeta de stock deben tener el mismo tipo y permiso + </string> + <string name="TooltipDragOntoOwnChild"> + No puedes mover una carpeta a su carpeta secundaria + </string> + <string name="TooltipDragOntoSelf"> + No puedes mover una carpeta dentro de sà misma + </string> + <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="TooltipEmail">Haz clic para redactar un correo electrónico</string> - <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="SLappAgentRemoveFriend">Eliminación de amigos</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="TooltipNotecardNotAllowedTypeDrop">Los objetos de este tipo no se pueden adjuntar -a las notas de esta región.</string> - <string name="TooltipNotecardOwnerRestrictedDrop">Sólo los objetos con permisos + <string name="TooltipEmail"> + Haz clic para redactar un correo electrónico + </string> + <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="SLappAgentRemoveFriend"> + Eliminación de amigos + </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="TooltipNotecardNotAllowedTypeDrop"> + Los objetos de este tipo no se pueden adjuntar +a las notas de esta región. + </string> + <string name="TooltipNotecardOwnerRestrictedDrop"> + Sólo los objetos con permisos «próximo propietario» sin restricciones -pueden adjuntarse a las notas.</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">https://megapahit.net/</string> - <string name="LoadingData">Cargando...</string> - <string name="AvatarNameNobody">(nadie)</string> - <string name="AvatarNameWaiting">(esperando)</string> - <string name="GroupNameNone">(ninguno)</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="AssetUploadServerUnreacheble">El servicio no está disponible.</string> - <string name="AssetUploadServerDifficulties">Se detectaron errores inesperados en el servidor.</string> - <string name="AssetUploadServerUnavaliable">El servicio no está disponible o se alcanzó el tiempo de carga máxima.</string> - <string name="AssetUploadRequestInvalid">Error en la solicitud de carga. Por favor, ingresa a -http://secondlife.com/support para obtener ayuda sobre cómo solucionar este problema.</string> - <string name="SettingValidationError">Error en la validación para importar los parámetros [NAME]</string> - <string name="SettingImportFileError">No se pudo abrir el archivo [FILE]</string> - <string name="SettingParseFileError">No se pudo abrir el archivo [FILE]</string> - <string name="SettingTranslateError">No se pudo traducir el Viento de luz legado [NAME]</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="settings blob">opciones</string> - <string name="mesh">red</string> - <string name="AvatarEditingAppearance">(Edición de Apariencia)</string> - <string name="AvatarAway">Ausente</string> - <string name="AvatarDoNotDisturb">No molestar</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="use_texture">Usar textura</string> - <string name="manip_hint1">Pasa el cursor del ratón sobre la regla</string> - <string name="manip_hint2">para ajustar a la cuadrÃcula</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="NearbyChatTitle">Chat</string> - <string name="NearbyChatLabel">(Chat)</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="AdditionalPermissionsRequestHeader">Si autorizas el acceso a tu cuenta, también permitirás al objeto:</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="TeleportYourAgent">Teleportarte</string> - <string name="ForceSitAvatar">Forzar que el avatar se siente</string> - <string name="ChangeEnvSettings">Cambiar tu configuración del entorno</string> - <string name="AgentNameSubst">(Tú)</string> +pueden adjuntarse a las notas. + </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"> + https://megapahit.net/ + </string> + <string name="LoadingData"> + Cargando... + </string> + <string name="AvatarNameNobody"> + (nadie) + </string> + <string name="AvatarNameWaiting"> + (esperando) + </string> + <string name="GroupNameNone"> + (ninguno) + </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="AssetUploadServerUnreacheble"> + El servicio no está disponible. + </string> + <string name="AssetUploadServerDifficulties"> + Se detectaron errores inesperados en el servidor. + </string> + <string name="AssetUploadServerUnavaliable"> + El servicio no está disponible o se alcanzó el tiempo de carga máxima. + </string> + <string name="AssetUploadRequestInvalid"> + Error en la solicitud de carga. Por favor, ingresa a +http://secondlife.com/support para obtener ayuda sobre cómo solucionar este problema. + </string> + <string name="SettingValidationError"> + Error en la validación para importar los parámetros [NAME] + </string> + <string name="SettingImportFileError"> + No se pudo abrir el archivo [FILE] + </string> + <string name="SettingParseFileError"> + No se pudo abrir el archivo [FILE] + </string> + <string name="SettingTranslateError"> + No se pudo traducir el Viento de luz legado [NAME] + </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="settings blob"> + opciones + </string> + <string name="mesh"> + red + </string> + <string name="AvatarEditingAppearance"> + (Edición de Apariencia) + </string> + <string name="AvatarAway"> + Ausente + </string> + <string name="AvatarDoNotDisturb"> + No molestar + </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="use_texture"> + Usar textura + </string> + <string name="manip_hint1"> + Pasa el cursor del ratón sobre la regla + </string> + <string name="manip_hint2"> + para ajustar a la cuadrÃcula + </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="NearbyChatTitle"> + Chat + </string> + <string name="NearbyChatLabel"> + (Chat) + </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="AdditionalPermissionsRequestHeader"> + Si autorizas el acceso a tu cuenta, también permitirás al objeto: + </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="TeleportYourAgent"> + Teleportarte + </string> + <string name="ForceSitAvatar"> + Forzar que el avatar se siente + </string> + <string name="ChangeEnvSettings"> + Cambiar tu configuración del entorno + </string> + <string name="AgentNameSubst"> + (Tú) + </string> <string name="JoinAnExperience"/> - <string name="SilentlyManageEstateAccess">Suprimir alertas al gestionar las listas de acceso a un estado</string> - <string name="OverrideYourAnimations">Reemplazar tus animaciones predeterminadas</string> - <string name="ScriptReturnObjects">Devolver objetos en tu nombre</string> - <string name="UnknownScriptPermission">(desconocido)</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="png_image_files">Imágenes PNG</string> - <string name="save_texture_image_files">Imágenes Targa o PNG</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="script_files">Scripts</string> - <string name="dictionary_files">Diccionarios</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="universal">Universal</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="universal_not_worn">Universal 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_universal">Crear unos guantes nuevos</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="BodyPartsEnhancedSkeleton">Esqueleto mejorado</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="InventoryNoMatchingRecentItems">¿No encuentras lo que buscas? Intenta [secondlife:///app/inventory/filters Show filters].</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="MarketplaceNoMatchingItems">No se han encontrado artÃculos. Comprueba si has escrito correctamente la cadena de búsqueda y vuelve a intentarlo.</string> - <string name="InventoryNoTexture">No tienes en tu inventario una copia de esta textura</string> - <string name="InventoryInboxNoItems">Aquà aparecerán algunos de los objetos que recibas, como los regalos Premium. Después puedes arrastrarlos a tu inventario.</string> - <string name="MarketplaceURL">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/</string> - <string name="MarketplaceURL_CreateStore">http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3</string> - <string name="MarketplaceURL_Dashboard">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard</string> - <string name="MarketplaceURL_Imports">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports</string> - <string name="MarketplaceURL_LearnMore">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more</string> - <string name="InventoryPlayAnimationTooltip">Abrir la ventana con las opciones del Juego</string> - <string name="InventoryPlayGestureTooltip">Realizar gesto seleccionado en el mundo.</string> - <string name="InventoryPlaySoundTooltip">Abrir la ventana con las opciones del Juego</string> - <string name="InventoryOutboxNotMerchantTitle">Cualquier usuario puede vender objetos en el mercado.</string> + <string name="SilentlyManageEstateAccess"> + Suprimir alertas al gestionar las listas de acceso a un estado + </string> + <string name="OverrideYourAnimations"> + Reemplazar tus animaciones predeterminadas + </string> + <string name="ScriptReturnObjects"> + Devolver objetos en tu nombre + </string> + <string name="UnknownScriptPermission"> + (desconocido) + </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="png_image_files"> + Imágenes PNG + </string> + <string name="save_texture_image_files"> + Imágenes Targa o PNG + </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="script_files"> + Scripts + </string> + <string name="dictionary_files"> + Diccionarios + </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="universal"> + Universal + </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="universal_not_worn"> + Universal 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_universal"> + Crear unos guantes nuevos + </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="BodyPartsEnhancedSkeleton"> + Esqueleto mejorado + </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="InventoryNoMatchingRecentItems"> + ¿No encuentras lo que buscas? Intenta [secondlife:///app/inventory/filters Show filters]. + </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="MarketplaceNoMatchingItems"> + No se han encontrado artÃculos. Comprueba si has escrito correctamente la cadena de búsqueda y vuelve a intentarlo. + </string> + <string name="InventoryNoTexture"> + No tienes en tu inventario una copia de esta textura + </string> + <string name="InventoryInboxNoItems"> + Aquà aparecerán algunos de los objetos que recibas, como los regalos Premium. Después puedes arrastrarlos a tu inventario. + </string> + <string name="MarketplaceURL"> + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ + </string> + <string name="MarketplaceURL_CreateStore"> + http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 + </string> + <string name="MarketplaceURL_Dashboard"> + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard + </string> + <string name="MarketplaceURL_Imports"> + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports + </string> + <string name="MarketplaceURL_LearnMore"> + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more + </string> + <string name="InventoryPlayAnimationTooltip"> + Abrir la ventana con las opciones del Juego + </string> + <string name="InventoryPlayGestureTooltip"> + Realizar gesto seleccionado en el mundo. + </string> + <string name="InventoryPlaySoundTooltip"> + Abrir la ventana con las opciones del Juego + </string> + <string name="InventoryOutboxNotMerchantTitle"> + Cualquier usuario puede vender objetos en el mercado. + </string> <string name="InventoryOutboxNotMerchantTooltip"/> - <string name="InventoryOutboxNotMerchant">Para hacerte comerciante debes [[MARKETPLACE_CREATE_STORE_URL] crear una tienda del Mercado].</string> - <string name="InventoryOutboxNoItemsTitle">El buzón de salida está vacÃo.</string> + <string name="InventoryOutboxNotMerchant"> + Para hacerte comerciante debes [[MARKETPLACE_CREATE_STORE_URL] crear una tienda del Mercado]. + </string> + <string name="InventoryOutboxNoItemsTitle"> + El buzón de salida está vacÃo. + </string> <string name="InventoryOutboxNoItemsTooltip"/> - <string name="InventoryOutboxNoItems">Arrastra carpetas a esta sección y pulsa en "Enviar al Mercado" para incluirlas en la lista de venta del [[MARKETPLACE_DASHBOARD_URL] Mercado].</string> - <string name="InventoryOutboxInitializingTitle">Inicializando el Mercado.</string> - <string name="InventoryOutboxInitializing">Estamos accediendo a tu cuenta de la [[MARKETPLACE_CREATE_STORE_URL] tienda del Mercado].</string> - <string name="InventoryOutboxErrorTitle">Errores del Mercado.</string> - <string name="InventoryOutboxError">La [[MARKETPLACE_CREATE_STORE_URL] tienda del Mercado] devuelve errores.</string> - <string name="InventoryMarketplaceError">Se ha producido un error al abrir ArtÃculos del Mercado. -Si sigues recibiendo el mismo mensaje, solicita ayuda al personal de asistencia de Second Life en http://support.secondlife.com</string> - <string name="InventoryMarketplaceListingsNoItemsTitle">Tu carpeta ArtÃculos del mercado está vacÃa.</string> - <string name="InventoryMarketplaceListingsNoItems">Arrastra carpetas a esta sección para incluirlas en la lista de venta del [[MARKETPLACE_DASHBOARD_URL] Mercado].</string> - <string name="InventoryItemsCount">( [ITEMS_COUNT] Objetos)</string> - <string name="Marketplace Validation Warning Stock">La carpeta de stock debe estar contenida en una carpeta de versión</string> - <string name="Marketplace Validation Error Mixed Stock">: Error: todos los artÃculos de una carpeta de stock deben ser del mismo tipo y que no se puedan copiar</string> - <string name="Marketplace Validation Error Subfolder In Stock">: Error: la carpeta de stock no puede contener subcarpetas</string> - <string name="Marketplace Validation Warning Empty">: Atención: la carpeta no contiene ningún artÃculo</string> - <string name="Marketplace Validation Warning Create Stock">: Atención: creando carpeta de stock</string> - <string name="Marketplace Validation Warning Create Version">: Atención: creando la carpeta de versión</string> - <string name="Marketplace Validation Warning Move">: Atención: moviendo artÃculos</string> - <string name="Marketplace Validation Warning Delete">: Atención: se ha transferido el contenido de la carpeta a la carpeta de stock, y se eliminará la carpeta vacÃa</string> - <string name="Marketplace Validation Error Stock Item">: Error: los artÃculos que no se pueden copiar deben estar contenidos en una carpeta de stock</string> - <string name="Marketplace Validation Warning Unwrapped Item">: Atención: los artÃculos deben estar contenidos en una carpeta de versión</string> - <string name="Marketplace Validation Error">: Error:</string> - <string name="Marketplace Validation Warning">: Atención:</string> - <string name="Marketplace Validation Error Empty Version">: Atención: la carpeta de versión debe contener al menos un artÃculo</string> - <string name="Marketplace Validation Error Empty Stock">: Atención: la carpeta de stock debe contener al menos un artÃculo</string> - <string name="Marketplace Validation No Error">No se han producido errores ni advertencias</string> - <string name="Marketplace Error None">Sin errores</string> - <string name="Marketplace Error Prefix">Error:</string> - <string name="Marketplace Error Not Merchant">Para poder enviar objetos al mercado, debes registrarte como comerciante (es gratis).</string> - <string name="Marketplace Error Not Accepted">No se puede mover el artÃculo a esa carpeta.</string> - <string name="Marketplace Error Unsellable Item">Este artÃculo no se puede vender en el Mercado.</string> - <string name="MarketplaceNoID">no Mkt ID</string> - <string name="MarketplaceLive">en la lista</string> - <string name="MarketplaceActive">activa</string> - <string name="MarketplaceMax">máx.</string> - <string name="MarketplaceStock">stock</string> - <string name="MarketplaceNoStock">existencias agotadas</string> - <string name="MarketplaceUpdating">actualizando...</string> - <string name="UploadFeeInfo">Las cuotas se basan en tu nivel de suscripcion. Niveles más altos tienen cuotas más bajas visita [https://secondlife.com/my/account/membership.php? para saber más]</string> - <string name="Open landmarks">Abrir puntos destacados</string> - <string name="Unconstrained">Sin Restricciones</string> + <string name="InventoryOutboxNoItems"> + Arrastra carpetas a esta sección y pulsa en "Enviar al Mercado" para incluirlas en la lista de venta del [[MARKETPLACE_DASHBOARD_URL] Mercado]. + </string> + <string name="InventoryOutboxInitializingTitle"> + Inicializando el Mercado. + </string> + <string name="InventoryOutboxInitializing"> + Estamos accediendo a tu cuenta de la [[MARKETPLACE_CREATE_STORE_URL] tienda del Mercado]. + </string> + <string name="InventoryOutboxErrorTitle"> + Errores del Mercado. + </string> + <string name="InventoryOutboxError"> + La [[MARKETPLACE_CREATE_STORE_URL] tienda del Mercado] devuelve errores. + </string> + <string name="InventoryMarketplaceError"> + Se ha producido un error al abrir ArtÃculos del Mercado. +Si sigues recibiendo el mismo mensaje, solicita ayuda al personal de asistencia de Second Life en http://support.secondlife.com + </string> + <string name="InventoryMarketplaceListingsNoItemsTitle"> + Tu carpeta ArtÃculos del mercado está vacÃa. + </string> + <string name="InventoryMarketplaceListingsNoItems"> + Arrastra carpetas a esta sección para incluirlas en la lista de venta del [[MARKETPLACE_DASHBOARD_URL] Mercado]. + </string> + <string name="InventoryItemsCount"> + ( [ITEMS_COUNT] Objetos) + </string> + <string name="Marketplace Validation Warning Stock"> + La carpeta de stock debe estar contenida en una carpeta de versión + </string> + <string name="Marketplace Validation Error Mixed Stock"> + : Error: todos los artÃculos de una carpeta de stock deben ser del mismo tipo y que no se puedan copiar + </string> + <string name="Marketplace Validation Error Subfolder In Stock"> + : Error: la carpeta de stock no puede contener subcarpetas + </string> + <string name="Marketplace Validation Warning Empty"> + : Atención: la carpeta no contiene ningún artÃculo + </string> + <string name="Marketplace Validation Warning Create Stock"> + : Atención: creando carpeta de stock + </string> + <string name="Marketplace Validation Warning Create Version"> + : Atención: creando la carpeta de versión + </string> + <string name="Marketplace Validation Warning Move"> + : Atención: moviendo artÃculos + </string> + <string name="Marketplace Validation Warning Delete"> + : Atención: se ha transferido el contenido de la carpeta a la carpeta de stock, y se eliminará la carpeta vacÃa + </string> + <string name="Marketplace Validation Error Stock Item"> + : Error: los artÃculos que no se pueden copiar deben estar contenidos en una carpeta de stock + </string> + <string name="Marketplace Validation Warning Unwrapped Item"> + : Atención: los artÃculos deben estar contenidos en una carpeta de versión + </string> + <string name="Marketplace Validation Error"> + : Error: + </string> + <string name="Marketplace Validation Warning"> + : Atención: + </string> + <string name="Marketplace Validation Error Empty Version"> + : Atención: la carpeta de versión debe contener al menos un artÃculo + </string> + <string name="Marketplace Validation Error Empty Stock"> + : Atención: la carpeta de stock debe contener al menos un artÃculo + </string> + <string name="Marketplace Validation No Error"> + No se han producido errores ni advertencias + </string> + <string name="Marketplace Error None"> + Sin errores + </string> + <string name="Marketplace Error Prefix"> + Error: + </string> + <string name="Marketplace Error Not Merchant"> + Para poder enviar objetos al mercado, debes registrarte como comerciante (es gratis). + </string> + <string name="Marketplace Error Not Accepted"> + No se puede mover el artÃculo a esa carpeta. + </string> + <string name="Marketplace Error Unsellable Item"> + Este artÃculo no se puede vender en el Mercado. + </string> + <string name="MarketplaceNoID"> + no Mkt ID + </string> + <string name="MarketplaceLive"> + en la lista + </string> + <string name="MarketplaceActive"> + activa + </string> + <string name="MarketplaceMax"> + máx. + </string> + <string name="MarketplaceStock"> + stock + </string> + <string name="MarketplaceNoStock"> + existencias agotadas + </string> + <string name="MarketplaceUpdating"> + actualizando... + </string> + <string name="UploadFeeInfo"> + Las cuotas se basan en tu nivel de suscripcion. Niveles más altos tienen cuotas más bajas visita [https://secondlife.com/my/account/membership.php? para saber más] + </string> + <string name="Open landmarks"> + Abrir puntos destacados + </string> + <string name="Unconstrained"> + Sin Restricciones + </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="LoadingContents"> + Cargando el contenido... + </string> + <string name="NoContents"> + No hay contenido + </string> <string name="WornOnAttachmentPoint" value="(lo llevas en: [ATTACHMENT_POINT])"/> <string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/> <string name="ActiveGesture" value="[GESLABEL] (activo)"/> @@ -630,1414 +1681,4140 @@ Si sigues recibiendo el mismo mensaje, solicita ayuda al personal de asistencia <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 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">Mis Favoritos</string> - <string name="InvFolder favorite">Mis Favoritos</string> - <string name="InvFolder Favorites">Mis Favoritos</string> - <string name="InvFolder favorites">Mis 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 Meshes">Redes</string> - <string name="InvFolder Received Items">Objetos recibidos</string> - <string name="InvFolder Merchant Outbox">Buzón de salida de comerciante</string> - <string name="InvFolder Friends">Amigos</string> - <string name="InvFolder All">Todas</string> - <string name="no_attachments">No tienes puestos anexos</string> - <string name="Attachments remain">Anexos (quedan [COUNT] ranuras)</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="Neck">Cuello</string> - <string name="Avatar Center">Centro del avatar</string> - <string name="Left Ring Finger">Dedo anular izquierdo</string> - <string name="Right Ring Finger">Dedo anular derecho</string> - <string name="Tail Base">Base de la cola</string> - <string name="Tail Tip">Extremo de la cola</string> - <string name="Left Wing">Ala izquierda</string> - <string name="Right Wing">Ala derecha</string> - <string name="Jaw">MandÃbula</string> - <string name="Alt Left Ear">Oreja izquierda alternativa</string> - <string name="Alt Right Ear">Oreja derecha alternativa</string> - <string name="Alt Left Eye">Ojo izquierdo alternativo</string> - <string name="Alt Right Eye">Ojo derecho alternativo</string> - <string name="Tongue">Lengua</string> - <string name="Groin">Ingle</string> - <string name="Left Hind Foot">Pata trasera izquierda</string> - <string name="Right Hind Foot">Pata trasera derecha</string> - <string name="Invalid Attachment">Punto de colocación no válido</string> - <string name="ATTACHMENT_MISSING_ITEM">Error: falta un artÃculo</string> - <string name="ATTACHMENT_MISSING_BASE_ITEM">Error: falta el artÃculo de base</string> - <string name="ATTACHMENT_NOT_ATTACHED">Error: el objeto se encuentra en el vestuario actual, pero no está anexado</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="av_render_everyone_now">Ahora todos pueden verte.</string> - <string name="av_render_not_everyone">Es posible que no todos los que están próximos puedan renderizarte.</string> - <string name="av_render_over_half">Es posible que más de la mitad de los que están próximos no puedan renderizarte.</string> - <string name="av_render_most_of">Es posible que la mayorÃa de los que están próximos no puedan renderizarte.</string> - <string name="av_render_anyone">Es posible que ninguno de los que están próximos pueda renderizarte.</string> - <string name="hud_description_total">Tu HUD</string> - <string name="hud_name_with_joint">[OBJ_NAME] (lo llevas en [JNT_NAME])</string> - <string name="hud_render_memory_warning">[HUD_DETAILS] usa mucha memoria de textura</string> - <string name="hud_render_cost_warning">[HUD_DETAILS] contiene muchas texturas y objetos complicados</string> - <string name="hud_render_heavy_textures_warning">[HUD_DETAILS] contiene muchas texturas grandes</string> - <string name="hud_render_cramped_warning">[HUD_DETAILS] contiene demasiados objetos</string> - <string name="hud_render_textures_warning">[HUD_DETAILS] contiene demasiadas texturas</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="CompileQueueServiceUnavailable">El servicio de compilación de scripts no está disponible</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="CompileNoExperiencePerm">Omitiendo el script [SCRIPT] con la experiencia [EXPERIENCE].</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="UploadFailed">Error al subir el archivo:</string> - <string name="ObjectOutOfRange">Script (objeto fuera de rango)</string> - <string name="ScriptWasDeleted">Script (eliminado del inventario)</string> - <string name="GodToolsObjectOwnedBy">El objeto [OBJECT] es propiedad de [OWNER]</string> - <string name="GroupsNone">ninguno</string> + <string name="InvFolder My Inventory"> + Mi Inventario + </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"> + Mis Favoritos + </string> + <string name="InvFolder favorite"> + Mis Favoritos + </string> + <string name="InvFolder Favorites"> + Mis Favoritos + </string> + <string name="InvFolder favorites"> + Mis 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 Meshes"> + Redes + </string> + <string name="InvFolder Received Items"> + Objetos recibidos + </string> + <string name="InvFolder Merchant Outbox"> + Buzón de salida de comerciante + </string> + <string name="InvFolder Friends"> + Amigos + </string> + <string name="InvFolder All"> + Todas + </string> + <string name="no_attachments"> + No tienes puestos anexos + </string> + <string name="Attachments remain"> + Anexos (quedan [COUNT] ranuras) + </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="Neck"> + Cuello + </string> + <string name="Avatar Center"> + Centro del avatar + </string> + <string name="Left Ring Finger"> + Dedo anular izquierdo + </string> + <string name="Right Ring Finger"> + Dedo anular derecho + </string> + <string name="Tail Base"> + Base de la cola + </string> + <string name="Tail Tip"> + Extremo de la cola + </string> + <string name="Left Wing"> + Ala izquierda + </string> + <string name="Right Wing"> + Ala derecha + </string> + <string name="Jaw"> + MandÃbula + </string> + <string name="Alt Left Ear"> + Oreja izquierda alternativa + </string> + <string name="Alt Right Ear"> + Oreja derecha alternativa + </string> + <string name="Alt Left Eye"> + Ojo izquierdo alternativo + </string> + <string name="Alt Right Eye"> + Ojo derecho alternativo + </string> + <string name="Tongue"> + Lengua + </string> + <string name="Groin"> + Ingle + </string> + <string name="Left Hind Foot"> + Pata trasera izquierda + </string> + <string name="Right Hind Foot"> + Pata trasera derecha + </string> + <string name="Invalid Attachment"> + Punto de colocación no válido + </string> + <string name="ATTACHMENT_MISSING_ITEM"> + Error: falta un artÃculo + </string> + <string name="ATTACHMENT_MISSING_BASE_ITEM"> + Error: falta el artÃculo de base + </string> + <string name="ATTACHMENT_NOT_ATTACHED"> + Error: el objeto se encuentra en el vestuario actual, pero no está anexado + </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="av_render_everyone_now"> + Ahora todos pueden verte. + </string> + <string name="av_render_not_everyone"> + Es posible que no todos los que están próximos puedan renderizarte. + </string> + <string name="av_render_over_half"> + Es posible que más de la mitad de los que están próximos no puedan renderizarte. + </string> + <string name="av_render_most_of"> + Es posible que la mayorÃa de los que están próximos no puedan renderizarte. + </string> + <string name="av_render_anyone"> + Es posible que ninguno de los que están próximos pueda renderizarte. + </string> + <string name="hud_description_total"> + Tu HUD + </string> + <string name="hud_name_with_joint"> + [OBJ_NAME] (lo llevas en [JNT_NAME]) + </string> + <string name="hud_render_memory_warning"> + [HUD_DETAILS] usa mucha memoria de textura + </string> + <string name="hud_render_cost_warning"> + [HUD_DETAILS] contiene muchas texturas y objetos complicados + </string> + <string name="hud_render_heavy_textures_warning"> + [HUD_DETAILS] contiene muchas texturas grandes + </string> + <string name="hud_render_cramped_warning"> + [HUD_DETAILS] contiene demasiados objetos + </string> + <string name="hud_render_textures_warning"> + [HUD_DETAILS] contiene demasiadas texturas + </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="CompileQueueServiceUnavailable"> + El servicio de compilación de scripts no está disponible + </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="CompileNoExperiencePerm"> + Omitiendo el script [SCRIPT] con la experiencia [EXPERIENCE]. + </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="UploadFailed"> + Error al subir el archivo: + </string> + <string name="ObjectOutOfRange"> + Script (objeto fuera de rango) + </string> + <string name="ScriptWasDeleted"> + Script (eliminado del inventario) + </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="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="GroupPlanningDate">[mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]</string> + <string name="GroupPlanningDate"> + [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc] + </string> <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="Anyone">cualquiera</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">Siempre permitido: ([ALLOWEDAGENTS], de un máx. de [MAXACCESS])</string> - <string name="RegionInfoAllowedGroups">Grupos siempre permitidos: ([ALLOWEDGROUPS], de un máx. de [MAXACCESS])</string> - <string name="RegionInfoBannedResidents">Siempre prohibido: ([BANNEDAGENTS], de un máx. de [MAXBANNED])</string> - <string name="RegionInfoListTypeAllowedAgents">Siempre permitido</string> - <string name="RegionInfoListTypeBannedAgents">Siempre prohibido</string> - <string name="RegionInfoAllEstates">todos los estados</string> - <string name="RegionInfoManagedEstates">estados administrados</string> - <string name="RegionInfoThisEstate">este estado</string> - <string name="AndNMore">y [EXTRA_COUNT] más</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">Cráneo</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">Columna</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 derecho</string> - <string name="ATTACH_LUARM">Brazo izq.</string> - <string name="ATTACH_LLARM">Antebrazo izquierdo</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">Abdomen</string> - <string name="ATTACH_LEFT_PEC">Pectoral izquierdo</string> - <string name="ATTACH_RIGHT_PEC">Pectoral derecho</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="ATTACH_NECK">Cuello</string> - <string name="ATTACH_AVATAR_CENTER">Centro del avatar</string> - <string name="ATTACH_LHAND_RING1">Dedo anular izquierdo</string> - <string name="ATTACH_RHAND_RING1">Dedo anular derecho</string> - <string name="ATTACH_TAIL_BASE">Base de la cola</string> - <string name="ATTACH_TAIL_TIP">Extremo de la cola</string> - <string name="ATTACH_LWING">Ala izquierda</string> - <string name="ATTACH_RWING">Ala derecha</string> - <string name="ATTACH_FACE_JAW">MandÃbula</string> - <string name="ATTACH_FACE_LEAR">Oreja izquierda alternativa</string> - <string name="ATTACH_FACE_REAR">Oreja derecha alternativa</string> - <string name="ATTACH_FACE_LEYE">Ojo izquierdo alternativo</string> - <string name="ATTACH_FACE_REYE">Ojo derecho alternativo</string> - <string name="ATTACH_FACE_TONGUE">Lengua</string> - <string name="ATTACH_GROIN">Ingle</string> - <string name="ATTACH_HIND_LFOOT">Pata trasera izquierda</string> - <string name="ATTACH_HIND_RFOOT">Pata trasera derecha</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="DoNotDisturbModeResponseDefault">Este residente tiene activado 'No molestar' y verá tu mensaje más tarde.</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="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="Anyone"> + cualquiera + </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"> + Siempre permitido: ([ALLOWEDAGENTS], de un máx. de [MAXACCESS]) + </string> + <string name="RegionInfoAllowedGroups"> + Grupos siempre permitidos: ([ALLOWEDGROUPS], de un máx. de [MAXACCESS]) + </string> + <string name="RegionInfoBannedResidents"> + Siempre prohibido: ([BANNEDAGENTS], de un máx. de [MAXBANNED]) + </string> + <string name="RegionInfoListTypeAllowedAgents"> + Siempre permitido + </string> + <string name="RegionInfoListTypeBannedAgents"> + Siempre prohibido + </string> + <string name="RegionInfoAllEstates"> + todos los estados + </string> + <string name="RegionInfoManagedEstates"> + estados administrados + </string> + <string name="RegionInfoThisEstate"> + este estado + </string> + <string name="AndNMore"> + y [EXTRA_COUNT] más + </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"> + Cráneo + </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"> + Columna + </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 derecho + </string> + <string name="ATTACH_LUARM"> + Brazo izq. + </string> + <string name="ATTACH_LLARM"> + Antebrazo izquierdo + </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"> + Abdomen + </string> + <string name="ATTACH_LEFT_PEC"> + Pectoral izquierdo + </string> + <string name="ATTACH_RIGHT_PEC"> + Pectoral derecho + </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="ATTACH_NECK"> + Cuello + </string> + <string name="ATTACH_AVATAR_CENTER"> + Centro del avatar + </string> + <string name="ATTACH_LHAND_RING1"> + Dedo anular izquierdo + </string> + <string name="ATTACH_RHAND_RING1"> + Dedo anular derecho + </string> + <string name="ATTACH_TAIL_BASE"> + Base de la cola + </string> + <string name="ATTACH_TAIL_TIP"> + Extremo de la cola + </string> + <string name="ATTACH_LWING"> + Ala izquierda + </string> + <string name="ATTACH_RWING"> + Ala derecha + </string> + <string name="ATTACH_FACE_JAW"> + MandÃbula + </string> + <string name="ATTACH_FACE_LEAR"> + Oreja izquierda alternativa + </string> + <string name="ATTACH_FACE_REAR"> + Oreja derecha alternativa + </string> + <string name="ATTACH_FACE_LEYE"> + Ojo izquierdo alternativo + </string> + <string name="ATTACH_FACE_REYE"> + Ojo derecho alternativo + </string> + <string name="ATTACH_FACE_TONGUE"> + Lengua + </string> + <string name="ATTACH_GROIN"> + Ingle + </string> + <string name="ATTACH_HIND_LFOOT"> + Pata trasera izquierda + </string> + <string name="ATTACH_HIND_RFOOT"> + Pata trasera derecha + </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="DoNotDisturbModeResponseDefault"> + Este residente tiene activado 'No molestar' y verá tu mensaje más tarde. + </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="LocalSettings">Configuración local</string> - <string name="RegionSettings">Configuración de la región</string> - <string name="NoEnvironmentSettings">Esta región no es compatible con las opciones de entorno.</string> - <string name="EnvironmentSun">Sol</string> - <string name="EnvironmentMoon">Luna</string> - <string name="EnvironmentBloom">Florecimiento</string> - <string name="EnvironmentCloudNoise">Ruido de nubes</string> - <string name="EnvironmentNormalMap">Vista Normal</string> - <string name="EnvironmentTransparent">Transparente</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="NoPicksText">No has creado destacados. Haz clic en el botón Más para crear uno.</string> - <string name="NoClassifiedsText">No has creado clasificados. Haz clic en el botón Nuevo para crear un anuncio clasificado.</string> - <string name="NoAvatarPicksClassifiedsText">El usuario no tiene clasificados ni destacados</string> - <string name="NoAvatarPicksText">El usuario no tiene destacados</string> - <string name="NoAvatarClassifiedsText">El usuario no tiene clasificados</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="GroupMoneyDate">[weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]</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="IntelDriverPage">http://www.intel.com/p/en_US/support/detect/graphics</string> - <string name="NvidiaDriverPage">http://www.nvidia.com/Download/index.aspx?lang=es</string> - <string name="AMDDriverPage">http://support.amd.com/us/Pages/AMDSupportHub.aspx</string> - <string name="MBCmdLineError">Ha habido un error analizando la lÃnea de comando. + <string name="GroupOwned"> + Propiedad del grupo + </string> + <string name="Public"> + Público + </string> + <string name="LocalSettings"> + Configuración local + </string> + <string name="RegionSettings"> + Configuración de la región + </string> + <string name="NoEnvironmentSettings"> + Esta región no es compatible con las opciones de entorno. + </string> + <string name="EnvironmentSun"> + Sol + </string> + <string name="EnvironmentMoon"> + Luna + </string> + <string name="EnvironmentBloom"> + Florecimiento + </string> + <string name="EnvironmentCloudNoise"> + Ruido de nubes + </string> + <string name="EnvironmentNormalMap"> + Vista Normal + </string> + <string name="EnvironmentTransparent"> + Transparente + </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="NoPicksText"> + No has creado destacados. Haz clic en el botón Más para crear uno. + </string> + <string name="NoClassifiedsText"> + No has creado clasificados. Haz clic en el botón Nuevo para crear un anuncio clasificado. + </string> + <string name="NoAvatarPicksClassifiedsText"> + El usuario no tiene clasificados ni destacados + </string> + <string name="NoAvatarPicksText"> + El usuario no tiene destacados + </string> + <string name="NoAvatarClassifiedsText"> + El usuario no tiene clasificados + </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="GroupMoneyDate"> + [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc] + </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="IntelDriverPage"> + http://www.intel.com/p/en_US/support/detect/graphics + </string> + <string name="NvidiaDriverPage"> + http://www.nvidia.com/Download/index.aspx?lang=es + </string> + <string name="AMDDriverPage"> + http://support.amd.com/us/Pages/AMDSupportHub.aspx + </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. +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. +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. +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. +¿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="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="Hover">Pasa el cursor</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="LocationCtrlForSaleTooltip">Comprar este terreno</string> - <string name="LocationCtrlAdultIconTooltip">Región Adulta</string> - <string name="LocationCtrlModerateIconTooltip">Región Moderada</string> - <string name="LocationCtrlGeneralIconTooltip">Región General</string> - <string name="LocationCtrlSeeAVsTooltip">Los avatares que están en esta parcela no pueden ser vistos ni escuchados por los que están fuera de ella</string> - <string name="LocationCtrlPathfindingDirtyTooltip">Los objetos que se mueven pueden presentar un comportamiento incorrecto en la región hasta que ésta se recargue.</string> - <string name="LocationCtrlPathfindingDisabledTooltip">Esta región no tiene activado el pathfinding dinámico.</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="OnlineStatus">Conectado/a</string> - <string name="OfflineStatus">Desconectado/a</string> - <string name="not_online_msg">El usuario no está conectado: el mensaje se almacenará para entregárselo más tarde.</string> - <string name="not_online_inventory">El usuario no está conectado: el inventario se ha guardado.</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="you_auto_rejected_call-im">Rechazaste la llamada de voz automáticamente porque estaba activado 'No molestar'.</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">Chat multi-persona</string> - <string name="conference-title-incoming">Conferencia con [AGENT_NAME]</string> - <string name="inventory_item_offered-im">Ãtem del inventario '[ITEM_NAME]' ofrecido</string> - <string name="inventory_folder_offered-im">Carpeta del inventario '[ITEM_NAME]' ofrecida</string> - <string name="share_alert">Arrastra los Ãtems desde el invenbtario hasta aquÃ</string> - <string name="facebook_post_success">Has publicado en Facebook.</string> - <string name="flickr_post_success">Has publicado en Flickr.</string> - <string name="twitter_post_success">Has publicado en Twitter.</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="Home position set.">Posición inicial establecida.</string> - <string name="voice_morphing_url">https://secondlife.com/destination/voice-island</string> - <string name="premium_voice_morphing_url">https://secondlife.com/destination/voice-morphing-premium</string> - <string name="paid_you_ldollars">[NAME] te ha pagado [AMOUNT] L$ [REASON].</string> - <string name="paid_you_ldollars_gift">[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_gift">Has pagado [AMOUNT] L$ a [NAME]: [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="you_paid_failure_ldollars">No has pagado a [NAME] [AMOUNT] L$ [REASON].</string> - <string name="you_paid_failure_ldollars_gift">No has pagado a [NAME] [AMOUNT] L$: [REASON]</string> - <string name="you_paid_failure_ldollars_no_info">No has pagado [AMOUNT] L$.</string> - <string name="you_paid_failure_ldollars_no_reason">No has pagado a [NAME] [AMOUNT] L$.</string> - <string name="you_paid_failure_ldollars_no_name">No has pagado [AMOUNT] L$ [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... +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="Hover"> + Pasa el cursor + </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="LocationCtrlForSaleTooltip"> + Comprar este terreno + </string> + <string name="LocationCtrlAdultIconTooltip"> + Región Adulta + </string> + <string name="LocationCtrlModerateIconTooltip"> + Región Moderada + </string> + <string name="LocationCtrlGeneralIconTooltip"> + Región General + </string> + <string name="LocationCtrlSeeAVsTooltip"> + Los avatares que están en esta parcela no pueden ser vistos ni escuchados por los que están fuera de ella + </string> + <string name="LocationCtrlPathfindingDirtyTooltip"> + Los objetos que se mueven pueden presentar un comportamiento incorrecto en la región hasta que ésta se recargue. + </string> + <string name="LocationCtrlPathfindingDisabledTooltip"> + Esta región no tiene activado el pathfinding dinámico. + </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="OnlineStatus"> + Conectado/a + </string> + <string name="OfflineStatus"> + Desconectado/a + </string> + <string name="not_online_msg"> + El usuario no está conectado: el mensaje se almacenará para entregárselo más tarde. + </string> + <string name="not_online_inventory"> + El usuario no está conectado: el inventario se ha guardado. + </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="you_auto_rejected_call-im"> + Rechazaste la llamada de voz automáticamente porque estaba activado 'No molestar'. + </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"> + Chat multi-persona + </string> + <string name="conference-title-incoming"> + Conferencia con [AGENT_NAME] + </string> + <string name="inventory_item_offered-im"> + Ãtem del inventario '[ITEM_NAME]' ofrecido + </string> + <string name="inventory_folder_offered-im"> + Carpeta del inventario '[ITEM_NAME]' ofrecida + </string> + <string name="bot_warning"> + Estás conversando con un bot, [NAME]. No compartas información personal. +Más información en https://second.life/scripted-agents. + </string> + <string name="share_alert"> + Arrastra los Ãtems desde el invenbtario hasta aquà + </string> + <string name="facebook_post_success"> + Has publicado en Facebook. + </string> + <string name="flickr_post_success"> + Has publicado en Flickr. + </string> + <string name="twitter_post_success"> + Has publicado en Twitter. + </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="Home position set."> + Posición inicial establecida. + </string> + <string name="voice_morphing_url"> + https://secondlife.com/destination/voice-island + </string> + <string name="premium_voice_morphing_url"> + https://secondlife.com/destination/voice-morphing-premium + </string> + <string name="paid_you_ldollars"> + [NAME] te ha pagado [AMOUNT] L$ [REASON]. + </string> + <string name="paid_you_ldollars_gift"> + [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_gift"> + Has pagado [AMOUNT] L$ a [NAME]: [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="you_paid_failure_ldollars"> + No has pagado a [NAME] [AMOUNT] L$ [REASON]. + </string> + <string name="you_paid_failure_ldollars_gift"> + No has pagado a [NAME] [AMOUNT] L$: [REASON] + </string> + <string name="you_paid_failure_ldollars_no_info"> + No has pagado [AMOUNT] L$. + </string> + <string name="you_paid_failure_ldollars_no_reason"> + No has pagado a [NAME] [AMOUNT] L$. + </string> + <string name="you_paid_failure_ldollars_no_name"> + No has pagado [AMOUNT] L$ [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 Universal">Nuevo Universal</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">Hombre - 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="New Daycycle">Nuevo Ciclo del dÃa</string> - <string name="New Water">Nueva Agua</string> - <string name="New Sky">Nuevo Cielo</string> - <string name="/bow">/reverencia</string> - <string name="/clap">/aplaudir</string> - <string name="/count">/contar</string> - <string name="/extinguish">/apagar</string> - <string name="/kmb">/bmc</string> - <string name="/muscle">/músculo</string> - <string name="/no">/no</string> - <string name="/no!">/¡no!</string> - <string name="/paper">/papel</string> - <string name="/pointme">/señalarme</string> - <string name="/pointyou">/señalarte</string> - <string name="/rock">/piedra</string> - <string name="/scissor">/tijera</string> - <string name="/smoke">/fumar</string> - <string name="/stretch">/estirar</string> - <string name="/whistle">/silbar</string> - <string name="/yes">/sÃ</string> - <string name="/yes!">/¡sÃ!</string> - <string name="afk">ausente</string> - <string name="dance1">baile1</string> - <string name="dance2">baile2</string> - <string name="dance3">baile3</string> - <string name="dance4">baile4</string> - <string name="dance5">baile5</string> - <string name="dance6">baile6</string> - <string name="dance7">baile7</string> - <string name="dance8">baile8</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="outfit_photo_load_dimensions_error">La foto del vestuario puede tener como máx. un tamaño de [WIDTH]*[HEIGHT]. Cambia el tamaño o utiliza otra imagen</string> - <string name="outfit_photo_select_dimensions_error">La foto del vestuario puede tener como máx. un tamaño de [WIDTH]*[HEIGHT]. Selecciona otra textura</string> - <string name="outfit_photo_verify_dimensions_error">No se pueden verificar las dimensiones de la foto. Espera hasta que aparezca el tamaño de la foto en el selector</string> +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 Universal"> + Nuevo Universal + </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"> + Hombre - 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="New Daycycle"> + Nuevo Ciclo del dÃa + </string> + <string name="New Water"> + Nueva Agua + </string> + <string name="New Sky"> + Nuevo Cielo + </string> + <string name="/bow"> + /reverencia + </string> + <string name="/clap"> + /aplaudir + </string> + <string name="/count"> + /contar + </string> + <string name="/extinguish"> + /apagar + </string> + <string name="/kmb"> + /bmc + </string> + <string name="/muscle"> + /músculo + </string> + <string name="/no"> + /no + </string> + <string name="/no!"> + /¡no! + </string> + <string name="/paper"> + /papel + </string> + <string name="/pointme"> + /señalarme + </string> + <string name="/pointyou"> + /señalarte + </string> + <string name="/rock"> + /piedra + </string> + <string name="/scissor"> + /tijera + </string> + <string name="/smoke"> + /fumar + </string> + <string name="/stretch"> + /estirar + </string> + <string name="/whistle"> + /silbar + </string> + <string name="/yes"> + /sà + </string> + <string name="/yes!"> + /¡sÃ! + </string> + <string name="afk"> + ausente + </string> + <string name="dance1"> + baile1 + </string> + <string name="dance2"> + baile2 + </string> + <string name="dance3"> + baile3 + </string> + <string name="dance4"> + baile4 + </string> + <string name="dance5"> + baile5 + </string> + <string name="dance6"> + baile6 + </string> + <string name="dance7"> + baile7 + </string> + <string name="dance8"> + baile8 + </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="outfit_photo_load_dimensions_error"> + La foto del vestuario puede tener como máx. un tamaño de [WIDTH]*[HEIGHT]. Cambia el tamaño o utiliza otra imagen + </string> + <string name="outfit_photo_select_dimensions_error"> + La foto del vestuario puede tener como máx. un tamaño de [WIDTH]*[HEIGHT]. Selecciona otra textura + </string> + <string name="outfit_photo_verify_dimensions_error"> + No se pueden verificar las dimensiones de la foto. Espera hasta que aparezca el tamaño de la foto en el selector + </string> <string name="words_separator" value=","/> - <string name="server_is_down">Parece que hay algún problema que ha escapado a nuestros controles. + <string name="server_is_down"> + Parece que hay algún problema que ha escapado a nuestros controles. Visita http://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="Group Ban">Expulsión de grupo</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. + 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="Group Ban"> + Expulsión de grupo + </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="TranslationFailed">Error al traducir: [REASON]</string> - <string name="TranslationResponseParseError">Error al analizar la respuesta de la traducción.</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="BeaconSun">Visualización de la baliza de dirección del sol (naranja)</string> - <string name="BeaconMoon">Visualización de la baliza de dirección de la luna (violeta)</string> - <string name="ParticleHiding">Ocultando las partÃculas</string> - <string name="Command_AboutLand_Label">Acerca del terreno</string> - <string name="Command_Appearance_Label">Apariencia</string> - <string name="Command_Avatar_Label">Avatar</string> - <string name="Command_Build_Label">Construir</string> - <string name="Command_Chat_Label">Chat</string> - <string name="Command_Conversations_Label">Conversaciones</string> - <string name="Command_Compass_Label">Brújula</string> - <string name="Command_Destinations_Label">Destinos</string> - <string name="Command_Environments_Label">Mis entornos</string> - <string name="Command_Facebook_Label">Facebook</string> - <string name="Command_Flickr_Label">Flickr</string> - <string name="Command_Gestures_Label">Gestos</string> - <string name="Command_Grid_Status_Label">Estado del Grid</string> - <string name="Command_HowTo_Label">Cómo</string> - <string name="Command_Inventory_Label">Inventario</string> - <string name="Command_Map_Label">Mapa</string> - <string name="Command_Marketplace_Label">Mercado</string> - <string name="Command_MarketplaceListings_Label">Mercado</string> - <string name="Command_MiniMap_Label">Minimapa</string> - <string name="Command_Move_Label">Caminar / Correr / Volar</string> - <string name="Command_Outbox_Label">Buzón de salida de comerciante</string> - <string name="Command_People_Label">Gente</string> - <string name="Command_Picks_Label">Destacados</string> - <string name="Command_Places_Label">Lugares</string> - <string name="Command_Preferences_Label">Preferencias</string> - <string name="Command_Profile_Label">Perfil</string> - <string name="Command_Report_Abuse_Label">Denunciar una infracción</string> - <string name="Command_Search_Label">Buscar</string> - <string name="Command_Snapshot_Label">Foto</string> - <string name="Command_Speak_Label">Hablar</string> - <string name="Command_Twitter_Label">Twitter</string> - <string name="Command_View_Label">Controles de la cámara</string> - <string name="Command_Voice_Label">Configuración de voz</string> - <string name="Command_AboutLand_Tooltip">Información sobre el terreno que vas a visitar</string> - <string name="Command_Appearance_Tooltip">Cambiar tu avatar</string> - <string name="Command_Avatar_Tooltip">Elegir un avatar completo</string> - <string name="Command_Build_Tooltip">Construir objetos y modificar la forma del terreno</string> - <string name="Command_Chat_Tooltip">Habla por chat de texto con las personas próximas</string> - <string name="Command_Conversations_Tooltip">Conversar con todos</string> - <string name="Command_Compass_Tooltip">Brújula</string> - <string name="Command_Destinations_Tooltip">Destinos de interés</string> - <string name="Command_Environments_Tooltip">Mis entornos</string> - <string name="Command_Facebook_Tooltip">Publicar en Facebook</string> - <string name="Command_Flickr_Tooltip">Subir a Flickr</string> - <string name="Command_Gestures_Tooltip">Gestos para tu avatar</string> - <string name="Command_Grid_Status_Tooltip">Mostrar el estado actual del Grid</string> - <string name="Command_HowTo_Tooltip">Cómo hacer las tareas habituales</string> - <string name="Command_Inventory_Tooltip">Ver y usar tus pertenencias</string> - <string name="Command_Map_Tooltip">Mapa del mundo</string> - <string name="Command_Marketplace_Tooltip">Ir de compras</string> - <string name="Command_MarketplaceListings_Tooltip">Vende tu creación</string> - <string name="Command_MiniMap_Tooltip">Mostrar la gente que está cerca</string> - <string name="Command_Move_Tooltip">Desplazando el avatar</string> - <string name="Command_Outbox_Tooltip">Transfiere objetos a tu mercado para venderlos</string> - <string name="Command_People_Tooltip">Amigos, grupos y personas próximas</string> - <string name="Command_Picks_Tooltip">Lugares que se mostrarán como favoritos en tu perfil</string> - <string name="Command_Places_Tooltip">Lugares que has guardado</string> - <string name="Command_Preferences_Tooltip">Preferencias</string> - <string name="Command_Profile_Tooltip">Consulta o edita tu perfil</string> - <string name="Command_Report_Abuse_Tooltip">Denunciar una infracción</string> - <string name="Command_Search_Tooltip">Buscar lugares, eventos y personas</string> - <string name="Command_Snapshot_Tooltip">Tomar una fotografÃa</string> - <string name="Command_Speak_Tooltip">Utiliza el micrófono para hablar con las personas próximas</string> - <string name="Command_Twitter_Tooltip">Twitter</string> - <string name="Command_View_Tooltip">Cambiando el ángulo de la cámara</string> - <string name="Command_Voice_Tooltip">Controles de volumen para las llamadas y la gente que se encuentre cerca de ti en el mundo virtual</string> - <string name="Toolbar_Bottom_Tooltip">actualmente en tu barra de herramientas inferior</string> - <string name="Toolbar_Left_Tooltip">actualmente en tu barra de herramientas izquierda</string> - <string name="Toolbar_Right_Tooltip">actualmente en tu barra de herramientas derecha</string> - <string name="Retain%">% retención</string> - <string name="Detail">Detalle</string> - <string name="Better Detail">Mejor detalle</string> - <string name="Surface">Superficie</string> - <string name="Solid">Sólido</string> - <string name="Wrap">Envoltura</string> - <string name="Preview">Vista previa</string> - <string name="Normal">Normal</string> - <string name="Pathfinding_Wiki_URL">http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer</string> - <string name="Pathfinding_Object_Attr_None">Ninguno</string> - <string name="Pathfinding_Object_Attr_Permanent">Afecta al navmesh</string> - <string name="Pathfinding_Object_Attr_Character">Personaje</string> - <string name="Pathfinding_Object_Attr_MultiSelect">(Múltiple)</string> - <string name="snapshot_quality_very_low">Muy bajo</string> - <string name="snapshot_quality_low">Bajo</string> - <string name="snapshot_quality_medium">Medio</string> - <string name="snapshot_quality_high">Alto</string> - <string name="snapshot_quality_very_high">Muy alto</string> - <string name="TeleportMaturityExceeded">El Residente no puede visitar esta región.</string> - <string name="UserDictionary">[Usuario]</string> - <string name="experience_tools_experience">Experiencia</string> - <string name="ExperienceNameNull">(sin experiencia)</string> - <string name="ExperienceNameUntitled">(experiencia sin tÃtulo)</string> - <string name="Land-Scope">Activa en el terreno</string> - <string name="Grid-Scope">Activa en el Grid</string> - <string name="Allowed_Experiences_Tab">PERMITIDO</string> - <string name="Blocked_Experiences_Tab">BLOQUEADO</string> - <string name="Contrib_Experiences_Tab">COLABORADOR</string> - <string name="Admin_Experiences_Tab">ADMIN.</string> - <string name="Recent_Experiences_Tab">RECIENTE</string> - <string name="Owned_Experiences_Tab">PROPIEDAD</string> - <string name="ExperiencesCounter">([EXPERIENCES], máx. [MAXEXPERIENCES])</string> - <string name="ExperiencePermission1">hacerte con tus controles</string> - <string name="ExperiencePermission3">activar animaciones en tu avatar</string> - <string name="ExperiencePermission4">anexar a tu avatar</string> - <string name="ExperiencePermission9">seguimiento de la cámara</string> - <string name="ExperiencePermission10">controlar tu cámara</string> - <string name="ExperiencePermission11">teleportarte</string> - <string name="ExperiencePermission12">aceptar automáticamente permisos de experiencias</string> - <string name="ExperiencePermission16">forzar que el avatar se siente</string> - <string name="ExperiencePermission17">cambiar tu configuración del entorno</string> - <string name="ExperiencePermissionShortUnknown">realizar una operación desconocida: [Permission]</string> - <string name="ExperiencePermissionShort1">Ponerte al mando</string> - <string name="ExperiencePermissionShort3">Activar animaciones</string> - <string name="ExperiencePermissionShort4">Anexar</string> - <string name="ExperiencePermissionShort9">Seguir la cámara</string> - <string name="ExperiencePermissionShort10">Controlar la cámara</string> - <string name="ExperiencePermissionShort11">Teleporte</string> - <string name="ExperiencePermissionShort12">Otorgar permisos</string> - <string name="ExperiencePermissionShort16">Sentarte</string> - <string name="ExperiencePermissionShort17">Entorno</string> - <string name="logging_calls_disabled_log_empty">No se están registrando las conversaciones. Para empezar a grabar un registro, elige "Guardar: Solo registro" o "Guardar: Registro y transcripciones" en Preferencias > Chat.</string> - <string name="logging_calls_disabled_log_not_empty">No se registrarán más conversaciones. Para reanudar la grabación de un registro, elige "Guardar: Solo registro" o "Guardar: Registro y transcripciones" en Preferencias > Chat.</string> - <string name="logging_calls_enabled_log_empty">No hay conversaciones grabadas. Después de contactar con una persona, o de que alguien contacte contigo, aquà se mostrará una entrada de registro.</string> - <string name="loading_chat_logs">Cargando...</string> - <string name="na">n/c</string> - <string name="preset_combo_label">-Lista vacÃa-</string> - <string name="Default">Predeterminado</string> - <string name="none_paren_cap">(ninguno)</string> - <string name="no_limit">Sin lÃmite</string> - <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">La forma fÃsica contiene triángulos demasiado pequeños. Intenta simplificar el modelo fÃsico.</string> - <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH">La forma fÃsica contiene datos de confirmación erróneos. Intenta corregir el modelo fÃsico.</string> - <string name="Mav_Details_MAV_UNKNOWN_VERSION">La versión de la forma fÃsica no es correcta. Configura la versión correcta del modelo fÃsico.</string> - <string name="couldnt_resolve_host">Error de DNS al resolver el nombre del host([HOSTNAME]). +(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="TranslationFailed"> + Error al traducir: [REASON] + </string> + <string name="TranslationResponseParseError"> + Error al analizar la respuesta de la traducción. + </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="BeaconSun"> + Visualización de la baliza de dirección del sol (naranja) + </string> + <string name="BeaconMoon"> + Visualización de la baliza de dirección de la luna (violeta) + </string> + <string name="ParticleHiding"> + Ocultando las partÃculas + </string> + <string name="Command_AboutLand_Label"> + Acerca del terreno + </string> + <string name="Command_Appearance_Label"> + Apariencia + </string> + <string name="Command_Avatar_Label"> + Avatar + </string> + <string name="Command_Build_Label"> + Construir + </string> + <string name="Command_Chat_Label"> + Chat + </string> + <string name="Command_Conversations_Label"> + Conversaciones + </string> + <string name="Command_Compass_Label"> + Brújula + </string> + <string name="Command_Destinations_Label"> + Destinos + </string> + <string name="Command_Environments_Label"> + Mis entornos + </string> + <string name="Command_Facebook_Label"> + Facebook + </string> + <string name="Command_Flickr_Label"> + Flickr + </string> + <string name="Command_Gestures_Label"> + Gestos + </string> + <string name="Command_Grid_Status_Label"> + Estado del Grid + </string> + <string name="Command_HowTo_Label"> + Cómo + </string> + <string name="Command_Inventory_Label"> + Inventario + </string> + <string name="Command_Map_Label"> + Mapa + </string> + <string name="Command_Marketplace_Label"> + Mercado + </string> + <string name="Command_MarketplaceListings_Label"> + Mercado + </string> + <string name="Command_MiniMap_Label"> + Minimapa + </string> + <string name="Command_Move_Label"> + Caminar / Correr / Volar + </string> + <string name="Command_Outbox_Label"> + Buzón de salida de comerciante + </string> + <string name="Command_People_Label"> + Gente + </string> + <string name="Command_Picks_Label"> + Destacados + </string> + <string name="Command_Places_Label"> + Lugares + </string> + <string name="Command_Preferences_Label"> + Preferencias + </string> + <string name="Command_Profile_Label"> + Perfil + </string> + <string name="Command_Report_Abuse_Label"> + Denunciar una infracción + </string> + <string name="Command_Search_Label"> + Buscar + </string> + <string name="Command_Snapshot_Label"> + Foto + </string> + <string name="Command_Speak_Label"> + Hablar + </string> + <string name="Command_Twitter_Label"> + Twitter + </string> + <string name="Command_View_Label"> + Controles de la cámara + </string> + <string name="Command_Voice_Label"> + Configuración de voz + </string> + <string name="Command_AboutLand_Tooltip"> + Información sobre el terreno que vas a visitar + </string> + <string name="Command_Appearance_Tooltip"> + Cambiar tu avatar + </string> + <string name="Command_Avatar_Tooltip"> + Elegir un avatar completo + </string> + <string name="Command_Build_Tooltip"> + Construir objetos y modificar la forma del terreno + </string> + <string name="Command_Chat_Tooltip"> + Habla por chat de texto con las personas próximas + </string> + <string name="Command_Conversations_Tooltip"> + Conversar con todos + </string> + <string name="Command_Compass_Tooltip"> + Brújula + </string> + <string name="Command_Destinations_Tooltip"> + Destinos de interés + </string> + <string name="Command_Environments_Tooltip"> + Mis entornos + </string> + <string name="Command_Facebook_Tooltip"> + Publicar en Facebook + </string> + <string name="Command_Flickr_Tooltip"> + Subir a Flickr + </string> + <string name="Command_Gestures_Tooltip"> + Gestos para tu avatar + </string> + <string name="Command_Grid_Status_Tooltip"> + Mostrar el estado actual del Grid + </string> + <string name="Command_HowTo_Tooltip"> + Cómo hacer las tareas habituales + </string> + <string name="Command_Inventory_Tooltip"> + Ver y usar tus pertenencias + </string> + <string name="Command_Map_Tooltip"> + Mapa del mundo + </string> + <string name="Command_Marketplace_Tooltip"> + Ir de compras + </string> + <string name="Command_MarketplaceListings_Tooltip"> + Vende tu creación + </string> + <string name="Command_MiniMap_Tooltip"> + Mostrar la gente que está cerca + </string> + <string name="Command_Move_Tooltip"> + Desplazando el avatar + </string> + <string name="Command_Outbox_Tooltip"> + Transfiere objetos a tu mercado para venderlos + </string> + <string name="Command_People_Tooltip"> + Amigos, grupos y personas próximas + </string> + <string name="Command_Picks_Tooltip"> + Lugares que se mostrarán como favoritos en tu perfil + </string> + <string name="Command_Places_Tooltip"> + Lugares que has guardado + </string> + <string name="Command_Preferences_Tooltip"> + Preferencias + </string> + <string name="Command_Profile_Tooltip"> + Consulta o edita tu perfil + </string> + <string name="Command_Report_Abuse_Tooltip"> + Denunciar una infracción + </string> + <string name="Command_Search_Tooltip"> + Buscar lugares, eventos y personas + </string> + <string name="Command_Snapshot_Tooltip"> + Tomar una fotografÃa + </string> + <string name="Command_Speak_Tooltip"> + Utiliza el micrófono para hablar con las personas próximas + </string> + <string name="Command_Twitter_Tooltip"> + Twitter + </string> + <string name="Command_View_Tooltip"> + Cambiando el ángulo de la cámara + </string> + <string name="Command_Voice_Tooltip"> + Controles de volumen para las llamadas y la gente que se encuentre cerca de ti en el mundo virtual + </string> + <string name="Toolbar_Bottom_Tooltip"> + actualmente en tu barra de herramientas inferior + </string> + <string name="Toolbar_Left_Tooltip"> + actualmente en tu barra de herramientas izquierda + </string> + <string name="Toolbar_Right_Tooltip"> + actualmente en tu barra de herramientas derecha + </string> + <string name="Retain%"> + % retención + </string> + <string name="Detail"> + Detalle + </string> + <string name="Better Detail"> + Mejor detalle + </string> + <string name="Surface"> + Superficie + </string> + <string name="Solid"> + Sólido + </string> + <string name="Wrap"> + Envoltura + </string> + <string name="Preview"> + Vista previa + </string> + <string name="Normal"> + Normal + </string> + <string name="Pathfinding_Wiki_URL"> + http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer + </string> + <string name="Pathfinding_Object_Attr_None"> + Ninguno + </string> + <string name="Pathfinding_Object_Attr_Permanent"> + Afecta al navmesh + </string> + <string name="Pathfinding_Object_Attr_Character"> + Personaje + </string> + <string name="Pathfinding_Object_Attr_MultiSelect"> + (Múltiple) + </string> + <string name="snapshot_quality_very_low"> + Muy bajo + </string> + <string name="snapshot_quality_low"> + Bajo + </string> + <string name="snapshot_quality_medium"> + Medio + </string> + <string name="snapshot_quality_high"> + Alto + </string> + <string name="snapshot_quality_very_high"> + Muy alto + </string> + <string name="TeleportMaturityExceeded"> + El Residente no puede visitar esta región. + </string> + <string name="UserDictionary"> + [Usuario] + </string> + <string name="experience_tools_experience"> + Experiencia + </string> + <string name="ExperienceNameNull"> + (sin experiencia) + </string> + <string name="ExperienceNameUntitled"> + (experiencia sin tÃtulo) + </string> + <string name="Land-Scope"> + Activa en el terreno + </string> + <string name="Grid-Scope"> + Activa en el Grid + </string> + <string name="Allowed_Experiences_Tab"> + PERMITIDO + </string> + <string name="Blocked_Experiences_Tab"> + BLOQUEADO + </string> + <string name="Contrib_Experiences_Tab"> + COLABORADOR + </string> + <string name="Admin_Experiences_Tab"> + ADMIN. + </string> + <string name="Recent_Experiences_Tab"> + RECIENTE + </string> + <string name="Owned_Experiences_Tab"> + PROPIEDAD + </string> + <string name="ExperiencesCounter"> + ([EXPERIENCES], máx. [MAXEXPERIENCES]) + </string> + <string name="ExperiencePermission1"> + hacerte con tus controles + </string> + <string name="ExperiencePermission3"> + activar animaciones en tu avatar + </string> + <string name="ExperiencePermission4"> + anexar a tu avatar + </string> + <string name="ExperiencePermission9"> + seguimiento de la cámara + </string> + <string name="ExperiencePermission10"> + controlar tu cámara + </string> + <string name="ExperiencePermission11"> + teleportarte + </string> + <string name="ExperiencePermission12"> + aceptar automáticamente permisos de experiencias + </string> + <string name="ExperiencePermission16"> + forzar que el avatar se siente + </string> + <string name="ExperiencePermission17"> + cambiar tu configuración del entorno + </string> + <string name="ExperiencePermissionShortUnknown"> + realizar una operación desconocida: [Permission] + </string> + <string name="ExperiencePermissionShort1"> + Ponerte al mando + </string> + <string name="ExperiencePermissionShort3"> + Activar animaciones + </string> + <string name="ExperiencePermissionShort4"> + Anexar + </string> + <string name="ExperiencePermissionShort9"> + Seguir la cámara + </string> + <string name="ExperiencePermissionShort10"> + Controlar la cámara + </string> + <string name="ExperiencePermissionShort11"> + Teleporte + </string> + <string name="ExperiencePermissionShort12"> + Otorgar permisos + </string> + <string name="ExperiencePermissionShort16"> + Sentarte + </string> + <string name="ExperiencePermissionShort17"> + Entorno + </string> + <string name="logging_calls_disabled_log_empty"> + No se están registrando las conversaciones. Para empezar a grabar un registro, elige "Guardar: Solo registro" o "Guardar: Registro y transcripciones" en Preferencias > Chat. + </string> + <string name="logging_calls_disabled_log_not_empty"> + No se registrarán más conversaciones. Para reanudar la grabación de un registro, elige "Guardar: Solo registro" o "Guardar: Registro y transcripciones" en Preferencias > Chat. + </string> + <string name="logging_calls_enabled_log_empty"> + No hay conversaciones grabadas. Después de contactar con una persona, o de que alguien contacte contigo, aquà se mostrará una entrada de registro. + </string> + <string name="loading_chat_logs"> + Cargando... + </string> + <string name="na"> + n/c + </string> + <string name="preset_combo_label"> + -Lista vacÃa- + </string> + <string name="Default"> + Predeterminado + </string> + <string name="none_paren_cap"> + (ninguno) + </string> + <string name="no_limit"> + Sin lÃmite + </string> + <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES"> + La forma fÃsica contiene triángulos demasiado pequeños. Intenta simplificar el modelo fÃsico. + </string> + <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH"> + La forma fÃsica contiene datos de confirmación erróneos. Intenta corregir el modelo fÃsico. + </string> + <string name="Mav_Details_MAV_UNKNOWN_VERSION"> + La versión de la forma fÃsica no es correcta. Configura la versión correcta del modelo fÃsico. + </string> + <string name="couldnt_resolve_host"> + Error de DNS al resolver el nombre del host([HOSTNAME]). Por favor verifica si puedes conectarte al sitio web www.secondlife.com. Si puedes conectarte, pero aún recibes este error, por favor accede a -la sección Soporte y genera un informe del problema.</string> - <string name="ssl_peer_certificate">El servidor de inicio de sesión no pudo verificarse vÃa SSL. +la sección Soporte y genera un informe del problema. + </string> + <string name="ssl_peer_certificate"> + El servidor de inicio de sesión no pudo verificarse vÃa SSL. Si aún recibes este error, por favor accede a la sección Soporte del sitio web Secondlife.com -y genera un informe del problema.</string> - <string name="ssl_connect_error">En general esto significa que el horario de tu computadora no está bien configurado. +y genera un informe del problema. + </string> + <string name="ssl_connect_error"> + En general esto significa que el horario de tu computadora no está bien configurado. Por favor accede al Panel de control y asegúrate de que la hora y la fecha estén bien configurados. Verifica también que tu red y tu cortafuegos estén bien configurados. Si aún recibes este error, por favor accede a la sección Soporte del sitio web Secondlife.com y genera un informe del problema. -[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de conocimientos]</string> +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de conocimientos] + </string> </strings> diff --git a/indra/newview/skins/default/xui/es/teleport_strings.xml b/indra/newview/skins/default/xui/es/teleport_strings.xml index 44be93cd80..cc6089584a 100644 --- a/indra/newview/skins/default/xui/es/teleport_strings.xml +++ b/indra/newview/skins/default/xui/es/teleport_strings.xml @@ -1,39 +1,95 @@ <?xml version="1.0" ?> <teleport_messages> <message_set name="errors"> - <message 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].</message> - <message 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].</message> - <message 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.</message> - <message name="nolandmark_tport">Lo sentimos, pero el sistema no ha podido localizar el destino de este hito.</message> - <message name="timeout_tport">Lo sentimos, pero el sistema no ha podido completar el teleporte. -Vuelva a intentarlo en un momento.</message> - <message name="NoHelpIslandTP">No te puedes volver a teleportar a la isla de bienvenida. -Para repetir el tutorial, visita la isla de bienvenida pública.</message> - <message name="noaccess_tport">Lo sentimos, pero no tienes acceso al destino de este teleporte.</message> - <message 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.</message> - <message 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.</message> - <message 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 minutos.</message> - <message 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 minutos.</message> - <message 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 minutos.</message> - <message name="no_inventory_host">En estos momentos no está disponible el sistema del inventario.</message> - <message name="MustGetAgeRegion">Solo pueden acceder a esta región los mayores de 18 años.</message> - <message name="RegionTPSpecialUsageBlocked">No puedes entrar en la región. '[REGION_NAME]' es una región de juegos de habilidad, y debes cumplir determinados criterios para poder entrar en ella. Consulta los detalles en las [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life P+F de juegos de habilidad].</message> - <message name="preexisting_tport">Lo sentimos, pero el sistema no pudo comenzar tu teleportacion. Por favor inténtalo de nuevo en unos minutos</message> + <message 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]. + </message> + <message 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]. + </message> + <message 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. + </message> + <message name="nolandmark_tport"> + Lo sentimos, pero el sistema no ha podido localizar el destino de este hito. + </message> + <message name="timeout_tport"> + Lo sentimos, pero el sistema no ha podido completar el teleporte. +Vuelva a intentarlo en un momento. + </message> + <message name="NoHelpIslandTP"> + No te puedes volver a teleportar a la isla de bienvenida. +Para repetir el tutorial, visita la isla de bienvenida pública. + </message> + <message name="noaccess_tport"> + Lo sentimos, pero no tienes acceso al destino de este teleporte. + </message> + <message 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. + </message> + <message 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. + </message> + <message 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 minutos. + </message> + <message 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 minutos. + </message> + <message 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 minutos. + </message> + <message name="no_inventory_host"> + En estos momentos no está disponible el sistema del inventario. + </message> + <message name="MustGetAgeRegion"> + Solo pueden acceder a esta región los mayores de 18 años. + </message> + <message name="RegionTPSpecialUsageBlocked"> + No puedes entrar en la región. '[REGION_NAME]' es una región de juegos de habilidad, y debes cumplir determinados criterios para poder entrar en ella. Consulta los detalles en las [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life P+F de juegos de habilidad]. + </message> + <message name="preexisting_tport"> + Lo sentimos, pero el sistema no pudo comenzar tu teleportacion. Por favor inténtalo de nuevo en unos minutos + </message> </message_set> <message_set name="progress"> - <message name="sending_dest">Llevando al destino.</message> - <message name="redirecting">Redireccionando a una posición diferente.</message> - <message name="relaying">Reorientando el destino.</message> - <message name="sending_home">Enviando la petición de posición de la Base.</message> - <message name="sending_landmark">Enviando la petición de posición del hito.</message> - <message name="completing">Completando el teleporte.</message> - <message name="completed_from">Teleporte realizado desde [T_SLURL]</message> - <message name="resolving">Especificando el destino.</message> - <message name="contacting">Contactando con la nueva región.</message> - <message name="arriving">Llegando...</message> - <message name="requesting">Solicitando teleporte...</message> - <message name="pending">Teleporte pendiente...</message> + <message name="sending_dest"> + Llevando al destino. + </message> + <message name="redirecting"> + Redireccionando a una posición diferente. + </message> + <message name="relaying"> + Reorientando el destino. + </message> + <message name="sending_home"> + Enviando la petición de posición de la Base. + </message> + <message name="sending_landmark"> + Enviando la petición de posición del hito. + </message> + <message name="completing"> + Completando el teleporte. + </message> + <message name="completed_from"> + Teleporte realizado desde [T_SLURL] + </message> + <message name="resolving"> + Especificando el destino. + </message> + <message name="contacting"> + Contactando con la nueva región. + </message> + <message name="arriving"> + Llegando... + </message> + <message name="requesting"> + Solicitando teleporte... + </message> + <message name="pending"> + Teleporte pendiente... + </message> </message_set> </teleport_messages> diff --git a/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml b/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml index a1f6d85836..e910632e50 100644 --- a/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml @@ -6,7 +6,7 @@ <text name="label">Textures figées</text> <text name="composite_label">Textures composites</text> <button label="Vider les ID dans la console" label_selected="Vider" name="Dump"/> - <panel name="scroll_content_panel"> + <panel name="scroll_content_panel2"> <texture_picker label="Cheveux" name="hair-baked"/> <texture_picker label="Cheveux" name="hair_grain"/> <texture_picker label="Alpha cheveux" name="hair_alpha"/> diff --git a/indra/newview/skins/default/xui/fr/floater_search.xml b/indra/newview/skins/default/xui/fr/floater_search.xml deleted file mode 100644 index 32800182ea..0000000000 --- a/indra/newview/skins/default/xui/fr/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> - <floater.string name="loading_text"> - Chargement... - </floater.string> - <floater.string name="done_text"> - Terminé - </floater.string> - <layout_stack name="stack1"> - <layout_panel name="browser_layout"> - <text name="refresh_search"> - Relancer la recherche pour refléter le niveau divin actuel - </text> - </layout_panel> - </layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/fr/panel_progress.xml b/indra/newview/skins/default/xui/fr/panel_progress.xml index c9bed9fd9b..7d31bb7138 100644 --- a/indra/newview/skins/default/xui/fr/panel_progress.xml +++ b/indra/newview/skins/default/xui/fr/panel_progress.xml @@ -1,8 +1,10 @@ <?xml version="1.0" ?> <panel name="login_progress_panel"> + <layout_panel name="panel_icons"/> <layout_stack name="vertical_centering"/> <layout_panel name="panel4"/> <layout_panel name="center"/> <layout_stack name="horizontal_centering"> + <text name="logos_lbl">Megapahit utilise</text> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml index 3cf64583d2..a560ff8d5e 100644 --- a/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@ L'enregistrement d'une image dans l'inventaire coûte [UPLOAD_COST] L$. Pour enregistrer votre image sous forme de texture, sélectionnez un format carré. </text> <combo_box label="Résolution" name="texture_size_combo"> - <combo_box.item label="Fenêtre actuelle (512x512)" name="CurrentWindow"/> + <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/> <combo_box.item label="Petite (128 x 128)" name="Small(128x128)"/> <combo_box.item label="Moyenne (256 x 256)" name="Medium(256x256)"/> <combo_box.item label="Grande (512 x 512)" name="Large(512x512)"/> diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml index bdedb9162f..52fa318f8e 100644 --- a/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_snapshot_options"> <button label="Enreg. sur le disque" name="save_to_computer_btn"/> - <button label="Enreg. dans l'inventaire ([AMOUNT] L$)" name="save_to_inventory_btn"/> + <button label="Enreg. dans l'inventaire" name="save_to_inventory_btn"/> <button label="Partager sur le flux de profil" name="save_to_profile_btn"/> <button label="Partager sur Facebook" name="send_to_facebook_btn"/> <button label="Partager sur Twitter" name="send_to_twitter_btn"/> diff --git a/indra/newview/skins/default/xui/fr/panel_status_bar.xml b/indra/newview/skins/default/xui/fr/panel_status_bar.xml index 84c6dda4b4..227525a608 100644 --- a/indra/newview/skins/default/xui/fr/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/fr/panel_status_bar.xml @@ -6,7 +6,7 @@ <panel.string name="bandwidth_tooltip"> Bande passante </panel.string> - <panel.string name="time"> + <panel.string name="time_ampm"> [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] </panel.string> <panel.string name="timeTooltip"> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 737b570e98..770b52242a 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -1,620 +1,1687 @@ <?xml version="1.0" ?> <strings> - <string name="SECOND_LIFE">Second Life</string> - <string name="APP_NAME">Megapahit</string> - <string name="CAPITALIZED_APP_NAME">MEGAPAHIT</string> - <string name="SECOND_LIFE_GRID">Grille de Second Life</string> - <string name="SUPPORT_SITE">Portail Assistance Second Life</string> - <string name="StartupDetectingHardware">Détection du matériel...</string> - <string name="StartupLoading">Chargement de [APP_NAME]...</string> - <string name="StartupClearingCache">Vidage du cache...</string> - <string name="StartupInitializingTextureCache">Initialisation du cache des textures...</string> - <string name="StartupRequireDriverUpdate">Échec d'initialisation des graphiques. Veuillez mettre votre pilote graphique à jour.</string> - <string name="AboutHeader">[CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) -[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]</string> - <string name="BuildConfig">Configuration de la construction [BUILD_CONFIG]</string> - <string name="AboutPosition">Vous êtes à [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] dans [REGION], se trouvant à <nolink>[HOSTNAME]</nolink> ([HOSTIP]) + <string name="SECOND_LIFE"> + Second Life + </string> + <string name="APP_NAME"> + Megapahit + </string> + <string name="CAPITALIZED_APP_NAME"> + MEGAPAHIT + </string> + <string name="SECOND_LIFE_GRID"> + Grille de Second Life + </string> + <string name="SUPPORT_SITE"> + Portail Assistance Second Life + </string> + <string name="StartupDetectingHardware"> + Détection du matériel... + </string> + <string name="StartupLoading"> + Chargement de [APP_NAME]... + </string> + <string name="StartupClearingCache"> + Vidage du cache... + </string> + <string name="StartupInitializingTextureCache"> + Initialisation du cache des textures... + </string> + <string name="StartupRequireDriverUpdate"> + Échec d'initialisation des graphiques. Veuillez mettre votre pilote graphique à jour. + </string> + <string name="AboutHeader"> + [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) +[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] + </string> + <string name="BuildConfig"> + Configuration de la construction [BUILD_CONFIG] + </string> + <string name="AboutPosition"> + Vous êtes à [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] dans [REGION], se trouvant à <nolink>[HOSTNAME]</nolink> SLURL : <nolink>[SLURL]</nolink> (coordonnées globales [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] -[SERVER_RELEASE_NOTES_URL]</string> - <string name="AboutSystem">CPU : [CPU] +[SERVER_RELEASE_NOTES_URL] + </string> + <string name="AboutSystem"> + CPU : [CPU] Mémoire : [MEMORY_MB] Mo Version OS : [OS_VERSION] Distributeur de cartes graphiques : [GRAPHICS_CARD_VENDOR] -Carte graphique : [GRAPHICS_CARD]</string> - <string name="AboutDriver">Version Windows Graphics Driver : [GRAPHICS_DRIVER_VERSION]</string> - <string name="AboutOGL">Version OpenGL : [OPENGL_VERSION]</string> - <string name="AboutSettings">Taille de la fenêtre: [WINDOW_WIDTH]x[WINDOW_HEIGHT] +Carte graphique : [GRAPHICS_CARD] + </string> + <string name="AboutDriver"> + Version Windows Graphics Driver : [GRAPHICS_DRIVER_VERSION] + </string> + <string name="AboutOGL"> + Version OpenGL : [OPENGL_VERSION] + </string> + <string name="AboutSettings"> + Taille de la fenêtre: [WINDOW_WIDTH]x[WINDOW_HEIGHT] Ajustement de la taille de la police : [FONT_SIZE_ADJUSTMENT]pt Échelle de l’interface : [UI_SCALE] Distance de dessin : [DRAW_DISTANCE]m Bande passante : [NET_BANDWITH] kbit/s Facteur LOD (niveau de détail) : [LOD_FACTOR] Qualité de rendu : [RENDER_QUALITY] -Modèle d’éclairage avancé : [GPU_SHADERS] -Mémoire textures : [TEXTURE_MEMORY] Mo</string> - <string name="AboutOSXHiDPI">Mode d'affichage HiDPI : [HIDPI]</string> - <string name="AboutLibs">J2C Decoder Version: [J2C_VERSION] +Mémoire textures : [TEXTURE_MEMORY] Mo + </string> + <string name="AboutOSXHiDPI"> + Mode d'affichage HiDPI : [HIDPI] + </string> + <string name="AboutLibs"> + J2C Decoder Version: [J2C_VERSION] Audio Driver Version: [AUDIO_DRIVER_VERSION] [LIBCEF_VERSION] LibVLC Version: [LIBVLC_VERSION] -Voice Server Version: [VOICE_VERSION]</string> - <string name="AboutTraffic">Paquets perdus : [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)</string> - <string name="AboutTime">[month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]</string> - <string name="ErrorFetchingServerReleaseNotesURL">Erreur lors de la récupération de l'URL des notes de version du serveur.</string> - <string name="BuildConfiguration">Configuration de la construction</string> - <string name="ProgressRestoring">Restauration...</string> - <string name="ProgressChangingResolution">Changement de la résolution...</string> - <string name="Fullbright">Fullbright (Legacy)</string> - <string name="LoginInProgress">La connexion à [APP_NAME] apparaît peut-être comme étant gelée. Veuillez patienter.</string> - <string name="LoginInProgressNoFrozen">Connexion...</string> - <string name="LoginAuthenticating">Authentification en cours</string> - <string name="LoginMaintenance">Maintenance du compte en cours…</string> - <string name="LoginAttempt">La tentative de connexion précédente a échoué. Connexion, esssai [NUMBER]</string> - <string name="LoginPrecaching">Monde en cours de chargement…</string> - <string name="LoginInitializingBrowser">Navigateur Web incorporé en cours d'initialisation…</string> - <string name="LoginInitializingMultimedia">Multimédia en cours d'initialisation…</string> - <string name="LoginInitializingFonts">Chargement des polices en cours...</string> - <string name="LoginVerifyingCache">Fichiers du cache en cours de vérification (peut prendre 60-90 s)...</string> - <string name="LoginProcessingResponse">Réponse en cours de traitement…</string> - <string name="LoginInitializingWorld">Monde en cours d'initialisation…</string> - <string name="LoginDecodingImages">Décodage des images en cours...</string> - <string name="LoginInitializingQuicktime">Quicktime en cours d'initialisation</string> - <string name="LoginQuicktimeNotFound">Quicktime introuvable, impossible de procéder à l'initialisation.</string> - <string name="LoginQuicktimeOK">Initialisation de Quicktime réussie.</string> - <string name="LoginRequestSeedCapGrant">Capacités de la région demandées...</string> - <string name="LoginRetrySeedCapGrant">Capacités de la région demandées... Tentative n° [NUMBER].</string> - <string name="LoginWaitingForRegionHandshake">Liaison avec la région en cours de création...</string> - <string name="LoginConnectingToRegion">Connexion avec la région en cours...</string> - <string name="LoginDownloadingClothing">Habits en cours de téléchargement...</string> - <string name="InvalidCertificate">Certificat non valide ou corrompu renvoyé par le serveur. Contactez l'administrateur de la grille.</string> - <string name="CertInvalidHostname">Nom d'hôte non valide utilisé pour accéder au serveur. Vérifiez votre nom d'hôte de grille ou SLURL.</string> - <string name="CertExpired">Il semble que le certificat renvoyé par la grille ait expiré. Vérifiez votre horloge système ou contactez l'administrateur de la grille.</string> - <string name="CertKeyUsage">Impossible d'utiliser le certificat renvoyé par le serveur pour SSL. Contactez l'administrateur de la grille.</string> - <string name="CertBasicConstraints">Certificats trop nombreux dans la chaîne des certificats du serveur. Contactez l'administrateur de la grille.</string> - <string name="CertInvalidSignature">Impossible de vérifier la signature de certificat renvoyée par le serveur de la grille. Contactez l'administrateur de la grille.</string> - <string name="LoginFailedNoNetwork">Erreur réseau : impossible d'établir la connexion. Veuillez vérifier votre connexion réseau.</string> - <string name="LoginFailedHeader">Échec de la connexion.</string> - <string name="Quit">Quitter</string> - <string name="create_account_url">http://join.secondlife.com/?sourceid=[sourceid]</string> - <string name="AgniGridLabel">Grille principale de Second Life (Agni)</string> - <string name="AditiGridLabel">Grille de test bêta Second Life (Aditi)</string> - <string name="ViewerDownloadURL">http://secondlife.com/download</string> - <string name="LoginFailedViewerNotPermitted">Le client que vous utilisez ne permet plus d'accéder à Second Life. Téléchargez un nouveau client à la page suivante : +Voice Server Version: [VOICE_VERSION] + </string> + <string name="AboutTraffic"> + Paquets perdus : [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) + </string> + <string name="AboutTime"> + [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt] + </string> + <string name="ErrorFetchingServerReleaseNotesURL"> + Erreur lors de la récupération de l'URL des notes de version du serveur. + </string> + <string name="BuildConfiguration"> + Configuration de la construction + </string> + <string name="ProgressRestoring"> + Restauration... + </string> + <string name="ProgressChangingResolution"> + Changement de la résolution... + </string> + <string name="Fullbright"> + Fullbright (Legacy) + </string> + <string name="LoginInProgress"> + La connexion à [APP_NAME] apparaît peut-être comme étant gelée. Veuillez patienter. + </string> + <string name="LoginInProgressNoFrozen"> + Connexion... + </string> + <string name="LoginAuthenticating"> + Authentification en cours + </string> + <string name="LoginMaintenance"> + Maintenance du compte en cours… + </string> + <string name="LoginAttempt"> + La tentative de connexion précédente a échoué. Connexion, esssai [NUMBER] + </string> + <string name="LoginPrecaching"> + Monde en cours de chargement… + </string> + <string name="LoginInitializingBrowser"> + Navigateur Web incorporé en cours d'initialisation… + </string> + <string name="LoginInitializingMultimedia"> + Multimédia en cours d'initialisation… + </string> + <string name="LoginInitializingFonts"> + Chargement des polices en cours... + </string> + <string name="LoginVerifyingCache"> + Fichiers du cache en cours de vérification (peut prendre 60-90 s)... + </string> + <string name="LoginProcessingResponse"> + Réponse en cours de traitement… + </string> + <string name="LoginInitializingWorld"> + Monde en cours d'initialisation… + </string> + <string name="LoginDecodingImages"> + Décodage des images en cours... + </string> + <string name="LoginInitializingQuicktime"> + Quicktime en cours d'initialisation + </string> + <string name="LoginQuicktimeNotFound"> + Quicktime introuvable, impossible de procéder à l'initialisation. + </string> + <string name="LoginQuicktimeOK"> + Initialisation de Quicktime réussie. + </string> + <string name="LoginRequestSeedCapGrant"> + Capacités de la région demandées... + </string> + <string name="LoginRetrySeedCapGrant"> + Capacités de la région demandées... Tentative n° [NUMBER]. + </string> + <string name="LoginWaitingForRegionHandshake"> + Liaison avec la région en cours de création... + </string> + <string name="LoginConnectingToRegion"> + Connexion avec la région en cours... + </string> + <string name="LoginDownloadingClothing"> + Habits en cours de téléchargement... + </string> + <string name="InvalidCertificate"> + Certificat non valide ou corrompu renvoyé par le serveur. Contactez l'administrateur de la grille. + </string> + <string name="CertInvalidHostname"> + Nom d'hôte non valide utilisé pour accéder au serveur. Vérifiez votre nom d'hôte de grille ou SLURL. + </string> + <string name="CertExpired"> + Il semble que le certificat renvoyé par la grille ait expiré. Vérifiez votre horloge système ou contactez l'administrateur de la grille. + </string> + <string name="CertKeyUsage"> + Impossible d'utiliser le certificat renvoyé par le serveur pour SSL. Contactez l'administrateur de la grille. + </string> + <string name="CertBasicConstraints"> + Certificats trop nombreux dans la chaîne des certificats du serveur. Contactez l'administrateur de la grille. + </string> + <string name="CertInvalidSignature"> + Impossible de vérifier la signature de certificat renvoyée par le serveur de la grille. Contactez l'administrateur de la grille. + </string> + <string name="LoginFailedNoNetwork"> + Erreur réseau : impossible d'établir la connexion. Veuillez vérifier votre connexion réseau. + </string> + <string name="LoginFailedHeader"> + Échec de la connexion. + </string> + <string name="Quit"> + Quitter + </string> + <string name="create_account_url"> + http://join.secondlife.com/?sourceid=[sourceid] + </string> + <string name="AgniGridLabel"> + Grille principale de Second Life (Agni) + </string> + <string name="AditiGridLabel"> + Grille de test bêta Second Life (Aditi) + </string> + <string name="ViewerDownloadURL"> + http://secondlife.com/download + </string> + <string name="LoginFailedViewerNotPermitted"> + Le client que vous utilisez ne permet plus d'accéder à Second Life. Téléchargez un nouveau client à la page suivante : http://secondlife.com/download Pour plus d'informations, consultez la page FAQ ci-dessous : -http://secondlife.com/viewer-access-faq</string> - <string name="LoginIntermediateOptionalUpdateAvailable">Mise à jour facultative du client disponible : [VERSION]</string> - <string name="LoginFailedRequiredUpdate">Mise à jour du client requise : [VERSION]</string> - <string name="LoginFailedAlreadyLoggedIn">L'agent est déjà connecté.</string> - <string name="LoginFailedAuthenticationFailed">Désolé ! La connexion a échoué. +http://secondlife.com/viewer-access-faq + </string> + <string name="LoginIntermediateOptionalUpdateAvailable"> + Mise à jour facultative du client disponible : [VERSION] + </string> + <string name="LoginFailedRequiredUpdate"> + Mise à jour du client requise : [VERSION] + </string> + <string name="LoginFailedAlreadyLoggedIn"> + L'agent est déjà connecté. + </string> + <string name="LoginFailedAuthenticationFailed"> + Désolé ! La connexion a échoué. Veuillez vérifier que les éléments ci-dessous ont été correctement saisis : * Nom d'utilisateur (par exemple, bobsmith12 ou steller.sunshine) * Mot de passe -Assurez-vous également que la touche Verr. maj n'est pas activée.</string> - <string name="LoginFailedPasswordChanged">Votre mot de passe a été modifié pour des raisons de sécurité. +Assurez-vous également que la touche Verr. maj n'est pas activée. + </string> + <string name="LoginFailedPasswordChanged"> + Votre mot de passe a été modifié pour des raisons de sécurité. Veuillez accéder à votre compte à la page http://secondlife.com/password et répondre à la question de sécurité afin de réinitialiser votre mot de passe. -Nous vous prions de nous excuser pour la gêne occasionnée.</string> - <string name="LoginFailedPasswordReset">Vous allez devoir réinitialiser votre mot de passe suite à quelques changements effectués sur notre système. +Nous vous prions de nous excuser pour la gêne occasionnée. + </string> + <string name="LoginFailedPasswordReset"> + Vous allez devoir réinitialiser votre mot de passe suite à quelques changements effectués sur notre système. Pour cela, accédez à votre compte à la page http://secondlife.com/password et répondez à la question de sécurité. Votre mot de passe sera réinitialisé. -Nous vous prions de nous excuser pour la gêne occasionnée.</string> - <string name="LoginFailedEmployeesOnly">Second Life est temporairement fermé pour des raisons de maintenance. +Nous vous prions de nous excuser pour la gêne occasionnée. + </string> + <string name="LoginFailedEmployeesOnly"> + Second Life est temporairement fermé pour des raisons de maintenance. Seuls les employés peuvent actuellement y accéder. -Consultez la page www.secondlife.com/status pour plus d'informations.</string> - <string name="LoginFailedPremiumOnly">Les connexions à Second Life sont temporairement limitées afin de s'assurer que l'expérience des utilisateurs présents dans le monde virtuel soit optimale. +Consultez la page www.secondlife.com/status pour plus d'informations. + </string> + <string name="LoginFailedPremiumOnly"> + Les connexions à Second Life sont temporairement limitées afin de s'assurer que l'expérience des utilisateurs présents dans le monde virtuel soit optimale. -Les personnes disposant de comptes gratuits ne pourront pas accéder à Second Life pendant ce temps afin de permettre à celles qui ont payé pour pouvoir utiliser Second Life de le faire.</string> - <string name="LoginFailedComputerProhibited">Impossible d'accéder à Second Life depuis cet ordinateur. +Les personnes disposant de comptes gratuits ne pourront pas accéder à Second Life pendant ce temps afin de permettre à celles qui ont payé pour pouvoir utiliser Second Life de le faire. + </string> + <string name="LoginFailedComputerProhibited"> + Impossible d'accéder à Second Life depuis cet ordinateur. Si vous pensez qu'il s'agit d'une erreur, contactez -l'Assistance à l'adresse suivante : support@secondlife.com.</string> - <string name="LoginFailedAcountSuspended">Votre compte est inaccessible jusqu'à -[TIME], heure du Pacifique.</string> - <string name="LoginFailedAccountDisabled">Impossible de traiter votre demande à l'heure actuelle. -Pour obtenir de l'aide, veuillez contacter l'Assistance Second Life à la page suivante : http://support.secondlife.com.</string> - <string name="LoginFailedTransformError">Incohérence des données lors de la connexion. -Veuillez contacter support@secondlife.com.</string> - <string name="LoginFailedAccountMaintenance">Des opérations de maintenance mineures sont actuellement effectuées sur votre compte. +l'Assistance à l'adresse suivante : support@secondlife.com. + </string> + <string name="LoginFailedAcountSuspended"> + Votre compte est inaccessible jusqu'à +[TIME], heure du Pacifique. + </string> + <string name="LoginFailedAccountDisabled"> + Impossible de traiter votre demande à l'heure actuelle. +Pour obtenir de l'aide, veuillez contacter l'Assistance Second Life à la page suivante : http://support.secondlife.com. + </string> + <string name="LoginFailedTransformError"> + Incohérence des données lors de la connexion. +Veuillez contacter support@secondlife.com. + </string> + <string name="LoginFailedAccountMaintenance"> + Des opérations de maintenance mineures sont actuellement effectuées sur votre compte. Votre compte est inaccessible jusqu'à [TIME], heure du Pacifique. -Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com</string> - <string name="LoginFailedPendingLogoutFault">Le simulateur a renvoyé une erreur en réponse à la demande de déconnexion.</string> - <string name="LoginFailedPendingLogout">Le système est en train de vous déconnecter. -Veuillez réessayer de vous connecter dans une minute.</string> - <string name="LoginFailedUnableToCreateSession">Impossible de créer de session valide.</string> - <string name="LoginFailedUnableToConnectToSimulator">Impossible de se connecter à un simulateur.</string> - <string name="LoginFailedRestrictedHours">Votre compte permet uniquement d'accéder à Second Life +Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com + </string> + <string name="LoginFailedPendingLogoutFault"> + Le simulateur a renvoyé une erreur en réponse à la demande de déconnexion. + </string> + <string name="LoginFailedPendingLogout"> + Le système est en train de vous déconnecter. +Veuillez réessayer de vous connecter dans une minute. + </string> + <string name="LoginFailedUnableToCreateSession"> + Impossible de créer de session valide. + </string> + <string name="LoginFailedUnableToConnectToSimulator"> + Impossible de se connecter à un simulateur. + </string> + <string name="LoginFailedRestrictedHours"> + Votre compte permet uniquement d'accéder à Second Life entre [START] et [END], heure du Pacifique. Veuillez réessayer au cours de la période indiquée. -Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com</string> - <string name="LoginFailedIncorrectParameters">Paramètres incorrects. -Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com</string> - <string name="LoginFailedFirstNameNotAlphanumeric">Le paramètre Prénom doit être alphanumérique. -Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com</string> - <string name="LoginFailedLastNameNotAlphanumeric">Le paramètre Nom doit être alphanumérique. -Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com</string> - <string name="LogoutFailedRegionGoingOffline">La région est en train d'être mise hors ligne. -Veuillez réessayer de vous connecter dans une minute.</string> - <string name="LogoutFailedAgentNotInRegion">Agent absent de la région. -Veuillez réessayer de vous connecter dans une minute.</string> - <string name="LogoutFailedPendingLogin">Une autre session était en cours d'ouverture au sein de la région. -Veuillez réessayer de vous connecter dans une minute.</string> - <string name="LogoutFailedLoggingOut">La session précédente était en cours de fermeture au sein de la région. -Veuillez réessayer de vous connecter dans une minute.</string> - <string name="LogoutFailedStillLoggingOut">Fermeture de la session précédente toujours en cours pour la région. -Veuillez réessayer de vous connecter dans une minute.</string> - <string name="LogoutSucceeded">Dernière session fermée au sein de la région. -Veuillez réessayer de vous connecter dans une minute.</string> - <string name="LogoutFailedLogoutBegun">Processus de déconnexion commencé pour la région. -Veuillez réessayer de vous connecter dans une minute.</string> - <string name="LoginFailedLoggingOutSession">Le système a commencé à fermer votre dernière session. -Veuillez réessayer de vous connecter dans une minute.</string> - <string name="AgentLostConnection">Il y a peut-être des problèmes techniques dans cette région. Veuillez vérifier votre connexion Internet.</string> - <string name="SavingSettings">Enregistrement des paramètres...</string> - <string name="LoggingOut">Déconnexion...</string> - <string name="ShuttingDown">Arrêt en cours...</string> - <string name="YouHaveBeenDisconnected">Vous avez été déconnecté de la région où vous étiez.</string> - <string name="SentToInvalidRegion">Vous avez été transféré vers une région non valide.</string> - <string name="TestingDisconnect">Test de déconnexion du client</string> - <string name="SocialFacebookConnecting">Connexion à Facebook…</string> - <string name="SocialFacebookPosting">Publication…</string> - <string name="SocialFacebookDisconnecting">Déconnexion de Facebook…</string> - <string name="SocialFacebookErrorConnecting">Un problème est survenu lors de la connexion à Facebook.</string> - <string name="SocialFacebookErrorPosting">Un problème est survenu lors de la publication sur Facebook.</string> - <string name="SocialFacebookErrorDisconnecting">Un problème est survenu lors de la déconnexion à Facebook.</string> - <string name="SocialFlickrConnecting">Connexion à Flickr...</string> - <string name="SocialFlickrPosting">Publication…</string> - <string name="SocialFlickrDisconnecting">Déconnexion de Flickr...</string> - <string name="SocialFlickrErrorConnecting">Un problème est survenu lors de la connexion à Flickr.</string> - <string name="SocialFlickrErrorPosting">Un problème est survenu lors de la publication sur Flickr.</string> - <string name="SocialFlickrErrorDisconnecting">Un problème est survenu lors de la déconnexion de Flickr.</string> - <string name="SocialTwitterConnecting">Connexion à Twitter...</string> - <string name="SocialTwitterPosting">Publication…</string> - <string name="SocialTwitterDisconnecting">Déconnexion de Twitter...</string> - <string name="SocialTwitterErrorConnecting">Un problème est survenu lors de la connexion à Twitter.</string> - <string name="SocialTwitterErrorPosting">Un problème est survenu lors de la publication sur Twitter.</string> - <string name="SocialTwitterErrorDisconnecting">Un problème est survenu lors de la déconnexion de Twitter.</string> - <string name="BlackAndWhite">Noir et blanc</string> - <string name="Colors1970">Couleurs des années 1970</string> - <string name="Intense">Intense</string> - <string name="Newspaper">Presse</string> - <string name="Sepia">Sépia</string> - <string name="Spotlight">Projecteur</string> - <string name="Video">Vidéo</string> - <string name="Autocontrast">Contraste automatique</string> - <string name="LensFlare">Halo</string> - <string name="Miniature">Miniature</string> - <string name="Toycamera">Toy Camera</string> - <string name="TooltipPerson">Personne</string> - <string name="TooltipNoName">(pas de nom)</string> - <string name="TooltipOwner">Propriétaire :</string> - <string name="TooltipPublic">Public</string> - <string name="TooltipIsGroup">(Groupe)</string> - <string name="TooltipForSaleL$">À vendre : [AMOUNT] L$</string> - <string name="TooltipFlagGroupBuild">Contruction de groupe</string> - <string name="TooltipFlagNoBuild">Pas de construction</string> - <string name="TooltipFlagNoEdit">Contruction de groupe</string> - <string name="TooltipFlagNotSafe">Non sécurisé</string> - <string name="TooltipFlagNoFly">Interdiction de voler</string> - <string name="TooltipFlagGroupScripts">Scripts de groupe</string> - <string name="TooltipFlagNoScripts">Pas de scripts</string> - <string name="TooltipLand">Terrain :</string> - <string name="TooltipMustSingleDrop">Impossible de faire glisser plus d'un objet ici</string> - <string name="TooltipTooManyWearables">Vous ne pouvez pas porter un dossier contenant plus de [AMOUNT] articles. Vous pouvez modifier cette limite dans Avancé > Afficher les paramètres de débogage > WearFolderLimit.</string> +Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com + </string> + <string name="LoginFailedIncorrectParameters"> + Paramètres incorrects. +Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com + </string> + <string name="LoginFailedFirstNameNotAlphanumeric"> + Le paramètre Prénom doit être alphanumérique. +Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com + </string> + <string name="LoginFailedLastNameNotAlphanumeric"> + Le paramètre Nom doit être alphanumérique. +Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com + </string> + <string name="LogoutFailedRegionGoingOffline"> + La région est en train d'être mise hors ligne. +Veuillez réessayer de vous connecter dans une minute. + </string> + <string name="LogoutFailedAgentNotInRegion"> + Agent absent de la région. +Veuillez réessayer de vous connecter dans une minute. + </string> + <string name="LogoutFailedPendingLogin"> + Une autre session était en cours d'ouverture au sein de la région. +Veuillez réessayer de vous connecter dans une minute. + </string> + <string name="LogoutFailedLoggingOut"> + La session précédente était en cours de fermeture au sein de la région. +Veuillez réessayer de vous connecter dans une minute. + </string> + <string name="LogoutFailedStillLoggingOut"> + Fermeture de la session précédente toujours en cours pour la région. +Veuillez réessayer de vous connecter dans une minute. + </string> + <string name="LogoutSucceeded"> + Dernière session fermée au sein de la région. +Veuillez réessayer de vous connecter dans une minute. + </string> + <string name="LogoutFailedLogoutBegun"> + Processus de déconnexion commencé pour la région. +Veuillez réessayer de vous connecter dans une minute. + </string> + <string name="LoginFailedLoggingOutSession"> + Le système a commencé à fermer votre dernière session. +Veuillez réessayer de vous connecter dans une minute. + </string> + <string name="AgentLostConnection"> + Il y a peut-être des problèmes techniques dans cette région. Veuillez vérifier votre connexion Internet. + </string> + <string name="SavingSettings"> + Enregistrement des paramètres... + </string> + <string name="LoggingOut"> + Déconnexion... + </string> + <string name="ShuttingDown"> + Arrêt en cours... + </string> + <string name="YouHaveBeenDisconnected"> + Vous avez été déconnecté de la région où vous étiez. + </string> + <string name="SentToInvalidRegion"> + Vous avez été transféré vers une région non valide. + </string> + <string name="TestingDisconnect"> + Test de déconnexion du client + </string> + <string name="SocialFacebookConnecting"> + Connexion à Facebook… + </string> + <string name="SocialFacebookPosting"> + Publication… + </string> + <string name="SocialFacebookDisconnecting"> + Déconnexion de Facebook… + </string> + <string name="SocialFacebookErrorConnecting"> + Un problème est survenu lors de la connexion à Facebook. + </string> + <string name="SocialFacebookErrorPosting"> + Un problème est survenu lors de la publication sur Facebook. + </string> + <string name="SocialFacebookErrorDisconnecting"> + Un problème est survenu lors de la déconnexion à Facebook. + </string> + <string name="SocialFlickrConnecting"> + Connexion à Flickr... + </string> + <string name="SocialFlickrPosting"> + Publication… + </string> + <string name="SocialFlickrDisconnecting"> + Déconnexion de Flickr... + </string> + <string name="SocialFlickrErrorConnecting"> + Un problème est survenu lors de la connexion à Flickr. + </string> + <string name="SocialFlickrErrorPosting"> + Un problème est survenu lors de la publication sur Flickr. + </string> + <string name="SocialFlickrErrorDisconnecting"> + Un problème est survenu lors de la déconnexion de Flickr. + </string> + <string name="SocialTwitterConnecting"> + Connexion à Twitter... + </string> + <string name="SocialTwitterPosting"> + Publication… + </string> + <string name="SocialTwitterDisconnecting"> + Déconnexion de Twitter... + </string> + <string name="SocialTwitterErrorConnecting"> + Un problème est survenu lors de la connexion à Twitter. + </string> + <string name="SocialTwitterErrorPosting"> + Un problème est survenu lors de la publication sur Twitter. + </string> + <string name="SocialTwitterErrorDisconnecting"> + Un problème est survenu lors de la déconnexion de Twitter. + </string> + <string name="BlackAndWhite"> + Noir et blanc + </string> + <string name="Colors1970"> + Couleurs des années 1970 + </string> + <string name="Intense"> + Intense + </string> + <string name="Newspaper"> + Presse + </string> + <string name="Sepia"> + Sépia + </string> + <string name="Spotlight"> + Projecteur + </string> + <string name="Video"> + Vidéo + </string> + <string name="Autocontrast"> + Contraste automatique + </string> + <string name="LensFlare"> + Halo + </string> + <string name="Miniature"> + Miniature + </string> + <string name="Toycamera"> + Toy Camera + </string> + <string name="TooltipPerson"> + Personne + </string> + <string name="TooltipNoName"> + (pas de nom) + </string> + <string name="TooltipOwner"> + Propriétaire : + </string> + <string name="TooltipPublic"> + Public + </string> + <string name="TooltipIsGroup"> + (Groupe) + </string> + <string name="TooltipForSaleL$"> + À vendre : [AMOUNT] L$ + </string> + <string name="TooltipFlagGroupBuild"> + Contruction de groupe + </string> + <string name="TooltipFlagNoBuild"> + Pas de construction + </string> + <string name="TooltipFlagNoEdit"> + Contruction de groupe + </string> + <string name="TooltipFlagNotSafe"> + Non sécurisé + </string> + <string name="TooltipFlagNoFly"> + Interdiction de voler + </string> + <string name="TooltipFlagGroupScripts"> + Scripts de groupe + </string> + <string name="TooltipFlagNoScripts"> + Pas de scripts + </string> + <string name="TooltipLand"> + Terrain : + </string> + <string name="TooltipMustSingleDrop"> + Impossible de faire glisser plus d'un objet ici + </string> + <string name="TooltipTooManyWearables"> + Vous ne pouvez pas porter un dossier contenant plus de [AMOUNT] articles. Vous pouvez modifier cette limite dans Avancé > Afficher les paramètres de débogage > WearFolderLimit. + </string> <string name="TooltipPrice" value="[AMOUNT] L$ :"/> - <string name="TooltipSLIcon">Il s’agit d’un lien vers une page dans le domaine officiel SecondLife.com ou LindenLab.com.</string> - <string name="TooltipOutboxDragToWorld">Vous ne pouvez pas rezzer (charger) des articles du dossier Annonces de la Place de marché</string> - <string name="TooltipOutboxWorn">Vous ne pouvez pas mettre d'articles que vous portez dans le dossier Annonces de la Place du marché</string> - <string name="TooltipOutboxFolderLevels">Le niveau de dossiers imbriqués dépasse [AMOUNT]. Diminuez le nombre de niveaux de dossiers imbriqués dans d'autres dossiers. Si nécessaire, placez certains articles dans une boîte.</string> - <string name="TooltipOutboxTooManyFolders">Le nombre de sous-dossiers dépasse [AMOUNT]. Diminuez le nombre de sous-dossiers dans votre annonce. Si nécessaire, placez certains articles dans une boîte.</string> - <string name="TooltipOutboxTooManyObjects">Le nombre d'articles dépasse [AMOUNT]. Pour pouvoir vendre plus de [AMOUNT] articles au sein d'une même annonce, vous devez placer certains de ces articles dans une boîte.</string> - <string name="TooltipOutboxTooManyStockItems">Le nombre d'articles de stock dépasse [AMOUNT].</string> - <string name="TooltipOutboxCannotDropOnRoot">Vous pouvez uniquement déposer des articles ou des dossiers dans les onglets TOUS ou NON ASSOCIÉS. Sélectionnez l’un de ces onglets et déplacez à nouveau votre ou vos article ou dossiers.</string> - <string name="TooltipOutboxNoTransfer">Impossible de vendre ou de transférer un ou plusieurs de ces objets</string> - <string name="TooltipOutboxNotInInventory">Vous ne pouvez mettre sur la Place du marché que des articles de votre inventaire</string> - <string name="TooltipOutboxLinked">Vous ne pouvez pas mettre des articles ou dossiers liés sur la Place du marché</string> - <string name="TooltipOutboxCallingCard">Vous ne pouvez pas mettre des cartes de visite sur la Place du marché</string> - <string name="TooltipOutboxDragActive">vous ne pouvez pas déplacer une annonce publiée</string> - <string name="TooltipOutboxCannotMoveRoot">Vous ne pouvez pas déplacer le dossier racine des annonces de la Place du marché</string> - <string name="TooltipOutboxMixedStock">tous les articles d'un dossier de stock doivent avoir le même type et droit</string> - <string name="TooltipDragOntoOwnChild">Impossible de déplacer un dossier vers son enfant</string> - <string name="TooltipDragOntoSelf">Impossible de déplacer un dossier vers lui-même</string> - <string name="TooltipHttpUrl">Cliquez pour afficher cette page web</string> - <string name="TooltipSLURL">Cliquez pour en savoir plus sur cet endroit</string> - <string name="TooltipAgentUrl">Cliquez pour afficher le profil de ce résident</string> - <string name="TooltipAgentInspect">En savoir plus sur ce résident</string> - <string name="TooltipAgentMute">Cliquer pour ignorer ce résident</string> - <string name="TooltipAgentUnmute">Cliquer pour ne plus ignorer ce résident</string> - <string name="TooltipAgentIM">Cliquer pour envoyer un IM à ce résident</string> - <string name="TooltipAgentPay">Cliquer pour payer ce résident</string> - <string name="TooltipAgentOfferTeleport">Cliquer pour proposer une téléportation à ce résident</string> - <string name="TooltipAgentRequestFriend">Cliquer pour demander à ce résident d'être votre ami</string> - <string name="TooltipGroupUrl">Cliquez pour afficher la description de ce groupe</string> - <string name="TooltipEventUrl">Cliquez pour afficher la description de cet événement</string> - <string name="TooltipClassifiedUrl">Cliquez pour afficher cette petite annonce</string> - <string name="TooltipParcelUrl">Cliquez pour afficher la description de cette parcelle</string> - <string name="TooltipTeleportUrl">Cliquez pour vous téléporter à cet endroit</string> - <string name="TooltipObjectIMUrl">Cliquez pour afficher la description de cet objet</string> - <string name="TooltipMapUrl">Cliquez pour voir cet emplacement sur la carte</string> - <string name="TooltipSLAPP">Cliquez pour exécuter la commande secondlife://</string> + <string name="TooltipSLIcon"> + Il s’agit d’un lien vers une page dans le domaine officiel SecondLife.com ou LindenLab.com. + </string> + <string name="TooltipOutboxDragToWorld"> + Vous ne pouvez pas rezzer (charger) des articles du dossier Annonces de la Place de marché + </string> + <string name="TooltipOutboxWorn"> + Vous ne pouvez pas mettre d'articles que vous portez dans le dossier Annonces de la Place du marché + </string> + <string name="TooltipOutboxFolderLevels"> + Le niveau de dossiers imbriqués dépasse [AMOUNT]. Diminuez le nombre de niveaux de dossiers imbriqués dans d'autres dossiers. Si nécessaire, placez certains articles dans une boîte. + </string> + <string name="TooltipOutboxTooManyFolders"> + Le nombre de sous-dossiers dépasse [AMOUNT]. Diminuez le nombre de sous-dossiers dans votre annonce. Si nécessaire, placez certains articles dans une boîte. + </string> + <string name="TooltipOutboxTooManyObjects"> + Le nombre d'articles dépasse [AMOUNT]. Pour pouvoir vendre plus de [AMOUNT] articles au sein d'une même annonce, vous devez placer certains de ces articles dans une boîte. + </string> + <string name="TooltipOutboxTooManyStockItems"> + Le nombre d'articles de stock dépasse [AMOUNT]. + </string> + <string name="TooltipOutboxCannotDropOnRoot"> + Vous pouvez uniquement déposer des articles ou des dossiers dans les onglets TOUS ou NON ASSOCIÉS. Sélectionnez l’un de ces onglets et déplacez à nouveau votre ou vos article ou dossiers. + </string> + <string name="TooltipOutboxNoTransfer"> + Impossible de vendre ou de transférer un ou plusieurs de ces objets + </string> + <string name="TooltipOutboxNotInInventory"> + Vous ne pouvez mettre sur la Place du marché que des articles de votre inventaire + </string> + <string name="TooltipOutboxLinked"> + Vous ne pouvez pas mettre des articles ou dossiers liés sur la Place du marché + </string> + <string name="TooltipOutboxCallingCard"> + Vous ne pouvez pas mettre des cartes de visite sur la Place du marché + </string> + <string name="TooltipOutboxDragActive"> + vous ne pouvez pas déplacer une annonce publiée + </string> + <string name="TooltipOutboxCannotMoveRoot"> + Vous ne pouvez pas déplacer le dossier racine des annonces de la Place du marché + </string> + <string name="TooltipOutboxMixedStock"> + tous les articles d'un dossier de stock doivent avoir le même type et droit + </string> + <string name="TooltipDragOntoOwnChild"> + Impossible de déplacer un dossier vers son enfant + </string> + <string name="TooltipDragOntoSelf"> + Impossible de déplacer un dossier vers lui-même + </string> + <string name="TooltipHttpUrl"> + Cliquez pour afficher cette page web + </string> + <string name="TooltipSLURL"> + Cliquez pour en savoir plus sur cet endroit + </string> + <string name="TooltipAgentUrl"> + Cliquez pour afficher le profil de ce résident + </string> + <string name="TooltipAgentInspect"> + En savoir plus sur ce résident + </string> + <string name="TooltipAgentMute"> + Cliquer pour ignorer ce résident + </string> + <string name="TooltipAgentUnmute"> + Cliquer pour ne plus ignorer ce résident + </string> + <string name="TooltipAgentIM"> + Cliquer pour envoyer un IM à ce résident + </string> + <string name="TooltipAgentPay"> + Cliquer pour payer ce résident + </string> + <string name="TooltipAgentOfferTeleport"> + Cliquer pour proposer une téléportation à ce résident + </string> + <string name="TooltipAgentRequestFriend"> + Cliquer pour demander à ce résident d'être votre ami + </string> + <string name="TooltipGroupUrl"> + Cliquez pour afficher la description de ce groupe + </string> + <string name="TooltipEventUrl"> + Cliquez pour afficher la description de cet événement + </string> + <string name="TooltipClassifiedUrl"> + Cliquez pour afficher cette petite annonce + </string> + <string name="TooltipParcelUrl"> + Cliquez pour afficher la description de cette parcelle + </string> + <string name="TooltipTeleportUrl"> + Cliquez pour vous téléporter à cet endroit + </string> + <string name="TooltipObjectIMUrl"> + Cliquez pour afficher la description de cet objet + </string> + <string name="TooltipMapUrl"> + Cliquez pour voir cet emplacement sur la carte + </string> + <string name="TooltipSLAPP"> + Cliquez pour exécuter la commande secondlife:// + </string> <string name="CurrentURL" value=" URL actuelle : [CurrentURL]"/> - <string name="TooltipEmail">Cliquez pour composer un message</string> - <string name="SLurlLabelTeleport">Me téléporter vers</string> - <string name="SLurlLabelShowOnMap">Afficher la carte pour</string> - <string name="SLappAgentMute">Ignorer</string> - <string name="SLappAgentUnmute">Ne plus ignorer</string> - <string name="SLappAgentIM">IM</string> - <string name="SLappAgentPay">Payer</string> - <string name="SLappAgentOfferTeleport">Proposer une téléportation à </string> - <string name="SLappAgentRequestFriend">Demande d'amitié</string> - <string name="SLappAgentRemoveFriend">Suppression d'un ami</string> - <string name="BUTTON_CLOSE_DARWIN">Fermer (⌘W)</string> - <string name="BUTTON_CLOSE_WIN">Fermer (Ctrl+W)</string> - <string name="BUTTON_CLOSE_CHROME">Fermer</string> - <string name="BUTTON_RESTORE">Restaurer</string> - <string name="BUTTON_MINIMIZE">Minimiser</string> - <string name="BUTTON_TEAR_OFF">Réduire</string> - <string name="BUTTON_DOCK">Attacher</string> - <string name="BUTTON_HELP">Afficher l'aide</string> - <string name="TooltipNotecardNotAllowedTypeDrop">Les éléments de ce type ne peuvent pas être attachés -aux notes de cette région.</string> - <string name="TooltipNotecardOwnerRestrictedDrop">Seuls des éléments avec des autorisation + <string name="TooltipEmail"> + Cliquez pour composer un message + </string> + <string name="SLurlLabelTeleport"> + Me téléporter vers + </string> + <string name="SLurlLabelShowOnMap"> + Afficher la carte pour + </string> + <string name="SLappAgentMute"> + Ignorer + </string> + <string name="SLappAgentUnmute"> + Ne plus ignorer + </string> + <string name="SLappAgentIM"> + IM + </string> + <string name="SLappAgentPay"> + Payer + </string> + <string name="SLappAgentOfferTeleport"> + Proposer une téléportation à + </string> + <string name="SLappAgentRequestFriend"> + Demande d'amitié + </string> + <string name="SLappAgentRemoveFriend"> + Suppression d'un ami + </string> + <string name="BUTTON_CLOSE_DARWIN"> + Fermer (⌘W) + </string> + <string name="BUTTON_CLOSE_WIN"> + Fermer (Ctrl+W) + </string> + <string name="BUTTON_CLOSE_CHROME"> + Fermer + </string> + <string name="BUTTON_RESTORE"> + Restaurer + </string> + <string name="BUTTON_MINIMIZE"> + Minimiser + </string> + <string name="BUTTON_TEAR_OFF"> + Réduire + </string> + <string name="BUTTON_DOCK"> + Attacher + </string> + <string name="BUTTON_HELP"> + Afficher l'aide + </string> + <string name="TooltipNotecardNotAllowedTypeDrop"> + Les éléments de ce type ne peuvent pas être attachés +aux notes de cette région. + </string> + <string name="TooltipNotecardOwnerRestrictedDrop"> + Seuls des éléments avec des autorisation illimitées pour le 'prochain propriétaire' -peuvent être joints aux notes.</string> - <string name="Searching">Recherche...</string> - <string name="NoneFound">Aucun résultat.</string> - <string name="RetrievingData">En cours d'extraction...</string> - <string name="ReleaseNotes">Notes de version</string> - <string name="RELEASE_NOTES_BASE_URL">https://megapahit.net/</string> - <string name="LoadingData">Chargement...</string> - <string name="AvatarNameNobody">(personne)</string> - <string name="AvatarNameWaiting">(en attente)</string> - <string name="AvatarNameMultiple">(multiple)</string> - <string name="GroupNameNone">(aucun)</string> - <string name="AssetErrorNone">Aucune erreur</string> - <string name="AssetErrorRequestFailed">Requête de l'actif : échec</string> - <string name="AssetErrorNonexistentFile">Requête de l'actif : fichier inexistant</string> - <string name="AssetErrorNotInDatabase">Requête de l'actif : actif introuvable dans la base de données</string> - <string name="AssetErrorEOF">Fin du ficher</string> - <string name="AssetErrorCannotOpenFile">Impossible d'ouvrir le fichier</string> - <string name="AssetErrorFileNotFound">Fichier introuvable</string> - <string name="AssetErrorTCPTimeout">Délai d'attente du transfert du fichier dépassé</string> - <string name="AssetErrorCircuitGone">Disparition du circuit</string> - <string name="AssetErrorPriceMismatch">Il y a une différence de prix entre le client et le serveur</string> - <string name="AssetErrorUnknownStatus">Statut inconnu</string> - <string name="AssetUploadServerUnreacheble">Service inaccessible.</string> - <string name="AssetUploadServerDifficulties">Le serveur rencontres des difficultés imprévues.</string> - <string name="AssetUploadServerUnavaliable">Services non disponible ou la durée du chargement est dépassée.</string> - <string name="AssetUploadRequestInvalid">Erreur dans la demande de chargement. Veuillez consulter le site : -http://secondlife.com/support pour vous aider à résoudre ce problème.</string> - <string name="SettingValidationError">Échec de la validation pour l'importation des paramètres [NAME]</string> - <string name="SettingImportFileError">Impossible d'ouvre le fichier [FILE]</string> - <string name="SettingParseFileError">Impossible d'ouvre le fichier [FILE]</string> - <string name="SettingTranslateError">Impossible de traduit les paramètres windlight hérités [NAME]</string> - <string name="texture">texture</string> - <string name="sound">son</string> - <string name="calling card">carte de visite</string> - <string name="landmark">repère</string> - <string name="legacy script">script (ancienne version)</string> - <string name="clothing">habits</string> - <string name="object">objet</string> - <string name="note card">note</string> - <string name="folder">dossier</string> - <string name="root">racine</string> - <string name="lsl2 script">script LSL2</string> - <string name="lsl bytecode">bytecode LSL</string> - <string name="tga texture">texture tga</string> - <string name="body part">partie du corps</string> - <string name="snapshot">photo</string> - <string name="lost and found">Objets trouvés</string> - <string name="targa image">image targa</string> - <string name="trash">Corbeille</string> - <string name="jpeg image">image jpeg</string> - <string name="animation">animation</string> - <string name="gesture">geste</string> - <string name="simstate">simstate</string> - <string name="favorite">favori</string> - <string name="symbolic link">lien</string> - <string name="symbolic folder link">lien du dossier</string> - <string name="settings blob">paramètres</string> - <string name="mesh">maillage</string> - <string name="AvatarEditingAppearance">(Apparence en cours de modification)</string> - <string name="AvatarAway">Absent</string> - <string name="AvatarDoNotDisturb">Ne pas déranger</string> - <string name="AvatarMuted">Bloqué(e)</string> - <string name="anim_express_afraid">Effrayé</string> - <string name="anim_express_anger">En colère</string> - <string name="anim_away">Absent</string> - <string name="anim_backflip">Salto arrière</string> - <string name="anim_express_laugh">Rire en se tenant le ventre</string> - <string name="anim_express_toothsmile">Grand sourire</string> - <string name="anim_blowkiss">Envoyer un baiser</string> - <string name="anim_express_bored">Bailler d'ennui</string> - <string name="anim_bow">S'incliner</string> - <string name="anim_clap">Applaudir</string> - <string name="anim_courtbow">Révérence de cour</string> - <string name="anim_express_cry">Pleurer</string> - <string name="anim_dance1">Danse 1</string> - <string name="anim_dance2">Danse 2</string> - <string name="anim_dance3">Danse 3</string> - <string name="anim_dance4">Danse 4</string> - <string name="anim_dance5">Danse 5</string> - <string name="anim_dance6">Danse 6</string> - <string name="anim_dance7">Danse 7</string> - <string name="anim_dance8">Danse 8</string> - <string name="anim_express_disdain">Mépris</string> - <string name="anim_drink">Boire</string> - <string name="anim_express_embarrased">Gêne</string> - <string name="anim_angry_fingerwag">Désapprobation</string> - <string name="anim_fist_pump">Victoire</string> - <string name="anim_yoga_float">Yoga</string> - <string name="anim_express_frown">Froncer les sourcils</string> - <string name="anim_impatient">Impatient</string> - <string name="anim_jumpforjoy">Sauter de joie</string> - <string name="anim_kissmybutt">Va te faire voir !</string> - <string name="anim_express_kiss">Envoyer un baiser</string> - <string name="anim_laugh_short">Rire</string> - <string name="anim_musclebeach">Montrer ses muscles</string> - <string name="anim_no_unhappy">Non (mécontent)</string> - <string name="anim_no_head">Non</string> - <string name="anim_nyanya">Na na na na nère</string> - <string name="anim_punch_onetwo">Gauche-droite</string> - <string name="anim_express_open_mouth">Bouche ouverte</string> - <string name="anim_peace">Paix</string> - <string name="anim_point_you">Montrer quelqu'un du doigt</string> - <string name="anim_point_me">Se montrer du doigt</string> - <string name="anim_punch_l">Gauche</string> - <string name="anim_punch_r">Droite</string> - <string name="anim_rps_countdown">Compter (pierre-papier-ciseaux)</string> - <string name="anim_rps_paper">Papier (pierre-papier-ciseaux)</string> - <string name="anim_rps_rock">Pierre (pierre-papier-ciseaux)</string> - <string name="anim_rps_scissors">Ciseaux (pierre-papier-ciseaux)</string> - <string name="anim_express_repulsed">Dégoût</string> - <string name="anim_kick_roundhouse_r">Coup de pied circulaire</string> - <string name="anim_express_sad">Triste</string> - <string name="anim_salute">Salut</string> - <string name="anim_shout">Crier</string> - <string name="anim_express_shrug">Hausser les épaules</string> - <string name="anim_express_smile">Sourire</string> - <string name="anim_smoke_idle">Fumer, immobile</string> - <string name="anim_smoke_inhale">Fumer, prendre une bouffée</string> - <string name="anim_smoke_throw_down">Fumer, jeter son mégot</string> - <string name="anim_express_surprise">Surprise</string> - <string name="anim_sword_strike_r">Coup d'épée</string> - <string name="anim_angry_tantrum">Caprice</string> - <string name="anim_express_tongue_out">Tirer la langue</string> - <string name="anim_hello">Faire signe</string> - <string name="anim_whisper">Chuchoter</string> - <string name="anim_whistle">Siffler</string> - <string name="anim_express_wink">Clin d'Å“il</string> - <string name="anim_wink_hollywood">Clin d'Å“il (Hollywood)</string> - <string name="anim_express_worry">Soucis</string> - <string name="anim_yes_happy">Oui (Joie)</string> - <string name="anim_yes_head">Oui</string> - <string name="multiple_textures">Multiples</string> - <string name="use_texture">Utiliser la texture</string> - <string name="manip_hint1">Faites glisser le curseur sur l'axe</string> - <string name="manip_hint2">pour le fixer sur la grille</string> - <string name="texture_loading">Chargement...</string> - <string name="worldmap_offline">Hors ligne</string> - <string name="worldmap_item_tooltip_format">[AREA] m² [PRICE] L$</string> - <string name="worldmap_results_none_found">Aucun résultat.</string> - <string name="Ok">OK</string> - <string name="Premature end of file">Fichier incomplet</string> - <string name="ST_NO_JOINT">Impossible de trouver ROOT ou JOINT.</string> - <string name="NearbyChatTitle">Chat près de moi</string> - <string name="NearbyChatLabel">(Chat près de moi)</string> - <string name="whisper">chuchote :</string> - <string name="shout">crie :</string> - <string name="ringing">Connexion au chat vocal du Monde en cours…</string> - <string name="connected">Connecté(e)</string> - <string name="unavailable">Voix non disponible à l'endroit où vous êtes</string> - <string name="hang_up">Déconnecté du chat vocal</string> - <string name="reconnect_nearby">Vous allez maintenant être reconnecté(e) au chat vocal près de vous.</string> - <string name="ScriptQuestionCautionChatGranted">'[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], a reçu le droit de : [PERMISSIONS].</string> - <string name="ScriptQuestionCautionChatDenied">'[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], n'a pas reçu le droit de : [PERMISSIONS].</string> - <string name="AdditionalPermissionsRequestHeader">Si vous autorisez un accès à votre compte, vous autorisez également l'objet à  :</string> - <string name="ScriptTakeMoney">Débiter vos Linden dollars (L$)</string> - <string name="ActOnControlInputs">Utiliser vos touches de commandes</string> - <string name="RemapControlInputs">Reconfigurer vos touches de commandes</string> - <string name="AnimateYourAvatar">Animer votre avatar</string> - <string name="AttachToYourAvatar">Attacher à votre avatar</string> - <string name="ReleaseOwnership">Passer l'objet dans le domaine public (sans propriétaire)</string> - <string name="LinkAndDelink">Lier et délier d'autres objets</string> - <string name="AddAndRemoveJoints">Créer et supprimer des liens avec d'autres objets</string> - <string name="ChangePermissions">Modifier ses droits</string> - <string name="TrackYourCamera">Suivre votre caméra</string> - <string name="ControlYourCamera">Contrôler votre caméra</string> - <string name="TeleportYourAgent">Vous téléporter</string> - <string name="ForceSitAvatar">Forcez votre avatar à s’asseoir</string> - <string name="ChangeEnvSettings">Changer vos paramètres d'environnement</string> - <string name="NotConnected">Pas connecté(e)</string> - <string name="AgentNameSubst">(Vous)</string> +peuvent être joints aux notes. + </string> + <string name="Searching"> + Recherche... + </string> + <string name="NoneFound"> + Aucun résultat. + </string> + <string name="RetrievingData"> + En cours d'extraction... + </string> + <string name="ReleaseNotes"> + Notes de version + </string> + <string name="RELEASE_NOTES_BASE_URL"> + https://megapahit.net/ + </string> + <string name="LoadingData"> + Chargement... + </string> + <string name="AvatarNameNobody"> + (personne) + </string> + <string name="AvatarNameWaiting"> + (en attente) + </string> + <string name="AvatarNameMultiple"> + (multiple) + </string> + <string name="GroupNameNone"> + (aucun) + </string> + <string name="AssetErrorNone"> + Aucune erreur + </string> + <string name="AssetErrorRequestFailed"> + Requête de l'actif : échec + </string> + <string name="AssetErrorNonexistentFile"> + Requête de l'actif : fichier inexistant + </string> + <string name="AssetErrorNotInDatabase"> + Requête de l'actif : actif introuvable dans la base de données + </string> + <string name="AssetErrorEOF"> + Fin du ficher + </string> + <string name="AssetErrorCannotOpenFile"> + Impossible d'ouvrir le fichier + </string> + <string name="AssetErrorFileNotFound"> + Fichier introuvable + </string> + <string name="AssetErrorTCPTimeout"> + Délai d'attente du transfert du fichier dépassé + </string> + <string name="AssetErrorCircuitGone"> + Disparition du circuit + </string> + <string name="AssetErrorPriceMismatch"> + Il y a une différence de prix entre le client et le serveur + </string> + <string name="AssetErrorUnknownStatus"> + Statut inconnu + </string> + <string name="AssetUploadServerUnreacheble"> + Service inaccessible. + </string> + <string name="AssetUploadServerDifficulties"> + Le serveur rencontres des difficultés imprévues. + </string> + <string name="AssetUploadServerUnavaliable"> + Services non disponible ou la durée du chargement est dépassée. + </string> + <string name="AssetUploadRequestInvalid"> + Erreur dans la demande de chargement. Veuillez consulter le site : +http://secondlife.com/support pour vous aider à résoudre ce problème. + </string> + <string name="SettingValidationError"> + Échec de la validation pour l'importation des paramètres [NAME] + </string> + <string name="SettingImportFileError"> + Impossible d'ouvre le fichier [FILE] + </string> + <string name="SettingParseFileError"> + Impossible d'ouvre le fichier [FILE] + </string> + <string name="SettingTranslateError"> + Impossible de traduit les paramètres windlight hérités [NAME] + </string> + <string name="texture"> + texture + </string> + <string name="sound"> + son + </string> + <string name="calling card"> + carte de visite + </string> + <string name="landmark"> + repère + </string> + <string name="legacy script"> + script (ancienne version) + </string> + <string name="clothing"> + habits + </string> + <string name="object"> + objet + </string> + <string name="note card"> + note + </string> + <string name="folder"> + dossier + </string> + <string name="root"> + racine + </string> + <string name="lsl2 script"> + script LSL2 + </string> + <string name="lsl bytecode"> + bytecode LSL + </string> + <string name="tga texture"> + texture tga + </string> + <string name="body part"> + partie du corps + </string> + <string name="snapshot"> + photo + </string> + <string name="lost and found"> + Objets trouvés + </string> + <string name="targa image"> + image targa + </string> + <string name="trash"> + Corbeille + </string> + <string name="jpeg image"> + image jpeg + </string> + <string name="animation"> + animation + </string> + <string name="gesture"> + geste + </string> + <string name="simstate"> + simstate + </string> + <string name="favorite"> + favori + </string> + <string name="symbolic link"> + lien + </string> + <string name="symbolic folder link"> + lien du dossier + </string> + <string name="settings blob"> + paramètres + </string> + <string name="mesh"> + maillage + </string> + <string name="AvatarEditingAppearance"> + (Apparence en cours de modification) + </string> + <string name="AvatarAway"> + Absent + </string> + <string name="AvatarDoNotDisturb"> + Ne pas déranger + </string> + <string name="AvatarMuted"> + Bloqué(e) + </string> + <string name="anim_express_afraid"> + Effrayé + </string> + <string name="anim_express_anger"> + En colère + </string> + <string name="anim_away"> + Absent + </string> + <string name="anim_backflip"> + Salto arrière + </string> + <string name="anim_express_laugh"> + Rire en se tenant le ventre + </string> + <string name="anim_express_toothsmile"> + Grand sourire + </string> + <string name="anim_blowkiss"> + Envoyer un baiser + </string> + <string name="anim_express_bored"> + Bailler d'ennui + </string> + <string name="anim_bow"> + S'incliner + </string> + <string name="anim_clap"> + Applaudir + </string> + <string name="anim_courtbow"> + Révérence de cour + </string> + <string name="anim_express_cry"> + Pleurer + </string> + <string name="anim_dance1"> + Danse 1 + </string> + <string name="anim_dance2"> + Danse 2 + </string> + <string name="anim_dance3"> + Danse 3 + </string> + <string name="anim_dance4"> + Danse 4 + </string> + <string name="anim_dance5"> + Danse 5 + </string> + <string name="anim_dance6"> + Danse 6 + </string> + <string name="anim_dance7"> + Danse 7 + </string> + <string name="anim_dance8"> + Danse 8 + </string> + <string name="anim_express_disdain"> + Mépris + </string> + <string name="anim_drink"> + Boire + </string> + <string name="anim_express_embarrased"> + Gêne + </string> + <string name="anim_angry_fingerwag"> + Désapprobation + </string> + <string name="anim_fist_pump"> + Victoire + </string> + <string name="anim_yoga_float"> + Yoga + </string> + <string name="anim_express_frown"> + Froncer les sourcils + </string> + <string name="anim_impatient"> + Impatient + </string> + <string name="anim_jumpforjoy"> + Sauter de joie + </string> + <string name="anim_kissmybutt"> + Va te faire voir ! + </string> + <string name="anim_express_kiss"> + Envoyer un baiser + </string> + <string name="anim_laugh_short"> + Rire + </string> + <string name="anim_musclebeach"> + Montrer ses muscles + </string> + <string name="anim_no_unhappy"> + Non (mécontent) + </string> + <string name="anim_no_head"> + Non + </string> + <string name="anim_nyanya"> + Na na na na nère + </string> + <string name="anim_punch_onetwo"> + Gauche-droite + </string> + <string name="anim_express_open_mouth"> + Bouche ouverte + </string> + <string name="anim_peace"> + Paix + </string> + <string name="anim_point_you"> + Montrer quelqu'un du doigt + </string> + <string name="anim_point_me"> + Se montrer du doigt + </string> + <string name="anim_punch_l"> + Gauche + </string> + <string name="anim_punch_r"> + Droite + </string> + <string name="anim_rps_countdown"> + Compter (pierre-papier-ciseaux) + </string> + <string name="anim_rps_paper"> + Papier (pierre-papier-ciseaux) + </string> + <string name="anim_rps_rock"> + Pierre (pierre-papier-ciseaux) + </string> + <string name="anim_rps_scissors"> + Ciseaux (pierre-papier-ciseaux) + </string> + <string name="anim_express_repulsed"> + Dégoût + </string> + <string name="anim_kick_roundhouse_r"> + Coup de pied circulaire + </string> + <string name="anim_express_sad"> + Triste + </string> + <string name="anim_salute"> + Salut + </string> + <string name="anim_shout"> + Crier + </string> + <string name="anim_express_shrug"> + Hausser les épaules + </string> + <string name="anim_express_smile"> + Sourire + </string> + <string name="anim_smoke_idle"> + Fumer, immobile + </string> + <string name="anim_smoke_inhale"> + Fumer, prendre une bouffée + </string> + <string name="anim_smoke_throw_down"> + Fumer, jeter son mégot + </string> + <string name="anim_express_surprise"> + Surprise + </string> + <string name="anim_sword_strike_r"> + Coup d'épée + </string> + <string name="anim_angry_tantrum"> + Caprice + </string> + <string name="anim_express_tongue_out"> + Tirer la langue + </string> + <string name="anim_hello"> + Faire signe + </string> + <string name="anim_whisper"> + Chuchoter + </string> + <string name="anim_whistle"> + Siffler + </string> + <string name="anim_express_wink"> + Clin d'Å“il + </string> + <string name="anim_wink_hollywood"> + Clin d'Å“il (Hollywood) + </string> + <string name="anim_express_worry"> + Soucis + </string> + <string name="anim_yes_happy"> + Oui (Joie) + </string> + <string name="anim_yes_head"> + Oui + </string> + <string name="multiple_textures"> + Multiples + </string> + <string name="use_texture"> + Utiliser la texture + </string> + <string name="manip_hint1"> + Faites glisser le curseur sur l'axe + </string> + <string name="manip_hint2"> + pour le fixer sur la grille + </string> + <string name="texture_loading"> + Chargement... + </string> + <string name="worldmap_offline"> + Hors ligne + </string> + <string name="worldmap_item_tooltip_format"> + [AREA] m² [PRICE] L$ + </string> + <string name="worldmap_results_none_found"> + Aucun résultat. + </string> + <string name="Ok"> + OK + </string> + <string name="Premature end of file"> + Fichier incomplet + </string> + <string name="ST_NO_JOINT"> + Impossible de trouver ROOT ou JOINT. + </string> + <string name="NearbyChatTitle"> + Chat près de moi + </string> + <string name="NearbyChatLabel"> + (Chat près de moi) + </string> + <string name="whisper"> + chuchote : + </string> + <string name="shout"> + crie : + </string> + <string name="ringing"> + Connexion au chat vocal du Monde en cours… + </string> + <string name="connected"> + Connecté(e) + </string> + <string name="unavailable"> + Voix non disponible à l'endroit où vous êtes + </string> + <string name="hang_up"> + Déconnecté du chat vocal + </string> + <string name="reconnect_nearby"> + Vous allez maintenant être reconnecté(e) au chat vocal près de vous. + </string> + <string name="ScriptQuestionCautionChatGranted"> + '[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], a reçu le droit de : [PERMISSIONS]. + </string> + <string name="ScriptQuestionCautionChatDenied"> + '[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], n'a pas reçu le droit de : [PERMISSIONS]. + </string> + <string name="AdditionalPermissionsRequestHeader"> + Si vous autorisez un accès à votre compte, vous autorisez également l'objet à  : + </string> + <string name="ScriptTakeMoney"> + Débiter vos Linden dollars (L$) + </string> + <string name="ActOnControlInputs"> + Utiliser vos touches de commandes + </string> + <string name="RemapControlInputs"> + Reconfigurer vos touches de commandes + </string> + <string name="AnimateYourAvatar"> + Animer votre avatar + </string> + <string name="AttachToYourAvatar"> + Attacher à votre avatar + </string> + <string name="ReleaseOwnership"> + Passer l'objet dans le domaine public (sans propriétaire) + </string> + <string name="LinkAndDelink"> + Lier et délier d'autres objets + </string> + <string name="AddAndRemoveJoints"> + Créer et supprimer des liens avec d'autres objets + </string> + <string name="ChangePermissions"> + Modifier ses droits + </string> + <string name="TrackYourCamera"> + Suivre votre caméra + </string> + <string name="ControlYourCamera"> + Contrôler votre caméra + </string> + <string name="TeleportYourAgent"> + Vous téléporter + </string> + <string name="ForceSitAvatar"> + Forcez votre avatar à s’asseoir + </string> + <string name="ChangeEnvSettings"> + Changer vos paramètres d'environnement + </string> + <string name="NotConnected"> + Pas connecté(e) + </string> + <string name="AgentNameSubst"> + (Vous) + </string> <string name="JoinAnExperience"/> - <string name="SilentlyManageEstateAccess">Supprimer les alertes lors de la gestion des listes d'accès aux domaines</string> - <string name="OverrideYourAnimations">Remplacer vos animations par défaut</string> - <string name="ScriptReturnObjects">Renvoyer les objets de votre part</string> - <string name="UnknownScriptPermission">(inconnu)</string> - <string name="SIM_ACCESS_PG">Général</string> - <string name="SIM_ACCESS_MATURE">Modéré</string> - <string name="SIM_ACCESS_ADULT">Adulte</string> - <string name="SIM_ACCESS_DOWN">Hors ligne</string> - <string name="SIM_ACCESS_MIN">Inconnu</string> - <string name="land_type_unknown">(inconnu)</string> - <string name="Estate / Full Region">Domaine / Région entière</string> - <string name="Estate / Homestead">Domaine / Homestead</string> - <string name="Mainland / Homestead">Continent / Homestead</string> - <string name="Mainland / Full Region">Continent / Région entière</string> - <string name="all_files">Tous fichiers</string> - <string name="sound_files">Sons</string> - <string name="animation_files">Animations</string> - <string name="image_files">Images</string> - <string name="save_file_verb">Enregistrer</string> - <string name="load_file_verb">Charger</string> - <string name="targa_image_files">Images Targa</string> - <string name="bitmap_image_files">Images Bitmap</string> - <string name="png_image_files">Images PNG</string> - <string name="save_texture_image_files">Images Targa ou PNG</string> - <string name="avi_movie_file">Fichier de film AVI</string> - <string name="xaf_animation_file">Fichier d'animation XAF</string> - <string name="xml_file">Fichier XML</string> - <string name="raw_file">Fichier RAW</string> - <string name="compressed_image_files">Images compressées</string> - <string name="load_files">Charger des fichiers</string> - <string name="choose_the_directory">Choisir le répertoire</string> - <string name="script_files">Scripts</string> - <string name="dictionary_files">Dictionnaires</string> - <string name="shape">Silhouette</string> - <string name="skin">Peau</string> - <string name="hair">Cheveux</string> - <string name="eyes">Yeux</string> - <string name="shirt">Chemise</string> - <string name="pants">Pantalon</string> - <string name="shoes">Chaussures</string> - <string name="socks">Chaussettes</string> - <string name="jacket">Veste</string> - <string name="gloves">Gants</string> - <string name="undershirt">Débardeur</string> - <string name="underpants">Caleçon</string> - <string name="skirt">Jupe</string> - <string name="alpha">Alpha</string> - <string name="tattoo">Tatouage</string> - <string name="universal">Universel</string> - <string name="physics">Propriétés physiques</string> - <string name="invalid">non valide</string> - <string name="none">aucun</string> - <string name="shirt_not_worn">Chemise non portée</string> - <string name="pants_not_worn">Pantalon non porté</string> - <string name="shoes_not_worn">Chaussures non portées</string> - <string name="socks_not_worn">Chaussettes non portées</string> - <string name="jacket_not_worn">Veste non portée</string> - <string name="gloves_not_worn">Gants non portés</string> - <string name="undershirt_not_worn">Débardeur non porté</string> - <string name="underpants_not_worn">Caleçon non porté</string> - <string name="skirt_not_worn">Jupe non portée</string> - <string name="alpha_not_worn">Alpha non porté</string> - <string name="tattoo_not_worn">Tatouage non porté</string> - <string name="universal_not_worn">Universel non porté</string> - <string name="physics_not_worn">Propriétés physiques non portées</string> - <string name="invalid_not_worn">non valide</string> - <string name="create_new_shape">Créer une nouvelle silhouette</string> - <string name="create_new_skin">Créer une nouvelle peau</string> - <string name="create_new_hair">Créer de nouveaux cheveux</string> - <string name="create_new_eyes">Créer de nouveaux yeux</string> - <string name="create_new_shirt">Créer une nouvelle chemise</string> - <string name="create_new_pants">Créer un nouveau pantalon</string> - <string name="create_new_shoes">Créer de nouvelles chaussures</string> - <string name="create_new_socks">Créer de nouvelles chaussettes</string> - <string name="create_new_jacket">Créer une nouvelle veste</string> - <string name="create_new_gloves">Créer de nouveaux gants</string> - <string name="create_new_undershirt">Créer un nouveau débardeur</string> - <string name="create_new_underpants">Créer un nouveau caleçon</string> - <string name="create_new_skirt">Créer une nouvelle jupe</string> - <string name="create_new_alpha">Créer un nouvel alpha</string> - <string name="create_new_tattoo">Créer un nouveau tatouage</string> - <string name="create_new_universal">Créer un nouvel environnement universel</string> - <string name="create_new_physics">Créer de nouvelles propriétés physiques</string> - <string name="create_new_invalid">non valide</string> - <string name="NewWearable">Nouv. [WEARABLE_ITEM]</string> - <string name="next">Suivant</string> - <string name="ok">OK</string> - <string name="GroupNotifyGroupNotice">Note au groupe</string> - <string name="GroupNotifyGroupNotices">Notices au groupe</string> - <string name="GroupNotifySentBy">Envoyée par</string> - <string name="GroupNotifyAttached">Pièce(s) jointe(s) :</string> - <string name="GroupNotifyViewPastNotices">Consultez les notices précédentes ou choisissez de ne plus recevoir ces messages ici.</string> - <string name="GroupNotifyOpenAttachment">Ouvrir pièce jointe</string> - <string name="GroupNotifySaveAttachment">Enregistrer la pièce jointe</string> - <string name="TeleportOffer">Offre de téléportation</string> - <string name="StartUpNotifications">De nouvelles notifications sont arrivées en votre absence.</string> - <string name="OverflowInfoChannelString">Vous avez %d notification(s) supplémentaire(s)</string> - <string name="BodyPartsRightArm">Bras droit</string> - <string name="BodyPartsHead">Tête</string> - <string name="BodyPartsLeftArm">Bras gauche</string> - <string name="BodyPartsLeftLeg">Jambe gauche</string> - <string name="BodyPartsTorso">Torse</string> - <string name="BodyPartsRightLeg">Jambe droite</string> - <string name="BodyPartsEnhancedSkeleton">Squelette amélioré</string> - <string name="GraphicsQualityLow">Faible</string> - <string name="GraphicsQualityMid">Moyen</string> - <string name="GraphicsQualityHigh">Élevé</string> - <string name="LeaveMouselook">Appuyez sur ESC pour quitter la vue subjective</string> - <string name="InventoryNoMatchingItems">Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/all/[SEARCH_TERM] Rechercher].</string> - <string name="InventoryNoMatchingRecentItems">Avez-vous trouvé ce que vous cherchiez ? Essayez [secondlife:///app/inventory/filters Show filters].</string> - <string name="PlacesNoMatchingItems">Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/places/[SEARCH_TERM] Rechercher].</string> - <string name="FavoritesNoMatchingItems">Faites glisser un repère ici pour l'ajouter à vos Favoris.</string> - <string name="MarketplaceNoMatchingItems">Aucun article trouvé. Vérifiez l'orthographe de votre chaîne de recherche et réessayez.</string> - <string name="InventoryNoTexture">Vous n'avez pas de copie de cette texture dans votre inventaire</string> - <string name="InventoryInboxNoItems">Les achats que vous avez effectués sur la Place du marché s'affichent ici. Vous pouvez alors les faire glisser vers votre inventaire afin de les utiliser.</string> - <string name="MarketplaceURL">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/</string> - <string name="MarketplaceURL_CreateStore">http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3</string> - <string name="MarketplaceURL_Dashboard">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard</string> - <string name="MarketplaceURL_Imports">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports</string> - <string name="MarketplaceURL_LearnMore">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more</string> - <string name="InventoryPlayAnimationTooltip">Ouvrir la fenêtre avec les options Jeu</string> - <string name="InventoryPlayGestureTooltip">Exécuter le geste sélectionné dans le monde virtuel.</string> - <string name="InventoryPlaySoundTooltip">Ouvrir la fenêtre avec les options Jeu</string> - <string name="InventoryOutboxNotMerchantTitle">Tout le monde peut vendre des articles sur la Place du marché.</string> + <string name="SilentlyManageEstateAccess"> + Supprimer les alertes lors de la gestion des listes d'accès aux domaines + </string> + <string name="OverrideYourAnimations"> + Remplacer vos animations par défaut + </string> + <string name="ScriptReturnObjects"> + Renvoyer les objets de votre part + </string> + <string name="UnknownScriptPermission"> + (inconnu) + </string> + <string name="SIM_ACCESS_PG"> + Général + </string> + <string name="SIM_ACCESS_MATURE"> + Modéré + </string> + <string name="SIM_ACCESS_ADULT"> + Adulte + </string> + <string name="SIM_ACCESS_DOWN"> + Hors ligne + </string> + <string name="SIM_ACCESS_MIN"> + Inconnu + </string> + <string name="land_type_unknown"> + (inconnu) + </string> + <string name="Estate / Full Region"> + Domaine / Région entière + </string> + <string name="Estate / Homestead"> + Domaine / Homestead + </string> + <string name="Mainland / Homestead"> + Continent / Homestead + </string> + <string name="Mainland / Full Region"> + Continent / Région entière + </string> + <string name="all_files"> + Tous fichiers + </string> + <string name="sound_files"> + Sons + </string> + <string name="animation_files"> + Animations + </string> + <string name="image_files"> + Images + </string> + <string name="save_file_verb"> + Enregistrer + </string> + <string name="load_file_verb"> + Charger + </string> + <string name="targa_image_files"> + Images Targa + </string> + <string name="bitmap_image_files"> + Images Bitmap + </string> + <string name="png_image_files"> + Images PNG + </string> + <string name="save_texture_image_files"> + Images Targa ou PNG + </string> + <string name="avi_movie_file"> + Fichier de film AVI + </string> + <string name="xaf_animation_file"> + Fichier d'animation XAF + </string> + <string name="xml_file"> + Fichier XML + </string> + <string name="raw_file"> + Fichier RAW + </string> + <string name="compressed_image_files"> + Images compressées + </string> + <string name="load_files"> + Charger des fichiers + </string> + <string name="choose_the_directory"> + Choisir le répertoire + </string> + <string name="script_files"> + Scripts + </string> + <string name="dictionary_files"> + Dictionnaires + </string> + <string name="shape"> + Silhouette + </string> + <string name="skin"> + Peau + </string> + <string name="hair"> + Cheveux + </string> + <string name="eyes"> + Yeux + </string> + <string name="shirt"> + Chemise + </string> + <string name="pants"> + Pantalon + </string> + <string name="shoes"> + Chaussures + </string> + <string name="socks"> + Chaussettes + </string> + <string name="jacket"> + Veste + </string> + <string name="gloves"> + Gants + </string> + <string name="undershirt"> + Débardeur + </string> + <string name="underpants"> + Caleçon + </string> + <string name="skirt"> + Jupe + </string> + <string name="alpha"> + Alpha + </string> + <string name="tattoo"> + Tatouage + </string> + <string name="universal"> + Universel + </string> + <string name="physics"> + Propriétés physiques + </string> + <string name="invalid"> + non valide + </string> + <string name="none"> + aucun + </string> + <string name="shirt_not_worn"> + Chemise non portée + </string> + <string name="pants_not_worn"> + Pantalon non porté + </string> + <string name="shoes_not_worn"> + Chaussures non portées + </string> + <string name="socks_not_worn"> + Chaussettes non portées + </string> + <string name="jacket_not_worn"> + Veste non portée + </string> + <string name="gloves_not_worn"> + Gants non portés + </string> + <string name="undershirt_not_worn"> + Débardeur non porté + </string> + <string name="underpants_not_worn"> + Caleçon non porté + </string> + <string name="skirt_not_worn"> + Jupe non portée + </string> + <string name="alpha_not_worn"> + Alpha non porté + </string> + <string name="tattoo_not_worn"> + Tatouage non porté + </string> + <string name="universal_not_worn"> + Universel non porté + </string> + <string name="physics_not_worn"> + Propriétés physiques non portées + </string> + <string name="invalid_not_worn"> + non valide + </string> + <string name="create_new_shape"> + Créer une nouvelle silhouette + </string> + <string name="create_new_skin"> + Créer une nouvelle peau + </string> + <string name="create_new_hair"> + Créer de nouveaux cheveux + </string> + <string name="create_new_eyes"> + Créer de nouveaux yeux + </string> + <string name="create_new_shirt"> + Créer une nouvelle chemise + </string> + <string name="create_new_pants"> + Créer un nouveau pantalon + </string> + <string name="create_new_shoes"> + Créer de nouvelles chaussures + </string> + <string name="create_new_socks"> + Créer de nouvelles chaussettes + </string> + <string name="create_new_jacket"> + Créer une nouvelle veste + </string> + <string name="create_new_gloves"> + Créer de nouveaux gants + </string> + <string name="create_new_undershirt"> + Créer un nouveau débardeur + </string> + <string name="create_new_underpants"> + Créer un nouveau caleçon + </string> + <string name="create_new_skirt"> + Créer une nouvelle jupe + </string> + <string name="create_new_alpha"> + Créer un nouvel alpha + </string> + <string name="create_new_tattoo"> + Créer un nouveau tatouage + </string> + <string name="create_new_universal"> + Créer un nouvel environnement universel + </string> + <string name="create_new_physics"> + Créer de nouvelles propriétés physiques + </string> + <string name="create_new_invalid"> + non valide + </string> + <string name="NewWearable"> + Nouv. [WEARABLE_ITEM] + </string> + <string name="next"> + Suivant + </string> + <string name="ok"> + OK + </string> + <string name="GroupNotifyGroupNotice"> + Note au groupe + </string> + <string name="GroupNotifyGroupNotices"> + Notices au groupe + </string> + <string name="GroupNotifySentBy"> + Envoyée par + </string> + <string name="GroupNotifyAttached"> + Pièce(s) jointe(s) : + </string> + <string name="GroupNotifyViewPastNotices"> + Consultez les notices précédentes ou choisissez de ne plus recevoir ces messages ici. + </string> + <string name="GroupNotifyOpenAttachment"> + Ouvrir pièce jointe + </string> + <string name="GroupNotifySaveAttachment"> + Enregistrer la pièce jointe + </string> + <string name="TeleportOffer"> + Offre de téléportation + </string> + <string name="StartUpNotifications"> + De nouvelles notifications sont arrivées en votre absence. + </string> + <string name="OverflowInfoChannelString"> + Vous avez %d notification(s) supplémentaire(s) + </string> + <string name="BodyPartsRightArm"> + Bras droit + </string> + <string name="BodyPartsHead"> + Tête + </string> + <string name="BodyPartsLeftArm"> + Bras gauche + </string> + <string name="BodyPartsLeftLeg"> + Jambe gauche + </string> + <string name="BodyPartsTorso"> + Torse + </string> + <string name="BodyPartsRightLeg"> + Jambe droite + </string> + <string name="BodyPartsEnhancedSkeleton"> + Squelette amélioré + </string> + <string name="GraphicsQualityLow"> + Faible + </string> + <string name="GraphicsQualityMid"> + Moyen + </string> + <string name="GraphicsQualityHigh"> + Élevé + </string> + <string name="LeaveMouselook"> + Appuyez sur ESC pour quitter la vue subjective + </string> + <string name="InventoryNoMatchingItems"> + Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/all/[SEARCH_TERM] Rechercher]. + </string> + <string name="InventoryNoMatchingRecentItems"> + Avez-vous trouvé ce que vous cherchiez ? Essayez [secondlife:///app/inventory/filters Show filters]. + </string> + <string name="PlacesNoMatchingItems"> + Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/places/[SEARCH_TERM] Rechercher]. + </string> + <string name="FavoritesNoMatchingItems"> + Faites glisser un repère ici pour l'ajouter à vos Favoris. + </string> + <string name="MarketplaceNoMatchingItems"> + Aucun article trouvé. Vérifiez l'orthographe de votre chaîne de recherche et réessayez. + </string> + <string name="InventoryNoTexture"> + Vous n'avez pas de copie de cette texture dans votre inventaire + </string> + <string name="InventoryInboxNoItems"> + Les achats que vous avez effectués sur la Place du marché s'affichent ici. Vous pouvez alors les faire glisser vers votre inventaire afin de les utiliser. + </string> + <string name="MarketplaceURL"> + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ + </string> + <string name="MarketplaceURL_CreateStore"> + http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 + </string> + <string name="MarketplaceURL_Dashboard"> + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard + </string> + <string name="MarketplaceURL_Imports"> + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports + </string> + <string name="MarketplaceURL_LearnMore"> + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more + </string> + <string name="InventoryPlayAnimationTooltip"> + Ouvrir la fenêtre avec les options Jeu + </string> + <string name="InventoryPlayGestureTooltip"> + Exécuter le geste sélectionné dans le monde virtuel. + </string> + <string name="InventoryPlaySoundTooltip"> + Ouvrir la fenêtre avec les options Jeu + </string> + <string name="InventoryOutboxNotMerchantTitle"> + Tout le monde peut vendre des articles sur la Place du marché. + </string> <string name="InventoryOutboxNotMerchantTooltip"/> - <string name="InventoryOutboxNotMerchant">Pour devenir vendeur, vous devez [[MARKETPLACE_CREATE_STORE_URL] créer une boutique sur la Place du marché].</string> - <string name="InventoryOutboxNoItemsTitle">Votre boîte d'envoi est vide.</string> + <string name="InventoryOutboxNotMerchant"> + Pour devenir vendeur, vous devez [[MARKETPLACE_CREATE_STORE_URL] créer une boutique sur la Place du marché]. + </string> + <string name="InventoryOutboxNoItemsTitle"> + Votre boîte d'envoi est vide. + </string> <string name="InventoryOutboxNoItemsTooltip"/> - <string name="InventoryOutboxNoItems">Pour mettre des dossiers en vente sur la [[MARKETPLACE_DASHBOARD_URL] Place du marché], faites-les glisser vers cette zone et cliquez sur "Envoyer vers la Place du marché".</string> - <string name="InventoryOutboxInitializingTitle">Initialisation de la Place du marché...</string> - <string name="InventoryOutboxInitializing">Nous sommes en train d'accéder à votre compte dans la [[MARKETPLACE_CREATE_STORE_URL] boutique de la Place du marché].</string> - <string name="InventoryOutboxErrorTitle">Erreurs de la Place du marché.</string> - <string name="InventoryOutboxError">La [[MARKETPLACE_CREATE_STORE_URL] boutique de la Place du marché] renvoie des erreurs.</string> - <string name="InventoryMarketplaceError">Une erreur est survenue lors de l’ouverture des annonces de la Place du marché. -Si vous continuez de recevoir ce message, contactez l’assistance Second Life à http://support.secondlife.com pour obtenir de l’aide.</string> - <string name="InventoryMarketplaceListingsNoItemsTitle">Votre dossier Annonces de la Place du marché est vide.</string> - <string name="InventoryMarketplaceListingsNoItems">Pour mettre des dossiers en vente sur la [[MARKETPLACE_DASHBOARD_URL] Place du marché], faites-les glisser vers cette zone.</string> - <string name="InventoryItemsCount">( [ITEMS_COUNT] Articles )</string> - <string name="Marketplace Validation Warning Stock">le dossier de stock doit être contenu dans un dossier de version</string> - <string name="Marketplace Validation Error Mixed Stock">: Erreur : tous les articles d'un dossier de stock doivent être non reproductibles et de même type</string> - <string name="Marketplace Validation Error Subfolder In Stock">: Erreur : un dossier de stock ne peut pas contenir de sous-dossiers</string> - <string name="Marketplace Validation Warning Empty">: Avertissement : le dossier ne contient aucun article</string> - <string name="Marketplace Validation Warning Create Stock">: Avertissement : création du dossier de stock</string> - <string name="Marketplace Validation Warning Create Version">: Avertissement : création du dossier de version</string> - <string name="Marketplace Validation Warning Move">: Avertissement : déplacement d'articles</string> - <string name="Marketplace Validation Warning Delete">: Avertissement : contenu du dossier transféré vers le dossier de stock, suppression du dossier vide</string> - <string name="Marketplace Validation Error Stock Item">: Erreur : les articles non reproductibles doivent être contenus dans un dossier de stock</string> - <string name="Marketplace Validation Warning Unwrapped Item">: Avertissement : les articles doivent être contenus dans un dossier de version</string> - <string name="Marketplace Validation Error">: Erreur :</string> - <string name="Marketplace Validation Warning">: Avertissement :</string> - <string name="Marketplace Validation Error Empty Version">: Avertissement : le dossier de version doit contenir au moins 1 article</string> - <string name="Marketplace Validation Error Empty Stock">: Avertissement : le dossier de stock doit contenir au moins 1 article</string> - <string name="Marketplace Validation No Error">Pas d'erreur ni d'avertissement à signaler</string> - <string name="Marketplace Error None">Aucune erreur</string> - <string name="Marketplace Error Prefix">Erreur :</string> - <string name="Marketplace Error Not Merchant">Avant d'envoyer des articles vers la Place du marché, vous devez vous configurer comme vendeur (gratuit).</string> - <string name="Marketplace Error Not Accepted">Impossible de déplacer l'article dans ce dossier.</string> - <string name="Marketplace Error Unsellable Item">Cet article ne peut pas être vendu sur la Place du marché.</string> - <string name="MarketplaceNoID">no Mkt ID</string> - <string name="MarketplaceLive">publié</string> - <string name="MarketplaceActive">actif</string> - <string name="MarketplaceMax">max.</string> - <string name="MarketplaceStock">stock</string> - <string name="MarketplaceNoStock">rupture de stock</string> - <string name="MarketplaceUpdating">mise à jour...</string> - <string name="UploadFeeInfo">Les frais dépendent de votre niveau d'abonnement. Les niveaux supérieurs sont soumis à des frais moins élevés. [https://secondlife.com/my/account/membership.php? En savoir plus]</string> - <string name="Open landmarks">Points de repère ouverts</string> - <string name="Unconstrained">Sans contrainte</string> + <string name="InventoryOutboxNoItems"> + Pour mettre des dossiers en vente sur la [[MARKETPLACE_DASHBOARD_URL] Place du marché], faites-les glisser vers cette zone et cliquez sur "Envoyer vers la Place du marché". + </string> + <string name="InventoryOutboxInitializingTitle"> + Initialisation de la Place du marché... + </string> + <string name="InventoryOutboxInitializing"> + Nous sommes en train d'accéder à votre compte dans la [[MARKETPLACE_CREATE_STORE_URL] boutique de la Place du marché]. + </string> + <string name="InventoryOutboxErrorTitle"> + Erreurs de la Place du marché. + </string> + <string name="InventoryOutboxError"> + La [[MARKETPLACE_CREATE_STORE_URL] boutique de la Place du marché] renvoie des erreurs. + </string> + <string name="InventoryMarketplaceError"> + Une erreur est survenue lors de l’ouverture des annonces de la Place du marché. +Si vous continuez de recevoir ce message, contactez l’assistance Second Life à http://support.secondlife.com pour obtenir de l’aide. + </string> + <string name="InventoryMarketplaceListingsNoItemsTitle"> + Votre dossier Annonces de la Place du marché est vide. + </string> + <string name="InventoryMarketplaceListingsNoItems"> + Pour mettre des dossiers en vente sur la [[MARKETPLACE_DASHBOARD_URL] Place du marché], faites-les glisser vers cette zone. + </string> + <string name="InventoryItemsCount"> + ( [ITEMS_COUNT] Articles ) + </string> + <string name="Marketplace Validation Warning Stock"> + le dossier de stock doit être contenu dans un dossier de version + </string> + <string name="Marketplace Validation Error Mixed Stock"> + : Erreur : tous les articles d'un dossier de stock doivent être non reproductibles et de même type + </string> + <string name="Marketplace Validation Error Subfolder In Stock"> + : Erreur : un dossier de stock ne peut pas contenir de sous-dossiers + </string> + <string name="Marketplace Validation Warning Empty"> + : Avertissement : le dossier ne contient aucun article + </string> + <string name="Marketplace Validation Warning Create Stock"> + : Avertissement : création du dossier de stock + </string> + <string name="Marketplace Validation Warning Create Version"> + : Avertissement : création du dossier de version + </string> + <string name="Marketplace Validation Warning Move"> + : Avertissement : déplacement d'articles + </string> + <string name="Marketplace Validation Warning Delete"> + : Avertissement : contenu du dossier transféré vers le dossier de stock, suppression du dossier vide + </string> + <string name="Marketplace Validation Error Stock Item"> + : Erreur : les articles non reproductibles doivent être contenus dans un dossier de stock + </string> + <string name="Marketplace Validation Warning Unwrapped Item"> + : Avertissement : les articles doivent être contenus dans un dossier de version + </string> + <string name="Marketplace Validation Error"> + : Erreur : + </string> + <string name="Marketplace Validation Warning"> + : Avertissement : + </string> + <string name="Marketplace Validation Error Empty Version"> + : Avertissement : le dossier de version doit contenir au moins 1 article + </string> + <string name="Marketplace Validation Error Empty Stock"> + : Avertissement : le dossier de stock doit contenir au moins 1 article + </string> + <string name="Marketplace Validation No Error"> + Pas d'erreur ni d'avertissement à signaler + </string> + <string name="Marketplace Error None"> + Aucune erreur + </string> + <string name="Marketplace Error Prefix"> + Erreur : + </string> + <string name="Marketplace Error Not Merchant"> + Avant d'envoyer des articles vers la Place du marché, vous devez vous configurer comme vendeur (gratuit). + </string> + <string name="Marketplace Error Not Accepted"> + Impossible de déplacer l'article dans ce dossier. + </string> + <string name="Marketplace Error Unsellable Item"> + Cet article ne peut pas être vendu sur la Place du marché. + </string> + <string name="MarketplaceNoID"> + no Mkt ID + </string> + <string name="MarketplaceLive"> + publié + </string> + <string name="MarketplaceActive"> + actif + </string> + <string name="MarketplaceMax"> + max. + </string> + <string name="MarketplaceStock"> + stock + </string> + <string name="MarketplaceNoStock"> + rupture de stock + </string> + <string name="MarketplaceUpdating"> + mise à jour... + </string> + <string name="UploadFeeInfo"> + Les frais dépendent de votre niveau d'abonnement. Les niveaux supérieurs sont soumis à des frais moins élevés. [https://secondlife.com/my/account/membership.php? En savoir plus] + </string> + <string name="Open landmarks"> + Points de repère ouverts + </string> + <string name="Unconstrained"> + Sans contrainte + </string> <string name="no_transfer" value=" (pas de transfert)"/> <string name="no_modify" value=" (pas de modification)"/> <string name="no_copy" value=" (pas de copie)"/> <string name="worn" value=" (porté)"/> <string name="link" value=" (lien)"/> <string name="broken_link" value=" (broken_link)"/> - <string name="LoadingContents">chargement des contenus en cours...</string> - <string name="NoContents">Aucun contenu</string> + <string name="LoadingContents"> + chargement des contenus en cours... + </string> + <string name="NoContents"> + Aucun contenu + </string> <string name="WornOnAttachmentPoint" value=" (porté sur [ATTACHMENT_POINT])"/> <string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/> <string name="ActiveGesture" value="[GESLABEL] (actif)"/> - <string name="PermYes">Oui</string> - <string name="PermNo">Non</string> + <string name="PermYes"> + Oui + </string> + <string name="PermNo"> + Non + </string> <string name="Chat Message" value="Chat :"/> <string name="Sound" value=" Son :"/> <string name="Wait" value=" --- Attendre :"/> @@ -638,1439 +1705,4215 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life à <string name="Snapshots" value=" Photos,"/> <string name="No Filters" value="Non "/> <string name="Since Logoff" value="depuis la déconnexion"/> - <string name="InvFolder My Inventory">Mon inventaire</string> - <string name="InvFolder Library">Bibliothèque</string> - <string name="InvFolder Textures">Textures</string> - <string name="InvFolder Sounds">Sons</string> - <string name="InvFolder Calling Cards">Cartes de visite</string> - <string name="InvFolder Landmarks">Repères</string> - <string name="InvFolder Scripts">Scripts</string> - <string name="InvFolder Clothing">Habits</string> - <string name="InvFolder Objects">Objets</string> - <string name="InvFolder Notecards">Notes</string> - <string name="InvFolder New Folder">Nouveau dossier</string> - <string name="InvFolder Inventory">Inventaire</string> - <string name="InvFolder Uncompressed Images">Images non compressées</string> - <string name="InvFolder Body Parts">Parties du corps</string> - <string name="InvFolder Trash">Corbeille</string> - <string name="InvFolder Photo Album">Albums photo</string> - <string name="InvFolder Lost And Found">Objets trouvés</string> - <string name="InvFolder Uncompressed Sounds">Sons non compressés</string> - <string name="InvFolder Animations">Animations</string> - <string name="InvFolder Gestures">Gestes</string> - <string name="InvFolder Favorite">Mes Favoris</string> - <string name="InvFolder favorite">Mes Favoris</string> - <string name="InvFolder Favorites">Mes favoris</string> - <string name="InvFolder favorites">Mes favoris</string> - <string name="InvFolder Current Outfit">Tenue actuelle</string> - <string name="InvFolder Initial Outfits">Tenues initiales</string> - <string name="InvFolder My Outfits">Mes tenues</string> - <string name="InvFolder Accessories">Accessoires</string> - <string name="InvFolder Meshes">Maillages</string> - <string name="InvFolder Received Items">Articles reçus</string> - <string name="InvFolder Merchant Outbox">Boîte d'envoi vendeur</string> - <string name="InvFolder Friends">Amis</string> - <string name="InvFolder All">Tout</string> - <string name="no_attachments">Aucun élément attaché porté</string> - <string name="Attachments remain">Éléments attachés ([COUNT] emplacements restants)</string> - <string name="Buy">Acheter</string> - <string name="BuyforL$">Acheter des L$</string> - <string name="Stone">Pierre</string> - <string name="Metal">Métal</string> - <string name="Glass">Verre</string> - <string name="Wood">Bois</string> - <string name="Flesh">Chair</string> - <string name="Plastic">Plastique</string> - <string name="Rubber">Caoutchouc</string> - <string name="Light">Léger</string> - <string name="KBShift">Maj-</string> - <string name="KBCtrl">Ctrl</string> - <string name="Chest">Poitrine</string> - <string name="Skull">Crâne</string> - <string name="Left Shoulder">Épaule gauche</string> - <string name="Right Shoulder">Épaule droite</string> - <string name="Left Hand">Main gauche</string> - <string name="Right Hand">Main droite</string> - <string name="Left Foot">Pied gauche</string> - <string name="Right Foot">Pied droit</string> - <string name="Spine">Colonne</string> - <string name="Pelvis">Bassin</string> - <string name="Mouth">Bouche</string> - <string name="Chin">Menton</string> - <string name="Left Ear">Oreille gauche</string> - <string name="Right Ear">Oreille droite</string> - <string name="Left Eyeball">Globe oculaire gauche</string> - <string name="Right Eyeball">Globe oculaire droit</string> - <string name="Nose">Nez</string> - <string name="R Upper Arm">Bras D</string> - <string name="R Forearm">Avant-bras D</string> - <string name="L Upper Arm">Bras G</string> - <string name="L Forearm">Avant-bras G</string> - <string name="Right Hip">Hanche droite</string> - <string name="R Upper Leg">Cuisse D</string> - <string name="R Lower Leg">Jambe D</string> - <string name="Left Hip">Hanche gauche</string> - <string name="L Upper Leg">Cuisse G</string> - <string name="L Lower Leg">Jambe G</string> - <string name="Stomach">Estomac</string> - <string name="Left Pec">Pectoral gauche</string> - <string name="Right Pec">Pectoral droit</string> - <string name="Neck">Cou</string> - <string name="Avatar Center">Centre de l'avatar</string> - <string name="Left Ring Finger">Annulaire gauche</string> - <string name="Right Ring Finger">Annulaire droit</string> - <string name="Tail Base">Base de la queue</string> - <string name="Tail Tip">Bout de la queue</string> - <string name="Left Wing">Aile gauche</string> - <string name="Right Wing">Aile droite</string> - <string name="Jaw">Mâchoire</string> - <string name="Alt Left Ear">Oreille gauche différente</string> - <string name="Alt Right Ear">Oreille droite différente</string> - <string name="Alt Left Eye">Å’il gauche différent</string> - <string name="Alt Right Eye">Å’il droit différent</string> - <string name="Tongue">Langue</string> - <string name="Groin">Aine</string> - <string name="Left Hind Foot">Pied arrière gauche</string> - <string name="Right Hind Foot">Pied arrière droit</string> - <string name="Invalid Attachment">Point d'attache non valide</string> - <string name="ATTACHMENT_MISSING_ITEM">Erreur : article manquant</string> - <string name="ATTACHMENT_MISSING_BASE_ITEM">Erreur : article de base manquant</string> - <string name="ATTACHMENT_NOT_ATTACHED">Erreur : l'objet est dans une tenue actuelle, mais il n'est pas attaché</string> - <string name="YearsMonthsOld">[AGEYEARS] [AGEMONTHS]</string> - <string name="YearsOld">[AGEYEARS]</string> - <string name="MonthsOld">[AGEMONTHS]</string> - <string name="WeeksOld">[AGEWEEKS]</string> - <string name="DaysOld">[AGEDAYS]</string> - <string name="TodayOld">Inscrit aujourd'hui</string> - <string name="av_render_everyone_now">Désormais, tout le monde peut vous voir.</string> - <string name="av_render_not_everyone">Vous risquez de ne pas être rendu par tous les gens qui vous entourent.</string> - <string name="av_render_over_half">Vous risquez de ne pas être rendu par plus de la moitié des gens qui vous entourent.</string> - <string name="av_render_most_of">Vous risquez de ne pas être rendu par la plupart des gens qui vous entourent.</string> - <string name="av_render_anyone">Vous risquez de n’être rendu par aucune des personnes qui vous entourent.</string> - <string name="hud_description_total">Votre HUD</string> - <string name="hud_name_with_joint">[OBJ_NAME] (porté sur [JNT_NAME])</string> - <string name="hud_render_memory_warning">[HUD_DETAILS] utilise beaucoup de mémoire textures</string> - <string name="hud_render_cost_warning">[HUD_DETAILS] contient beaucoup de textures et d’objets volumineux</string> - <string name="hud_render_heavy_textures_warning">[HUD_DETAILS] contient beaucoup de textures volumineuses</string> - <string name="hud_render_cramped_warning">[HUD_DETAILS] contient trop d’objets</string> - <string name="hud_render_textures_warning">[HUD_DETAILS] contient trop de textures</string> - <string name="AgeYearsA">[COUNT] an</string> - <string name="AgeYearsB">[COUNT] ans</string> - <string name="AgeYearsC">[COUNT] ans</string> - <string name="AgeMonthsA">[COUNT] mois</string> - <string name="AgeMonthsB">[COUNT] mois</string> - <string name="AgeMonthsC">[COUNT] mois</string> - <string name="AgeWeeksA">[COUNT] semaine</string> - <string name="AgeWeeksB">[COUNT] semaines</string> - <string name="AgeWeeksC">[COUNT] semaines</string> - <string name="AgeDaysA">[COUNT] jour</string> - <string name="AgeDaysB">[COUNT] jours</string> - <string name="AgeDaysC">[COUNT] jours</string> - <string name="GroupMembersA">[COUNT] membre</string> - <string name="GroupMembersB">[COUNT] membres</string> - <string name="GroupMembersC">[COUNT] membres</string> - <string name="AcctTypeResident">Résident</string> - <string name="AcctTypeTrial">Essai</string> - <string name="AcctTypeCharterMember">Membre originaire</string> - <string name="AcctTypeEmployee">Employé(e) de Linden Lab</string> - <string name="PaymentInfoUsed">Infos de paiement utilisées</string> - <string name="PaymentInfoOnFile">Infos de paiement enregistrées</string> - <string name="NoPaymentInfoOnFile">Aucune info de paiement enregistrée</string> - <string name="AgeVerified">Personne dont l'âge a été vérifié</string> - <string name="NotAgeVerified">Personne dont l'âge n'a pas été vérifié</string> - <string name="Center 2">Centre 2</string> - <string name="Top Right">En haut à droite</string> - <string name="Top">En haut</string> - <string name="Top Left">En haut à gauche</string> - <string name="Center">Centre</string> - <string name="Bottom Left">En bas à gauche</string> - <string name="Bottom">Bas</string> - <string name="Bottom Right">En bas à droite</string> - <string name="CompileQueueDownloadedCompiling">Téléchargé, compilation en cours</string> - <string name="CompileQueueServiceUnavailable">Service de compilation de script indisponible.</string> - <string name="CompileQueueScriptNotFound">Script introuvable sur le serveur.</string> - <string name="CompileQueueProblemDownloading">Problème lors du téléchargement</string> - <string name="CompileQueueInsufficientPermDownload">Droits insuffisants pour télécharger un script.</string> - <string name="CompileQueueInsufficientPermFor">Droits insuffisants pour</string> - <string name="CompileQueueUnknownFailure">Échec du téléchargement, erreur inconnue</string> - <string name="CompileNoExperiencePerm">En train d’ignorer le script [SCRIPT] avec l’expérience [EXPERIENCE].</string> - <string name="CompileQueueTitle">Recompilation - progrès</string> - <string name="CompileQueueStart">recompiler</string> - <string name="ResetQueueTitle">Réinitialiser les progrès</string> - <string name="ResetQueueStart">réinitialiser</string> - <string name="RunQueueTitle">Lancer</string> - <string name="RunQueueStart">lancer</string> - <string name="NotRunQueueTitle">Arrêter</string> - <string name="NotRunQueueStart">arrêter</string> - <string name="CompileSuccessful">Compilation réussie !</string> - <string name="CompileSuccessfulSaving">Compilation réussie, enregistrement en cours...</string> - <string name="SaveComplete">Enregistrement terminé.</string> - <string name="UploadFailed">Échec du chargement de fichier :</string> - <string name="ObjectOutOfRange">Script (objet hors de portée)</string> - <string name="ScriptWasDeleted">Script (supprimé de l’inventaire)</string> - <string name="GodToolsObjectOwnedBy">Objet [OBJECT] appartenant à [OWNER]</string> - <string name="GroupsNone">aucun</string> + <string name="InvFolder My Inventory"> + Mon inventaire + </string> + <string name="InvFolder Library"> + Bibliothèque + </string> + <string name="InvFolder Textures"> + Textures + </string> + <string name="InvFolder Sounds"> + Sons + </string> + <string name="InvFolder Calling Cards"> + Cartes de visite + </string> + <string name="InvFolder Landmarks"> + Repères + </string> + <string name="InvFolder Scripts"> + Scripts + </string> + <string name="InvFolder Clothing"> + Habits + </string> + <string name="InvFolder Objects"> + Objets + </string> + <string name="InvFolder Notecards"> + Notes + </string> + <string name="InvFolder New Folder"> + Nouveau dossier + </string> + <string name="InvFolder Inventory"> + Inventaire + </string> + <string name="InvFolder Uncompressed Images"> + Images non compressées + </string> + <string name="InvFolder Body Parts"> + Parties du corps + </string> + <string name="InvFolder Trash"> + Corbeille + </string> + <string name="InvFolder Photo Album"> + Albums photo + </string> + <string name="InvFolder Lost And Found"> + Objets trouvés + </string> + <string name="InvFolder Uncompressed Sounds"> + Sons non compressés + </string> + <string name="InvFolder Animations"> + Animations + </string> + <string name="InvFolder Gestures"> + Gestes + </string> + <string name="InvFolder Favorite"> + Mes Favoris + </string> + <string name="InvFolder favorite"> + Mes Favoris + </string> + <string name="InvFolder Favorites"> + Mes favoris + </string> + <string name="InvFolder favorites"> + Mes favoris + </string> + <string name="InvFolder Current Outfit"> + Tenue actuelle + </string> + <string name="InvFolder Initial Outfits"> + Tenues initiales + </string> + <string name="InvFolder My Outfits"> + Mes tenues + </string> + <string name="InvFolder Accessories"> + Accessoires + </string> + <string name="InvFolder Meshes"> + Maillages + </string> + <string name="InvFolder Received Items"> + Articles reçus + </string> + <string name="InvFolder Merchant Outbox"> + Boîte d'envoi vendeur + </string> + <string name="InvFolder Friends"> + Amis + </string> + <string name="InvFolder All"> + Tout + </string> + <string name="no_attachments"> + Aucun élément attaché porté + </string> + <string name="Attachments remain"> + Éléments attachés ([COUNT] emplacements restants) + </string> + <string name="Buy"> + Acheter + </string> + <string name="BuyforL$"> + Acheter des L$ + </string> + <string name="Stone"> + Pierre + </string> + <string name="Metal"> + Métal + </string> + <string name="Glass"> + Verre + </string> + <string name="Wood"> + Bois + </string> + <string name="Flesh"> + Chair + </string> + <string name="Plastic"> + Plastique + </string> + <string name="Rubber"> + Caoutchouc + </string> + <string name="Light"> + Léger + </string> + <string name="KBShift"> + Maj- + </string> + <string name="KBCtrl"> + Ctrl + </string> + <string name="Chest"> + Poitrine + </string> + <string name="Skull"> + Crâne + </string> + <string name="Left Shoulder"> + Épaule gauche + </string> + <string name="Right Shoulder"> + Épaule droite + </string> + <string name="Left Hand"> + Main gauche + </string> + <string name="Right Hand"> + Main droite + </string> + <string name="Left Foot"> + Pied gauche + </string> + <string name="Right Foot"> + Pied droit + </string> + <string name="Spine"> + Colonne + </string> + <string name="Pelvis"> + Bassin + </string> + <string name="Mouth"> + Bouche + </string> + <string name="Chin"> + Menton + </string> + <string name="Left Ear"> + Oreille gauche + </string> + <string name="Right Ear"> + Oreille droite + </string> + <string name="Left Eyeball"> + Globe oculaire gauche + </string> + <string name="Right Eyeball"> + Globe oculaire droit + </string> + <string name="Nose"> + Nez + </string> + <string name="R Upper Arm"> + Bras D + </string> + <string name="R Forearm"> + Avant-bras D + </string> + <string name="L Upper Arm"> + Bras G + </string> + <string name="L Forearm"> + Avant-bras G + </string> + <string name="Right Hip"> + Hanche droite + </string> + <string name="R Upper Leg"> + Cuisse D + </string> + <string name="R Lower Leg"> + Jambe D + </string> + <string name="Left Hip"> + Hanche gauche + </string> + <string name="L Upper Leg"> + Cuisse G + </string> + <string name="L Lower Leg"> + Jambe G + </string> + <string name="Stomach"> + Estomac + </string> + <string name="Left Pec"> + Pectoral gauche + </string> + <string name="Right Pec"> + Pectoral droit + </string> + <string name="Neck"> + Cou + </string> + <string name="Avatar Center"> + Centre de l'avatar + </string> + <string name="Left Ring Finger"> + Annulaire gauche + </string> + <string name="Right Ring Finger"> + Annulaire droit + </string> + <string name="Tail Base"> + Base de la queue + </string> + <string name="Tail Tip"> + Bout de la queue + </string> + <string name="Left Wing"> + Aile gauche + </string> + <string name="Right Wing"> + Aile droite + </string> + <string name="Jaw"> + Mâchoire + </string> + <string name="Alt Left Ear"> + Oreille gauche différente + </string> + <string name="Alt Right Ear"> + Oreille droite différente + </string> + <string name="Alt Left Eye"> + Å’il gauche différent + </string> + <string name="Alt Right Eye"> + Å’il droit différent + </string> + <string name="Tongue"> + Langue + </string> + <string name="Groin"> + Aine + </string> + <string name="Left Hind Foot"> + Pied arrière gauche + </string> + <string name="Right Hind Foot"> + Pied arrière droit + </string> + <string name="Invalid Attachment"> + Point d'attache non valide + </string> + <string name="ATTACHMENT_MISSING_ITEM"> + Erreur : article manquant + </string> + <string name="ATTACHMENT_MISSING_BASE_ITEM"> + Erreur : article de base manquant + </string> + <string name="ATTACHMENT_NOT_ATTACHED"> + Erreur : l'objet est dans une tenue actuelle, mais il n'est pas attaché + </string> + <string name="YearsMonthsOld"> + [AGEYEARS] [AGEMONTHS] + </string> + <string name="YearsOld"> + [AGEYEARS] + </string> + <string name="MonthsOld"> + [AGEMONTHS] + </string> + <string name="WeeksOld"> + [AGEWEEKS] + </string> + <string name="DaysOld"> + [AGEDAYS] + </string> + <string name="TodayOld"> + Inscrit aujourd'hui + </string> + <string name="av_render_everyone_now"> + Désormais, tout le monde peut vous voir. + </string> + <string name="av_render_not_everyone"> + Vous risquez de ne pas être rendu par tous les gens qui vous entourent. + </string> + <string name="av_render_over_half"> + Vous risquez de ne pas être rendu par plus de la moitié des gens qui vous entourent. + </string> + <string name="av_render_most_of"> + Vous risquez de ne pas être rendu par la plupart des gens qui vous entourent. + </string> + <string name="av_render_anyone"> + Vous risquez de n’être rendu par aucune des personnes qui vous entourent. + </string> + <string name="hud_description_total"> + Votre HUD + </string> + <string name="hud_name_with_joint"> + [OBJ_NAME] (porté sur [JNT_NAME]) + </string> + <string name="hud_render_memory_warning"> + [HUD_DETAILS] utilise beaucoup de mémoire textures + </string> + <string name="hud_render_cost_warning"> + [HUD_DETAILS] contient beaucoup de textures et d’objets volumineux + </string> + <string name="hud_render_heavy_textures_warning"> + [HUD_DETAILS] contient beaucoup de textures volumineuses + </string> + <string name="hud_render_cramped_warning"> + [HUD_DETAILS] contient trop d’objets + </string> + <string name="hud_render_textures_warning"> + [HUD_DETAILS] contient trop de textures + </string> + <string name="AgeYearsA"> + [COUNT] an + </string> + <string name="AgeYearsB"> + [COUNT] ans + </string> + <string name="AgeYearsC"> + [COUNT] ans + </string> + <string name="AgeMonthsA"> + [COUNT] mois + </string> + <string name="AgeMonthsB"> + [COUNT] mois + </string> + <string name="AgeMonthsC"> + [COUNT] mois + </string> + <string name="AgeWeeksA"> + [COUNT] semaine + </string> + <string name="AgeWeeksB"> + [COUNT] semaines + </string> + <string name="AgeWeeksC"> + [COUNT] semaines + </string> + <string name="AgeDaysA"> + [COUNT] jour + </string> + <string name="AgeDaysB"> + [COUNT] jours + </string> + <string name="AgeDaysC"> + [COUNT] jours + </string> + <string name="GroupMembersA"> + [COUNT] membre + </string> + <string name="GroupMembersB"> + [COUNT] membres + </string> + <string name="GroupMembersC"> + [COUNT] membres + </string> + <string name="AcctTypeResident"> + Résident + </string> + <string name="AcctTypeTrial"> + Essai + </string> + <string name="AcctTypeCharterMember"> + Membre originaire + </string> + <string name="AcctTypeEmployee"> + Employé(e) de Linden Lab + </string> + <string name="PaymentInfoUsed"> + Infos de paiement utilisées + </string> + <string name="PaymentInfoOnFile"> + Infos de paiement enregistrées + </string> + <string name="NoPaymentInfoOnFile"> + Aucune info de paiement enregistrée + </string> + <string name="AgeVerified"> + Personne dont l'âge a été vérifié + </string> + <string name="NotAgeVerified"> + Personne dont l'âge n'a pas été vérifié + </string> + <string name="Center 2"> + Centre 2 + </string> + <string name="Top Right"> + En haut à droite + </string> + <string name="Top"> + En haut + </string> + <string name="Top Left"> + En haut à gauche + </string> + <string name="Center"> + Centre + </string> + <string name="Bottom Left"> + En bas à gauche + </string> + <string name="Bottom"> + Bas + </string> + <string name="Bottom Right"> + En bas à droite + </string> + <string name="CompileQueueDownloadedCompiling"> + Téléchargé, compilation en cours + </string> + <string name="CompileQueueServiceUnavailable"> + Service de compilation de script indisponible. + </string> + <string name="CompileQueueScriptNotFound"> + Script introuvable sur le serveur. + </string> + <string name="CompileQueueProblemDownloading"> + Problème lors du téléchargement + </string> + <string name="CompileQueueInsufficientPermDownload"> + Droits insuffisants pour télécharger un script. + </string> + <string name="CompileQueueInsufficientPermFor"> + Droits insuffisants pour + </string> + <string name="CompileQueueUnknownFailure"> + Échec du téléchargement, erreur inconnue + </string> + <string name="CompileNoExperiencePerm"> + En train d’ignorer le script [SCRIPT] avec l’expérience [EXPERIENCE]. + </string> + <string name="CompileQueueTitle"> + Recompilation - progrès + </string> + <string name="CompileQueueStart"> + recompiler + </string> + <string name="ResetQueueTitle"> + Réinitialiser les progrès + </string> + <string name="ResetQueueStart"> + réinitialiser + </string> + <string name="RunQueueTitle"> + Lancer + </string> + <string name="RunQueueStart"> + lancer + </string> + <string name="NotRunQueueTitle"> + Arrêter + </string> + <string name="NotRunQueueStart"> + arrêter + </string> + <string name="CompileSuccessful"> + Compilation réussie ! + </string> + <string name="CompileSuccessfulSaving"> + Compilation réussie, enregistrement en cours... + </string> + <string name="SaveComplete"> + Enregistrement terminé. + </string> + <string name="UploadFailed"> + Échec du chargement de fichier : + </string> + <string name="ObjectOutOfRange"> + Script (objet hors de portée) + </string> + <string name="ScriptWasDeleted"> + Script (supprimé de l’inventaire) + </string> + <string name="GodToolsObjectOwnedBy"> + Objet [OBJECT] appartenant à [OWNER] + </string> + <string name="GroupsNone"> + aucun + </string> <string name="Group" value=" (groupe)"/> - <string name="Unknown">(Inconnu)</string> + <string name="Unknown"> + (Inconnu) + </string> <string name="SummaryForTheWeek" value="Récapitulatif de la semaine, début le "/> <string name="NextStipendDay" value=". Prochaine prime le "/> - <string name="GroupPlanningDate">[day,datetime,utc]/[mthnum,datetime,utc]/[year,datetime,utc]</string> + <string name="GroupPlanningDate"> + [day,datetime,utc]/[mthnum,datetime,utc]/[year,datetime,utc] + </string> <string name="GroupIndividualShare" value=" Groupe Part individuelle"/> <string name="GroupColumn" value="Groupe"/> - <string name="Balance">Solde</string> - <string name="Credits">Crédits</string> - <string name="Debits">Débits</string> - <string name="Total">Total</string> - <string name="NoGroupDataFound">Aucune donnée trouvée pour le groupe</string> - <string name="IMParentEstate">domaine parent</string> - <string name="IMMainland">continent</string> - <string name="IMTeen">teen</string> - <string name="Anyone">n'importe qui</string> - <string name="RegionInfoError">erreur</string> - <string name="RegionInfoAllEstatesOwnedBy">tous les domaines appartenant à [OWNER]</string> - <string name="RegionInfoAllEstatesYouOwn">tous les domaines vous appartenant</string> - <string name="RegionInfoAllEstatesYouManage">tous les domaines que vous gérez pour [OWNER]</string> - <string name="RegionInfoAllowedResidents">Toujours autorisé : ([ALLOWEDAGENTS], max [MAXACCESS])</string> - <string name="RegionInfoAllowedGroups">Groupes toujours autorisés : [ALLOWEDGROUPS], max [MAXACCESS])</string> - <string name="RegionInfoBannedResidents">Toujours interdits : ([BANNEDAGENTS], max. [MAXBANNED])</string> - <string name="RegionInfoListTypeAllowedAgents">Toujours autorisé</string> - <string name="RegionInfoListTypeBannedAgents">Toujours interdit</string> - <string name="RegionInfoAllEstates">tous les domaines</string> - <string name="RegionInfoManagedEstates">domaines gérés</string> - <string name="RegionInfoThisEstate">ce domaine</string> - <string name="AndNMore">et [EXTRA_COUNT] plus</string> - <string name="ScriptLimitsParcelScriptMemory">Mémoire des scripts de parcelles</string> - <string name="ScriptLimitsParcelsOwned">Parcelles répertoriées : [PARCELS]</string> - <string name="ScriptLimitsMemoryUsed">Mémoire utilisée : [COUNT] Ko sur [MAX] ; [AVAILABLE] Ko disponibles</string> - <string name="ScriptLimitsMemoryUsedSimple">Mémoire utilisée : [COUNT] Ko</string> - <string name="ScriptLimitsParcelScriptURLs">URL des scripts de parcelles</string> - <string name="ScriptLimitsURLsUsed">URL utilisées : [COUNT] sur [MAX] ; [AVAILABLE] disponible(s)</string> - <string name="ScriptLimitsURLsUsedSimple">URL utilisées : [COUNT]</string> - <string name="ScriptLimitsRequestError">Une erreur est survenue pendant la requête d'informations.</string> - <string name="ScriptLimitsRequestNoParcelSelected">Aucune parcelle sélectionnée</string> - <string name="ScriptLimitsRequestWrongRegion">Erreur : les informations de script ne sont disponibles que dans votre région actuelle.</string> - <string name="ScriptLimitsRequestWaiting">Extraction des informations en cours...</string> - <string name="ScriptLimitsRequestDontOwnParcel">Vous n'avez pas le droit d'examiner cette parcelle.</string> - <string name="SITTING_ON">Assis(e) dessus</string> - <string name="ATTACH_CHEST">Poitrine</string> - <string name="ATTACH_HEAD">Crâne</string> - <string name="ATTACH_LSHOULDER">Épaule gauche</string> - <string name="ATTACH_RSHOULDER">Épaule droite</string> - <string name="ATTACH_LHAND">Main gauche</string> - <string name="ATTACH_RHAND">Main droite</string> - <string name="ATTACH_LFOOT">Pied gauche</string> - <string name="ATTACH_RFOOT">Pied droit</string> - <string name="ATTACH_BACK">Colonne vertébrale</string> - <string name="ATTACH_PELVIS">Bassin</string> - <string name="ATTACH_MOUTH">Bouche</string> - <string name="ATTACH_CHIN">Menton</string> - <string name="ATTACH_LEAR">Oreille gauche</string> - <string name="ATTACH_REAR">Oreille droite</string> - <string name="ATTACH_LEYE">Å’il gauche</string> - <string name="ATTACH_REYE">Å’il droit</string> - <string name="ATTACH_NOSE">Nez</string> - <string name="ATTACH_RUARM">Bras droit</string> - <string name="ATTACH_RLARM">Avant-bras droit</string> - <string name="ATTACH_LUARM">Bras gauche</string> - <string name="ATTACH_LLARM">Avant-bras gauche</string> - <string name="ATTACH_RHIP">Hanche droite</string> - <string name="ATTACH_RULEG">Cuisse droite</string> - <string name="ATTACH_RLLEG">Jambe droite</string> - <string name="ATTACH_LHIP">Hanche gauche</string> - <string name="ATTACH_LULEG">Cuisse gauche</string> - <string name="ATTACH_LLLEG">Jambe gauche</string> - <string name="ATTACH_BELLY">Estomac</string> - <string name="ATTACH_LEFT_PEC">Pectoral gauche</string> - <string name="ATTACH_RIGHT_PEC">Pectoral droit</string> - <string name="ATTACH_HUD_CENTER_2">HUD centre 2</string> - <string name="ATTACH_HUD_TOP_RIGHT">HUD en haut à droite</string> - <string name="ATTACH_HUD_TOP_CENTER">HUD en haut au centre</string> - <string name="ATTACH_HUD_TOP_LEFT">HUD en haut à gauche</string> - <string name="ATTACH_HUD_CENTER_1">HUD centre 1</string> - <string name="ATTACH_HUD_BOTTOM_LEFT">HUD en bas à gauche</string> - <string name="ATTACH_HUD_BOTTOM">HUD en bas</string> - <string name="ATTACH_HUD_BOTTOM_RIGHT">HUD en bas à droite</string> - <string name="ATTACH_NECK">Cou</string> - <string name="ATTACH_AVATAR_CENTER">Centre de l'avatar</string> - <string name="ATTACH_LHAND_RING1">Annulaire gauche</string> - <string name="ATTACH_RHAND_RING1">Annulaire droit</string> - <string name="ATTACH_TAIL_BASE">Base de la queue</string> - <string name="ATTACH_TAIL_TIP">Bout de la queue</string> - <string name="ATTACH_LWING">Aile gauche</string> - <string name="ATTACH_RWING">Aile droite</string> - <string name="ATTACH_FACE_JAW">Mâchoire</string> - <string name="ATTACH_FACE_LEAR">Oreille gauche différente</string> - <string name="ATTACH_FACE_REAR">Oreille droite différente</string> - <string name="ATTACH_FACE_LEYE">Å’il gauche différent</string> - <string name="ATTACH_FACE_REYE">Å’il droit différent</string> - <string name="ATTACH_FACE_TONGUE">Langue</string> - <string name="ATTACH_GROIN">Aine</string> - <string name="ATTACH_HIND_LFOOT">Pied arrière gauche</string> - <string name="ATTACH_HIND_RFOOT">Pied arrière droit</string> - <string name="CursorPos">Ligne [LINE], colonne [COLUMN]</string> - <string name="PanelDirCountFound">[COUNT] trouvé(s)</string> - <string name="PanelDirTimeStr">[hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt]</string> - <string name="PanelDirEventsDateText">[mthnum,datetime,slt]/[day,datetime,slt]</string> - <string name="PanelContentsTooltip">Contenu de l'objet</string> - <string name="PanelContentsNewScript">Nouveau script</string> - <string name="DoNotDisturbModeResponseDefault">Ce résident a activé Ne pas déranger et verra votre message plus tard.</string> - <string name="MuteByName">(par nom)</string> - <string name="MuteAgent">(résident)</string> - <string name="MuteObject">(objet)</string> - <string name="MuteGroup">(groupe)</string> - <string name="MuteExternal">(externe)</string> - <string name="RegionNoCovenant">Il n'y a aucun règlement pour ce domaine.</string> - <string name="RegionNoCovenantOtherOwner">Il n'y a aucun règlement pour ce domaine. Le terrain sur ce domaine est vendu par le propriétaire, non par Linden Lab. Pour en savoir plus, veuillez contacter le propriétaire.</string> + <string name="Balance"> + Solde + </string> + <string name="Credits"> + Crédits + </string> + <string name="Debits"> + Débits + </string> + <string name="Total"> + Total + </string> + <string name="NoGroupDataFound"> + Aucune donnée trouvée pour le groupe + </string> + <string name="IMParentEstate"> + domaine parent + </string> + <string name="IMMainland"> + continent + </string> + <string name="IMTeen"> + teen + </string> + <string name="Anyone"> + n'importe qui + </string> + <string name="RegionInfoError"> + erreur + </string> + <string name="RegionInfoAllEstatesOwnedBy"> + tous les domaines appartenant à [OWNER] + </string> + <string name="RegionInfoAllEstatesYouOwn"> + tous les domaines vous appartenant + </string> + <string name="RegionInfoAllEstatesYouManage"> + tous les domaines que vous gérez pour [OWNER] + </string> + <string name="RegionInfoAllowedResidents"> + Toujours autorisé : ([ALLOWEDAGENTS], max [MAXACCESS]) + </string> + <string name="RegionInfoAllowedGroups"> + Groupes toujours autorisés : [ALLOWEDGROUPS], max [MAXACCESS]) + </string> + <string name="RegionInfoBannedResidents"> + Toujours interdits : ([BANNEDAGENTS], max. [MAXBANNED]) + </string> + <string name="RegionInfoListTypeAllowedAgents"> + Toujours autorisé + </string> + <string name="RegionInfoListTypeBannedAgents"> + Toujours interdit + </string> + <string name="RegionInfoAllEstates"> + tous les domaines + </string> + <string name="RegionInfoManagedEstates"> + domaines gérés + </string> + <string name="RegionInfoThisEstate"> + ce domaine + </string> + <string name="AndNMore"> + et [EXTRA_COUNT] plus + </string> + <string name="ScriptLimitsParcelScriptMemory"> + Mémoire des scripts de parcelles + </string> + <string name="ScriptLimitsParcelsOwned"> + Parcelles répertoriées : [PARCELS] + </string> + <string name="ScriptLimitsMemoryUsed"> + Mémoire utilisée : [COUNT] Ko sur [MAX] ; [AVAILABLE] Ko disponibles + </string> + <string name="ScriptLimitsMemoryUsedSimple"> + Mémoire utilisée : [COUNT] Ko + </string> + <string name="ScriptLimitsParcelScriptURLs"> + URL des scripts de parcelles + </string> + <string name="ScriptLimitsURLsUsed"> + URL utilisées : [COUNT] sur [MAX] ; [AVAILABLE] disponible(s) + </string> + <string name="ScriptLimitsURLsUsedSimple"> + URL utilisées : [COUNT] + </string> + <string name="ScriptLimitsRequestError"> + Une erreur est survenue pendant la requête d'informations. + </string> + <string name="ScriptLimitsRequestNoParcelSelected"> + Aucune parcelle sélectionnée + </string> + <string name="ScriptLimitsRequestWrongRegion"> + Erreur : les informations de script ne sont disponibles que dans votre région actuelle. + </string> + <string name="ScriptLimitsRequestWaiting"> + Extraction des informations en cours... + </string> + <string name="ScriptLimitsRequestDontOwnParcel"> + Vous n'avez pas le droit d'examiner cette parcelle. + </string> + <string name="SITTING_ON"> + Assis(e) dessus + </string> + <string name="ATTACH_CHEST"> + Poitrine + </string> + <string name="ATTACH_HEAD"> + Crâne + </string> + <string name="ATTACH_LSHOULDER"> + Épaule gauche + </string> + <string name="ATTACH_RSHOULDER"> + Épaule droite + </string> + <string name="ATTACH_LHAND"> + Main gauche + </string> + <string name="ATTACH_RHAND"> + Main droite + </string> + <string name="ATTACH_LFOOT"> + Pied gauche + </string> + <string name="ATTACH_RFOOT"> + Pied droit + </string> + <string name="ATTACH_BACK"> + Colonne vertébrale + </string> + <string name="ATTACH_PELVIS"> + Bassin + </string> + <string name="ATTACH_MOUTH"> + Bouche + </string> + <string name="ATTACH_CHIN"> + Menton + </string> + <string name="ATTACH_LEAR"> + Oreille gauche + </string> + <string name="ATTACH_REAR"> + Oreille droite + </string> + <string name="ATTACH_LEYE"> + Å’il gauche + </string> + <string name="ATTACH_REYE"> + Å’il droit + </string> + <string name="ATTACH_NOSE"> + Nez + </string> + <string name="ATTACH_RUARM"> + Bras droit + </string> + <string name="ATTACH_RLARM"> + Avant-bras droit + </string> + <string name="ATTACH_LUARM"> + Bras gauche + </string> + <string name="ATTACH_LLARM"> + Avant-bras gauche + </string> + <string name="ATTACH_RHIP"> + Hanche droite + </string> + <string name="ATTACH_RULEG"> + Cuisse droite + </string> + <string name="ATTACH_RLLEG"> + Jambe droite + </string> + <string name="ATTACH_LHIP"> + Hanche gauche + </string> + <string name="ATTACH_LULEG"> + Cuisse gauche + </string> + <string name="ATTACH_LLLEG"> + Jambe gauche + </string> + <string name="ATTACH_BELLY"> + Estomac + </string> + <string name="ATTACH_LEFT_PEC"> + Pectoral gauche + </string> + <string name="ATTACH_RIGHT_PEC"> + Pectoral droit + </string> + <string name="ATTACH_HUD_CENTER_2"> + HUD centre 2 + </string> + <string name="ATTACH_HUD_TOP_RIGHT"> + HUD en haut à droite + </string> + <string name="ATTACH_HUD_TOP_CENTER"> + HUD en haut au centre + </string> + <string name="ATTACH_HUD_TOP_LEFT"> + HUD en haut à gauche + </string> + <string name="ATTACH_HUD_CENTER_1"> + HUD centre 1 + </string> + <string name="ATTACH_HUD_BOTTOM_LEFT"> + HUD en bas à gauche + </string> + <string name="ATTACH_HUD_BOTTOM"> + HUD en bas + </string> + <string name="ATTACH_HUD_BOTTOM_RIGHT"> + HUD en bas à droite + </string> + <string name="ATTACH_NECK"> + Cou + </string> + <string name="ATTACH_AVATAR_CENTER"> + Centre de l'avatar + </string> + <string name="ATTACH_LHAND_RING1"> + Annulaire gauche + </string> + <string name="ATTACH_RHAND_RING1"> + Annulaire droit + </string> + <string name="ATTACH_TAIL_BASE"> + Base de la queue + </string> + <string name="ATTACH_TAIL_TIP"> + Bout de la queue + </string> + <string name="ATTACH_LWING"> + Aile gauche + </string> + <string name="ATTACH_RWING"> + Aile droite + </string> + <string name="ATTACH_FACE_JAW"> + Mâchoire + </string> + <string name="ATTACH_FACE_LEAR"> + Oreille gauche différente + </string> + <string name="ATTACH_FACE_REAR"> + Oreille droite différente + </string> + <string name="ATTACH_FACE_LEYE"> + Å’il gauche différent + </string> + <string name="ATTACH_FACE_REYE"> + Å’il droit différent + </string> + <string name="ATTACH_FACE_TONGUE"> + Langue + </string> + <string name="ATTACH_GROIN"> + Aine + </string> + <string name="ATTACH_HIND_LFOOT"> + Pied arrière gauche + </string> + <string name="ATTACH_HIND_RFOOT"> + Pied arrière droit + </string> + <string name="CursorPos"> + Ligne [LINE], colonne [COLUMN] + </string> + <string name="PanelDirCountFound"> + [COUNT] trouvé(s) + </string> + <string name="PanelDirTimeStr"> + [hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt] + </string> + <string name="PanelDirEventsDateText"> + [mthnum,datetime,slt]/[day,datetime,slt] + </string> + <string name="PanelContentsTooltip"> + Contenu de l'objet + </string> + <string name="PanelContentsNewScript"> + Nouveau script + </string> + <string name="DoNotDisturbModeResponseDefault"> + Ce résident a activé Ne pas déranger et verra votre message plus tard. + </string> + <string name="MuteByName"> + (par nom) + </string> + <string name="MuteAgent"> + (résident) + </string> + <string name="MuteObject"> + (objet) + </string> + <string name="MuteGroup"> + (groupe) + </string> + <string name="MuteExternal"> + (externe) + </string> + <string name="RegionNoCovenant"> + Il n'y a aucun règlement pour ce domaine. + </string> + <string name="RegionNoCovenantOtherOwner"> + Il n'y a aucun règlement pour ce domaine. Le terrain sur ce domaine est vendu par le propriétaire, non par Linden Lab. Pour en savoir plus, veuillez contacter le propriétaire. + </string> <string name="covenant_last_modified" value="Dernière modification :"/> <string name="none_text" value=" (aucun)"/> <string name="never_text" value=" (jamais)"/> - <string name="GroupOwned">Propriété du groupe</string> - <string name="Public">Public</string> - <string name="LocalSettings">Réglages locaux</string> - <string name="RegionSettings">Réglages de la région</string> - <string name="NoEnvironmentSettings">Cette région ne prend pas en charge les paramètres environnementaux.</string> - <string name="EnvironmentSun">Soleil</string> - <string name="EnvironmentMoon">Lune</string> - <string name="EnvironmentBloom">Éclat</string> - <string name="EnvironmentCloudNoise">Bruit du nuage</string> - <string name="EnvironmentNormalMap">Carte normale</string> - <string name="EnvironmentTransparent">Transparent</string> - <string name="ClassifiedClicksTxt">Clics : [TELEPORT] téléportation, [MAP] carte, [PROFILE] profil</string> - <string name="ClassifiedUpdateAfterPublish">(mise à jour après la publication)</string> - <string name="NoPicksClassifiedsText">Vous n'avez pas créé de favoris ni de petites annonces Cliquez sur le bouton Plus pour créer un favori ou une petite annonce.</string> - <string name="NoPicksText">Vous n'avez pas créé de favoris Cliquer sur le bouton Nouveau pour créer un favori</string> - <string name="NoClassifiedsText">Vous n'avez pas créé de petites annonces Cliquer sur le bouton Nouveau pour créer une petite annonce.</string> - <string name="NoAvatarPicksClassifiedsText">L'utilisateur n'a ni favoris ni petites annonces.</string> - <string name="NoAvatarPicksText">L'utilisateur n'a pas de favoris</string> - <string name="NoAvatarClassifiedsText">L'utilisateur n'a pas de petites annonces</string> - <string name="PicksClassifiedsLoadingText">Chargement...</string> - <string name="MultiPreviewTitle">Prévisualiser</string> - <string name="MultiPropertiesTitle">Propriétés</string> - <string name="InvOfferAnObjectNamed">Un objet appelé</string> - <string name="InvOfferOwnedByGroup">possédé par le groupe</string> - <string name="InvOfferOwnedByUnknownGroup">possédé par un groupe inconnu</string> - <string name="InvOfferOwnedBy">possédé par</string> - <string name="InvOfferOwnedByUnknownUser">possédé par un résident inconnu</string> - <string name="InvOfferGaveYou">vous a donné</string> - <string name="InvOfferDecline">Vous refusez l'offre [DESC] de <nolink>[NAME]</nolink>.</string> - <string name="GroupMoneyTotal">Total</string> - <string name="GroupMoneyBought">acheté</string> - <string name="GroupMoneyPaidYou">vous a payé</string> - <string name="GroupMoneyPaidInto">payé</string> - <string name="GroupMoneyBoughtPassTo">a acheté un pass à </string> - <string name="GroupMoneyPaidFeeForEvent">a payé des frais pour un événement</string> - <string name="GroupMoneyPaidPrizeForEvent">a payé un prix pour un événement</string> - <string name="GroupMoneyBalance">Solde</string> - <string name="GroupMoneyCredits">Crédits</string> - <string name="GroupMoneyDebits">Débits</string> - <string name="GroupMoneyDate">[weekday,datetime,utc] [day,datetime,utc] [mth,datetime,utc] [year,datetime,utc]</string> - <string name="AcquiredItems">Objets acquis</string> - <string name="Cancel">Annuler</string> - <string name="UploadingCosts">Le chargement de [NAME] coûte [AMOUNT] L$</string> - <string name="BuyingCosts">Cet achat coûte [AMOUNT] L$</string> - <string name="UnknownFileExtension">Extension de fichier inconnue .%s -.wav, .tga, .bmp, .jpg, .jpeg, ou .bvh acceptés</string> - <string name="MuteObject2">Ignorer</string> - <string name="MuteAvatar">Ignorer</string> - <string name="UnmuteObject">Ne plus ignorer</string> - <string name="UnmuteAvatar">Ne plus ignorer</string> - <string name="AddLandmarkNavBarMenu">Ajouter à mes repères...</string> - <string name="EditLandmarkNavBarMenu">Modifier mon repère...</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">Maj+</string> - <string name="FileSaved">Fichier enregistré</string> - <string name="Receiving">Réception</string> - <string name="AM">Matin</string> - <string name="PM">Après-midi</string> - <string name="PST">PST</string> - <string name="PDT">PDT</string> - <string name="Direction_Forward">Avant</string> - <string name="Direction_Left">Gauche</string> - <string name="Direction_Right">Droite</string> - <string name="Direction_Back">Arrière</string> - <string name="Direction_North">Nord</string> - <string name="Direction_South">Sud</string> - <string name="Direction_West">Ouest</string> - <string name="Direction_East">Est</string> - <string name="Direction_Up">Haut</string> - <string name="Direction_Down">Bas</string> - <string name="Any Category">Toutes catégories</string> - <string name="Shopping">Shopping</string> - <string name="Land Rental">Terrains à louer</string> - <string name="Property Rental">Propriétés à louer</string> - <string name="Special Attraction">Divertissements</string> - <string name="New Products">Nouveaux produits</string> - <string name="Employment">Emplois</string> - <string name="Wanted">Offres</string> - <string name="Service">Services</string> - <string name="Personal">Divers</string> - <string name="None">Aucun</string> - <string name="Linden Location">Appartenant aux Lindens</string> - <string name="Adult">Adulte</string> - <string name="Arts&Culture">Arts et culture</string> - <string name="Business">Business</string> - <string name="Educational">Éducation</string> - <string name="Gaming">Jeux</string> - <string name="Hangout">Favoris</string> - <string name="Newcomer Friendly">Accueil pour les nouveaux</string> - <string name="Parks&Nature">Parcs et nature</string> - <string name="Residential">Résidentiel</string> - <string name="Stage">Phase</string> - <string name="Other">Autre</string> - <string name="Rental">Location</string> - <string name="Any">Aucun</string> - <string name="You">Vous</string> - <string name=":">:</string> - <string name=",">,</string> - <string name="...">...</string> - <string name="***">***</string> - <string name="(">(</string> - <string name=")">)</string> - <string name=".">.</string> - <string name="'">'</string> - <string name="---">---</string> - <string name="Multiple Media">Médias multiples</string> - <string name="Play Media">Lire/pauser le média</string> - <string name="IntelDriverPage">http://www.intel.com/p/fr_FR/support/detect/graphics</string> - <string name="NvidiaDriverPage">http://www.nvidia.com/Download/index.aspx?lang=fr</string> - <string name="AMDDriverPage">http://support.amd.com/us/Pages/AMDSupportHub.aspx</string> - <string name="MBCmdLineError">Une erreur est survenue lors de la lecture de la ligne de commande. + <string name="GroupOwned"> + Propriété du groupe + </string> + <string name="Public"> + Public + </string> + <string name="LocalSettings"> + Réglages locaux + </string> + <string name="RegionSettings"> + Réglages de la région + </string> + <string name="NoEnvironmentSettings"> + Cette région ne prend pas en charge les paramètres environnementaux. + </string> + <string name="EnvironmentSun"> + Soleil + </string> + <string name="EnvironmentMoon"> + Lune + </string> + <string name="EnvironmentBloom"> + Éclat + </string> + <string name="EnvironmentCloudNoise"> + Bruit du nuage + </string> + <string name="EnvironmentNormalMap"> + Carte normale + </string> + <string name="EnvironmentTransparent"> + Transparent + </string> + <string name="ClassifiedClicksTxt"> + Clics : [TELEPORT] téléportation, [MAP] carte, [PROFILE] profil + </string> + <string name="ClassifiedUpdateAfterPublish"> + (mise à jour après la publication) + </string> + <string name="NoPicksClassifiedsText"> + Vous n'avez pas créé de favoris ni de petites annonces Cliquez sur le bouton Plus pour créer un favori ou une petite annonce. + </string> + <string name="NoPicksText"> + Vous n'avez pas créé de favoris Cliquer sur le bouton Nouveau pour créer un favori + </string> + <string name="NoClassifiedsText"> + Vous n'avez pas créé de petites annonces Cliquer sur le bouton Nouveau pour créer une petite annonce. + </string> + <string name="NoAvatarPicksClassifiedsText"> + L'utilisateur n'a ni favoris ni petites annonces. + </string> + <string name="NoAvatarPicksText"> + L'utilisateur n'a pas de favoris + </string> + <string name="NoAvatarClassifiedsText"> + L'utilisateur n'a pas de petites annonces + </string> + <string name="PicksClassifiedsLoadingText"> + Chargement... + </string> + <string name="MultiPreviewTitle"> + Prévisualiser + </string> + <string name="MultiPropertiesTitle"> + Propriétés + </string> + <string name="InvOfferAnObjectNamed"> + Un objet appelé + </string> + <string name="InvOfferOwnedByGroup"> + possédé par le groupe + </string> + <string name="InvOfferOwnedByUnknownGroup"> + possédé par un groupe inconnu + </string> + <string name="InvOfferOwnedBy"> + possédé par + </string> + <string name="InvOfferOwnedByUnknownUser"> + possédé par un résident inconnu + </string> + <string name="InvOfferGaveYou"> + vous a donné + </string> + <string name="InvOfferDecline"> + Vous refusez l'offre [DESC] de <nolink>[NAME]</nolink>. + </string> + <string name="GroupMoneyTotal"> + Total + </string> + <string name="GroupMoneyBought"> + acheté + </string> + <string name="GroupMoneyPaidYou"> + vous a payé + </string> + <string name="GroupMoneyPaidInto"> + payé + </string> + <string name="GroupMoneyBoughtPassTo"> + a acheté un pass à + </string> + <string name="GroupMoneyPaidFeeForEvent"> + a payé des frais pour un événement + </string> + <string name="GroupMoneyPaidPrizeForEvent"> + a payé un prix pour un événement + </string> + <string name="GroupMoneyBalance"> + Solde + </string> + <string name="GroupMoneyCredits"> + Crédits + </string> + <string name="GroupMoneyDebits"> + Débits + </string> + <string name="GroupMoneyDate"> + [weekday,datetime,utc] [day,datetime,utc] [mth,datetime,utc] [year,datetime,utc] + </string> + <string name="AcquiredItems"> + Objets acquis + </string> + <string name="Cancel"> + Annuler + </string> + <string name="UploadingCosts"> + Le chargement de [NAME] coûte [AMOUNT] L$ + </string> + <string name="BuyingCosts"> + Cet achat coûte [AMOUNT] L$ + </string> + <string name="UnknownFileExtension"> + Extension de fichier inconnue .%s +.wav, .tga, .bmp, .jpg, .jpeg, ou .bvh acceptés + </string> + <string name="MuteObject2"> + Ignorer + </string> + <string name="MuteAvatar"> + Ignorer + </string> + <string name="UnmuteObject"> + Ne plus ignorer + </string> + <string name="UnmuteAvatar"> + Ne plus ignorer + </string> + <string name="AddLandmarkNavBarMenu"> + Ajouter à mes repères... + </string> + <string name="EditLandmarkNavBarMenu"> + Modifier mon repère... + </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"> + Maj+ + </string> + <string name="FileSaved"> + Fichier enregistré + </string> + <string name="Receiving"> + Réception + </string> + <string name="AM"> + Matin + </string> + <string name="PM"> + Après-midi + </string> + <string name="PST"> + PST + </string> + <string name="PDT"> + PDT + </string> + <string name="Direction_Forward"> + Avant + </string> + <string name="Direction_Left"> + Gauche + </string> + <string name="Direction_Right"> + Droite + </string> + <string name="Direction_Back"> + Arrière + </string> + <string name="Direction_North"> + Nord + </string> + <string name="Direction_South"> + Sud + </string> + <string name="Direction_West"> + Ouest + </string> + <string name="Direction_East"> + Est + </string> + <string name="Direction_Up"> + Haut + </string> + <string name="Direction_Down"> + Bas + </string> + <string name="Any Category"> + Toutes catégories + </string> + <string name="Shopping"> + Shopping + </string> + <string name="Land Rental"> + Terrains à louer + </string> + <string name="Property Rental"> + Propriétés à louer + </string> + <string name="Special Attraction"> + Divertissements + </string> + <string name="New Products"> + Nouveaux produits + </string> + <string name="Employment"> + Emplois + </string> + <string name="Wanted"> + Offres + </string> + <string name="Service"> + Services + </string> + <string name="Personal"> + Divers + </string> + <string name="None"> + Aucun + </string> + <string name="Linden Location"> + Appartenant aux Lindens + </string> + <string name="Adult"> + Adulte + </string> + <string name="Arts&Culture"> + Arts et culture + </string> + <string name="Business"> + Business + </string> + <string name="Educational"> + Éducation + </string> + <string name="Gaming"> + Jeux + </string> + <string name="Hangout"> + Favoris + </string> + <string name="Newcomer Friendly"> + Accueil pour les nouveaux + </string> + <string name="Parks&Nature"> + Parcs et nature + </string> + <string name="Residential"> + Résidentiel + </string> + <string name="Stage"> + Phase + </string> + <string name="Other"> + Autre + </string> + <string name="Rental"> + Location + </string> + <string name="Any"> + Aucun + </string> + <string name="You"> + Vous + </string> + <string name=":"> + : + </string> + <string name=","> + , + </string> + <string name="..."> + ... + </string> + <string name="***"> + *** + </string> + <string name="("> + ( + </string> + <string name=")"> + ) + </string> + <string name="."> + . + </string> + <string name="'"> + ' + </string> + <string name="---"> + --- + </string> + <string name="Multiple Media"> + Médias multiples + </string> + <string name="Play Media"> + Lire/pauser le média + </string> + <string name="IntelDriverPage"> + http://www.intel.com/p/fr_FR/support/detect/graphics + </string> + <string name="NvidiaDriverPage"> + http://www.nvidia.com/Download/index.aspx?lang=fr + </string> + <string name="AMDDriverPage"> + http://support.amd.com/us/Pages/AMDSupportHub.aspx + </string> + <string name="MBCmdLineError"> + Une erreur est survenue lors de la lecture de la ligne de commande. Merci de consulter : http://wiki.secondlife.com/wiki/Client_parameters -Erreur :</string> - <string name="MBCmdLineUsg">[APP_NAME] - Utilisation de la ligne de commande :</string> - <string name="MBUnableToAccessFile">[APP_NAME] ne peut accéder à un fichier requis. +Erreur : + </string> + <string name="MBCmdLineUsg"> + [APP_NAME] - Utilisation de la ligne de commande : + </string> + <string name="MBUnableToAccessFile"> + [APP_NAME] ne peut accéder à un fichier requis. Cela vient du fait que quelqu'un a ouvert plusieurs copies ou que votre système pense qu'un fichier est ouvert. Si ce message persiste, veuillez redémarrer votre ordinateur. -Si le problème persiste, vous devrez peut-être complètement désinstaller puis réinstaller [APP_NAME].</string> - <string name="MBFatalError">Erreur fatale</string> - <string name="MBRequiresAltiVec">[APP_NAME] nécessite un microprocesseur AltiVec (version G4 ou antérieure).</string> - <string name="MBAlreadyRunning">[APP_NAME] est déjà en cours d'exécution. +Si le problème persiste, vous devrez peut-être complètement désinstaller puis réinstaller [APP_NAME]. + </string> + <string name="MBFatalError"> + Erreur fatale + </string> + <string name="MBRequiresAltiVec"> + [APP_NAME] nécessite un microprocesseur AltiVec (version G4 ou antérieure). + </string> + <string name="MBAlreadyRunning"> + [APP_NAME] est déjà en cours d'exécution. Vérifiez si une version minimisée du programme apparaît dans votre barre de tâches. -Si ce message persiste, redémarrez votre ordinateur.</string> - <string name="MBFrozenCrashed">[APP_NAME] semble avoir crashé lors de l'utilisation précédente. -Voulez-vous envoyer un rapport de crash ?</string> - <string name="MBAlert">Notification</string> - <string name="MBNoDirectX">[APP_NAME] ne peut détecter DirectX 9.0b ou une version supérieure. +Si ce message persiste, redémarrez votre ordinateur. + </string> + <string name="MBFrozenCrashed"> + [APP_NAME] semble avoir crashé lors de l'utilisation précédente. +Voulez-vous envoyer un rapport de crash ? + </string> + <string name="MBAlert"> + Notification + </string> + <string name="MBNoDirectX"> + [APP_NAME] ne peut détecter DirectX 9.0b ou une version supérieure. [APP_NAME] utilise DirectX pour détecter les matériels et/ou les pilotes qui ne sont pas à jour et peuvent causer des problèmes de stabilité, de performance ou des plantages. Bien que vous puissiez utiliser [APP_NAME] sans DirectX, nous vous recommandons de l'utiliser avec DirectX 9.0b. -Voulez-vous continuer ?</string> - <string name="MBWarning">Avertissement</string> - <string name="MBNoAutoUpdate">Les mises à jour automatiques n'existent pas encore pour Linux. -Veuillez télécharger la dernière version sur www.secondlife.com.</string> - <string name="MBRegClassFailed">RegisterClass a échoué</string> - <string name="MBError">Erreur</string> - <string name="MBFullScreenErr">Impossible d'ouvrir le mode plein écran à [WIDTH] x [HEIGHT]. -Utilisation du mode fenêtré.</string> - <string name="MBDestroyWinFailed">Erreur de fermeture lors de la destruction de la fenêtre (DestroyWindow() a échoué)</string> - <string name="MBShutdownErr">Erreur de fermeture</string> - <string name="MBDevContextErr">Impossible de créer le contexte GL</string> - <string name="MBPixelFmtErr">Impossible de trouver le format pixel approprié</string> - <string name="MBPixelFmtDescErr">Impossible de trouver la description du format pixel</string> - <string name="MBTrueColorWindow">[APP_NAME] nécessite True Color (32 bits) pour s'exécuter. -Accédez aux paramètres d'affichage de votre ordinateur et réglez le mode couleur sur 32 bits.</string> - <string name="MBAlpha">[APP_NAME] ne peut pas s'exécuter, car il n'y pas de canal alpha 8 bits accessible. En général, ceci vient de problèmes avec le pilote de la carte vidéo. +Voulez-vous continuer ? + </string> + <string name="MBWarning"> + Avertissement + </string> + <string name="MBNoAutoUpdate"> + Les mises à jour automatiques n'existent pas encore pour Linux. +Veuillez télécharger la dernière version sur www.secondlife.com. + </string> + <string name="MBRegClassFailed"> + RegisterClass a échoué + </string> + <string name="MBError"> + Erreur + </string> + <string name="MBFullScreenErr"> + Impossible d'ouvrir le mode plein écran à [WIDTH] x [HEIGHT]. +Utilisation du mode fenêtré. + </string> + <string name="MBDestroyWinFailed"> + Erreur de fermeture lors de la destruction de la fenêtre (DestroyWindow() a échoué) + </string> + <string name="MBShutdownErr"> + Erreur de fermeture + </string> + <string name="MBDevContextErr"> + Impossible de créer le contexte GL + </string> + <string name="MBPixelFmtErr"> + Impossible de trouver le format pixel approprié + </string> + <string name="MBPixelFmtDescErr"> + Impossible de trouver la description du format pixel + </string> + <string name="MBTrueColorWindow"> + [APP_NAME] nécessite True Color (32 bits) pour s'exécuter. +Accédez aux paramètres d'affichage de votre ordinateur et réglez le mode couleur sur 32 bits. + </string> + <string name="MBAlpha"> + [APP_NAME] ne peut pas s'exécuter, car il n'y pas de canal alpha 8 bits accessible. En général, ceci vient de problèmes avec le pilote de la carte vidéo. Assurez-vous d'avoir installé le pilote de carte vidéo le plus récent possible. Assurez-vous aussi que votre écran est réglé sur True Color (32 bits) sous Panneau de configuration > Affichage > Paramètres. -Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].</string> - <string name="MBPixelFmtSetErr">Impossible de trouver le format pixel approprié</string> - <string name="MBGLContextErr">Impossible de créer le contexte de rendu GL</string> - <string name="MBGLContextActErr">Impossible d'activer le contexte de rendu GL</string> - <string name="MBVideoDrvErr">[APP_NAME] ne peut pas s'exécuter car les pilotes de votre carte vidéo n'ont pas été installés correctement, ne sont pas à jour, ou sont pour du matériel non pris en charge. Assurez-vous d'avoir des pilotes de cartes vidéos récents, et même si vous avez les plus récents, réinstallez-les. +Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. + </string> + <string name="MBPixelFmtSetErr"> + Impossible de trouver le format pixel approprié + </string> + <string name="MBGLContextErr"> + Impossible de créer le contexte de rendu GL + </string> + <string name="MBGLContextActErr"> + Impossible d'activer le contexte de rendu GL + </string> + <string name="MBVideoDrvErr"> + [APP_NAME] ne peut pas s'exécuter car les pilotes de votre carte vidéo n'ont pas été installés correctement, ne sont pas à jour, ou sont pour du matériel non pris en charge. Assurez-vous d'avoir des pilotes de cartes vidéos récents, et même si vous avez les plus récents, réinstallez-les. -Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].</string> - <string name="5 O'Clock Shadow">Peu</string> - <string name="All White">Tout blancs</string> - <string name="Anime Eyes">Grand yeux</string> - <string name="Arced">Arqués</string> - <string name="Arm Length">Longueur des bras</string> - <string name="Attached">Attachés</string> - <string name="Attached Earlobes">Lobes</string> - <string name="Back Fringe">Mèches de derrière</string> - <string name="Baggy">Plus</string> - <string name="Bangs">Frange</string> - <string name="Beady Eyes">Yeux perçants</string> - <string name="Belly Size">Taille du ventre</string> - <string name="Big">Plus</string> - <string name="Big Butt">Grosses fesses</string> - <string name="Big Hair Back">Volume : Derrière</string> - <string name="Big Hair Front">Volume : Devant</string> - <string name="Big Hair Top">Volume : Haut</string> - <string name="Big Head">Plus</string> - <string name="Big Pectorals">Gros pectoraux</string> - <string name="Big Spikes">Spikes</string> - <string name="Black">Noir</string> - <string name="Blonde">Blond</string> - <string name="Blonde Hair">Cheveux blonds</string> - <string name="Blush">Blush</string> - <string name="Blush Color">Couleur du blush</string> - <string name="Blush Opacity">Opacité du blush</string> - <string name="Body Definition">Contour du corps</string> - <string name="Body Fat">Graisse</string> - <string name="Body Freckles">Grains de beauté</string> - <string name="Body Thick">Plus</string> - <string name="Body Thickness">Épaisseur du corps</string> - <string name="Body Thin">Moins</string> - <string name="Bow Legged">Jambes arquées</string> - <string name="Breast Buoyancy">Hauteur des seins</string> - <string name="Breast Cleavage">Clivage</string> - <string name="Breast Size">Taille des seins</string> - <string name="Bridge Width">Arête du nez</string> - <string name="Broad">Large</string> - <string name="Brow Size">Taille du front</string> - <string name="Bug Eyes">Yeux globuleux</string> - <string name="Bugged Eyes">Yeux globuleux</string> - <string name="Bulbous">En bulbe</string> - <string name="Bulbous Nose">Nez en bulbe</string> - <string name="Breast Physics Mass">Masse des seins</string> - <string name="Breast Physics Smoothing">Lissage des seins</string> - <string name="Breast Physics Gravity">Gravité des seins</string> - <string name="Breast Physics Drag">Résistance de l'air sur les seins</string> - <string name="Breast Physics InOut Max Effect">Effet max.</string> - <string name="Breast Physics InOut Spring">Élasticité</string> - <string name="Breast Physics InOut Gain">Amplification</string> - <string name="Breast Physics InOut Damping">Amortissement</string> - <string name="Breast Physics UpDown Max Effect">Effet max.</string> - <string name="Breast Physics UpDown Spring">Élasticité</string> - <string name="Breast Physics UpDown Gain">Amplification</string> - <string name="Breast Physics UpDown Damping">Amortissement</string> - <string name="Breast Physics LeftRight Max Effect">Effet max.</string> - <string name="Breast Physics LeftRight Spring">Élasticité</string> - <string name="Breast Physics LeftRight Gain">Amplification</string> - <string name="Breast Physics LeftRight Damping">Amortissement</string> - <string name="Belly Physics Mass">Masse du ventre</string> - <string name="Belly Physics Smoothing">Lissage du ventre</string> - <string name="Belly Physics Gravity">Gravité du ventre</string> - <string name="Belly Physics Drag">Résistance de l'air sur le ventre</string> - <string name="Belly Physics UpDown Max Effect">Effet max.</string> - <string name="Belly Physics UpDown Spring">Élasticité</string> - <string name="Belly Physics UpDown Gain">Amplification</string> - <string name="Belly Physics UpDown Damping">Amortissement</string> - <string name="Butt Physics Mass">Masse des fesses</string> - <string name="Butt Physics Smoothing">Lissage des fesses</string> - <string name="Butt Physics Gravity">Gravité des fesses</string> - <string name="Butt Physics Drag">Résistance de l'air sur les fesses</string> - <string name="Butt Physics UpDown Max Effect">Effet max.</string> - <string name="Butt Physics UpDown Spring">Élasticité</string> - <string name="Butt Physics UpDown Gain">Amplification</string> - <string name="Butt Physics UpDown Damping">Amortissement</string> - <string name="Butt Physics LeftRight Max Effect">Effet max.</string> - <string name="Butt Physics LeftRight Spring">Élasticité</string> - <string name="Butt Physics LeftRight Gain">Amplification</string> - <string name="Butt Physics LeftRight Damping">Amortissement</string> - <string name="Bushy Eyebrows">Sourcils touffus</string> - <string name="Bushy Hair">Beaucoup</string> - <string name="Butt Size">Taille des fesses</string> - <string name="Butt Gravity">Gravité des fesses</string> - <string name="bustle skirt">Jupe gonflante</string> - <string name="no bustle">Pas gonflante</string> - <string name="more bustle">Plus gonflante</string> - <string name="Chaplin">Moins</string> - <string name="Cheek Bones">Pommettes</string> - <string name="Chest Size">Taille de la poitrine</string> - <string name="Chin Angle">Angle du menton</string> - <string name="Chin Cleft">Fente du menton</string> - <string name="Chin Curtains">Favoris</string> - <string name="Chin Depth">Profondeur</string> - <string name="Chin Heavy">Menton lourd</string> - <string name="Chin In">Menton rentré</string> - <string name="Chin Out">Menton sorti</string> - <string name="Chin-Neck">Menton-cou</string> - <string name="Clear">Clair</string> - <string name="Cleft">Fendu</string> - <string name="Close Set Eyes">Yeux rapprochés</string> - <string name="Closed">Fermé(s)</string> - <string name="Closed Back">Fermé à l'arrière</string> - <string name="Closed Front">Fermé devant</string> - <string name="Closed Left">Fermé à gauche</string> - <string name="Closed Right">Fermé à droite</string> - <string name="Coin Purse">Mini</string> - <string name="Collar Back">Col arrière</string> - <string name="Collar Front">Col devant</string> - <string name="Corner Down">Coin vers le bas</string> - <string name="Corner Up">Coin vers le haut</string> - <string name="Creased">Fripée</string> - <string name="Crooked Nose">Déviation du nez</string> - <string name="Cuff Flare">Jambes</string> - <string name="Dark">Sombre</string> - <string name="Dark Green">Vert foncé</string> - <string name="Darker">Plus foncé</string> - <string name="Deep">Profonde</string> - <string name="Default Heels">Talons par défaut</string> - <string name="Dense">Dense</string> - <string name="Double Chin">Double menton</string> - <string name="Downturned">Pointant vers le bas</string> - <string name="Duffle Bag">Maxi</string> - <string name="Ear Angle">Angle de l'oreille</string> - <string name="Ear Size">Taille</string> - <string name="Ear Tips">Extrémités</string> - <string name="Egg Head">Proéminence</string> - <string name="Eye Bags">Cernes</string> - <string name="Eye Color">Couleur des yeux</string> - <string name="Eye Depth">Profondeur</string> - <string name="Eye Lightness">Clarté</string> - <string name="Eye Opening">Ouverture</string> - <string name="Eye Pop">Å’il proéminent</string> - <string name="Eye Size">Taille de l'Å“il</string> - <string name="Eye Spacing">Espacement</string> - <string name="Eyebrow Arc">Arc</string> - <string name="Eyebrow Density">Épaisseur sourcils</string> - <string name="Eyebrow Height">Hauteur</string> - <string name="Eyebrow Points">Direction</string> - <string name="Eyebrow Size">Taille</string> - <string name="Eyelash Length">Longueur des cils</string> - <string name="Eyeliner">Eyeliner</string> - <string name="Eyeliner Color">Couleur de l'eyeliner</string> - <string name="Eyes Bugged">Yeux globuleux</string> - <string name="Face Shear">Visage</string> - <string name="Facial Definition">Définition</string> - <string name="Far Set Eyes">Yeux écartés</string> - <string name="Fat Lips">Lèvres épaisses</string> - <string name="Female">Femme</string> - <string name="Fingerless">Sans doigts</string> - <string name="Fingers">Doigts</string> - <string name="Flared Cuffs">Jambes larges</string> - <string name="Flat">Moins</string> - <string name="Flat Butt">Fesses plates</string> - <string name="Flat Head">Tête plate</string> - <string name="Flat Toe">Orteil plat</string> - <string name="Foot Size">Pointure</string> - <string name="Forehead Angle">Angle du front</string> - <string name="Forehead Heavy">Front lourd</string> - <string name="Freckles">Tâches de rousseur</string> - <string name="Front Fringe">Mèches de devant</string> - <string name="Full Back">Arrière touffu</string> - <string name="Full Eyeliner">Eyeliner marqué</string> - <string name="Full Front">Devant touffu</string> - <string name="Full Hair Sides">Côtés touffus</string> - <string name="Full Sides">Côtés touffus</string> - <string name="Glossy">Brillant</string> - <string name="Glove Fingers">Gants avec doigts</string> - <string name="Glove Length">Longueur</string> - <string name="Hair">Cheveux</string> - <string name="Hair Back">Cheveux : Derrière</string> - <string name="Hair Front">Cheveux : Devant</string> - <string name="Hair Sides">Cheveux : Côtés</string> - <string name="Hair Sweep">Sens de la coiffure</string> - <string name="Hair Thickess">Épaisseur cheveux</string> - <string name="Hair Thickness">Épaisseur cheveux</string> - <string name="Hair Tilt">Inclinaison</string> - <string name="Hair Tilted Left">Vers la gauche</string> - <string name="Hair Tilted Right">Vers la droite</string> - <string name="Hair Volume">Cheveux : Volume</string> - <string name="Hand Size">Taille de la main</string> - <string name="Handlebars">Plus</string> - <string name="Head Length">Longueur</string> - <string name="Head Shape">Forme</string> - <string name="Head Size">Taille</string> - <string name="Head Stretch">Allongement</string> - <string name="Heel Height">Talons</string> - <string name="Heel Shape">Forme des talons</string> - <string name="Height">Taille</string> - <string name="High">Haut</string> - <string name="High Heels">Talons hauts</string> - <string name="High Jaw">Haut</string> - <string name="High Platforms">Haute</string> - <string name="High and Tight">Haut et serré</string> - <string name="Higher">Plus élevé</string> - <string name="Hip Length">Longueur hanche</string> - <string name="Hip Width">Largeur hanche</string> - <string name="Hover">Survol</string> - <string name="In">Rentré</string> - <string name="In Shdw Color">Couleur ombre interne</string> - <string name="In Shdw Opacity">Opacité ombre interne</string> - <string name="Inner Eye Corner">Coin interne</string> - <string name="Inner Eye Shadow">Ombre de l'Å“il interne</string> - <string name="Inner Shadow">Ombre interne</string> - <string name="Jacket Length">Longueur de la veste</string> - <string name="Jacket Wrinkles">Plis de la veste</string> - <string name="Jaw Angle">Angle mâchoire</string> - <string name="Jaw Jut">Saillie mâchoire</string> - <string name="Jaw Shape">Mâchoire</string> - <string name="Join">Rapprochés</string> - <string name="Jowls">Bajoues</string> - <string name="Knee Angle">Angle du genou</string> - <string name="Knock Kneed">Genoux rapprochés</string> - <string name="Large">Plus</string> - <string name="Large Hands">Grandes mains</string> - <string name="Left Part">Raie à gauche</string> - <string name="Leg Length">Longueur</string> - <string name="Leg Muscles">Muscles</string> - <string name="Less">Moins</string> - <string name="Less Body Fat">Moins</string> - <string name="Less Curtains">Moins</string> - <string name="Less Freckles">Moins</string> - <string name="Less Full">Moins</string> - <string name="Less Gravity">Moins</string> - <string name="Less Love">Moins</string> - <string name="Less Muscles">Moins</string> - <string name="Less Muscular">Moins</string> - <string name="Less Rosy">Moins</string> - <string name="Less Round">Moins ronde</string> - <string name="Less Saddle">Moins</string> - <string name="Less Square">Moins carrée</string> - <string name="Less Volume">Moins</string> - <string name="Less soul">Moins</string> - <string name="Lighter">Plus léger</string> - <string name="Lip Cleft">Fente labiale</string> - <string name="Lip Cleft Depth">Prof. fente labiale</string> - <string name="Lip Fullness">Volume des lèvres</string> - <string name="Lip Pinkness">Rougeur des lèvres</string> - <string name="Lip Ratio">Proportion des lèvres</string> - <string name="Lip Thickness">Épaisseur</string> - <string name="Lip Width">Largeur</string> - <string name="Lipgloss">Brillant à lèvres</string> - <string name="Lipstick">Rouge à lèvres</string> - <string name="Lipstick Color">Couleur du rouge à lèvres</string> - <string name="Long">Plus</string> - <string name="Long Head">Tête longue</string> - <string name="Long Hips">Hanches longues</string> - <string name="Long Legs">Jambes longues</string> - <string name="Long Neck">Long cou</string> - <string name="Long Pigtails">Longues couettes</string> - <string name="Long Ponytail">Longue queue de cheval</string> - <string name="Long Torso">Torse long</string> - <string name="Long arms">Bras longs</string> - <string name="Loose Pants">Pantalons amples</string> - <string name="Loose Shirt">Chemise ample</string> - <string name="Loose Sleeves">Manches amples</string> - <string name="Love Handles">Poignées d'amour</string> - <string name="Low">Bas</string> - <string name="Low Heels">Talons bas</string> - <string name="Low Jaw">Bas</string> - <string name="Low Platforms">Basse</string> - <string name="Low and Loose">Bas et ample</string> - <string name="Lower">Abaisser</string> - <string name="Lower Bridge">Arête inférieure</string> - <string name="Lower Cheeks">Joue inférieure</string> - <string name="Male">Homme</string> - <string name="Middle Part">Raie au milieu</string> - <string name="More">Plus</string> - <string name="More Blush">Plus</string> - <string name="More Body Fat">Plus</string> - <string name="More Curtains">Plus</string> - <string name="More Eyeshadow">Plus</string> - <string name="More Freckles">Plus</string> - <string name="More Full">Plus</string> - <string name="More Gravity">Plus</string> - <string name="More Lipstick">Plus</string> - <string name="More Love">Plus</string> - <string name="More Lower Lip">Inférieure plus grosse</string> - <string name="More Muscles">Plus</string> - <string name="More Muscular">Plus</string> - <string name="More Rosy">Plus</string> - <string name="More Round">Plus</string> - <string name="More Saddle">Plus</string> - <string name="More Sloped">Plus</string> - <string name="More Square">Plus</string> - <string name="More Upper Lip">Supérieure plus grosse</string> - <string name="More Vertical">Plus</string> - <string name="More Volume">Plus</string> - <string name="More soul">Plus</string> - <string name="Moustache">Moustache</string> - <string name="Mouth Corner">Coin de la bouche</string> - <string name="Mouth Position">Position</string> - <string name="Mowhawk">Mowhawk</string> - <string name="Muscular">Musclé</string> - <string name="Mutton Chops">Longs</string> - <string name="Nail Polish">Vernis à ongles</string> - <string name="Nail Polish Color">Couleur du vernis</string> - <string name="Narrow">Moins</string> - <string name="Narrow Back">Arrière étroit</string> - <string name="Narrow Front">Devant étroit</string> - <string name="Narrow Lips">Lèvres étroites</string> - <string name="Natural">Naturel</string> - <string name="Neck Length">Longueur du cou</string> - <string name="Neck Thickness">Épaisseur du cou</string> - <string name="No Blush">Pas de blush</string> - <string name="No Eyeliner">Pas d'eyeliner</string> - <string name="No Eyeshadow">Pas d'ombre à paupières</string> - <string name="No Lipgloss">Pas de brillant à lèvres</string> - <string name="No Lipstick">Pas de rouge à lèvres</string> - <string name="No Part">Pas de raie</string> - <string name="No Polish">Pas de vernis</string> - <string name="No Red">Pas de rouge</string> - <string name="No Spikes">Pas de spikes</string> - <string name="No White">Pas de blanc</string> - <string name="No Wrinkles">Pas de rides</string> - <string name="Normal Lower">Normal plus bas</string> - <string name="Normal Upper">Normal plus haut</string> - <string name="Nose Left">Nez à gauche</string> - <string name="Nose Right">Nez à droite</string> - <string name="Nose Size">Taille du nez</string> - <string name="Nose Thickness">Épaisseur du nez</string> - <string name="Nose Tip Angle">Angle bout du nez</string> - <string name="Nose Tip Shape">Forme bout du nez</string> - <string name="Nose Width">Largeur du nez</string> - <string name="Nostril Division">Division narines</string> - <string name="Nostril Width">Largeur narines</string> - <string name="Opaque">Opaque</string> - <string name="Open">Ouvert</string> - <string name="Open Back">Derrière ouvert</string> - <string name="Open Front">Devant ouvert</string> - <string name="Open Left">Ouvert à gauche</string> - <string name="Open Right">Ouvert à droite</string> - <string name="Orange">Orange</string> - <string name="Out">Sorti</string> - <string name="Out Shdw Color">Couleur de l'ombre externe</string> - <string name="Out Shdw Opacity">Opacité de l'ombre externe</string> - <string name="Outer Eye Corner">Coin externe</string> - <string name="Outer Eye Shadow">Ombre de l'Å“il externe</string> - <string name="Outer Shadow">Ombre externe</string> - <string name="Overbite">Rentrée</string> - <string name="Package">Parties</string> - <string name="Painted Nails">Ongles vernis</string> - <string name="Pale">Pâle</string> - <string name="Pants Crotch">Entrejambe</string> - <string name="Pants Fit">Taille</string> - <string name="Pants Length">Longueur</string> - <string name="Pants Waist">Taille</string> - <string name="Pants Wrinkles">Plis</string> - <string name="Part">Raie</string> - <string name="Part Bangs">Séparation frange</string> - <string name="Pectorals">Pectoraux</string> - <string name="Pigment">Pigmentation</string> - <string name="Pigtails">Couettes</string> - <string name="Pink">Rose</string> - <string name="Pinker">Plus rose</string> - <string name="Platform Height">Platef. (hauteur)</string> - <string name="Platform Width">Platef. (largeur)</string> - <string name="Pointy">Pointue</string> - <string name="Pointy Heels">Talons pointus</string> - <string name="Ponytail">Queue de cheval</string> - <string name="Poofy Skirt">Jupe bouffante</string> - <string name="Pop Left Eye">Å’il gauche saillant</string> - <string name="Pop Right Eye">Å’il droit saillant</string> - <string name="Puffy">Plus</string> - <string name="Puffy Eyelids">Paup. gonflées</string> - <string name="Rainbow Color">Couleur arc en ciel</string> - <string name="Red Hair">Cheveux roux</string> - <string name="Regular">Standard</string> - <string name="Right Part">Raie à droite</string> - <string name="Rosy Complexion">Teint rosé</string> - <string name="Round">Rond</string> - <string name="Ruddiness">Rougeur</string> - <string name="Ruddy">Rouge</string> - <string name="Rumpled Hair">Texture</string> - <string name="Saddle Bags">Culotte de cheval</string> - <string name="Scrawny Leg">Jambes maigres</string> - <string name="Separate">Séparés</string> - <string name="Shallow">Creux</string> - <string name="Shear Back">Coupe derrière</string> - <string name="Shear Face">Visage</string> - <string name="Shear Front">Front</string> - <string name="Shear Left Up">Haut gauche décalé</string> - <string name="Shear Right Up">Haut droit décalé</string> - <string name="Sheared Back">Dégagé derrière</string> - <string name="Sheared Front">Dégagé devant</string> - <string name="Shift Left">Vers la gauche</string> - <string name="Shift Mouth">Déplacement</string> - <string name="Shift Right">Vers la droite</string> - <string name="Shirt Bottom">Chemise</string> - <string name="Shirt Fit">Taille</string> - <string name="Shirt Wrinkles">Plis</string> - <string name="Shoe Height">Hauteur</string> - <string name="Short">Moins</string> - <string name="Short Arms">Bras courts</string> - <string name="Short Legs">Jambes courtes</string> - <string name="Short Neck">Petit cou</string> - <string name="Short Pigtails">Couettes courtes</string> - <string name="Short Ponytail">Queue de cheval courte</string> - <string name="Short Sideburns">Court</string> - <string name="Short Torso">Torse court</string> - <string name="Short hips">Hanches courtes</string> - <string name="Shoulders">Épaules</string> - <string name="Side Fringe">Mèches sur le côté</string> - <string name="Sideburns">Favoris</string> - <string name="Sides Hair">Cheveux sur le côté</string> - <string name="Sides Hair Down">Cheveux sur le côté en bas</string> - <string name="Sides Hair Up">Cheveux sur le côté en haut</string> - <string name="Skinny Neck">Cou maigre</string> - <string name="Skirt Fit">Taille jupe</string> - <string name="Skirt Length">Longueur jupe</string> - <string name="Slanted Forehead">Front incliné</string> - <string name="Sleeve Length">Longueur manche</string> - <string name="Sleeve Looseness">Ampleur manche</string> - <string name="Slit Back">Fente : Derrière</string> - <string name="Slit Front">Fente : Devant</string> - <string name="Slit Left">Fente : Gauche</string> - <string name="Slit Right">Fente : Droite</string> - <string name="Small">Moins</string> - <string name="Small Hands">Petites mains</string> - <string name="Small Head">Moins</string> - <string name="Smooth">Moins</string> - <string name="Smooth Hair">Cheveux lisses</string> - <string name="Socks Length">Longueur</string> - <string name="Soulpatch">Barbichette</string> - <string name="Sparse">Rares</string> - <string name="Spiked Hair">Mèches en pointe</string> - <string name="Square">Carrée</string> - <string name="Square Toe">Orteil carré</string> - <string name="Squash Head">Écraser la tête</string> - <string name="Stretch Head">Allonger la tête</string> - <string name="Sunken">Saillante</string> - <string name="Sunken Chest">Poitrine enfoncée</string> - <string name="Sunken Eyes">Yeux enfoncés</string> - <string name="Sweep Back">En arrière</string> - <string name="Sweep Forward">Vers l'avant</string> - <string name="Tall">Plus</string> - <string name="Taper Back">Arrière</string> - <string name="Taper Front">Avant</string> - <string name="Thick Heels">Talons épais</string> - <string name="Thick Neck">Cou épais</string> - <string name="Thick Toe">Orteil épais</string> - <string name="Thin">Mince</string> - <string name="Thin Eyebrows">Sourcils fins</string> - <string name="Thin Lips">Lèvres fines</string> - <string name="Thin Nose">Nez fin</string> - <string name="Tight Chin">Menton fin</string> - <string name="Tight Cuffs">Jambes serrées</string> - <string name="Tight Pants">Pantalons serrés</string> - <string name="Tight Shirt">Chemise serrée</string> - <string name="Tight Skirt">Jupe serrée</string> - <string name="Tight Sleeves">Manches serrées</string> - <string name="Toe Shape">Forme de l'orteil</string> - <string name="Toe Thickness">Épaisseur orteil</string> - <string name="Torso Length">Longueur du torse</string> - <string name="Torso Muscles">Muscles du torse</string> - <string name="Torso Scrawny">Torse maigre</string> - <string name="Unattached">Séparés</string> - <string name="Uncreased">Lisse</string> - <string name="Underbite">Sortie</string> - <string name="Unnatural">Artificiel</string> - <string name="Upper Bridge">Arête supérieure</string> - <string name="Upper Cheeks">Joue supérieure</string> - <string name="Upper Chin Cleft">Menton supérieur</string> - <string name="Upper Eyelid Fold">Paupière sup.</string> - <string name="Upturned">En trompette</string> - <string name="Very Red">Très rouge</string> - <string name="Waist Height">Hauteur taille</string> - <string name="Well-Fed">Ronde</string> - <string name="White Hair">Cheveux blancs</string> - <string name="Wide">Plus</string> - <string name="Wide Back">Derrière large</string> - <string name="Wide Front">Devant large</string> - <string name="Wide Lips">Lèvres larges</string> - <string name="Wild">Artificiel</string> - <string name="Wrinkles">Rides</string> - <string name="LocationCtrlAddLandmarkTooltip">Ajouter à mes repères</string> - <string name="LocationCtrlEditLandmarkTooltip">Modifier mon repère</string> - <string name="LocationCtrlInfoBtnTooltip">En savoir plus sur l'emplacement actuel</string> - <string name="LocationCtrlComboBtnTooltip">Historique de mes emplacements</string> - <string name="LocationCtrlForSaleTooltip">Acheter ce terrain</string> - <string name="LocationCtrlVoiceTooltip">Chat vocal indisponible ici</string> - <string name="LocationCtrlFlyTooltip">Vol interdit</string> - <string name="LocationCtrlPushTooltip">Pas de bousculades</string> - <string name="LocationCtrlBuildTooltip">Construction/placement d'objets interdit</string> - <string name="LocationCtrlScriptsTooltip">Scripts interdits</string> - <string name="LocationCtrlDamageTooltip">Santé</string> - <string name="LocationCtrlAdultIconTooltip">Région de type Adulte</string> - <string name="LocationCtrlModerateIconTooltip">Région de type Modéré</string> - <string name="LocationCtrlGeneralIconTooltip">Région de type Général</string> - <string name="LocationCtrlSeeAVsTooltip">Les avatars à l'extérieur de cette parcelle ne peuvent pas voir ni entendre les avatars qui se trouvent à l'intérieur.</string> - <string name="LocationCtrlPathfindingDirtyTooltip">Les objets mobiles risquent de ne pas se comporter correctement dans cette région tant qu'elle n'est pas refigée.</string> - <string name="LocationCtrlPathfindingDisabledTooltip">La recherche de chemin dynamique n'est pas activée dans cette région.</string> - <string name="UpdaterWindowTitle">[APP_NAME] - Mise à jour</string> - <string name="UpdaterNowUpdating">Mise à jour de [APP_NAME]...</string> - <string name="UpdaterNowInstalling">Installation de [APP_NAME]...</string> - <string name="UpdaterUpdatingDescriptive">Le client [APP_NAME] est en train d'être mis à jour. Cela peut prendre un certain temps, merci de votre patience.</string> - <string name="UpdaterProgressBarTextWithEllipses">Mise à jour en cours...</string> - <string name="UpdaterProgressBarText">Mise à jour en cours</string> - <string name="UpdaterFailDownloadTitle">Le téléchargement de la mise à jour a échoué</string> - <string name="UpdaterFailUpdateDescriptive">Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez télécharger la dernière version sur www.secondlife.com.</string> - <string name="UpdaterFailInstallTitle">L'installation de la mise à jour a échoué</string> - <string name="UpdaterFailStartTitle">Impossible de lancer le client</string> - <string name="ItemsComingInTooFastFrom">[APP_NAME] : transfert trop rapide des articles de [FROM_NAME] ; aperçu automatique désactivé pendant [TIME] secondes</string> - <string name="ItemsComingInTooFast">[APP_NAME] : transfert trop rapide des articles ; aperçu automatique désactivé pendant [TIME] secondes</string> - <string name="IM_logging_string">-- Archivage des IM activé --</string> - <string name="IM_typing_start_string">[NAME] est en train d'écrire...</string> - <string name="Unnamed">(sans nom)</string> - <string name="IM_moderated_chat_label">(Modéré : Voix désactivées par défaut)</string> - <string name="IM_unavailable_text_label">Le chat écrit n'est pas disponible pour cet appel.</string> - <string name="IM_muted_text_label">Votre chat écrit a été désactivé par un modérateur de groupe.</string> - <string name="IM_default_text_label">Cliquez ici pour envoyer un message instantané.</string> - <string name="IM_to_label">À</string> - <string name="IM_moderator_label">(Modérateur)</string> - <string name="Saved_message">(Enregistrement : [LONG_TIMESTAMP])</string> - <string name="IM_unblock_only_groups_friends">Pour afficher ce message, vous devez désactiver la case Seuls mes amis et groupes peuvent m'appeler ou m'envoyer un IM, sous Préférences/Confidentialité.</string> - <string name="OnlineStatus">En ligne</string> - <string name="OfflineStatus">Hors ligne</string> - <string name="not_online_msg">Utilisateur non connecté - le message sera enregistré et livré plus tard.</string> - <string name="not_online_inventory">Utilisateur non connecté - l'inventaire a été enregistré</string> - <string name="answered_call">Votre appel a fait l'objet d'une réponse</string> - <string name="you_started_call">Vous appelez.</string> - <string name="you_joined_call">Vous avez rejoint l'appel</string> - <string name="you_auto_rejected_call-im">Vous avez automatiquement refusé l'appel vocal quand le mode Ne pas déranger était activé.</string> - <string name="name_started_call">[NAME] appelle.</string> - <string name="ringing-im">En train de rejoindre l'appel...</string> - <string name="connected-im">Connecté(e), cliquez sur Quitter l'appel pour raccrocher</string> - <string name="hang_up-im">A quitté l'appel</string> - <string name="answering-im">Connexion en cours...</string> - <string name="conference-title">Chat à plusieurs</string> - <string name="conference-title-incoming">Conférence avec [AGENT_NAME]</string> - <string name="inventory_item_offered-im">Objet de l’inventaire [ITEM_NAME] offert</string> - <string name="inventory_folder_offered-im">Dossier de l’inventaire [ITEM_NAME] offert</string> - <string name="share_alert">Faire glisser les objets de l'inventaire ici</string> - <string name="facebook_post_success">Vous avez publié sur Facebook.</string> - <string name="flickr_post_success">Vous avez publié sur Flickr.</string> - <string name="twitter_post_success">Vous avez publié sur Twitter.</string> - <string name="no_session_message">(Session IM inexistante)</string> - <string name="only_user_message">Vous êtes le seul participant à cette session.</string> - <string name="offline_message">[NAME] est hors ligne.</string> - <string name="invite_message">Pour accepter ce chat vocal/vous connecter, cliquez sur le bouton [BUTTON NAME].</string> - <string name="muted_message">Vous ignorez ce résident. Si vous lui envoyez un message, il ne sera plus ignoré.</string> - <string name="generic">Erreur lors de la requête, veuillez réessayer ultérieurement.</string> - <string name="generic_request_error">Erreur lors de la requête, veuillez réessayer ultérieurement.</string> - <string name="insufficient_perms_error">Vous n'avez pas les droits requis.</string> - <string name="session_does_not_exist_error">La session a expiré</string> - <string name="no_ability_error">Vous n'avez pas ce pouvoir.</string> - <string name="no_ability">Vous n'avez pas ce pouvoir.</string> - <string name="not_a_mod_error">Vous n'êtes pas modérateur de session.</string> - <string name="muted">Un modérateur de groupe a désactivé votre chat écrit.</string> - <string name="muted_error">Un modérateur de groupe a désactivé votre chat écrit.</string> - <string name="add_session_event">Impossible d'ajouter des participants à la session de chat avec [RECIPIENT].</string> - <string name="message">Impossible d'envoyer votre message à la session de chat avec [RECIPIENT].</string> - <string name="message_session_event">Impossible d'envoyer votre message à la session de chat avec [RECIPIENT].</string> - <string name="mute">Erreur lors de la modération.</string> - <string name="removed">Vous avez été supprimé du groupe.</string> - <string name="removed_from_group">Vous avez été supprimé du groupe.</string> - <string name="close_on_no_ability">Vous ne pouvez plus participer à la session de chat.</string> - <string name="unread_chat_single">[SOURCES] a dit quelque chose de nouveau</string> - <string name="unread_chat_multiple">[SOURCES] ont dit quelque chose de nouveau</string> - <string name="session_initialization_timed_out_error">Expiration du délai d'initialisation de la session</string> - <string name="Home position set.">Emplacement du domicile défini.</string> - <string name="voice_morphing_url">https://secondlife.com/destination/voice-island</string> - <string name="premium_voice_morphing_url">https://secondlife.com/destination/voice-morphing-premium</string> - <string name="paid_you_ldollars">[NAME] vous a payé [AMOUNT] L$ [REASON].</string> - <string name="paid_you_ldollars_gift">[NAME] vous a payé [AMOUNT] L$ : [REASON]</string> - <string name="paid_you_ldollars_no_reason">[NAME] vous a payé [AMOUNT] L$.</string> - <string name="you_paid_ldollars">Vous avez payé à [AMOUNT] L$ [REASON].</string> - <string name="you_paid_ldollars_gift">Vous avez payé à [NAME] [AMOUNT] L$ : [REASON]</string> - <string name="you_paid_ldollars_no_info">Vous avez payé [AMOUNT] L$.</string> - <string name="you_paid_ldollars_no_reason">Vous avez payé à [NAME] [AMOUNT] L$.</string> - <string name="you_paid_ldollars_no_name">Vous avez payé à [AMOUNT] L$ [REASON].</string> - <string name="you_paid_failure_ldollars">Votre paiement de [AMOUNT] L$ à [NAME] [REASON] a échoué.</string> - <string name="you_paid_failure_ldollars_gift">Votre paiement de [AMOUNT] L$ à [NAME] a échoué : [REASON]</string> - <string name="you_paid_failure_ldollars_no_info">Votre paiement de [AMOUNT] L$ a échoué.</string> - <string name="you_paid_failure_ldollars_no_reason">Votre paiement de [AMOUNT] L$ à [NAME] a échoué.</string> - <string name="you_paid_failure_ldollars_no_name">Votre paiement de [AMOUNT] L$ [REASON] a échoué.</string> - <string name="for item">pour l'article suivant : [ITEM]</string> - <string name="for a parcel of land">pour une parcelle de terrain</string> - <string name="for a land access pass">pour un pass d'accès au terrain</string> - <string name="for deeding land">pour une cession de terrain</string> - <string name="to create a group">pour créer un groupe</string> - <string name="to join a group">pour rejoindre un groupe</string> - <string name="to upload">pour charger</string> - <string name="to publish a classified ad">pour publier une petite annonce</string> - <string name="giving">Donner [AMOUNT] L$</string> - <string name="uploading_costs">Le chargement coûte [AMOUNT] L$</string> - <string name="this_costs">Cela coûte [AMOUNT] L$</string> - <string name="buying_selected_land">Achat du terrain sélectionné pour [AMOUNT] L$</string> - <string name="this_object_costs">Cet objet coûte [AMOUNT] L$</string> - <string name="group_role_everyone">Tous</string> - <string name="group_role_officers">Officiers</string> - <string name="group_role_owners">Propriétaires</string> - <string name="group_member_status_online">En ligne</string> - <string name="uploading_abuse_report">Chargement... +Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. + </string> + <string name="5 O'Clock Shadow"> + Peu + </string> + <string name="All White"> + Tout blancs + </string> + <string name="Anime Eyes"> + Grand yeux + </string> + <string name="Arced"> + Arqués + </string> + <string name="Arm Length"> + Longueur des bras + </string> + <string name="Attached"> + Attachés + </string> + <string name="Attached Earlobes"> + Lobes + </string> + <string name="Back Fringe"> + Mèches de derrière + </string> + <string name="Baggy"> + Plus + </string> + <string name="Bangs"> + Frange + </string> + <string name="Beady Eyes"> + Yeux perçants + </string> + <string name="Belly Size"> + Taille du ventre + </string> + <string name="Big"> + Plus + </string> + <string name="Big Butt"> + Grosses fesses + </string> + <string name="Big Hair Back"> + Volume : Derrière + </string> + <string name="Big Hair Front"> + Volume : Devant + </string> + <string name="Big Hair Top"> + Volume : Haut + </string> + <string name="Big Head"> + Plus + </string> + <string name="Big Pectorals"> + Gros pectoraux + </string> + <string name="Big Spikes"> + Spikes + </string> + <string name="Black"> + Noir + </string> + <string name="Blonde"> + Blond + </string> + <string name="Blonde Hair"> + Cheveux blonds + </string> + <string name="Blush"> + Blush + </string> + <string name="Blush Color"> + Couleur du blush + </string> + <string name="Blush Opacity"> + Opacité du blush + </string> + <string name="Body Definition"> + Contour du corps + </string> + <string name="Body Fat"> + Graisse + </string> + <string name="Body Freckles"> + Grains de beauté + </string> + <string name="Body Thick"> + Plus + </string> + <string name="Body Thickness"> + Épaisseur du corps + </string> + <string name="Body Thin"> + Moins + </string> + <string name="Bow Legged"> + Jambes arquées + </string> + <string name="Breast Buoyancy"> + Hauteur des seins + </string> + <string name="Breast Cleavage"> + Clivage + </string> + <string name="Breast Size"> + Taille des seins + </string> + <string name="Bridge Width"> + Arête du nez + </string> + <string name="Broad"> + Large + </string> + <string name="Brow Size"> + Taille du front + </string> + <string name="Bug Eyes"> + Yeux globuleux + </string> + <string name="Bugged Eyes"> + Yeux globuleux + </string> + <string name="Bulbous"> + En bulbe + </string> + <string name="Bulbous Nose"> + Nez en bulbe + </string> + <string name="Breast Physics Mass"> + Masse des seins + </string> + <string name="Breast Physics Smoothing"> + Lissage des seins + </string> + <string name="Breast Physics Gravity"> + Gravité des seins + </string> + <string name="Breast Physics Drag"> + Résistance de l'air sur les seins + </string> + <string name="Breast Physics InOut Max Effect"> + Effet max. + </string> + <string name="Breast Physics InOut Spring"> + Élasticité + </string> + <string name="Breast Physics InOut Gain"> + Amplification + </string> + <string name="Breast Physics InOut Damping"> + Amortissement + </string> + <string name="Breast Physics UpDown Max Effect"> + Effet max. + </string> + <string name="Breast Physics UpDown Spring"> + Élasticité + </string> + <string name="Breast Physics UpDown Gain"> + Amplification + </string> + <string name="Breast Physics UpDown Damping"> + Amortissement + </string> + <string name="Breast Physics LeftRight Max Effect"> + Effet max. + </string> + <string name="Breast Physics LeftRight Spring"> + Élasticité + </string> + <string name="Breast Physics LeftRight Gain"> + Amplification + </string> + <string name="Breast Physics LeftRight Damping"> + Amortissement + </string> + <string name="Belly Physics Mass"> + Masse du ventre + </string> + <string name="Belly Physics Smoothing"> + Lissage du ventre + </string> + <string name="Belly Physics Gravity"> + Gravité du ventre + </string> + <string name="Belly Physics Drag"> + Résistance de l'air sur le ventre + </string> + <string name="Belly Physics UpDown Max Effect"> + Effet max. + </string> + <string name="Belly Physics UpDown Spring"> + Élasticité + </string> + <string name="Belly Physics UpDown Gain"> + Amplification + </string> + <string name="Belly Physics UpDown Damping"> + Amortissement + </string> + <string name="Butt Physics Mass"> + Masse des fesses + </string> + <string name="Butt Physics Smoothing"> + Lissage des fesses + </string> + <string name="Butt Physics Gravity"> + Gravité des fesses + </string> + <string name="Butt Physics Drag"> + Résistance de l'air sur les fesses + </string> + <string name="Butt Physics UpDown Max Effect"> + Effet max. + </string> + <string name="Butt Physics UpDown Spring"> + Élasticité + </string> + <string name="Butt Physics UpDown Gain"> + Amplification + </string> + <string name="Butt Physics UpDown Damping"> + Amortissement + </string> + <string name="Butt Physics LeftRight Max Effect"> + Effet max. + </string> + <string name="Butt Physics LeftRight Spring"> + Élasticité + </string> + <string name="Butt Physics LeftRight Gain"> + Amplification + </string> + <string name="Butt Physics LeftRight Damping"> + Amortissement + </string> + <string name="Bushy Eyebrows"> + Sourcils touffus + </string> + <string name="Bushy Hair"> + Beaucoup + </string> + <string name="Butt Size"> + Taille des fesses + </string> + <string name="Butt Gravity"> + Gravité des fesses + </string> + <string name="bustle skirt"> + Jupe gonflante + </string> + <string name="no bustle"> + Pas gonflante + </string> + <string name="more bustle"> + Plus gonflante + </string> + <string name="Chaplin"> + Moins + </string> + <string name="Cheek Bones"> + Pommettes + </string> + <string name="Chest Size"> + Taille de la poitrine + </string> + <string name="Chin Angle"> + Angle du menton + </string> + <string name="Chin Cleft"> + Fente du menton + </string> + <string name="Chin Curtains"> + Favoris + </string> + <string name="Chin Depth"> + Profondeur + </string> + <string name="Chin Heavy"> + Menton lourd + </string> + <string name="Chin In"> + Menton rentré + </string> + <string name="Chin Out"> + Menton sorti + </string> + <string name="Chin-Neck"> + Menton-cou + </string> + <string name="Clear"> + Clair + </string> + <string name="Cleft"> + Fendu + </string> + <string name="Close Set Eyes"> + Yeux rapprochés + </string> + <string name="Closed"> + Fermé(s) + </string> + <string name="Closed Back"> + Fermé à l'arrière + </string> + <string name="Closed Front"> + Fermé devant + </string> + <string name="Closed Left"> + Fermé à gauche + </string> + <string name="Closed Right"> + Fermé à droite + </string> + <string name="Coin Purse"> + Mini + </string> + <string name="Collar Back"> + Col arrière + </string> + <string name="Collar Front"> + Col devant + </string> + <string name="Corner Down"> + Coin vers le bas + </string> + <string name="Corner Up"> + Coin vers le haut + </string> + <string name="Creased"> + Fripée + </string> + <string name="Crooked Nose"> + Déviation du nez + </string> + <string name="Cuff Flare"> + Jambes + </string> + <string name="Dark"> + Sombre + </string> + <string name="Dark Green"> + Vert foncé + </string> + <string name="Darker"> + Plus foncé + </string> + <string name="Deep"> + Profonde + </string> + <string name="Default Heels"> + Talons par défaut + </string> + <string name="Dense"> + Dense + </string> + <string name="Double Chin"> + Double menton + </string> + <string name="Downturned"> + Pointant vers le bas + </string> + <string name="Duffle Bag"> + Maxi + </string> + <string name="Ear Angle"> + Angle de l'oreille + </string> + <string name="Ear Size"> + Taille + </string> + <string name="Ear Tips"> + Extrémités + </string> + <string name="Egg Head"> + Proéminence + </string> + <string name="Eye Bags"> + Cernes + </string> + <string name="Eye Color"> + Couleur des yeux + </string> + <string name="Eye Depth"> + Profondeur + </string> + <string name="Eye Lightness"> + Clarté + </string> + <string name="Eye Opening"> + Ouverture + </string> + <string name="Eye Pop"> + Å’il proéminent + </string> + <string name="Eye Size"> + Taille de l'Å“il + </string> + <string name="Eye Spacing"> + Espacement + </string> + <string name="Eyebrow Arc"> + Arc + </string> + <string name="Eyebrow Density"> + Épaisseur sourcils + </string> + <string name="Eyebrow Height"> + Hauteur + </string> + <string name="Eyebrow Points"> + Direction + </string> + <string name="Eyebrow Size"> + Taille + </string> + <string name="Eyelash Length"> + Longueur des cils + </string> + <string name="Eyeliner"> + Eyeliner + </string> + <string name="Eyeliner Color"> + Couleur de l'eyeliner + </string> + <string name="Eyes Bugged"> + Yeux globuleux + </string> + <string name="Face Shear"> + Visage + </string> + <string name="Facial Definition"> + Définition + </string> + <string name="Far Set Eyes"> + Yeux écartés + </string> + <string name="Fat Lips"> + Lèvres épaisses + </string> + <string name="Female"> + Femme + </string> + <string name="Fingerless"> + Sans doigts + </string> + <string name="Fingers"> + Doigts + </string> + <string name="Flared Cuffs"> + Jambes larges + </string> + <string name="Flat"> + Moins + </string> + <string name="Flat Butt"> + Fesses plates + </string> + <string name="Flat Head"> + Tête plate + </string> + <string name="Flat Toe"> + Orteil plat + </string> + <string name="Foot Size"> + Pointure + </string> + <string name="Forehead Angle"> + Angle du front + </string> + <string name="Forehead Heavy"> + Front lourd + </string> + <string name="Freckles"> + Tâches de rousseur + </string> + <string name="Front Fringe"> + Mèches de devant + </string> + <string name="Full Back"> + Arrière touffu + </string> + <string name="Full Eyeliner"> + Eyeliner marqué + </string> + <string name="Full Front"> + Devant touffu + </string> + <string name="Full Hair Sides"> + Côtés touffus + </string> + <string name="Full Sides"> + Côtés touffus + </string> + <string name="Glossy"> + Brillant + </string> + <string name="Glove Fingers"> + Gants avec doigts + </string> + <string name="Glove Length"> + Longueur + </string> + <string name="Hair"> + Cheveux + </string> + <string name="Hair Back"> + Cheveux : Derrière + </string> + <string name="Hair Front"> + Cheveux : Devant + </string> + <string name="Hair Sides"> + Cheveux : Côtés + </string> + <string name="Hair Sweep"> + Sens de la coiffure + </string> + <string name="Hair Thickess"> + Épaisseur cheveux + </string> + <string name="Hair Thickness"> + Épaisseur cheveux + </string> + <string name="Hair Tilt"> + Inclinaison + </string> + <string name="Hair Tilted Left"> + Vers la gauche + </string> + <string name="Hair Tilted Right"> + Vers la droite + </string> + <string name="Hair Volume"> + Cheveux : Volume + </string> + <string name="Hand Size"> + Taille de la main + </string> + <string name="Handlebars"> + Plus + </string> + <string name="Head Length"> + Longueur + </string> + <string name="Head Shape"> + Forme + </string> + <string name="Head Size"> + Taille + </string> + <string name="Head Stretch"> + Allongement + </string> + <string name="Heel Height"> + Talons + </string> + <string name="Heel Shape"> + Forme des talons + </string> + <string name="Height"> + Taille + </string> + <string name="High"> + Haut + </string> + <string name="High Heels"> + Talons hauts + </string> + <string name="High Jaw"> + Haut + </string> + <string name="High Platforms"> + Haute + </string> + <string name="High and Tight"> + Haut et serré + </string> + <string name="Higher"> + Plus élevé + </string> + <string name="Hip Length"> + Longueur hanche + </string> + <string name="Hip Width"> + Largeur hanche + </string> + <string name="Hover"> + Survol + </string> + <string name="In"> + Rentré + </string> + <string name="In Shdw Color"> + Couleur ombre interne + </string> + <string name="In Shdw Opacity"> + Opacité ombre interne + </string> + <string name="Inner Eye Corner"> + Coin interne + </string> + <string name="Inner Eye Shadow"> + Ombre de l'Å“il interne + </string> + <string name="Inner Shadow"> + Ombre interne + </string> + <string name="Jacket Length"> + Longueur de la veste + </string> + <string name="Jacket Wrinkles"> + Plis de la veste + </string> + <string name="Jaw Angle"> + Angle mâchoire + </string> + <string name="Jaw Jut"> + Saillie mâchoire + </string> + <string name="Jaw Shape"> + Mâchoire + </string> + <string name="Join"> + Rapprochés + </string> + <string name="Jowls"> + Bajoues + </string> + <string name="Knee Angle"> + Angle du genou + </string> + <string name="Knock Kneed"> + Genoux rapprochés + </string> + <string name="Large"> + Plus + </string> + <string name="Large Hands"> + Grandes mains + </string> + <string name="Left Part"> + Raie à gauche + </string> + <string name="Leg Length"> + Longueur + </string> + <string name="Leg Muscles"> + Muscles + </string> + <string name="Less"> + Moins + </string> + <string name="Less Body Fat"> + Moins + </string> + <string name="Less Curtains"> + Moins + </string> + <string name="Less Freckles"> + Moins + </string> + <string name="Less Full"> + Moins + </string> + <string name="Less Gravity"> + Moins + </string> + <string name="Less Love"> + Moins + </string> + <string name="Less Muscles"> + Moins + </string> + <string name="Less Muscular"> + Moins + </string> + <string name="Less Rosy"> + Moins + </string> + <string name="Less Round"> + Moins ronde + </string> + <string name="Less Saddle"> + Moins + </string> + <string name="Less Square"> + Moins carrée + </string> + <string name="Less Volume"> + Moins + </string> + <string name="Less soul"> + Moins + </string> + <string name="Lighter"> + Plus léger + </string> + <string name="Lip Cleft"> + Fente labiale + </string> + <string name="Lip Cleft Depth"> + Prof. fente labiale + </string> + <string name="Lip Fullness"> + Volume des lèvres + </string> + <string name="Lip Pinkness"> + Rougeur des lèvres + </string> + <string name="Lip Ratio"> + Proportion des lèvres + </string> + <string name="Lip Thickness"> + Épaisseur + </string> + <string name="Lip Width"> + Largeur + </string> + <string name="Lipgloss"> + Brillant à lèvres + </string> + <string name="Lipstick"> + Rouge à lèvres + </string> + <string name="Lipstick Color"> + Couleur du rouge à lèvres + </string> + <string name="Long"> + Plus + </string> + <string name="Long Head"> + Tête longue + </string> + <string name="Long Hips"> + Hanches longues + </string> + <string name="Long Legs"> + Jambes longues + </string> + <string name="Long Neck"> + Long cou + </string> + <string name="Long Pigtails"> + Longues couettes + </string> + <string name="Long Ponytail"> + Longue queue de cheval + </string> + <string name="Long Torso"> + Torse long + </string> + <string name="Long arms"> + Bras longs + </string> + <string name="Loose Pants"> + Pantalons amples + </string> + <string name="Loose Shirt"> + Chemise ample + </string> + <string name="Loose Sleeves"> + Manches amples + </string> + <string name="Love Handles"> + Poignées d'amour + </string> + <string name="Low"> + Bas + </string> + <string name="Low Heels"> + Talons bas + </string> + <string name="Low Jaw"> + Bas + </string> + <string name="Low Platforms"> + Basse + </string> + <string name="Low and Loose"> + Bas et ample + </string> + <string name="Lower"> + Abaisser + </string> + <string name="Lower Bridge"> + Arête inférieure + </string> + <string name="Lower Cheeks"> + Joue inférieure + </string> + <string name="Male"> + Homme + </string> + <string name="Middle Part"> + Raie au milieu + </string> + <string name="More"> + Plus + </string> + <string name="More Blush"> + Plus + </string> + <string name="More Body Fat"> + Plus + </string> + <string name="More Curtains"> + Plus + </string> + <string name="More Eyeshadow"> + Plus + </string> + <string name="More Freckles"> + Plus + </string> + <string name="More Full"> + Plus + </string> + <string name="More Gravity"> + Plus + </string> + <string name="More Lipstick"> + Plus + </string> + <string name="More Love"> + Plus + </string> + <string name="More Lower Lip"> + Inférieure plus grosse + </string> + <string name="More Muscles"> + Plus + </string> + <string name="More Muscular"> + Plus + </string> + <string name="More Rosy"> + Plus + </string> + <string name="More Round"> + Plus + </string> + <string name="More Saddle"> + Plus + </string> + <string name="More Sloped"> + Plus + </string> + <string name="More Square"> + Plus + </string> + <string name="More Upper Lip"> + Supérieure plus grosse + </string> + <string name="More Vertical"> + Plus + </string> + <string name="More Volume"> + Plus + </string> + <string name="More soul"> + Plus + </string> + <string name="Moustache"> + Moustache + </string> + <string name="Mouth Corner"> + Coin de la bouche + </string> + <string name="Mouth Position"> + Position + </string> + <string name="Mowhawk"> + Mowhawk + </string> + <string name="Muscular"> + Musclé + </string> + <string name="Mutton Chops"> + Longs + </string> + <string name="Nail Polish"> + Vernis à ongles + </string> + <string name="Nail Polish Color"> + Couleur du vernis + </string> + <string name="Narrow"> + Moins + </string> + <string name="Narrow Back"> + Arrière étroit + </string> + <string name="Narrow Front"> + Devant étroit + </string> + <string name="Narrow Lips"> + Lèvres étroites + </string> + <string name="Natural"> + Naturel + </string> + <string name="Neck Length"> + Longueur du cou + </string> + <string name="Neck Thickness"> + Épaisseur du cou + </string> + <string name="No Blush"> + Pas de blush + </string> + <string name="No Eyeliner"> + Pas d'eyeliner + </string> + <string name="No Eyeshadow"> + Pas d'ombre à paupières + </string> + <string name="No Lipgloss"> + Pas de brillant à lèvres + </string> + <string name="No Lipstick"> + Pas de rouge à lèvres + </string> + <string name="No Part"> + Pas de raie + </string> + <string name="No Polish"> + Pas de vernis + </string> + <string name="No Red"> + Pas de rouge + </string> + <string name="No Spikes"> + Pas de spikes + </string> + <string name="No White"> + Pas de blanc + </string> + <string name="No Wrinkles"> + Pas de rides + </string> + <string name="Normal Lower"> + Normal plus bas + </string> + <string name="Normal Upper"> + Normal plus haut + </string> + <string name="Nose Left"> + Nez à gauche + </string> + <string name="Nose Right"> + Nez à droite + </string> + <string name="Nose Size"> + Taille du nez + </string> + <string name="Nose Thickness"> + Épaisseur du nez + </string> + <string name="Nose Tip Angle"> + Angle bout du nez + </string> + <string name="Nose Tip Shape"> + Forme bout du nez + </string> + <string name="Nose Width"> + Largeur du nez + </string> + <string name="Nostril Division"> + Division narines + </string> + <string name="Nostril Width"> + Largeur narines + </string> + <string name="Opaque"> + Opaque + </string> + <string name="Open"> + Ouvert + </string> + <string name="Open Back"> + Derrière ouvert + </string> + <string name="Open Front"> + Devant ouvert + </string> + <string name="Open Left"> + Ouvert à gauche + </string> + <string name="Open Right"> + Ouvert à droite + </string> + <string name="Orange"> + Orange + </string> + <string name="Out"> + Sorti + </string> + <string name="Out Shdw Color"> + Couleur de l'ombre externe + </string> + <string name="Out Shdw Opacity"> + Opacité de l'ombre externe + </string> + <string name="Outer Eye Corner"> + Coin externe + </string> + <string name="Outer Eye Shadow"> + Ombre de l'Å“il externe + </string> + <string name="Outer Shadow"> + Ombre externe + </string> + <string name="Overbite"> + Rentrée + </string> + <string name="Package"> + Parties + </string> + <string name="Painted Nails"> + Ongles vernis + </string> + <string name="Pale"> + Pâle + </string> + <string name="Pants Crotch"> + Entrejambe + </string> + <string name="Pants Fit"> + Taille + </string> + <string name="Pants Length"> + Longueur + </string> + <string name="Pants Waist"> + Taille + </string> + <string name="Pants Wrinkles"> + Plis + </string> + <string name="Part"> + Raie + </string> + <string name="Part Bangs"> + Séparation frange + </string> + <string name="Pectorals"> + Pectoraux + </string> + <string name="Pigment"> + Pigmentation + </string> + <string name="Pigtails"> + Couettes + </string> + <string name="Pink"> + Rose + </string> + <string name="Pinker"> + Plus rose + </string> + <string name="Platform Height"> + Platef. (hauteur) + </string> + <string name="Platform Width"> + Platef. (largeur) + </string> + <string name="Pointy"> + Pointue + </string> + <string name="Pointy Heels"> + Talons pointus + </string> + <string name="Ponytail"> + Queue de cheval + </string> + <string name="Poofy Skirt"> + Jupe bouffante + </string> + <string name="Pop Left Eye"> + Å’il gauche saillant + </string> + <string name="Pop Right Eye"> + Å’il droit saillant + </string> + <string name="Puffy"> + Plus + </string> + <string name="Puffy Eyelids"> + Paup. gonflées + </string> + <string name="Rainbow Color"> + Couleur arc en ciel + </string> + <string name="Red Hair"> + Cheveux roux + </string> + <string name="Regular"> + Standard + </string> + <string name="Right Part"> + Raie à droite + </string> + <string name="Rosy Complexion"> + Teint rosé + </string> + <string name="Round"> + Rond + </string> + <string name="Ruddiness"> + Rougeur + </string> + <string name="Ruddy"> + Rouge + </string> + <string name="Rumpled Hair"> + Texture + </string> + <string name="Saddle Bags"> + Culotte de cheval + </string> + <string name="Scrawny Leg"> + Jambes maigres + </string> + <string name="Separate"> + Séparés + </string> + <string name="Shallow"> + Creux + </string> + <string name="Shear Back"> + Coupe derrière + </string> + <string name="Shear Face"> + Visage + </string> + <string name="Shear Front"> + Front + </string> + <string name="Shear Left Up"> + Haut gauche décalé + </string> + <string name="Shear Right Up"> + Haut droit décalé + </string> + <string name="Sheared Back"> + Dégagé derrière + </string> + <string name="Sheared Front"> + Dégagé devant + </string> + <string name="Shift Left"> + Vers la gauche + </string> + <string name="Shift Mouth"> + Déplacement + </string> + <string name="Shift Right"> + Vers la droite + </string> + <string name="Shirt Bottom"> + Chemise + </string> + <string name="Shirt Fit"> + Taille + </string> + <string name="Shirt Wrinkles"> + Plis + </string> + <string name="Shoe Height"> + Hauteur + </string> + <string name="Short"> + Moins + </string> + <string name="Short Arms"> + Bras courts + </string> + <string name="Short Legs"> + Jambes courtes + </string> + <string name="Short Neck"> + Petit cou + </string> + <string name="Short Pigtails"> + Couettes courtes + </string> + <string name="Short Ponytail"> + Queue de cheval courte + </string> + <string name="Short Sideburns"> + Court + </string> + <string name="Short Torso"> + Torse court + </string> + <string name="Short hips"> + Hanches courtes + </string> + <string name="Shoulders"> + Épaules + </string> + <string name="Side Fringe"> + Mèches sur le côté + </string> + <string name="Sideburns"> + Favoris + </string> + <string name="Sides Hair"> + Cheveux sur le côté + </string> + <string name="Sides Hair Down"> + Cheveux sur le côté en bas + </string> + <string name="Sides Hair Up"> + Cheveux sur le côté en haut + </string> + <string name="Skinny Neck"> + Cou maigre + </string> + <string name="Skirt Fit"> + Taille jupe + </string> + <string name="Skirt Length"> + Longueur jupe + </string> + <string name="Slanted Forehead"> + Front incliné + </string> + <string name="Sleeve Length"> + Longueur manche + </string> + <string name="Sleeve Looseness"> + Ampleur manche + </string> + <string name="Slit Back"> + Fente : Derrière + </string> + <string name="Slit Front"> + Fente : Devant + </string> + <string name="Slit Left"> + Fente : Gauche + </string> + <string name="Slit Right"> + Fente : Droite + </string> + <string name="Small"> + Moins + </string> + <string name="Small Hands"> + Petites mains + </string> + <string name="Small Head"> + Moins + </string> + <string name="Smooth"> + Moins + </string> + <string name="Smooth Hair"> + Cheveux lisses + </string> + <string name="Socks Length"> + Longueur + </string> + <string name="Soulpatch"> + Barbichette + </string> + <string name="Sparse"> + Rares + </string> + <string name="Spiked Hair"> + Mèches en pointe + </string> + <string name="Square"> + Carrée + </string> + <string name="Square Toe"> + Orteil carré + </string> + <string name="Squash Head"> + Écraser la tête + </string> + <string name="Stretch Head"> + Allonger la tête + </string> + <string name="Sunken"> + Saillante + </string> + <string name="Sunken Chest"> + Poitrine enfoncée + </string> + <string name="Sunken Eyes"> + Yeux enfoncés + </string> + <string name="Sweep Back"> + En arrière + </string> + <string name="Sweep Forward"> + Vers l'avant + </string> + <string name="Tall"> + Plus + </string> + <string name="Taper Back"> + Arrière + </string> + <string name="Taper Front"> + Avant + </string> + <string name="Thick Heels"> + Talons épais + </string> + <string name="Thick Neck"> + Cou épais + </string> + <string name="Thick Toe"> + Orteil épais + </string> + <string name="Thin"> + Mince + </string> + <string name="Thin Eyebrows"> + Sourcils fins + </string> + <string name="Thin Lips"> + Lèvres fines + </string> + <string name="Thin Nose"> + Nez fin + </string> + <string name="Tight Chin"> + Menton fin + </string> + <string name="Tight Cuffs"> + Jambes serrées + </string> + <string name="Tight Pants"> + Pantalons serrés + </string> + <string name="Tight Shirt"> + Chemise serrée + </string> + <string name="Tight Skirt"> + Jupe serrée + </string> + <string name="Tight Sleeves"> + Manches serrées + </string> + <string name="Toe Shape"> + Forme de l'orteil + </string> + <string name="Toe Thickness"> + Épaisseur orteil + </string> + <string name="Torso Length"> + Longueur du torse + </string> + <string name="Torso Muscles"> + Muscles du torse + </string> + <string name="Torso Scrawny"> + Torse maigre + </string> + <string name="Unattached"> + Séparés + </string> + <string name="Uncreased"> + Lisse + </string> + <string name="Underbite"> + Sortie + </string> + <string name="Unnatural"> + Artificiel + </string> + <string name="Upper Bridge"> + Arête supérieure + </string> + <string name="Upper Cheeks"> + Joue supérieure + </string> + <string name="Upper Chin Cleft"> + Menton supérieur + </string> + <string name="Upper Eyelid Fold"> + Paupière sup. + </string> + <string name="Upturned"> + En trompette + </string> + <string name="Very Red"> + Très rouge + </string> + <string name="Waist Height"> + Hauteur taille + </string> + <string name="Well-Fed"> + Ronde + </string> + <string name="White Hair"> + Cheveux blancs + </string> + <string name="Wide"> + Plus + </string> + <string name="Wide Back"> + Derrière large + </string> + <string name="Wide Front"> + Devant large + </string> + <string name="Wide Lips"> + Lèvres larges + </string> + <string name="Wild"> + Artificiel + </string> + <string name="Wrinkles"> + Rides + </string> + <string name="LocationCtrlAddLandmarkTooltip"> + Ajouter à mes repères + </string> + <string name="LocationCtrlEditLandmarkTooltip"> + Modifier mon repère + </string> + <string name="LocationCtrlInfoBtnTooltip"> + En savoir plus sur l'emplacement actuel + </string> + <string name="LocationCtrlComboBtnTooltip"> + Historique de mes emplacements + </string> + <string name="LocationCtrlForSaleTooltip"> + Acheter ce terrain + </string> + <string name="LocationCtrlVoiceTooltip"> + Chat vocal indisponible ici + </string> + <string name="LocationCtrlFlyTooltip"> + Vol interdit + </string> + <string name="LocationCtrlPushTooltip"> + Pas de bousculades + </string> + <string name="LocationCtrlBuildTooltip"> + Construction/placement d'objets interdit + </string> + <string name="LocationCtrlScriptsTooltip"> + Scripts interdits + </string> + <string name="LocationCtrlDamageTooltip"> + Santé + </string> + <string name="LocationCtrlAdultIconTooltip"> + Région de type Adulte + </string> + <string name="LocationCtrlModerateIconTooltip"> + Région de type Modéré + </string> + <string name="LocationCtrlGeneralIconTooltip"> + Région de type Général + </string> + <string name="LocationCtrlSeeAVsTooltip"> + Les avatars à l'extérieur de cette parcelle ne peuvent pas voir ni entendre les avatars qui se trouvent à l'intérieur. + </string> + <string name="LocationCtrlPathfindingDirtyTooltip"> + Les objets mobiles risquent de ne pas se comporter correctement dans cette région tant qu'elle n'est pas refigée. + </string> + <string name="LocationCtrlPathfindingDisabledTooltip"> + La recherche de chemin dynamique n'est pas activée dans cette région. + </string> + <string name="UpdaterWindowTitle"> + [APP_NAME] - Mise à jour + </string> + <string name="UpdaterNowUpdating"> + Mise à jour de [APP_NAME]... + </string> + <string name="UpdaterNowInstalling"> + Installation de [APP_NAME]... + </string> + <string name="UpdaterUpdatingDescriptive"> + Le client [APP_NAME] est en train d'être mis à jour. Cela peut prendre un certain temps, merci de votre patience. + </string> + <string name="UpdaterProgressBarTextWithEllipses"> + Mise à jour en cours... + </string> + <string name="UpdaterProgressBarText"> + Mise à jour en cours + </string> + <string name="UpdaterFailDownloadTitle"> + Le téléchargement de la mise à jour a échoué + </string> + <string name="UpdaterFailUpdateDescriptive"> + Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez télécharger la dernière version sur www.secondlife.com. + </string> + <string name="UpdaterFailInstallTitle"> + L'installation de la mise à jour a échoué + </string> + <string name="UpdaterFailStartTitle"> + Impossible de lancer le client + </string> + <string name="ItemsComingInTooFastFrom"> + [APP_NAME] : transfert trop rapide des articles de [FROM_NAME] ; aperçu automatique désactivé pendant [TIME] secondes + </string> + <string name="ItemsComingInTooFast"> + [APP_NAME] : transfert trop rapide des articles ; aperçu automatique désactivé pendant [TIME] secondes + </string> + <string name="IM_logging_string"> + -- Archivage des IM activé -- + </string> + <string name="IM_typing_start_string"> + [NAME] est en train d'écrire... + </string> + <string name="Unnamed"> + (sans nom) + </string> + <string name="IM_moderated_chat_label"> + (Modéré : Voix désactivées par défaut) + </string> + <string name="IM_unavailable_text_label"> + Le chat écrit n'est pas disponible pour cet appel. + </string> + <string name="IM_muted_text_label"> + Votre chat écrit a été désactivé par un modérateur de groupe. + </string> + <string name="IM_default_text_label"> + Cliquez ici pour envoyer un message instantané. + </string> + <string name="IM_to_label"> + À + </string> + <string name="IM_moderator_label"> + (Modérateur) + </string> + <string name="Saved_message"> + (Enregistrement : [LONG_TIMESTAMP]) + </string> + <string name="IM_unblock_only_groups_friends"> + Pour afficher ce message, vous devez désactiver la case Seuls mes amis et groupes peuvent m'appeler ou m'envoyer un IM, sous Préférences/Confidentialité. + </string> + <string name="OnlineStatus"> + En ligne + </string> + <string name="OfflineStatus"> + Hors ligne + </string> + <string name="not_online_msg"> + Utilisateur non connecté - le message sera enregistré et livré plus tard. + </string> + <string name="not_online_inventory"> + Utilisateur non connecté - l'inventaire a été enregistré + </string> + <string name="answered_call"> + Votre appel a fait l'objet d'une réponse + </string> + <string name="you_started_call"> + Vous appelez. + </string> + <string name="you_joined_call"> + Vous avez rejoint l'appel + </string> + <string name="you_auto_rejected_call-im"> + Vous avez automatiquement refusé l'appel vocal quand le mode Ne pas déranger était activé. + </string> + <string name="name_started_call"> + [NAME] appelle. + </string> + <string name="ringing-im"> + En train de rejoindre l'appel... + </string> + <string name="connected-im"> + Connecté(e), cliquez sur Quitter l'appel pour raccrocher + </string> + <string name="hang_up-im"> + A quitté l'appel + </string> + <string name="answering-im"> + Connexion en cours... + </string> + <string name="conference-title"> + Chat à plusieurs + </string> + <string name="conference-title-incoming"> + Conférence avec [AGENT_NAME] + </string> + <string name="inventory_item_offered-im"> + Objet de l’inventaire [ITEM_NAME] offert + </string> + <string name="inventory_folder_offered-im"> + Dossier de l’inventaire [ITEM_NAME] offert + </string> + <string name="bot_warning"> + Vous discutez avec un bot, [NAME]. Ne partagez pas d’informations personnelles. +En savoir plus sur https://second.life/scripted-agents. + </string> + <string name="share_alert"> + Faire glisser les objets de l'inventaire ici + </string> + <string name="facebook_post_success"> + Vous avez publié sur Facebook. + </string> + <string name="flickr_post_success"> + Vous avez publié sur Flickr. + </string> + <string name="twitter_post_success"> + Vous avez publié sur Twitter. + </string> + <string name="no_session_message"> + (Session IM inexistante) + </string> + <string name="only_user_message"> + Vous êtes le seul participant à cette session. + </string> + <string name="offline_message"> + [NAME] est hors ligne. + </string> + <string name="invite_message"> + Pour accepter ce chat vocal/vous connecter, cliquez sur le bouton [BUTTON NAME]. + </string> + <string name="muted_message"> + Vous ignorez ce résident. Si vous lui envoyez un message, il ne sera plus ignoré. + </string> + <string name="generic"> + Erreur lors de la requête, veuillez réessayer ultérieurement. + </string> + <string name="generic_request_error"> + Erreur lors de la requête, veuillez réessayer ultérieurement. + </string> + <string name="insufficient_perms_error"> + Vous n'avez pas les droits requis. + </string> + <string name="session_does_not_exist_error"> + La session a expiré + </string> + <string name="no_ability_error"> + Vous n'avez pas ce pouvoir. + </string> + <string name="no_ability"> + Vous n'avez pas ce pouvoir. + </string> + <string name="not_a_mod_error"> + Vous n'êtes pas modérateur de session. + </string> + <string name="muted"> + Un modérateur de groupe a désactivé votre chat écrit. + </string> + <string name="muted_error"> + Un modérateur de groupe a désactivé votre chat écrit. + </string> + <string name="add_session_event"> + Impossible d'ajouter des participants à la session de chat avec [RECIPIENT]. + </string> + <string name="message"> + Impossible d'envoyer votre message à la session de chat avec [RECIPIENT]. + </string> + <string name="message_session_event"> + Impossible d'envoyer votre message à la session de chat avec [RECIPIENT]. + </string> + <string name="mute"> + Erreur lors de la modération. + </string> + <string name="removed"> + Vous avez été supprimé du groupe. + </string> + <string name="removed_from_group"> + Vous avez été supprimé du groupe. + </string> + <string name="close_on_no_ability"> + Vous ne pouvez plus participer à la session de chat. + </string> + <string name="unread_chat_single"> + [SOURCES] a dit quelque chose de nouveau + </string> + <string name="unread_chat_multiple"> + [SOURCES] ont dit quelque chose de nouveau + </string> + <string name="session_initialization_timed_out_error"> + Expiration du délai d'initialisation de la session + </string> + <string name="Home position set."> + Emplacement du domicile défini. + </string> + <string name="voice_morphing_url"> + https://secondlife.com/destination/voice-island + </string> + <string name="premium_voice_morphing_url"> + https://secondlife.com/destination/voice-morphing-premium + </string> + <string name="paid_you_ldollars"> + [NAME] vous a payé [AMOUNT] L$ [REASON]. + </string> + <string name="paid_you_ldollars_gift"> + [NAME] vous a payé [AMOUNT] L$ : [REASON] + </string> + <string name="paid_you_ldollars_no_reason"> + [NAME] vous a payé [AMOUNT] L$. + </string> + <string name="you_paid_ldollars"> + Vous avez payé à [AMOUNT] L$ [REASON]. + </string> + <string name="you_paid_ldollars_gift"> + Vous avez payé à [NAME] [AMOUNT] L$ : [REASON] + </string> + <string name="you_paid_ldollars_no_info"> + Vous avez payé [AMOUNT] L$. + </string> + <string name="you_paid_ldollars_no_reason"> + Vous avez payé à [NAME] [AMOUNT] L$. + </string> + <string name="you_paid_ldollars_no_name"> + Vous avez payé à [AMOUNT] L$ [REASON]. + </string> + <string name="you_paid_failure_ldollars"> + Votre paiement de [AMOUNT] L$ à [NAME] [REASON] a échoué. + </string> + <string name="you_paid_failure_ldollars_gift"> + Votre paiement de [AMOUNT] L$ à [NAME] a échoué : [REASON] + </string> + <string name="you_paid_failure_ldollars_no_info"> + Votre paiement de [AMOUNT] L$ a échoué. + </string> + <string name="you_paid_failure_ldollars_no_reason"> + Votre paiement de [AMOUNT] L$ à [NAME] a échoué. + </string> + <string name="you_paid_failure_ldollars_no_name"> + Votre paiement de [AMOUNT] L$ [REASON] a échoué. + </string> + <string name="for item"> + pour l'article suivant : [ITEM] + </string> + <string name="for a parcel of land"> + pour une parcelle de terrain + </string> + <string name="for a land access pass"> + pour un pass d'accès au terrain + </string> + <string name="for deeding land"> + pour une cession de terrain + </string> + <string name="to create a group"> + pour créer un groupe + </string> + <string name="to join a group"> + pour rejoindre un groupe + </string> + <string name="to upload"> + pour charger + </string> + <string name="to publish a classified ad"> + pour publier une petite annonce + </string> + <string name="giving"> + Donner [AMOUNT] L$ + </string> + <string name="uploading_costs"> + Le chargement coûte [AMOUNT] L$ + </string> + <string name="this_costs"> + Cela coûte [AMOUNT] L$ + </string> + <string name="buying_selected_land"> + Achat du terrain sélectionné pour [AMOUNT] L$ + </string> + <string name="this_object_costs"> + Cet objet coûte [AMOUNT] L$ + </string> + <string name="group_role_everyone"> + Tous + </string> + <string name="group_role_officers"> + Officiers + </string> + <string name="group_role_owners"> + Propriétaires + </string> + <string name="group_member_status_online"> + En ligne + </string> + <string name="uploading_abuse_report"> + Chargement... -du rapport d'infraction</string> - <string name="New Shape">Nouvelle silhouette</string> - <string name="New Skin">Nouvelle peau</string> - <string name="New Hair">Nouveaux cheveux</string> - <string name="New Eyes">Nouveaux yeux</string> - <string name="New Shirt">Nouvelle chemise</string> - <string name="New Pants">Nouveau pantalon</string> - <string name="New Shoes">Nouvelles chaussures</string> - <string name="New Socks">Nouvelles chaussettes</string> - <string name="New Jacket">Nouvelle veste</string> - <string name="New Gloves">Nouveaux gants</string> - <string name="New Undershirt">Nouveau débardeur</string> - <string name="New Underpants">Nouveau caleçon</string> - <string name="New Skirt">Nouvelle jupe</string> - <string name="New Alpha">Nouvel alpha</string> - <string name="New Tattoo">Nouveau tatouage</string> - <string name="New Universal">Nouvel environnement universel</string> - <string name="New Physics">Nouvelles propriétés physiques</string> - <string name="Invalid Wearable">Objet à porter non valide</string> - <string name="New Gesture">Nouveau geste</string> - <string name="New Script">Nouveau script</string> - <string name="New Note">Nouvelle note</string> - <string name="New Folder">Nouveau dossier</string> - <string name="Contents">Contenus</string> - <string name="Gesture">Geste</string> - <string name="Male Gestures">Gestes masculins</string> - <string name="Female Gestures">Gestes féminins</string> - <string name="Other Gestures">Autres gestes</string> - <string name="Speech Gestures">Gestes liés à la parole</string> - <string name="Common Gestures">Gestes communs</string> - <string name="Male - Excuse me">Homme - Demander pardon</string> - <string name="Male - Get lost">Homme - Get lost</string> - <string name="Male - Blow kiss">Homme - Envoyer un baiser</string> - <string name="Male - Boo">Homme - Hou !</string> - <string name="Male - Bored">Homme - Ennui</string> - <string name="Male - Hey">Homme - Hé !</string> - <string name="Male - Laugh">Homme - Rire</string> - <string name="Male - Repulsed">Homme - Dégoût</string> - <string name="Male - Shrug">Homme - Hausser les épaules</string> - <string name="Male - Stick tougue out">Homme - Tirer la langue</string> - <string name="Male - Wow">Homme - Ouah !</string> - <string name="Female - Chuckle">Femme - Glousser</string> - <string name="Female - Cry">Femme - Pleurer</string> - <string name="Female - Embarrassed">Femme - Gêne</string> - <string name="Female - Excuse me">Femme - Demander pardon</string> - <string name="Female - Get lost">Femme - Get lost</string> - <string name="Female - Blow kiss">Femme - Envoyer un baiser</string> - <string name="Female - Boo">Femme - Hou !</string> - <string name="Female - Bored">Femme - Ennui</string> - <string name="Female - Hey">Femme - Hé !</string> - <string name="Female - Hey baby">Femme - Hey baby</string> - <string name="Female - Laugh">Femme - Rire</string> - <string name="Female - Looking good">Femme - Looking good</string> - <string name="Female - Over here">Femme - Over here</string> - <string name="Female - Please">Femme - Please</string> - <string name="Female - Repulsed">Femme - Dégoût</string> - <string name="Female - Shrug">Femme - Hausser les épaules</string> - <string name="Female - Stick tougue out">Femme - Tirer la langue</string> - <string name="Female - Wow">Femme - Ouah !</string> - <string name="New Daycycle">Nouveau cycle du jour</string> - <string name="New Water">Nouvelle eau</string> - <string name="New Sky">Nouveau ciel</string> - <string name="/bow">/s'incliner</string> - <string name="/clap">/applaudir</string> - <string name="/count">/compter</string> - <string name="/extinguish">/éteindre</string> - <string name="/kmb">/vatefairevoir</string> - <string name="/muscle">/montrersesmuscles</string> - <string name="/no">/non</string> - <string name="/no!">/non !</string> - <string name="/paper">/papier</string> - <string name="/pointme">/memontrerdudoigt</string> - <string name="/pointyou">/montrerl'autredudoigt</string> - <string name="/rock">/pierre</string> - <string name="/scissor">/ciseaux</string> - <string name="/smoke">/fumer</string> - <string name="/stretch">/bailler</string> - <string name="/whistle">/siffler</string> - <string name="/yes">/oui</string> - <string name="/yes!">/oui !</string> - <string name="afk">absent</string> - <string name="dance1">danse1</string> - <string name="dance2">danse2</string> - <string name="dance3">danse3</string> - <string name="dance4">danse4</string> - <string name="dance5">danse5</string> - <string name="dance6">danse6</string> - <string name="dance7">danse7</string> - <string name="dance8">danse8</string> - <string name="AvatarBirthDateFormat">[day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]</string> - <string name="DefaultMimeType">aucun/aucun</string> - <string name="texture_load_dimensions_error">Impossible de charger des images de taille supérieure à [WIDTH]*[HEIGHT]</string> - <string name="outfit_photo_load_dimensions_error">Taille max. de la photo de la tenue : [WIDTH]*[HEIGHT]. Redimensionnez l’image ou utilisez-en une autre.</string> - <string name="outfit_photo_select_dimensions_error">Taille max. de la photo de la tenue : [WIDTH]*[HEIGHT]. Sélectionnez une autre texture.</string> - <string name="outfit_photo_verify_dimensions_error">Impossible de vérifier les dimensions de la photo. Attendez que la taille de la photo s’affiche dans le sélecteur.</string> +du rapport d'infraction + </string> + <string name="New Shape"> + Nouvelle silhouette + </string> + <string name="New Skin"> + Nouvelle peau + </string> + <string name="New Hair"> + Nouveaux cheveux + </string> + <string name="New Eyes"> + Nouveaux yeux + </string> + <string name="New Shirt"> + Nouvelle chemise + </string> + <string name="New Pants"> + Nouveau pantalon + </string> + <string name="New Shoes"> + Nouvelles chaussures + </string> + <string name="New Socks"> + Nouvelles chaussettes + </string> + <string name="New Jacket"> + Nouvelle veste + </string> + <string name="New Gloves"> + Nouveaux gants + </string> + <string name="New Undershirt"> + Nouveau débardeur + </string> + <string name="New Underpants"> + Nouveau caleçon + </string> + <string name="New Skirt"> + Nouvelle jupe + </string> + <string name="New Alpha"> + Nouvel alpha + </string> + <string name="New Tattoo"> + Nouveau tatouage + </string> + <string name="New Universal"> + Nouvel environnement universel + </string> + <string name="New Physics"> + Nouvelles propriétés physiques + </string> + <string name="Invalid Wearable"> + Objet à porter non valide + </string> + <string name="New Gesture"> + Nouveau geste + </string> + <string name="New Script"> + Nouveau script + </string> + <string name="New Note"> + Nouvelle note + </string> + <string name="New Folder"> + Nouveau dossier + </string> + <string name="Contents"> + Contenus + </string> + <string name="Gesture"> + Geste + </string> + <string name="Male Gestures"> + Gestes masculins + </string> + <string name="Female Gestures"> + Gestes féminins + </string> + <string name="Other Gestures"> + Autres gestes + </string> + <string name="Speech Gestures"> + Gestes liés à la parole + </string> + <string name="Common Gestures"> + Gestes communs + </string> + <string name="Male - Excuse me"> + Homme - Demander pardon + </string> + <string name="Male - Get lost"> + Homme - Get lost + </string> + <string name="Male - Blow kiss"> + Homme - Envoyer un baiser + </string> + <string name="Male - Boo"> + Homme - Hou ! + </string> + <string name="Male - Bored"> + Homme - Ennui + </string> + <string name="Male - Hey"> + Homme - Hé ! + </string> + <string name="Male - Laugh"> + Homme - Rire + </string> + <string name="Male - Repulsed"> + Homme - Dégoût + </string> + <string name="Male - Shrug"> + Homme - Hausser les épaules + </string> + <string name="Male - Stick tougue out"> + Homme - Tirer la langue + </string> + <string name="Male - Wow"> + Homme - Ouah ! + </string> + <string name="Female - Chuckle"> + Femme - Glousser + </string> + <string name="Female - Cry"> + Femme - Pleurer + </string> + <string name="Female - Embarrassed"> + Femme - Gêne + </string> + <string name="Female - Excuse me"> + Femme - Demander pardon + </string> + <string name="Female - Get lost"> + Femme - Get lost + </string> + <string name="Female - Blow kiss"> + Femme - Envoyer un baiser + </string> + <string name="Female - Boo"> + Femme - Hou ! + </string> + <string name="Female - Bored"> + Femme - Ennui + </string> + <string name="Female - Hey"> + Femme - Hé ! + </string> + <string name="Female - Hey baby"> + Femme - Hey baby + </string> + <string name="Female - Laugh"> + Femme - Rire + </string> + <string name="Female - Looking good"> + Femme - Looking good + </string> + <string name="Female - Over here"> + Femme - Over here + </string> + <string name="Female - Please"> + Femme - Please + </string> + <string name="Female - Repulsed"> + Femme - Dégoût + </string> + <string name="Female - Shrug"> + Femme - Hausser les épaules + </string> + <string name="Female - Stick tougue out"> + Femme - Tirer la langue + </string> + <string name="Female - Wow"> + Femme - Ouah ! + </string> + <string name="New Daycycle"> + Nouveau cycle du jour + </string> + <string name="New Water"> + Nouvelle eau + </string> + <string name="New Sky"> + Nouveau ciel + </string> + <string name="/bow"> + /s'incliner + </string> + <string name="/clap"> + /applaudir + </string> + <string name="/count"> + /compter + </string> + <string name="/extinguish"> + /éteindre + </string> + <string name="/kmb"> + /vatefairevoir + </string> + <string name="/muscle"> + /montrersesmuscles + </string> + <string name="/no"> + /non + </string> + <string name="/no!"> + /non ! + </string> + <string name="/paper"> + /papier + </string> + <string name="/pointme"> + /memontrerdudoigt + </string> + <string name="/pointyou"> + /montrerl'autredudoigt + </string> + <string name="/rock"> + /pierre + </string> + <string name="/scissor"> + /ciseaux + </string> + <string name="/smoke"> + /fumer + </string> + <string name="/stretch"> + /bailler + </string> + <string name="/whistle"> + /siffler + </string> + <string name="/yes"> + /oui + </string> + <string name="/yes!"> + /oui ! + </string> + <string name="afk"> + absent + </string> + <string name="dance1"> + danse1 + </string> + <string name="dance2"> + danse2 + </string> + <string name="dance3"> + danse3 + </string> + <string name="dance4"> + danse4 + </string> + <string name="dance5"> + danse5 + </string> + <string name="dance6"> + danse6 + </string> + <string name="dance7"> + danse7 + </string> + <string name="dance8"> + danse8 + </string> + <string name="AvatarBirthDateFormat"> + [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt] + </string> + <string name="DefaultMimeType"> + aucun/aucun + </string> + <string name="texture_load_dimensions_error"> + Impossible de charger des images de taille supérieure à [WIDTH]*[HEIGHT] + </string> + <string name="outfit_photo_load_dimensions_error"> + Taille max. de la photo de la tenue : [WIDTH]*[HEIGHT]. Redimensionnez l’image ou utilisez-en une autre. + </string> + <string name="outfit_photo_select_dimensions_error"> + Taille max. de la photo de la tenue : [WIDTH]*[HEIGHT]. Sélectionnez une autre texture. + </string> + <string name="outfit_photo_verify_dimensions_error"> + Impossible de vérifier les dimensions de la photo. Attendez que la taille de la photo s’affiche dans le sélecteur. + </string> <string name="words_separator" value=","/> - <string name="server_is_down">Malgré nos efforts, une erreur inattendue s’est produite. + <string name="server_is_down"> + Malgré nos efforts, une erreur inattendue s’est produite. Veuillez vous reporter à http://status.secondlifegrid.net afin de déterminer si un problème connu existe avec ce service. - Si le problème persiste, vérifiez la configuration de votre réseau et de votre pare-feu.</string> - <string name="dateTimeWeekdaysNames">Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday</string> - <string name="dateTimeWeekdaysShortNames">Sun:Mon:Tue:Wed:Thu:Fri:Sat</string> - <string name="dateTimeMonthNames">January:February:March:April:May:June:July:August:September:October:November:December</string> - <string name="dateTimeMonthShortNames">Jan:Feb:Mar:Apr:May:Jun:Jul:Aug:Sep:Oct:Nov:Dec</string> - <string name="dateTimeDayFormat">[MDAY]</string> - <string name="dateTimeAM">AM</string> - <string name="dateTimePM">PM</string> - <string name="LocalEstimateUSD">[AMOUNT] US$</string> - <string name="Group Ban">Bannissement de groupe</string> - <string name="Membership">Inscription</string> - <string name="Roles">Rôles</string> - <string name="Group Identity">Identité du groupe</string> - <string name="Parcel Management">Gestion des parcelles</string> - <string name="Parcel Identity">Identité des parcelles</string> - <string name="Parcel Settings">Paramètres des parcelles</string> - <string name="Parcel Powers">Pouvoirs sur les parcelles</string> - <string name="Parcel Access">Accès aux parcelles</string> - <string name="Parcel Content">Contenu des parcelles</string> - <string name="Object Management">Gestion des objets</string> - <string name="Accounting">Comptabilité</string> - <string name="Notices">Notices</string> - <string name="Chat" value=" Chat :">Chat</string> - <string name="BaseMembership">Base</string> - <string name="PremiumMembership">Premium</string> - <string name="Premium_PlusMembership">Premium Plus</string> - <string name="DeleteItems">Supprimer les articles sélectionnés ?</string> - <string name="DeleteItem">Supprimer l'article sélectionné ?</string> - <string name="EmptyOutfitText">Cette tenue ne contient aucun article.</string> - <string name="ExternalEditorNotSet">Sélectionnez un éditeur à l'aide du paramètre ExternalEditor.</string> - <string name="ExternalEditorNotFound">Éditeur externe spécifié introuvable. + Si le problème persiste, vérifiez la configuration de votre réseau et de votre pare-feu. + </string> + <string name="dateTimeWeekdaysNames"> + Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday + </string> + <string name="dateTimeWeekdaysShortNames"> + Sun:Mon:Tue:Wed:Thu:Fri:Sat + </string> + <string name="dateTimeMonthNames"> + January:February:March:April:May:June:July:August:September:October:November:December + </string> + <string name="dateTimeMonthShortNames"> + Jan:Feb:Mar:Apr:May:Jun:Jul:Aug:Sep:Oct:Nov:Dec + </string> + <string name="dateTimeDayFormat"> + [MDAY] + </string> + <string name="dateTimeAM"> + AM + </string> + <string name="dateTimePM"> + PM + </string> + <string name="LocalEstimateUSD"> + [AMOUNT] US$ + </string> + <string name="Group Ban"> + Bannissement de groupe + </string> + <string name="Membership"> + Inscription + </string> + <string name="Roles"> + Rôles + </string> + <string name="Group Identity"> + Identité du groupe + </string> + <string name="Parcel Management"> + Gestion des parcelles + </string> + <string name="Parcel Identity"> + Identité des parcelles + </string> + <string name="Parcel Settings"> + Paramètres des parcelles + </string> + <string name="Parcel Powers"> + Pouvoirs sur les parcelles + </string> + <string name="Parcel Access"> + Accès aux parcelles + </string> + <string name="Parcel Content"> + Contenu des parcelles + </string> + <string name="Object Management"> + Gestion des objets + </string> + <string name="Accounting"> + Comptabilité + </string> + <string name="Notices"> + Notices + </string> + <string name="Chat" value=" Chat :"> + Chat + </string> + <string name="BaseMembership"> + Base + </string> + <string name="PremiumMembership"> + Premium + </string> + <string name="Premium_PlusMembership"> + Premium Plus + </string> + <string name="DeleteItems"> + Supprimer les articles sélectionnés ? + </string> + <string name="DeleteItem"> + Supprimer l'article sélectionné ? + </string> + <string name="EmptyOutfitText"> + Cette tenue ne contient aucun article. + </string> + <string name="ExternalEditorNotSet"> + Sélectionnez un éditeur à l'aide du paramètre ExternalEditor. + </string> + <string name="ExternalEditorNotFound"> + Éditeur externe spécifié introuvable. Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles -(par ex. : "/chemin_accès/editor" "%s").</string> - <string name="ExternalEditorCommandParseError">Erreur lors de l'analyse de la commande d'éditeur externe.</string> - <string name="ExternalEditorFailedToRun">Échec d'exécution de l'éditeur externe.</string> - <string name="TranslationFailed">Échec de traduction : [REASON]</string> - <string name="TranslationResponseParseError">Erreur lors de l'analyse de la réponse relative à la traduction.</string> - <string name="Esc">Échap</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">Maj</string> - <string name="Ctrl">Ctrl</string> - <string name="Alt">Alt</string> - <string name="CapsLock">CapsLock</string> - <string name="Home">Début</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">Ajouter</string> - <string name="Subtract">Soustraire</string> - <string name="Multiply">Multiplier</string> - <string name="Divide">Diviser</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">Affichage des balises de particule (bleu)</string> - <string name="BeaconPhysical">Affichage des balises d'objet physique (vert)</string> - <string name="BeaconScripted">Affichage des balises d'objet scripté (rouge)</string> - <string name="BeaconScriptedTouch">Affichage des balises d'objet scripté avec fonction de toucher (rouge)</string> - <string name="BeaconSound">Affichage des balises de son (jaune)</string> - <string name="BeaconMedia">Affichage des balises de média (blanc)</string> - <string name="BeaconSun">Balise de visibilité du soleil (orange)</string> - <string name="BeaconMoon">Observation de la balise de direction de la lune (violet)</string> - <string name="ParticleHiding">Masquage des particules</string> - <string name="Command_AboutLand_Label">À propos du terrain</string> - <string name="Command_Appearance_Label">Apparence</string> - <string name="Command_Avatar_Label">Avatar</string> - <string name="Command_Build_Label">Construire</string> - <string name="Command_Chat_Label">Chat</string> - <string name="Command_Conversations_Label">Conversations</string> - <string name="Command_Compass_Label">Boussole</string> - <string name="Command_Destinations_Label">Destinations</string> - <string name="Command_Environments_Label">Mes environnements</string> - <string name="Command_Facebook_Label">Facebook</string> - <string name="Command_Flickr_Label">Flickr</string> - <string name="Command_Gestures_Label">Gestes</string> - <string name="Command_Grid_Status_Label">État de la grille</string> - <string name="Command_HowTo_Label">Aide rapide</string> - <string name="Command_Inventory_Label">Inventaire</string> - <string name="Command_Map_Label">Carte</string> - <string name="Command_Marketplace_Label">Place du marché</string> - <string name="Command_MarketplaceListings_Label">Place du marché</string> - <string name="Command_MiniMap_Label">Mini-carte</string> - <string name="Command_Move_Label">Marcher / Courir / Voler</string> - <string name="Command_Outbox_Label">Boîte d'envoi vendeur</string> - <string name="Command_People_Label">Personnes</string> - <string name="Command_Picks_Label">Favoris</string> - <string name="Command_Places_Label">Lieux</string> - <string name="Command_Preferences_Label">Préférences</string> - <string name="Command_Profile_Label">Profil</string> - <string name="Command_Report_Abuse_Label">Signaler une infraction</string> - <string name="Command_Search_Label">Recherche</string> - <string name="Command_Snapshot_Label">Photo</string> - <string name="Command_Speak_Label">Parler</string> - <string name="Command_Twitter_Label">Twitter</string> - <string name="Command_View_Label">Caméra</string> - <string name="Command_Voice_Label">Paramètres vocaux</string> - <string name="Command_AboutLand_Tooltip">Information sur le terrain que vous visitez</string> - <string name="Command_Appearance_Tooltip">Modifier votre avatar</string> - <string name="Command_Avatar_Tooltip">Choisir un avatar complet</string> - <string name="Command_Build_Tooltip">Construction d'objets et remodelage du terrain</string> - <string name="Command_Chat_Tooltip">Parler aux personnes près de vous par chat écrit</string> - <string name="Command_Conversations_Tooltip">Parler à quelqu'un</string> - <string name="Command_Compass_Tooltip">Boussole</string> - <string name="Command_Destinations_Tooltip">Destinations intéressantes</string> - <string name="Command_Environments_Tooltip">Mes environnements</string> - <string name="Command_Facebook_Tooltip">Publier sur Facebook</string> - <string name="Command_Flickr_Tooltip">Charger sur Flickr</string> - <string name="Command_Gestures_Tooltip">Gestes de votre avatar</string> - <string name="Command_Grid_Status_Tooltip">Afficher l’état actuel de la grille</string> - <string name="Command_HowTo_Tooltip">Comment effectuer les opérations courantes</string> - <string name="Command_Inventory_Tooltip">Afficher et utiliser vos possessions</string> - <string name="Command_Map_Tooltip">Carte du monde</string> - <string name="Command_Marketplace_Tooltip">Faire du shopping</string> - <string name="Command_MarketplaceListings_Tooltip">Vendez votre création</string> - <string name="Command_MiniMap_Tooltip">Afficher les personnes près de vous</string> - <string name="Command_Move_Tooltip">Faire bouger votre avatar</string> - <string name="Command_Outbox_Tooltip">Transférer des articles vers votre place de marché afin de les vendre.</string> - <string name="Command_People_Tooltip">Amis, groupes et personnes près de vous</string> - <string name="Command_Picks_Tooltip">Lieux à afficher comme favoris dans votre profil</string> - <string name="Command_Places_Tooltip">Lieux enregistrés</string> - <string name="Command_Preferences_Tooltip">Préférences</string> - <string name="Command_Profile_Tooltip">Modifier ou afficher votre profil</string> - <string name="Command_Report_Abuse_Tooltip">Signaler une infraction</string> - <string name="Command_Search_Tooltip">Trouver des lieux, personnes, événements</string> - <string name="Command_Snapshot_Tooltip">Prendre une photo</string> - <string name="Command_Speak_Tooltip">Parler aux personnes près de vous en utilisant votre micro</string> - <string name="Command_Twitter_Tooltip">Twitter</string> - <string name="Command_View_Tooltip">Changer l'angle de la caméra</string> - <string name="Command_Voice_Tooltip">Commandes de réglage du volume des appels et des personnes près de vous dans Second Life.</string> - <string name="Toolbar_Bottom_Tooltip">actuellement dans la barre d'outils du bas</string> - <string name="Toolbar_Left_Tooltip">actuellement dans la barre d'outils de gauche</string> - <string name="Toolbar_Right_Tooltip">actuellement dans la barre d'outils de droite</string> - <string name="Retain%">Garder%</string> - <string name="Detail">Détail</string> - <string name="Better Detail">Meilleur détail</string> - <string name="Surface">Surface</string> - <string name="Solid">Solide</string> - <string name="Wrap">Wrap</string> - <string name="Preview">Aperçu</string> - <string name="Normal">Normal</string> - <string name="Pathfinding_Wiki_URL">http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer</string> - <string name="Pathfinding_Object_Attr_None">Aucun</string> - <string name="Pathfinding_Object_Attr_Permanent">Maillage de navigation affecté</string> - <string name="Pathfinding_Object_Attr_Character">Personnage</string> - <string name="Pathfinding_Object_Attr_MultiSelect">(Multiple)</string> - <string name="snapshot_quality_very_low">Très faible</string> - <string name="snapshot_quality_low">Faible</string> - <string name="snapshot_quality_medium">Moyenne</string> - <string name="snapshot_quality_high">Élevée</string> - <string name="snapshot_quality_very_high">Très élevée</string> - <string name="TeleportMaturityExceeded">Le résident ne peut pas visiter cette région.</string> - <string name="UserDictionary">[User]</string> - <string name="experience_tools_experience">Expérience</string> - <string name="ExperienceNameNull">(aucune expérience)</string> - <string name="ExperienceNameUntitled">(expérience sans titre)</string> - <string name="Land-Scope">À l’échelle des terrains</string> - <string name="Grid-Scope">À l’échelle de la grille</string> - <string name="Allowed_Experiences_Tab">AUTORISÉE</string> - <string name="Blocked_Experiences_Tab">BLOQUÉE</string> - <string name="Contrib_Experiences_Tab">CONTRIBUTEUR</string> - <string name="Admin_Experiences_Tab">ADMIN</string> - <string name="Recent_Experiences_Tab">RÉCENTE</string> - <string name="Owned_Experiences_Tab">AVEC PROPRIÉTAIRE</string> - <string name="ExperiencesCounter">([EXPERIENCES], [MAXEXPERIENCES] max.)</string> - <string name="ExperiencePermission1">assumer vos contrôles</string> - <string name="ExperiencePermission3">déclencher des animations pour votre avatar</string> - <string name="ExperiencePermission4">attacher à votre avatar</string> - <string name="ExperiencePermission9">suivre votre caméra</string> - <string name="ExperiencePermission10">contrôler votre caméra</string> - <string name="ExperiencePermission11">vous téléporter</string> - <string name="ExperiencePermission12">accepter automatiquement les permissions d’expérience</string> - <string name="ExperiencePermission16">forcez votre avatar à s’asseoir</string> - <string name="ExperiencePermission17">changer vos paramètres d'environnement</string> - <string name="ExperiencePermissionShortUnknown">a effectué une opération inconnue : [Permission]</string> - <string name="ExperiencePermissionShort1">Prendre le contrôle</string> - <string name="ExperiencePermissionShort3">Déclencher des animations</string> - <string name="ExperiencePermissionShort4">Attacher</string> - <string name="ExperiencePermissionShort9">Suivre la caméra</string> - <string name="ExperiencePermissionShort10">Contrôler la caméra</string> - <string name="ExperiencePermissionShort11">Téléportation</string> - <string name="ExperiencePermissionShort12">Permission</string> - <string name="ExperiencePermissionShort16">M'asseoir</string> - <string name="ExperiencePermissionShort17">Environnement</string> - <string name="logging_calls_disabled_log_empty">Les conversations ne sont pas archivées. Pour commencer à tenir un journal, choisissez Enregistrer : Journal seul ou Enregistrer : Journal et transcriptions sous Préférences > Chat.</string> - <string name="logging_calls_disabled_log_not_empty">Aucune conversation ne sera plus enregistrée. Pour recommencer à tenir un journal, choisissez Enregistrer : Journal seul ou Enregistrer : Journal et transcriptions sous Préférences > Chat.</string> - <string name="logging_calls_enabled_log_empty">Il n'y a aucune conversation enregistrée. Quand quelqu'un vous contacte ou quand vous contactez quelqu'un, une entrée de journal s'affiche ici.</string> - <string name="loading_chat_logs">Chargement...</string> - <string name="na">s.o.</string> - <string name="preset_combo_label">-Liste vide-</string> - <string name="Default">Valeur par défaut</string> - <string name="none_paren_cap">(Aucun/Aucune)</string> - <string name="no_limit">Aucune limite</string> - <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">La forme physique contient des triangles trop petits. Essayez de simplifier le modèle physique.</string> - <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH">La forme physique contient de mauvaises données de confirmation. Essayez de corriger le modèle physique.</string> - <string name="Mav_Details_MAV_UNKNOWN_VERSION">La forme physique n’a pas la version correcte. Configurez la version correcte pour le modèle physique.</string> - <string name="couldnt_resolve_host">DNS n'a pas pu résoudre le nom d'hôte([HOSTNAME]). +(par ex. : "/chemin_accès/editor" "%s"). + </string> + <string name="ExternalEditorCommandParseError"> + Erreur lors de l'analyse de la commande d'éditeur externe. + </string> + <string name="ExternalEditorFailedToRun"> + Échec d'exécution de l'éditeur externe. + </string> + <string name="TranslationFailed"> + Échec de traduction : [REASON] + </string> + <string name="TranslationResponseParseError"> + Erreur lors de l'analyse de la réponse relative à la traduction. + </string> + <string name="Esc"> + Échap + </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"> + Maj + </string> + <string name="Ctrl"> + Ctrl + </string> + <string name="Alt"> + Alt + </string> + <string name="CapsLock"> + CapsLock + </string> + <string name="Home"> + Début + </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"> + Ajouter + </string> + <string name="Subtract"> + Soustraire + </string> + <string name="Multiply"> + Multiplier + </string> + <string name="Divide"> + Diviser + </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"> + Affichage des balises de particule (bleu) + </string> + <string name="BeaconPhysical"> + Affichage des balises d'objet physique (vert) + </string> + <string name="BeaconScripted"> + Affichage des balises d'objet scripté (rouge) + </string> + <string name="BeaconScriptedTouch"> + Affichage des balises d'objet scripté avec fonction de toucher (rouge) + </string> + <string name="BeaconSound"> + Affichage des balises de son (jaune) + </string> + <string name="BeaconMedia"> + Affichage des balises de média (blanc) + </string> + <string name="BeaconSun"> + Balise de visibilité du soleil (orange) + </string> + <string name="BeaconMoon"> + Observation de la balise de direction de la lune (violet) + </string> + <string name="ParticleHiding"> + Masquage des particules + </string> + <string name="Command_AboutLand_Label"> + À propos du terrain + </string> + <string name="Command_Appearance_Label"> + Apparence + </string> + <string name="Command_Avatar_Label"> + Avatar + </string> + <string name="Command_Build_Label"> + Construire + </string> + <string name="Command_Chat_Label"> + Chat + </string> + <string name="Command_Conversations_Label"> + Conversations + </string> + <string name="Command_Compass_Label"> + Boussole + </string> + <string name="Command_Destinations_Label"> + Destinations + </string> + <string name="Command_Environments_Label"> + Mes environnements + </string> + <string name="Command_Facebook_Label"> + Facebook + </string> + <string name="Command_Flickr_Label"> + Flickr + </string> + <string name="Command_Gestures_Label"> + Gestes + </string> + <string name="Command_Grid_Status_Label"> + État de la grille + </string> + <string name="Command_HowTo_Label"> + Aide rapide + </string> + <string name="Command_Inventory_Label"> + Inventaire + </string> + <string name="Command_Map_Label"> + Carte + </string> + <string name="Command_Marketplace_Label"> + Place du marché + </string> + <string name="Command_MarketplaceListings_Label"> + Place du marché + </string> + <string name="Command_MiniMap_Label"> + Mini-carte + </string> + <string name="Command_Move_Label"> + Marcher / Courir / Voler + </string> + <string name="Command_Outbox_Label"> + Boîte d'envoi vendeur + </string> + <string name="Command_People_Label"> + Personnes + </string> + <string name="Command_Picks_Label"> + Favoris + </string> + <string name="Command_Places_Label"> + Lieux + </string> + <string name="Command_Preferences_Label"> + Préférences + </string> + <string name="Command_Profile_Label"> + Profil + </string> + <string name="Command_Report_Abuse_Label"> + Signaler une infraction + </string> + <string name="Command_Search_Label"> + Recherche + </string> + <string name="Command_Snapshot_Label"> + Photo + </string> + <string name="Command_Speak_Label"> + Parler + </string> + <string name="Command_Twitter_Label"> + Twitter + </string> + <string name="Command_View_Label"> + Caméra + </string> + <string name="Command_Voice_Label"> + Paramètres vocaux + </string> + <string name="Command_AboutLand_Tooltip"> + Information sur le terrain que vous visitez + </string> + <string name="Command_Appearance_Tooltip"> + Modifier votre avatar + </string> + <string name="Command_Avatar_Tooltip"> + Choisir un avatar complet + </string> + <string name="Command_Build_Tooltip"> + Construction d'objets et remodelage du terrain + </string> + <string name="Command_Chat_Tooltip"> + Parler aux personnes près de vous par chat écrit + </string> + <string name="Command_Conversations_Tooltip"> + Parler à quelqu'un + </string> + <string name="Command_Compass_Tooltip"> + Boussole + </string> + <string name="Command_Destinations_Tooltip"> + Destinations intéressantes + </string> + <string name="Command_Environments_Tooltip"> + Mes environnements + </string> + <string name="Command_Facebook_Tooltip"> + Publier sur Facebook + </string> + <string name="Command_Flickr_Tooltip"> + Charger sur Flickr + </string> + <string name="Command_Gestures_Tooltip"> + Gestes de votre avatar + </string> + <string name="Command_Grid_Status_Tooltip"> + Afficher l’état actuel de la grille + </string> + <string name="Command_HowTo_Tooltip"> + Comment effectuer les opérations courantes + </string> + <string name="Command_Inventory_Tooltip"> + Afficher et utiliser vos possessions + </string> + <string name="Command_Map_Tooltip"> + Carte du monde + </string> + <string name="Command_Marketplace_Tooltip"> + Faire du shopping + </string> + <string name="Command_MarketplaceListings_Tooltip"> + Vendez votre création + </string> + <string name="Command_MiniMap_Tooltip"> + Afficher les personnes près de vous + </string> + <string name="Command_Move_Tooltip"> + Faire bouger votre avatar + </string> + <string name="Command_Outbox_Tooltip"> + Transférer des articles vers votre place de marché afin de les vendre. + </string> + <string name="Command_People_Tooltip"> + Amis, groupes et personnes près de vous + </string> + <string name="Command_Picks_Tooltip"> + Lieux à afficher comme favoris dans votre profil + </string> + <string name="Command_Places_Tooltip"> + Lieux enregistrés + </string> + <string name="Command_Preferences_Tooltip"> + Préférences + </string> + <string name="Command_Profile_Tooltip"> + Modifier ou afficher votre profil + </string> + <string name="Command_Report_Abuse_Tooltip"> + Signaler une infraction + </string> + <string name="Command_Search_Tooltip"> + Trouver des lieux, personnes, événements + </string> + <string name="Command_Snapshot_Tooltip"> + Prendre une photo + </string> + <string name="Command_Speak_Tooltip"> + Parler aux personnes près de vous en utilisant votre micro + </string> + <string name="Command_Twitter_Tooltip"> + Twitter + </string> + <string name="Command_View_Tooltip"> + Changer l'angle de la caméra + </string> + <string name="Command_Voice_Tooltip"> + Commandes de réglage du volume des appels et des personnes près de vous dans Second Life. + </string> + <string name="Toolbar_Bottom_Tooltip"> + actuellement dans la barre d'outils du bas + </string> + <string name="Toolbar_Left_Tooltip"> + actuellement dans la barre d'outils de gauche + </string> + <string name="Toolbar_Right_Tooltip"> + actuellement dans la barre d'outils de droite + </string> + <string name="Retain%"> + Garder% + </string> + <string name="Detail"> + Détail + </string> + <string name="Better Detail"> + Meilleur détail + </string> + <string name="Surface"> + Surface + </string> + <string name="Solid"> + Solide + </string> + <string name="Wrap"> + Wrap + </string> + <string name="Preview"> + Aperçu + </string> + <string name="Normal"> + Normal + </string> + <string name="Pathfinding_Wiki_URL"> + http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer + </string> + <string name="Pathfinding_Object_Attr_None"> + Aucun + </string> + <string name="Pathfinding_Object_Attr_Permanent"> + Maillage de navigation affecté + </string> + <string name="Pathfinding_Object_Attr_Character"> + Personnage + </string> + <string name="Pathfinding_Object_Attr_MultiSelect"> + (Multiple) + </string> + <string name="snapshot_quality_very_low"> + Très faible + </string> + <string name="snapshot_quality_low"> + Faible + </string> + <string name="snapshot_quality_medium"> + Moyenne + </string> + <string name="snapshot_quality_high"> + Élevée + </string> + <string name="snapshot_quality_very_high"> + Très élevée + </string> + <string name="TeleportMaturityExceeded"> + Le résident ne peut pas visiter cette région. + </string> + <string name="UserDictionary"> + [User] + </string> + <string name="experience_tools_experience"> + Expérience + </string> + <string name="ExperienceNameNull"> + (aucune expérience) + </string> + <string name="ExperienceNameUntitled"> + (expérience sans titre) + </string> + <string name="Land-Scope"> + À l’échelle des terrains + </string> + <string name="Grid-Scope"> + À l’échelle de la grille + </string> + <string name="Allowed_Experiences_Tab"> + AUTORISÉE + </string> + <string name="Blocked_Experiences_Tab"> + BLOQUÉE + </string> + <string name="Contrib_Experiences_Tab"> + CONTRIBUTEUR + </string> + <string name="Admin_Experiences_Tab"> + ADMIN + </string> + <string name="Recent_Experiences_Tab"> + RÉCENTE + </string> + <string name="Owned_Experiences_Tab"> + AVEC PROPRIÉTAIRE + </string> + <string name="ExperiencesCounter"> + ([EXPERIENCES], [MAXEXPERIENCES] max.) + </string> + <string name="ExperiencePermission1"> + assumer vos contrôles + </string> + <string name="ExperiencePermission3"> + déclencher des animations pour votre avatar + </string> + <string name="ExperiencePermission4"> + attacher à votre avatar + </string> + <string name="ExperiencePermission9"> + suivre votre caméra + </string> + <string name="ExperiencePermission10"> + contrôler votre caméra + </string> + <string name="ExperiencePermission11"> + vous téléporter + </string> + <string name="ExperiencePermission12"> + accepter automatiquement les permissions d’expérience + </string> + <string name="ExperiencePermission16"> + forcez votre avatar à s’asseoir + </string> + <string name="ExperiencePermission17"> + changer vos paramètres d'environnement + </string> + <string name="ExperiencePermissionShortUnknown"> + a effectué une opération inconnue : [Permission] + </string> + <string name="ExperiencePermissionShort1"> + Prendre le contrôle + </string> + <string name="ExperiencePermissionShort3"> + Déclencher des animations + </string> + <string name="ExperiencePermissionShort4"> + Attacher + </string> + <string name="ExperiencePermissionShort9"> + Suivre la caméra + </string> + <string name="ExperiencePermissionShort10"> + Contrôler la caméra + </string> + <string name="ExperiencePermissionShort11"> + Téléportation + </string> + <string name="ExperiencePermissionShort12"> + Permission + </string> + <string name="ExperiencePermissionShort16"> + M'asseoir + </string> + <string name="ExperiencePermissionShort17"> + Environnement + </string> + <string name="logging_calls_disabled_log_empty"> + Les conversations ne sont pas archivées. Pour commencer à tenir un journal, choisissez Enregistrer : Journal seul ou Enregistrer : Journal et transcriptions sous Préférences > Chat. + </string> + <string name="logging_calls_disabled_log_not_empty"> + Aucune conversation ne sera plus enregistrée. Pour recommencer à tenir un journal, choisissez Enregistrer : Journal seul ou Enregistrer : Journal et transcriptions sous Préférences > Chat. + </string> + <string name="logging_calls_enabled_log_empty"> + Il n'y a aucune conversation enregistrée. Quand quelqu'un vous contacte ou quand vous contactez quelqu'un, une entrée de journal s'affiche ici. + </string> + <string name="loading_chat_logs"> + Chargement... + </string> + <string name="na"> + s.o. + </string> + <string name="preset_combo_label"> + -Liste vide- + </string> + <string name="Default"> + Valeur par défaut + </string> + <string name="none_paren_cap"> + (Aucun/Aucune) + </string> + <string name="no_limit"> + Aucune limite + </string> + <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES"> + La forme physique contient des triangles trop petits. Essayez de simplifier le modèle physique. + </string> + <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH"> + La forme physique contient de mauvaises données de confirmation. Essayez de corriger le modèle physique. + </string> + <string name="Mav_Details_MAV_UNKNOWN_VERSION"> + La forme physique n’a pas la version correcte. Configurez la version correcte pour le modèle physique. + </string> + <string name="couldnt_resolve_host"> + DNS n'a pas pu résoudre le nom d'hôte([HOSTNAME]). Veuillez vérifier que vous parvenez à vous connecter au site www.secondlife.com. Si c'est le cas, et que vous continuez à recevoir ce message d'erreur, veuillez vous -rendre à la section Support et signaler ce problème</string> - <string name="ssl_peer_certificate">Le serveur d'identification a rencontré une erreur de connexion SSL. +rendre à la section Support et signaler ce problème + </string> + <string name="ssl_peer_certificate"> + Le serveur d'identification a rencontré une erreur de connexion SSL. Si vous continuez à recevoir ce message d'erreur, veuillez vous rendre à la section Support du site web -SecondLife.com et signaler ce problème</string> - <string name="ssl_connect_error">Ceci est souvent dû à un mauvais réglage de l'horloge de votre ordinateur. +SecondLife.com et signaler ce problème + </string> + <string name="ssl_connect_error"> + Ceci est souvent dû à un mauvais réglage de l'horloge de votre ordinateur. Veuillez aller à Tableaux de bord et assurez-vous que l'heure et la date sont réglés correctement. Vérifiez également que votre réseau et votre pare-feu sont configurés correctement. Si vous continuez à recevoir ce message d'erreur, veuillez vous rendre à la section Support du site web SecondLife.com et signaler ce problème. -[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de connaissances]</string> +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de connaissances] + </string> </strings> diff --git a/indra/newview/skins/default/xui/fr/teleport_strings.xml b/indra/newview/skins/default/xui/fr/teleport_strings.xml index 1272723c6b..cad8911fde 100644 --- a/indra/newview/skins/default/xui/fr/teleport_strings.xml +++ b/indra/newview/skins/default/xui/fr/teleport_strings.xml @@ -1,40 +1,96 @@ <?xml version="1.0" ?> <teleport_messages> <message_set name="errors"> - <message name="invalid_tport">Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir vous téléporter. -Si ce message persiste, veuillez consulter la page [SUPPORT_SITE].</message> - <message name="invalid_region_handoff">Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir traverser des régions. -Si ce message persiste, veuillez consulter la page [SUPPORT_SITE].</message> - <message name="blocked_tport">Désolé, la téléportation est bloquée actuellement. Veuillez réessayer dans un moment. -Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis reconnectez-vous pour résoudre le problème.</message> - <message name="nolandmark_tport">Désolé, le système n'a pas réussi à localiser la destination de votre repère.</message> - <message name="timeout_tport">Désolé, la connexion vers votre lieu de téléportation n'a pas abouti. -Veuillez réessayer dans un moment.</message> - <message name="NoHelpIslandTP">Vous ne pouvez pas vous téléporter à nouveau vers Welcome Island. -Pour recommencer le didacticiel, accédez à Welcome Island Public.</message> - <message name="noaccess_tport">Désolé, vous n'avez pas accès à cette destination.</message> - <message name="missing_attach_tport">Vos pieces-jointes ne sont pas encore arrivées. Attendez quelques secondes de plus ou déconnectez-vous puis reconnectez-vous avant d'essayer de vous téléporter.</message> - <message name="too_many_uploads_tport">Le trafic vers cette région est bouché en ce moment. Votre téléportation ne pourra pas avoir lieu immédiatement. Veuillez réessayer dans quelques minutes ou bien aller dans une zone moins fréquentée.</message> - <message name="expired_tport">Désolé, votre demande de téléportation n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes.</message> - <message name="expired_region_handoff">Désolé, votre demande pour passer dans une autre région n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes.</message> - <message name="no_host">Impossible de trouver la destination de la téléportation. Il est possible que cette destination soit temporairement indisponible ou qu'elle n'existe plus. Veuillez réessayer dans quelques minutes.</message> - <message name="no_inventory_host">L'inventaire est temporairement indisponible.</message> - <message name="MustGetAgeRegion">Pour accéder à cette région, vous devez avoir au moins 18 ans.</message> - <message name="RegionTPSpecialUsageBlocked">Impossible de pénétrer dans la région. « [REGION_NAME] » est une région de jeux d'adresse et vous devez satisfaire à certains critères pour y pénétrer. Pour en savoir plus, consultez la page [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life FAQ sur les jeux d'adresse].</message> - <message name="preexisting_tport">Désolé, mais le système n'a pas pu démarrer votre téléport. Veuillez réessayer dans quelques minutes.</message> + <message name="invalid_tport"> + Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir vous téléporter. +Si ce message persiste, veuillez consulter la page [SUPPORT_SITE]. + </message> + <message name="invalid_region_handoff"> + Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir traverser des régions. +Si ce message persiste, veuillez consulter la page [SUPPORT_SITE]. + </message> + <message name="blocked_tport"> + Désolé, la téléportation est bloquée actuellement. Veuillez réessayer dans un moment. +Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis reconnectez-vous pour résoudre le problème. + </message> + <message name="nolandmark_tport"> + Désolé, le système n'a pas réussi à localiser la destination de votre repère. + </message> + <message name="timeout_tport"> + Désolé, la connexion vers votre lieu de téléportation n'a pas abouti. +Veuillez réessayer dans un moment. + </message> + <message name="NoHelpIslandTP"> + Vous ne pouvez pas vous téléporter à nouveau vers Welcome Island. +Pour recommencer le didacticiel, accédez à Welcome Island Public. + </message> + <message name="noaccess_tport"> + Désolé, vous n'avez pas accès à cette destination. + </message> + <message name="missing_attach_tport"> + Vos pieces-jointes ne sont pas encore arrivées. Attendez quelques secondes de plus ou déconnectez-vous puis reconnectez-vous avant d'essayer de vous téléporter. + </message> + <message name="too_many_uploads_tport"> + Le trafic vers cette région est bouché en ce moment. Votre téléportation ne pourra pas avoir lieu immédiatement. Veuillez réessayer dans quelques minutes ou bien aller dans une zone moins fréquentée. + </message> + <message name="expired_tport"> + Désolé, votre demande de téléportation n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. + </message> + <message name="expired_region_handoff"> + Désolé, votre demande pour passer dans une autre région n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. + </message> + <message name="no_host"> + Impossible de trouver la destination de la téléportation. Il est possible que cette destination soit temporairement indisponible ou qu'elle n'existe plus. Veuillez réessayer dans quelques minutes. + </message> + <message name="no_inventory_host"> + L'inventaire est temporairement indisponible. + </message> + <message name="MustGetAgeRegion"> + Pour accéder à cette région, vous devez avoir au moins 18 ans. + </message> + <message name="RegionTPSpecialUsageBlocked"> + Impossible de pénétrer dans la région. « [REGION_NAME] » est une région de jeux d'adresse et vous devez satisfaire à certains critères pour y pénétrer. Pour en savoir plus, consultez la page [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life FAQ sur les jeux d'adresse]. + </message> + <message name="preexisting_tport"> + Désolé, mais le système n'a pas pu démarrer votre téléport. Veuillez réessayer dans quelques minutes. + </message> </message_set> <message_set name="progress"> - <message name="sending_dest">Envoi vers la destination en cours.</message> - <message name="redirecting">Redirection vers un emplacement différent en cours.</message> - <message name="relaying">Relai vers la destination en cours.</message> - <message name="sending_home">Requête de la demande d'envoi vers votre domicile en cours.</message> - <message name="sending_landmark">Requête de la demande d'envoi vers le repère en cours.</message> - <message name="completing">Téléportation sur le point d'aboutir.</message> - <message name="completed_from">Téléportation depuis [T_SLURL] terminée</message> - <message name="resolving">Destination en cours de résolution.</message> - <message name="contacting">Contact avec la nouvelle région en cours.</message> - <message name="arriving">Vous arrivez...</message> - <message name="requesting">Demande de téléportation en cours...</message> - <message name="pending">En attente de téléportation...</message> + <message name="sending_dest"> + Envoi vers la destination en cours. + </message> + <message name="redirecting"> + Redirection vers un emplacement différent en cours. + </message> + <message name="relaying"> + Relai vers la destination en cours. + </message> + <message name="sending_home"> + Requête de la demande d'envoi vers votre domicile en cours. + </message> + <message name="sending_landmark"> + Requête de la demande d'envoi vers le repère en cours. + </message> + <message name="completing"> + Téléportation sur le point d'aboutir. + </message> + <message name="completed_from"> + Téléportation depuis [T_SLURL] terminée + </message> + <message name="resolving"> + Destination en cours de résolution. + </message> + <message name="contacting"> + Contact avec la nouvelle région en cours. + </message> + <message name="arriving"> + Vous arrivez... + </message> + <message name="requesting"> + Demande de téléportation en cours... + </message> + <message name="pending"> + En attente de téléportation... + </message> </message_set> </teleport_messages> diff --git a/indra/newview/skins/default/xui/it/floater_avatar_textures.xml b/indra/newview/skins/default/xui/it/floater_avatar_textures.xml index 288b0a2fea..c0e56805f3 100644 --- a/indra/newview/skins/default/xui/it/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/it/floater_avatar_textures.xml @@ -8,7 +8,7 @@ texture</text> <text name="composite_label">Composito Texture</text> <button label="Memorizza gli ID sulla console" label_selected="Dump" name="Dump"/> - <panel name="scroll_content_panel"> + <panel name="scroll_content_panel2"> <texture_picker label="Capigliature" name="hair-baked"/> <texture_picker label="Capigliature" name="hair_grain"/> <texture_picker label="Alpha dei capelli" name="hair_alpha"/> diff --git a/indra/newview/skins/default/xui/it/floater_search.xml b/indra/newview/skins/default/xui/it/floater_search.xml deleted file mode 100644 index ac3dc17aa3..0000000000 --- a/indra/newview/skins/default/xui/it/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> - <floater.string name="loading_text"> - Caricamento in corso... - </floater.string> - <floater.string name="done_text"> - Fine - </floater.string> - <layout_stack name="stack1"> - <layout_panel name="browser_layout"> - <text name="refresh_search"> - Ripeti ricerca in modo che rifletta il livello di diritti Admin attuale - </text> - </layout_panel> - </layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/it/panel_progress.xml b/indra/newview/skins/default/xui/it/panel_progress.xml index c9bed9fd9b..ab906cbedb 100644 --- a/indra/newview/skins/default/xui/it/panel_progress.xml +++ b/indra/newview/skins/default/xui/it/panel_progress.xml @@ -1,8 +1,10 @@ <?xml version="1.0" ?> <panel name="login_progress_panel"> + <layout_panel name="panel_icons"/> <layout_stack name="vertical_centering"/> <layout_panel name="panel4"/> <layout_panel name="center"/> <layout_stack name="horizontal_centering"> + <text name="logos_lbl">Utilizzi di Megapahit</text> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml index 75b5d64660..21b65e8e69 100644 --- a/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@ Salvare un'immagine nell'inventario costa L$[UPLOAD_COST]. Per salvare l'immagine come texture, selezionare uno dei formati quadrati. </text> <combo_box label="Risoluzione" name="texture_size_combo"> - <combo_box.item label="Finestra corrente (512x512)" name="CurrentWindow"/> + <combo_box.item label="Finestra corrente" name="CurrentWindow"/> <combo_box.item label="Piccola (128x128)" name="Small(128x128)"/> <combo_box.item label="Media (256x256)" name="Medium(256x256)"/> <combo_box.item label="Grande (512x512)" name="Large(512x512)"/> diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_options.xml b/indra/newview/skins/default/xui/it/panel_snapshot_options.xml index 50fb3d39fa..7fce171326 100644 --- a/indra/newview/skins/default/xui/it/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/it/panel_snapshot_options.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_snapshot_options"> <button label="Salva sul disco" name="save_to_computer_btn"/> - <button label="Salva nell'inventario (L$[AMOUNT])" name="save_to_inventory_btn"/> + <button label="Salva nell'inventario" name="save_to_inventory_btn"/> <button label="Condividi sul feed del profilo" name="save_to_profile_btn"/> <button label="Condividi su Facebook" name="send_to_facebook_btn"/> <button label="Condividi su Twitter" name="send_to_twitter_btn"/> diff --git a/indra/newview/skins/default/xui/it/panel_status_bar.xml b/indra/newview/skins/default/xui/it/panel_status_bar.xml index 160fd4e180..04d61c2973 100644 --- a/indra/newview/skins/default/xui/it/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/it/panel_status_bar.xml @@ -6,7 +6,7 @@ <panel.string name="bandwidth_tooltip"> Larghezza di banda </panel.string> - <panel.string name="time"> + <panel.string name="time_ampm"> [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] </panel.string> <panel.string name="timeTooltip"> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index 69381ef00e..d80da3c0c8 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -1,611 +1,1668 @@ <?xml version="1.0" ?> <strings> - <string name="SECOND_LIFE">Second Life</string> - <string name="APP_NAME">Megapahit</string> - <string name="CAPITALIZED_APP_NAME">MEGAPAHIT</string> - <string name="SUPPORT_SITE">Portale di supporto di Second Life</string> - <string name="StartupDetectingHardware">Ricerca hardware...</string> - <string name="StartupLoading">Caricamento di [APP_NAME]...</string> - <string name="StartupClearingCache">Pulizia della cache...</string> - <string name="StartupInitializingTextureCache">Inizializzazione della cache texture...</string> - <string name="StartupRequireDriverUpdate">Inizializzazione grafica non riuscita. Aggiorna il driver della scheda grafica!</string> - <string name="AboutHeader">[CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) -[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]</string> - <string name="BuildConfig">Configurazione struttura [BUILD_CONFIG]</string> - <string name="AboutPosition">Tu sei a [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] che si trova a <nolink>[HOSTNAME]</nolink> ([HOSTIP]) + <string name="SECOND_LIFE"> + Second Life + </string> + <string name="APP_NAME"> + Megapahit + </string> + <string name="CAPITALIZED_APP_NAME"> + MEGAPAHIT + </string> + <string name="SUPPORT_SITE"> + Portale di supporto di Second Life + </string> + <string name="StartupDetectingHardware"> + Ricerca hardware... + </string> + <string name="StartupLoading"> + Caricamento di [APP_NAME]... + </string> + <string name="StartupClearingCache"> + Pulizia della cache... + </string> + <string name="StartupInitializingTextureCache"> + Inizializzazione della cache texture... + </string> + <string name="StartupRequireDriverUpdate"> + Inizializzazione grafica non riuscita. Aggiorna il driver della scheda grafica! + </string> + <string name="AboutHeader"> + [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) +[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] + </string> + <string name="BuildConfig"> + Configurazione struttura [BUILD_CONFIG] + </string> + <string name="AboutPosition"> + Tu sei a [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] che si trova a <nolink>[HOSTNAME]</nolink> SLURL: <nolink>[SLURL]</nolink> (coordinate globali [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] -[SERVER_RELEASE_NOTES_URL]</string> - <string name="AboutSystem">CPU: [CPU] +[SERVER_RELEASE_NOTES_URL] + </string> + <string name="AboutSystem"> + CPU: [CPU] Memoria: [MEMORY_MB] MB Versione sistema operativo: [OS_VERSION] Venditore scheda grafica: [GRAPHICS_CARD_VENDOR] -Scheda grafica: [GRAPHICS_CARD]</string> - <string name="AboutDriver">Versione driver Windows per grafica: [GRAPHICS_DRIVER_VERSION]</string> - <string name="AboutOGL">Versione OpenGL: [OPENGL_VERSION]</string> - <string name="AboutSettings">Dimensione finestra: [WINDOW_WIDTH]x[WINDOW_HEIGHT] +Scheda grafica: [GRAPHICS_CARD] + </string> + <string name="AboutDriver"> + Versione driver Windows per grafica: [GRAPHICS_DRIVER_VERSION] + </string> + <string name="AboutOGL"> + Versione OpenGL: [OPENGL_VERSION] + </string> + <string name="AboutSettings"> + Dimensione finestra: [WINDOW_WIDTH]x[WINDOW_HEIGHT] Regolazione dimensioni carattere: [FONT_SIZE_ADJUSTMENT]pt Scala UI: [UI_SCALE] Distanza visualizzazione: [DRAW_DISTANCE]m Larghezza banda: [NET_BANDWITH]kbit/s Fattore livello di dettaglio: [LOD_FACTOR] Qualità di rendering: [RENDER_QUALITY] -Modello illuminazione avanzato: [GPU_SHADERS] -Memoria texture: [TEXTURE_MEMORY]MB</string> - <string name="AboutOSXHiDPI">Modalità display HiDPI: [HIDPI]</string> - <string name="AboutLibs">J2C Versione decoder: [J2C_VERSION] +Memoria texture: [TEXTURE_MEMORY]MB + </string> + <string name="AboutOSXHiDPI"> + Modalità display HiDPI: [HIDPI] + </string> + <string name="AboutLibs"> + J2C Versione decoder: [J2C_VERSION] Versione del driver audio: [AUDIO_DRIVER_VERSION][LIBCEF_VERSION] Versione LibVLC: [LIBVLC_VERSION] -Versione server voce: [VOICE_VERSION]</string> - <string name="AboutTraffic">Pacchetti perduti: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)</string> - <string name="AboutTime">[day, datetime, slt] [month, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]</string> - <string name="ErrorFetchingServerReleaseNotesURL">Errore nel recupero URL note rilascio versione</string> - <string name="BuildConfiguration">Costruisci configurazione</string> - <string name="ProgressRestoring">Ripristino in corso...</string> - <string name="ProgressChangingResolution">Modifica della risoluzione...</string> - <string name="Fullbright">Luminosità massima (vers. precedente)</string> - <string name="LoginInProgress">In connessione. [APP_NAME] può sembrare rallentata. Attendi.</string> - <string name="LoginInProgressNoFrozen">Accesso in corso...</string> - <string name="LoginAuthenticating">In autenticazione</string> - <string name="LoginMaintenance">Aggiornamento account in corso...</string> - <string name="LoginAttempt">Un precedente tentativo di login è fallito. Tentativo di connessione [NUMBER]</string> - <string name="LoginPrecaching">Sto caricando [SECOND_LIFE]...</string> - <string name="LoginInitializingBrowser">Inizializzazione del browser web incorporato...</string> - <string name="LoginInitializingMultimedia">Inizializzazione dati multimediali...</string> - <string name="LoginInitializingFonts">Caricamento caratteri...</string> - <string name="LoginVerifyingCache">Verifica file della cache (tempo previsto 60-90 secondi)...</string> - <string name="LoginProcessingResponse">Elaborazione risposta...</string> - <string name="LoginInitializingWorld">Inizializzazione mondo...</string> - <string name="LoginDecodingImages">Decodifica immagini...</string> - <string name="LoginInitializingQuicktime">Inizializzazione QuickTime...</string> - <string name="LoginQuicktimeNotFound">QuickTime non trovato - impossibile inizializzare.</string> - <string name="LoginQuicktimeOK">QuickTime configurato con successo.</string> - <string name="LoginRequestSeedCapGrant">Richiesta capacità regione...</string> - <string name="LoginRetrySeedCapGrant">Richiesta capacità regione, tentativo [NUMBER]...</string> - <string name="LoginWaitingForRegionHandshake">In attesa della risposta della regione...</string> - <string name="LoginConnectingToRegion">Connessione alla regione...</string> - <string name="LoginDownloadingClothing">Sto caricando i vestiti...</string> - <string name="InvalidCertificate">Il server ha inviato un certificato non valido o errato. Rivolgiti all'amministratore della griglia.</string> - <string name="CertInvalidHostname">Per accedere al server è stato utilizzato un nome host non valido; controlla lo SLURL o il nome host della griglia.</string> - <string name="CertExpired">Il certificato inviato dalla griglia sembra essere scaduto. Controlla l'orologio del sistema o rivolgiti all'amministratore della griglia.</string> - <string name="CertKeyUsage">Impossibile utilizzare per SSl il certificato inviato dal server. Rivolgiti all'amministratore della griglia.</string> - <string name="CertBasicConstraints">Nella catena dei certificati del server erano presenti troppi certificati. Rivolgiti all'amministratore della griglia.</string> - <string name="CertInvalidSignature">Impossibile verificare la firma del certificato inviato dal server della griglia. Rivolgiti all'amministratore della griglia.</string> - <string name="LoginFailedNoNetwork">Errore di rete: Non è stato possibile stabilire un collegamento, controlla la tua connessione.</string> - <string name="LoginFailedHeader">Accesso non riuscito.</string> - <string name="Quit">Esci</string> - <string name="create_account_url">http://join.secondlife.com/?sourceid=[sourceid]</string> - <string name="AgniGridLabel">Griglia principale di Second Life (Agni)</string> - <string name="AditiGridLabel">Griglia per beta test di Second Life (Aditi)</string> - <string name="ViewerDownloadURL">http://secondlife.com/download.</string> - <string name="LoginFailedViewerNotPermitted">Il viewer utilizzato non è più in grado di accedere a Second Life. Visita la parina seguente per scaricare un nuovo viewer: +Versione server voce: [VOICE_VERSION] + </string> + <string name="AboutTraffic"> + Pacchetti perduti: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) + </string> + <string name="AboutTime"> + [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt] + </string> + <string name="ErrorFetchingServerReleaseNotesURL"> + Errore nel recupero URL note rilascio versione + </string> + <string name="BuildConfiguration"> + Costruisci configurazione + </string> + <string name="ProgressRestoring"> + Ripristino in corso... + </string> + <string name="ProgressChangingResolution"> + Modifica della risoluzione... + </string> + <string name="Fullbright"> + Luminosità massima (vers. precedente) + </string> + <string name="LoginInProgress"> + In connessione. [APP_NAME] può sembrare rallentata. Attendi. + </string> + <string name="LoginInProgressNoFrozen"> + Accesso in corso... + </string> + <string name="LoginAuthenticating"> + In autenticazione + </string> + <string name="LoginMaintenance"> + Aggiornamento account in corso... + </string> + <string name="LoginAttempt"> + Un precedente tentativo di login è fallito. Tentativo di connessione [NUMBER] + </string> + <string name="LoginPrecaching"> + Sto caricando [SECOND_LIFE]... + </string> + <string name="LoginInitializingBrowser"> + Inizializzazione del browser web incorporato... + </string> + <string name="LoginInitializingMultimedia"> + Inizializzazione dati multimediali... + </string> + <string name="LoginInitializingFonts"> + Caricamento caratteri... + </string> + <string name="LoginVerifyingCache"> + Verifica file della cache (tempo previsto 60-90 secondi)... + </string> + <string name="LoginProcessingResponse"> + Elaborazione risposta... + </string> + <string name="LoginInitializingWorld"> + Inizializzazione mondo... + </string> + <string name="LoginDecodingImages"> + Decodifica immagini... + </string> + <string name="LoginInitializingQuicktime"> + Inizializzazione QuickTime... + </string> + <string name="LoginQuicktimeNotFound"> + QuickTime non trovato - impossibile inizializzare. + </string> + <string name="LoginQuicktimeOK"> + QuickTime configurato con successo. + </string> + <string name="LoginRequestSeedCapGrant"> + Richiesta capacità regione... + </string> + <string name="LoginRetrySeedCapGrant"> + Richiesta capacità regione, tentativo [NUMBER]... + </string> + <string name="LoginWaitingForRegionHandshake"> + In attesa della risposta della regione... + </string> + <string name="LoginConnectingToRegion"> + Connessione alla regione... + </string> + <string name="LoginDownloadingClothing"> + Sto caricando i vestiti... + </string> + <string name="InvalidCertificate"> + Il server ha inviato un certificato non valido o errato. Rivolgiti all'amministratore della griglia. + </string> + <string name="CertInvalidHostname"> + Per accedere al server è stato utilizzato un nome host non valido; controlla lo SLURL o il nome host della griglia. + </string> + <string name="CertExpired"> + Il certificato inviato dalla griglia sembra essere scaduto. Controlla l'orologio del sistema o rivolgiti all'amministratore della griglia. + </string> + <string name="CertKeyUsage"> + Impossibile utilizzare per SSl il certificato inviato dal server. Rivolgiti all'amministratore della griglia. + </string> + <string name="CertBasicConstraints"> + Nella catena dei certificati del server erano presenti troppi certificati. Rivolgiti all'amministratore della griglia. + </string> + <string name="CertInvalidSignature"> + Impossibile verificare la firma del certificato inviato dal server della griglia. Rivolgiti all'amministratore della griglia. + </string> + <string name="LoginFailedNoNetwork"> + Errore di rete: Non è stato possibile stabilire un collegamento, controlla la tua connessione. + </string> + <string name="LoginFailedHeader"> + Accesso non riuscito. + </string> + <string name="Quit"> + Esci + </string> + <string name="create_account_url"> + http://join.secondlife.com/?sourceid=[sourceid] + </string> + <string name="AgniGridLabel"> + Griglia principale di Second Life (Agni) + </string> + <string name="AditiGridLabel"> + Griglia per beta test di Second Life (Aditi) + </string> + <string name="ViewerDownloadURL"> + http://secondlife.com/download. + </string> + <string name="LoginFailedViewerNotPermitted"> + Il viewer utilizzato non è più in grado di accedere a Second Life. Visita la parina seguente per scaricare un nuovo viewer: http://secondlife.com/download. Per maggiori informazioni, consulta le domande frequenti alla pagina seguente: -http://secondlife.com/viewer-access-faq</string> - <string name="LoginIntermediateOptionalUpdateAvailable">Disponibile aggiornamento facoltativo viewer: [VERSION]</string> - <string name="LoginFailedRequiredUpdate">Aggernamento viewer richiesto: [VERSION]</string> - <string name="LoginFailedAlreadyLoggedIn">Questo agente ha già eseguito il login.</string> - <string name="LoginFailedAuthenticationFailed">Siamo spiacenti. Il tentativo di accesso non è riuscito. +http://secondlife.com/viewer-access-faq + </string> + <string name="LoginIntermediateOptionalUpdateAvailable"> + Disponibile aggiornamento facoltativo viewer: [VERSION] + </string> + <string name="LoginFailedRequiredUpdate"> + Aggernamento viewer richiesto: [VERSION] + </string> + <string name="LoginFailedAlreadyLoggedIn"> + Questo agente ha già eseguito il login. + </string> + <string name="LoginFailedAuthenticationFailed"> + Siamo spiacenti. Il tentativo di accesso non è riuscito. Verifica di avere inserito correttamente * Nome utente (come robby12 o Stella Soleggiato) * Password -Verifica anche che il blocco delle maiuscole non sia attivato.</string> - <string name="LoginFailedPasswordChanged">Come misura precauzionale, la tua password è stata cambiata. +Verifica anche che il blocco delle maiuscole non sia attivato. + </string> + <string name="LoginFailedPasswordChanged"> + Come misura precauzionale, la tua password è stata cambiata. Visita la pagina del tuo account a http://secondlife.com/password e rispondi alla domanda di sicurezza per reimpostare la password. -Ci scusiamo per l'inconveniente.</string> - <string name="LoginFailedPasswordReset">Abbiamo effettuato delle modifiche al sistema che richiedono di reimpostare la password. +Ci scusiamo per l'inconveniente. + </string> + <string name="LoginFailedPasswordReset"> + Abbiamo effettuato delle modifiche al sistema che richiedono di reimpostare la password. Visita la pagina del tuo account a http://secondlife.com/password e rispondi alla domanda di sicurezza per reimpostare la password. -Ci scusiamo per l'inconveniente.</string> - <string name="LoginFailedEmployeesOnly">Second Life è chiuso temporaneamente per manutenzione. +Ci scusiamo per l'inconveniente. + </string> + <string name="LoginFailedEmployeesOnly"> + Second Life è chiuso temporaneamente per manutenzione. Al momento, solo i dipendenti possono eseguire l'accesso. -Visita www.secondlife.com/status per aggiornamenti.</string> - <string name="LoginFailedPremiumOnly">L'accesso a Second Life è temporaneamente limitato per garantire che chi è nel mondo virtuale abbia la migliore esperienza possibile. +Visita www.secondlife.com/status per aggiornamenti. + </string> + <string name="LoginFailedPremiumOnly"> + L'accesso a Second Life è temporaneamente limitato per garantire che chi è nel mondo virtuale abbia la migliore esperienza possibile. -Le persone con account gratuiti non potranno accedere a Second Life durante questo periodo, per lasciare spazio alle persone che hanno pagato per Second Life.</string> - <string name="LoginFailedComputerProhibited">Non si può accedere a Second Life da questo computer. +Le persone con account gratuiti non potranno accedere a Second Life durante questo periodo, per lasciare spazio alle persone che hanno pagato per Second Life. + </string> + <string name="LoginFailedComputerProhibited"> + Non si può accedere a Second Life da questo computer. Se ritieni che si tratta di un errore, contatta -support@secondlife.com.</string> - <string name="LoginFailedAcountSuspended">Il tuo account non è accessibile fino alle -[TIME] fuso orario del Pacifico.</string> - <string name="LoginFailedAccountDisabled">Non siamo attualmente in grado di completare la tua richiesta. -Contatta l'assistenza Second Life alla pagina http://support.secondlife.com.</string> - <string name="LoginFailedTransformError">Dati incompatibili rilevati durante l'accesso. -Contattare support@secondlife.com.</string> - <string name="LoginFailedAccountMaintenance">Il tuo account è in fase di leggera manutenzione. +support@secondlife.com. + </string> + <string name="LoginFailedAcountSuspended"> + Il tuo account non è accessibile fino alle +[TIME] fuso orario del Pacifico. + </string> + <string name="LoginFailedAccountDisabled"> + Non siamo attualmente in grado di completare la tua richiesta. +Contatta l'assistenza Second Life alla pagina http://support.secondlife.com. + </string> + <string name="LoginFailedTransformError"> + Dati incompatibili rilevati durante l'accesso. +Contattare support@secondlife.com. + </string> + <string name="LoginFailedAccountMaintenance"> + Il tuo account è in fase di leggera manutenzione. Il tuo account non è accessibile fino alle [TIME] fuso orario del Pacifico. -Se ritieni che si tratta di un errore, contatta support@secondlife.com.</string> - <string name="LoginFailedPendingLogoutFault">Errore del simulatore in seguito alla richiesta di logout.</string> - <string name="LoginFailedPendingLogout">Il sistema sta eseguendo il logout in questo momento. -Prova ad accedere nuovamente tra un minuto.</string> - <string name="LoginFailedUnableToCreateSession">Non è possibile creare una sessione valida.</string> - <string name="LoginFailedUnableToConnectToSimulator">Non è possibile collegarsi a un simulatore.</string> - <string name="LoginFailedRestrictedHours">Il tuo account può accedere a Second Life solo +Se ritieni che si tratta di un errore, contatta support@secondlife.com. + </string> + <string name="LoginFailedPendingLogoutFault"> + Errore del simulatore in seguito alla richiesta di logout. + </string> + <string name="LoginFailedPendingLogout"> + Il sistema sta eseguendo il logout in questo momento. +Prova ad accedere nuovamente tra un minuto. + </string> + <string name="LoginFailedUnableToCreateSession"> + Non è possibile creare una sessione valida. + </string> + <string name="LoginFailedUnableToConnectToSimulator"> + Non è possibile collegarsi a un simulatore. + </string> + <string name="LoginFailedRestrictedHours"> + Il tuo account può accedere a Second Life solo tra le [START] e le [END] fuso orario del Pacifico. Torna durante quell'orario. -Se ritieni che si tratta di un errore, contatta support@secondlife.com.</string> - <string name="LoginFailedIncorrectParameters">Parametri errati. -Se ritieni che si tratta di un errore, contatta support@secondlife.com.</string> - <string name="LoginFailedFirstNameNotAlphanumeric">Il parametro Nome deve includere solo caratteri alfanumerici. -Se ritieni che si tratta di un errore, contatta support@secondlife.com.</string> - <string name="LoginFailedLastNameNotAlphanumeric">Il parametro Cognome deve includere solo caratteri alfanumerici. -Se ritieni che si tratta di un errore, contatta support@secondlife.com.</string> - <string name="LogoutFailedRegionGoingOffline">La regione sta passando allo stato non in linea. -Prova ad accedere nuovamente tra un minuto.</string> - <string name="LogoutFailedAgentNotInRegion">L'agente non è nella regione. -Prova ad accedere nuovamente tra un minuto.</string> - <string name="LogoutFailedPendingLogin">La regione ha eseguito l'accesso in un'altre sessione. -Prova ad accedere nuovamente tra un minuto.</string> - <string name="LogoutFailedLoggingOut">La regione stava eseguendo il logout della sessione precedente. -Prova ad accedere nuovamente tra un minuto.</string> - <string name="LogoutFailedStillLoggingOut">La regione sta ancora eseguendo il logout della sessione precedente. -Prova ad accedere nuovamente tra un minuto.</string> - <string name="LogoutSucceeded">La regione ha eseguito il logout dell'ultima sessione. -Prova ad accedere nuovamente tra un minuto.</string> - <string name="LogoutFailedLogoutBegun">La regione ha iniziato la procedura di logout. -Prova ad accedere nuovamente tra un minuto.</string> - <string name="LoginFailedLoggingOutSession">Il sistema ha iniziato il logout dell'ultima sessione. -Prova ad accedere nuovamente tra un minuto.</string> - <string name="AgentLostConnection">Questa regione sta avendo problemi. Verifica la tua connessione a Internet.</string> - <string name="SavingSettings">Salvataggio delle impostazioni...</string> - <string name="LoggingOut">Uscita...</string> - <string name="ShuttingDown">Chiusura...</string> - <string name="YouHaveBeenDisconnected">Sei scollegato dalla regione in cui ti trovavi.</string> - <string name="SentToInvalidRegion">Sei stato indirizzato in una regione non valida.</string> - <string name="TestingDisconnect">Verifica scollegamento viewer</string> - <string name="SocialFacebookConnecting">Connessione a Facebook in corso...</string> - <string name="SocialFacebookPosting">Caricamento post...</string> - <string name="SocialFacebookDisconnecting">Disconnessione da Facebook in corso...</string> - <string name="SocialFacebookErrorConnecting">Problemi con la connessione a Facebook</string> - <string name="SocialFacebookErrorPosting">Problemi con la connessione a Facebook</string> - <string name="SocialFacebookErrorDisconnecting">Problemi con la disconnessione da Facebook</string> - <string name="SocialFlickrConnecting">Collegamento a Flickr...</string> - <string name="SocialFlickrPosting">Caricamento post...</string> - <string name="SocialFlickrDisconnecting">Interruzione del collegamento con Flickr...</string> - <string name="SocialFlickrErrorConnecting">Problema nel collegamento a Flickr</string> - <string name="SocialFlickrErrorPosting">Problema nel caricamento post su Flickr</string> - <string name="SocialFlickrErrorDisconnecting">Problema nell'interruzione del collegamento da Flickr</string> - <string name="SocialTwitterConnecting">Collegamento a Twitter...</string> - <string name="SocialTwitterPosting">Caricamento post...</string> - <string name="SocialTwitterDisconnecting">Interruzione del collegamento con Twitter...</string> - <string name="SocialTwitterErrorConnecting">Problema nel collegamento a Twitter</string> - <string name="SocialTwitterErrorPosting">Problema nel caricamento post su Twitter</string> - <string name="SocialTwitterErrorDisconnecting">Problema nell'interruzione del collegamento da Twitter</string> - <string name="BlackAndWhite">Bianco e nero</string> - <string name="Colors1970">Colori anni '70</string> - <string name="Intense">Intenso</string> - <string name="Newspaper">Giornale</string> - <string name="Sepia">Seppia</string> - <string name="Spotlight">Faretto</string> - <string name="Video">Video</string> - <string name="Autocontrast">Auto contrasto</string> - <string name="LensFlare">Bagliore</string> - <string name="Miniature">Miniatura</string> - <string name="Toycamera">Toy camera</string> - <string name="TooltipPerson">Persona</string> - <string name="TooltipNoName">(nessun nome)</string> - <string name="TooltipOwner">Proprietario:</string> - <string name="TooltipPublic">Pubblico</string> - <string name="TooltipIsGroup">(Gruppo)</string> - <string name="TooltipForSaleL$">In Vendita: [AMOUNT]L$</string> - <string name="TooltipFlagGroupBuild">Costruzione solo con gruppo</string> - <string name="TooltipFlagNoBuild">Divieto di Costruire</string> - <string name="TooltipFlagNoEdit">Costruzione solo con gruppo</string> - <string name="TooltipFlagNotSafe">Non Sicuro</string> - <string name="TooltipFlagNoFly">Divieto di Volare</string> - <string name="TooltipFlagGroupScripts">Script solo con gruppo</string> - <string name="TooltipFlagNoScripts">Script vietati</string> - <string name="TooltipLand">Terreno:</string> - <string name="TooltipMustSingleDrop">Solo un singolo oggetto può essere creato qui</string> - <string name="TooltipTooManyWearables">Non puoi indossare una cartella che contiene più di [AMOUNT] elementi. Per modificare questo limite, accedi ad Avanzate > Mostra impostazioni di debug > WearFolderLimit.</string> +Se ritieni che si tratta di un errore, contatta support@secondlife.com. + </string> + <string name="LoginFailedIncorrectParameters"> + Parametri errati. +Se ritieni che si tratta di un errore, contatta support@secondlife.com. + </string> + <string name="LoginFailedFirstNameNotAlphanumeric"> + Il parametro Nome deve includere solo caratteri alfanumerici. +Se ritieni che si tratta di un errore, contatta support@secondlife.com. + </string> + <string name="LoginFailedLastNameNotAlphanumeric"> + Il parametro Cognome deve includere solo caratteri alfanumerici. +Se ritieni che si tratta di un errore, contatta support@secondlife.com. + </string> + <string name="LogoutFailedRegionGoingOffline"> + La regione sta passando allo stato non in linea. +Prova ad accedere nuovamente tra un minuto. + </string> + <string name="LogoutFailedAgentNotInRegion"> + L'agente non è nella regione. +Prova ad accedere nuovamente tra un minuto. + </string> + <string name="LogoutFailedPendingLogin"> + La regione ha eseguito l'accesso in un'altre sessione. +Prova ad accedere nuovamente tra un minuto. + </string> + <string name="LogoutFailedLoggingOut"> + La regione stava eseguendo il logout della sessione precedente. +Prova ad accedere nuovamente tra un minuto. + </string> + <string name="LogoutFailedStillLoggingOut"> + La regione sta ancora eseguendo il logout della sessione precedente. +Prova ad accedere nuovamente tra un minuto. + </string> + <string name="LogoutSucceeded"> + La regione ha eseguito il logout dell'ultima sessione. +Prova ad accedere nuovamente tra un minuto. + </string> + <string name="LogoutFailedLogoutBegun"> + La regione ha iniziato la procedura di logout. +Prova ad accedere nuovamente tra un minuto. + </string> + <string name="LoginFailedLoggingOutSession"> + Il sistema ha iniziato il logout dell'ultima sessione. +Prova ad accedere nuovamente tra un minuto. + </string> + <string name="AgentLostConnection"> + Questa regione sta avendo problemi. Verifica la tua connessione a Internet. + </string> + <string name="SavingSettings"> + Salvataggio delle impostazioni... + </string> + <string name="LoggingOut"> + Uscita... + </string> + <string name="ShuttingDown"> + Chiusura... + </string> + <string name="YouHaveBeenDisconnected"> + Sei scollegato dalla regione in cui ti trovavi. + </string> + <string name="SentToInvalidRegion"> + Sei stato indirizzato in una regione non valida. + </string> + <string name="TestingDisconnect"> + Verifica scollegamento viewer + </string> + <string name="SocialFacebookConnecting"> + Connessione a Facebook in corso... + </string> + <string name="SocialFacebookPosting"> + Caricamento post... + </string> + <string name="SocialFacebookDisconnecting"> + Disconnessione da Facebook in corso... + </string> + <string name="SocialFacebookErrorConnecting"> + Problemi con la connessione a Facebook + </string> + <string name="SocialFacebookErrorPosting"> + Problemi con la connessione a Facebook + </string> + <string name="SocialFacebookErrorDisconnecting"> + Problemi con la disconnessione da Facebook + </string> + <string name="SocialFlickrConnecting"> + Collegamento a Flickr... + </string> + <string name="SocialFlickrPosting"> + Caricamento post... + </string> + <string name="SocialFlickrDisconnecting"> + Interruzione del collegamento con Flickr... + </string> + <string name="SocialFlickrErrorConnecting"> + Problema nel collegamento a Flickr + </string> + <string name="SocialFlickrErrorPosting"> + Problema nel caricamento post su Flickr + </string> + <string name="SocialFlickrErrorDisconnecting"> + Problema nell'interruzione del collegamento da Flickr + </string> + <string name="SocialTwitterConnecting"> + Collegamento a Twitter... + </string> + <string name="SocialTwitterPosting"> + Caricamento post... + </string> + <string name="SocialTwitterDisconnecting"> + Interruzione del collegamento con Twitter... + </string> + <string name="SocialTwitterErrorConnecting"> + Problema nel collegamento a Twitter + </string> + <string name="SocialTwitterErrorPosting"> + Problema nel caricamento post su Twitter + </string> + <string name="SocialTwitterErrorDisconnecting"> + Problema nell'interruzione del collegamento da Twitter + </string> + <string name="BlackAndWhite"> + Bianco e nero + </string> + <string name="Colors1970"> + Colori anni '70 + </string> + <string name="Intense"> + Intenso + </string> + <string name="Newspaper"> + Giornale + </string> + <string name="Sepia"> + Seppia + </string> + <string name="Spotlight"> + Faretto + </string> + <string name="Video"> + Video + </string> + <string name="Autocontrast"> + Auto contrasto + </string> + <string name="LensFlare"> + Bagliore + </string> + <string name="Miniature"> + Miniatura + </string> + <string name="Toycamera"> + Toy camera + </string> + <string name="TooltipPerson"> + Persona + </string> + <string name="TooltipNoName"> + (nessun nome) + </string> + <string name="TooltipOwner"> + Proprietario: + </string> + <string name="TooltipPublic"> + Pubblico + </string> + <string name="TooltipIsGroup"> + (Gruppo) + </string> + <string name="TooltipForSaleL$"> + In Vendita: [AMOUNT]L$ + </string> + <string name="TooltipFlagGroupBuild"> + Costruzione solo con gruppo + </string> + <string name="TooltipFlagNoBuild"> + Divieto di Costruire + </string> + <string name="TooltipFlagNoEdit"> + Costruzione solo con gruppo + </string> + <string name="TooltipFlagNotSafe"> + Non Sicuro + </string> + <string name="TooltipFlagNoFly"> + Divieto di Volare + </string> + <string name="TooltipFlagGroupScripts"> + Script solo con gruppo + </string> + <string name="TooltipFlagNoScripts"> + Script vietati + </string> + <string name="TooltipLand"> + Terreno: + </string> + <string name="TooltipMustSingleDrop"> + Solo un singolo oggetto può essere creato qui + </string> + <string name="TooltipTooManyWearables"> + Non puoi indossare una cartella che contiene più di [AMOUNT] elementi. Per modificare questo limite, accedi ad Avanzate > Mostra impostazioni di debug > WearFolderLimit. + </string> <string name="TooltipPrice" value="L$ [AMOUNT]:"/> - <string name="TooltipSLIcon">Questo link porta a una pagina nel dominio ufficiale SecondLife.com o LindenLab.com.</string> - <string name="TooltipOutboxDragToWorld">Non puoi rezzare articoli dalla cartella degli annunci di Marketplace</string> - <string name="TooltipOutboxWorn">Non puoi inserire nella cartella degli annunci in Marketplace gli articoli che indossi</string> - <string name="TooltipOutboxFolderLevels">La profondità delle caselle nidificate è maggiore di [AMOUNT]. Diminuisci la profondità delle cartelle nidificate; se necessario, raggruppa gli articoli.</string> - <string name="TooltipOutboxTooManyFolders">Il numero di sottocartelle è maggiore di [AMOUNT]. Diminuisci il numero delle cartelle nel tuo annuncio; se necessario, raggruppa gli articoli.</string> - <string name="TooltipOutboxTooManyObjects">Il numero di articoli è maggiore di [AMOUNT]. Per vendere più di [AMOUNT] articoli in un annuncio, devi raggruppare alcuni di essi.</string> - <string name="TooltipOutboxTooManyStockItems">Il numero di articoli in magazzino è maggiore di [AMOUNT].</string> - <string name="TooltipOutboxCannotDropOnRoot">Puoi trascinare elementi o cartelle solo nelle schede TUTTI o NON ASSOCIATO. Seleziona una di quelle schede e sposta nuovamente gli elementi o le cartelle.</string> - <string name="TooltipOutboxNoTransfer">Almeno uno di questi oggetti non può essere venduto o trasferito</string> - <string name="TooltipOutboxNotInInventory">Puoi aggiungere a Marketplace solo gli articoli nel tuo inventario</string> - <string name="TooltipOutboxLinked">Non puoi inserire cartelle o articoli collegati tramite link nel Marketplace</string> - <string name="TooltipOutboxCallingCard">Non puoi inserire biglietti da visita in Marketplace</string> - <string name="TooltipOutboxDragActive">non puoi muovere un annuncio attivo</string> - <string name="TooltipOutboxCannotMoveRoot">Non puoi spostare la cartella principale degli annunci di Marketplace</string> - <string name="TooltipOutboxMixedStock">Tutti gli articoli in una cartella di magazzino devono essere dello stesso tipo e con le stesse autorizzazioni</string> - <string name="TooltipDragOntoOwnChild">Non puoi spostare una cartella nella relativa cartella secondaria</string> - <string name="TooltipDragOntoSelf">Non puoi spostare una cartella in se stessa</string> - <string name="TooltipHttpUrl">Clicca per visitare questa pagina web</string> - <string name="TooltipSLURL">Clicca per avere maggiori informazioni sul luogo</string> - <string name="TooltipAgentUrl">Clicca per vedere il profilo di questo residente</string> - <string name="TooltipAgentInspect">Ulteriori informazioni su questo Residente</string> - <string name="TooltipAgentMute">Clicca per disattivare l'audio di questo residente</string> - <string name="TooltipAgentUnmute">Clicca per attivare l'audio del residente</string> - <string name="TooltipAgentIM">Clicca per inviare un IM a questo residente</string> - <string name="TooltipAgentPay">Clicca per pagare il residente</string> - <string name="TooltipAgentOfferTeleport">Fai clic per inviare un'offerta di teleport al residente</string> - <string name="TooltipAgentRequestFriend">Fai clic per inviare una richiesta di amicizia al residente</string> - <string name="TooltipGroupUrl">Clicca per vedere la descrizione del gruppo</string> - <string name="TooltipEventUrl">Clicca per vedere la descrizione dell'evento</string> - <string name="TooltipClassifiedUrl">Clicca per vedere questa inserzione</string> - <string name="TooltipParcelUrl">Clicca per vedere la descrizione del lotto</string> - <string name="TooltipTeleportUrl">Clicca per effettuare il teleport a questa destinazione</string> - <string name="TooltipObjectIMUrl">Clicca per vedere la descrizione dell'oggetto</string> - <string name="TooltipMapUrl">Clicca per vedere questo posto sulla mappa</string> - <string name="TooltipSLAPP">Clicca per avviare il comando secondlife://</string> + <string name="TooltipSLIcon"> + Questo link porta a una pagina nel dominio ufficiale SecondLife.com o LindenLab.com. + </string> + <string name="TooltipOutboxDragToWorld"> + Non puoi rezzare articoli dalla cartella degli annunci di Marketplace + </string> + <string name="TooltipOutboxWorn"> + Non puoi inserire nella cartella degli annunci in Marketplace gli articoli che indossi + </string> + <string name="TooltipOutboxFolderLevels"> + La profondità delle caselle nidificate è maggiore di [AMOUNT]. Diminuisci la profondità delle cartelle nidificate; se necessario, raggruppa gli articoli. + </string> + <string name="TooltipOutboxTooManyFolders"> + Il numero di sottocartelle è maggiore di [AMOUNT]. Diminuisci il numero delle cartelle nel tuo annuncio; se necessario, raggruppa gli articoli. + </string> + <string name="TooltipOutboxTooManyObjects"> + Il numero di articoli è maggiore di [AMOUNT]. Per vendere più di [AMOUNT] articoli in un annuncio, devi raggruppare alcuni di essi. + </string> + <string name="TooltipOutboxTooManyStockItems"> + Il numero di articoli in magazzino è maggiore di [AMOUNT]. + </string> + <string name="TooltipOutboxCannotDropOnRoot"> + Puoi trascinare elementi o cartelle solo nelle schede TUTTI o NON ASSOCIATO. Seleziona una di quelle schede e sposta nuovamente gli elementi o le cartelle. + </string> + <string name="TooltipOutboxNoTransfer"> + Almeno uno di questi oggetti non può essere venduto o trasferito + </string> + <string name="TooltipOutboxNotInInventory"> + Puoi aggiungere a Marketplace solo gli articoli nel tuo inventario + </string> + <string name="TooltipOutboxLinked"> + Non puoi inserire cartelle o articoli collegati tramite link nel Marketplace + </string> + <string name="TooltipOutboxCallingCard"> + Non puoi inserire biglietti da visita in Marketplace + </string> + <string name="TooltipOutboxDragActive"> + non puoi muovere un annuncio attivo + </string> + <string name="TooltipOutboxCannotMoveRoot"> + Non puoi spostare la cartella principale degli annunci di Marketplace + </string> + <string name="TooltipOutboxMixedStock"> + Tutti gli articoli in una cartella di magazzino devono essere dello stesso tipo e con le stesse autorizzazioni + </string> + <string name="TooltipDragOntoOwnChild"> + Non puoi spostare una cartella nella relativa cartella secondaria + </string> + <string name="TooltipDragOntoSelf"> + Non puoi spostare una cartella in se stessa + </string> + <string name="TooltipHttpUrl"> + Clicca per visitare questa pagina web + </string> + <string name="TooltipSLURL"> + Clicca per avere maggiori informazioni sul luogo + </string> + <string name="TooltipAgentUrl"> + Clicca per vedere il profilo di questo residente + </string> + <string name="TooltipAgentInspect"> + Ulteriori informazioni su questo Residente + </string> + <string name="TooltipAgentMute"> + Clicca per disattivare l'audio di questo residente + </string> + <string name="TooltipAgentUnmute"> + Clicca per attivare l'audio del residente + </string> + <string name="TooltipAgentIM"> + Clicca per inviare un IM a questo residente + </string> + <string name="TooltipAgentPay"> + Clicca per pagare il residente + </string> + <string name="TooltipAgentOfferTeleport"> + Fai clic per inviare un'offerta di teleport al residente + </string> + <string name="TooltipAgentRequestFriend"> + Fai clic per inviare una richiesta di amicizia al residente + </string> + <string name="TooltipGroupUrl"> + Clicca per vedere la descrizione del gruppo + </string> + <string name="TooltipEventUrl"> + Clicca per vedere la descrizione dell'evento + </string> + <string name="TooltipClassifiedUrl"> + Clicca per vedere questa inserzione + </string> + <string name="TooltipParcelUrl"> + Clicca per vedere la descrizione del lotto + </string> + <string name="TooltipTeleportUrl"> + Clicca per effettuare il teleport a questa destinazione + </string> + <string name="TooltipObjectIMUrl"> + Clicca per vedere la descrizione dell'oggetto + </string> + <string name="TooltipMapUrl"> + Clicca per vedere questo posto sulla mappa + </string> + <string name="TooltipSLAPP"> + Clicca per avviare il comando secondlife:// + </string> <string name="CurrentURL" value="URL attuale: [CurrentURL]"/> - <string name="TooltipEmail">Fai clic per comporre un'email</string> - <string name="SLurlLabelTeleport">Teleportati a</string> - <string name="SLurlLabelShowOnMap">Mostra la mappa per</string> - <string name="SLappAgentMute">Disattiva audio</string> - <string name="SLappAgentUnmute">Riattiva audio</string> - <string name="SLappAgentIM">IM</string> - <string name="SLappAgentPay">Paga</string> - <string name="SLappAgentOfferTeleport">Offri teleport a</string> - <string name="SLappAgentRequestFriend">Richiesta di amicizia</string> - <string name="SLappAgentRemoveFriend">Rimozione amico</string> - <string name="BUTTON_CLOSE_DARWIN">Chiudi (⌘W)</string> - <string name="BUTTON_CLOSE_WIN">Chiudi (Ctrl+W)</string> - <string name="BUTTON_CLOSE_CHROME">Chiudi</string> - <string name="BUTTON_RESTORE">Ripristina</string> - <string name="BUTTON_MINIMIZE">Minimizza</string> - <string name="BUTTON_TEAR_OFF">Distacca</string> - <string name="BUTTON_DOCK">Àncora</string> - <string name="BUTTON_HELP">Mostra Aiuto</string> - <string name="TooltipNotecardNotAllowedTypeDrop">Oggetti di questo tipo non possono essere allegati ai -biglietti in questa regione.</string> - <string name="TooltipNotecardOwnerRestrictedDrop">Solamente gli oggetti con autorizzazioni + <string name="TooltipEmail"> + Fai clic per comporre un'email + </string> + <string name="SLurlLabelTeleport"> + Teleportati a + </string> + <string name="SLurlLabelShowOnMap"> + Mostra la mappa per + </string> + <string name="SLappAgentMute"> + Disattiva audio + </string> + <string name="SLappAgentUnmute"> + Riattiva audio + </string> + <string name="SLappAgentIM"> + IM + </string> + <string name="SLappAgentPay"> + Paga + </string> + <string name="SLappAgentOfferTeleport"> + Offri teleport a + </string> + <string name="SLappAgentRequestFriend"> + Richiesta di amicizia + </string> + <string name="SLappAgentRemoveFriend"> + Rimozione amico + </string> + <string name="BUTTON_CLOSE_DARWIN"> + Chiudi (⌘W) + </string> + <string name="BUTTON_CLOSE_WIN"> + Chiudi (Ctrl+W) + </string> + <string name="BUTTON_CLOSE_CHROME"> + Chiudi + </string> + <string name="BUTTON_RESTORE"> + Ripristina + </string> + <string name="BUTTON_MINIMIZE"> + Minimizza + </string> + <string name="BUTTON_TEAR_OFF"> + Distacca + </string> + <string name="BUTTON_DOCK"> + Àncora + </string> + <string name="BUTTON_HELP"> + Mostra Aiuto + </string> + <string name="TooltipNotecardNotAllowedTypeDrop"> + Oggetti di questo tipo non possono essere allegati ai +biglietti in questa regione. + </string> + <string name="TooltipNotecardOwnerRestrictedDrop"> + Solamente gli oggetti con autorizzazioni illimitate al “proprietario successivo†-possono essere allegati ai biglietti.</string> - <string name="Searching">Ricerca in corso...</string> - <string name="NoneFound">Nessun risultato.</string> - <string name="RetrievingData">Recupero dati in corso...</string> - <string name="ReleaseNotes">Note sulla versione</string> - <string name="RELEASE_NOTES_BASE_URL">https://megapahit.net/</string> - <string name="LoadingData">In caricamento...</string> - <string name="AvatarNameNobody">(nessuno)</string> - <string name="AvatarNameWaiting">(in attesa)</string> - <string name="GroupNameNone">(nessuno)</string> - <string name="AssetErrorNone">Nessun errore</string> - <string name="AssetErrorRequestFailed">Richiesta risorsa: fallita</string> - <string name="AssetErrorNonexistentFile">Richiesta risorsa: file non esistente</string> - <string name="AssetErrorNotInDatabase">Richiesta risorsa: risorsa non trovata nel database</string> - <string name="AssetErrorEOF">Fine del file</string> - <string name="AssetErrorCannotOpenFile">Apertura del file non possibile</string> - <string name="AssetErrorFileNotFound">File non trovato</string> - <string name="AssetErrorTCPTimeout">Tempo esaurito per il trasferimento file</string> - <string name="AssetErrorCircuitGone">Circuito perso</string> - <string name="AssetErrorPriceMismatch">Il programma e il server non combaciano nel prezzo</string> - <string name="AssetErrorUnknownStatus">Stato sconosciuto</string> - <string name="AssetUploadServerUnreacheble">Servizio non raggiungibile.</string> - <string name="AssetUploadServerDifficulties">Il servizio sta riscontrando difficoltà inaspettate.</string> - <string name="AssetUploadServerUnavaliable">Servizio non disponibile o limite di tempo per il caricamento raggiunto.</string> - <string name="AssetUploadRequestInvalid">Errore nella richiesta di caricamento. Vai alla pagina -http://secondlife.com/support per risolvere il problema.</string> - <string name="SettingValidationError">Impossibile convalidare le impostazioni importate [NAME]</string> - <string name="SettingImportFileError">Impossibile aprire il file [FILE]</string> - <string name="SettingParseFileError">Impossibile aprire il file [FILE]</string> - <string name="SettingTranslateError">Impossibile tradurre la legacy vento e luce [NAME]</string> - <string name="texture">texture</string> - <string name="sound">suono</string> - <string name="calling card">biglietto da visita</string> - <string name="landmark">punto di riferimento</string> - <string name="legacy script">script (vecchia versione)</string> - <string name="clothing">vestiario</string> - <string name="object">oggetto</string> - <string name="note card">biglietto</string> - <string name="folder">cartella</string> - <string name="root">cartella principale</string> - <string name="lsl2 script">script LSL2</string> - <string name="lsl bytecode">bytecode LSL</string> - <string name="tga texture">tga texture</string> - <string name="body part">parte del corpo</string> - <string name="snapshot">fotografia</string> - <string name="lost and found">oggetti smarriti</string> - <string name="targa image">immagine targa</string> - <string name="trash">Cestino</string> - <string name="jpeg image">immagine jpeg</string> - <string name="animation">animazione</string> - <string name="gesture">gesture</string> - <string name="simstate">simstate</string> - <string name="favorite">preferiti</string> - <string name="symbolic link">link</string> - <string name="symbolic folder link">link alla cartella</string> - <string name="settings blob">impostazioni</string> - <string name="mesh">reticolo</string> - <string name="AvatarEditingAppearance">(Modifica Aspetto)</string> - <string name="AvatarAway">Assente</string> - <string name="AvatarDoNotDisturb">Non disturbare</string> - <string name="AvatarMuted">Mutato</string> - <string name="anim_express_afraid">Dispiaciuto</string> - <string name="anim_express_anger">Arrabbiato</string> - <string name="anim_away">Assente</string> - <string name="anim_backflip">Salto all'indietro</string> - <string name="anim_express_laugh">Ridere a crepapelle</string> - <string name="anim_express_toothsmile">Gran sorriso</string> - <string name="anim_blowkiss">Lancia un bacio</string> - <string name="anim_express_bored">Noia</string> - <string name="anim_bow">Inchino</string> - <string name="anim_clap">Applauso</string> - <string name="anim_courtbow">Inchino a corte</string> - <string name="anim_express_cry">Pianto</string> - <string name="anim_dance1">Ballo 1</string> - <string name="anim_dance2">Ballo 2</string> - <string name="anim_dance3">Ballo 3</string> - <string name="anim_dance4">Ballo 4</string> - <string name="anim_dance5">Ballo 5</string> - <string name="anim_dance6">Ballo 6</string> - <string name="anim_dance7">Ballo 7</string> - <string name="anim_dance8">Dance 8</string> - <string name="anim_express_disdain">Sdegno</string> - <string name="anim_drink">Bere</string> - <string name="anim_express_embarrased">Imbarazzo</string> - <string name="anim_angry_fingerwag">Negare col dito</string> - <string name="anim_fist_pump">Esultare con pugno</string> - <string name="anim_yoga_float">Yoga fluttuante</string> - <string name="anim_express_frown">Acciglio</string> - <string name="anim_impatient">Impazienza</string> - <string name="anim_jumpforjoy">Salto di gioia</string> - <string name="anim_kissmybutt">Baciami il sedere</string> - <string name="anim_express_kiss">Bacio</string> - <string name="anim_laugh_short">Risata</string> - <string name="anim_musclebeach">Muscoli da spiaggia</string> - <string name="anim_no_unhappy">No (Scontento)</string> - <string name="anim_no_head">No</string> - <string name="anim_nyanya">Na-na-na</string> - <string name="anim_punch_onetwo">Uno-due pugno</string> - <string name="anim_express_open_mouth">Bocca aperta</string> - <string name="anim_peace">Pace</string> - <string name="anim_point_you">Indicare altri</string> - <string name="anim_point_me">Indicare te stesso</string> - <string name="anim_punch_l">Pugno a sinistra</string> - <string name="anim_punch_r">Pugno a destra</string> - <string name="anim_rps_countdown">Contare nella morra cinese</string> - <string name="anim_rps_paper">Carta nella morra cinese</string> - <string name="anim_rps_rock">Sasso nella morra cinese</string> - <string name="anim_rps_scissors">Forbici nella morra cinese</string> - <string name="anim_express_repulsed">Repulsione</string> - <string name="anim_kick_roundhouse_r">Calcio con rotazione</string> - <string name="anim_express_sad">Triste</string> - <string name="anim_salute">Saluto</string> - <string name="anim_shout">Urlo</string> - <string name="anim_express_shrug">Spallucce</string> - <string name="anim_express_smile">Sorriso</string> - <string name="anim_smoke_idle">Fumare</string> - <string name="anim_smoke_inhale">Fumare inspirazione</string> - <string name="anim_smoke_throw_down">Fumare mandando giù</string> - <string name="anim_express_surprise">Sorpresa</string> - <string name="anim_sword_strike_r">Colpo di spada</string> - <string name="anim_angry_tantrum">Collera</string> - <string name="anim_express_tongue_out">Linguaccia</string> - <string name="anim_hello">Saluto con mano</string> - <string name="anim_whisper">Sussurro</string> - <string name="anim_whistle">Fischio</string> - <string name="anim_express_wink">Ammicca</string> - <string name="anim_wink_hollywood">Ammicca (Hollywood)</string> - <string name="anim_express_worry">Preoccupato</string> - <string name="anim_yes_happy">Si (Felice)</string> - <string name="anim_yes_head">Si</string> - <string name="multiple_textures">Multiple</string> - <string name="use_texture">Usa texture</string> - <string name="manip_hint1">Sposta il cursore sul righello</string> - <string name="manip_hint2">per bloccare sulla griglia</string> - <string name="texture_loading">Caricamento in corso...</string> - <string name="worldmap_offline">Offline</string> - <string name="worldmap_item_tooltip_format">L$ [PRICE] - [AREA] m²</string> - <string name="worldmap_results_none_found">Nessun risultato.</string> - <string name="Ok">OK</string> - <string name="Premature end of file">Fine prematura del file</string> - <string name="ST_NO_JOINT">Impossibile trovare ROOT o JOINT.</string> - <string name="NearbyChatTitle">Chat nei dintorni</string> - <string name="NearbyChatLabel">(Chat nei dintorni)</string> - <string name="whisper">sussurra:</string> - <string name="shout">grida:</string> - <string name="ringing">In connessione alla Voice Chat in-world...</string> - <string name="connected">Connesso</string> - <string name="unavailable">Il voice non è disponibile nel posto dove ti trovi ora</string> - <string name="hang_up">Disconnesso dalla Voice Chat in-world</string> - <string name="reconnect_nearby">Sarai riconnesso alla chat vocale nei dintorni</string> - <string name="ScriptQuestionCautionChatGranted">A '[OBJECTNAME]', un oggetto di proprietà di '[OWNERNAME]', situato in [REGIONNAME] [REGIONPOS], è stato concesso il permesso di: [PERMISSIONS].</string> - <string name="ScriptQuestionCautionChatDenied">A '[OBJECTNAME]', un oggetto di proprietà di '[OWNERNAME]', situato in [REGIONNAME] [REGIONPOS], è stato negato il permesso di: [PERMISSIONS].</string> - <string name="AdditionalPermissionsRequestHeader">Se consenti l'accesso al tuo account, consentirai anche all'oggetto di:</string> - <string name="ScriptTakeMoney">Prendere dollari Linden (L$) da te</string> - <string name="ActOnControlInputs">Agire sul tuo controllo degli input</string> - <string name="RemapControlInputs">Rimappare il tuo controllo degli input</string> - <string name="AnimateYourAvatar">Animare il tuo avatar</string> - <string name="AttachToYourAvatar">Far indossare al tuo avatar</string> - <string name="ReleaseOwnership">Rilasciare la propietà è far diventare pubblico.</string> - <string name="LinkAndDelink">Collegare e scollegare dagli altri oggetti</string> - <string name="AddAndRemoveJoints">Aggiungere e rimuovere le giunzioni insieme con gli altri oggetti</string> - <string name="ChangePermissions">Cambiare i permessi</string> - <string name="TrackYourCamera">Tracciare la fotocamera</string> - <string name="ControlYourCamera">Controllare la tua fotocamera</string> - <string name="TeleportYourAgent">Teleportarti</string> - <string name="ForceSitAvatar">Forza l'avatar a sedersi</string> - <string name="ChangeEnvSettings">Cambia le impostazioni dell’ambiente</string> - <string name="AgentNameSubst">(Tu)</string> +possono essere allegati ai biglietti. + </string> + <string name="Searching"> + Ricerca in corso... + </string> + <string name="NoneFound"> + Nessun risultato. + </string> + <string name="RetrievingData"> + Recupero dati in corso... + </string> + <string name="ReleaseNotes"> + Note sulla versione + </string> + <string name="RELEASE_NOTES_BASE_URL"> + https://megapahit.net/ + </string> + <string name="LoadingData"> + In caricamento... + </string> + <string name="AvatarNameNobody"> + (nessuno) + </string> + <string name="AvatarNameWaiting"> + (in attesa) + </string> + <string name="GroupNameNone"> + (nessuno) + </string> + <string name="AssetErrorNone"> + Nessun errore + </string> + <string name="AssetErrorRequestFailed"> + Richiesta risorsa: fallita + </string> + <string name="AssetErrorNonexistentFile"> + Richiesta risorsa: file non esistente + </string> + <string name="AssetErrorNotInDatabase"> + Richiesta risorsa: risorsa non trovata nel database + </string> + <string name="AssetErrorEOF"> + Fine del file + </string> + <string name="AssetErrorCannotOpenFile"> + Apertura del file non possibile + </string> + <string name="AssetErrorFileNotFound"> + File non trovato + </string> + <string name="AssetErrorTCPTimeout"> + Tempo esaurito per il trasferimento file + </string> + <string name="AssetErrorCircuitGone"> + Circuito perso + </string> + <string name="AssetErrorPriceMismatch"> + Il programma e il server non combaciano nel prezzo + </string> + <string name="AssetErrorUnknownStatus"> + Stato sconosciuto + </string> + <string name="AssetUploadServerUnreacheble"> + Servizio non raggiungibile. + </string> + <string name="AssetUploadServerDifficulties"> + Il servizio sta riscontrando difficoltà inaspettate. + </string> + <string name="AssetUploadServerUnavaliable"> + Servizio non disponibile o limite di tempo per il caricamento raggiunto. + </string> + <string name="AssetUploadRequestInvalid"> + Errore nella richiesta di caricamento. Vai alla pagina +http://secondlife.com/support per risolvere il problema. + </string> + <string name="SettingValidationError"> + Impossibile convalidare le impostazioni importate [NAME] + </string> + <string name="SettingImportFileError"> + Impossibile aprire il file [FILE] + </string> + <string name="SettingParseFileError"> + Impossibile aprire il file [FILE] + </string> + <string name="SettingTranslateError"> + Impossibile tradurre la legacy vento e luce [NAME] + </string> + <string name="texture"> + texture + </string> + <string name="sound"> + suono + </string> + <string name="calling card"> + biglietto da visita + </string> + <string name="landmark"> + punto di riferimento + </string> + <string name="legacy script"> + script (vecchia versione) + </string> + <string name="clothing"> + vestiario + </string> + <string name="object"> + oggetto + </string> + <string name="note card"> + biglietto + </string> + <string name="folder"> + cartella + </string> + <string name="root"> + cartella principale + </string> + <string name="lsl2 script"> + script LSL2 + </string> + <string name="lsl bytecode"> + bytecode LSL + </string> + <string name="tga texture"> + tga texture + </string> + <string name="body part"> + parte del corpo + </string> + <string name="snapshot"> + fotografia + </string> + <string name="lost and found"> + oggetti smarriti + </string> + <string name="targa image"> + immagine targa + </string> + <string name="trash"> + Cestino + </string> + <string name="jpeg image"> + immagine jpeg + </string> + <string name="animation"> + animazione + </string> + <string name="gesture"> + gesture + </string> + <string name="simstate"> + simstate + </string> + <string name="favorite"> + preferiti + </string> + <string name="symbolic link"> + link + </string> + <string name="symbolic folder link"> + link alla cartella + </string> + <string name="settings blob"> + impostazioni + </string> + <string name="mesh"> + reticolo + </string> + <string name="AvatarEditingAppearance"> + (Modifica Aspetto) + </string> + <string name="AvatarAway"> + Assente + </string> + <string name="AvatarDoNotDisturb"> + Non disturbare + </string> + <string name="AvatarMuted"> + Mutato + </string> + <string name="anim_express_afraid"> + Dispiaciuto + </string> + <string name="anim_express_anger"> + Arrabbiato + </string> + <string name="anim_away"> + Assente + </string> + <string name="anim_backflip"> + Salto all'indietro + </string> + <string name="anim_express_laugh"> + Ridere a crepapelle + </string> + <string name="anim_express_toothsmile"> + Gran sorriso + </string> + <string name="anim_blowkiss"> + Lancia un bacio + </string> + <string name="anim_express_bored"> + Noia + </string> + <string name="anim_bow"> + Inchino + </string> + <string name="anim_clap"> + Applauso + </string> + <string name="anim_courtbow"> + Inchino a corte + </string> + <string name="anim_express_cry"> + Pianto + </string> + <string name="anim_dance1"> + Ballo 1 + </string> + <string name="anim_dance2"> + Ballo 2 + </string> + <string name="anim_dance3"> + Ballo 3 + </string> + <string name="anim_dance4"> + Ballo 4 + </string> + <string name="anim_dance5"> + Ballo 5 + </string> + <string name="anim_dance6"> + Ballo 6 + </string> + <string name="anim_dance7"> + Ballo 7 + </string> + <string name="anim_dance8"> + Dance 8 + </string> + <string name="anim_express_disdain"> + Sdegno + </string> + <string name="anim_drink"> + Bere + </string> + <string name="anim_express_embarrased"> + Imbarazzo + </string> + <string name="anim_angry_fingerwag"> + Negare col dito + </string> + <string name="anim_fist_pump"> + Esultare con pugno + </string> + <string name="anim_yoga_float"> + Yoga fluttuante + </string> + <string name="anim_express_frown"> + Acciglio + </string> + <string name="anim_impatient"> + Impazienza + </string> + <string name="anim_jumpforjoy"> + Salto di gioia + </string> + <string name="anim_kissmybutt"> + Baciami il sedere + </string> + <string name="anim_express_kiss"> + Bacio + </string> + <string name="anim_laugh_short"> + Risata + </string> + <string name="anim_musclebeach"> + Muscoli da spiaggia + </string> + <string name="anim_no_unhappy"> + No (Scontento) + </string> + <string name="anim_no_head"> + No + </string> + <string name="anim_nyanya"> + Na-na-na + </string> + <string name="anim_punch_onetwo"> + Uno-due pugno + </string> + <string name="anim_express_open_mouth"> + Bocca aperta + </string> + <string name="anim_peace"> + Pace + </string> + <string name="anim_point_you"> + Indicare altri + </string> + <string name="anim_point_me"> + Indicare te stesso + </string> + <string name="anim_punch_l"> + Pugno a sinistra + </string> + <string name="anim_punch_r"> + Pugno a destra + </string> + <string name="anim_rps_countdown"> + Contare nella morra cinese + </string> + <string name="anim_rps_paper"> + Carta nella morra cinese + </string> + <string name="anim_rps_rock"> + Sasso nella morra cinese + </string> + <string name="anim_rps_scissors"> + Forbici nella morra cinese + </string> + <string name="anim_express_repulsed"> + Repulsione + </string> + <string name="anim_kick_roundhouse_r"> + Calcio con rotazione + </string> + <string name="anim_express_sad"> + Triste + </string> + <string name="anim_salute"> + Saluto + </string> + <string name="anim_shout"> + Urlo + </string> + <string name="anim_express_shrug"> + Spallucce + </string> + <string name="anim_express_smile"> + Sorriso + </string> + <string name="anim_smoke_idle"> + Fumare + </string> + <string name="anim_smoke_inhale"> + Fumare inspirazione + </string> + <string name="anim_smoke_throw_down"> + Fumare mandando giù + </string> + <string name="anim_express_surprise"> + Sorpresa + </string> + <string name="anim_sword_strike_r"> + Colpo di spada + </string> + <string name="anim_angry_tantrum"> + Collera + </string> + <string name="anim_express_tongue_out"> + Linguaccia + </string> + <string name="anim_hello"> + Saluto con mano + </string> + <string name="anim_whisper"> + Sussurro + </string> + <string name="anim_whistle"> + Fischio + </string> + <string name="anim_express_wink"> + Ammicca + </string> + <string name="anim_wink_hollywood"> + Ammicca (Hollywood) + </string> + <string name="anim_express_worry"> + Preoccupato + </string> + <string name="anim_yes_happy"> + Si (Felice) + </string> + <string name="anim_yes_head"> + Si + </string> + <string name="multiple_textures"> + Multiple + </string> + <string name="use_texture"> + Usa texture + </string> + <string name="manip_hint1"> + Sposta il cursore sul righello + </string> + <string name="manip_hint2"> + per bloccare sulla griglia + </string> + <string name="texture_loading"> + Caricamento in corso... + </string> + <string name="worldmap_offline"> + Offline + </string> + <string name="worldmap_item_tooltip_format"> + L$ [PRICE] - [AREA] m² + </string> + <string name="worldmap_results_none_found"> + Nessun risultato. + </string> + <string name="Ok"> + OK + </string> + <string name="Premature end of file"> + Fine prematura del file + </string> + <string name="ST_NO_JOINT"> + Impossibile trovare ROOT o JOINT. + </string> + <string name="NearbyChatTitle"> + Chat nei dintorni + </string> + <string name="NearbyChatLabel"> + (Chat nei dintorni) + </string> + <string name="whisper"> + sussurra: + </string> + <string name="shout"> + grida: + </string> + <string name="ringing"> + In connessione alla Voice Chat in-world... + </string> + <string name="connected"> + Connesso + </string> + <string name="unavailable"> + Il voice non è disponibile nel posto dove ti trovi ora + </string> + <string name="hang_up"> + Disconnesso dalla Voice Chat in-world + </string> + <string name="reconnect_nearby"> + Sarai riconnesso alla chat vocale nei dintorni + </string> + <string name="ScriptQuestionCautionChatGranted"> + A '[OBJECTNAME]', un oggetto di proprietà di '[OWNERNAME]', situato in [REGIONNAME] [REGIONPOS], è stato concesso il permesso di: [PERMISSIONS]. + </string> + <string name="ScriptQuestionCautionChatDenied"> + A '[OBJECTNAME]', un oggetto di proprietà di '[OWNERNAME]', situato in [REGIONNAME] [REGIONPOS], è stato negato il permesso di: [PERMISSIONS]. + </string> + <string name="AdditionalPermissionsRequestHeader"> + Se consenti l'accesso al tuo account, consentirai anche all'oggetto di: + </string> + <string name="ScriptTakeMoney"> + Prendere dollari Linden (L$) da te + </string> + <string name="ActOnControlInputs"> + Agire sul tuo controllo degli input + </string> + <string name="RemapControlInputs"> + Rimappare il tuo controllo degli input + </string> + <string name="AnimateYourAvatar"> + Animare il tuo avatar + </string> + <string name="AttachToYourAvatar"> + Far indossare al tuo avatar + </string> + <string name="ReleaseOwnership"> + Rilasciare la propietà è far diventare pubblico. + </string> + <string name="LinkAndDelink"> + Collegare e scollegare dagli altri oggetti + </string> + <string name="AddAndRemoveJoints"> + Aggiungere e rimuovere le giunzioni insieme con gli altri oggetti + </string> + <string name="ChangePermissions"> + Cambiare i permessi + </string> + <string name="TrackYourCamera"> + Tracciare la fotocamera + </string> + <string name="ControlYourCamera"> + Controllare la tua fotocamera + </string> + <string name="TeleportYourAgent"> + Teleportarti + </string> + <string name="ForceSitAvatar"> + Forza l'avatar a sedersi + </string> + <string name="ChangeEnvSettings"> + Cambia le impostazioni dell’ambiente + </string> + <string name="AgentNameSubst"> + (Tu) + </string> <string name="JoinAnExperience"/> - <string name="SilentlyManageEstateAccess">Omette gli avvisi durante la gestione degli elenchi di accesso alle proprietà immobiliari</string> - <string name="OverrideYourAnimations">Sostituisce le animazioni predefinite</string> - <string name="ScriptReturnObjects">Restituisce oggetti per conto tuo</string> - <string name="UnknownScriptPermission">(sconosciuto)!</string> - <string name="SIM_ACCESS_PG">Generale</string> - <string name="SIM_ACCESS_MATURE">Moderato</string> - <string name="SIM_ACCESS_ADULT">Adulti</string> - <string name="SIM_ACCESS_DOWN">Offline</string> - <string name="SIM_ACCESS_MIN">Sconosciuto</string> - <string name="land_type_unknown">(sconosciuto)</string> - <string name="Estate / Full Region">Proprietà immobiliare / Regione completa</string> - <string name="Estate / Homestead">Proprietà immobiliare / Homestead</string> - <string name="Mainland / Homestead">Continente / Homestead</string> - <string name="Mainland / Full Region">Continente / Regione completa</string> - <string name="all_files">Tutti i file</string> - <string name="sound_files">Suoni</string> - <string name="animation_files">Animazioni</string> - <string name="image_files">Immagini</string> - <string name="save_file_verb">Salva</string> - <string name="load_file_verb">Carica</string> - <string name="targa_image_files">Immagini Targa</string> - <string name="bitmap_image_files">Immagini Bitmap</string> - <string name="png_image_files">Immagini PNG</string> - <string name="save_texture_image_files">Immagini Targa o PNG</string> - <string name="avi_movie_file">File video AVI</string> - <string name="xaf_animation_file">File animazione XAF</string> - <string name="xml_file">File XML</string> - <string name="raw_file">File RAW</string> - <string name="compressed_image_files">Immagini compresse</string> - <string name="load_files">Carica i file</string> - <string name="choose_the_directory">Scegli la cartella</string> - <string name="script_files">Script</string> - <string name="dictionary_files">Dizionari</string> - <string name="shape">Figura corporea</string> - <string name="skin">Pelle</string> - <string name="hair">Capigliature</string> - <string name="eyes">Occhi</string> - <string name="shirt">Camicia</string> - <string name="pants">Pantaloni</string> - <string name="shoes">Scarpe</string> - <string name="socks">Calzini</string> - <string name="jacket">Giacca</string> - <string name="gloves">Guanti</string> - <string name="undershirt">Maglietta intima</string> - <string name="underpants">Slip</string> - <string name="skirt">Gonna</string> - <string name="alpha">Alfa (Trasparenza)</string> - <string name="tattoo">Tatuaggio</string> - <string name="universal">Universale</string> - <string name="physics">Fisica</string> - <string name="invalid">non valido</string> - <string name="none">nessuno</string> - <string name="shirt_not_worn">Camicia non indossata</string> - <string name="pants_not_worn">Pantaloni non indossati</string> - <string name="shoes_not_worn">Scarpe non indossate</string> - <string name="socks_not_worn">Calzini non indossati</string> - <string name="jacket_not_worn">Giacca non indossata</string> - <string name="gloves_not_worn">Guanti non indossati</string> - <string name="undershirt_not_worn">Maglietta intima non indossata</string> - <string name="underpants_not_worn">Slip non indossati</string> - <string name="skirt_not_worn">Gonna non indossata</string> - <string name="alpha_not_worn">Alpha non portato</string> - <string name="tattoo_not_worn">Tatuaggio non portato</string> - <string name="universal_not_worn">Universale non indossato</string> - <string name="physics_not_worn">Fisica non indossata</string> - <string name="invalid_not_worn">non valido</string> - <string name="create_new_shape">Crea nuova figura corporea</string> - <string name="create_new_skin">Crea nuova pelle</string> - <string name="create_new_hair">Crea nuovi capelli</string> - <string name="create_new_eyes">Crea nuovi occhi</string> - <string name="create_new_shirt">Crea nuova camicia</string> - <string name="create_new_pants">Crea nuovi pantaloni</string> - <string name="create_new_shoes">Crea nuove scarpe</string> - <string name="create_new_socks">Crea nuove calze</string> - <string name="create_new_jacket">Crea nuova giacca</string> - <string name="create_new_gloves">Crea nuovi guanti</string> - <string name="create_new_undershirt">Crea nuova maglietta intima</string> - <string name="create_new_underpants">Crea nuovi slip</string> - <string name="create_new_skirt">Crea nuova gonna</string> - <string name="create_new_alpha">Crea nuovo Alpha</string> - <string name="create_new_tattoo">Crea un nuovo tatuaggio</string> - <string name="create_new_universal">Crea nuovo universale</string> - <string name="create_new_physics">Crea nuova fisica</string> - <string name="create_new_invalid">non valido</string> - <string name="NewWearable">Nuovo [WEARABLE_ITEM]</string> - <string name="next">Avanti</string> - <string name="ok">OK</string> - <string name="GroupNotifyGroupNotice">Avviso di gruppo</string> - <string name="GroupNotifyGroupNotices">Avvisi di gruppo</string> - <string name="GroupNotifySentBy">Inviato da</string> - <string name="GroupNotifyAttached">Allegato:</string> - <string name="GroupNotifyViewPastNotices">Visualizza gli avvisi precedenti o scegli qui di non riceverne.</string> - <string name="GroupNotifyOpenAttachment">Apri l'allegato</string> - <string name="GroupNotifySaveAttachment">Salva l'allegato</string> - <string name="TeleportOffer">Offerta di Teleport</string> - <string name="StartUpNotifications">Mentre eri assente sono arrivate nuove notifiche...</string> - <string name="OverflowInfoChannelString">Hai ancora [%d] notifiche</string> - <string name="BodyPartsRightArm">Braccio destro</string> - <string name="BodyPartsHead">Testa</string> - <string name="BodyPartsLeftArm">Braccio sinistro</string> - <string name="BodyPartsLeftLeg">Gamba sinistra</string> - <string name="BodyPartsTorso">Torace</string> - <string name="BodyPartsRightLeg">Gamba destra</string> - <string name="BodyPartsEnhancedSkeleton">Scheletro avanzato</string> - <string name="GraphicsQualityLow">Basso</string> - <string name="GraphicsQualityMid">Medio</string> - <string name="GraphicsQualityHigh">Alto</string> - <string name="LeaveMouselook">Premi ESC per tornare in visualizzazione normale</string> - <string name="InventoryNoMatchingItems">Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/all/[SEARCH_TERM] Cerca].</string> - <string name="InventoryNoMatchingRecentItems">Non hai trovato ció che cercavi? Prova [secondlife:///app/inventory/filters Show filters].</string> - <string name="PlacesNoMatchingItems">Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/places/[SEARCH_TERM] Cerca].</string> - <string name="FavoritesNoMatchingItems">Trascina qui un punto di riferimento per aggiungerlo ai Preferiti.</string> - <string name="MarketplaceNoMatchingItems">Nessun articolo trovato. Controlla di aver digitato la stringa di ricerca correttamente e riprova.</string> - <string name="InventoryNoTexture">Non hai una copia di questa texture nel tuo inventario</string> - <string name="InventoryInboxNoItems">Gli acquissti dal mercato verranno mostrati qui. Potrai quindi trascinarli nel tuo inventario per usarli.</string> - <string name="MarketplaceURL">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/</string> - <string name="MarketplaceURL_CreateStore">http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3</string> - <string name="MarketplaceURL_Dashboard">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard</string> - <string name="MarketplaceURL_Imports">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports</string> - <string name="MarketplaceURL_LearnMore">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more</string> - <string name="InventoryPlayAnimationTooltip">Apri finestra con opzioni di Gioco.</string> - <string name="InventoryPlayGestureTooltip">Esegui il movimento selezionato nel mondo virtuale.</string> - <string name="InventoryPlaySoundTooltip">Apri finestra con opzioni di Gioco.</string> - <string name="InventoryOutboxNotMerchantTitle">Chiunque può vendere oggetti nel Marketplace.</string> + <string name="SilentlyManageEstateAccess"> + Omette gli avvisi durante la gestione degli elenchi di accesso alle proprietà immobiliari + </string> + <string name="OverrideYourAnimations"> + Sostituisce le animazioni predefinite + </string> + <string name="ScriptReturnObjects"> + Restituisce oggetti per conto tuo + </string> + <string name="UnknownScriptPermission"> + (sconosciuto)! + </string> + <string name="SIM_ACCESS_PG"> + Generale + </string> + <string name="SIM_ACCESS_MATURE"> + Moderato + </string> + <string name="SIM_ACCESS_ADULT"> + Adulti + </string> + <string name="SIM_ACCESS_DOWN"> + Offline + </string> + <string name="SIM_ACCESS_MIN"> + Sconosciuto + </string> + <string name="land_type_unknown"> + (sconosciuto) + </string> + <string name="Estate / Full Region"> + Proprietà immobiliare / Regione completa + </string> + <string name="Estate / Homestead"> + Proprietà immobiliare / Homestead + </string> + <string name="Mainland / Homestead"> + Continente / Homestead + </string> + <string name="Mainland / Full Region"> + Continente / Regione completa + </string> + <string name="all_files"> + Tutti i file + </string> + <string name="sound_files"> + Suoni + </string> + <string name="animation_files"> + Animazioni + </string> + <string name="image_files"> + Immagini + </string> + <string name="save_file_verb"> + Salva + </string> + <string name="load_file_verb"> + Carica + </string> + <string name="targa_image_files"> + Immagini Targa + </string> + <string name="bitmap_image_files"> + Immagini Bitmap + </string> + <string name="png_image_files"> + Immagini PNG + </string> + <string name="save_texture_image_files"> + Immagini Targa o PNG + </string> + <string name="avi_movie_file"> + File video AVI + </string> + <string name="xaf_animation_file"> + File animazione XAF + </string> + <string name="xml_file"> + File XML + </string> + <string name="raw_file"> + File RAW + </string> + <string name="compressed_image_files"> + Immagini compresse + </string> + <string name="load_files"> + Carica i file + </string> + <string name="choose_the_directory"> + Scegli la cartella + </string> + <string name="script_files"> + Script + </string> + <string name="dictionary_files"> + Dizionari + </string> + <string name="shape"> + Figura corporea + </string> + <string name="skin"> + Pelle + </string> + <string name="hair"> + Capigliature + </string> + <string name="eyes"> + Occhi + </string> + <string name="shirt"> + Camicia + </string> + <string name="pants"> + Pantaloni + </string> + <string name="shoes"> + Scarpe + </string> + <string name="socks"> + Calzini + </string> + <string name="jacket"> + Giacca + </string> + <string name="gloves"> + Guanti + </string> + <string name="undershirt"> + Maglietta intima + </string> + <string name="underpants"> + Slip + </string> + <string name="skirt"> + Gonna + </string> + <string name="alpha"> + Alfa (Trasparenza) + </string> + <string name="tattoo"> + Tatuaggio + </string> + <string name="universal"> + Universale + </string> + <string name="physics"> + Fisica + </string> + <string name="invalid"> + non valido + </string> + <string name="none"> + nessuno + </string> + <string name="shirt_not_worn"> + Camicia non indossata + </string> + <string name="pants_not_worn"> + Pantaloni non indossati + </string> + <string name="shoes_not_worn"> + Scarpe non indossate + </string> + <string name="socks_not_worn"> + Calzini non indossati + </string> + <string name="jacket_not_worn"> + Giacca non indossata + </string> + <string name="gloves_not_worn"> + Guanti non indossati + </string> + <string name="undershirt_not_worn"> + Maglietta intima non indossata + </string> + <string name="underpants_not_worn"> + Slip non indossati + </string> + <string name="skirt_not_worn"> + Gonna non indossata + </string> + <string name="alpha_not_worn"> + Alpha non portato + </string> + <string name="tattoo_not_worn"> + Tatuaggio non portato + </string> + <string name="universal_not_worn"> + Universale non indossato + </string> + <string name="physics_not_worn"> + Fisica non indossata + </string> + <string name="invalid_not_worn"> + non valido + </string> + <string name="create_new_shape"> + Crea nuova figura corporea + </string> + <string name="create_new_skin"> + Crea nuova pelle + </string> + <string name="create_new_hair"> + Crea nuovi capelli + </string> + <string name="create_new_eyes"> + Crea nuovi occhi + </string> + <string name="create_new_shirt"> + Crea nuova camicia + </string> + <string name="create_new_pants"> + Crea nuovi pantaloni + </string> + <string name="create_new_shoes"> + Crea nuove scarpe + </string> + <string name="create_new_socks"> + Crea nuove calze + </string> + <string name="create_new_jacket"> + Crea nuova giacca + </string> + <string name="create_new_gloves"> + Crea nuovi guanti + </string> + <string name="create_new_undershirt"> + Crea nuova maglietta intima + </string> + <string name="create_new_underpants"> + Crea nuovi slip + </string> + <string name="create_new_skirt"> + Crea nuova gonna + </string> + <string name="create_new_alpha"> + Crea nuovo Alpha + </string> + <string name="create_new_tattoo"> + Crea un nuovo tatuaggio + </string> + <string name="create_new_universal"> + Crea nuovo universale + </string> + <string name="create_new_physics"> + Crea nuova fisica + </string> + <string name="create_new_invalid"> + non valido + </string> + <string name="NewWearable"> + Nuovo [WEARABLE_ITEM] + </string> + <string name="next"> + Avanti + </string> + <string name="ok"> + OK + </string> + <string name="GroupNotifyGroupNotice"> + Avviso di gruppo + </string> + <string name="GroupNotifyGroupNotices"> + Avvisi di gruppo + </string> + <string name="GroupNotifySentBy"> + Inviato da + </string> + <string name="GroupNotifyAttached"> + Allegato: + </string> + <string name="GroupNotifyViewPastNotices"> + Visualizza gli avvisi precedenti o scegli qui di non riceverne. + </string> + <string name="GroupNotifyOpenAttachment"> + Apri l'allegato + </string> + <string name="GroupNotifySaveAttachment"> + Salva l'allegato + </string> + <string name="TeleportOffer"> + Offerta di Teleport + </string> + <string name="StartUpNotifications"> + Mentre eri assente sono arrivate nuove notifiche... + </string> + <string name="OverflowInfoChannelString"> + Hai ancora [%d] notifiche + </string> + <string name="BodyPartsRightArm"> + Braccio destro + </string> + <string name="BodyPartsHead"> + Testa + </string> + <string name="BodyPartsLeftArm"> + Braccio sinistro + </string> + <string name="BodyPartsLeftLeg"> + Gamba sinistra + </string> + <string name="BodyPartsTorso"> + Torace + </string> + <string name="BodyPartsRightLeg"> + Gamba destra + </string> + <string name="BodyPartsEnhancedSkeleton"> + Scheletro avanzato + </string> + <string name="GraphicsQualityLow"> + Basso + </string> + <string name="GraphicsQualityMid"> + Medio + </string> + <string name="GraphicsQualityHigh"> + Alto + </string> + <string name="LeaveMouselook"> + Premi ESC per tornare in visualizzazione normale + </string> + <string name="InventoryNoMatchingItems"> + Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/all/[SEARCH_TERM] Cerca]. + </string> + <string name="InventoryNoMatchingRecentItems"> + Non hai trovato ció che cercavi? Prova [secondlife:///app/inventory/filters Show filters]. + </string> + <string name="PlacesNoMatchingItems"> + Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/places/[SEARCH_TERM] Cerca]. + </string> + <string name="FavoritesNoMatchingItems"> + Trascina qui un punto di riferimento per aggiungerlo ai Preferiti. + </string> + <string name="MarketplaceNoMatchingItems"> + Nessun articolo trovato. Controlla di aver digitato la stringa di ricerca correttamente e riprova. + </string> + <string name="InventoryNoTexture"> + Non hai una copia di questa texture nel tuo inventario + </string> + <string name="InventoryInboxNoItems"> + Gli acquissti dal mercato verranno mostrati qui. Potrai quindi trascinarli nel tuo inventario per usarli. + </string> + <string name="MarketplaceURL"> + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ + </string> + <string name="MarketplaceURL_CreateStore"> + http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 + </string> + <string name="MarketplaceURL_Dashboard"> + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard + </string> + <string name="MarketplaceURL_Imports"> + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports + </string> + <string name="MarketplaceURL_LearnMore"> + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more + </string> + <string name="InventoryPlayAnimationTooltip"> + Apri finestra con opzioni di Gioco. + </string> + <string name="InventoryPlayGestureTooltip"> + Esegui il movimento selezionato nel mondo virtuale. + </string> + <string name="InventoryPlaySoundTooltip"> + Apri finestra con opzioni di Gioco. + </string> + <string name="InventoryOutboxNotMerchantTitle"> + Chiunque può vendere oggetti nel Marketplace. + </string> <string name="InventoryOutboxNotMerchantTooltip"/> - <string name="InventoryOutboxNotMerchant">Per diventare un venditore, devi [[MARKETPLACE_CREATE_STORE_URL] creare un negozio nel Marketplace].</string> - <string name="InventoryOutboxNoItemsTitle">La tua casella in uscita è vuota.</string> + <string name="InventoryOutboxNotMerchant"> + Per diventare un venditore, devi [[MARKETPLACE_CREATE_STORE_URL] creare un negozio nel Marketplace]. + </string> + <string name="InventoryOutboxNoItemsTitle"> + La tua casella in uscita è vuota. + </string> <string name="InventoryOutboxNoItemsTooltip"/> - <string name="InventoryOutboxNoItems">Trascina le cartelle in questa area e clicca su "Invia a Marketplace" per metterle in vendita su [[MARKETPLACE_DASHBOARD_URL] Marketplace].</string> - <string name="InventoryOutboxInitializingTitle">Inizializzazione Marketplace.in corso</string> - <string name="InventoryOutboxInitializing">Stiamo eseguendo l'accesso al tuo account sul [[MARKETPLACE_CREATE_STORE_URL] negozio Marketplace].</string> - <string name="InventoryOutboxErrorTitle">Errori in Marketplace.</string> - <string name="InventoryOutboxError">Il [[MARKETPLACE_CREATE_STORE_URL] negozio nel Marketplace] ha riportato errori.</string> - <string name="InventoryMarketplaceError">Errore nell'apertura degli annunci di Marketplace. -Se continui a ricevere questo messaggio, contatta l'assistenza Second Life su http://support.secondlife.com.</string> - <string name="InventoryMarketplaceListingsNoItemsTitle">La cartella degli annunci di Marketplace è vuota.</string> - <string name="InventoryMarketplaceListingsNoItems">Trascina le cartelle in questa area per metterle in vendita su [[MARKETPLACE_DASHBOARD_URL] Marketplace].</string> - <string name="InventoryItemsCount">( [ITEMS_COUNT] oggetti )</string> - <string name="Marketplace Validation Warning Stock">la cartella di magazzino deve essere inclusa in una cartella di versione</string> - <string name="Marketplace Validation Error Mixed Stock">: Errore: tutti gli articoli un una cartella di magazzino devono essere non copiabili e dello stesso tipo</string> - <string name="Marketplace Validation Error Subfolder In Stock">: Errore: la cartella di magazzino non può contenere sottocartelle</string> - <string name="Marketplace Validation Warning Empty">: Avviso: la cartella non contiene alcun articolo</string> - <string name="Marketplace Validation Warning Create Stock">: Avviso: creazione cartella di magazzino in corso</string> - <string name="Marketplace Validation Warning Create Version">: Avviso: creazione cartella di versione in corso</string> - <string name="Marketplace Validation Warning Move">: Avviso: spostamento articoli in corso</string> - <string name="Marketplace Validation Warning Delete">: Avviso: il contenuto della cartella è stato trasferito alla cartella di magazzino e la cartella vuota sta per essere rimossa</string> - <string name="Marketplace Validation Error Stock Item">: Errore: gli articoli di cui non è permessa la copia devono essere all'interno di una cartella di magazzino</string> - <string name="Marketplace Validation Warning Unwrapped Item">: Avviso: gli articoli devono essere inclusi in una cartella di versione</string> - <string name="Marketplace Validation Error">: Errore:</string> - <string name="Marketplace Validation Warning">: Avviso:</string> - <string name="Marketplace Validation Error Empty Version">: Avviso: la cartella di versione deve contenere almeno 1 articolo</string> - <string name="Marketplace Validation Error Empty Stock">: Avviso: la cartella di magazzino deve contenere almeno 1 articolo</string> - <string name="Marketplace Validation No Error">Nessun errore o avviso da segnalare</string> - <string name="Marketplace Error None">Nessun errore</string> - <string name="Marketplace Error Prefix">Errore:</string> - <string name="Marketplace Error Not Merchant">Prima di inviare gli articoli al Marketplace devi essere impostato come rivenditore (gratis).</string> - <string name="Marketplace Error Not Accepted">L'articolo non può essere spostato in quella cartella.</string> - <string name="Marketplace Error Unsellable Item">Questo articolo non può essere venduto nel Marketplace.</string> - <string name="MarketplaceNoID">no Mkt ID</string> - <string name="MarketplaceLive">in elenco</string> - <string name="MarketplaceActive">attivi</string> - <string name="MarketplaceMax">massimo</string> - <string name="MarketplaceStock">magazzino</string> - <string name="MarketplaceNoStock">non in magazzino</string> - <string name="MarketplaceUpdating">in aggiornamento...</string> - <string name="UploadFeeInfo">La tariffa è basata sul tuo livello di membership. Più alto è il livello più bassa sarà la tariffa. [https://secondlife.com/my/account/membership.php? Per saperne di più]</string> - <string name="Open landmarks">Luoghi aperti</string> - <string name="Unconstrained">Senza limitazioni</string> + <string name="InventoryOutboxNoItems"> + Trascina le cartelle in questa area e clicca su "Invia a Marketplace" per metterle in vendita su [[MARKETPLACE_DASHBOARD_URL] Marketplace]. + </string> + <string name="InventoryOutboxInitializingTitle"> + Inizializzazione Marketplace.in corso + </string> + <string name="InventoryOutboxInitializing"> + Stiamo eseguendo l'accesso al tuo account sul [[MARKETPLACE_CREATE_STORE_URL] negozio Marketplace]. + </string> + <string name="InventoryOutboxErrorTitle"> + Errori in Marketplace. + </string> + <string name="InventoryOutboxError"> + Il [[MARKETPLACE_CREATE_STORE_URL] negozio nel Marketplace] ha riportato errori. + </string> + <string name="InventoryMarketplaceError"> + Errore nell'apertura degli annunci di Marketplace. +Se continui a ricevere questo messaggio, contatta l'assistenza Second Life su http://support.secondlife.com. + </string> + <string name="InventoryMarketplaceListingsNoItemsTitle"> + La cartella degli annunci di Marketplace è vuota. + </string> + <string name="InventoryMarketplaceListingsNoItems"> + Trascina le cartelle in questa area per metterle in vendita su [[MARKETPLACE_DASHBOARD_URL] Marketplace]. + </string> + <string name="InventoryItemsCount"> + ( [ITEMS_COUNT] oggetti ) + </string> + <string name="Marketplace Validation Warning Stock"> + la cartella di magazzino deve essere inclusa in una cartella di versione + </string> + <string name="Marketplace Validation Error Mixed Stock"> + : Errore: tutti gli articoli un una cartella di magazzino devono essere non copiabili e dello stesso tipo + </string> + <string name="Marketplace Validation Error Subfolder In Stock"> + : Errore: la cartella di magazzino non può contenere sottocartelle + </string> + <string name="Marketplace Validation Warning Empty"> + : Avviso: la cartella non contiene alcun articolo + </string> + <string name="Marketplace Validation Warning Create Stock"> + : Avviso: creazione cartella di magazzino in corso + </string> + <string name="Marketplace Validation Warning Create Version"> + : Avviso: creazione cartella di versione in corso + </string> + <string name="Marketplace Validation Warning Move"> + : Avviso: spostamento articoli in corso + </string> + <string name="Marketplace Validation Warning Delete"> + : Avviso: il contenuto della cartella è stato trasferito alla cartella di magazzino e la cartella vuota sta per essere rimossa + </string> + <string name="Marketplace Validation Error Stock Item"> + : Errore: gli articoli di cui non è permessa la copia devono essere all'interno di una cartella di magazzino + </string> + <string name="Marketplace Validation Warning Unwrapped Item"> + : Avviso: gli articoli devono essere inclusi in una cartella di versione + </string> + <string name="Marketplace Validation Error"> + : Errore: + </string> + <string name="Marketplace Validation Warning"> + : Avviso: + </string> + <string name="Marketplace Validation Error Empty Version"> + : Avviso: la cartella di versione deve contenere almeno 1 articolo + </string> + <string name="Marketplace Validation Error Empty Stock"> + : Avviso: la cartella di magazzino deve contenere almeno 1 articolo + </string> + <string name="Marketplace Validation No Error"> + Nessun errore o avviso da segnalare + </string> + <string name="Marketplace Error None"> + Nessun errore + </string> + <string name="Marketplace Error Prefix"> + Errore: + </string> + <string name="Marketplace Error Not Merchant"> + Prima di inviare gli articoli al Marketplace devi essere impostato come rivenditore (gratis). + </string> + <string name="Marketplace Error Not Accepted"> + L'articolo non può essere spostato in quella cartella. + </string> + <string name="Marketplace Error Unsellable Item"> + Questo articolo non può essere venduto nel Marketplace. + </string> + <string name="MarketplaceNoID"> + no Mkt ID + </string> + <string name="MarketplaceLive"> + in elenco + </string> + <string name="MarketplaceActive"> + attivi + </string> + <string name="MarketplaceMax"> + massimo + </string> + <string name="MarketplaceStock"> + magazzino + </string> + <string name="MarketplaceNoStock"> + non in magazzino + </string> + <string name="MarketplaceUpdating"> + in aggiornamento... + </string> + <string name="UploadFeeInfo"> + La tariffa è basata sul tuo livello di membership. Più alto è il livello più bassa sarà la tariffa. [https://secondlife.com/my/account/membership.php? Per saperne di più] + </string> + <string name="Open landmarks"> + Luoghi aperti + </string> + <string name="Unconstrained"> + Senza limitazioni + </string> <string name="no_transfer" value="(nessun trasferimento)"/> <string name="no_modify" value="(nessuna modifica)"/> <string name="no_copy" value="(nessuna copia)"/> <string name="worn" value="(indossato)"/> <string name="link" value="(link)"/> <string name="broken_link" value="(broken_link)""/> - <string name="LoadingContents">Caricamento del contenuto...</string> - <string name="NoContents">Nessun contenuto</string> + <string name="LoadingContents"> + Caricamento del contenuto... + </string> + <string name="NoContents"> + Nessun contenuto + </string> <string name="WornOnAttachmentPoint" value="(indossato su [ATTACHMENT_POINT])"/> <string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/> <string name="ActiveGesture" value="[GESLABEL] (attivo)"/> @@ -632,1416 +1689,4146 @@ Se continui a ricevere questo messaggio, contatta l'assistenza Second Life su ht <string name="Snapshots" value="Fotografie,"/> <string name="No Filters" value="No"/> <string name="Since Logoff" value="- Dall'uscita"/> - <string name="InvFolder My Inventory">Il mio inventario</string> - <string name="InvFolder Library">Libreria</string> - <string name="InvFolder Textures">Texture</string> - <string name="InvFolder Sounds">Suoni</string> - <string name="InvFolder Calling Cards">Biglietti da visita</string> - <string name="InvFolder Landmarks">Punti di riferimento</string> - <string name="InvFolder Scripts">Script</string> - <string name="InvFolder Clothing">Vestiario</string> - <string name="InvFolder Objects">Oggetti</string> - <string name="InvFolder Notecards">Biglietti</string> - <string name="InvFolder New Folder">Nuova cartella</string> - <string name="InvFolder Inventory">Inventario</string> - <string name="InvFolder Uncompressed Images">Immagini non compresse</string> - <string name="InvFolder Body Parts">Parti del corpo</string> - <string name="InvFolder Trash">Cestino</string> - <string name="InvFolder Photo Album">Album fotografico</string> - <string name="InvFolder Lost And Found">Oggetti smarriti</string> - <string name="InvFolder Uncompressed Sounds">Suoni non compressi</string> - <string name="InvFolder Animations">Animazioni</string> - <string name="InvFolder Gestures">Gesture</string> - <string name="InvFolder Favorite">I miei preferiti</string> - <string name="InvFolder favorite">I miei preferiti</string> - <string name="InvFolder Favorites">I miei preferiti</string> - <string name="InvFolder favorites">I miei preferiti</string> - <string name="InvFolder Current Outfit">Abbigliamento attuale</string> - <string name="InvFolder Initial Outfits">Vestiario iniziale</string> - <string name="InvFolder My Outfits">Il mio vestiario</string> - <string name="InvFolder Accessories">Accessori</string> - <string name="InvFolder Meshes">Reticoli</string> - <string name="InvFolder Received Items">Oggetti ricevuti</string> - <string name="InvFolder Merchant Outbox">Casella venditore in uscita</string> - <string name="InvFolder Friends">Amici</string> - <string name="InvFolder All">Tutto</string> - <string name="no_attachments">Nessun allegato indossato</string> - <string name="Attachments remain">Allegati ([COUNT] spazi restanti)</string> - <string name="Buy">Acquista</string> - <string name="BuyforL$">Acquista per L$</string> - <string name="Stone">Pietra</string> - <string name="Metal">Metallo</string> - <string name="Glass">Vetro</string> - <string name="Wood">Legno</string> - <string name="Flesh">Carne</string> - <string name="Plastic">Plastica</string> - <string name="Rubber">Gomma</string> - <string name="Light">Luce</string> - <string name="KBShift">Maiusc</string> - <string name="KBCtrl">Ctrl</string> - <string name="Chest">Petto</string> - <string name="Skull">Cranio</string> - <string name="Left Shoulder">Spalla sinistra</string> - <string name="Right Shoulder">Spalla destra</string> - <string name="Left Hand">Mano sinistra</string> - <string name="Right Hand">Mano destra</string> - <string name="Left Foot">Piede sinisto</string> - <string name="Right Foot">Piede destro</string> - <string name="Spine">Spina dorsale</string> - <string name="Pelvis">Pelvi</string> - <string name="Mouth">Bocca</string> - <string name="Chin">Mento</string> - <string name="Left Ear">Orecchio sinistro</string> - <string name="Right Ear">Orecchio destro</string> - <string name="Left Eyeball">Bulbo sinistro</string> - <string name="Right Eyeball">Bulbo destro</string> - <string name="Nose">Naso</string> - <string name="R Upper Arm">Avambraccio destro</string> - <string name="R Forearm">Braccio destro</string> - <string name="L Upper Arm">Avambraccio sinistro</string> - <string name="L Forearm">Braccio sinistro</string> - <string name="Right Hip">Anca destra</string> - <string name="R Upper Leg">Coscia destra</string> - <string name="R Lower Leg">Gamba destra</string> - <string name="Left Hip">Anca sinista</string> - <string name="L Upper Leg">Coscia sinistra</string> - <string name="L Lower Leg">Gamba sinistra</string> - <string name="Stomach">Stomaco</string> - <string name="Left Pec">Petto sinistro</string> - <string name="Right Pec">Petto destro</string> - <string name="Neck">Collo</string> - <string name="Avatar Center">Centro avatar</string> - <string name="Left Ring Finger">Anulare sinistro</string> - <string name="Right Ring Finger">Anulare destro</string> - <string name="Tail Base">Base della coda</string> - <string name="Tail Tip">Punta della coda</string> - <string name="Left Wing">Ala sinistra</string> - <string name="Right Wing">Ala destra</string> - <string name="Jaw">Mandibola</string> - <string name="Alt Left Ear">Altro orecchio sinistro</string> - <string name="Alt Right Ear">Altro orecchio destro</string> - <string name="Alt Left Eye">Altro occhio sinistro</string> - <string name="Alt Right Eye">Altro occhio destro</string> - <string name="Tongue">Lingua</string> - <string name="Groin">Inguine</string> - <string name="Left Hind Foot">Piede posteriore sinistro</string> - <string name="Right Hind Foot">Piede posteriore destro</string> - <string name="Invalid Attachment">Punto di collegamento non valido</string> - <string name="ATTACHMENT_MISSING_ITEM">Errore: articolo mancante</string> - <string name="ATTACHMENT_MISSING_BASE_ITEM">Errore: articolo di base mancante</string> - <string name="ATTACHMENT_NOT_ATTACHED">Errore: l'oggetto è nel vestiario corrente ma non è collegato</string> - <string name="YearsMonthsOld">Nato da [AGEYEARS] [AGEMONTHS]</string> - <string name="YearsOld">Nato da [AGEYEARS]</string> - <string name="MonthsOld">Nato da [AGEMONTHS]</string> - <string name="WeeksOld">Nato da [AGEWEEKS]</string> - <string name="DaysOld">Nato da [AGEDAYS]</string> - <string name="TodayOld">Iscritto oggi</string> - <string name="av_render_everyone_now">Ora ti possono vedere tutti.</string> - <string name="av_render_not_everyone">Alcune persone vicine a te potrebbero non eseguire il tuo rendering.</string> - <string name="av_render_over_half">La maggioranza delle persone vicine a te potrebbe non eseguire il tuo rendering.</string> - <string name="av_render_most_of">La gran parte delle persone vicine a te potrebbe non eseguire il tuo rendering.</string> - <string name="av_render_anyone">Tutte le persone vicine a te potrebbero non eseguire il tuo rendering.</string> - <string name="hud_description_total">Il tuo HUD</string> - <string name="hud_name_with_joint">[OBJ_NAME] (indossato su [JNT_NAME])</string> - <string name="hud_render_memory_warning">[HUD_DETAILS] fa uso di molta memoria texture</string> - <string name="hud_render_cost_warning">[HUD_DETAILS] contiene molti oggetti e texture che occupano una grande quantità di risorse</string> - <string name="hud_render_heavy_textures_warning">[HUD_DETAILS] contiene molte texture di grandi dimensioni</string> - <string name="hud_render_cramped_warning">[HUD_DETAILS] contiene troppi oggetti</string> - <string name="hud_render_textures_warning">[HUD_DETAILS] contiene troppe texture</string> - <string name="AgeYearsA">[COUNT] anno</string> - <string name="AgeYearsB">[COUNT] anni</string> - <string name="AgeYearsC">[COUNT] anni</string> - <string name="AgeMonthsA">[COUNT] mese</string> - <string name="AgeMonthsB">[COUNT] mesi</string> - <string name="AgeMonthsC">[COUNT] mesi</string> - <string name="AgeWeeksA">[COUNT] settimana</string> - <string name="AgeWeeksB">[COUNT] settimane</string> - <string name="AgeWeeksC">[COUNT] settimane</string> - <string name="AgeDaysA">[COUNT] giorno</string> - <string name="AgeDaysB">[COUNT] giorni</string> - <string name="AgeDaysC">[COUNT] giorni</string> - <string name="GroupMembersA">[COUNT] iscritto</string> - <string name="GroupMembersB">[COUNT] iscritti</string> - <string name="GroupMembersC">[COUNT] iscritti</string> - <string name="AcctTypeResident">Residente</string> - <string name="AcctTypeTrial">In prova</string> - <string name="AcctTypeCharterMember">Socio onorario</string> - <string name="AcctTypeEmployee">Dipendente Linden Lab</string> - <string name="PaymentInfoUsed">Informazioni di pagamento usate</string> - <string name="PaymentInfoOnFile">Informazioni di pagamento registrate</string> - <string name="NoPaymentInfoOnFile">Nessuna informazione di pagamento disponibile</string> - <string name="AgeVerified">Età verificata</string> - <string name="NotAgeVerified">Età non verificata</string> - <string name="Center 2">Centro 2</string> - <string name="Top Right">In alto a destra</string> - <string name="Top">in alto</string> - <string name="Top Left">In alto a sinistra</string> - <string name="Center">Al centro</string> - <string name="Bottom Left">In basso a sinistra</string> - <string name="Bottom">In basso</string> - <string name="Bottom Right">In basso a destra</string> - <string name="CompileQueueDownloadedCompiling">Scaricato, in compilazione</string> - <string name="CompileQueueServiceUnavailable">Il servizio di compilazione degli script non è disponibile</string> - <string name="CompileQueueScriptNotFound">Script non trovato sul server.</string> - <string name="CompileQueueProblemDownloading">Problema nel download</string> - <string name="CompileQueueInsufficientPermDownload">Permessi insufficenti per scaricare lo script.</string> - <string name="CompileQueueInsufficientPermFor">Permessi insufficenti per</string> - <string name="CompileQueueUnknownFailure">Errore di dowload sconosciuto</string> - <string name="CompileNoExperiencePerm">Saltato lo script [SCRIPT] con l'esperienza [EXPERIENCE].</string> - <string name="CompileQueueTitle">Avanzamento ricompilazione</string> - <string name="CompileQueueStart">ricompila</string> - <string name="ResetQueueTitle">Azzera avanzamento</string> - <string name="ResetQueueStart">azzera</string> - <string name="RunQueueTitle">Attiva avanzamento</string> - <string name="RunQueueStart">attiva</string> - <string name="NotRunQueueTitle">Disattiva avanzamento</string> - <string name="NotRunQueueStart">disattiva</string> - <string name="CompileSuccessful">Compilazione riuscita!</string> - <string name="CompileSuccessfulSaving">Compilazione riuscita, in salvataggio...</string> - <string name="SaveComplete">Salvataggio completato.</string> - <string name="UploadFailed">Caricamento file non riuscito:</string> - <string name="ObjectOutOfRange">Script (oggetto fuori portata)</string> - <string name="ScriptWasDeleted">Script (eliminato da inventario)</string> - <string name="GodToolsObjectOwnedBy">Oggetto [OBJECT] di proprietà di [OWNER]</string> - <string name="GroupsNone">nessuno</string> + <string name="InvFolder My Inventory"> + Il mio inventario + </string> + <string name="InvFolder Library"> + Libreria + </string> + <string name="InvFolder Textures"> + Texture + </string> + <string name="InvFolder Sounds"> + Suoni + </string> + <string name="InvFolder Calling Cards"> + Biglietti da visita + </string> + <string name="InvFolder Landmarks"> + Punti di riferimento + </string> + <string name="InvFolder Scripts"> + Script + </string> + <string name="InvFolder Clothing"> + Vestiario + </string> + <string name="InvFolder Objects"> + Oggetti + </string> + <string name="InvFolder Notecards"> + Biglietti + </string> + <string name="InvFolder New Folder"> + Nuova cartella + </string> + <string name="InvFolder Inventory"> + Inventario + </string> + <string name="InvFolder Uncompressed Images"> + Immagini non compresse + </string> + <string name="InvFolder Body Parts"> + Parti del corpo + </string> + <string name="InvFolder Trash"> + Cestino + </string> + <string name="InvFolder Photo Album"> + Album fotografico + </string> + <string name="InvFolder Lost And Found"> + Oggetti smarriti + </string> + <string name="InvFolder Uncompressed Sounds"> + Suoni non compressi + </string> + <string name="InvFolder Animations"> + Animazioni + </string> + <string name="InvFolder Gestures"> + Gesture + </string> + <string name="InvFolder Favorite"> + I miei preferiti + </string> + <string name="InvFolder favorite"> + I miei preferiti + </string> + <string name="InvFolder Favorites"> + I miei preferiti + </string> + <string name="InvFolder favorites"> + I miei preferiti + </string> + <string name="InvFolder Current Outfit"> + Abbigliamento attuale + </string> + <string name="InvFolder Initial Outfits"> + Vestiario iniziale + </string> + <string name="InvFolder My Outfits"> + Il mio vestiario + </string> + <string name="InvFolder Accessories"> + Accessori + </string> + <string name="InvFolder Meshes"> + Reticoli + </string> + <string name="InvFolder Received Items"> + Oggetti ricevuti + </string> + <string name="InvFolder Merchant Outbox"> + Casella venditore in uscita + </string> + <string name="InvFolder Friends"> + Amici + </string> + <string name="InvFolder All"> + Tutto + </string> + <string name="no_attachments"> + Nessun allegato indossato + </string> + <string name="Attachments remain"> + Allegati ([COUNT] spazi restanti) + </string> + <string name="Buy"> + Acquista + </string> + <string name="BuyforL$"> + Acquista per L$ + </string> + <string name="Stone"> + Pietra + </string> + <string name="Metal"> + Metallo + </string> + <string name="Glass"> + Vetro + </string> + <string name="Wood"> + Legno + </string> + <string name="Flesh"> + Carne + </string> + <string name="Plastic"> + Plastica + </string> + <string name="Rubber"> + Gomma + </string> + <string name="Light"> + Luce + </string> + <string name="KBShift"> + Maiusc + </string> + <string name="KBCtrl"> + Ctrl + </string> + <string name="Chest"> + Petto + </string> + <string name="Skull"> + Cranio + </string> + <string name="Left Shoulder"> + Spalla sinistra + </string> + <string name="Right Shoulder"> + Spalla destra + </string> + <string name="Left Hand"> + Mano sinistra + </string> + <string name="Right Hand"> + Mano destra + </string> + <string name="Left Foot"> + Piede sinisto + </string> + <string name="Right Foot"> + Piede destro + </string> + <string name="Spine"> + Spina dorsale + </string> + <string name="Pelvis"> + Pelvi + </string> + <string name="Mouth"> + Bocca + </string> + <string name="Chin"> + Mento + </string> + <string name="Left Ear"> + Orecchio sinistro + </string> + <string name="Right Ear"> + Orecchio destro + </string> + <string name="Left Eyeball"> + Bulbo sinistro + </string> + <string name="Right Eyeball"> + Bulbo destro + </string> + <string name="Nose"> + Naso + </string> + <string name="R Upper Arm"> + Avambraccio destro + </string> + <string name="R Forearm"> + Braccio destro + </string> + <string name="L Upper Arm"> + Avambraccio sinistro + </string> + <string name="L Forearm"> + Braccio sinistro + </string> + <string name="Right Hip"> + Anca destra + </string> + <string name="R Upper Leg"> + Coscia destra + </string> + <string name="R Lower Leg"> + Gamba destra + </string> + <string name="Left Hip"> + Anca sinista + </string> + <string name="L Upper Leg"> + Coscia sinistra + </string> + <string name="L Lower Leg"> + Gamba sinistra + </string> + <string name="Stomach"> + Stomaco + </string> + <string name="Left Pec"> + Petto sinistro + </string> + <string name="Right Pec"> + Petto destro + </string> + <string name="Neck"> + Collo + </string> + <string name="Avatar Center"> + Centro avatar + </string> + <string name="Left Ring Finger"> + Anulare sinistro + </string> + <string name="Right Ring Finger"> + Anulare destro + </string> + <string name="Tail Base"> + Base della coda + </string> + <string name="Tail Tip"> + Punta della coda + </string> + <string name="Left Wing"> + Ala sinistra + </string> + <string name="Right Wing"> + Ala destra + </string> + <string name="Jaw"> + Mandibola + </string> + <string name="Alt Left Ear"> + Altro orecchio sinistro + </string> + <string name="Alt Right Ear"> + Altro orecchio destro + </string> + <string name="Alt Left Eye"> + Altro occhio sinistro + </string> + <string name="Alt Right Eye"> + Altro occhio destro + </string> + <string name="Tongue"> + Lingua + </string> + <string name="Groin"> + Inguine + </string> + <string name="Left Hind Foot"> + Piede posteriore sinistro + </string> + <string name="Right Hind Foot"> + Piede posteriore destro + </string> + <string name="Invalid Attachment"> + Punto di collegamento non valido + </string> + <string name="ATTACHMENT_MISSING_ITEM"> + Errore: articolo mancante + </string> + <string name="ATTACHMENT_MISSING_BASE_ITEM"> + Errore: articolo di base mancante + </string> + <string name="ATTACHMENT_NOT_ATTACHED"> + Errore: l'oggetto è nel vestiario corrente ma non è collegato + </string> + <string name="YearsMonthsOld"> + Nato da [AGEYEARS] [AGEMONTHS] + </string> + <string name="YearsOld"> + Nato da [AGEYEARS] + </string> + <string name="MonthsOld"> + Nato da [AGEMONTHS] + </string> + <string name="WeeksOld"> + Nato da [AGEWEEKS] + </string> + <string name="DaysOld"> + Nato da [AGEDAYS] + </string> + <string name="TodayOld"> + Iscritto oggi + </string> + <string name="av_render_everyone_now"> + Ora ti possono vedere tutti. + </string> + <string name="av_render_not_everyone"> + Alcune persone vicine a te potrebbero non eseguire il tuo rendering. + </string> + <string name="av_render_over_half"> + La maggioranza delle persone vicine a te potrebbe non eseguire il tuo rendering. + </string> + <string name="av_render_most_of"> + La gran parte delle persone vicine a te potrebbe non eseguire il tuo rendering. + </string> + <string name="av_render_anyone"> + Tutte le persone vicine a te potrebbero non eseguire il tuo rendering. + </string> + <string name="hud_description_total"> + Il tuo HUD + </string> + <string name="hud_name_with_joint"> + [OBJ_NAME] (indossato su [JNT_NAME]) + </string> + <string name="hud_render_memory_warning"> + [HUD_DETAILS] fa uso di molta memoria texture + </string> + <string name="hud_render_cost_warning"> + [HUD_DETAILS] contiene molti oggetti e texture che occupano una grande quantità di risorse + </string> + <string name="hud_render_heavy_textures_warning"> + [HUD_DETAILS] contiene molte texture di grandi dimensioni + </string> + <string name="hud_render_cramped_warning"> + [HUD_DETAILS] contiene troppi oggetti + </string> + <string name="hud_render_textures_warning"> + [HUD_DETAILS] contiene troppe texture + </string> + <string name="AgeYearsA"> + [COUNT] anno + </string> + <string name="AgeYearsB"> + [COUNT] anni + </string> + <string name="AgeYearsC"> + [COUNT] anni + </string> + <string name="AgeMonthsA"> + [COUNT] mese + </string> + <string name="AgeMonthsB"> + [COUNT] mesi + </string> + <string name="AgeMonthsC"> + [COUNT] mesi + </string> + <string name="AgeWeeksA"> + [COUNT] settimana + </string> + <string name="AgeWeeksB"> + [COUNT] settimane + </string> + <string name="AgeWeeksC"> + [COUNT] settimane + </string> + <string name="AgeDaysA"> + [COUNT] giorno + </string> + <string name="AgeDaysB"> + [COUNT] giorni + </string> + <string name="AgeDaysC"> + [COUNT] giorni + </string> + <string name="GroupMembersA"> + [COUNT] iscritto + </string> + <string name="GroupMembersB"> + [COUNT] iscritti + </string> + <string name="GroupMembersC"> + [COUNT] iscritti + </string> + <string name="AcctTypeResident"> + Residente + </string> + <string name="AcctTypeTrial"> + In prova + </string> + <string name="AcctTypeCharterMember"> + Socio onorario + </string> + <string name="AcctTypeEmployee"> + Dipendente Linden Lab + </string> + <string name="PaymentInfoUsed"> + Informazioni di pagamento usate + </string> + <string name="PaymentInfoOnFile"> + Informazioni di pagamento registrate + </string> + <string name="NoPaymentInfoOnFile"> + Nessuna informazione di pagamento disponibile + </string> + <string name="AgeVerified"> + Età verificata + </string> + <string name="NotAgeVerified"> + Età non verificata + </string> + <string name="Center 2"> + Centro 2 + </string> + <string name="Top Right"> + In alto a destra + </string> + <string name="Top"> + in alto + </string> + <string name="Top Left"> + In alto a sinistra + </string> + <string name="Center"> + Al centro + </string> + <string name="Bottom Left"> + In basso a sinistra + </string> + <string name="Bottom"> + In basso + </string> + <string name="Bottom Right"> + In basso a destra + </string> + <string name="CompileQueueDownloadedCompiling"> + Scaricato, in compilazione + </string> + <string name="CompileQueueServiceUnavailable"> + Il servizio di compilazione degli script non è disponibile + </string> + <string name="CompileQueueScriptNotFound"> + Script non trovato sul server. + </string> + <string name="CompileQueueProblemDownloading"> + Problema nel download + </string> + <string name="CompileQueueInsufficientPermDownload"> + Permessi insufficenti per scaricare lo script. + </string> + <string name="CompileQueueInsufficientPermFor"> + Permessi insufficenti per + </string> + <string name="CompileQueueUnknownFailure"> + Errore di dowload sconosciuto + </string> + <string name="CompileNoExperiencePerm"> + Saltato lo script [SCRIPT] con l'esperienza [EXPERIENCE]. + </string> + <string name="CompileQueueTitle"> + Avanzamento ricompilazione + </string> + <string name="CompileQueueStart"> + ricompila + </string> + <string name="ResetQueueTitle"> + Azzera avanzamento + </string> + <string name="ResetQueueStart"> + azzera + </string> + <string name="RunQueueTitle"> + Attiva avanzamento + </string> + <string name="RunQueueStart"> + attiva + </string> + <string name="NotRunQueueTitle"> + Disattiva avanzamento + </string> + <string name="NotRunQueueStart"> + disattiva + </string> + <string name="CompileSuccessful"> + Compilazione riuscita! + </string> + <string name="CompileSuccessfulSaving"> + Compilazione riuscita, in salvataggio... + </string> + <string name="SaveComplete"> + Salvataggio completato. + </string> + <string name="UploadFailed"> + Caricamento file non riuscito: + </string> + <string name="ObjectOutOfRange"> + Script (oggetto fuori portata) + </string> + <string name="ScriptWasDeleted"> + Script (eliminato da inventario) + </string> + <string name="GodToolsObjectOwnedBy"> + Oggetto [OBJECT] di proprietà di [OWNER] + </string> + <string name="GroupsNone"> + nessuno + </string> <string name="Group" value="(gruppo)"/> - <string name="Unknown">(Sconosciuto)</string> + <string name="Unknown"> + (Sconosciuto) + </string> <string name="SummaryForTheWeek" value="Riassunto della settimana, partendo dal "/> <string name="NextStipendDay" value=". Il prossimo giorno di stipendio è "/> - <string name="GroupPlanningDate">[mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]</string> + <string name="GroupPlanningDate"> + [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc] + </string> <string name="GroupIndividualShare" value="Gruppo Dividendi individuali"/> <string name="GroupColumn" value="Gruppo"/> - <string name="Balance">Saldo</string> - <string name="Credits">Ringraziamenti</string> - <string name="Debits">Debiti</string> - <string name="Total">Totale</string> - <string name="NoGroupDataFound">Nessun dato trovato per questo gruppo</string> - <string name="IMParentEstate">Proprietà principale</string> - <string name="IMMainland">continente</string> - <string name="IMTeen">teen</string> - <string name="Anyone">chiunque</string> - <string name="RegionInfoError">errore</string> - <string name="RegionInfoAllEstatesOwnedBy">tutte le proprietà immobiliari di [OWNER]</string> - <string name="RegionInfoAllEstatesYouOwn">tutte le tue proprietà immobiliari</string> - <string name="RegionInfoAllEstatesYouManage">tutte le proprietà immobiliari che gestisci per conto di [OWNER]</string> - <string name="RegionInfoAllowedResidents">Sempre consentiti: ([ALLOWEDAGENTS], max [MAXACCESS])</string> - <string name="RegionInfoAllowedGroups">Gruppi sempre consentiti: ([ALLOWEDGROUPS], max [MAXACCESS])</string> - <string name="RegionInfoBannedResidents">Sempre esclusi: ([BANNEDAGENTS], max [MAXBANNED])</string> - <string name="RegionInfoListTypeAllowedAgents">Sempre consentiti:</string> - <string name="RegionInfoListTypeBannedAgents">Sempre esclusi:</string> - <string name="RegionInfoAllEstates">tutte le proprietà immobiliari</string> - <string name="RegionInfoManagedEstates">proprietà immobiliari che gestisci</string> - <string name="RegionInfoThisEstate">questa proprietà immobiliare</string> - <string name="AndNMore">e [EXTRA_COUNT] ancora</string> - <string name="ScriptLimitsParcelScriptMemory">Memoria dello script del lotto</string> - <string name="ScriptLimitsParcelsOwned">Lotti in elenco: [PARCELS]</string> - <string name="ScriptLimitsMemoryUsed">Memoria utilizzata: [COUNT] kb di [MAX] kb; [AVAILABLE] kb disponibili</string> - <string name="ScriptLimitsMemoryUsedSimple">Memoria utilizzata: [COUNT] kb</string> - <string name="ScriptLimitsParcelScriptURLs">URL degli script lotti</string> - <string name="ScriptLimitsURLsUsed">URL utilizzati: [COUNT] di [MAX]; [AVAILABLE] disponibili</string> - <string name="ScriptLimitsURLsUsedSimple">URL utilizzati: [COUNT]</string> - <string name="ScriptLimitsRequestError">Errore nella richiesta di informazioni</string> - <string name="ScriptLimitsRequestNoParcelSelected">Nessun lotto selezionato</string> - <string name="ScriptLimitsRequestWrongRegion">Errore: le informazioni sullo script sono disponibili solo nella tua regione attuale</string> - <string name="ScriptLimitsRequestWaiting">Recupero informazioni in corso...</string> - <string name="ScriptLimitsRequestDontOwnParcel">Non hai il permesso di visionare questo lotto</string> - <string name="SITTING_ON">Seduto su</string> - <string name="ATTACH_CHEST">Petto</string> - <string name="ATTACH_HEAD">Cranio</string> - <string name="ATTACH_LSHOULDER">Spalla sinistra</string> - <string name="ATTACH_RSHOULDER">Spalla destra</string> - <string name="ATTACH_LHAND">Mano sinistra</string> - <string name="ATTACH_RHAND">Mano destra</string> - <string name="ATTACH_LFOOT">Piede sinisto</string> - <string name="ATTACH_RFOOT">Piede destro</string> - <string name="ATTACH_BACK">Spina dorsale</string> - <string name="ATTACH_PELVIS">Pelvi</string> - <string name="ATTACH_MOUTH">Bocca</string> - <string name="ATTACH_CHIN">Mento</string> - <string name="ATTACH_LEAR">Orecchio sinistro</string> - <string name="ATTACH_REAR">Orecchio destro</string> - <string name="ATTACH_LEYE">Occhio sinistro</string> - <string name="ATTACH_REYE">Occhio destro</string> - <string name="ATTACH_NOSE">Naso</string> - <string name="ATTACH_RUARM">Braccio destro</string> - <string name="ATTACH_RLARM">Avambraccio destro</string> - <string name="ATTACH_LUARM">Braccio sinistro</string> - <string name="ATTACH_LLARM">Avambraccio sinistro</string> - <string name="ATTACH_RHIP">Anca destra</string> - <string name="ATTACH_RULEG">Coscia destra</string> - <string name="ATTACH_RLLEG">Coscia destra</string> - <string name="ATTACH_LHIP">Anca sinista</string> - <string name="ATTACH_LULEG">Coscia sinistra</string> - <string name="ATTACH_LLLEG">Polpaccio sinistro</string> - <string name="ATTACH_BELLY">Stomaco</string> - <string name="ATTACH_LEFT_PEC">Petto sinistro</string> - <string name="ATTACH_RIGHT_PEC">Petto destro</string> - <string name="ATTACH_HUD_CENTER_2">HUD in centro 2</string> - <string name="ATTACH_HUD_TOP_RIGHT">HUD alto a destra</string> - <string name="ATTACH_HUD_TOP_CENTER">HUD alto in centro</string> - <string name="ATTACH_HUD_TOP_LEFT">HUD alto a sinistra</string> - <string name="ATTACH_HUD_CENTER_1">HUD in centro 1</string> - <string name="ATTACH_HUD_BOTTOM_LEFT">HUD basso a sinistra</string> - <string name="ATTACH_HUD_BOTTOM">HUD basso</string> - <string name="ATTACH_HUD_BOTTOM_RIGHT">HUD basso a destra</string> - <string name="ATTACH_NECK">Collo</string> - <string name="ATTACH_AVATAR_CENTER">Centro avatar</string> - <string name="ATTACH_LHAND_RING1">Anulare sinistro</string> - <string name="ATTACH_RHAND_RING1">Anulare destro</string> - <string name="ATTACH_TAIL_BASE">Base della coda</string> - <string name="ATTACH_TAIL_TIP">Punta della coda</string> - <string name="ATTACH_LWING">Ala sinistra</string> - <string name="ATTACH_RWING">Ala destra</string> - <string name="ATTACH_FACE_JAW">Mandibola</string> - <string name="ATTACH_FACE_LEAR">Altro orecchio sinistro</string> - <string name="ATTACH_FACE_REAR">Altro orecchio destro</string> - <string name="ATTACH_FACE_LEYE">Altro occhio sinistro</string> - <string name="ATTACH_FACE_REYE">Altro occhio destro</string> - <string name="ATTACH_FACE_TONGUE">Lingua</string> - <string name="ATTACH_GROIN">Inguine</string> - <string name="ATTACH_HIND_LFOOT">Piede posteriore sinistro</string> - <string name="ATTACH_HIND_RFOOT">Piede posteriore destro</string> - <string name="CursorPos">Riga [LINE], Colonna [COLUMN]</string> - <string name="PanelDirCountFound">[COUNT] trovato/i</string> - <string name="PanelContentsTooltip">Contenuto dell'oggetto</string> - <string name="PanelContentsNewScript">Nuovo script</string> - <string name="DoNotDisturbModeResponseDefault">Questo residente ha attivato la modalità 'Non disturbare' e vedrà il tuo messaggio più tardi.</string> - <string name="MuteByName">(In base al nome)</string> - <string name="MuteAgent">(Residente)</string> - <string name="MuteObject">(Oggetto)</string> - <string name="MuteGroup">(Gruppo)</string> - <string name="MuteExternal">(esterno)</string> - <string name="RegionNoCovenant">Non esiste alcun regolamento per questa proprietà .</string> - <string name="RegionNoCovenantOtherOwner">Non esiste alcun regolamento per questa proprietà . Il terreno di questa proprietà è messo in vendita dal proprietario, non dalla Linden Lab. Contatta il proprietario del terreno per i dettagli della vendita.</string> + <string name="Balance"> + Saldo + </string> + <string name="Credits"> + Ringraziamenti + </string> + <string name="Debits"> + Debiti + </string> + <string name="Total"> + Totale + </string> + <string name="NoGroupDataFound"> + Nessun dato trovato per questo gruppo + </string> + <string name="IMParentEstate"> + Proprietà principale + </string> + <string name="IMMainland"> + continente + </string> + <string name="IMTeen"> + teen + </string> + <string name="Anyone"> + chiunque + </string> + <string name="RegionInfoError"> + errore + </string> + <string name="RegionInfoAllEstatesOwnedBy"> + tutte le proprietà immobiliari di [OWNER] + </string> + <string name="RegionInfoAllEstatesYouOwn"> + tutte le tue proprietà immobiliari + </string> + <string name="RegionInfoAllEstatesYouManage"> + tutte le proprietà immobiliari che gestisci per conto di [OWNER] + </string> + <string name="RegionInfoAllowedResidents"> + Sempre consentiti: ([ALLOWEDAGENTS], max [MAXACCESS]) + </string> + <string name="RegionInfoAllowedGroups"> + Gruppi sempre consentiti: ([ALLOWEDGROUPS], max [MAXACCESS]) + </string> + <string name="RegionInfoBannedResidents"> + Sempre esclusi: ([BANNEDAGENTS], max [MAXBANNED]) + </string> + <string name="RegionInfoListTypeAllowedAgents"> + Sempre consentiti: + </string> + <string name="RegionInfoListTypeBannedAgents"> + Sempre esclusi: + </string> + <string name="RegionInfoAllEstates"> + tutte le proprietà immobiliari + </string> + <string name="RegionInfoManagedEstates"> + proprietà immobiliari che gestisci + </string> + <string name="RegionInfoThisEstate"> + questa proprietà immobiliare + </string> + <string name="AndNMore"> + e [EXTRA_COUNT] ancora + </string> + <string name="ScriptLimitsParcelScriptMemory"> + Memoria dello script del lotto + </string> + <string name="ScriptLimitsParcelsOwned"> + Lotti in elenco: [PARCELS] + </string> + <string name="ScriptLimitsMemoryUsed"> + Memoria utilizzata: [COUNT] kb di [MAX] kb; [AVAILABLE] kb disponibili + </string> + <string name="ScriptLimitsMemoryUsedSimple"> + Memoria utilizzata: [COUNT] kb + </string> + <string name="ScriptLimitsParcelScriptURLs"> + URL degli script lotti + </string> + <string name="ScriptLimitsURLsUsed"> + URL utilizzati: [COUNT] di [MAX]; [AVAILABLE] disponibili + </string> + <string name="ScriptLimitsURLsUsedSimple"> + URL utilizzati: [COUNT] + </string> + <string name="ScriptLimitsRequestError"> + Errore nella richiesta di informazioni + </string> + <string name="ScriptLimitsRequestNoParcelSelected"> + Nessun lotto selezionato + </string> + <string name="ScriptLimitsRequestWrongRegion"> + Errore: le informazioni sullo script sono disponibili solo nella tua regione attuale + </string> + <string name="ScriptLimitsRequestWaiting"> + Recupero informazioni in corso... + </string> + <string name="ScriptLimitsRequestDontOwnParcel"> + Non hai il permesso di visionare questo lotto + </string> + <string name="SITTING_ON"> + Seduto su + </string> + <string name="ATTACH_CHEST"> + Petto + </string> + <string name="ATTACH_HEAD"> + Cranio + </string> + <string name="ATTACH_LSHOULDER"> + Spalla sinistra + </string> + <string name="ATTACH_RSHOULDER"> + Spalla destra + </string> + <string name="ATTACH_LHAND"> + Mano sinistra + </string> + <string name="ATTACH_RHAND"> + Mano destra + </string> + <string name="ATTACH_LFOOT"> + Piede sinisto + </string> + <string name="ATTACH_RFOOT"> + Piede destro + </string> + <string name="ATTACH_BACK"> + Spina dorsale + </string> + <string name="ATTACH_PELVIS"> + Pelvi + </string> + <string name="ATTACH_MOUTH"> + Bocca + </string> + <string name="ATTACH_CHIN"> + Mento + </string> + <string name="ATTACH_LEAR"> + Orecchio sinistro + </string> + <string name="ATTACH_REAR"> + Orecchio destro + </string> + <string name="ATTACH_LEYE"> + Occhio sinistro + </string> + <string name="ATTACH_REYE"> + Occhio destro + </string> + <string name="ATTACH_NOSE"> + Naso + </string> + <string name="ATTACH_RUARM"> + Braccio destro + </string> + <string name="ATTACH_RLARM"> + Avambraccio destro + </string> + <string name="ATTACH_LUARM"> + Braccio sinistro + </string> + <string name="ATTACH_LLARM"> + Avambraccio sinistro + </string> + <string name="ATTACH_RHIP"> + Anca destra + </string> + <string name="ATTACH_RULEG"> + Coscia destra + </string> + <string name="ATTACH_RLLEG"> + Coscia destra + </string> + <string name="ATTACH_LHIP"> + Anca sinista + </string> + <string name="ATTACH_LULEG"> + Coscia sinistra + </string> + <string name="ATTACH_LLLEG"> + Polpaccio sinistro + </string> + <string name="ATTACH_BELLY"> + Stomaco + </string> + <string name="ATTACH_LEFT_PEC"> + Petto sinistro + </string> + <string name="ATTACH_RIGHT_PEC"> + Petto destro + </string> + <string name="ATTACH_HUD_CENTER_2"> + HUD in centro 2 + </string> + <string name="ATTACH_HUD_TOP_RIGHT"> + HUD alto a destra + </string> + <string name="ATTACH_HUD_TOP_CENTER"> + HUD alto in centro + </string> + <string name="ATTACH_HUD_TOP_LEFT"> + HUD alto a sinistra + </string> + <string name="ATTACH_HUD_CENTER_1"> + HUD in centro 1 + </string> + <string name="ATTACH_HUD_BOTTOM_LEFT"> + HUD basso a sinistra + </string> + <string name="ATTACH_HUD_BOTTOM"> + HUD basso + </string> + <string name="ATTACH_HUD_BOTTOM_RIGHT"> + HUD basso a destra + </string> + <string name="ATTACH_NECK"> + Collo + </string> + <string name="ATTACH_AVATAR_CENTER"> + Centro avatar + </string> + <string name="ATTACH_LHAND_RING1"> + Anulare sinistro + </string> + <string name="ATTACH_RHAND_RING1"> + Anulare destro + </string> + <string name="ATTACH_TAIL_BASE"> + Base della coda + </string> + <string name="ATTACH_TAIL_TIP"> + Punta della coda + </string> + <string name="ATTACH_LWING"> + Ala sinistra + </string> + <string name="ATTACH_RWING"> + Ala destra + </string> + <string name="ATTACH_FACE_JAW"> + Mandibola + </string> + <string name="ATTACH_FACE_LEAR"> + Altro orecchio sinistro + </string> + <string name="ATTACH_FACE_REAR"> + Altro orecchio destro + </string> + <string name="ATTACH_FACE_LEYE"> + Altro occhio sinistro + </string> + <string name="ATTACH_FACE_REYE"> + Altro occhio destro + </string> + <string name="ATTACH_FACE_TONGUE"> + Lingua + </string> + <string name="ATTACH_GROIN"> + Inguine + </string> + <string name="ATTACH_HIND_LFOOT"> + Piede posteriore sinistro + </string> + <string name="ATTACH_HIND_RFOOT"> + Piede posteriore destro + </string> + <string name="CursorPos"> + Riga [LINE], Colonna [COLUMN] + </string> + <string name="PanelDirCountFound"> + [COUNT] trovato/i + </string> + <string name="PanelContentsTooltip"> + Contenuto dell'oggetto + </string> + <string name="PanelContentsNewScript"> + Nuovo script + </string> + <string name="DoNotDisturbModeResponseDefault"> + Questo residente ha attivato la modalità 'Non disturbare' e vedrà il tuo messaggio più tardi. + </string> + <string name="MuteByName"> + (In base al nome) + </string> + <string name="MuteAgent"> + (Residente) + </string> + <string name="MuteObject"> + (Oggetto) + </string> + <string name="MuteGroup"> + (Gruppo) + </string> + <string name="MuteExternal"> + (esterno) + </string> + <string name="RegionNoCovenant"> + Non esiste alcun regolamento per questa proprietà . + </string> + <string name="RegionNoCovenantOtherOwner"> + Non esiste alcun regolamento per questa proprietà . Il terreno di questa proprietà è messo in vendita dal proprietario, non dalla Linden Lab. Contatta il proprietario del terreno per i dettagli della vendita. + </string> <string name="covenant_last_modified" value="Ultima modifica: "/> <string name="none_text" value="(nessuno)"/> <string name="never_text" value="(mai)"/> - <string name="GroupOwned">Di proprietà di un gruppo</string> - <string name="Public">Pubblica</string> - <string name="LocalSettings">Impostazioni locali</string> - <string name="RegionSettings">Impostazioni regione</string> - <string name="NoEnvironmentSettings">Questa regione non supporta le impostazioni per l’ambiente.</string> - <string name="EnvironmentSun">Sole</string> - <string name="EnvironmentMoon">Luna</string> - <string name="EnvironmentBloom">Fioritura</string> - <string name="EnvironmentCloudNoise">Rumore nuvole</string> - <string name="EnvironmentNormalMap">Mappa normale</string> - <string name="EnvironmentTransparent">Transparent</string> - <string name="ClassifiedClicksTxt">Clicca: [TELEPORT] teleport, [MAP] mappa, [PROFILE] profilo</string> - <string name="ClassifiedUpdateAfterPublish">(si aggiornerà dopo la pubblicazione)</string> - <string name="NoPicksClassifiedsText">Non hai creato luoghi preferiti né inserzioni. Clicca il pulsante + qui sotto per creare un luogo preferito o un'inserzione.</string> - <string name="NoPicksText">Non hai creato Luoghi preferiti. Fai clic sul pulsante Nuovo per creare un Luogo preferito.</string> - <string name="NoClassifiedsText">Non hai creato Annunci. Fai clic sul pulsante Nuovo per creare un Annuncio.</string> - <string name="NoAvatarPicksClassifiedsText">L'utente non ha luoghi preferiti né inserzioni</string> - <string name="NoAvatarPicksText">L'utente non ha luoghi preferiti</string> - <string name="NoAvatarClassifiedsText">L'utente non ha annunci</string> - <string name="PicksClassifiedsLoadingText">Caricamento in corso...</string> - <string name="MultiPreviewTitle">Anteprima</string> - <string name="MultiPropertiesTitle">Beni immobiliari</string> - <string name="InvOfferAnObjectNamed">Un oggetto denominato</string> - <string name="InvOfferOwnedByGroup">di proprietà del gruppo</string> - <string name="InvOfferOwnedByUnknownGroup">di proprietà di un gruppo sconosciuto</string> - <string name="InvOfferOwnedBy">di proprietà di</string> - <string name="InvOfferOwnedByUnknownUser">di proprietà di un utente sconosciuto</string> - <string name="InvOfferGaveYou">Ti ha offerto</string> - <string name="InvOfferDecline">Non hai accettato [DESC] da <nolink>[NAME]</nolink>.</string> - <string name="GroupMoneyTotal">Totale</string> - <string name="GroupMoneyBought">comprato</string> - <string name="GroupMoneyPaidYou">ti ha pagato</string> - <string name="GroupMoneyPaidInto">ha pagato</string> - <string name="GroupMoneyBoughtPassTo">ha comprato il pass</string> - <string name="GroupMoneyPaidFeeForEvent">pagato la tassa per l'evento</string> - <string name="GroupMoneyPaidPrizeForEvent">pagato il premio per l'evento</string> - <string name="GroupMoneyBalance">Saldo</string> - <string name="GroupMoneyCredits">Ringraziamenti</string> - <string name="GroupMoneyDebits">Debiti</string> - <string name="GroupMoneyDate">[weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]</string> - <string name="AcquiredItems">Oggetti acquisiti</string> - <string name="Cancel">Annulla</string> - <string name="UploadingCosts">Il caricamento di [NAME] costa L$ [AMOUNT]</string> - <string name="BuyingCosts">L'acquisto di [NAME] costa L$ [AMOUNT]</string> - <string name="UnknownFileExtension">Estensione del file sconosciuta [.%s] -Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh</string> - <string name="MuteObject2">Blocca</string> - <string name="AddLandmarkNavBarMenu">Aggiungi punto di riferimento...</string> - <string name="EditLandmarkNavBarMenu">Modifica punto di riferimento...</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">Shift+</string> - <string name="FileSaved">File salvato</string> - <string name="Receiving">In ricezione</string> - <string name="AM">antemeridiane</string> - <string name="PM">pomeridiane</string> - <string name="PST">Ora Pacifico</string> - <string name="PDT">Ora legale Pacifico</string> - <string name="Direction_Forward">Avanti</string> - <string name="Direction_Left">Sinistra</string> - <string name="Direction_Right">Destra</string> - <string name="Direction_Back">Indietro</string> - <string name="Direction_North">Nord</string> - <string name="Direction_South">Sud</string> - <string name="Direction_West">Ovest</string> - <string name="Direction_East">Est</string> - <string name="Direction_Up">Su</string> - <string name="Direction_Down">Giù</string> - <string name="Any Category">Qualsiasi categoria</string> - <string name="Shopping">Acquisti</string> - <string name="Land Rental">Affitto terreno</string> - <string name="Property Rental">Affitto proprietà </string> - <string name="Special Attraction">Attrazioni speciali</string> - <string name="New Products">Nuovi prodotti</string> - <string name="Employment">Lavoro</string> - <string name="Wanted">Cercasi</string> - <string name="Service">Servizio</string> - <string name="Personal">Personale</string> - <string name="None">Nessuno</string> - <string name="Linden Location">Luogo dei Linden</string> - <string name="Adult">Adult</string> - <string name="Arts&Culture">Arte & Cultura</string> - <string name="Business">Affari</string> - <string name="Educational">Educazione</string> - <string name="Gaming">Gioco</string> - <string name="Hangout">Divertimento</string> - <string name="Newcomer Friendly">Accoglienza nuovi residenti</string> - <string name="Parks&Nature">Parchi & Natura</string> - <string name="Residential">Residenziale</string> - <string name="Stage">Fase</string> - <string name="Other">Altro</string> - <string name="Rental">Affitto</string> - <string name="Any">Tutti</string> - <string name="You">Tu</string> - <string name="Multiple Media">Più supporti</string> - <string name="Play Media">Riproduci/Pausa supporto</string> - <string name="IntelDriverPage">http://www.intel.com/p/en_US/support/detect/graphics</string> - <string name="NvidiaDriverPage">http://www.nvidia.com/Download/index.aspx?lang=en-us</string> - <string name="AMDDriverPage">http://support.amd.com/us/Pages/AMDSupportHub.aspx</string> - <string name="MBCmdLineError">Un errore è stato riscontrato analizzando la linea di comando. + <string name="GroupOwned"> + Di proprietà di un gruppo + </string> + <string name="Public"> + Pubblica + </string> + <string name="LocalSettings"> + Impostazioni locali + </string> + <string name="RegionSettings"> + Impostazioni regione + </string> + <string name="NoEnvironmentSettings"> + Questa regione non supporta le impostazioni per l’ambiente. + </string> + <string name="EnvironmentSun"> + Sole + </string> + <string name="EnvironmentMoon"> + Luna + </string> + <string name="EnvironmentBloom"> + Fioritura + </string> + <string name="EnvironmentCloudNoise"> + Rumore nuvole + </string> + <string name="EnvironmentNormalMap"> + Mappa normale + </string> + <string name="EnvironmentTransparent"> + Transparent + </string> + <string name="ClassifiedClicksTxt"> + Clicca: [TELEPORT] teleport, [MAP] mappa, [PROFILE] profilo + </string> + <string name="ClassifiedUpdateAfterPublish"> + (si aggiornerà dopo la pubblicazione) + </string> + <string name="NoPicksClassifiedsText"> + Non hai creato luoghi preferiti né inserzioni. Clicca il pulsante + qui sotto per creare un luogo preferito o un'inserzione. + </string> + <string name="NoPicksText"> + Non hai creato Luoghi preferiti. Fai clic sul pulsante Nuovo per creare un Luogo preferito. + </string> + <string name="NoClassifiedsText"> + Non hai creato Annunci. Fai clic sul pulsante Nuovo per creare un Annuncio. + </string> + <string name="NoAvatarPicksClassifiedsText"> + L'utente non ha luoghi preferiti né inserzioni + </string> + <string name="NoAvatarPicksText"> + L'utente non ha luoghi preferiti + </string> + <string name="NoAvatarClassifiedsText"> + L'utente non ha annunci + </string> + <string name="PicksClassifiedsLoadingText"> + Caricamento in corso... + </string> + <string name="MultiPreviewTitle"> + Anteprima + </string> + <string name="MultiPropertiesTitle"> + Beni immobiliari + </string> + <string name="InvOfferAnObjectNamed"> + Un oggetto denominato + </string> + <string name="InvOfferOwnedByGroup"> + di proprietà del gruppo + </string> + <string name="InvOfferOwnedByUnknownGroup"> + di proprietà di un gruppo sconosciuto + </string> + <string name="InvOfferOwnedBy"> + di proprietà di + </string> + <string name="InvOfferOwnedByUnknownUser"> + di proprietà di un utente sconosciuto + </string> + <string name="InvOfferGaveYou"> + Ti ha offerto + </string> + <string name="InvOfferDecline"> + Non hai accettato [DESC] da <nolink>[NAME]</nolink>. + </string> + <string name="GroupMoneyTotal"> + Totale + </string> + <string name="GroupMoneyBought"> + comprato + </string> + <string name="GroupMoneyPaidYou"> + ti ha pagato + </string> + <string name="GroupMoneyPaidInto"> + ha pagato + </string> + <string name="GroupMoneyBoughtPassTo"> + ha comprato il pass + </string> + <string name="GroupMoneyPaidFeeForEvent"> + pagato la tassa per l'evento + </string> + <string name="GroupMoneyPaidPrizeForEvent"> + pagato il premio per l'evento + </string> + <string name="GroupMoneyBalance"> + Saldo + </string> + <string name="GroupMoneyCredits"> + Ringraziamenti + </string> + <string name="GroupMoneyDebits"> + Debiti + </string> + <string name="GroupMoneyDate"> + [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc] + </string> + <string name="AcquiredItems"> + Oggetti acquisiti + </string> + <string name="Cancel"> + Annulla + </string> + <string name="UploadingCosts"> + Il caricamento di [NAME] costa L$ [AMOUNT] + </string> + <string name="BuyingCosts"> + L'acquisto di [NAME] costa L$ [AMOUNT] + </string> + <string name="UnknownFileExtension"> + Estensione del file sconosciuta [.%s] +Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh + </string> + <string name="MuteObject2"> + Blocca + </string> + <string name="AddLandmarkNavBarMenu"> + Aggiungi punto di riferimento... + </string> + <string name="EditLandmarkNavBarMenu"> + Modifica punto di riferimento... + </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"> + Shift+ + </string> + <string name="FileSaved"> + File salvato + </string> + <string name="Receiving"> + In ricezione + </string> + <string name="AM"> + antemeridiane + </string> + <string name="PM"> + pomeridiane + </string> + <string name="PST"> + Ora Pacifico + </string> + <string name="PDT"> + Ora legale Pacifico + </string> + <string name="Direction_Forward"> + Avanti + </string> + <string name="Direction_Left"> + Sinistra + </string> + <string name="Direction_Right"> + Destra + </string> + <string name="Direction_Back"> + Indietro + </string> + <string name="Direction_North"> + Nord + </string> + <string name="Direction_South"> + Sud + </string> + <string name="Direction_West"> + Ovest + </string> + <string name="Direction_East"> + Est + </string> + <string name="Direction_Up"> + Su + </string> + <string name="Direction_Down"> + Giù + </string> + <string name="Any Category"> + Qualsiasi categoria + </string> + <string name="Shopping"> + Acquisti + </string> + <string name="Land Rental"> + Affitto terreno + </string> + <string name="Property Rental"> + Affitto proprietà + </string> + <string name="Special Attraction"> + Attrazioni speciali + </string> + <string name="New Products"> + Nuovi prodotti + </string> + <string name="Employment"> + Lavoro + </string> + <string name="Wanted"> + Cercasi + </string> + <string name="Service"> + Servizio + </string> + <string name="Personal"> + Personale + </string> + <string name="None"> + Nessuno + </string> + <string name="Linden Location"> + Luogo dei Linden + </string> + <string name="Adult"> + Adult + </string> + <string name="Arts&Culture"> + Arte & Cultura + </string> + <string name="Business"> + Affari + </string> + <string name="Educational"> + Educazione + </string> + <string name="Gaming"> + Gioco + </string> + <string name="Hangout"> + Divertimento + </string> + <string name="Newcomer Friendly"> + Accoglienza nuovi residenti + </string> + <string name="Parks&Nature"> + Parchi & Natura + </string> + <string name="Residential"> + Residenziale + </string> + <string name="Stage"> + Fase + </string> + <string name="Other"> + Altro + </string> + <string name="Rental"> + Affitto + </string> + <string name="Any"> + Tutti + </string> + <string name="You"> + Tu + </string> + <string name="Multiple Media"> + Più supporti + </string> + <string name="Play Media"> + Riproduci/Pausa supporto + </string> + <string name="IntelDriverPage"> + http://www.intel.com/p/en_US/support/detect/graphics + </string> + <string name="NvidiaDriverPage"> + http://www.nvidia.com/Download/index.aspx?lang=en-us + </string> + <string name="AMDDriverPage"> + http://support.amd.com/us/Pages/AMDSupportHub.aspx + </string> + <string name="MBCmdLineError"> + Un errore è stato riscontrato analizzando la linea di comando. Per informazioni: http://wiki.secondlife.com/wiki/Client_parameters -Errore:</string> - <string name="MBCmdLineUsg">Uso linea di comando del programma [APP_NAME] :</string> - <string name="MBUnableToAccessFile">Il programma [APP_NAME] non è in grado di accedere ad un file necessario. +Errore: + </string> + <string name="MBCmdLineUsg"> + Uso linea di comando del programma [APP_NAME] : + </string> + <string name="MBUnableToAccessFile"> + Il programma [APP_NAME] non è in grado di accedere ad un file necessario. Potrebbe darsi che tu abbia copie multiple attivate o che il tuo sistema reputi erroneamente che il file sia già aperto. Se il problema persiste, riavvia il computer e riprova. -Se il problema continua ancora, dovresti completamente disinstallare l'applicazione [APP_NAME] e reinstallarla.</string> - <string name="MBFatalError">Errore critico</string> - <string name="MBRequiresAltiVec">Il programma [APP_NAME] richiede un processore con AltiVec (G4 o superiore).</string> - <string name="MBAlreadyRunning">Il programma [APP_NAME] è già attivo. +Se il problema continua ancora, dovresti completamente disinstallare l'applicazione [APP_NAME] e reinstallarla. + </string> + <string name="MBFatalError"> + Errore critico + </string> + <string name="MBRequiresAltiVec"> + Il programma [APP_NAME] richiede un processore con AltiVec (G4 o superiore). + </string> + <string name="MBAlreadyRunning"> + Il programma [APP_NAME] è già attivo. Controlla che il programma non sia minimizzato nella tua barra degli strumenti. -Se il messaggio persiste, riavvia il computer.</string> - <string name="MBFrozenCrashed">Sembra che [APP_NAME] si sia bloccata o interrotta nella sessione precedente. -Vuoi mandare un crash report?</string> - <string name="MBAlert">Avviso</string> - <string name="MBNoDirectX">Il programmma [APP_NAME] non riesce a trovare una DirectX 9.0b o superiore. +Se il messaggio persiste, riavvia il computer. + </string> + <string name="MBFrozenCrashed"> + Sembra che [APP_NAME] si sia bloccata o interrotta nella sessione precedente. +Vuoi mandare un crash report? + </string> + <string name="MBAlert"> + Avviso + </string> + <string name="MBNoDirectX"> + Il programmma [APP_NAME] non riesce a trovare una DirectX 9.0b o superiore. [APP_NAME] usa DirectX per rilevare hardware e/o i driver non aggiornati che possono causare problemi di stabilità , scarsa performance e interruzioni. Benché tu possa avviare il programma [APP_NAME] senza di esse, consigliamo caldamente l'esecuzione con DirectX 9.0b. -Vuoi continuare?</string> - <string name="MBWarning">Attenzione</string> - <string name="MBNoAutoUpdate">L'aggiornamento automatico non è stato ancora realizzato per Linux. -Consigliamo di scaricare l'ultima versione direttamente da www.secondlife.com.</string> - <string name="MBRegClassFailed">RegisterClass non riuscito</string> - <string name="MBError">Errore</string> - <string name="MBFullScreenErr">Impossibile visualizzare a schermo intero con risoluzione [WIDTH] x [HEIGHT]. -Visualizzazione corrente in modalità finestra.</string> - <string name="MBDestroyWinFailed">Errore di arresto durante il tentativo di chiusura della finestra (DestroyWindow() non riuscito)</string> - <string name="MBShutdownErr">Errore di arresto</string> - <string name="MBDevContextErr">Impossibile caricare i driver GL</string> - <string name="MBPixelFmtErr">Impossibile trovare un formato pixel adatto</string> - <string name="MBPixelFmtDescErr">Impossibile ottenere una descrizione del formato pixel</string> - <string name="MBTrueColorWindow">[APP_NAME] richiede True Color (32 bit) per funzionare. -Vai alle impostazioni dello schermo del tuo computer e imposta il colore in modalità 32 bit.</string> - <string name="MBAlpha">[APP_NAME] non funziona poichè è impossibile trovare un canale alpha a 8 bit. Questo problema normalmente deriva dai driver della scheda video. +Vuoi continuare? + </string> + <string name="MBWarning"> + Attenzione + </string> + <string name="MBNoAutoUpdate"> + L'aggiornamento automatico non è stato ancora realizzato per Linux. +Consigliamo di scaricare l'ultima versione direttamente da www.secondlife.com. + </string> + <string name="MBRegClassFailed"> + RegisterClass non riuscito + </string> + <string name="MBError"> + Errore + </string> + <string name="MBFullScreenErr"> + Impossibile visualizzare a schermo intero con risoluzione [WIDTH] x [HEIGHT]. +Visualizzazione corrente in modalità finestra. + </string> + <string name="MBDestroyWinFailed"> + Errore di arresto durante il tentativo di chiusura della finestra (DestroyWindow() non riuscito) + </string> + <string name="MBShutdownErr"> + Errore di arresto + </string> + <string name="MBDevContextErr"> + Impossibile caricare i driver GL + </string> + <string name="MBPixelFmtErr"> + Impossibile trovare un formato pixel adatto + </string> + <string name="MBPixelFmtDescErr"> + Impossibile ottenere una descrizione del formato pixel + </string> + <string name="MBTrueColorWindow"> + [APP_NAME] richiede True Color (32 bit) per funzionare. +Vai alle impostazioni dello schermo del tuo computer e imposta il colore in modalità 32 bit. + </string> + <string name="MBAlpha"> + [APP_NAME] non funziona poichè è impossibile trovare un canale alpha a 8 bit. Questo problema normalmente deriva dai driver della scheda video. Assicurati di avere installato i driver della scheda video più recenti. Assicurati anche che il monitor sia impostato a True Color (32 bit) nel Pannello di controllo > Schermo > Impostazioni. -Se il messaggio persiste, contatta [SUPPORT_SITE].</string> - <string name="MBPixelFmtSetErr">Impossibile impostare il formato pixel</string> - <string name="MBGLContextErr">Impossibile creare il GL rendering</string> - <string name="MBGLContextActErr">Impossibile attivare il GL rendering</string> - <string name="MBVideoDrvErr">[APP_NAME] Non riesce ad avviarsi perchè i driver della tua scheda video non sono stati installati correttamente, non sono aggiornati, o sono per un hardware non supportato. Assicurati di avere i driver della scheda video più recenti e anche se li hai installati, prova a installarli di nuovo. +Se il messaggio persiste, contatta [SUPPORT_SITE]. + </string> + <string name="MBPixelFmtSetErr"> + Impossibile impostare il formato pixel + </string> + <string name="MBGLContextErr"> + Impossibile creare il GL rendering + </string> + <string name="MBGLContextActErr"> + Impossibile attivare il GL rendering + </string> + <string name="MBVideoDrvErr"> + [APP_NAME] Non riesce ad avviarsi perchè i driver della tua scheda video non sono stati installati correttamente, non sono aggiornati, o sono per un hardware non supportato. Assicurati di avere i driver della scheda video più recenti e anche se li hai installati, prova a installarli di nuovo. -Se il messaggio persiste, contatta [SUPPORT_SITE].</string> - <string name="5 O'Clock Shadow">Barba leggera</string> - <string name="All White">Tutti bianchi</string> - <string name="Anime Eyes">Occhi grandi</string> - <string name="Arced">Arcuato</string> - <string name="Arm Length">Lunghezza braccia</string> - <string name="Attached">Attaccato</string> - <string name="Attached Earlobes">Lobi attaccati</string> - <string name="Back Fringe">Frangetta all'indietro</string> - <string name="Baggy">Larghi</string> - <string name="Bangs">Frange</string> - <string name="Beady Eyes">Occhi piccoli</string> - <string name="Belly Size">Punto vita</string> - <string name="Big">Grande</string> - <string name="Big Butt">Sedere grande</string> - <string name="Big Hair Back">Capigliatura grande: Indietro</string> - <string name="Big Hair Front">Capigliatura grande: anteriore</string> - <string name="Big Hair Top">Capigliatura grande: in alto</string> - <string name="Big Head">Grande testa</string> - <string name="Big Pectorals">Grandi pettorali</string> - <string name="Big Spikes">Capelli con punte</string> - <string name="Black">Nero</string> - <string name="Blonde">Biondo</string> - <string name="Blonde Hair">Capelli biondi</string> - <string name="Blush">Fard</string> - <string name="Blush Color">Colore fard</string> - <string name="Blush Opacity">Opacità fard</string> - <string name="Body Definition">Definizione muscolare</string> - <string name="Body Fat">Grasso corporeo</string> - <string name="Body Freckles">Lentiggini e nei</string> - <string name="Body Thick">Corpo più robusto</string> - <string name="Body Thickness">Robustezza del corpo</string> - <string name="Body Thin">Corpo più magro</string> - <string name="Bow Legged">Gambe arcuate</string> - <string name="Breast Buoyancy">Altezza del seno</string> - <string name="Breast Cleavage">Décolleté</string> - <string name="Breast Size">Grandezza del seno</string> - <string name="Bridge Width">Larghezza setto</string> - <string name="Broad">Largo</string> - <string name="Brow Size">Grandezza delle sopracciglia</string> - <string name="Bug Eyes">Occhi sporgenti</string> - <string name="Bugged Eyes">Occhi sporgenti</string> - <string name="Bulbous">Bulboso</string> - <string name="Bulbous Nose">Naso bulboso</string> - <string name="Breast Physics Mass">Massa seno</string> - <string name="Breast Physics Smoothing">Lisciatura seno</string> - <string name="Breast Physics Gravity">Gravità seno</string> - <string name="Breast Physics Drag">Resistenza seno</string> - <string name="Breast Physics InOut Max Effect">Massimo effetto</string> - <string name="Breast Physics InOut Spring">Elasticità </string> - <string name="Breast Physics InOut Gain">Guadagno</string> - <string name="Breast Physics InOut Damping">Attenuazione</string> - <string name="Breast Physics UpDown Max Effect">Massimo effetto</string> - <string name="Breast Physics UpDown Spring">Elasticità </string> - <string name="Breast Physics UpDown Gain">Guadagno</string> - <string name="Breast Physics UpDown Damping">Attenuazione</string> - <string name="Breast Physics LeftRight Max Effect">Massimo effetto</string> - <string name="Breast Physics LeftRight Spring">Elasticità </string> - <string name="Breast Physics LeftRight Gain">Guadagno</string> - <string name="Breast Physics LeftRight Damping">Attenuazione</string> - <string name="Belly Physics Mass">Massa pancia</string> - <string name="Belly Physics Smoothing">Lisciatura pancia</string> - <string name="Belly Physics Gravity">Gravità pancia</string> - <string name="Belly Physics Drag">Resistenza pancia</string> - <string name="Belly Physics UpDown Max Effect">Massimo effetto</string> - <string name="Belly Physics UpDown Spring">Elasticità </string> - <string name="Belly Physics UpDown Gain">Guadagno</string> - <string name="Belly Physics UpDown Damping">Attenuazione</string> - <string name="Butt Physics Mass">Massa natiche</string> - <string name="Butt Physics Smoothing">Lisciatura natiche</string> - <string name="Butt Physics Gravity">Gravità natiche</string> - <string name="Butt Physics Drag">Resistenza natiche</string> - <string name="Butt Physics UpDown Max Effect">Massimo effetto</string> - <string name="Butt Physics UpDown Spring">Elasticità </string> - <string name="Butt Physics UpDown Gain">Guadagno</string> - <string name="Butt Physics UpDown Damping">Attenuazione</string> - <string name="Butt Physics LeftRight Max Effect">Massimo effetto</string> - <string name="Butt Physics LeftRight Spring">Elasticità </string> - <string name="Butt Physics LeftRight Gain">Guadagno</string> - <string name="Butt Physics LeftRight Damping">Attenuazione</string> - <string name="Bushy Eyebrows">Sopracciglia cespugliose</string> - <string name="Bushy Hair">Capelli a cespuglio</string> - <string name="Butt Size">Grandezza del sedere</string> - <string name="Butt Gravity">Gravità natiche</string> - <string name="bustle skirt">Crinolina</string> - <string name="no bustle">Nessuna crinolina</string> - <string name="more bustle">Più crinolina</string> - <string name="Chaplin">Baffetti</string> - <string name="Cheek Bones">Zigomi</string> - <string name="Chest Size">Ampiezza del torace</string> - <string name="Chin Angle">Angolo del mento</string> - <string name="Chin Cleft">Fossetta sul mento</string> - <string name="Chin Curtains">Barba sottomento</string> - <string name="Chin Depth">Profondità mento</string> - <string name="Chin Heavy">Mento forte</string> - <string name="Chin In">Mento in dentro</string> - <string name="Chin Out">Mento sporgente</string> - <string name="Chin-Neck">Mento-collo</string> - <string name="Clear">Trasparente</string> - <string name="Cleft">Fossetta</string> - <string name="Close Set Eyes">Occhi ravvicinati</string> - <string name="Closed">Chiusa</string> - <string name="Closed Back">Chiuso dietro</string> - <string name="Closed Front">Chiuso davanti</string> - <string name="Closed Left">Chiuso sinistra</string> - <string name="Closed Right">Chiuso destra</string> - <string name="Coin Purse">Meno pronunciati</string> - <string name="Collar Back">Colletto posteriore</string> - <string name="Collar Front">Colletto anteriore</string> - <string name="Corner Down">Angolo all'ingiù</string> - <string name="Corner Up">Angolo all'insù</string> - <string name="Creased">Piega</string> - <string name="Crooked Nose">Naso storto</string> - <string name="Cuff Flare">Svasato con risvolto</string> - <string name="Dark">Scuro</string> - <string name="Dark Green">Verde scuro</string> - <string name="Darker">Più scuro</string> - <string name="Deep">Profondo</string> - <string name="Default Heels">Tacchi standard</string> - <string name="Dense">Folti</string> - <string name="Double Chin">Doppio mento</string> - <string name="Downturned">All'ingiù</string> - <string name="Duffle Bag">Più pronunciati</string> - <string name="Ear Angle">Angolo orecchie</string> - <string name="Ear Size">Grandezza orecchie</string> - <string name="Ear Tips">Estremità orecchie</string> - <string name="Egg Head">Ovalizzazione testa</string> - <string name="Eye Bags">Occhiaie</string> - <string name="Eye Color">Colore degli occhi</string> - <string name="Eye Depth">Profondità degli occhi</string> - <string name="Eye Lightness">Luminosità degli occhi</string> - <string name="Eye Opening">Apertura degli occhi</string> - <string name="Eye Pop">Prominenza degli occhi</string> - <string name="Eye Size">Grandezza occhi</string> - <string name="Eye Spacing">Distanza occhi</string> - <string name="Eyebrow Arc">Arco delle sopracciglia</string> - <string name="Eyebrow Density">Densità delle sopracciglia</string> - <string name="Eyebrow Height">Altezza delle sopracciglia</string> - <string name="Eyebrow Points">Sopracciglia appuntite</string> - <string name="Eyebrow Size">Grandezza sopracciglia</string> - <string name="Eyelash Length">Lunghezza delle ciglia</string> - <string name="Eyeliner">Eyeliner</string> - <string name="Eyeliner Color">Colore dell'eyeliner</string> - <string name="Eyes Bugged">Occhi sporgenti</string> - <string name="Face Shear">Taglio del viso</string> - <string name="Facial Definition">Definizione del viso</string> - <string name="Far Set Eyes">Occhi distanti</string> - <string name="Fat Lips">Labbra carnose</string> - <string name="Female">Femmina</string> - <string name="Fingerless">Senza dita</string> - <string name="Fingers">Dita</string> - <string name="Flared Cuffs">Risvolti svasati</string> - <string name="Flat">Piatto</string> - <string name="Flat Butt">Sedere piatto</string> - <string name="Flat Head">Testa piatta</string> - <string name="Flat Toe">Punta piatta</string> - <string name="Foot Size">Misura piede</string> - <string name="Forehead Angle">Angolo della fronte</string> - <string name="Forehead Heavy">Fronte sporgente</string> - <string name="Freckles">Lentiggini</string> - <string name="Front Fringe">Frangetta</string> - <string name="Full Back">Dietro gonfi</string> - <string name="Full Eyeliner">Eyeliner marcato</string> - <string name="Full Front">Anteriore gonfio</string> - <string name="Full Hair Sides">Lati capelli gonfi</string> - <string name="Full Sides">Lati gonfi</string> - <string name="Glossy">Lucido</string> - <string name="Glove Fingers">Dita con guanti</string> - <string name="Glove Length">Lunghezza guanti</string> - <string name="Hair">Capigliature</string> - <string name="Hair Back">Capelli: Indietro</string> - <string name="Hair Front">Capelli: anteriore</string> - <string name="Hair Sides">Capelli: lati</string> - <string name="Hair Sweep">Direzione capigliatura</string> - <string name="Hair Thickess">Foltezza</string> - <string name="Hair Thickness">Foltezza</string> - <string name="Hair Tilt">Inclinazione</string> - <string name="Hair Tilted Left">Verso sinistra</string> - <string name="Hair Tilted Right">Verso destra</string> - <string name="Hair Volume">Capelli: Volume</string> - <string name="Hand Size">Grandezza mani</string> - <string name="Handlebars">Baffi a manubrio</string> - <string name="Head Length">Lunghezza testa</string> - <string name="Head Shape">Forma della testa</string> - <string name="Head Size">Grandezza della testa</string> - <string name="Head Stretch">Allungamento testa</string> - <string name="Heel Height">Altezza tacchi</string> - <string name="Heel Shape">Forma tacchi</string> - <string name="Height">Altezza</string> - <string name="High">Alto</string> - <string name="High Heels">Tacchi alti</string> - <string name="High Jaw">Mandibola alta</string> - <string name="High Platforms">Alta</string> - <string name="High and Tight">Alto e stretto</string> - <string name="Higher">Più alto</string> - <string name="Hip Length">Altezza bacino</string> - <string name="Hip Width">Larghezza bacino</string> - <string name="Hover">Muovi sopra</string> - <string name="In">Dentro</string> - <string name="In Shdw Color">Colore ombretto interno</string> - <string name="In Shdw Opacity">Opacità ombretto interno</string> - <string name="Inner Eye Corner">Angolo interno</string> - <string name="Inner Eye Shadow">Ombretto interno</string> - <string name="Inner Shadow">Ombretto interno</string> - <string name="Jacket Length">Lunghezza giacca</string> - <string name="Jacket Wrinkles">Grinze della giacca</string> - <string name="Jaw Angle">Angolo mandibola</string> - <string name="Jaw Jut">Prognatismo mento</string> - <string name="Jaw Shape">Forma del mento</string> - <string name="Join">Iscriviti</string> - <string name="Jowls">Guance</string> - <string name="Knee Angle">Angolo ginocchia</string> - <string name="Knock Kneed">Gambe ad X</string> - <string name="Large">Grande</string> - <string name="Large Hands">Mani grandi</string> - <string name="Left Part">Riga a sinistra</string> - <string name="Leg Length">Lunghezza gambe</string> - <string name="Leg Muscles">Muscoli gambe</string> - <string name="Less">Meno</string> - <string name="Less Body Fat">Meno grasso corporeo</string> - <string name="Less Curtains">Meno</string> - <string name="Less Freckles">Meno lentiggini</string> - <string name="Less Full">Meno piene</string> - <string name="Less Gravity">Più alto</string> - <string name="Less Love">Meno maniglie</string> - <string name="Less Muscles">Meno muscoli</string> - <string name="Less Muscular">Meno muscolari</string> - <string name="Less Rosy">Meno rosato</string> - <string name="Less Round">Meno rotondo</string> - <string name="Less Saddle">Meno a sella</string> - <string name="Less Square">Meno quadrato</string> - <string name="Less Volume">Meno volume</string> - <string name="Less soul">Meno</string> - <string name="Lighter">Più leggero</string> - <string name="Lip Cleft">Distanza fossetta labbro</string> - <string name="Lip Cleft Depth">Prof. fossetta labbro</string> - <string name="Lip Fullness">Volume labbra</string> - <string name="Lip Pinkness">Tonalità rosa labbra</string> - <string name="Lip Ratio">Proporzione labbra</string> - <string name="Lip Thickness">Carnosità labbra</string> - <string name="Lip Width">Larghezza labbra</string> - <string name="Lipgloss">Lipgloss</string> - <string name="Lipstick">Rossetto</string> - <string name="Lipstick Color">Colore rossetto</string> - <string name="Long">Lungo</string> - <string name="Long Head">Testa lunga</string> - <string name="Long Hips">Bacino alto</string> - <string name="Long Legs">Gambe lunghe</string> - <string name="Long Neck">Collo lungo</string> - <string name="Long Pigtails">Codini lunghi</string> - <string name="Long Ponytail">Codino lungo</string> - <string name="Long Torso">Torace lungo</string> - <string name="Long arms">Braccia lunghe</string> - <string name="Loose Pants">Pantaloni ampi</string> - <string name="Loose Shirt">Camicia ampia</string> - <string name="Loose Sleeves">Maniche non attillate</string> - <string name="Love Handles">Maniglie dell'amore</string> - <string name="Low">Basso</string> - <string name="Low Heels">Tacchi bassi</string> - <string name="Low Jaw">Mandibola bassa</string> - <string name="Low Platforms">Bassa</string> - <string name="Low and Loose">Basso e ampio</string> - <string name="Lower">Più basso</string> - <string name="Lower Bridge">Parte bassa del setto</string> - <string name="Lower Cheeks">Guance inferiori</string> - <string name="Male">Maschio</string> - <string name="Middle Part">Riga nel mezzo</string> - <string name="More">Altro</string> - <string name="More Blush">Più fard</string> - <string name="More Body Fat">Più grasso corporeo</string> - <string name="More Curtains">Più</string> - <string name="More Eyeshadow">Più ombretto</string> - <string name="More Freckles">Più lentiggini</string> - <string name="More Full">Più piene</string> - <string name="More Gravity">Più calato</string> - <string name="More Lipstick">Più rossetto</string> - <string name="More Love">Più maniglie</string> - <string name="More Lower Lip">Labbro inf. pronunciato</string> - <string name="More Muscles">Più muscoli</string> - <string name="More Muscular">Più muscolatura</string> - <string name="More Rosy">Più rosato</string> - <string name="More Round">Più rotondo</string> - <string name="More Saddle">Più a sella</string> - <string name="More Sloped">Più orizzontale</string> - <string name="More Square">Più quadrato</string> - <string name="More Upper Lip">Labbro sup. pronunciato</string> - <string name="More Vertical">Più verticale</string> - <string name="More Volume">Più volume</string> - <string name="More soul">Più</string> - <string name="Moustache">Baffi</string> - <string name="Mouth Corner">Angolo della bocca</string> - <string name="Mouth Position">Posizione della bocca</string> - <string name="Mowhawk">Moicana</string> - <string name="Muscular">Muscolatura</string> - <string name="Mutton Chops">Basette lunghe</string> - <string name="Nail Polish">Smalto</string> - <string name="Nail Polish Color">Colore smalto</string> - <string name="Narrow">Socchiusi</string> - <string name="Narrow Back">Laterali post. vicini</string> - <string name="Narrow Front">Laterali ant. vicini</string> - <string name="Narrow Lips">Labbra strette</string> - <string name="Natural">Naturale</string> - <string name="Neck Length">Lunghezza del collo</string> - <string name="Neck Thickness">Grandezza del collo</string> - <string name="No Blush">Senza fard</string> - <string name="No Eyeliner">Senza eyeliner</string> - <string name="No Eyeshadow">Senza ombretto</string> - <string name="No Lipgloss">Senza lipgloss</string> - <string name="No Lipstick">Senza rossetto</string> - <string name="No Part">Senza riga</string> - <string name="No Polish">Senza smalto</string> - <string name="No Red">Senza rosso</string> - <string name="No Spikes">Senza punte</string> - <string name="No White">Senza bianco</string> - <string name="No Wrinkles">Senza pieghe</string> - <string name="Normal Lower">Inferiore normale</string> - <string name="Normal Upper">Superiore normale</string> - <string name="Nose Left">Naso a sinistra</string> - <string name="Nose Right">Naso a destra</string> - <string name="Nose Size">Grandezza naso</string> - <string name="Nose Thickness">Spessore naso</string> - <string name="Nose Tip Angle">Angolo punta naso</string> - <string name="Nose Tip Shape">Forma punta naso</string> - <string name="Nose Width">Larghezza naso</string> - <string name="Nostril Division">Divisione narici</string> - <string name="Nostril Width">Larghezza narici</string> - <string name="Opaque">Opaco</string> - <string name="Open">Apri</string> - <string name="Open Back">Retro aperto</string> - <string name="Open Front">Davanti aperto</string> - <string name="Open Left">Lato sin. aperto</string> - <string name="Open Right">Lato des. aperto</string> - <string name="Orange">Arancio</string> - <string name="Out">Fuori</string> - <string name="Out Shdw Color">Colore ombretto esterno</string> - <string name="Out Shdw Opacity">Opacità ombretto esterno</string> - <string name="Outer Eye Corner">Angolo esterno occhio</string> - <string name="Outer Eye Shadow">Ombretto esterno</string> - <string name="Outer Shadow">Ombreggiatura esterna</string> - <string name="Overbite">Denti sup. in fuori</string> - <string name="Package">Genitali</string> - <string name="Painted Nails">Unghie smaltate</string> - <string name="Pale">Pallido</string> - <string name="Pants Crotch">Cavallo</string> - <string name="Pants Fit">Vestibilità pantaloni</string> - <string name="Pants Length">Lunghezza pantaloni</string> - <string name="Pants Waist">Taglia pantalone</string> - <string name="Pants Wrinkles">Pantaloni con le grinze</string> - <string name="Part">Con riga</string> - <string name="Part Bangs">Frangetta divisa</string> - <string name="Pectorals">Pettorali</string> - <string name="Pigment">Pigmento</string> - <string name="Pigtails">Codini</string> - <string name="Pink">Rosa</string> - <string name="Pinker">Più rosato</string> - <string name="Platform Height">Altezza pianta</string> - <string name="Platform Width">Larghezza pianta</string> - <string name="Pointy">Appuntito</string> - <string name="Pointy Heels">Tacchi a spillo</string> - <string name="Ponytail">Codino</string> - <string name="Poofy Skirt">Gonna gonfia</string> - <string name="Pop Left Eye">Sinistro più aperto</string> - <string name="Pop Right Eye">Destro più aperto</string> - <string name="Puffy">Paffute</string> - <string name="Puffy Eyelids">Palpebre gonfie</string> - <string name="Rainbow Color">Tonalità </string> - <string name="Red Hair">Presenza di rosso nei capelli</string> - <string name="Regular">Normale</string> - <string name="Right Part">Riga a destra</string> - <string name="Rosy Complexion">Incarnato</string> - <string name="Round">Rotondo</string> - <string name="Ruddiness">Rossore</string> - <string name="Ruddy">Rosse</string> - <string name="Rumpled Hair">Capelli mossi</string> - <string name="Saddle Bags">Rotondità fianchi</string> - <string name="Scrawny Leg">Gambe magre</string> - <string name="Separate">Separati</string> - <string name="Shallow">Meno pronunciato</string> - <string name="Shear Back">Taglio posteriore</string> - <string name="Shear Face">Taglio del viso</string> - <string name="Shear Front">Taglio anteriore</string> - <string name="Shear Left Up">Distorto a sinistra</string> - <string name="Shear Right Up">Distorto a destra</string> - <string name="Sheared Back">Taglio verso dietro</string> - <string name="Sheared Front">Taglio verso davanti</string> - <string name="Shift Left">A sinistra</string> - <string name="Shift Mouth">Spostamento bocca</string> - <string name="Shift Right">A destra</string> - <string name="Shirt Bottom">Parte inferiore camicia</string> - <string name="Shirt Fit">Vestibilità camicia</string> - <string name="Shirt Wrinkles">Camicia con le grinze</string> - <string name="Shoe Height">Altezza scarpe</string> - <string name="Short">Basso</string> - <string name="Short Arms">Braccia corte</string> - <string name="Short Legs">Gambe corte</string> - <string name="Short Neck">Collo corto</string> - <string name="Short Pigtails">Codini corti</string> - <string name="Short Ponytail">Codino corto</string> - <string name="Short Sideburns">Basette corte</string> - <string name="Short Torso">Torace corto</string> - <string name="Short hips">Bacino corto</string> - <string name="Shoulders">Spalle</string> - <string name="Side Fringe">Ciuffi laterali</string> - <string name="Sideburns">Basette</string> - <string name="Sides Hair">Capigliatura di lato</string> - <string name="Sides Hair Down">Capigliatura di lato sciolta</string> - <string name="Sides Hair Up">Capigliatura di lato raccolta</string> - <string name="Skinny Neck">Collo fino</string> - <string name="Skirt Fit">Vestibilità gonna</string> - <string name="Skirt Length">Lunghezza gonna</string> - <string name="Slanted Forehead">Fronte inclinata</string> - <string name="Sleeve Length">Lunghezza maniche</string> - <string name="Sleeve Looseness">Morbidezza maniche</string> - <string name="Slit Back">Spacco: Indietro</string> - <string name="Slit Front">Spacco: anteriore</string> - <string name="Slit Left">Spacco: Sinistra</string> - <string name="Slit Right">Spacco: Destra</string> - <string name="Small">Piccola</string> - <string name="Small Hands">Mani piccole</string> - <string name="Small Head">Testa piccola</string> - <string name="Smooth">Liscio</string> - <string name="Smooth Hair">Capelli lisci</string> - <string name="Socks Length">Lunghezza calze</string> - <string name="Soulpatch">Pizzetto labbro inferiore</string> - <string name="Sparse">Piu rade</string> - <string name="Spiked Hair">Capelli a punta</string> - <string name="Square">Quadrato</string> - <string name="Square Toe">Punta quadrata</string> - <string name="Squash Head">Testa schiacciata</string> - <string name="Stretch Head">Testa allungata</string> - <string name="Sunken">Scarne</string> - <string name="Sunken Chest">Senza pettorali</string> - <string name="Sunken Eyes">Occhi infossati</string> - <string name="Sweep Back">Indietro</string> - <string name="Sweep Forward">Avanti</string> - <string name="Tall">Alto</string> - <string name="Taper Back">Ravv. lat. posteriore</string> - <string name="Taper Front">Ravv. lat. frontale</string> - <string name="Thick Heels">Tacchi spessi</string> - <string name="Thick Neck">Collo grosso</string> - <string name="Thick Toe">Punta spessa</string> - <string name="Thin">Sottili</string> - <string name="Thin Eyebrows">Sopracciglia sottili</string> - <string name="Thin Lips">Labbra sottili</string> - <string name="Thin Nose">Naso sottile</string> - <string name="Tight Chin">Mento stretto</string> - <string name="Tight Cuffs">Fondo stretto</string> - <string name="Tight Pants">Pantaloni attillati</string> - <string name="Tight Shirt">Camicia attillata</string> - <string name="Tight Skirt">Gonna attillata</string> - <string name="Tight Sleeves">Maniche strette</string> - <string name="Toe Shape">Forma della punta</string> - <string name="Toe Thickness">Spessore della punta</string> - <string name="Torso Length">Lunghezza del torace</string> - <string name="Torso Muscles">Muscoli del torace</string> - <string name="Torso Scrawny">Torso Scrawny</string> - <string name="Unattached">Distaccato</string> - <string name="Uncreased">Senza piega</string> - <string name="Underbite">Denti inf. in fuori</string> - <string name="Unnatural">Innaturale</string> - <string name="Upper Bridge">Parte alta del setto</string> - <string name="Upper Cheeks">Parte alta degli zigomi</string> - <string name="Upper Chin Cleft">Fossetta sup. del mento</string> - <string name="Upper Eyelid Fold">Piega palpebra sup.</string> - <string name="Upturned">All'insù</string> - <string name="Very Red">Molto rossi</string> - <string name="Waist Height">Vita alta</string> - <string name="Well-Fed">Pienotte</string> - <string name="White Hair">Capelli bianchi</string> - <string name="Wide">Largo</string> - <string name="Wide Back">Dietro largo</string> - <string name="Wide Front">Davanti largo</string> - <string name="Wide Lips">Labbra larghe</string> - <string name="Wild">Colorati</string> - <string name="Wrinkles">Grinze</string> - <string name="LocationCtrlAddLandmarkTooltip">Aggiungi ai miei punti di riferimento</string> - <string name="LocationCtrlEditLandmarkTooltip">Modifica i miei punti di riferimento</string> - <string name="LocationCtrlInfoBtnTooltip">Maggiori informazioni sulla posizione attuale</string> - <string name="LocationCtrlComboBtnTooltip">La cronologia delle mie posizioni</string> - <string name="LocationCtrlAdultIconTooltip">Regione con categoria adulti</string> - <string name="LocationCtrlModerateIconTooltip">Regione con categoria moderata</string> - <string name="LocationCtrlGeneralIconTooltip">Regione generale</string> - <string name="LocationCtrlSeeAVsTooltip">Gli avatar in questo lotto non possono essere visti o sentiti da avatar all'esterno del lotto</string> - <string name="LocationCtrlPathfindingDirtyTooltip">Gli oggetti che si muovono potrebbero non comportarsi correttamente in questa regione fino a quando non viene eseguito il rebake della regione.</string> - <string name="LocationCtrlPathfindingDisabledTooltip">Il pathfinding dinamico non è attivato in questa regione.</string> - <string name="UpdaterWindowTitle">Aggiornamento [APP_NAME]</string> - <string name="UpdaterNowUpdating">Aggiornamento di [APP_NAME]...</string> - <string name="UpdaterNowInstalling">Installazione di [APP_NAME]...</string> - <string name="UpdaterUpdatingDescriptive">Il Viewer del programma [APP_NAME] si sta aggiornando all'ultima versione. Potrebbe volerci del tempo, attendi.</string> - <string name="UpdaterProgressBarTextWithEllipses">Download dell'aggiornamento...</string> - <string name="UpdaterProgressBarText">Download dell'aggiornamento</string> - <string name="UpdaterFailDownloadTitle">Download dell'aggiornamento non riuscito</string> - <string name="UpdaterFailUpdateDescriptive">Il programma [APP_NAME] ha riscontrato un'errore durante il tentativo di aggiornamento. Consigliamo di scaricare l'ultima versione direttamente da www.secondlife.com.</string> - <string name="UpdaterFailInstallTitle">Installazione dell'aggiornamento non riuscita</string> - <string name="UpdaterFailStartTitle">Errore nell'avvio del viewer</string> - <string name="ItemsComingInTooFastFrom">[APP_NAME]: Oggetti in arrivo troppo velocemente da [FROM_NAME], anteprima automatica disattivata per [TIME] secondi</string> - <string name="ItemsComingInTooFast">[APP_NAME]: Oggetti in arrivo troppo velocemente, anteprima automatica disattivata per [TIME] secondi</string> - <string name="IM_logging_string">-- Registrazione messaggi instantanei abilitata --</string> - <string name="IM_typing_start_string">[NAME] sta scrivendo...</string> - <string name="Unnamed">(anonimo)</string> - <string name="IM_moderated_chat_label">(Moderato: Voci disattivate di default)</string> - <string name="IM_unavailable_text_label">La chat di testo non è disponibile per questa chiamata.</string> - <string name="IM_muted_text_label">La chat di testo è stata disabilitata da un moderatore di gruppo.</string> - <string name="IM_default_text_label">Clicca qui per inviare un messaggio instantaneo.</string> - <string name="IM_to_label">A</string> - <string name="IM_moderator_label">(Moderatore)</string> - <string name="Saved_message">(Salvato [LONG_TIMESTAMP])</string> - <string name="IM_unblock_only_groups_friends">Per vedere questo messaggio, devi deselezionare 'Solo amici e gruppi possono chiamarmi o mandarmi IM' in Preferenze/Privacy.</string> - <string name="OnlineStatus">Online</string> - <string name="OfflineStatus">Offline</string> - <string name="not_online_msg">Utente non online - il messaggio verrà memorizzato e inviato più tardi.</string> - <string name="not_online_inventory">Utente non online - l'inventario è stato salvato</string> - <string name="answered_call">Risposto alla chiamata</string> - <string name="you_started_call">Hai iniziato una chiamata vocale</string> - <string name="you_joined_call">Ti sei collegato alla chiamata in voce</string> - <string name="you_auto_rejected_call-im">Hai rifiutato automaticamente la chiamata voce mentre era attivata la modalità 'Non disturbare'.</string> - <string name="name_started_call">[NAME] ha iniziato una chiamata vocale</string> - <string name="ringing-im">Collegamento alla chiamata vocale...</string> - <string name="connected-im">Collegato, clicca Chiudi chiamata per agganciare</string> - <string name="hang_up-im">Chiusa la chiamata</string> - <string name="conference-title">Chat con più persone</string> - <string name="conference-title-incoming">Chiamata in conferenza con [AGENT_NAME]</string> - <string name="inventory_item_offered-im">Offerto oggetto di inventario "[ITEM_NAME]"</string> - <string name="inventory_folder_offered-im">Offerta cartella di inventario "[ITEM_NAME]"</string> - <string name="facebook_post_success">Hai pubblicato su Facebook.</string> - <string name="flickr_post_success">Hai pubblicato su Flickr.</string> - <string name="twitter_post_success">Hai pubblicato su Twitter.</string> - <string name="no_session_message">(La sessione IM non esiste)</string> - <string name="only_user_message">Sei l'unico utente di questa sessione.</string> - <string name="offline_message">[NAME] è offline</string> - <string name="invite_message">Clicca il tasto [BUTTON NAME] per accettare/connetterti a questa voice chat.</string> - <string name="muted_message">Hai bloccato questo residente. Quando gli invii un messaggio, verrà automaticamente sbloccato.</string> - <string name="generic">Errore nella richiesta, riprova più tardi.</string> - <string name="generic_request_error">Errore durante la richiesta, riprova più tardi.</string> - <string name="insufficient_perms_error">Non hai sufficienti permessi.</string> - <string name="session_does_not_exist_error">Questa sessione non esiste più</string> - <string name="no_ability_error">Non hai questa abilitazione.</string> - <string name="no_ability">Non hai questa abilitazione.</string> - <string name="not_a_mod_error">Non sei un moderatore.</string> - <string name="muted">Il moderatore del gruppo ha disattivato la tua chat di testo.</string> - <string name="muted_error">Un moderatore di gruppo ti ha disabilitato dalla chat di testo.</string> - <string name="add_session_event">Impossibile aggiungere utenti alla chat con [RECIPIENT].</string> - <string name="message">Impossibile spedire il tuo messaggio nella sessione chat con [RECIPIENT].</string> - <string name="message_session_event">Impossibile inviare il messaggio nella chat con [RECIPIENT].</string> - <string name="mute">Errore durante la moderazione.</string> - <string name="removed">Sei stato rimosso dal gruppo.</string> - <string name="removed_from_group">Sei stato espulso dal gruppo.</string> - <string name="close_on_no_ability">Non hai più le abilitazioni per rimanere nella sessione chat.</string> - <string name="unread_chat_single">[SOURCES] ha detto qualcosa di nuovo</string> - <string name="unread_chat_multiple">[SOURCES] ha detto qualcosa di nuovo</string> - <string name="session_initialization_timed_out_error">Sessione di inizializzazione scaduta</string> - <string name="Home position set.">Posizione di base impostata.</string> - <string name="voice_morphing_url">https://secondlife.com/destination/voice-island</string> - <string name="premium_voice_morphing_url">https://secondlife.com/destination/voice-morphing-premium</string> - <string name="paid_you_ldollars">[NAME] ti ha inviato un pagamento di L$[AMOUNT] [REASON].</string> - <string name="paid_you_ldollars_gift">[NAME] ti ha inviato un pagamento di L$ [AMOUNT]: [REASON]</string> - <string name="paid_you_ldollars_no_reason">[NAME] ti ha inviato un pagamento di L$[AMOUNT].</string> - <string name="you_paid_ldollars">Hai inviato un pagamento di L$[AMOUNT] a [NAME] [REASON].</string> - <string name="you_paid_ldollars_gift">Hai inviato un pagamento di L$ [AMOUNT] a [NAME]: [REASON]</string> - <string name="you_paid_ldollars_no_info">Hai pagato L$ [AMOUNT].</string> - <string name="you_paid_ldollars_no_reason">Hai inviato un pagamento di L$[AMOUNT] a [NAME].</string> - <string name="you_paid_ldollars_no_name">Hai pagato L$ [AMOUNT] [REASON].</string> - <string name="you_paid_failure_ldollars">Non hai pagato [NAME] L$[AMOUNT] [REASON].</string> - <string name="you_paid_failure_ldollars_gift">Non hai inviato un pagamento di L$ [AMOUNT] a [NAME]: [REASON]</string> - <string name="you_paid_failure_ldollars_no_info">Non hai pagato L$ [AMOUNT].</string> - <string name="you_paid_failure_ldollars_no_reason">Non hai pagato [NAME] L$[AMOUNT].</string> - <string name="you_paid_failure_ldollars_no_name">Non hai pagato L$ [AMOUNT] [REASON].</string> - <string name="for item">per [ITEM]</string> - <string name="for a parcel of land">per un lotto di terreno</string> - <string name="for a land access pass">per un permesso di accesso al terreno</string> - <string name="for deeding land">per la cessione di terreno</string> - <string name="to create a group">per creare un gruppo</string> - <string name="to join a group">per aderire a un gruppo</string> - <string name="to upload">per caricare</string> - <string name="to publish a classified ad">per pubblicare un annuncio</string> - <string name="giving">Contributo di L$ [AMOUNT]</string> - <string name="uploading_costs">Il costo per il caricamento è di L$ [AMOUNT]</string> - <string name="this_costs">Il costo è L$ [AMOUNT]</string> - <string name="buying_selected_land">L'acquisto del terreno prescelto costa L$ [AMOUNT]</string> - <string name="this_object_costs">Il costo dell'oggetto è L$ [AMOUNT]</string> - <string name="group_role_everyone">Tutti</string> - <string name="group_role_officers">Funzionari</string> - <string name="group_role_owners">Proprietari</string> - <string name="group_member_status_online">Online</string> - <string name="uploading_abuse_report">Caricamento in corso... +Se il messaggio persiste, contatta [SUPPORT_SITE]. + </string> + <string name="5 O'Clock Shadow"> + Barba leggera + </string> + <string name="All White"> + Tutti bianchi + </string> + <string name="Anime Eyes"> + Occhi grandi + </string> + <string name="Arced"> + Arcuato + </string> + <string name="Arm Length"> + Lunghezza braccia + </string> + <string name="Attached"> + Attaccato + </string> + <string name="Attached Earlobes"> + Lobi attaccati + </string> + <string name="Back Fringe"> + Frangetta all'indietro + </string> + <string name="Baggy"> + Larghi + </string> + <string name="Bangs"> + Frange + </string> + <string name="Beady Eyes"> + Occhi piccoli + </string> + <string name="Belly Size"> + Punto vita + </string> + <string name="Big"> + Grande + </string> + <string name="Big Butt"> + Sedere grande + </string> + <string name="Big Hair Back"> + Capigliatura grande: Indietro + </string> + <string name="Big Hair Front"> + Capigliatura grande: anteriore + </string> + <string name="Big Hair Top"> + Capigliatura grande: in alto + </string> + <string name="Big Head"> + Grande testa + </string> + <string name="Big Pectorals"> + Grandi pettorali + </string> + <string name="Big Spikes"> + Capelli con punte + </string> + <string name="Black"> + Nero + </string> + <string name="Blonde"> + Biondo + </string> + <string name="Blonde Hair"> + Capelli biondi + </string> + <string name="Blush"> + Fard + </string> + <string name="Blush Color"> + Colore fard + </string> + <string name="Blush Opacity"> + Opacità fard + </string> + <string name="Body Definition"> + Definizione muscolare + </string> + <string name="Body Fat"> + Grasso corporeo + </string> + <string name="Body Freckles"> + Lentiggini e nei + </string> + <string name="Body Thick"> + Corpo più robusto + </string> + <string name="Body Thickness"> + Robustezza del corpo + </string> + <string name="Body Thin"> + Corpo più magro + </string> + <string name="Bow Legged"> + Gambe arcuate + </string> + <string name="Breast Buoyancy"> + Altezza del seno + </string> + <string name="Breast Cleavage"> + Décolleté + </string> + <string name="Breast Size"> + Grandezza del seno + </string> + <string name="Bridge Width"> + Larghezza setto + </string> + <string name="Broad"> + Largo + </string> + <string name="Brow Size"> + Grandezza delle sopracciglia + </string> + <string name="Bug Eyes"> + Occhi sporgenti + </string> + <string name="Bugged Eyes"> + Occhi sporgenti + </string> + <string name="Bulbous"> + Bulboso + </string> + <string name="Bulbous Nose"> + Naso bulboso + </string> + <string name="Breast Physics Mass"> + Massa seno + </string> + <string name="Breast Physics Smoothing"> + Lisciatura seno + </string> + <string name="Breast Physics Gravity"> + Gravità seno + </string> + <string name="Breast Physics Drag"> + Resistenza seno + </string> + <string name="Breast Physics InOut Max Effect"> + Massimo effetto + </string> + <string name="Breast Physics InOut Spring"> + Elasticità + </string> + <string name="Breast Physics InOut Gain"> + Guadagno + </string> + <string name="Breast Physics InOut Damping"> + Attenuazione + </string> + <string name="Breast Physics UpDown Max Effect"> + Massimo effetto + </string> + <string name="Breast Physics UpDown Spring"> + Elasticità + </string> + <string name="Breast Physics UpDown Gain"> + Guadagno + </string> + <string name="Breast Physics UpDown Damping"> + Attenuazione + </string> + <string name="Breast Physics LeftRight Max Effect"> + Massimo effetto + </string> + <string name="Breast Physics LeftRight Spring"> + Elasticità + </string> + <string name="Breast Physics LeftRight Gain"> + Guadagno + </string> + <string name="Breast Physics LeftRight Damping"> + Attenuazione + </string> + <string name="Belly Physics Mass"> + Massa pancia + </string> + <string name="Belly Physics Smoothing"> + Lisciatura pancia + </string> + <string name="Belly Physics Gravity"> + Gravità pancia + </string> + <string name="Belly Physics Drag"> + Resistenza pancia + </string> + <string name="Belly Physics UpDown Max Effect"> + Massimo effetto + </string> + <string name="Belly Physics UpDown Spring"> + Elasticità + </string> + <string name="Belly Physics UpDown Gain"> + Guadagno + </string> + <string name="Belly Physics UpDown Damping"> + Attenuazione + </string> + <string name="Butt Physics Mass"> + Massa natiche + </string> + <string name="Butt Physics Smoothing"> + Lisciatura natiche + </string> + <string name="Butt Physics Gravity"> + Gravità natiche + </string> + <string name="Butt Physics Drag"> + Resistenza natiche + </string> + <string name="Butt Physics UpDown Max Effect"> + Massimo effetto + </string> + <string name="Butt Physics UpDown Spring"> + Elasticità + </string> + <string name="Butt Physics UpDown Gain"> + Guadagno + </string> + <string name="Butt Physics UpDown Damping"> + Attenuazione + </string> + <string name="Butt Physics LeftRight Max Effect"> + Massimo effetto + </string> + <string name="Butt Physics LeftRight Spring"> + Elasticità + </string> + <string name="Butt Physics LeftRight Gain"> + Guadagno + </string> + <string name="Butt Physics LeftRight Damping"> + Attenuazione + </string> + <string name="Bushy Eyebrows"> + Sopracciglia cespugliose + </string> + <string name="Bushy Hair"> + Capelli a cespuglio + </string> + <string name="Butt Size"> + Grandezza del sedere + </string> + <string name="Butt Gravity"> + Gravità natiche + </string> + <string name="bustle skirt"> + Crinolina + </string> + <string name="no bustle"> + Nessuna crinolina + </string> + <string name="more bustle"> + Più crinolina + </string> + <string name="Chaplin"> + Baffetti + </string> + <string name="Cheek Bones"> + Zigomi + </string> + <string name="Chest Size"> + Ampiezza del torace + </string> + <string name="Chin Angle"> + Angolo del mento + </string> + <string name="Chin Cleft"> + Fossetta sul mento + </string> + <string name="Chin Curtains"> + Barba sottomento + </string> + <string name="Chin Depth"> + Profondità mento + </string> + <string name="Chin Heavy"> + Mento forte + </string> + <string name="Chin In"> + Mento in dentro + </string> + <string name="Chin Out"> + Mento sporgente + </string> + <string name="Chin-Neck"> + Mento-collo + </string> + <string name="Clear"> + Trasparente + </string> + <string name="Cleft"> + Fossetta + </string> + <string name="Close Set Eyes"> + Occhi ravvicinati + </string> + <string name="Closed"> + Chiusa + </string> + <string name="Closed Back"> + Chiuso dietro + </string> + <string name="Closed Front"> + Chiuso davanti + </string> + <string name="Closed Left"> + Chiuso sinistra + </string> + <string name="Closed Right"> + Chiuso destra + </string> + <string name="Coin Purse"> + Meno pronunciati + </string> + <string name="Collar Back"> + Colletto posteriore + </string> + <string name="Collar Front"> + Colletto anteriore + </string> + <string name="Corner Down"> + Angolo all'ingiù + </string> + <string name="Corner Up"> + Angolo all'insù + </string> + <string name="Creased"> + Piega + </string> + <string name="Crooked Nose"> + Naso storto + </string> + <string name="Cuff Flare"> + Svasato con risvolto + </string> + <string name="Dark"> + Scuro + </string> + <string name="Dark Green"> + Verde scuro + </string> + <string name="Darker"> + Più scuro + </string> + <string name="Deep"> + Profondo + </string> + <string name="Default Heels"> + Tacchi standard + </string> + <string name="Dense"> + Folti + </string> + <string name="Double Chin"> + Doppio mento + </string> + <string name="Downturned"> + All'ingiù + </string> + <string name="Duffle Bag"> + Più pronunciati + </string> + <string name="Ear Angle"> + Angolo orecchie + </string> + <string name="Ear Size"> + Grandezza orecchie + </string> + <string name="Ear Tips"> + Estremità orecchie + </string> + <string name="Egg Head"> + Ovalizzazione testa + </string> + <string name="Eye Bags"> + Occhiaie + </string> + <string name="Eye Color"> + Colore degli occhi + </string> + <string name="Eye Depth"> + Profondità degli occhi + </string> + <string name="Eye Lightness"> + Luminosità degli occhi + </string> + <string name="Eye Opening"> + Apertura degli occhi + </string> + <string name="Eye Pop"> + Prominenza degli occhi + </string> + <string name="Eye Size"> + Grandezza occhi + </string> + <string name="Eye Spacing"> + Distanza occhi + </string> + <string name="Eyebrow Arc"> + Arco delle sopracciglia + </string> + <string name="Eyebrow Density"> + Densità delle sopracciglia + </string> + <string name="Eyebrow Height"> + Altezza delle sopracciglia + </string> + <string name="Eyebrow Points"> + Sopracciglia appuntite + </string> + <string name="Eyebrow Size"> + Grandezza sopracciglia + </string> + <string name="Eyelash Length"> + Lunghezza delle ciglia + </string> + <string name="Eyeliner"> + Eyeliner + </string> + <string name="Eyeliner Color"> + Colore dell'eyeliner + </string> + <string name="Eyes Bugged"> + Occhi sporgenti + </string> + <string name="Face Shear"> + Taglio del viso + </string> + <string name="Facial Definition"> + Definizione del viso + </string> + <string name="Far Set Eyes"> + Occhi distanti + </string> + <string name="Fat Lips"> + Labbra carnose + </string> + <string name="Female"> + Femmina + </string> + <string name="Fingerless"> + Senza dita + </string> + <string name="Fingers"> + Dita + </string> + <string name="Flared Cuffs"> + Risvolti svasati + </string> + <string name="Flat"> + Piatto + </string> + <string name="Flat Butt"> + Sedere piatto + </string> + <string name="Flat Head"> + Testa piatta + </string> + <string name="Flat Toe"> + Punta piatta + </string> + <string name="Foot Size"> + Misura piede + </string> + <string name="Forehead Angle"> + Angolo della fronte + </string> + <string name="Forehead Heavy"> + Fronte sporgente + </string> + <string name="Freckles"> + Lentiggini + </string> + <string name="Front Fringe"> + Frangetta + </string> + <string name="Full Back"> + Dietro gonfi + </string> + <string name="Full Eyeliner"> + Eyeliner marcato + </string> + <string name="Full Front"> + Anteriore gonfio + </string> + <string name="Full Hair Sides"> + Lati capelli gonfi + </string> + <string name="Full Sides"> + Lati gonfi + </string> + <string name="Glossy"> + Lucido + </string> + <string name="Glove Fingers"> + Dita con guanti + </string> + <string name="Glove Length"> + Lunghezza guanti + </string> + <string name="Hair"> + Capigliature + </string> + <string name="Hair Back"> + Capelli: Indietro + </string> + <string name="Hair Front"> + Capelli: anteriore + </string> + <string name="Hair Sides"> + Capelli: lati + </string> + <string name="Hair Sweep"> + Direzione capigliatura + </string> + <string name="Hair Thickess"> + Foltezza + </string> + <string name="Hair Thickness"> + Foltezza + </string> + <string name="Hair Tilt"> + Inclinazione + </string> + <string name="Hair Tilted Left"> + Verso sinistra + </string> + <string name="Hair Tilted Right"> + Verso destra + </string> + <string name="Hair Volume"> + Capelli: Volume + </string> + <string name="Hand Size"> + Grandezza mani + </string> + <string name="Handlebars"> + Baffi a manubrio + </string> + <string name="Head Length"> + Lunghezza testa + </string> + <string name="Head Shape"> + Forma della testa + </string> + <string name="Head Size"> + Grandezza della testa + </string> + <string name="Head Stretch"> + Allungamento testa + </string> + <string name="Heel Height"> + Altezza tacchi + </string> + <string name="Heel Shape"> + Forma tacchi + </string> + <string name="Height"> + Altezza + </string> + <string name="High"> + Alto + </string> + <string name="High Heels"> + Tacchi alti + </string> + <string name="High Jaw"> + Mandibola alta + </string> + <string name="High Platforms"> + Alta + </string> + <string name="High and Tight"> + Alto e stretto + </string> + <string name="Higher"> + Più alto + </string> + <string name="Hip Length"> + Altezza bacino + </string> + <string name="Hip Width"> + Larghezza bacino + </string> + <string name="Hover"> + Muovi sopra + </string> + <string name="In"> + Dentro + </string> + <string name="In Shdw Color"> + Colore ombretto interno + </string> + <string name="In Shdw Opacity"> + Opacità ombretto interno + </string> + <string name="Inner Eye Corner"> + Angolo interno + </string> + <string name="Inner Eye Shadow"> + Ombretto interno + </string> + <string name="Inner Shadow"> + Ombretto interno + </string> + <string name="Jacket Length"> + Lunghezza giacca + </string> + <string name="Jacket Wrinkles"> + Grinze della giacca + </string> + <string name="Jaw Angle"> + Angolo mandibola + </string> + <string name="Jaw Jut"> + Prognatismo mento + </string> + <string name="Jaw Shape"> + Forma del mento + </string> + <string name="Join"> + Iscriviti + </string> + <string name="Jowls"> + Guance + </string> + <string name="Knee Angle"> + Angolo ginocchia + </string> + <string name="Knock Kneed"> + Gambe ad X + </string> + <string name="Large"> + Grande + </string> + <string name="Large Hands"> + Mani grandi + </string> + <string name="Left Part"> + Riga a sinistra + </string> + <string name="Leg Length"> + Lunghezza gambe + </string> + <string name="Leg Muscles"> + Muscoli gambe + </string> + <string name="Less"> + Meno + </string> + <string name="Less Body Fat"> + Meno grasso corporeo + </string> + <string name="Less Curtains"> + Meno + </string> + <string name="Less Freckles"> + Meno lentiggini + </string> + <string name="Less Full"> + Meno piene + </string> + <string name="Less Gravity"> + Più alto + </string> + <string name="Less Love"> + Meno maniglie + </string> + <string name="Less Muscles"> + Meno muscoli + </string> + <string name="Less Muscular"> + Meno muscolari + </string> + <string name="Less Rosy"> + Meno rosato + </string> + <string name="Less Round"> + Meno rotondo + </string> + <string name="Less Saddle"> + Meno a sella + </string> + <string name="Less Square"> + Meno quadrato + </string> + <string name="Less Volume"> + Meno volume + </string> + <string name="Less soul"> + Meno + </string> + <string name="Lighter"> + Più leggero + </string> + <string name="Lip Cleft"> + Distanza fossetta labbro + </string> + <string name="Lip Cleft Depth"> + Prof. fossetta labbro + </string> + <string name="Lip Fullness"> + Volume labbra + </string> + <string name="Lip Pinkness"> + Tonalità rosa labbra + </string> + <string name="Lip Ratio"> + Proporzione labbra + </string> + <string name="Lip Thickness"> + Carnosità labbra + </string> + <string name="Lip Width"> + Larghezza labbra + </string> + <string name="Lipgloss"> + Lipgloss + </string> + <string name="Lipstick"> + Rossetto + </string> + <string name="Lipstick Color"> + Colore rossetto + </string> + <string name="Long"> + Lungo + </string> + <string name="Long Head"> + Testa lunga + </string> + <string name="Long Hips"> + Bacino alto + </string> + <string name="Long Legs"> + Gambe lunghe + </string> + <string name="Long Neck"> + Collo lungo + </string> + <string name="Long Pigtails"> + Codini lunghi + </string> + <string name="Long Ponytail"> + Codino lungo + </string> + <string name="Long Torso"> + Torace lungo + </string> + <string name="Long arms"> + Braccia lunghe + </string> + <string name="Loose Pants"> + Pantaloni ampi + </string> + <string name="Loose Shirt"> + Camicia ampia + </string> + <string name="Loose Sleeves"> + Maniche non attillate + </string> + <string name="Love Handles"> + Maniglie dell'amore + </string> + <string name="Low"> + Basso + </string> + <string name="Low Heels"> + Tacchi bassi + </string> + <string name="Low Jaw"> + Mandibola bassa + </string> + <string name="Low Platforms"> + Bassa + </string> + <string name="Low and Loose"> + Basso e ampio + </string> + <string name="Lower"> + Più basso + </string> + <string name="Lower Bridge"> + Parte bassa del setto + </string> + <string name="Lower Cheeks"> + Guance inferiori + </string> + <string name="Male"> + Maschio + </string> + <string name="Middle Part"> + Riga nel mezzo + </string> + <string name="More"> + Altro + </string> + <string name="More Blush"> + Più fard + </string> + <string name="More Body Fat"> + Più grasso corporeo + </string> + <string name="More Curtains"> + Più + </string> + <string name="More Eyeshadow"> + Più ombretto + </string> + <string name="More Freckles"> + Più lentiggini + </string> + <string name="More Full"> + Più piene + </string> + <string name="More Gravity"> + Più calato + </string> + <string name="More Lipstick"> + Più rossetto + </string> + <string name="More Love"> + Più maniglie + </string> + <string name="More Lower Lip"> + Labbro inf. pronunciato + </string> + <string name="More Muscles"> + Più muscoli + </string> + <string name="More Muscular"> + Più muscolatura + </string> + <string name="More Rosy"> + Più rosato + </string> + <string name="More Round"> + Più rotondo + </string> + <string name="More Saddle"> + Più a sella + </string> + <string name="More Sloped"> + Più orizzontale + </string> + <string name="More Square"> + Più quadrato + </string> + <string name="More Upper Lip"> + Labbro sup. pronunciato + </string> + <string name="More Vertical"> + Più verticale + </string> + <string name="More Volume"> + Più volume + </string> + <string name="More soul"> + Più + </string> + <string name="Moustache"> + Baffi + </string> + <string name="Mouth Corner"> + Angolo della bocca + </string> + <string name="Mouth Position"> + Posizione della bocca + </string> + <string name="Mowhawk"> + Moicana + </string> + <string name="Muscular"> + Muscolatura + </string> + <string name="Mutton Chops"> + Basette lunghe + </string> + <string name="Nail Polish"> + Smalto + </string> + <string name="Nail Polish Color"> + Colore smalto + </string> + <string name="Narrow"> + Socchiusi + </string> + <string name="Narrow Back"> + Laterali post. vicini + </string> + <string name="Narrow Front"> + Laterali ant. vicini + </string> + <string name="Narrow Lips"> + Labbra strette + </string> + <string name="Natural"> + Naturale + </string> + <string name="Neck Length"> + Lunghezza del collo + </string> + <string name="Neck Thickness"> + Grandezza del collo + </string> + <string name="No Blush"> + Senza fard + </string> + <string name="No Eyeliner"> + Senza eyeliner + </string> + <string name="No Eyeshadow"> + Senza ombretto + </string> + <string name="No Lipgloss"> + Senza lipgloss + </string> + <string name="No Lipstick"> + Senza rossetto + </string> + <string name="No Part"> + Senza riga + </string> + <string name="No Polish"> + Senza smalto + </string> + <string name="No Red"> + Senza rosso + </string> + <string name="No Spikes"> + Senza punte + </string> + <string name="No White"> + Senza bianco + </string> + <string name="No Wrinkles"> + Senza pieghe + </string> + <string name="Normal Lower"> + Inferiore normale + </string> + <string name="Normal Upper"> + Superiore normale + </string> + <string name="Nose Left"> + Naso a sinistra + </string> + <string name="Nose Right"> + Naso a destra + </string> + <string name="Nose Size"> + Grandezza naso + </string> + <string name="Nose Thickness"> + Spessore naso + </string> + <string name="Nose Tip Angle"> + Angolo punta naso + </string> + <string name="Nose Tip Shape"> + Forma punta naso + </string> + <string name="Nose Width"> + Larghezza naso + </string> + <string name="Nostril Division"> + Divisione narici + </string> + <string name="Nostril Width"> + Larghezza narici + </string> + <string name="Opaque"> + Opaco + </string> + <string name="Open"> + Apri + </string> + <string name="Open Back"> + Retro aperto + </string> + <string name="Open Front"> + Davanti aperto + </string> + <string name="Open Left"> + Lato sin. aperto + </string> + <string name="Open Right"> + Lato des. aperto + </string> + <string name="Orange"> + Arancio + </string> + <string name="Out"> + Fuori + </string> + <string name="Out Shdw Color"> + Colore ombretto esterno + </string> + <string name="Out Shdw Opacity"> + Opacità ombretto esterno + </string> + <string name="Outer Eye Corner"> + Angolo esterno occhio + </string> + <string name="Outer Eye Shadow"> + Ombretto esterno + </string> + <string name="Outer Shadow"> + Ombreggiatura esterna + </string> + <string name="Overbite"> + Denti sup. in fuori + </string> + <string name="Package"> + Genitali + </string> + <string name="Painted Nails"> + Unghie smaltate + </string> + <string name="Pale"> + Pallido + </string> + <string name="Pants Crotch"> + Cavallo + </string> + <string name="Pants Fit"> + Vestibilità pantaloni + </string> + <string name="Pants Length"> + Lunghezza pantaloni + </string> + <string name="Pants Waist"> + Taglia pantalone + </string> + <string name="Pants Wrinkles"> + Pantaloni con le grinze + </string> + <string name="Part"> + Con riga + </string> + <string name="Part Bangs"> + Frangetta divisa + </string> + <string name="Pectorals"> + Pettorali + </string> + <string name="Pigment"> + Pigmento + </string> + <string name="Pigtails"> + Codini + </string> + <string name="Pink"> + Rosa + </string> + <string name="Pinker"> + Più rosato + </string> + <string name="Platform Height"> + Altezza pianta + </string> + <string name="Platform Width"> + Larghezza pianta + </string> + <string name="Pointy"> + Appuntito + </string> + <string name="Pointy Heels"> + Tacchi a spillo + </string> + <string name="Ponytail"> + Codino + </string> + <string name="Poofy Skirt"> + Gonna gonfia + </string> + <string name="Pop Left Eye"> + Sinistro più aperto + </string> + <string name="Pop Right Eye"> + Destro più aperto + </string> + <string name="Puffy"> + Paffute + </string> + <string name="Puffy Eyelids"> + Palpebre gonfie + </string> + <string name="Rainbow Color"> + Tonalità + </string> + <string name="Red Hair"> + Presenza di rosso nei capelli + </string> + <string name="Regular"> + Normale + </string> + <string name="Right Part"> + Riga a destra + </string> + <string name="Rosy Complexion"> + Incarnato + </string> + <string name="Round"> + Rotondo + </string> + <string name="Ruddiness"> + Rossore + </string> + <string name="Ruddy"> + Rosse + </string> + <string name="Rumpled Hair"> + Capelli mossi + </string> + <string name="Saddle Bags"> + Rotondità fianchi + </string> + <string name="Scrawny Leg"> + Gambe magre + </string> + <string name="Separate"> + Separati + </string> + <string name="Shallow"> + Meno pronunciato + </string> + <string name="Shear Back"> + Taglio posteriore + </string> + <string name="Shear Face"> + Taglio del viso + </string> + <string name="Shear Front"> + Taglio anteriore + </string> + <string name="Shear Left Up"> + Distorto a sinistra + </string> + <string name="Shear Right Up"> + Distorto a destra + </string> + <string name="Sheared Back"> + Taglio verso dietro + </string> + <string name="Sheared Front"> + Taglio verso davanti + </string> + <string name="Shift Left"> + A sinistra + </string> + <string name="Shift Mouth"> + Spostamento bocca + </string> + <string name="Shift Right"> + A destra + </string> + <string name="Shirt Bottom"> + Parte inferiore camicia + </string> + <string name="Shirt Fit"> + Vestibilità camicia + </string> + <string name="Shirt Wrinkles"> + Camicia con le grinze + </string> + <string name="Shoe Height"> + Altezza scarpe + </string> + <string name="Short"> + Basso + </string> + <string name="Short Arms"> + Braccia corte + </string> + <string name="Short Legs"> + Gambe corte + </string> + <string name="Short Neck"> + Collo corto + </string> + <string name="Short Pigtails"> + Codini corti + </string> + <string name="Short Ponytail"> + Codino corto + </string> + <string name="Short Sideburns"> + Basette corte + </string> + <string name="Short Torso"> + Torace corto + </string> + <string name="Short hips"> + Bacino corto + </string> + <string name="Shoulders"> + Spalle + </string> + <string name="Side Fringe"> + Ciuffi laterali + </string> + <string name="Sideburns"> + Basette + </string> + <string name="Sides Hair"> + Capigliatura di lato + </string> + <string name="Sides Hair Down"> + Capigliatura di lato sciolta + </string> + <string name="Sides Hair Up"> + Capigliatura di lato raccolta + </string> + <string name="Skinny Neck"> + Collo fino + </string> + <string name="Skirt Fit"> + Vestibilità gonna + </string> + <string name="Skirt Length"> + Lunghezza gonna + </string> + <string name="Slanted Forehead"> + Fronte inclinata + </string> + <string name="Sleeve Length"> + Lunghezza maniche + </string> + <string name="Sleeve Looseness"> + Morbidezza maniche + </string> + <string name="Slit Back"> + Spacco: Indietro + </string> + <string name="Slit Front"> + Spacco: anteriore + </string> + <string name="Slit Left"> + Spacco: Sinistra + </string> + <string name="Slit Right"> + Spacco: Destra + </string> + <string name="Small"> + Piccola + </string> + <string name="Small Hands"> + Mani piccole + </string> + <string name="Small Head"> + Testa piccola + </string> + <string name="Smooth"> + Liscio + </string> + <string name="Smooth Hair"> + Capelli lisci + </string> + <string name="Socks Length"> + Lunghezza calze + </string> + <string name="Soulpatch"> + Pizzetto labbro inferiore + </string> + <string name="Sparse"> + Piu rade + </string> + <string name="Spiked Hair"> + Capelli a punta + </string> + <string name="Square"> + Quadrato + </string> + <string name="Square Toe"> + Punta quadrata + </string> + <string name="Squash Head"> + Testa schiacciata + </string> + <string name="Stretch Head"> + Testa allungata + </string> + <string name="Sunken"> + Scarne + </string> + <string name="Sunken Chest"> + Senza pettorali + </string> + <string name="Sunken Eyes"> + Occhi infossati + </string> + <string name="Sweep Back"> + Indietro + </string> + <string name="Sweep Forward"> + Avanti + </string> + <string name="Tall"> + Alto + </string> + <string name="Taper Back"> + Ravv. lat. posteriore + </string> + <string name="Taper Front"> + Ravv. lat. frontale + </string> + <string name="Thick Heels"> + Tacchi spessi + </string> + <string name="Thick Neck"> + Collo grosso + </string> + <string name="Thick Toe"> + Punta spessa + </string> + <string name="Thin"> + Sottili + </string> + <string name="Thin Eyebrows"> + Sopracciglia sottili + </string> + <string name="Thin Lips"> + Labbra sottili + </string> + <string name="Thin Nose"> + Naso sottile + </string> + <string name="Tight Chin"> + Mento stretto + </string> + <string name="Tight Cuffs"> + Fondo stretto + </string> + <string name="Tight Pants"> + Pantaloni attillati + </string> + <string name="Tight Shirt"> + Camicia attillata + </string> + <string name="Tight Skirt"> + Gonna attillata + </string> + <string name="Tight Sleeves"> + Maniche strette + </string> + <string name="Toe Shape"> + Forma della punta + </string> + <string name="Toe Thickness"> + Spessore della punta + </string> + <string name="Torso Length"> + Lunghezza del torace + </string> + <string name="Torso Muscles"> + Muscoli del torace + </string> + <string name="Torso Scrawny"> + Torso Scrawny + </string> + <string name="Unattached"> + Distaccato + </string> + <string name="Uncreased"> + Senza piega + </string> + <string name="Underbite"> + Denti inf. in fuori + </string> + <string name="Unnatural"> + Innaturale + </string> + <string name="Upper Bridge"> + Parte alta del setto + </string> + <string name="Upper Cheeks"> + Parte alta degli zigomi + </string> + <string name="Upper Chin Cleft"> + Fossetta sup. del mento + </string> + <string name="Upper Eyelid Fold"> + Piega palpebra sup. + </string> + <string name="Upturned"> + All'insù + </string> + <string name="Very Red"> + Molto rossi + </string> + <string name="Waist Height"> + Vita alta + </string> + <string name="Well-Fed"> + Pienotte + </string> + <string name="White Hair"> + Capelli bianchi + </string> + <string name="Wide"> + Largo + </string> + <string name="Wide Back"> + Dietro largo + </string> + <string name="Wide Front"> + Davanti largo + </string> + <string name="Wide Lips"> + Labbra larghe + </string> + <string name="Wild"> + Colorati + </string> + <string name="Wrinkles"> + Grinze + </string> + <string name="LocationCtrlAddLandmarkTooltip"> + Aggiungi ai miei punti di riferimento + </string> + <string name="LocationCtrlEditLandmarkTooltip"> + Modifica i miei punti di riferimento + </string> + <string name="LocationCtrlInfoBtnTooltip"> + Maggiori informazioni sulla posizione attuale + </string> + <string name="LocationCtrlComboBtnTooltip"> + La cronologia delle mie posizioni + </string> + <string name="LocationCtrlAdultIconTooltip"> + Regione con categoria adulti + </string> + <string name="LocationCtrlModerateIconTooltip"> + Regione con categoria moderata + </string> + <string name="LocationCtrlGeneralIconTooltip"> + Regione generale + </string> + <string name="LocationCtrlSeeAVsTooltip"> + Gli avatar in questo lotto non possono essere visti o sentiti da avatar all'esterno del lotto + </string> + <string name="LocationCtrlPathfindingDirtyTooltip"> + Gli oggetti che si muovono potrebbero non comportarsi correttamente in questa regione fino a quando non viene eseguito il rebake della regione. + </string> + <string name="LocationCtrlPathfindingDisabledTooltip"> + Il pathfinding dinamico non è attivato in questa regione. + </string> + <string name="UpdaterWindowTitle"> + Aggiornamento [APP_NAME] + </string> + <string name="UpdaterNowUpdating"> + Aggiornamento di [APP_NAME]... + </string> + <string name="UpdaterNowInstalling"> + Installazione di [APP_NAME]... + </string> + <string name="UpdaterUpdatingDescriptive"> + Il Viewer del programma [APP_NAME] si sta aggiornando all'ultima versione. Potrebbe volerci del tempo, attendi. + </string> + <string name="UpdaterProgressBarTextWithEllipses"> + Download dell'aggiornamento... + </string> + <string name="UpdaterProgressBarText"> + Download dell'aggiornamento + </string> + <string name="UpdaterFailDownloadTitle"> + Download dell'aggiornamento non riuscito + </string> + <string name="UpdaterFailUpdateDescriptive"> + Il programma [APP_NAME] ha riscontrato un'errore durante il tentativo di aggiornamento. Consigliamo di scaricare l'ultima versione direttamente da www.secondlife.com. + </string> + <string name="UpdaterFailInstallTitle"> + Installazione dell'aggiornamento non riuscita + </string> + <string name="UpdaterFailStartTitle"> + Errore nell'avvio del viewer + </string> + <string name="ItemsComingInTooFastFrom"> + [APP_NAME]: Oggetti in arrivo troppo velocemente da [FROM_NAME], anteprima automatica disattivata per [TIME] secondi + </string> + <string name="ItemsComingInTooFast"> + [APP_NAME]: Oggetti in arrivo troppo velocemente, anteprima automatica disattivata per [TIME] secondi + </string> + <string name="IM_logging_string"> + -- Registrazione messaggi instantanei abilitata -- + </string> + <string name="IM_typing_start_string"> + [NAME] sta scrivendo... + </string> + <string name="Unnamed"> + (anonimo) + </string> + <string name="IM_moderated_chat_label"> + (Moderato: Voci disattivate di default) + </string> + <string name="IM_unavailable_text_label"> + La chat di testo non è disponibile per questa chiamata. + </string> + <string name="IM_muted_text_label"> + La chat di testo è stata disabilitata da un moderatore di gruppo. + </string> + <string name="IM_default_text_label"> + Clicca qui per inviare un messaggio instantaneo. + </string> + <string name="IM_to_label"> + A + </string> + <string name="IM_moderator_label"> + (Moderatore) + </string> + <string name="Saved_message"> + (Salvato [LONG_TIMESTAMP]) + </string> + <string name="IM_unblock_only_groups_friends"> + Per vedere questo messaggio, devi deselezionare 'Solo amici e gruppi possono chiamarmi o mandarmi IM' in Preferenze/Privacy. + </string> + <string name="OnlineStatus"> + Online + </string> + <string name="OfflineStatus"> + Offline + </string> + <string name="not_online_msg"> + Utente non online - il messaggio verrà memorizzato e inviato più tardi. + </string> + <string name="not_online_inventory"> + Utente non online - l'inventario è stato salvato + </string> + <string name="answered_call"> + Risposto alla chiamata + </string> + <string name="you_started_call"> + Hai iniziato una chiamata vocale + </string> + <string name="you_joined_call"> + Ti sei collegato alla chiamata in voce + </string> + <string name="you_auto_rejected_call-im"> + Hai rifiutato automaticamente la chiamata voce mentre era attivata la modalità 'Non disturbare'. + </string> + <string name="name_started_call"> + [NAME] ha iniziato una chiamata vocale + </string> + <string name="ringing-im"> + Collegamento alla chiamata vocale... + </string> + <string name="connected-im"> + Collegato, clicca Chiudi chiamata per agganciare + </string> + <string name="hang_up-im"> + Chiusa la chiamata + </string> + <string name="conference-title"> + Chat con più persone + </string> + <string name="conference-title-incoming"> + Chiamata in conferenza con [AGENT_NAME] + </string> + <string name="inventory_item_offered-im"> + Offerto oggetto di inventario "[ITEM_NAME]" + </string> + <string name="inventory_folder_offered-im"> + Offerta cartella di inventario "[ITEM_NAME]" + </string> + <string name="bot_warning"> + Stai parlando con un bot, [NAME]. Non condividere informazioni personali. +Scopri di più su https://second.life/scripted-agents. + </string> + <string name="facebook_post_success"> + Hai pubblicato su Facebook. + </string> + <string name="flickr_post_success"> + Hai pubblicato su Flickr. + </string> + <string name="twitter_post_success"> + Hai pubblicato su Twitter. + </string> + <string name="no_session_message"> + (La sessione IM non esiste) + </string> + <string name="only_user_message"> + Sei l'unico utente di questa sessione. + </string> + <string name="offline_message"> + [NAME] è offline + </string> + <string name="invite_message"> + Clicca il tasto [BUTTON NAME] per accettare/connetterti a questa voice chat. + </string> + <string name="muted_message"> + Hai bloccato questo residente. Quando gli invii un messaggio, verrà automaticamente sbloccato. + </string> + <string name="generic"> + Errore nella richiesta, riprova più tardi. + </string> + <string name="generic_request_error"> + Errore durante la richiesta, riprova più tardi. + </string> + <string name="insufficient_perms_error"> + Non hai sufficienti permessi. + </string> + <string name="session_does_not_exist_error"> + Questa sessione non esiste più + </string> + <string name="no_ability_error"> + Non hai questa abilitazione. + </string> + <string name="no_ability"> + Non hai questa abilitazione. + </string> + <string name="not_a_mod_error"> + Non sei un moderatore. + </string> + <string name="muted"> + Il moderatore del gruppo ha disattivato la tua chat di testo. + </string> + <string name="muted_error"> + Un moderatore di gruppo ti ha disabilitato dalla chat di testo. + </string> + <string name="add_session_event"> + Impossibile aggiungere utenti alla chat con [RECIPIENT]. + </string> + <string name="message"> + Impossibile spedire il tuo messaggio nella sessione chat con [RECIPIENT]. + </string> + <string name="message_session_event"> + Impossibile inviare il messaggio nella chat con [RECIPIENT]. + </string> + <string name="mute"> + Errore durante la moderazione. + </string> + <string name="removed"> + Sei stato rimosso dal gruppo. + </string> + <string name="removed_from_group"> + Sei stato espulso dal gruppo. + </string> + <string name="close_on_no_ability"> + Non hai più le abilitazioni per rimanere nella sessione chat. + </string> + <string name="unread_chat_single"> + [SOURCES] ha detto qualcosa di nuovo + </string> + <string name="unread_chat_multiple"> + [SOURCES] ha detto qualcosa di nuovo + </string> + <string name="session_initialization_timed_out_error"> + Sessione di inizializzazione scaduta + </string> + <string name="Home position set."> + Posizione di base impostata. + </string> + <string name="voice_morphing_url"> + https://secondlife.com/destination/voice-island + </string> + <string name="premium_voice_morphing_url"> + https://secondlife.com/destination/voice-morphing-premium + </string> + <string name="paid_you_ldollars"> + [NAME] ti ha inviato un pagamento di L$[AMOUNT] [REASON]. + </string> + <string name="paid_you_ldollars_gift"> + [NAME] ti ha inviato un pagamento di L$ [AMOUNT]: [REASON] + </string> + <string name="paid_you_ldollars_no_reason"> + [NAME] ti ha inviato un pagamento di L$[AMOUNT]. + </string> + <string name="you_paid_ldollars"> + Hai inviato un pagamento di L$[AMOUNT] a [NAME] [REASON]. + </string> + <string name="you_paid_ldollars_gift"> + Hai inviato un pagamento di L$ [AMOUNT] a [NAME]: [REASON] + </string> + <string name="you_paid_ldollars_no_info"> + Hai pagato L$ [AMOUNT]. + </string> + <string name="you_paid_ldollars_no_reason"> + Hai inviato un pagamento di L$[AMOUNT] a [NAME]. + </string> + <string name="you_paid_ldollars_no_name"> + Hai pagato L$ [AMOUNT] [REASON]. + </string> + <string name="you_paid_failure_ldollars"> + Non hai pagato [NAME] L$[AMOUNT] [REASON]. + </string> + <string name="you_paid_failure_ldollars_gift"> + Non hai inviato un pagamento di L$ [AMOUNT] a [NAME]: [REASON] + </string> + <string name="you_paid_failure_ldollars_no_info"> + Non hai pagato L$ [AMOUNT]. + </string> + <string name="you_paid_failure_ldollars_no_reason"> + Non hai pagato [NAME] L$[AMOUNT]. + </string> + <string name="you_paid_failure_ldollars_no_name"> + Non hai pagato L$ [AMOUNT] [REASON]. + </string> + <string name="for item"> + per [ITEM] + </string> + <string name="for a parcel of land"> + per un lotto di terreno + </string> + <string name="for a land access pass"> + per un permesso di accesso al terreno + </string> + <string name="for deeding land"> + per la cessione di terreno + </string> + <string name="to create a group"> + per creare un gruppo + </string> + <string name="to join a group"> + per aderire a un gruppo + </string> + <string name="to upload"> + per caricare + </string> + <string name="to publish a classified ad"> + per pubblicare un annuncio + </string> + <string name="giving"> + Contributo di L$ [AMOUNT] + </string> + <string name="uploading_costs"> + Il costo per il caricamento è di L$ [AMOUNT] + </string> + <string name="this_costs"> + Il costo è L$ [AMOUNT] + </string> + <string name="buying_selected_land"> + L'acquisto del terreno prescelto costa L$ [AMOUNT] + </string> + <string name="this_object_costs"> + Il costo dell'oggetto è L$ [AMOUNT] + </string> + <string name="group_role_everyone"> + Tutti + </string> + <string name="group_role_officers"> + Funzionari + </string> + <string name="group_role_owners"> + Proprietari + </string> + <string name="group_member_status_online"> + Online + </string> + <string name="uploading_abuse_report"> + Caricamento in corso... -Segnala abuso</string> - <string name="New Shape">Nuova figura corporea</string> - <string name="New Skin">Nuova pelle</string> - <string name="New Hair">Nuovi capelli</string> - <string name="New Eyes">Nuovi occhi</string> - <string name="New Shirt">Nuova camicia</string> - <string name="New Pants">Nuovi pantaloni</string> - <string name="New Shoes">Nuove scarpe</string> - <string name="New Socks">Nuove calze</string> - <string name="New Jacket">Nuova giacca</string> - <string name="New Gloves">Nuovi guanti</string> - <string name="New Undershirt">Nuova maglietta intima</string> - <string name="New Underpants">Nuovi slip</string> - <string name="New Skirt">Nuova gonna</string> - <string name="New Alpha">Nuovo Alpha (trasparenza)</string> - <string name="New Tattoo">Nuovo tatuaggio</string> - <string name="New Universal">Nuovo Universale</string> - <string name="New Physics">Nuova fisica</string> - <string name="Invalid Wearable">Capo da indossare non valido</string> - <string name="New Gesture">Nuova gesture</string> - <string name="New Script">Nuovo script</string> - <string name="New Note">Nuovo appunto</string> - <string name="New Folder">Nuova cartella</string> - <string name="Contents">Contenuto</string> - <string name="Gesture">Gesture</string> - <string name="Male Gestures">Gesture maschili</string> - <string name="Female Gestures">Gesture femminili</string> - <string name="Other Gestures">Altre gesture</string> - <string name="Speech Gestures">Gesture del parlato</string> - <string name="Common Gestures">Gesture comuni</string> - <string name="Male - Excuse me">Maschio - Chiedere scusa</string> - <string name="Male - Get lost">Maschio - Levati dai piedi!</string> - <string name="Male - Blow kiss">Maschio - Butta un bacio</string> - <string name="Male - Boo">Maschio - Bu</string> - <string name="Male - Bored">Maschio - Annoiato</string> - <string name="Male - Hey">Maschio - Ehi</string> - <string name="Male - Laugh">Maschio - Ridere</string> - <string name="Male - Repulsed">Maschio - Disgustato</string> - <string name="Male - Shrug">Maschio - Spallucce</string> - <string name="Male - Stick tougue out">Maschio - Tira fuori la lingua</string> - <string name="Male - Wow">Maschio - Accipicchia</string> - <string name="Female - Chuckle">Femmina - Risatina</string> - <string name="Female - Cry">Femmina - Pianto</string> - <string name="Female - Embarrassed">Femmina - Imbarazzata</string> - <string name="Female - Excuse me">Femmina - Chiedere scusa</string> - <string name="Female - Get lost">Femmina - Levati dai piedi!</string> - <string name="Female - Blow kiss">Femmina - Butta un bacio</string> - <string name="Female - Boo">Femmina - Bu</string> - <string name="Female - Bored">Femmina - Annoiata</string> - <string name="Female - Hey">Femmina - Ehi</string> - <string name="Female - Hey baby">Femmina - Ehi tu</string> - <string name="Female - Laugh">Femmina - Ridere</string> - <string name="Female - Looking good">Femmina - Sei in forma</string> - <string name="Female - Over here">Femmina - Per di qua</string> - <string name="Female - Please">Femmina - Per cortesia</string> - <string name="Female - Repulsed">Femmina - Disgustata</string> - <string name="Female - Shrug">Femmina - Spallucce</string> - <string name="Female - Stick tougue out">Femmina - Tira fuori la lingua</string> - <string name="Female - Wow">Femmina - Accipicchia</string> - <string name="New Daycycle">Nuovo ciclo giornata</string> - <string name="New Water">Nuova acqua</string> - <string name="New Sky">Nuovo cielo</string> - <string name="/bow">/inchino</string> - <string name="/clap">/applausi</string> - <string name="/count">/numero</string> - <string name="/extinguish">/estingui</string> - <string name="/kmb">/chissene</string> - <string name="/muscle">/muscolo</string> - <string name="/no">/no</string> - <string name="/no!">/no!</string> - <string name="/paper">/carta</string> - <string name="/pointme">/indicome</string> - <string name="/pointyou">/indicotu</string> - <string name="/rock">/sasso</string> - <string name="/scissor">/forbici</string> - <string name="/smoke">/fumo</string> - <string name="/stretch">/stiracchiata</string> - <string name="/whistle">/fischietto</string> - <string name="/yes">/si</string> - <string name="/yes!">/si!</string> - <string name="afk">non alla tastiera</string> - <string name="dance1">danza1</string> - <string name="dance2">danza2</string> - <string name="dance3">danza3</string> - <string name="dance4">danza4</string> - <string name="dance5">danza5</string> - <string name="dance6">danza6</string> - <string name="dance7">danza7</string> - <string name="dance8">danza8</string> - <string name="AvatarBirthDateFormat">[day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]</string> - <string name="DefaultMimeType">nessuna/nessuna</string> - <string name="texture_load_dimensions_error">Impossibile caricare immagini di dimensioni superiori a [WIDTH]*[HEIGHT]</string> - <string name="outfit_photo_load_dimensions_error">Le dimensioni massime delle foto di vestiario sono [WIDTH]*[HEIGHT]. Ridimensiona l'immagine o usane un'altra</string> - <string name="outfit_photo_select_dimensions_error">Le dimensioni massime delle foto di vestiario sono [WIDTH]*[HEIGHT]. Seleziona un'altra texture</string> - <string name="outfit_photo_verify_dimensions_error">Impossibile verificare le dimensioni della foto. Attendi che le dimensioni siano visualizzate nel selettore.</string> +Segnala abuso + </string> + <string name="New Shape"> + Nuova figura corporea + </string> + <string name="New Skin"> + Nuova pelle + </string> + <string name="New Hair"> + Nuovi capelli + </string> + <string name="New Eyes"> + Nuovi occhi + </string> + <string name="New Shirt"> + Nuova camicia + </string> + <string name="New Pants"> + Nuovi pantaloni + </string> + <string name="New Shoes"> + Nuove scarpe + </string> + <string name="New Socks"> + Nuove calze + </string> + <string name="New Jacket"> + Nuova giacca + </string> + <string name="New Gloves"> + Nuovi guanti + </string> + <string name="New Undershirt"> + Nuova maglietta intima + </string> + <string name="New Underpants"> + Nuovi slip + </string> + <string name="New Skirt"> + Nuova gonna + </string> + <string name="New Alpha"> + Nuovo Alpha (trasparenza) + </string> + <string name="New Tattoo"> + Nuovo tatuaggio + </string> + <string name="New Universal"> + Nuovo Universale + </string> + <string name="New Physics"> + Nuova fisica + </string> + <string name="Invalid Wearable"> + Capo da indossare non valido + </string> + <string name="New Gesture"> + Nuova gesture + </string> + <string name="New Script"> + Nuovo script + </string> + <string name="New Note"> + Nuovo appunto + </string> + <string name="New Folder"> + Nuova cartella + </string> + <string name="Contents"> + Contenuto + </string> + <string name="Gesture"> + Gesture + </string> + <string name="Male Gestures"> + Gesture maschili + </string> + <string name="Female Gestures"> + Gesture femminili + </string> + <string name="Other Gestures"> + Altre gesture + </string> + <string name="Speech Gestures"> + Gesture del parlato + </string> + <string name="Common Gestures"> + Gesture comuni + </string> + <string name="Male - Excuse me"> + Maschio - Chiedere scusa + </string> + <string name="Male - Get lost"> + Maschio - Levati dai piedi! + </string> + <string name="Male - Blow kiss"> + Maschio - Butta un bacio + </string> + <string name="Male - Boo"> + Maschio - Bu + </string> + <string name="Male - Bored"> + Maschio - Annoiato + </string> + <string name="Male - Hey"> + Maschio - Ehi + </string> + <string name="Male - Laugh"> + Maschio - Ridere + </string> + <string name="Male - Repulsed"> + Maschio - Disgustato + </string> + <string name="Male - Shrug"> + Maschio - Spallucce + </string> + <string name="Male - Stick tougue out"> + Maschio - Tira fuori la lingua + </string> + <string name="Male - Wow"> + Maschio - Accipicchia + </string> + <string name="Female - Chuckle"> + Femmina - Risatina + </string> + <string name="Female - Cry"> + Femmina - Pianto + </string> + <string name="Female - Embarrassed"> + Femmina - Imbarazzata + </string> + <string name="Female - Excuse me"> + Femmina - Chiedere scusa + </string> + <string name="Female - Get lost"> + Femmina - Levati dai piedi! + </string> + <string name="Female - Blow kiss"> + Femmina - Butta un bacio + </string> + <string name="Female - Boo"> + Femmina - Bu + </string> + <string name="Female - Bored"> + Femmina - Annoiata + </string> + <string name="Female - Hey"> + Femmina - Ehi + </string> + <string name="Female - Hey baby"> + Femmina - Ehi tu + </string> + <string name="Female - Laugh"> + Femmina - Ridere + </string> + <string name="Female - Looking good"> + Femmina - Sei in forma + </string> + <string name="Female - Over here"> + Femmina - Per di qua + </string> + <string name="Female - Please"> + Femmina - Per cortesia + </string> + <string name="Female - Repulsed"> + Femmina - Disgustata + </string> + <string name="Female - Shrug"> + Femmina - Spallucce + </string> + <string name="Female - Stick tougue out"> + Femmina - Tira fuori la lingua + </string> + <string name="Female - Wow"> + Femmina - Accipicchia + </string> + <string name="New Daycycle"> + Nuovo ciclo giornata + </string> + <string name="New Water"> + Nuova acqua + </string> + <string name="New Sky"> + Nuovo cielo + </string> + <string name="/bow"> + /inchino + </string> + <string name="/clap"> + /applausi + </string> + <string name="/count"> + /numero + </string> + <string name="/extinguish"> + /estingui + </string> + <string name="/kmb"> + /chissene + </string> + <string name="/muscle"> + /muscolo + </string> + <string name="/no"> + /no + </string> + <string name="/no!"> + /no! + </string> + <string name="/paper"> + /carta + </string> + <string name="/pointme"> + /indicome + </string> + <string name="/pointyou"> + /indicotu + </string> + <string name="/rock"> + /sasso + </string> + <string name="/scissor"> + /forbici + </string> + <string name="/smoke"> + /fumo + </string> + <string name="/stretch"> + /stiracchiata + </string> + <string name="/whistle"> + /fischietto + </string> + <string name="/yes"> + /si + </string> + <string name="/yes!"> + /si! + </string> + <string name="afk"> + non alla tastiera + </string> + <string name="dance1"> + danza1 + </string> + <string name="dance2"> + danza2 + </string> + <string name="dance3"> + danza3 + </string> + <string name="dance4"> + danza4 + </string> + <string name="dance5"> + danza5 + </string> + <string name="dance6"> + danza6 + </string> + <string name="dance7"> + danza7 + </string> + <string name="dance8"> + danza8 + </string> + <string name="AvatarBirthDateFormat"> + [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt] + </string> + <string name="DefaultMimeType"> + nessuna/nessuna + </string> + <string name="texture_load_dimensions_error"> + Impossibile caricare immagini di dimensioni superiori a [WIDTH]*[HEIGHT] + </string> + <string name="outfit_photo_load_dimensions_error"> + Le dimensioni massime delle foto di vestiario sono [WIDTH]*[HEIGHT]. Ridimensiona l'immagine o usane un'altra + </string> + <string name="outfit_photo_select_dimensions_error"> + Le dimensioni massime delle foto di vestiario sono [WIDTH]*[HEIGHT]. Seleziona un'altra texture + </string> + <string name="outfit_photo_verify_dimensions_error"> + Impossibile verificare le dimensioni della foto. Attendi che le dimensioni siano visualizzate nel selettore. + </string> <string name="words_separator" value=","/> - <string name="server_is_down">Nonostante i nostri tentativi, si è verificato un errore imprevisto. + <string name="server_is_down"> + Nonostante i nostri tentativi, si è verificato un errore imprevisto. Consulta la pagina http://status.secondlifegrid.net per determinare se il problema del servizio è già stato riscontrato. - Se il problema continua, ti consigliamo di controllare le tue impostazioni di rete e del firewall.</string> - <string name="dateTimeWeekdaysNames">lunedì:martedì:mercoledì:giovedì:venerdì:sabato:domenica</string> - <string name="dateTimeWeekdaysShortNames">lun:mar:mer:gio:ven:sab:dom</string> - <string name="dateTimeMonthNames">gennaio:febbraio:marzo:aprile:maggio:giugno:luglio:agosto:settembre:ottobre:novembre:dicembre</string> - <string name="dateTimeMonthShortNames">gen:feb:mar:apr:mag:giu:lug:ago:sett:ott:nov:dic</string> - <string name="dateTimeDayFormat">[MDAY]</string> - <string name="dateTimeAM">antemeridiane</string> - <string name="dateTimePM">pomeridiane</string> - <string name="LocalEstimateUSD">US$ [AMOUNT]</string> - <string name="Group Ban">Espulsione di gruppo</string> - <string name="Membership">Abbonamento</string> - <string name="Roles">Ruoli</string> - <string name="Group Identity">Identità gruppo</string> - <string name="Parcel Management">Gestione lotto</string> - <string name="Parcel Identity">Identità lotto</string> - <string name="Parcel Settings">Impostazioni lotto</string> - <string name="Parcel Powers">Poteri lotto</string> - <string name="Parcel Access">Accesso al lotto</string> - <string name="Parcel Content">Contenuto lotto</string> - <string name="Object Management">Gestione oggetti</string> - <string name="Accounting">Contabilità </string> - <string name="Notices">Avvisi</string> - <string name="Chat" value="Chat :">Chat</string> - <string name="BaseMembership">Base</string> - <string name="PremiumMembership">Premium</string> - <string name="Premium_PlusMembership">Premium Plus</string> - <string name="DeleteItems">Cancellare gli elementi selezionati?</string> - <string name="DeleteItem">Cancellare l’elemento selezionato?</string> - <string name="EmptyOutfitText">Questo vestiario non contiene alcun elemento</string> - <string name="ExternalEditorNotSet">Seleziona un editor usando le impostazioni ExternalEditor.</string> - <string name="ExternalEditorNotFound">L'editor esterno specificato non è stato trovato. + Se il problema continua, ti consigliamo di controllare le tue impostazioni di rete e del firewall. + </string> + <string name="dateTimeWeekdaysNames"> + lunedì:martedì:mercoledì:giovedì:venerdì:sabato:domenica + </string> + <string name="dateTimeWeekdaysShortNames"> + lun:mar:mer:gio:ven:sab:dom + </string> + <string name="dateTimeMonthNames"> + gennaio:febbraio:marzo:aprile:maggio:giugno:luglio:agosto:settembre:ottobre:novembre:dicembre + </string> + <string name="dateTimeMonthShortNames"> + gen:feb:mar:apr:mag:giu:lug:ago:sett:ott:nov:dic + </string> + <string name="dateTimeDayFormat"> + [MDAY] + </string> + <string name="dateTimeAM"> + antemeridiane + </string> + <string name="dateTimePM"> + pomeridiane + </string> + <string name="LocalEstimateUSD"> + US$ [AMOUNT] + </string> + <string name="Group Ban"> + Espulsione di gruppo + </string> + <string name="Membership"> + Abbonamento + </string> + <string name="Roles"> + Ruoli + </string> + <string name="Group Identity"> + Identità gruppo + </string> + <string name="Parcel Management"> + Gestione lotto + </string> + <string name="Parcel Identity"> + Identità lotto + </string> + <string name="Parcel Settings"> + Impostazioni lotto + </string> + <string name="Parcel Powers"> + Poteri lotto + </string> + <string name="Parcel Access"> + Accesso al lotto + </string> + <string name="Parcel Content"> + Contenuto lotto + </string> + <string name="Object Management"> + Gestione oggetti + </string> + <string name="Accounting"> + Contabilità + </string> + <string name="Notices"> + Avvisi + </string> + <string name="Chat" value="Chat :"> + Chat + </string> + <string name="BaseMembership"> + Base + </string> + <string name="PremiumMembership"> + Premium + </string> + <string name="Premium_PlusMembership"> + Premium Plus + </string> + <string name="DeleteItems"> + Cancellare gli elementi selezionati? + </string> + <string name="DeleteItem"> + Cancellare l’elemento selezionato? + </string> + <string name="EmptyOutfitText"> + Questo vestiario non contiene alcun elemento + </string> + <string name="ExternalEditorNotSet"> + Seleziona un editor usando le impostazioni ExternalEditor. + </string> + <string name="ExternalEditorNotFound"> + L'editor esterno specificato non è stato trovato. Prova a racchiudere il percorso dell'editor in doppie virgolette. -(per es. "/percorso per il mio/editor" "%s")</string> - <string name="ExternalEditorCommandParseError">Errore nell'elaborazione del comando dell'editor esterno.</string> - <string name="ExternalEditorFailedToRun">L'editor esterno non è stato avviato.</string> - <string name="TranslationFailed">Traduzione non riuscita: [REASON]</string> - <string name="TranslationResponseParseError">Errore di elaborazione della risposta della traduzione.</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">Home</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">Aggiungi</string> - <string name="Subtract">Sottrai</string> - <string name="Multiply">Moltiplica</string> - <string name="Divide">Dividi</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">Visualizzazione marcatori particelle (blu)</string> - <string name="BeaconPhysical">Visualizzazione marcatori oggetti fisici (verde)</string> - <string name="BeaconScripted">Visualizzazione marcatori oggetti scriptati (rosso)</string> - <string name="BeaconScriptedTouch">Visualizzazione marcatori oggetti scriptati con funzione tocco (rosso)</string> - <string name="BeaconSound">Visualizzazione marcatori suoni (giallo)</string> - <string name="BeaconMedia">Visualizzazione marcatori multimedia (bianco)</string> - <string name="BeaconSun">Marcatore visualizza direzione sole (arancione)</string> - <string name="BeaconMoon">Marcatore visualizza direzione luna (viola)</string> - <string name="ParticleHiding">Particelle nascoste</string> - <string name="Command_AboutLand_Label">Informazioni sul terreno</string> - <string name="Command_Appearance_Label">Aspetto fisico</string> - <string name="Command_Avatar_Label">Avatar</string> - <string name="Command_Build_Label">Costruisci</string> - <string name="Command_Chat_Label">Chat</string> - <string name="Command_Conversations_Label">Conversazioni</string> - <string name="Command_Compass_Label">Bussola</string> - <string name="Command_Destinations_Label">Destinazioni</string> - <string name="Command_Environments_Label">I miei ambienti</string> - <string name="Command_Facebook_Label">Facebook</string> - <string name="Command_Flickr_Label">Flickr</string> - <string name="Command_Gestures_Label">Gesture</string> - <string name="Command_Grid_Status_Label">Stato della griglia</string> - <string name="Command_HowTo_Label">Istruzioni</string> - <string name="Command_Inventory_Label">Inventario</string> - <string name="Command_Map_Label">Mappa</string> - <string name="Command_Marketplace_Label">Mercato</string> - <string name="Command_MarketplaceListings_Label">Marketplace</string> - <string name="Command_MiniMap_Label">Mini mappa</string> - <string name="Command_Move_Label">Cammina / corri / vola</string> - <string name="Command_Outbox_Label">Casella in uscita del rivenditore</string> - <string name="Command_People_Label">Persone</string> - <string name="Command_Picks_Label">Preferiti</string> - <string name="Command_Places_Label">Luoghi</string> - <string name="Command_Preferences_Label">Preferenze</string> - <string name="Command_Profile_Label">Profilo</string> - <string name="Command_Report_Abuse_Label">Segnala abuso</string> - <string name="Command_Search_Label">Ricerca</string> - <string name="Command_Snapshot_Label">Istantanea</string> - <string name="Command_Speak_Label">Parla</string> - <string name="Command_Twitter_Label">Twitter</string> - <string name="Command_View_Label">Controlli fotocamera</string> - <string name="Command_Voice_Label">Impostazioni voce</string> - <string name="Command_AboutLand_Tooltip">Informazioni sul terreno che visiti</string> - <string name="Command_Appearance_Tooltip">Cambia l'avatar</string> - <string name="Command_Avatar_Tooltip">Seleziona un avatar completo</string> - <string name="Command_Build_Tooltip">Costruzione oggetti e modifica terreno</string> - <string name="Command_Chat_Tooltip">Chatta con persone vicine usando il testo</string> - <string name="Command_Conversations_Tooltip">Conversa con chiunque</string> - <string name="Command_Compass_Tooltip">Bussola</string> - <string name="Command_Destinations_Tooltip">Destinazioni interessanti</string> - <string name="Command_Environments_Tooltip">I miei ambienti</string> - <string name="Command_Facebook_Tooltip">Pubblica su Facebook</string> - <string name="Command_Flickr_Tooltip">Carica su Flickr</string> - <string name="Command_Gestures_Tooltip">Gesti per il tuo avatar</string> - <string name="Command_Grid_Status_Tooltip">Mostra stato griglia corrente</string> - <string name="Command_HowTo_Tooltip">Come eseguire le attività più comuni</string> - <string name="Command_Inventory_Tooltip">Visualizza e usa le tue cose</string> - <string name="Command_Map_Tooltip">Mappa del mondo</string> - <string name="Command_Marketplace_Tooltip">Vai allo shopping</string> - <string name="Command_MarketplaceListings_Tooltip">Vendi le tue creazioni</string> - <string name="Command_MiniMap_Tooltip">Mostra le persone vicine</string> - <string name="Command_Move_Tooltip">Movimento avatar</string> - <string name="Command_Outbox_Tooltip">Trasferisci elementi al tuo mercato per la vendita</string> - <string name="Command_People_Tooltip">Amici, gruppi e persone vicine</string> - <string name="Command_Picks_Tooltip">Luoghi da mostrare come preferiti nel profilo</string> - <string name="Command_Places_Tooltip">Luoghi salvati</string> - <string name="Command_Preferences_Tooltip">Preferenze</string> - <string name="Command_Profile_Tooltip">Modifica o visualizza il tuo profilo</string> - <string name="Command_Report_Abuse_Tooltip">Segnala abuso</string> - <string name="Command_Search_Tooltip">Trova luoghi, eventi, persone</string> - <string name="Command_Snapshot_Tooltip">Scatta una foto</string> - <string name="Command_Speak_Tooltip">Parla con persone vicine usando il microfono</string> - <string name="Command_Twitter_Tooltip">Twitter</string> - <string name="Command_View_Tooltip">Modifica angolo fotocamera</string> - <string name="Command_Voice_Tooltip">I controlli per il volume per le chiamate e per le persone nelle vicinanze nel mondo virtuale</string> - <string name="Toolbar_Bottom_Tooltip">attualmente nella barra degli strumenti in basso</string> - <string name="Toolbar_Left_Tooltip">attualmente nella barra degli strumenti a sinistra</string> - <string name="Toolbar_Right_Tooltip">attualmente nella barra degli strumenti a destra</string> - <string name="Retain%">Mantieni%</string> - <string name="Detail">Dettagli</string> - <string name="Better Detail">Migliori dettagli</string> - <string name="Surface">Superficie</string> - <string name="Solid">Solido</string> - <string name="Wrap">Involucro</string> - <string name="Preview">Anteprima</string> - <string name="Normal">Normale</string> - <string name="Pathfinding_Wiki_URL">http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer</string> - <string name="Pathfinding_Object_Attr_None">Nessuno</string> - <string name="Pathfinding_Object_Attr_Permanent">Influenza il navmesh</string> - <string name="Pathfinding_Object_Attr_Character">Personaggio</string> - <string name="Pathfinding_Object_Attr_MultiSelect">(Multiple)</string> - <string name="snapshot_quality_very_low">Molto basso</string> - <string name="snapshot_quality_low">Basso</string> - <string name="snapshot_quality_medium">Medio</string> - <string name="snapshot_quality_high">Alto</string> - <string name="snapshot_quality_very_high">Molto alto</string> - <string name="TeleportMaturityExceeded">Il Residente non può visitare questa regione.</string> - <string name="UserDictionary">[User]</string> - <string name="experience_tools_experience">Esperienza</string> - <string name="ExperienceNameNull">(nessuna esperienza)</string> - <string name="ExperienceNameUntitled">(esperienza senza titolo)</string> - <string name="Land-Scope">A livello di terreno</string> - <string name="Grid-Scope">A livello di griglia</string> - <string name="Allowed_Experiences_Tab">CONSENTITO</string> - <string name="Blocked_Experiences_Tab">BLOCCATO</string> - <string name="Contrib_Experiences_Tab">FORNITORE</string> - <string name="Admin_Experiences_Tab">AMMINISTRATORE</string> - <string name="Recent_Experiences_Tab">RECENTE</string> - <string name="Owned_Experiences_Tab">DI PROPRIETÀ</string> - <string name="ExperiencesCounter">([EXPERIENCES], massimo [MAXEXPERIENCES])</string> - <string name="ExperiencePermission1">gestione dei tuoi comandi</string> - <string name="ExperiencePermission3">attivazione di animazioni per il tuo avatar</string> - <string name="ExperiencePermission4">collegamento al tuo avatar</string> - <string name="ExperiencePermission9">monitoraggio della tua videocamera</string> - <string name="ExperiencePermission10">controllo della tua videocamera</string> - <string name="ExperiencePermission11">ti teletrasporta</string> - <string name="ExperiencePermission12">accettazione automatica delle autorizzazioni per le esperienze</string> - <string name="ExperiencePermission16">obbliga l'avatar a sedersi</string> - <string name="ExperiencePermission17">cambia le impostazioni dell’ambiente</string> - <string name="ExperiencePermissionShortUnknown">ha eseguito un'operazione sconosciuta: [Permission]</string> - <string name="ExperiencePermissionShort1">Gestione dei comandi</string> - <string name="ExperiencePermissionShort3">Attivazione di animazioni</string> - <string name="ExperiencePermissionShort4">Collegamento</string> - <string name="ExperiencePermissionShort9">Monitoraggio videocamera</string> - <string name="ExperiencePermissionShort10">Controllo videocamera</string> - <string name="ExperiencePermissionShort11">Teleport</string> - <string name="ExperiencePermissionShort12">Autorizzazione</string> - <string name="ExperiencePermissionShort16">Siediti</string> - <string name="ExperiencePermissionShort17">Ambiente</string> - <string name="logging_calls_disabled_log_empty">Le conversazioni non vengono registrate. Per iniziare a registrare, seleziona "Salva: Solo registro" oppure "Salva: Registri e trascrizioni" in Preferenze > Chat.</string> - <string name="logging_calls_disabled_log_not_empty">Non verranno registrate più le conversazioni. Per riprendere a registrare, seleziona "Salva: Solo registro" oppure "Salva: Registri e trascrizioni" in Preferenze > Chat.</string> - <string name="logging_calls_enabled_log_empty">Nessuna conversazione in registro. Dopo che hai contattato qualcuno o se qualcuno ti contatta, una voce del registro verrà mostrata qui.</string> - <string name="loading_chat_logs">Caricamento in corso...</string> - <string name="na">n/d</string> - <string name="preset_combo_label">-Lista vuota-</string> - <string name="Default">Predefinita</string> - <string name="none_paren_cap">(Nulla)</string> - <string name="no_limit">Senza limite</string> - <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">La forma della fisica contiene triangoli troppo piccoli. Prova a semplificare il modello della fisica.</string> - <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH">La forma della fisica contiene dati di conferma errati. Prova a correggere il modello della fisica.</string> - <string name="Mav_Details_MAV_UNKNOWN_VERSION">La versione della forma fisica non è corretta. Imposta la versione corretta per il modello della fisica.</string> - <string name="couldnt_resolve_host">Il DNS non ha potuto risolvere il nome dell’host([HOSTNAME]). +(per es. "/percorso per il mio/editor" "%s") + </string> + <string name="ExternalEditorCommandParseError"> + Errore nell'elaborazione del comando dell'editor esterno. + </string> + <string name="ExternalEditorFailedToRun"> + L'editor esterno non è stato avviato. + </string> + <string name="TranslationFailed"> + Traduzione non riuscita: [REASON] + </string> + <string name="TranslationResponseParseError"> + Errore di elaborazione della risposta della traduzione. + </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"> + Home + </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"> + Aggiungi + </string> + <string name="Subtract"> + Sottrai + </string> + <string name="Multiply"> + Moltiplica + </string> + <string name="Divide"> + Dividi + </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"> + Visualizzazione marcatori particelle (blu) + </string> + <string name="BeaconPhysical"> + Visualizzazione marcatori oggetti fisici (verde) + </string> + <string name="BeaconScripted"> + Visualizzazione marcatori oggetti scriptati (rosso) + </string> + <string name="BeaconScriptedTouch"> + Visualizzazione marcatori oggetti scriptati con funzione tocco (rosso) + </string> + <string name="BeaconSound"> + Visualizzazione marcatori suoni (giallo) + </string> + <string name="BeaconMedia"> + Visualizzazione marcatori multimedia (bianco) + </string> + <string name="BeaconSun"> + Marcatore visualizza direzione sole (arancione) + </string> + <string name="BeaconMoon"> + Marcatore visualizza direzione luna (viola) + </string> + <string name="ParticleHiding"> + Particelle nascoste + </string> + <string name="Command_AboutLand_Label"> + Informazioni sul terreno + </string> + <string name="Command_Appearance_Label"> + Aspetto fisico + </string> + <string name="Command_Avatar_Label"> + Avatar + </string> + <string name="Command_Build_Label"> + Costruisci + </string> + <string name="Command_Chat_Label"> + Chat + </string> + <string name="Command_Conversations_Label"> + Conversazioni + </string> + <string name="Command_Compass_Label"> + Bussola + </string> + <string name="Command_Destinations_Label"> + Destinazioni + </string> + <string name="Command_Environments_Label"> + I miei ambienti + </string> + <string name="Command_Facebook_Label"> + Facebook + </string> + <string name="Command_Flickr_Label"> + Flickr + </string> + <string name="Command_Gestures_Label"> + Gesture + </string> + <string name="Command_Grid_Status_Label"> + Stato della griglia + </string> + <string name="Command_HowTo_Label"> + Istruzioni + </string> + <string name="Command_Inventory_Label"> + Inventario + </string> + <string name="Command_Map_Label"> + Mappa + </string> + <string name="Command_Marketplace_Label"> + Mercato + </string> + <string name="Command_MarketplaceListings_Label"> + Marketplace + </string> + <string name="Command_MiniMap_Label"> + Mini mappa + </string> + <string name="Command_Move_Label"> + Cammina / corri / vola + </string> + <string name="Command_Outbox_Label"> + Casella in uscita del rivenditore + </string> + <string name="Command_People_Label"> + Persone + </string> + <string name="Command_Picks_Label"> + Preferiti + </string> + <string name="Command_Places_Label"> + Luoghi + </string> + <string name="Command_Preferences_Label"> + Preferenze + </string> + <string name="Command_Profile_Label"> + Profilo + </string> + <string name="Command_Report_Abuse_Label"> + Segnala abuso + </string> + <string name="Command_Search_Label"> + Ricerca + </string> + <string name="Command_Snapshot_Label"> + Istantanea + </string> + <string name="Command_Speak_Label"> + Parla + </string> + <string name="Command_Twitter_Label"> + Twitter + </string> + <string name="Command_View_Label"> + Controlli fotocamera + </string> + <string name="Command_Voice_Label"> + Impostazioni voce + </string> + <string name="Command_AboutLand_Tooltip"> + Informazioni sul terreno che visiti + </string> + <string name="Command_Appearance_Tooltip"> + Cambia l'avatar + </string> + <string name="Command_Avatar_Tooltip"> + Seleziona un avatar completo + </string> + <string name="Command_Build_Tooltip"> + Costruzione oggetti e modifica terreno + </string> + <string name="Command_Chat_Tooltip"> + Chatta con persone vicine usando il testo + </string> + <string name="Command_Conversations_Tooltip"> + Conversa con chiunque + </string> + <string name="Command_Compass_Tooltip"> + Bussola + </string> + <string name="Command_Destinations_Tooltip"> + Destinazioni interessanti + </string> + <string name="Command_Environments_Tooltip"> + I miei ambienti + </string> + <string name="Command_Facebook_Tooltip"> + Pubblica su Facebook + </string> + <string name="Command_Flickr_Tooltip"> + Carica su Flickr + </string> + <string name="Command_Gestures_Tooltip"> + Gesti per il tuo avatar + </string> + <string name="Command_Grid_Status_Tooltip"> + Mostra stato griglia corrente + </string> + <string name="Command_HowTo_Tooltip"> + Come eseguire le attività più comuni + </string> + <string name="Command_Inventory_Tooltip"> + Visualizza e usa le tue cose + </string> + <string name="Command_Map_Tooltip"> + Mappa del mondo + </string> + <string name="Command_Marketplace_Tooltip"> + Vai allo shopping + </string> + <string name="Command_MarketplaceListings_Tooltip"> + Vendi le tue creazioni + </string> + <string name="Command_MiniMap_Tooltip"> + Mostra le persone vicine + </string> + <string name="Command_Move_Tooltip"> + Movimento avatar + </string> + <string name="Command_Outbox_Tooltip"> + Trasferisci elementi al tuo mercato per la vendita + </string> + <string name="Command_People_Tooltip"> + Amici, gruppi e persone vicine + </string> + <string name="Command_Picks_Tooltip"> + Luoghi da mostrare come preferiti nel profilo + </string> + <string name="Command_Places_Tooltip"> + Luoghi salvati + </string> + <string name="Command_Preferences_Tooltip"> + Preferenze + </string> + <string name="Command_Profile_Tooltip"> + Modifica o visualizza il tuo profilo + </string> + <string name="Command_Report_Abuse_Tooltip"> + Segnala abuso + </string> + <string name="Command_Search_Tooltip"> + Trova luoghi, eventi, persone + </string> + <string name="Command_Snapshot_Tooltip"> + Scatta una foto + </string> + <string name="Command_Speak_Tooltip"> + Parla con persone vicine usando il microfono + </string> + <string name="Command_Twitter_Tooltip"> + Twitter + </string> + <string name="Command_View_Tooltip"> + Modifica angolo fotocamera + </string> + <string name="Command_Voice_Tooltip"> + I controlli per il volume per le chiamate e per le persone nelle vicinanze nel mondo virtuale + </string> + <string name="Toolbar_Bottom_Tooltip"> + attualmente nella barra degli strumenti in basso + </string> + <string name="Toolbar_Left_Tooltip"> + attualmente nella barra degli strumenti a sinistra + </string> + <string name="Toolbar_Right_Tooltip"> + attualmente nella barra degli strumenti a destra + </string> + <string name="Retain%"> + Mantieni% + </string> + <string name="Detail"> + Dettagli + </string> + <string name="Better Detail"> + Migliori dettagli + </string> + <string name="Surface"> + Superficie + </string> + <string name="Solid"> + Solido + </string> + <string name="Wrap"> + Involucro + </string> + <string name="Preview"> + Anteprima + </string> + <string name="Normal"> + Normale + </string> + <string name="Pathfinding_Wiki_URL"> + http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer + </string> + <string name="Pathfinding_Object_Attr_None"> + Nessuno + </string> + <string name="Pathfinding_Object_Attr_Permanent"> + Influenza il navmesh + </string> + <string name="Pathfinding_Object_Attr_Character"> + Personaggio + </string> + <string name="Pathfinding_Object_Attr_MultiSelect"> + (Multiple) + </string> + <string name="snapshot_quality_very_low"> + Molto basso + </string> + <string name="snapshot_quality_low"> + Basso + </string> + <string name="snapshot_quality_medium"> + Medio + </string> + <string name="snapshot_quality_high"> + Alto + </string> + <string name="snapshot_quality_very_high"> + Molto alto + </string> + <string name="TeleportMaturityExceeded"> + Il Residente non può visitare questa regione. + </string> + <string name="UserDictionary"> + [User] + </string> + <string name="experience_tools_experience"> + Esperienza + </string> + <string name="ExperienceNameNull"> + (nessuna esperienza) + </string> + <string name="ExperienceNameUntitled"> + (esperienza senza titolo) + </string> + <string name="Land-Scope"> + A livello di terreno + </string> + <string name="Grid-Scope"> + A livello di griglia + </string> + <string name="Allowed_Experiences_Tab"> + CONSENTITO + </string> + <string name="Blocked_Experiences_Tab"> + BLOCCATO + </string> + <string name="Contrib_Experiences_Tab"> + FORNITORE + </string> + <string name="Admin_Experiences_Tab"> + AMMINISTRATORE + </string> + <string name="Recent_Experiences_Tab"> + RECENTE + </string> + <string name="Owned_Experiences_Tab"> + DI PROPRIETÀ + </string> + <string name="ExperiencesCounter"> + ([EXPERIENCES], massimo [MAXEXPERIENCES]) + </string> + <string name="ExperiencePermission1"> + gestione dei tuoi comandi + </string> + <string name="ExperiencePermission3"> + attivazione di animazioni per il tuo avatar + </string> + <string name="ExperiencePermission4"> + collegamento al tuo avatar + </string> + <string name="ExperiencePermission9"> + monitoraggio della tua videocamera + </string> + <string name="ExperiencePermission10"> + controllo della tua videocamera + </string> + <string name="ExperiencePermission11"> + ti teletrasporta + </string> + <string name="ExperiencePermission12"> + accettazione automatica delle autorizzazioni per le esperienze + </string> + <string name="ExperiencePermission16"> + obbliga l'avatar a sedersi + </string> + <string name="ExperiencePermission17"> + cambia le impostazioni dell’ambiente + </string> + <string name="ExperiencePermissionShortUnknown"> + ha eseguito un'operazione sconosciuta: [Permission] + </string> + <string name="ExperiencePermissionShort1"> + Gestione dei comandi + </string> + <string name="ExperiencePermissionShort3"> + Attivazione di animazioni + </string> + <string name="ExperiencePermissionShort4"> + Collegamento + </string> + <string name="ExperiencePermissionShort9"> + Monitoraggio videocamera + </string> + <string name="ExperiencePermissionShort10"> + Controllo videocamera + </string> + <string name="ExperiencePermissionShort11"> + Teleport + </string> + <string name="ExperiencePermissionShort12"> + Autorizzazione + </string> + <string name="ExperiencePermissionShort16"> + Siediti + </string> + <string name="ExperiencePermissionShort17"> + Ambiente + </string> + <string name="logging_calls_disabled_log_empty"> + Le conversazioni non vengono registrate. Per iniziare a registrare, seleziona "Salva: Solo registro" oppure "Salva: Registri e trascrizioni" in Preferenze > Chat. + </string> + <string name="logging_calls_disabled_log_not_empty"> + Non verranno registrate più le conversazioni. Per riprendere a registrare, seleziona "Salva: Solo registro" oppure "Salva: Registri e trascrizioni" in Preferenze > Chat. + </string> + <string name="logging_calls_enabled_log_empty"> + Nessuna conversazione in registro. Dopo che hai contattato qualcuno o se qualcuno ti contatta, una voce del registro verrà mostrata qui. + </string> + <string name="loading_chat_logs"> + Caricamento in corso... + </string> + <string name="na"> + n/d + </string> + <string name="preset_combo_label"> + -Lista vuota- + </string> + <string name="Default"> + Predefinita + </string> + <string name="none_paren_cap"> + (Nulla) + </string> + <string name="no_limit"> + Senza limite + </string> + <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES"> + La forma della fisica contiene triangoli troppo piccoli. Prova a semplificare il modello della fisica. + </string> + <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH"> + La forma della fisica contiene dati di conferma errati. Prova a correggere il modello della fisica. + </string> + <string name="Mav_Details_MAV_UNKNOWN_VERSION"> + La versione della forma fisica non è corretta. Imposta la versione corretta per il modello della fisica. + </string> + <string name="couldnt_resolve_host"> + Il DNS non ha potuto risolvere il nome dell’host([HOSTNAME]). Verifica di riuscire a connetterti al sito web www.secondlife.com. Se riesci ma continui a ricevere questo errore, visita la sezione -Assistenza e segnala il problema.</string> - <string name="ssl_peer_certificate">Il server per il login non ha potuto effettuare la verifica tramite SSL. +Assistenza e segnala il problema. + </string> + <string name="ssl_peer_certificate"> + Il server per il login non ha potuto effettuare la verifica tramite SSL. Se continui a ricevere questo errore, visita la sezione Assistenza nel sito SecondLife.com -e segnala il problema.</string> - <string name="ssl_connect_error">Spesso l’errore è dovuto all’orologio del computer, impostato incorrettamente. +e segnala il problema. + </string> + <string name="ssl_connect_error"> + Spesso l’errore è dovuto all’orologio del computer, impostato incorrettamente. Vai al Pannello di Controllo e assicurati che data e ora siano esatte. Controlla anche che il network e il firewall siano impostati correttamente. Se continui a ricevere questo errore, visita la sezione Assistenza nel sito SecondLife.com e segnala il problema. -[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base conoscenze]</string> +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base conoscenze] + </string> </strings> diff --git a/indra/newview/skins/default/xui/it/teleport_strings.xml b/indra/newview/skins/default/xui/it/teleport_strings.xml index 4a089fe7c3..b8a7bc8112 100644 --- a/indra/newview/skins/default/xui/it/teleport_strings.xml +++ b/indra/newview/skins/default/xui/it/teleport_strings.xml @@ -1,38 +1,94 @@ <?xml version="1.0" ?> <teleport_messages> <message_set name="errors"> - <message name="invalid_tport">C'è stato un problema nell'elaborare la tua richiesta di teleport. Potresti dover effettuare nuovamente l'accesso prima di poter usare il teleport. -Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE].</message> - <message name="invalid_region_handoff">Si è verificato un problema nel tentativo di attraversare regioni. È possibile che per potere attraversare le regioni, tu debba effettuare nuovamente l'accesso. -Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE].</message> - <message name="blocked_tport">Spiacenti, il teletrasporto è bloccato al momento. Prova di nuovo tra pochi istanti. Se ancora non potrai teletrasportarti, per favore scollegati e ricollegati per risolvere il problema.</message> - <message name="nolandmark_tport">Spiacenti, ma il sistema non riesce a localizzare la destinazione del landmark</message> - <message name="timeout_tport">Spiacenti, il sistema non riesce a completare il teletrasporto. Riprova tra un attimo.</message> - <message name="NoHelpIslandTP">Non puoi teleportarti nuovamente a Welcome Island. -Per ripetere l'esercitazione, visita 'Welcome Island Public'.</message> - <message name="noaccess_tport">Spiacenti, ma non hai accesso nel luogo di destinazione richiesto.</message> - <message name="missing_attach_tport">Gli oggetti da te indossati non sono ancoa arrivati. Attendi ancora qualche secondo o scollegati e ricollegati prima di provare a teleportarti.</message> - <message name="too_many_uploads_tport">Il server della regione è al momento occupato e la tua richiesta di teletrasporto non può essere soddisfatta entro breve tempo. Per favore prova di nuovo tra qualche minuto o spostati in un'area meno affollata.</message> - <message name="expired_tport">Spiacenti, il sistema non riesce a soddisfare la tua richiesta di teletrasporto entro un tempo ragionevole. Riprova tra qualche minuto.</message> - <message name="expired_region_handoff">Spiacenti, il sistema non riesce a completare il cambio di regione entro un tempo ragionevole. Riprova tra qualche minuto.</message> - <message name="no_host">Impossibile trovare la destinazione del teletrasporto; potrebbe essere temporaneamente non accessibile o non esistere più. Riprovaci tra qualche minuto.</message> - <message name="no_inventory_host">L'inventario è temporaneamente inaccessibile.</message> - <message name="MustGetAgeRegion">Per poter entrare in questa regione devi avere almeno 18 anni.</message> - <message name="RegionTPSpecialUsageBlocked">Impossibile entrare nella regione. '[REGION_NAME]' è una regione per giochi di abilità e per entrare è necessario soddisfare alcuni requisiti. Per dettagli, leggi le [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life domande frequenti sui giochi di abilità ].</message> - <message name="preexisting_tport">Mi dispiace, ma il sistema non è stato in grado di avviare il teletrasporto. Ti preghiamo di riprovare tra qualche minuto.</message> + <message name="invalid_tport"> + C'è stato un problema nell'elaborare la tua richiesta di teleport. Potresti dover effettuare nuovamente l'accesso prima di poter usare il teleport. +Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE]. + </message> + <message name="invalid_region_handoff"> + Si è verificato un problema nel tentativo di attraversare regioni. È possibile che per potere attraversare le regioni, tu debba effettuare nuovamente l'accesso. +Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE]. + </message> + <message name="blocked_tport"> + Spiacenti, il teletrasporto è bloccato al momento. Prova di nuovo tra pochi istanti. Se ancora non potrai teletrasportarti, per favore scollegati e ricollegati per risolvere il problema. + </message> + <message name="nolandmark_tport"> + Spiacenti, ma il sistema non riesce a localizzare la destinazione del landmark + </message> + <message name="timeout_tport"> + Spiacenti, il sistema non riesce a completare il teletrasporto. Riprova tra un attimo. + </message> + <message name="NoHelpIslandTP"> + Non puoi teleportarti nuovamente a Welcome Island. +Per ripetere l'esercitazione, visita 'Welcome Island Public'. + </message> + <message name="noaccess_tport"> + Spiacenti, ma non hai accesso nel luogo di destinazione richiesto. + </message> + <message name="missing_attach_tport"> + Gli oggetti da te indossati non sono ancoa arrivati. Attendi ancora qualche secondo o scollegati e ricollegati prima di provare a teleportarti. + </message> + <message name="too_many_uploads_tport"> + Il server della regione è al momento occupato e la tua richiesta di teletrasporto non può essere soddisfatta entro breve tempo. Per favore prova di nuovo tra qualche minuto o spostati in un'area meno affollata. + </message> + <message name="expired_tport"> + Spiacenti, il sistema non riesce a soddisfare la tua richiesta di teletrasporto entro un tempo ragionevole. Riprova tra qualche minuto. + </message> + <message name="expired_region_handoff"> + Spiacenti, il sistema non riesce a completare il cambio di regione entro un tempo ragionevole. Riprova tra qualche minuto. + </message> + <message name="no_host"> + Impossibile trovare la destinazione del teletrasporto; potrebbe essere temporaneamente non accessibile o non esistere più. Riprovaci tra qualche minuto. + </message> + <message name="no_inventory_host"> + L'inventario è temporaneamente inaccessibile. + </message> + <message name="MustGetAgeRegion"> + Per poter entrare in questa regione devi avere almeno 18 anni. + </message> + <message name="RegionTPSpecialUsageBlocked"> + Impossibile entrare nella regione. '[REGION_NAME]' è una regione per giochi di abilità e per entrare è necessario soddisfare alcuni requisiti. Per dettagli, leggi le [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life domande frequenti sui giochi di abilità ]. + </message> + <message name="preexisting_tport"> + Mi dispiace, ma il sistema non è stato in grado di avviare il teletrasporto. Ti preghiamo di riprovare tra qualche minuto. + </message> </message_set> <message_set name="progress"> - <message name="sending_dest">In invio a destinazione.</message> - <message name="redirecting">In reindirizzamento ad una nuova destinazione.</message> - <message name="relaying">In reinvio a destinazione.</message> - <message name="sending_home">In invio verso la destinazione casa.</message> - <message name="sending_landmark">In invio verso la destinazione del landmark.</message> - <message name="completing">Teletrasporto completato</message> - <message name="completed_from">Teleport completato da [T_SLURL]</message> - <message name="resolving">Elaborazione della destinazione in corso...</message> - <message name="contacting">Contatto in corso con la nuova regione.</message> - <message name="arriving">In arrivo a destinazione...</message> - <message name="requesting">Avvio teletrasporto....</message> - <message name="pending">Teleport in sospeso...</message> + <message name="sending_dest"> + In invio a destinazione. + </message> + <message name="redirecting"> + In reindirizzamento ad una nuova destinazione. + </message> + <message name="relaying"> + In reinvio a destinazione. + </message> + <message name="sending_home"> + In invio verso la destinazione casa. + </message> + <message name="sending_landmark"> + In invio verso la destinazione del landmark. + </message> + <message name="completing"> + Teletrasporto completato + </message> + <message name="completed_from"> + Teleport completato da [T_SLURL] + </message> + <message name="resolving"> + Elaborazione della destinazione in corso... + </message> + <message name="contacting"> + Contatto in corso con la nuova regione. + </message> + <message name="arriving"> + In arrivo a destinazione... + </message> + <message name="requesting"> + Avvio teletrasporto.... + </message> + <message name="pending"> + Teleport in sospeso... + </message> </message_set> </teleport_messages> diff --git a/indra/newview/skins/default/xui/ja/control_table_contents_columns_basic.xml b/indra/newview/skins/default/xui/ja/control_table_contents_columns_basic.xml index 83f204648d..db833e2c8e 100644 --- a/indra/newview/skins/default/xui/ja/control_table_contents_columns_basic.xml +++ b/indra/newview/skins/default/xui/ja/control_table_contents_columns_basic.xml @@ -2,6 +2,6 @@ <contents> <columns label="アクション" name="lst_action"/> <columns label="優先コントãƒãƒ¼ãƒ«" name="lst_ctrl1"/> - <columns label="代ã‚り1" name="lst_ctrl2"/> - <columns label="代ã‚り2" name="lst_ctrl3"/> + <columns label="代替1" name="lst_ctrl2"/> + <columns label="代替2" name="lst_ctrl3"/> </contents> diff --git a/indra/newview/skins/default/xui/ja/floater_360capture.xml b/indra/newview/skins/default/xui/ja/floater_360capture.xml index d0a6eef0e0..4199327e88 100644 --- a/indra/newview/skins/default/xui/ja/floater_360capture.xml +++ b/indra/newview/skins/default/xui/ja/floater_360capture.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="360capture" title="36ï¼åº¦ï¼³ã‚·ãƒ§ãƒƒãƒˆ"> +<floater name="360capture" title="360度スナップショット"> <panel name="ui_panel_left"> <text name="quality_level_label"> å“質 @@ -11,7 +11,7 @@ <radio_item label="最高å“ä½" name="maximum_quality" value="2048" tool_tip="最高å“質"/> </radio_group> <check_box label="ã‚¢ãƒã‚¿ãƒ¼ã‚’ã™ã¹ã¦éš ã™" name="360_hide_avatar"/> - <button label="36ï¼åº¦ç”»åƒã‚’作æˆ" name="capture_button"/> + <button label="360度画åƒã‚’作æˆ" name="capture_button"/> <button label="åå‰ã‚’ã¤ã‘ã¦ä¿å˜â€¦" name="save_local_button"/> </panel> <panel name="ui_panel_right"> diff --git a/indra/newview/skins/default/xui/ja/floater_about_land.xml b/indra/newview/skins/default/xui/ja/floater_about_land.xml index 7da5f41f90..ed057704fe 100644 --- a/indra/newview/skins/default/xui/ja/floater_about_land.xml +++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml @@ -45,7 +45,7 @@ [AREA]㎡ </panel.string> <panel.string name="auction_id_text"> - オークションID:[ID] + オークションID:[ID] </panel.string> <panel.string name="need_tier_to_modify"> ã“ã®åœŸåœ°ã‚’ä¿®æ£å¤‰æ›´ã™ã‚‹ã«ã¯ã€è³¼å…¥ã‚’承èªã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ @@ -72,7 +72,7 @@ 区画ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。 </panel.string> <panel.string name="time_stamp_template"> - [year,datetime,local]å¹´[mth,datetime,local]月[day,datetime,local]æ—¥[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] + [year,datetime,local]å¹´[mth,datetime,local]月[day,datetime,local]æ—¥[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] </panel.string> <text name="Name:"> åå‰ï¼š @@ -85,7 +85,7 @@ 種類: </text> <text name="LandTypeText"> - メインランドï¼å…¥æ¤åœ° + メインランド / ホームステッド </text> <text name="ContentRating"> 区分: @@ -136,7 +136,7 @@ 4048m² </text> <text name="Traffic:"> - トラフィック: + 交通é‡ï¼š </text> <text name="DwellText"> èªã¿è¾¼ã‚“ã§ã„ã¾ã™â€¦ @@ -178,7 +178,7 @@ ã“ã®ä¸å‹•産ã«ã¯ç´„款ãŒã‚りã¾ã›ã‚“。 </text_editor> <text name="covenant_timestamp_text"> - 最後更新:1969å¹´12月31日水曜日 16:00:00 + 最後更新:1969å¹´12月31日水曜日 16:00:00 </text> <text font="SansSerifLarge" name="region_section_lbl"> 地域: @@ -190,7 +190,7 @@ 種類: </text> <text name="region_landtype_text"> - メインランドï¼å…¥æ¤åœ° + メインランド / ホームステッド </text> <text name="region_maturity_lbl"> 区分: @@ -270,7 +270,7 @@ [COUNT]個 </text> <text name="Autoreturn"> - 他者ã®ã‚ªãƒ–ジェクトã®è‡ªå‹•è¿”å´ï¼ˆåˆ†å˜ä½ã€ï¼ã§è‡ªå‹•è¿”å´ãªã—): + 他者ã®ã‚ªãƒ–ジェクトã®è‡ªå‹•è¿”å´ï¼ˆåˆ†å˜ä½ã€0ã§è‡ªå‹•è¿”å´ãªã—): </text> <line_editor name="clean other time"/> <text name="Object Owners:"> @@ -291,7 +291,7 @@ ã“ã®åŒºç”»ã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã™ã‚‹ </panel.string> <panel.string name="search_disabled_small_tooltip"> - 区画é¢ç©ãŒï¼‘28㎡未満ã®ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åйã§ã™ã€‚ + 区画é¢ç©ãŒ128㎡未満ã®ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åйã§ã™ã€‚ 大ããªåŒºç”»ã®ã¿æ¤œç´¢ã«è¡¨ç¤ºã•ã›ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ </panel.string> <panel.string name="search_disabled_permissions_tooltip"> @@ -385,7 +385,7 @@ <text name="with media:"> 種類: </text> - <combo_box name="media type" tool_tip="動画やã€Webページã€ãã®ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã®ï¼µï¼²ï¼¬ã‚’指定ã—ã¾ã™ã€‚"/> + <combo_box name="media type" tool_tip="動画やã€Webページã€ãã®ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã®URLを指定ã—ã¾ã™ã€‚"/> <text name="at URL:"> ホームページ: </text> @@ -402,11 +402,11 @@ ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’使用ã™ã‚‹ã‚ªãƒ–ジェクトã®ã€Œå†ç”Ÿã€ã‚’クリックã™ã‚‹ã¨ã€å‹•画やWebページを表示ã—ã¾ã™ã€‚テクスãƒãƒ£ã‚’変更ã™ã‚‹ã«ã¯ã‚µãƒ ãƒã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„。 </text> <check_box label="スケールを自動è¨å®š" name="media_auto_scale" tool_tip="ã“ã®ã‚ªãƒ—ションをãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€ã“ã®åŒºç”»ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ã‚¹ã‚±ãƒ¼ãƒ«ãŒè‡ªå‹•çš„ã«è¨å®šã•れã¾ã™ã€‚動作速度ã¨ç”»è³ªãŒå°‘ã—低下ã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ãŒã€ä»–ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ã‚¹ã‚±ãƒ¼ãƒªãƒ³ã‚°ã‚„整列ãŒå¿…è¦ã«ãªã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。"/> - <text name="media_size" tool_tip="レンダリングã™ã‚‹Webメディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルトã®ï¼ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"> + <text name="media_size" tool_tip="レンダリングã™ã‚‹Webメディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルトã®0ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"> サイズ: </text> - <spinner name="media_size_width" tool_tip="レンダリングã™ã‚‹Webメディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルトã®ï¼ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/> - <spinner name="media_size_height" tool_tip="レンダリングã™ã‚‹Webメディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルトã®ï¼ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/> + <spinner name="media_size_width" tool_tip="レンダリングã™ã‚‹Webメディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルトã®0ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/> + <spinner name="media_size_height" tool_tip="レンダリングã™ã‚‹Webメディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルトã®0ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/> <text name="pixels"> ピクセル </text> @@ -417,7 +417,7 @@ </panel> <panel label="サウンド" name="land_audio_panel"> <text name="MusicURL:"> - 音楽URL: + 音楽URL: </text> <text name="Sound:"> サウンド: @@ -443,7 +443,7 @@ 1ã¤ä»¥ä¸Šã®ã‚ªãƒ—ションãŒã€ä¸å‹•産レベルã§è¨å®šã•れã¦ã„ã¾ã™ã€‚ </panel.string> <check_box label="誰ã§ã‚‚訪å•å¯ï¼ˆã“ã®ã‚ªãƒ—ションをオフã«ã™ã‚‹ã¨ç«‹å…¥ç¦æ¢ãƒ©ã‚¤ãƒ³ãŒä½œæˆã•れã¾ã™ï¼‰" name="public_access"/> - <check_box label="18æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚[ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="ã“ã®åŒºç”»ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€ï¼‘8æ³ä»¥ä¸Šã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。詳細ã«ã¤ãã¾ã—ã¦ã¯ã€[SUPPORT_SITE]ã‚’ã”覧ã«ãªã£ã¦ãã ã•ã„。"/> + <check_box label="18æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚[ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="ã“ã®åŒºç”»ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€18æ³ä»¥ä¸Šã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。詳細ã«ã¤ãã¾ã—ã¦ã¯ã€[SUPPORT_SITE]ã‚’ã”覧ã«ãªã£ã¦ãã ã•ã„。"/> <check_box label="æ”¯æ‰•æƒ…å ±ãŒç™»éŒ²ã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚[ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«æ”¯æ‰•æƒ…å ±ãŒç™»éŒ²ã•れã¦ã„ãªã„å ´åˆã€ã“ã®åŒºç”»ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。詳細ã«ã¤ãã¾ã—ã¦ã¯ã€[SUPPORT_SITE]ã‚’ã”覧ã«ãªã£ã¦ãã ã•ã„。"/> <check_box label="制約ãªã—ã«ã‚°ãƒ«ãƒ¼ãƒ—[GROUP]を許å¯ã™ã‚‹ã€‚" name="GroupCheck" tool_tip="「一般ã€ã‚¿ãƒ–ã§ã€ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„。"/> <check_box label="å…¥å ´è¨±å¯ã‚’販売:" name="PassCheck" tool_tip="ã“ã®åŒºç”»ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¾ã™ã€‚"/> diff --git a/indra/newview/skins/default/xui/ja/floater_add_payment_method.xml b/indra/newview/skins/default/xui/ja/floater_add_payment_method.xml index fb2cd37cc3..b420bf7d20 100644 --- a/indra/newview/skins/default/xui/ja/floater_add_payment_method.xml +++ b/indra/newview/skins/default/xui/ja/floater_add_payment_method.xml @@ -5,7 +5,7 @@ </floater.string> <panel label="wrapper_panel" name="wrapper_panel"> <text name="title_txt"> - æ”¯æ‰•ã„æ–¹æ³•を登録ã—ã¦ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚’購入ã—ã€Second Lifeã‚’ã‚‚ã£ã¨æ¥½ã—ã¿ã¾ã—ょã†ã€‚ + æ”¯æ‰•ã„æ–¹æ³•ã‚’è¿½åŠ ã—ã¦ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚’購入ã—ã€Second Lifeã‚’ã‚‚ã£ã¨æ¥½ã—ã¿ã¾ã—ょã†ã€‚ </text> <button label="å§‹ã‚ã¾ã—ょã†" name="continue_btn"/> <button label="ã¾ãŸå¾Œã§"/> diff --git a/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml b/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml index e71ed5c599..a4909c18fd 100644 --- a/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml @@ -6,14 +6,14 @@ <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> <text name="label"> - ベークド + ベイク済㿠テクスãƒãƒ£ </text> <text name="composite_label"> åˆæˆãƒ†ã‚¯ã‚¹ãƒãƒ£ </text> - <button label="IDをコンソールã«ãƒ€ãƒ³ãƒ—" label_selected="ダンプ" name="Dump"/> - <panel name="scroll_content_panel"> + <button label="IDをコンソールã«ãƒ€ãƒ³ãƒ—" label_selected="ダンプ" name="Dump"/> + <panel name="scroll_content_panel2"> <texture_picker label="髪" name="hair-baked"/> <texture_picker label="髪" name="hair_grain"/> <texture_picker label="髪ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="hair_alpha"/> @@ -53,12 +53,12 @@ <texture_picker label="左腕ã®ã‚¿ãƒˆã‚¥" name="leftarm_tattoo"/> <texture_picker label="左足" name="leftleg-baked"/> <texture_picker label="左足ã®ã‚¿ãƒˆã‚¥" name="leftleg_tattoo"/> - <texture_picker label="予備1" name="aux1-baked"/> - <texture_picker label="予備1タトゥ" name="aux1_tattoo"/> - <texture_picker label="予備2" name="aux2-baked"/> - <texture_picker label="予備2タトゥ" name="aux2_tattoo"/> - <texture_picker label="予備3" name="aux3-baked"/> - <texture_picker label="予備3タトゥ" name="aux3_tattoo"/> + <texture_picker label="予備1" name="aux1-baked"/> + <texture_picker label="予備1タトゥ" name="aux1_tattoo"/> + <texture_picker label="予備2" name="aux2-baked"/> + <texture_picker label="予備2タトゥ" name="aux2_tattoo"/> + <texture_picker label="予備3" name="aux3-baked"/> + <texture_picker label="予備3タトゥ" name="aux3_tattoo"/> </panel> </panel> </scroll_container> diff --git a/indra/newview/skins/default/xui/ja/floater_bumps.xml b/indra/newview/skins/default/xui/ja/floater_bumps.xml index 8cd9c0cff9..c48296fa8f 100644 --- a/indra/newview/skins/default/xui/ja/floater_bumps.xml +++ b/indra/newview/skins/default/xui/ja/floater_bumps.xml @@ -4,21 +4,21 @@ 検出ãªã— </floater.string> <floater.string name="bump"> - [TIME] [NAME]ãŒã‚ãªãŸã«è¡çªã—ã¾ã—ãŸã€‚ + [TIME] [NAME]ãŒã‚ãªãŸã«è¡çªã—ã¾ã—ãŸã€‚ </floater.string> <floater.string name="llpushobject"> - [TIME] [NAME]ãŒã‚¹ã‚¯ãƒªãƒ—トã§ã‚ãªãŸã‚’押ã—ã¾ã—ãŸã€‚ + [TIME] [NAME]ãŒã‚¹ã‚¯ãƒªãƒ—トã§ã‚ãªãŸã‚’押ã—ã¾ã—ãŸã€‚ </floater.string> <floater.string name="selected_object_collide"> - [TIME] [NAME]ãŒã€ã‚ªãƒ–ジェクトã§ã‚ãªãŸã‚’å©ãã¾ã—ãŸã€‚ + [TIME] [NAME]ãŒã€ã‚ªãƒ–ジェクトã§ã‚ãªãŸã‚’å©ãã¾ã—ãŸã€‚ </floater.string> <floater.string name="scripted_object_collide"> - [TIME] [NAME]ãŒã€ã‚¹ã‚¯ãƒªãƒ—トã®ã‚ªãƒ–ジェクトã§ã‚ãªãŸã‚’å©ãã¾ã—ãŸã€‚ + [TIME] [NAME]ãŒã€ã‚¹ã‚¯ãƒªãƒ—トã®ã‚ªãƒ–ジェクトã§ã‚ãªãŸã‚’å©ãã¾ã—ãŸã€‚ </floater.string> <floater.string name="physical_object_collide"> - [TIME] [NAME]ãŒã€ç‰©ç†ã‚ªãƒ–ジェクトã§ã‚ãªãŸã‚’å©ãã¾ã—ãŸã€‚ + [TIME] [NAME]ãŒã€ç‰©ç†ã‚ªãƒ–ジェクトã§ã‚ãªãŸã‚’å©ãã¾ã—ãŸã€‚ </floater.string> <floater.string name="timeStr"> - [[hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt]] + [[hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt]] </floater.string> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_edit_ext_day_cycle.xml b/indra/newview/skins/default/xui/ja/floater_edit_ext_day_cycle.xml index f75564cd4c..a72836bbbc 100644 --- a/indra/newview/skins/default/xui/ja/floater_edit_ext_day_cycle.xml +++ b/indra/newview/skins/default/xui/ja/floater_edit_ext_day_cycle.xml @@ -13,7 +13,7 @@ 自分ã§ä½œæˆã—ãŸãƒ‡ã‚¤ã‚µã‚¤ã‚¯ãƒ«ã‚’編集ã™ã‚‹ã«ã¯ã€å¸Œæœ›ã®è¨å®šã«èª¿ç¯€ã—ã¦ã€ã€Œä¿å˜ã€ã‚’クリックã—ã¾ã™ã€‚ </string> <string name="time_label"> - ([HH]:[MM]) + ([HH]:[MM]) </string> <string name="sky_track_label"> 空[ALT] @@ -42,9 +42,9 @@ <layout_stack name="content_stack"> <layout_panel name="timeline_track_selection"> <panel name="timeline_layers"> - <button label="空4" name="sky4_track"/> - <button label="空3" name="sky3_track"/> - <button label="空2" name="sky2_track"/> + <button label="空4" name="sky4_track"/> + <button label="空3" name="sky3_track"/> + <button label="空2" name="sky2_track"/> <button label="地é¢" name="sky1_track"/> <button label="æ°´é¢" name="water_track"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/floater_god_tools.xml b/indra/newview/skins/default/xui/ja/floater_god_tools.xml index 3c96e2e340..d82be80c95 100644 --- a/indra/newview/skins/default/xui/ja/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/ja/floater_god_tools.xml @@ -20,17 +20,17 @@ <button label="åœ°å½¢ã‚’å…ƒã«æˆ»ã™" label_selected="åœ°å½¢ã‚’å…ƒã«æˆ»ã™" name="Revert Terrain" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã«ç½®æ›ã—ã¾ã™ã€‚"/> <button label="地形を交æ›" label_selected="地形を交æ›" name="Swap Terrain" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã¨å…¥ã‚Œæ›¿ãˆã¾ã™ã€‚"/> <text name="estate id"> - ä¸å‹•産ID: + ä¸å‹•産ID: </text> <text name="parent id"> - 親ID: + 親ID: </text> <line_editor name="parentestate" tool_tip="ã“れã¯ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã®è¦ªä¸å‹•産ã§ã™ã€‚"/> <text name="Grid Pos: "> グリッドä½ç½®ï¼š </text> - <line_editor name="gridposx" tool_tip="ã“れã¯ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã®ã‚°ãƒªãƒƒãƒ‰ï¼¸åº§æ¨™ã§ã™ã€‚"/> - <line_editor name="gridposy" tool_tip="ã“れã¯ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã®ã‚°ãƒªãƒƒãƒ‰ï¼¹åº§æ¨™ã§ã™ã€‚"/> + <line_editor name="gridposx" tool_tip="ã“れã¯ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã®ã‚°ãƒªãƒƒãƒ‰X座標ã§ã™ã€‚"/> + <line_editor name="gridposy" tool_tip="ã“れã¯ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã®ã‚°ãƒªãƒƒãƒ‰Y座標ã§ã™ã€‚"/> <text name="Redirect to Grid: "> グリッドã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆï¼š </text> @@ -85,7 +85,7 @@ <combo_box.item label="コライダー<ステップ>" name="item1"/> <combo_box.item label="スクリプト<回数>ã€ï¼œã‚ªãƒ—ション・パターン>" name="item2"/> <combo_box.item label="オブジェクト<パターン>" name="item3"/> - <combo_box.item label="rez <アセットID>" name="item4"/> + <combo_box.item label="rez <アセットID>" name="item4"/> </combo_box> <text name="Parameter:"> パラメーター: diff --git a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml index 319db34879..5b09d2da53 100644 --- a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml @@ -4,7 +4,7 @@ 5 </floater.string> <floater.string name="localchat"> - 近隣ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆ + è¿‘ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆ </floater.string> <floater.string name="anonymous"> 匿åユーザー diff --git a/indra/newview/skins/default/xui/ja/floater_inspect.xml b/indra/newview/skins/default/xui/ja/floater_inspect.xml index fca7b2eab8..0a859f9142 100644 --- a/indra/newview/skins/default/xui/ja/floater_inspect.xml +++ b/indra/newview/skins/default/xui/ja/floater_inspect.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="inspect" title="オブジェクトã®èª¿æŸ»"> <floater.string name="timeStamp"> - [year,datetime,slt]å¹´[mth,datetime,slt]月[day,datetime,slt]日([wkday,datetime,slt]) [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] + [year,datetime,slt]å¹´[mth,datetime,slt]月[day,datetime,slt]日([wkday,datetime,slt]) [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] </floater.string> <scroll_list name="object_list" tool_tip="ã“ã®ãƒªã‚¹ãƒˆã‹ã‚‰ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ã€ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã§ãƒã‚¤ãƒ©ã‚¤ãƒˆã—ã¾ã™ã€‚"> <scroll_list.columns label="オブジェクトå" name="object_name"/> diff --git a/indra/newview/skins/default/xui/ja/floater_joystick.xml b/indra/newview/skins/default/xui/ja/floater_joystick.xml index 559ecee5a8..0d3f0992a2 100644 --- a/indra/newview/skins/default/xui/ja/floater_joystick.xml +++ b/indra/newview/skins/default/xui/ja/floater_joystick.xml @@ -6,9 +6,9 @@ <text name="joystick_lbl"> ジョイスティック: </text> - <spinner label="X軸マッピング" name="JoystickAxis1"/> - <spinner label="Y軸マッピング" name="JoystickAxis2"/> - <spinner label="Z軸マッピング" name="JoystickAxis0"/> + <spinner label="X軸マッピング" name="JoystickAxis1"/> + <spinner label="Y軸マッピング" name="JoystickAxis2"/> + <spinner label="Z軸マッピング" name="JoystickAxis0"/> <spinner label="ピッãƒãƒ»ãƒžãƒƒãƒ”ング" name="JoystickAxis4"/> <spinner label="ヨー・マッピング" name="JoystickAxis5"/> <spinner label="ãƒãƒ¼ãƒ«ãƒ»ãƒžãƒƒãƒ”ング" name="JoystickAxis3"/> @@ -23,19 +23,19 @@ <check_box label="é€ ã‚‹" name="JoystickBuildEnabled"/> <check_box label="フライ・カメラ" name="JoystickFlycamEnabled"/> <text name="XScale"> - Xスケール + Xスケール </text> <spinner name="AvatarAxisScale1"/> <spinner name="BuildAxisScale1"/> <spinner name="FlycamAxisScale1"/> <text name="YScale"> - Yスケール + Yスケール </text> <spinner name="AvatarAxisScale2"/> <spinner name="BuildAxisScale2"/> <spinner name="FlycamAxisScale2"/> <text name="ZScale"> - Zスケール + Zスケール </text> <spinner name="AvatarAxisScale0"/> <spinner name="BuildAxisScale0"/> @@ -58,19 +58,19 @@ <spinner name="BuildAxisScale3"/> <spinner name="FlycamAxisScale3"/> <text name="XDeadZone"> - Xデッド・ゾーン + Xデッド・ゾーン </text> <spinner name="AvatarAxisDeadZone1"/> <spinner name="BuildAxisDeadZone1"/> <spinner name="FlycamAxisDeadZone1"/> <text name="YDeadZone"> - Yデッド・ゾーン + Yデッド・ゾーン </text> <spinner name="AvatarAxisDeadZone2"/> <spinner name="BuildAxisDeadZone2"/> <spinner name="FlycamAxisDeadZone2"/> <text name="ZDeadZone"> - Zデッド・ゾーン + Zデッド・ゾーン </text> <spinner name="AvatarAxisDeadZone0"/> <spinner name="BuildAxisDeadZone0"/> @@ -110,12 +110,12 @@ <button label="OK" label_selected="OK" name="ok_btn"/> <button label="ã‚ャンセル" label_selected="ã‚ャンセル" name="cancel_btn"/> <stat_view label="ジョイスティック・モニター" name="axis_view"> - <stat_bar label="軸ï¼" name="axis0"/> - <stat_bar label="軸1" name="axis1"/> - <stat_bar label="軸2" name="axis2"/> - <stat_bar label="軸3" name="axis3"/> - <stat_bar label="軸4" name="axis4"/> - <stat_bar label="軸5" name="axis5"/> + <stat_bar label="軸0" name="axis0"/> + <stat_bar label="軸1" name="axis1"/> + <stat_bar label="軸2" name="axis2"/> + <stat_bar label="軸3" name="axis3"/> + <stat_bar label="軸4" name="axis4"/> + <stat_bar label="軸5" name="axis5"/> </stat_view> <string name="NoDevice"> デãƒã‚¤ã‚¹ã¯æ¤œå‡ºã•れã¾ã›ã‚“ã§ã—ãŸã€‚ diff --git a/indra/newview/skins/default/xui/ja/floater_lagmeter.xml b/indra/newview/skins/default/xui/ja/floater_lagmeter.xml index e7830bbd25..67b4e29e45 100644 --- a/indra/newview/skins/default/xui/ja/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/ja/floater_lagmeter.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_lagmeter" title="ラグメーター"> <floater.string name="max_title_msg"> - é…延計測器 + ラグメーター </floater.string> <floater.string name="max_width_px"> 360 diff --git a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml index 31009cb2e0..cd32fac8ac 100644 --- a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml @@ -17,13 +17,13 @@ <column label="é¢ç©" name="area"/> </scroll_list> <text name="allowed_label"> - ç¾åœ¨ã®æ”¯æ‰•ã„プランã§åˆ©ç”¨å¯èƒ½ãªå…¥æ¤åœ°ï¼š + ç¾åœ¨ã®æ”¯æ‰•ã„ãƒ—ãƒ©ãƒ³ã§æ‰€æœ‰å¯èƒ½ãªåœŸåœ°: </text> <text name="allowed_text"> [AREA]㎡ </text> <text name="current_label"> - ç¾åœ¨ã®ä¿æœ‰åœ°ï¼š + ç¾åœ¨æ‰€æœ‰ã—ã¦ã„る土地: </text> <text name="current_text"> [AREA]㎡ diff --git a/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml b/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml index 4bb370f6ea..f362bff2bd 100644 --- a/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script ed float" title="LSLレファレンス"> +<floater name="script ed float" title="LSLレファレンス"> <check_box label="カーソルを追ã†" name="lock_check"/> <combo_box label="ãƒãƒƒã‚¯" name="history_combo"/> <button label="戻る" name="back_btn"/> diff --git a/indra/newview/skins/default/xui/ja/floater_model_preview.xml b/indra/newview/skins/default/xui/ja/floater_model_preview.xml index 69629f357f..123421a97d 100644 --- a/indra/newview/skins/default/xui/ja/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/ja/floater_model_preview.xml @@ -233,7 +233,7 @@ </panel> <panel label="アップãƒãƒ¼ãƒ‰ã®ã‚ªãƒ—ション" name="modifiers_panel"> <text name="scale_label"> - スケール(1ï¼å¢—減ãªã—): + スケール(1ï¼å¢—減ãªã—): </text> <spinner name="import_scale" value="1.0"/> <text name="dimensions_label"> @@ -250,7 +250,7 @@ <check_box label="ジョイントä½ç½®ã‚’å«ã‚€" name="upload_joints"/> <check_box label="ジョイントä½ç½®ãŒå®šç¾©ã•れã¦ã„ã‚‹å ´åˆã€ã‚¹ã‚±ãƒ¼ãƒ«ã‚’ãƒãƒƒã‚¯" name="lock_scale_if_joint_position"/> <text name="pelvis_offset_label"> - Zオフセット(アãƒã‚¿ãƒ¼ã‚’上下調整): + Zオフセット(アãƒã‚¿ãƒ¼ã‚’上下調整): </text> <spinner name="pelvis_offset" value="0.0"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml b/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml index d74b714b1a..35f4cd3ca3 100644 --- a/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml +++ b/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml @@ -4,7 +4,7 @@ 5 </floater.string> <floater.string name="localchat"> - 近隣ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆ + è¿‘ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆ </floater.string> <floater.string name="anonymous"> 匿åユーザー diff --git a/indra/newview/skins/default/xui/ja/floater_pathfinding_characters.xml b/indra/newview/skins/default/xui/ja/floater_pathfinding_characters.xml index 00742aef23..092b564455 100644 --- a/indra/newview/skins/default/xui/ja/floater_pathfinding_characters.xml +++ b/indra/newview/skins/default/xui/ja/floater_pathfinding_characters.xml @@ -32,7 +32,7 @@ <scroll_list.columns label="åå‰" name="name"/> <scroll_list.columns label="説明" name="description"/> <scroll_list.columns label="所有者" name="owner"/> - <scroll_list.columns label="CPU" name="cpu_time"/> + <scroll_list.columns label="CPU" name="cpu_time"/> <scroll_list.columns label="高度" name="altitude"/> </scroll_list> <text name="messaging_status"> diff --git a/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml index 218fade27b..72d9f4b44a 100644 --- a/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml @@ -89,17 +89,17 @@ </text> <combo_box name="show_heatmap_mode"> <combo_box.item label="表示ã—ãªã„" name="show_heatmap_mode_none"/> - <combo_box.item label="ã‚ャラクタータイプA" name="show_heatmap_mode_a"/> - <combo_box.item label="ã‚ャラクタータイプB" name="show_heatmap_mode_b"/> - <combo_box.item label="ã‚ャラクタータイプC" name="show_heatmap_mode_c"/> - <combo_box.item label="ã‚ャラクタータイプD" name="show_heatmap_mode_d"/> + <combo_box.item label="ã‚ャラクタータイプA" name="show_heatmap_mode_a"/> + <combo_box.item label="ã‚ャラクタータイプB" name="show_heatmap_mode_b"/> + <combo_box.item label="ã‚ャラクタータイプC" name="show_heatmap_mode_c"/> + <combo_box.item label="ã‚ャラクタータイプD" name="show_heatmap_mode_d"/> </combo_box> <check_box label="æ©è¡Œå¯èƒ½" name="show_walkables"/> <check_box label="ç´ æãƒœãƒªãƒ¥ãƒ¼ãƒ " name="show_material_volumes"/> <check_box label="é™çš„障害物" name="show_static_obstacles"/> <check_box label="除外ボリューム" name="show_exclusion_volumes"/> <check_box label="水上飛行機" name="show_water_plane"/> - <check_box label="X線表示" name="show_xray"/> + <check_box label="X線表示" name="show_xray"/> </panel> <panel label="パスをテスト" name="test_panel"> <text name="ctrl_click_label"> @@ -113,17 +113,17 @@ </text> <slider name="character_width" value="1"/> <text name="character_width_unit_label"> - ï½ + m </text> <text name="character_type_label"> ã‚ャラクタータイプ </text> <combo_box name="path_character_type"> <combo_box.item label="ãªã—" name="path_character_type_none"/> - <combo_box.item label="A" name="path_character_type_a"/> - <combo_box.item label="ï¼¢" name="path_character_type_b"/> - <combo_box.item label="ï¼£" name="path_character_type_c"/> - <combo_box.item label="D" name="path_character_type_d"/> + <combo_box.item label="A" name="path_character_type_a"/> + <combo_box.item label="B" name="path_character_type_b"/> + <combo_box.item label="C" name="path_character_type_c"/> + <combo_box.item label="D" name="path_character_type_d"/> </combo_box> <button label="経路をクリア" name="clear_path"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml index 0189cbd47b..0bf9b6a308 100644 --- a/indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml +++ b/indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml @@ -119,10 +119,10 @@ <scroll_list.columns label="ランドインパクト" name="land_impact"/> <scroll_list.columns label="è·é›¢" name="dist_from_you"/> <scroll_list.columns label="経路探索ã§ä½¿ç”¨" name="linkset_use"/> - <scroll_list.columns label="A%" name="a_percent"/> - <scroll_list.columns label="B%" name="b_percent"/> - <scroll_list.columns label="C%" name="c_percent"/> - <scroll_list.columns label="D%" name="d_percent"/> + <scroll_list.columns label="A %" name="a_percent"/> + <scroll_list.columns label="B %" name="b_percent"/> + <scroll_list.columns label="C %" name="c_percent"/> + <scroll_list.columns label="D %" name="d_percent"/> </scroll_list> <text name="messaging_status"> リンクセット: @@ -150,21 +150,21 @@ æ©è¡Œå¯èƒ½æ€§ï¼š </text> <text name="edit_a_label"> - A + A </text> - <line_editor name="edit_a_value" tool_tip="タイプAã®ã‚ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ã®æ©è¡Œå¯èƒ½æ€§ã€‚ã‚ャラクタータイプã®ä¾‹ã¯ãƒ’ューマノイドã§ã™ã€‚"/> + <line_editor name="edit_a_value" tool_tip="タイプAã®ã‚ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ã®æ©è¡Œå¯èƒ½æ€§ã€‚ã‚ャラクタータイプã®ä¾‹ã¯ãƒ’ューマノイドã§ã™ã€‚"/> <text name="edit_b_label"> - ï¼¢ + B </text> - <line_editor name="edit_b_value" tool_tip="タイプBã®ã‚ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ã®æ©è¡Œå¯èƒ½æ€§ã€‚ã‚ャラクタータイプã®ä¾‹ã¯ã‚¯ãƒªãƒ¼ãƒãƒ£ãƒ¼ã§ã™ã€‚"/> + <line_editor name="edit_b_value" tool_tip="タイプBã®ã‚ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ã®æ©è¡Œå¯èƒ½æ€§ã€‚ã‚ャラクタータイプã®ä¾‹ã¯ã‚¯ãƒªãƒ¼ãƒãƒ£ãƒ¼ã§ã™ã€‚"/> <text name="edit_c_label"> - ï¼£ + C </text> - <line_editor name="edit_c_value" tool_tip="タイプCã®ã‚ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ã®æ©è¡Œå¯èƒ½æ€§ã€‚ã‚ャラクタータイプã®ä¾‹ã¯ãƒ¡ã‚«ãƒ‹ã‚«ãƒ«ã§ã™ã€‚"/> + <line_editor name="edit_c_value" tool_tip="タイプCã®ã‚ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ã®æ©è¡Œå¯èƒ½æ€§ã€‚ã‚ャラクタータイプã®ä¾‹ã¯ãƒ¡ã‚«ãƒ‹ã‚«ãƒ«ã§ã™ã€‚"/> <text name="edit_d_label"> - D + D </text> - <line_editor name="edit_d_value" tool_tip="タイプDã®ã‚ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ã®æ©è¡Œå¯èƒ½æ€§ã€‚ã‚ャラクタータイプã®ä¾‹ã¯ãã®ä»–ã§ã™ã€‚"/> + <line_editor name="edit_d_value" tool_tip="タイプDã®ã‚ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ã®æ©è¡Œå¯èƒ½æ€§ã€‚ã‚ャラクタータイプã®ä¾‹ã¯ãã®ä»–ã§ã™ã€‚"/> <button label="変更をé©ç”¨" name="apply_edit_values"/> <text name="suggested_use_a_label"> (ヒューマノイド) diff --git a/indra/newview/skins/default/xui/ja/floater_performance.xml b/indra/newview/skins/default/xui/ja/floater_performance.xml index e2efc152a4..ecb00dd58c 100644 --- a/indra/newview/skins/default/xui/ja/floater_performance.xml +++ b/indra/newview/skins/default/xui/ja/floater_performance.xml @@ -39,7 +39,7 @@ </panel> <panel name="nearby_subpanel"> <text name="avatars_nearby_lbl"> - 近隣ã®ã‚¢ãƒã‚¿ãƒ¼ + è¿‘ãã®ã‚¢ãƒã‚¿ãƒ¼ </text> <text name="avatars_nearby_desc"> è¿‘ãã«ã„ã‚‹ã‚¢ãƒã‚¿ãƒ¼ã®ã†ã¡ã€ã©ã®ã‚¿ã‚¤ãƒ—ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’完全ã«è¡¨ç¤ºã™ã‚‹ã‹ã‚’管ç†ã—ã¾ã™ã€‚ @@ -51,16 +51,16 @@ ã‚¢ãƒã‚¿ãƒ¼ã®è¤‡é›‘度 </text> <text name="complexity_info"> - FPSãŒå‡ºãªã„å ´åˆã¯ã€ã‚¢ãƒã‚¿ãƒ¼ã®è¤‡é›‘度を減らã—ã¦ãã ã•ã„。 + FPSãŒå‡ºãªã„å ´åˆã¯ã€ã‚¢ãƒã‚¿ãƒ¼ã®è¤‡é›‘度を減らã—ã¦ãã ã•ã„。 </text> <icon name="icon_arrow4"/> </panel> <panel name="huds_subpanel"> <text name="huds_lbl"> - アクティブãªï¼¨ï¼µï¼¤ + アクティブãªHUD </text> <text name="huds_desc"> - 使用ã—ã¦ã„ãªã„HUDを外ã™ã¨ã€é€Ÿåº¦ãŒå‘上ã™ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + 使用ã—ã¦ã„ãªã„HUDを外ã™ã¨ã€é€Ÿåº¦ãŒå‘上ã™ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ </text> <icon name="icon_arrow4"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/floater_preferences.xml b/indra/newview/skins/default/xui/ja/floater_preferences.xml index c26bad3176..f75026c6a6 100644 --- a/indra/newview/skins/default/xui/ja/floater_preferences.xml +++ b/indra/newview/skins/default/xui/ja/floater_preferences.xml @@ -15,7 +15,7 @@ <panel label="色" name="colors"/> <panel label="プライãƒã‚·ãƒ¼" name="im"/> <panel label="セットアップ" name="input"/> - <panel label="æ‹¡å¼µ" name="advanced1"/> + <panel label="アドãƒãƒ³ã‚¹" name="advanced1"/> <panel label="アップãƒãƒ¼ãƒ‰" name="uploads"/> <panel label="æ“作" name="controls"/> </tab_container> diff --git a/indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml index 66a416f416..9a2ed64291 100644 --- a/indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml +++ b/indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="prefs_graphics_advanced" title="拡張グラフィックè¨å®š"> +<floater name="prefs_graphics_advanced" title="グラフィック詳細è¨å®š"> <text name="GeneralText"> 全般 </text> <slider label="æç”»è·é›¢ï¼š" name="DrawDistance"/> <text name="DrawDistanceMeterText2"> - ï½ + m </text> <slider label="最大パーティクル数:" name="MaxParticleCount"/> <slider label="ãƒã‚¹ãƒˆãƒ—ãƒã‚»ã‚¹å“質:" name="RenderPostProcess"/> diff --git a/indra/newview/skins/default/xui/ja/floater_preferences_view_advanced.xml b/indra/newview/skins/default/xui/ja/floater_preferences_view_advanced.xml index 5efbbf7e17..5f686e41e4 100644 --- a/indra/newview/skins/default/xui/ja/floater_preferences_view_advanced.xml +++ b/indra/newview/skins/default/xui/ja/floater_preferences_view_advanced.xml @@ -4,14 +4,14 @@ カメラã®ã‚ªãƒ•セット: </text> <spinner name="camera_x"/> - <spinner label="ï¼¹" name="camera_y"/> - <spinner label="Z" name="camera_z"/> + <spinner label="Y" name="camera_y"/> + <spinner label="Z" name="camera_z"/> <text name="focus_offset_lbl"> 焦点ã®ã‚ªãƒ•セット: </text> <spinner name="focus_x"/> - <spinner label="ï¼¹" name="focus_y"/> - <spinner label="Z" name="focus_z"/> + <spinner label="Y" name="focus_y"/> + <spinner label="Z" name="focus_z"/> <text name="offset_scale_lbl"> カメラã®ã‚ªãƒ•セットå€çŽ‡ï¼š </text> diff --git a/indra/newview/skins/default/xui/ja/floater_scene_load_stats.xml b/indra/newview/skins/default/xui/ja/floater_scene_load_stats.xml index 43d5223ecc..b43d54001c 100644 --- a/indra/newview/skins/default/xui/ja/floater_scene_load_stats.xml +++ b/indra/newview/skins/default/xui/ja/floater_scene_load_stats.xml @@ -4,7 +4,7 @@ <container_view name="statistics_view"> <stat_view name="basic" label="基本"> <stat_bar label="フレームã”ã¨ã®ãƒ”クセル差" name="frame difference" unit_label="ï¼…"/> - <stat_bar label="UDPデータã®å—ä¿¡é‡" name="bandwidth" unit_label="kbps"/> + <stat_bar label="UDPデータã®å—ä¿¡é‡" name="bandwidth" unit_label="kbps"/> <stat_bar label="パケットãƒã‚¹" name="packet_loss" unit_label="ï¼…"/> </stat_view> <stat_view name="advanced" label="æ‹¡å¼µ"> @@ -57,15 +57,15 @@ <stat_bar name="simsimphysicsshapeupdatemsec" label=" 物ç†å½¢çŠ¶æ›´æ–°" unit_label="㎳"/> <stat_bar name="simsimphysicsothermsec" label=" 他ã®ç‰©ç†ä½œç”¨" unit_label="㎳"/> <stat_bar name="simsleepmsec" label=" スリープ時間" unit_label="㎳"/> - <stat_bar name="simpumpiomsec" label=" ãƒãƒ³ãƒ—Iï¼ï¼¯" unit_label="㎳"/> + <stat_bar name="simpumpiomsec" label=" ãƒãƒ³ãƒ—IO" unit_label="㎳"/> </stat_view> </stat_view> </stat_view> <stat_view name="frame_stats" label="フレームã®å†…訳"> <stat_bar name="scenery_frame_pct" label="景色" unit_label="ï¼…"/> <stat_bar name="avatar_frame_pct" label="ã‚¢ãƒã‚¿ãƒ¼" unit_label="ï¼…"/> - <stat_bar name="ui_frame_pct" label="UI" unit_label="ï¼…"/> - <stat_bar name="huds_frame_pct" label="HUD" unit_label="ï¼…"/> + <stat_bar name="ui_frame_pct" label="UI" unit_label="ï¼…"/> + <stat_bar name="huds_frame_pct" label="HUD" unit_label="ï¼…"/> <stat_bar name="swap_frame_pct" label="スワップ" unit_label="ï¼…"/> <stat_bar name="idle_frame_pct" label="タスク" unit_label="ï¼…"/> </stat_view> diff --git a/indra/newview/skins/default/xui/ja/floater_search.xml b/indra/newview/skins/default/xui/ja/floater_search.xml deleted file mode 100644 index 531ac77f95..0000000000 --- a/indra/newview/skins/default/xui/ja/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> - <floater.string name="loading_text"> - èªã¿è¾¼ã‚“ã§ã„ã¾ã™â€¦ã€‚ - </floater.string> - <floater.string name="done_text"> - 完了 - </floater.string> - <layout_stack name="stack1"> - <layout_panel name="browser_layout"> - <text name="refresh_search"> - ç¾åœ¨ã®ã‚´ãƒƒãƒ‰ãƒ¬ãƒ™ãƒ«ã«åæ˜ ã•ã›ã‚‹ãŸã‚ã€æ¤œç´¢ã‚’やり直ã—ã¦ãã ã•ã„。 - </text> - </layout_panel> - </layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_settings_debug.xml b/indra/newview/skins/default/xui/ja/floater_settings_debug.xml index f304ab9769..ef1947dbce 100644 --- a/indra/newview/skins/default/xui/ja/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/ja/floater_settings_debug.xml @@ -16,10 +16,10 @@ </radio_group> <line_editor name="val_text"/> <color_swatch label="色" name="val_color_swatch"/> - <spinner label="X" name="val_spinner_1"/> - <spinner label="X" name="val_spinner_2"/> - <spinner label="X" name="val_spinner_3"/> - <spinner label="X" name="val_spinner_4"/> + <spinner label="x" name="val_spinner_1"/> + <spinner label="x" name="val_spinner_2"/> + <spinner label="x" name="val_spinner_3"/> + <spinner label="x" name="val_spinner_4"/> <button label="デフォルトã«ãƒªã‚»ãƒƒãƒˆ" name="default_btn"/> <check_box label="変更ã•れãŸè¨å®šã®ã¿è¡¨ç¤º" name="hide_default"/> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_snapshot.xml b/indra/newview/skins/default/xui/ja/floater_snapshot.xml index 8035e8a13f..be9c52fb12 100644 --- a/indra/newview/skins/default/xui/ja/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/ja/floater_snapshot.xml @@ -49,7 +49,7 @@ <combo_box.item label="色深度" name="Depth" value="depth"/> </combo_box> <check_box label="インターフェース" name="ui_check"/> - <check_box label="HUD" name="hud_check"/> + <check_box label="HUD" name="hud_check"/> <check_box label="フレームをフリーズ(全画é¢ï¼‰" name="freeze_frame_check"/> <check_box label="自動リフレッシュ" name="auto_snapshot_check"/> <text name="filter_list_label"> @@ -93,6 +93,6 @@ [SIZE]㎅ </text> <text name="360_label"> - 36ï¼åº¦ï¼³ã‚·ãƒ§ãƒƒãƒˆã‚’撮影 + 360度スナップショットを撮影 </text> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_stats.xml b/indra/newview/skins/default/xui/ja/floater_stats.xml index 0c28b47351..41a482a4b9 100644 --- a/indra/newview/skins/default/xui/ja/floater_stats.xml +++ b/indra/newview/skins/default/xui/ja/floater_stats.xml @@ -3,15 +3,15 @@ <scroll_container name="statistics_scroll"> <container_view name="statistics_view"> <stat_view label="基本" name="basic"> - <stat_bar label="FPS" name="fps" unit_label="ï¼ç§’"/> + <stat_bar label="FPS" name="fps" unit_label="ï¼ç§’"/> <stat_bar name="frame_mean" label="フレーム(平å‡ï¼‰" unit_label="㎳"/> <stat_bar name="frame_median" label="フレーム(ä¸å¤®å€¤ï¼‰" unit_label="㎳"/> <stat_bar name="framet_jitter" label="ジッタ"/> - <stat_bar label="å—ä¿¡ã—ãŸï¼µï¼¤ï¼°ãƒ‡ãƒ¼ã‚¿" name="bandwidth"/> + <stat_bar label="å—ä¿¡ã—ãŸUDPデータ" name="bandwidth"/> <stat_bar label="パケットãƒã‚¹" name="packet_loss"/> <stat_bar label="シムã®Ping" name="ping"/> </stat_view> - <stat_view label="æ‹¡å¼µ" name="advanced"> + <stat_view label="詳細" name="advanced"> <stat_view label="æç”»" name="render"> <stat_bar label="フレームã‚ãŸã‚Šã®KTris" name="ktrisframe" unit_label="ktrisï¼ãƒ•レーム"/> <stat_bar label="ç§’ã‚ãŸã‚Šã®KTris" name="ktrissec"/> @@ -27,15 +27,15 @@ <stat_bar label="ã‚ャッシュヒット率" name="texture_cache_hits"/> <stat_bar label="ã‚ャッシュèªã¿å–りé…å»¶" name="texture_cache_read_latency"/> <stat_bar label="カウント" name="numimagesstat"/> - <stat_bar label="RAWカウント" name="numrawimagesstat"/> - <stat_bar label="GLメモリ" name="gltexmemstat"/> + <stat_bar label="Rawカウント" name="numrawimagesstat"/> + <stat_bar label="GLメモリ" name="gltexmemstat"/> <stat_bar label="フォーマット済メモリ" name="formattedmemstat"/> - <stat_bar label="RAWメモリ" name="rawmemstat"/> + <stat_bar label="Rawメモリ" name="rawmemstat"/> <stat_bar label="çµ±åˆãƒ¡ãƒ¢ãƒª" name="glboundmemstat"/> </stat_view> <stat_view label="メモリ使用é‡" name="memory"> - <stat_bar label="LLトレース" name="LLTrace"/> - <stat_bar label="UI" name="LLView"/> + <stat_bar label="LLトレース" name="LLTrace"/> + <stat_bar label="UI" name="LLView"/> <stat_bar label="フォント" name="LLFontFreetype"/> <stat_bar label="インベントリ" name="LLInventoryObject"/> <stat_bar label="ビューアオブジェクト" name="LLViewerObject"/> @@ -47,7 +47,7 @@ <stat_bar label="æç”»æƒ…å ±" name="LLDrawInfo"/> <stat_bar label="テクスãƒãƒ£ãƒ‡ãƒ¼ã‚¿" name="LLTexture"/> <stat_bar label="ç”»åƒãƒ‡ãƒ¼ã‚¿" name="LLImage"/> - <stat_bar label="GL画åƒãƒ‡ãƒ¼ã‚¿" name="LLImageGL"/> + <stat_bar label="GLç”»åƒãƒ‡ãƒ¼ã‚¿" name="LLImageGL"/> <stat_bar label="é ‚ç‚¹ãƒãƒƒãƒ•ã‚¡" name="LLVertexBuffer"/> </stat_view> <stat_view label="ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" name="network"> @@ -63,11 +63,11 @@ </stat_view> <stat_view label="シミュレーター" name="sim"> <stat_bar label="é…延時間" name="simtimedilation"/> - <stat_bar label="シムã®ï¼¦ï¼°ï¼³" name="simfps"/> - <stat_bar label="物ç†ä½œç”¨ã®ï¼¦ï¼°ï¼³" name="simphysicsfps"/> + <stat_bar label="シムã®FPS" name="simfps"/> + <stat_bar label="物ç†ä½œç”¨ã®FPS" name="simphysicsfps"/> <stat_view label="物ç†ä½œç”¨ã®è©³ç´°" name="physicsdetail"> <stat_bar label="ピン留ã‚オブジェクト" name="physicspinnedtasks"/> - <stat_bar label="低LODオブジェクト" name="physicslodtasks"/> + <stat_bar label="低LODオブジェクト" name="physicslodtasks"/> <stat_bar label="メモリé…分" name="physicsmemoryallocated"/> </stat_view> <stat_bar label="ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã®æ›´æ–°ï¼ç§’" name="simagentups"/> @@ -79,7 +79,7 @@ <stat_bar label="スクリプト実行" name="simpctscriptsrun"/> <stat_bar label="スクリプトイベント" name="simscripteps" unit_label="eps"/> <stat_view label="経路探索" name="simpathfinding"> - <stat_bar label="AIステップ時間" name="simsimaistepmsec"/> + <stat_bar label="AIステップ時間" name="simsimaistepmsec"/> <stat_bar label="スã‚ップã•れãŸã‚·ãƒ«ã‚¨ãƒƒãƒˆã‚¹ãƒ†ãƒƒãƒ—" name="simsimskippedsilhouettesteps" unit_label="ï¼ç§’"/> <stat_bar label="æ›´æ–°ã•れãŸã‚ャラクター" name="simsimpctsteppedcharacters" unit_label="ï¼…"/> </stat_view> diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml index fb95a71ce0..f14d8f7241 100644 --- a/indra/newview/skins/default/xui/ja/floater_tools.xml +++ b/indra/newview/skins/default/xui/ja/floater_tools.xml @@ -40,7 +40,7 @@ 土地をクリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦é¸æŠž </floater.string> <floater.string name="status_selectcount"> - é¸æŠžã•れã¦ã„るオブジェクトã¯[OBJ_COUNT]個ã€åœŸåœ°ã®è² è·ã¯[LAND_IMPACT] [secondlife:///app/openfloater/object_weights 詳細] + é¸æŠžã•れã¦ã„るオブジェクトã¯[OBJ_COUNT]個ã€åœŸåœ°ã®è² è·ã¯[LAND_IMPACT] [secondlife:///app/openfloater/object_weights 詳細] </floater.string> <floater.string name="status_remaining_capacity"> 残りã®è¨±å®¹æ•°[LAND_CAPACITY] @@ -123,7 +123,7 @@ ä½•ã‚‚é¸æŠžã•れã¦ã„ã¾ã›ã‚“。 </text> <text name="remaining_capacity"> - [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights 詳細] + [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights 詳細] </text> <tab_container name="Object Info Tabs"> <panel label="一般" name="General"> @@ -232,22 +232,22 @@ <check_box label="コピー" name="checkbox next owner can copy" tool_tip="è²æ¸¡å…ˆã®æ‰€æœ‰è€…ã¯ã€ã“ã®ã‚ªãƒ–ジェクトを無制é™ã«ã‚³ãƒ”ーã§ãã¾ã™ã€‚コピーã«ã¯åˆ¶ä½œè€…ã®æƒ…å ±ãŒå«ã¾ã‚Œã€ã‚³ãƒ”ー元ã®ã‚¢ã‚¤ãƒ†ãƒ ã¨é•ã£ã¦è¨±å¯ãªã©ã«é–¢ã—制約ãŒã‚りã¾ã™ã€‚"/> <check_box label="å†è²©ãƒ»è²æ¸¡" name="checkbox next owner can transfer" tool_tip="è²æ¸¡å…ˆã®æ‰€æœ‰è€…ã¯ã€ã“ã®ã‚ªãƒ–ジェクトを他人ã«è²æ¸¡ã—ãŸã‚Šå†è²©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/> <text name="B:"> - B: + B: </text> <text name="O:"> - C: + O: </text> <text name="G:"> - G: + G: </text> <text name="E:"> - E: + E: </text> <text name="N:"> - N: + N: </text> <text name="F:"> - F: + F: </text> </panel> <panel name="pathfinding_attrs_panel"> @@ -264,21 +264,21 @@ <text name="label position"> ä½ç½®ï¼ˆãƒ¡ãƒ¼ãƒˆãƒ«ï¼‰ </text> - <spinner label="X" name="Pos X"/> - <spinner label="ï¼¹" name="Pos Y"/> - <spinner label="Z" name="Pos Z"/> + <spinner label="X" name="Pos X"/> + <spinner label="Y" name="Pos Y"/> + <spinner label="Z" name="Pos Z"/> <text name="label size"> サイズ(メートル) </text> - <spinner label="X" name="Scale X"/> - <spinner label="ï¼¹" name="Scale Y"/> - <spinner label="Z" name="Scale Z"/> + <spinner label="X" name="Scale X"/> + <spinner label="Y" name="Scale Y"/> + <spinner label="Z" name="Scale Z"/> <text name="label rotation"> 回転(度) </text> - <spinner label="X" name="Rot X"/> - <spinner label="ï¼¹" name="Rot Y"/> - <spinner label="Z" name="Rot Z"/> + <spinner label="X" name="Rot X"/> + <spinner label="Y" name="Rot Y"/> + <spinner label="Z" name="Rot Z"/> <combo_box name="comboBaseType"> <combo_box.item label="ボックス" name="Box"/> <combo_box.item label="シリンダー" name="Cylinder"/> @@ -320,13 +320,13 @@ <text name="scale_hole"> 穴寸法 </text> - <spinner label="X" name="Taper Scale X"/> - <spinner label="ï¼¹" name="Taper Scale Y"/> + <spinner label="X" name="Taper Scale X"/> + <spinner label="Y" name="Taper Scale Y"/> <text name="text topshear"> 上部層 </text> - <spinner label="X" name="Shear X"/> - <spinner label="ï¼¹" name="Shear Y"/> + <spinner label="X" name="Shear X"/> + <spinner label="Y" name="Shear Y"/> <text name="advanced_cut"> プãƒãƒ•ィールカット(始点ã¨çµ‚点) </text> @@ -341,8 +341,8 @@ <text name="text taper2"> テーパー </text> - <spinner label="X" name="Taper X"/> - <spinner label="ï¼¹" name="Taper Y"/> + <spinner label="X" name="Taper X"/> + <spinner label="Y" name="Taper Y"/> <text name="text radius delta"> åŠå¾„ </text> @@ -350,7 +350,7 @@ 回転体 </text> <texture_picker label="スカルプトテクスãƒãƒ£" name="sculpt texture control" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠžã—ã¦ãã ã•ã„。"/> - <check_box label="ミラー" name="sculpt mirror control" tool_tip="スカルプトプリムをX軸上ã§å転ã•ã›ã¾ã™"/> + <check_box label="ミラー" name="sculpt mirror control" tool_tip="スカルプトプリムをX軸上ã§å転ã•ã›ã¾ã™"/> <check_box label="è£è¿”ã—" name="sculpt invert control" tool_tip="スカルプトプリムをå転ã•ã›ã¦è£è¿”ã—ã¾ã™"/> <text name="label sculpt type"> 縫ã„ç›®ã®ã‚¿ã‚¤ãƒ— @@ -379,20 +379,20 @@ オブジェクトã®ç‰¹å¾´ã‚’編集: </text> <check_box label="アニメーションメッシュ" name="Animated Mesh Checkbox Ctrl" tool_tip="リグ入りメッシュオブジェクトをã€ãれãžã‚Œã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã•ã›ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚"/> - <check_box label="フレã‚シブルパス" name="Flexible1D Checkbox Ctrl" tool_tip="Z軸をä¸å¿ƒã«ã€ã‚ªãƒ–ジェクトã®å±ˆæ›²ã‚’有効ã«ã—ã¾ã™ã€‚(クライアントå´ã®ã¿ï¼‰"/> + <check_box label="フレã‚シブルパス" name="Flexible1D Checkbox Ctrl" tool_tip="Z軸をä¸å¿ƒã«ã€ã‚ªãƒ–ジェクトã®å±ˆæ›²ã‚’有効ã«ã—ã¾ã™ã€‚(クライアントå´ã®ã¿ï¼‰"/> <spinner label="柔軟性" name="FlexNumSections"/> <spinner label="é‡åŠ›" name="FlexGravity"/> <spinner label="ドラッグ" name="FlexFriction"/> <spinner label="風" name="FlexWind"/> <spinner label="ç·Šå¼µ" name="FlexTension"/> - <spinner label="X軸方å‘ã®åŠ›" name="FlexForceX"/> - <spinner label="Y軸方å‘ã®åŠ›" name="FlexForceY"/> - <spinner label="Z軸方å‘ã®åŠ›" name="FlexForceZ"/> + <spinner label="X軸方å‘ã®åŠ›" name="FlexForceX"/> + <spinner label="Y軸方å‘ã®åŠ›" name="FlexForceY"/> + <spinner label="Z軸方å‘ã®åŠ›" name="FlexForceZ"/> <check_box label="発光" name="Light Checkbox Ctrl" tool_tip="オブジェクトãŒç™ºå…‰ã—ã¾ã™"/> <color_swatch label="" name="colorswatch" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> <texture_picker label="" name="light texture control" tool_tip="ã‚¯ãƒªãƒƒã‚¯ã§æŠ•å½±ç”»ã‚’é¸æŠžã—ã¾ã™ï¼ˆé…延レンダリング有効時ã®ã¿ï¼‰"/> <spinner label="è¼åº¦" name="Light Intensity"/> - <spinner label="FOV" name="Light FOV"/> + <spinner label="FOV" name="Light FOV"/> <spinner label="åŠå¾„" name="Light Radius"/> <spinner label="焦点" name="Light Focus"/> <spinner label="å¼±ã¾ã‚‹" name="Light Falloff"/> @@ -412,7 +412,7 @@ </combo_box> <spinner label="é‡åŠ›" name="Physics Gravity"/> <spinner label="摩擦" name="Physics Friction"/> - <spinner label="密度(1ï¼ï¼ãŽ/㎥)" name="Physics Density"/> + <spinner label="密度(100ãŽ/㎥)" name="Physics Density"/> <spinner label="復元" name="Physics Restitution"/> </panel> <panel label="æè³ª" name="Texture"/> @@ -426,13 +426,13 @@ åŒºç”»æƒ…å ± </text> <text name="label_area_price"> - ä¾¡æ ¼ï¼š[AREA]㎡ L$ [PRICE] + ä¾¡æ ¼ï¼š[AREA]㎡ L$ [PRICE] </text> <text name="label_area"> é¢ç©ï¼š[AREA]㎡ </text> <button label="åœŸåœ°æƒ…å ±" label_selected="åœŸåœ°æƒ…å ±" name="button about land"/> - <check_box label="所有者を表示" name="checkbox show owners" tool_tip="所有者ã®ç¨®é¡žåˆ¥ã«åŒºç”»ã‚’色ã¥ã‘ã¾ã™ï¼šç·‘色ï¼ã‚ãªãŸã®åœŸåœ°ã€€æ°´è‰²ï¼ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—所有地 赤色ï¼ä»–äººãŒæ‰€æœ‰ã™ã‚‹åœŸåœ°ã€€é»„色 = 売り出ã—ä¸ã€€ç´«è‰²ï¼ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã€€ç°è‰²ï¼å…¬å…±é ˜åŸŸ"/> + <check_box label="所有者を表示" name="checkbox show owners" tool_tip="所有者ã®ç¨®é¡žåˆ¥ã«åŒºç”»ã‚’色ã¥ã‘ã¾ã™ï¼š 緑色ï¼ã‚ãªãŸã®åœŸåœ° 水色ï¼ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—所有地 赤色ï¼ä»–äººãŒæ‰€æœ‰ã™ã‚‹åœŸåœ° 黄色 = 売り出ã—ä¸ ç´«è‰²ï¼ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ ç°è‰²ï¼å…¬å…±é ˜åŸŸ"/> <text name="label_parcel_modify"> 区画ã®ç·¨é›† </text> diff --git a/indra/newview/skins/default/xui/ja/floater_top_objects.xml b/indra/newview/skins/default/xui/ja/floater_top_objects.xml index 86ab64cb3e..69d527a087 100644 --- a/indra/newview/skins/default/xui/ja/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/ja/floater_top_objects.xml @@ -22,7 +22,7 @@ 何も見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ </floater.string> <floater.string name="URLs"> - URL + URL </floater.string> <floater.string name="memory"> メモリ(㎅) @@ -41,7 +41,7 @@ <scroll_list.columns label="メモリ(㎅)" name="memory"/> </scroll_list> <text name="id_text"> - 物体ID: + 物体ID: </text> <button label="標è˜ã‚’表示" name="show_beacon_btn"/> <text name="obj_name_text"> diff --git a/indra/newview/skins/default/xui/ja/floater_translation_settings.xml b/indra/newview/skins/default/xui/ja/floater_translation_settings.xml index 8bbcbcdfed..dbe5c3007a 100644 --- a/indra/newview/skins/default/xui/ja/floater_translation_settings.xml +++ b/indra/newview/skins/default/xui/ja/floater_translation_settings.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_translation_settings" title="ãƒãƒ£ãƒƒãƒˆã®ç¿»è¨³è¨å®š"> <string name="azure_api_key_not_verified"> - Azureサービスè˜åˆ¥åã®èªè¨¼ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ステータス:[STATUS] è¨å®šã‚’ãŠç¢ºã‹ã‚ã®ä¸Šã€ã‚‚ã†ä¸€åº¦ã‚„り直ã—ã¦ãã ã•ã„。 + Azureサービスè˜åˆ¥åã®èªè¨¼ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ステータス:[STATUS] è¨å®šã‚’ãŠç¢ºã‹ã‚ã®ä¸Šã€ã‚‚ã†ä¸€åº¦ã‚„り直ã—ã¦ãã ã•ã„。 </string> <string name="google_api_key_not_verified"> - Google APIã‚ーã®èªè¨¼ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ステータス:[STATUS] è¨å®šã‚’ãŠç¢ºã‹ã‚ã®ä¸Šã€ã‚‚ã†ä¸€åº¦ã‚„り直ã—ã¦ãã ã•ã„。 + Google APIã‚ーã®èªè¨¼ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ステータス:[STATUS] è¨å®šã‚’ãŠç¢ºã‹ã‚ã®ä¸Šã€ã‚‚ã†ä¸€åº¦ã‚„り直ã—ã¦ãã ã•ã„。 </string> <string name="deepl_api_key_not_verified"> - DeepL Authã‚ーã®èªè¨¼ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ステータス:[STATUS] è¨å®šã‚’ãŠç¢ºã‹ã‚ã®ä¸Šã€ã‚‚ã†ä¸€åº¦ã‚„り直ã—ã¦ãã ã•ã„。 + DeepL Authã‚ーã®èªè¨¼ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ステータス:[STATUS] è¨å®šã‚’ãŠç¢ºã‹ã‚ã®ä¸Šã€ã‚‚ã†ä¸€åº¦ã‚„り直ã—ã¦ãã ã•ã„。 </string> <string name="azure_api_key_verified"> Azureサービスè˜åˆ¥åãŒèªè¨¼ã•れã¾ã—ãŸã€‚ diff --git a/indra/newview/skins/default/xui/ja/floater_ui_preview.xml b/indra/newview/skins/default/xui/ja/floater_ui_preview.xml index b907b4e8d7..c3d70e7055 100644 --- a/indra/newview/skins/default/xui/ja/floater_ui_preview.xml +++ b/indra/newview/skins/default/xui/ja/floater_ui_preview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="gui_preview_tool" title="XUIプレビューツール"> +<floater name="gui_preview_tool" title="XUIプレビューツール"> <string name="ExternalEditorNotSet"> 環境変数LL_XUI_EDITORã¾ãŸã¯ExternalEditorè¨å®šã‚’è¨å®šã™ã‚‹ã‹ã€[EDITOR PATH]フィールドã«ãã®ãƒ‘スを指定ã—ã¦ã€ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ã‚’é¸æŠžã—ã¾ã™ã€‚ </string> @@ -10,11 +10,11 @@ <combo_box name="language_select_combo"> <combo_box.item label="ja" name="item1" value="ja"/> </combo_box> - <button label="表示" label_selected="表示" name="display_floater" tool_tip="é¸æŠžã—ãŸï¼¸ï¼ï¼¬ãƒ•ァイルã§å®šç¾©ã•れãŸï¼¸ï¼µï¼©ãƒ•ãƒãƒ¼ã‚¿ã‚’表示ã—ã¾ã™ã€‚"/> + <button label="表示" label_selected="表示" name="display_floater" tool_tip="é¸æŠžã—ãŸXMLファイルã§å®šç¾©ã•れãŸXUIフãƒãƒ¼ã‚¿ã‚’表示ã—ã¾ã™ã€‚"/> <button label="éžè¡¨ç¤º" label_selected="éžè¡¨ç¤º" name="close_displayed_floater" tool_tip="ç¾åœ¨è¡¨ç¤ºã•れã¦ã„るフãƒãƒ¼ã‚¿ãƒ¼ãŒå˜åœ¨ã™ã‚‹å ´åˆã¯ã€ãれを閉ã˜ã¾ã™ã€‚"/> - <button label="編集…" label_selected="編集…" name="edit_floater" tool_tip="é¸æŠžã—ãŸï¼¸ï¼ï¼¬ãƒ•ァイルã«ã‚ˆã£ã¦å®šç¾©ã•れãŸï¼¸ï¼µï¼©ãƒ•ãƒãƒ¼ã‚¿ãƒ¼ã‚’編集ã—ã¾ã™ã€‚(外部エディターを開ãã¾ã™ï¼‰ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚ºã•れãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå˜åœ¨ã—ãªã„å ´åˆã¯ã€enãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’é–‹ãã¾ã™ã€‚"/> - <button label="ä¿å˜" label_selected="ä¿å˜" name="save_floater" tool_tip="é¸æŠžã—ãŸï¼¸ï¼ï¼¬ãƒ•ァイルã§å®šç¾©ã•れãŸï¼¸ï¼µï¼©ãƒ•ãƒãƒ¼ã‚¿ã‚’ä¿å˜ã—ã¾ã™ã€‚"/> - <button label="å…¨ã¦ä¿å˜" label_selected="å…¨ã¦ä¿å˜" name="save_all_floaters" tool_tip="é¸æŠžã—ãŸè¨€èªžã§å®šç¾©ã•れãŸã™ã¹ã¦ã®ï¼¸ï¼µï¼©ãƒ•ãƒãƒ¼ã‚¿ã‚’ä¿å˜ã—ã¾ã™ã€‚"/> + <button label="編集…" label_selected="編集…" name="edit_floater" tool_tip="é¸æŠžã—ãŸXMLファイルã«ã‚ˆã£ã¦å®šç¾©ã•れãŸXUIフãƒãƒ¼ã‚¿ãƒ¼ã‚’編集ã—ã¾ã™ã€‚(外部エディターを開ãã¾ã™ï¼‰ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚ºã•れãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå˜åœ¨ã—ãªã„å ´åˆã¯ã€enãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’é–‹ãã¾ã™ã€‚"/> + <button label="ä¿å˜" label_selected="ä¿å˜" name="save_floater" tool_tip="é¸æŠžã—ãŸXMLファイルã§å®šç¾©ã•れãŸXUIフãƒãƒ¼ã‚¿ã‚’ä¿å˜ã—ã¾ã™ã€‚"/> + <button label="å…¨ã¦ä¿å˜" label_selected="å…¨ã¦ä¿å˜" name="save_all_floaters" tool_tip="é¸æŠžã—ãŸè¨€èªžã§å®šç¾©ã•れãŸã™ã¹ã¦ã®XUIフãƒãƒ¼ã‚¿ã‚’ä¿å˜ã—ã¾ã™ã€‚"/> <button label="≫" label_selected="≪" name="toggle_overlap_panel" tool_tip="é‡ãªã£ã¦ã„ã‚‹è¦ç´ ã®å¼·èª¿è¡¨ç¤ºã¨è¡¨ç¤ºãƒ‘ãƒãƒ«ã‚’切り替ãˆã¾ã™ã€‚è¦ç´ ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€ã“ã®æ©Ÿèƒ½ç”¨ã«é¸æŠžã—ã¾ã™ã€‚é¸æŠžã—ãŸè¦ç´ ã¯ã€èµ¤ã„四角形ã§ãƒžãƒ¼ã‚¯ã•れã¾ã™ã€‚"/> <text name="select_language_label_2"> 二次言語: @@ -22,7 +22,7 @@ <combo_box name="language_select_combo_2"> <combo_box.item label="en" name="item1" value="en"/> </combo_box> - <button label="表示" name="display_floater_2" tool_tip="é¸æŠžã—ãŸï¼¸ï¼ï¼¬ãƒ•ァイルã§å®šç¾©ã•れãŸï¼¸ï¼µï¼©ãƒ•ãƒãƒ¼ã‚¿ã‚’表示ã—ã¾ã™ã€‚"/> + <button label="表示" name="display_floater_2" tool_tip="é¸æŠžã—ãŸXMLファイルã§å®šç¾©ã•れãŸXUIフãƒãƒ¼ã‚¿ã‚’表示ã—ã¾ã™ã€‚"/> <button enabled="false" label="éžè¡¨ç¤º" name="close_displayed_floater_2" tool_tip="ç¾åœ¨è¡¨ç¤ºã•れã¦ã„るフãƒãƒ¼ã‚¿ãƒ¼ãŒå˜åœ¨ã™ã‚‹å ´åˆã¯ã€ãれを閉ã˜ã¾ã™ã€‚"/> <button label="スã‚ーマをエクスãƒãƒ¼ãƒˆ" name="export_schema"/> <check_box label="四角形を表示" name="show_rectangles"/> @@ -35,8 +35,8 @@ <text name="editor_path_label"> エディタã®ãƒ‘ス: </text> - <line_editor name="executable_path_field" tool_tip="フãƒãƒ¼ã‚¿ãƒ¼ï¼¸ï¼ï¼¬ãƒ•ァイルを編集ã™ã‚‹ãŸã‚ã®ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ï¼ˆå®Ÿè¡Œå¯èƒ½ãƒ•ァイル)ã¸ã®ãƒ•ルパス。(引用符ã¯å¿…è¦ã‚りã¾ã›ã‚“)"/> - <button follows="left|bottom" label="ブラウズ…" label_selected="ブラウズ…" name="browse_for_executable" tool_tip="フãƒãƒ¼ã‚¿ãƒ¼ï¼¸ï¼ï¼¬ãƒ•ァイルを編集ã™ã‚‹ãŸã‚ã®ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ï¼ˆå®Ÿè¡Œå¯èƒ½ãƒ•ァイル)をå‚ç…§ã—ã¾ã™ã€‚"/> + <line_editor name="executable_path_field" tool_tip="フãƒãƒ¼ã‚¿ãƒ¼XMLファイルを編集ã™ã‚‹ãŸã‚ã®ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ï¼ˆå®Ÿè¡Œå¯èƒ½ãƒ•ァイル)ã¸ã®ãƒ•ルパス。(引用符ã¯å¿…è¦ã‚りã¾ã›ã‚“)"/> + <button follows="left|bottom" label="ブラウズ…" label_selected="ブラウズ…" name="browse_for_executable" tool_tip="フãƒãƒ¼ã‚¿ãƒ¼XMLファイルを編集ã™ã‚‹ãŸã‚ã®ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ï¼ˆå®Ÿè¡Œå¯èƒ½ãƒ•ァイル)をå‚ç…§ã—ã¾ã™ã€‚"/> <text name="executable_args_label"> エディタã®å¼•数: </text> @@ -46,7 +46,7 @@ <text name="diff_file_label"> 差分ファイル: </text> - <line_editor name="vlt_diff_path_field" tool_tip="Viewer Localization Toolkitã«ã‚ˆã£ã¦ç”Ÿæˆã•れãŸï¼¸ï¼ï¼¬ã®D0ã€D1言語差分ファイルã¸ã®ãƒ•ルパス"/> + <line_editor name="vlt_diff_path_field" tool_tip="Viewer Localization Toolkitã«ã‚ˆã£ã¦ç”Ÿæˆã•れãŸXMLã®D0ã€D1言語差分ファイルã¸ã®ãƒ•ルパス"/> <button label="ブラウズ…" label_selected="ブラウズ…" name="browse_for_vlt_diffs" tool_tip="VLTã§ç”Ÿæˆã•れãŸD0ã€D1差分ファイルをå‚ç…§ã—ã¦ã€å¤‰æ›´ã•れãŸãƒ•ァイルã¨è¦ç´ を強調表示ã—ã¾ã™ã€‚"/> <button label="差分をãƒã‚¤ãƒ©ã‚¤ãƒˆ" label_selected="ãƒã‚¤ãƒ©ã‚¤ãƒˆã‚’解除" name="toggle_vlt_diff_highlight" tool_tip="変更ã•れãŸè¨€èªžãƒ‡ãƒ¼ã‚¿ã‚’å«ã‚€ãƒ•ァイルã¨è¦ç´ ã®å¼·èª¿è¡¨ç¤ºã‚’切り替ãˆã¾ã™ã€‚"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/floater_url_entry.xml b/indra/newview/skins/default/xui/ja/floater_url_entry.xml index 3ff50854a5..534e0156c5 100644 --- a/indra/newview/skins/default/xui/ja/floater_url_entry.xml +++ b/indra/newview/skins/default/xui/ja/floater_url_entry.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="url_entry"> <text name="media_label"> - メディアURL: + メディアURL: </text> <combo_box name="media_entry"/> <button label="OK" name="ok_btn"/> diff --git a/indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml index be59547bf3..fd8e75da87 100644 --- a/indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml +++ b/indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="whitelist_entry" title="ホワイトリストã®å…¥åŠ›"> <text name="media_label"> - URLã‹ï¼µï¼²ï¼¬ãƒ‘ターンを入力ã—ã¦ã€è¨±å¯ã™ã‚‹ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’リストã«è¿½åŠ ã—ã¾ã™ã€‚ + URLã‹URLパターンを入力ã—ã¦ã€è¨±å¯ã™ã‚‹ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’リストã«è¿½åŠ ã—ã¾ã™ã€‚ </text> - <line_editor name="whitelist_entry" tool_tip="URLã‹ï¼µï¼²ï¼¬ãƒ‘ターンをホワイトリストã«å…¥åŠ›ã—ã¾ã™ã€‚"/> + <line_editor name="whitelist_entry" tool_tip="URLã‹URLパターンをホワイトリストã«å…¥åŠ›ã—ã¾ã™ã€‚"/> <button label="OK" name="ok_btn"/> <button label="ã‚ャンセル" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_other.xml b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml index 284449d59d..87f469f91d 100644 --- a/indra/newview/skins/default/xui/ja/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml @@ -2,7 +2,7 @@ <context_menu name="Avatar Pie"> <menu_item_call label="プãƒãƒ•ィールを見る" name="Profile..."/> <menu_item_call label="フレンドã«è¿½åŠ " name="Add Friend"/> - <menu_item_call label="Iï¼" name="Send IM..."/> + <menu_item_call label="IM" name="Send IM..."/> <menu_item_call label="コール" name="Call"/> <menu_item_call label="ã‚°ãƒ«ãƒ¼ãƒ—ã«æ‹›å¾……" name="Invite..."/> <menu_item_separator/> @@ -14,7 +14,7 @@ <menu_item_call label="フリーズ" name="Freeze..."/> <menu_item_call label="追放" name="Eject..."/> <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/> - <menu_item_call label="Xï¼ï¼¬ã¨ã—ã¦ãƒ€ãƒ³ãƒ—" name="Dump XML"/> + <menu_item_call label="XMLã¨ã—ã¦ãƒ€ãƒ³ãƒ—" name="Dump XML"/> <menu_item_call label="ズームイン" name="Zoom In"/> <menu_item_call label="支払ã†" name="Pay..."/> <menu_item_separator/> diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml index a7989b35c8..0a022d16a1 100644 --- a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml @@ -2,7 +2,7 @@ <context_menu name="Avatar Pie"> <menu_item_call label="プãƒãƒ•ィールを見る" name="Profile..."/> <menu_item_call label="フレンドã«è¿½åŠ " name="Add Friend"/> - <menu_item_call label="Iï¼" name="Send IM..."/> + <menu_item_call label="IM" name="Send IM..."/> <menu_item_call label="コール" name="Call"/> <menu_item_call label="ã‚°ãƒ«ãƒ¼ãƒ—ã¸æ‹›å¾…" name="Invite..."/> <menu_item_separator/> @@ -14,7 +14,7 @@ <menu_item_call label="フリーズ" name="Freeze..."/> <menu_item_call label="追放" name="Eject..."/> <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/> - <menu_item_call label="Xï¼ï¼¬ã¨ã—ã¦ãƒ€ãƒ³ãƒ—" name="Dump XML"/> + <menu_item_call label="XMLã¨ã—ã¦ãƒ€ãƒ³ãƒ—" name="Dump XML"/> <menu_item_call label="ズームイン" name="Zoom In"/> <menu_item_call label="支払ã†" name="Pay..."/> <menu_item_separator/> diff --git a/indra/newview/skins/default/xui/ja/menu_conversation.xml b/indra/newview/skins/default/xui/ja/menu_conversation.xml index 047f5d57cf..163feb5b56 100644 --- a/indra/newview/skins/default/xui/ja/menu_conversation.xml +++ b/indra/newview/skins/default/xui/ja/menu_conversation.xml @@ -5,7 +5,7 @@ <menu_item_call label="ボイスãƒãƒ£ãƒƒãƒˆã‚’切æ–ã™ã‚‹" name="disconnect_from_voice"/> <menu_item_call label="é¸æŠžã—ãŸé …目を閉ã˜ã‚‹" name="close_selected_conversations"/> <menu_item_call label="プãƒãƒ•ィールを表示" name="view_profile"/> - <menu_item_call label="Iï¼" name="im"/> + <menu_item_call label="IM" name="im"/> <menu_item_call label="テレãƒãƒ¼ãƒˆã®ã‚ªãƒ•ァー" name="offer_teleport"/> <menu_item_call label="ボイスコール" name="voice_call"/> <menu_item_call label="ãƒãƒ£ãƒƒãƒˆã®å±¥æ´â€¦" name="chat_history"/> diff --git a/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml index 78c46d13b4..438b0c304b 100644 --- a/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="Conversation Context Menu"> - <menu_item_call label="Iï¼â€¦" name="IM"/> + <menu_item_call label="IM..." name="IM"/> <menu_item_call label="ボイスコール…" name="Call"/> <menu_item_call label="ãƒãƒ£ãƒƒãƒˆã®å±¥æ´ã‚’é–‹ã…" name="Chat history"/> <menu_item_call label="プãƒãƒ•ィールを表示" name="View Profile"/> diff --git a/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml index bcda112d2f..2012eb88cc 100644 --- a/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml @@ -3,5 +3,5 @@ <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_name"/> <menu_item_check label="日付ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_date"/> <menu_item_check label="上ä½ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’ä¸¦ã¹æ›¿ãˆ" name="sort_by_friends"/> - <menu_item_call label="近隣ãƒãƒ£ãƒƒãƒˆã®å±¥æ´ã‚’表示…" name="view_nearby_chat_history"/> + <menu_item_call label="ãƒãƒ£ãƒƒãƒˆå±¥æ´ã‚’表示…" name="view_nearby_chat_history"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml b/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml index e1f24cdb39..3a8fd36ceb 100644 --- a/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml @@ -4,7 +4,7 @@ <menu_item_call label="åå‰å¤‰æ›´" name="rename"/> <menu_item_call label="コピー" name="copy_gesture"/> <menu_item_call label="ペースト" name="paste"/> - <menu_item_call label="UUIDをコピー" name="copy_uuid"/> + <menu_item_call label="UUIDをコピー" name="copy_uuid"/> <menu_item_call label="ç¾åœ¨ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã«ä¿å˜" name="save_to_outfit"/> <menu_item_call label="編集" name="edit_gesture"/> <menu_item_call label="調ã¹ã‚‹" name="inspect"/> diff --git a/indra/newview/skins/default/xui/ja/menu_inventory.xml b/indra/newview/skins/default/xui/ja/menu_inventory.xml index c7cba4845d..d602823fe4 100644 --- a/indra/newview/skins/default/xui/ja/menu_inventory.xml +++ b/indra/newview/skins/default/xui/ja/menu_inventory.xml @@ -82,7 +82,7 @@ <menu_item_call label="オリジナルを開ã" name="Open Original"/> <menu_item_call label="プãƒãƒ‘ティ" name="Properties"/> <menu_item_call label="åå‰ã‚’変更" name="Rename"/> - <menu_item_call label="アセットã®ï¼µï¼µï¼©ï¼¤ã‚’コピー" name="Copy Asset UUID"/> + <menu_item_call label="アセットã®UUIDをコピー" name="Copy Asset UUID"/> <menu_item_call label="メインパãƒãƒ«ã§è¡¨ç¤º" name="Show in Main Panel"/> <menu_item_call label="カット" name="Cut"/> <menu_item_call label="コピー" name="Copy"/> @@ -113,7 +113,7 @@ <menu_item_separator name="Wearable And Object Separator"/> <menu_item_call label="装ç€" name="Wearable And Object Wear"/> <menu label="装ç€å…ˆ" name="Attach To"/> - <menu label="HUD 装ç€å…ˆ" name="Attach To HUD"/> + <menu label="HUDã®è£…ç€å…ˆ" name="Attach To HUD"/> <menu_item_call label="触る" name="Attachment Touch"/> <menu_item_call label="編集" name="Wearable Edit"/> <menu_item_call label="è¿½åŠ " name="Wearable Add"/> diff --git a/indra/newview/skins/default/xui/ja/menu_participant_list.xml b/indra/newview/skins/default/xui/ja/menu_participant_list.xml index ebce5f7e6b..5756e3f8b5 100644 --- a/indra/newview/skins/default/xui/ja/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/ja/menu_participant_list.xml @@ -4,7 +4,7 @@ <menu_item_check label="最近ã®ç™ºè¨€è€…ã§ä¸¦ã¹æ›¿ãˆ" name="SortByRecentSpeakers"/> <menu_item_call label="プãƒãƒ•ィールã®è¡¨ç¤º" name="View Profile"/> <menu_item_call label="フレンド登録" name="Add Friend"/> - <menu_item_call label="Iï¼" name="IM"/> + <menu_item_call label="IM" name="IM"/> <menu_item_call label="コール" name="Call"/> <menu_item_call label="共有" name="Share"/> <menu_item_call label="支払ã†" name="Pay"/> diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml index bbe842a37e..13c940abf4 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> <menu_item_call label="プãƒãƒ•ィールを表示" name="view_profile"/> - <menu_item_call label="Iï¼" name="im"/> + <menu_item_call label="IM" name="im"/> <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="offer_teleport"/> <menu_item_call label="ボイスコール" name="voice_call"/> <menu_item_call label="ãƒãƒ£ãƒƒãƒˆã®å±¥æ´ã‚’表示…" name="chat_history"/> diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml index 4e3dbd3279..e8b8f0f694 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml @@ -2,7 +2,7 @@ <context_menu name="Multi-Selected People Context Menu"> <menu_item_call label="フレンド登録" name="add_friends"/> <menu_item_call label="フレンドを削除" name="remove_friends"/> - <menu_item_call label="Iï¼" name="im"/> + <menu_item_call label="IM" name="im"/> <menu_item_call label="コール" name="call"/> <menu_item_call label="共有" name="share"/> <menu_item_call label="支払ã„" name="pay"/> diff --git a/indra/newview/skins/default/xui/ja/menu_profile_other.xml b/indra/newview/skins/default/xui/ja/menu_profile_other.xml index 0247a60803..9803735afc 100644 --- a/indra/newview/skins/default/xui/ja/menu_profile_other.xml +++ b/indra/newview/skins/default/xui/ja/menu_profile_other.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="Avatar Profile Menu"> - <menu_item_call label="Iï¼" name="im"/> + <menu_item_call label="IM" name="im"/> <menu_item_call label="テレãƒãƒ¼ãƒˆã®ã‚ªãƒ•ァー" name="offer_teleport"/> <menu_item_call label="テレãƒãƒ¼ãƒˆã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆ" name="request_teleport"/> <menu_item_call label="ボイスコール" name="voice_call"/> @@ -19,5 +19,5 @@ <menu_item_separator name="separator_copy_options"/> <menu_item_call label="表示åをコピー" name="copy_display_name"/> <menu_item_call label="エージェントåをコピー" name="copy_name"/> - <menu_item_call label="エージェントIDをコピー" name="copy_id"/> + <menu_item_call label="エージェントIDをコピー" name="copy_id"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_profile_self.xml b/indra/newview/skins/default/xui/ja/menu_profile_self.xml index 7c9570378e..f39593e417 100644 --- a/indra/newview/skins/default/xui/ja/menu_profile_self.xml +++ b/indra/newview/skins/default/xui/ja/menu_profile_self.xml @@ -8,5 +8,5 @@ <menu_item_separator name="separator_copy_options"/> <menu_item_call label="表示åをコピー" name="copy_display_name"/> <menu_item_call label="エージェントåをコピー" name="copy_name"/> - <menu_item_call label="エージェントIDをコピー" name="copy_id"/> + <menu_item_call label="エージェントIDをコピー" name="copy_id"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_settings_gear.xml b/indra/newview/skins/default/xui/ja/menu_settings_gear.xml index a8ff0d3721..3f5d30073b 100644 --- a/indra/newview/skins/default/xui/ja/menu_settings_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_settings_gear.xml @@ -6,5 +6,5 @@ <menu_item_call label="リージョン(地域)ã«é©ç”¨" name="Settings Apply Region"/> <menu_item_call label="コピー" name="copy_settings"/> <menu_item_call label="ペースト" name="paste_settings"/> - <menu_item_call label="UUIDをコピー" name="copy_uuid"/> + <menu_item_call label="UUIDをコピー" name="copy_uuid"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_slurl.xml b/indra/newview/skins/default/xui/ja/menu_slurl.xml index 820cc3cd53..e68128e429 100644 --- a/indra/newview/skins/default/xui/ja/menu_slurl.xml +++ b/indra/newview/skins/default/xui/ja/menu_slurl.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="Popup"> - <menu_item_call label="URLã«ã¤ã„ã¦" name="about_url"/> - <menu_item_call label="URLã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹" name="teleport_to_url"/> + <menu_item_call label="URLã«ã¤ã„ã¦" name="about_url"/> + <menu_item_call label="URLã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹" name="teleport_to_url"/> <menu_item_call label="マップ" name="show_on_map"/> </menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_agent.xml b/indra/newview/skins/default/xui/ja/menu_url_agent.xml index 9ce9a070f2..d06f4896b2 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_agent.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> <menu_item_call label="プãƒãƒ•ィールを表示" name="show_agent"/> - <menu_item_call label="Iï¼ã‚’é€ä¿¡â€¦" name="send_im"/> + <menu_item_call label="IMã‚’é€ä¿¡â€¦" name="send_im"/> <menu_item_call label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ â€¦" name="add_friend"/> <menu_item_call label="フレンドを削除…" name="remove_friend"/> <menu_item_call label="嫌ãŒã‚‰ã›ã®å ±å‘Š" name="report_abuse"/> diff --git a/indra/newview/skins/default/xui/ja/menu_url_http.xml b/indra/newview/skins/default/xui/ja/menu_url_http.xml index ae97e8bd8d..c3da8a8686 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_http.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_http.xml @@ -3,5 +3,5 @@ <menu_item_call label="Web ページを開ã" name="url_open"/> <menu_item_call label="内蔵ブラウザã§é–‹ã" name="url_open_internal"/> <menu_item_call label="外部ブラウザã§é–‹ã" name="url_open_external"/> - <menu_item_call label="URLをクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> + <menu_item_call label="URLをクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml index f6b10bb121..41df8fdbb1 100644 --- a/indra/newview/skins/default/xui/ja/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml @@ -17,7 +17,7 @@ <menu_item_call label="アカウントã®ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰â€¦" name="Manage My Account"/> <menu_item_call label="[Membership]" name="Membership"/> <menu_item_separator/> - <menu_item_call label="åˆæœŸè¨å®šâ€¦" name="Preferences"/> + <menu_item_call label="環境è¨å®šâ€¦" name="Preferences"/> <menu_item_call label="ツールãƒãƒ¼ã®ãƒœã‚¿ãƒ³â€¦" name="Toolbars"/> <menu_item_call label="å…¨ã¦ã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’éš ã™" name="Hide UI" shortcut="control|shift|U"/> <menu_item_check label="HUDを表示" name="Show HUD Attachments" shortcut="alt|shift|H"/> @@ -47,7 +47,7 @@ <menu_item_separator/> <menu_item_call label="ã™ã¹ã¦ã®æœè£…" name="All Clothes"/> </menu> - <menu label="HUD" name="Avatar Detach HUD"/> + <menu label="HUD" name="Avatar Detach HUD"/> <menu label="å–り外ã™" name="Avatar Detach"/> <menu_item_call label="å…¨ã¦ã‚’å–り外ã™" name="Detach All"/> </menu> @@ -70,7 +70,7 @@ </menu> <menu label="コミュニケーション" name="Communicate"> <menu_item_check label="会話…" name="Conversations"/> - <menu_item_check label="近隣ã®ãƒãƒ£ãƒƒãƒˆâ€¦" name="Nearby Chat"/> + <menu_item_check label="周辺ãƒãƒ£ãƒƒãƒˆâ€¦" name="Nearby Chat"/> <menu_item_check label="ボイスãƒãƒ£ãƒƒãƒˆ" name="Speak"/> <menu_item_check name="Conversation Log..." label="会話ãƒã‚°â€¦"/> <menu_item_separator/> @@ -95,7 +95,7 @@ <menu_item_call label="ç¾åœ¨åœ°ã‚’ホームã«è¨å®š" name="Set Home to Here"/> <menu_item_separator/> <menu_item_call label="スナップショット" name="Take Snapshot"/> - <menu_item_call label="36ï¼åº¦ã‚¹ãƒŠãƒƒãƒ—ショット" name="Capture 360"/> + <menu_item_call label="360度スナップショット" name="Capture 360"/> <menu_item_separator/> <menu_item_call label="å ´æ‰€ã®ãƒ—ãƒãƒ•ィール" name="Place Profile"/> <menu_item_call label="åœŸåœ°æƒ…å ±" name="About Land"/> @@ -112,14 +112,14 @@ <menu_item_check label="座標" name="Coordinates"/> <menu_item_check label="区画ã®ãƒ—ãƒãƒ‘ティ" name="Parcel Properties"/> <menu_item_separator/> - <menu_item_check label="拡張メニュー" name="Show Advanced Menu"/> + <menu_item_check label="アドãƒãƒ³ã‚¹ãƒ¡ãƒ‹ãƒ¥ãƒ¼" name="Show Advanced Menu"/> </menu> <menu_item_check label="ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯æ€§èƒ½ã®æœ€é©åŒ–…" name="Performance"/> <menu_item_separator/> <menu label="環境" name="Environment"> - <menu_item_check label="夜明ã‘" name="Sunrise"/> + <menu_item_check label="æ—¥ã®å‡º" name="Sunrise"/> <menu_item_check label="æ£åˆ" name="Noon"/> - <menu_item_check label="夕方" name="Sunset"/> + <menu_item_check label="日没" name="Sunset"/> <menu_item_check label="深夜" name="Midnight"/> <menu_item_check label="共有ã•れãŸç’°å¢ƒã‚’使用" name="Use Shared Environment"/> <menu_item_separator/> @@ -188,7 +188,7 @@ <menu_item_check label="é¸æŠžãƒ“ãƒ¼ãƒ ã‚’è¡¨ç¤ºã™ã‚‹" name="Show Selection Beam"/> <menu_item_separator/> <menu_item_check label="グリッドå¸ç€" name="Snap to Grid"/> - <menu_item_call label="オブジェクトã®ï¼¸ï¼¹è»¸ã‚’グリッドã«å¸ç€" name="Snap Object XY to Grid"/> + <menu_item_call label="オブジェクトã®XY軸をグリッドã«å¸ç€" name="Snap Object XY to Grid"/> <menu_item_call label="é¸æŠžã‚’ã‚°ãƒªãƒƒãƒ‰ã«ä½¿ç”¨ã™ã‚‹" name="Use Selection for Grid"/> <menu_item_separator/> <menu_item_call label="グリッドオプション…" name="Grid Options"/> @@ -221,9 +221,9 @@ <menu_item_call label="è¡çªãƒ»ãƒ—ッシュ&打撃" name="Bumps, Pushes &amp; Hits"/> <menu_item_call label="[APP_NAME]ã«ã¤ã„ã¦" name="About Second Life"/> </menu> - <menu label="æ‹¡å¼µ" name="Advanced"> + <menu label="アドãƒãƒ³ã‚¹" name="Advanced"> <menu_item_call label="テクスãƒãƒ£ã‚’リベークã™ã‚‹" name="Rebake Texture"/> - <menu_item_call label="UIサイズをデフォルトã«ã™ã‚‹" name="Set UI Size to Default"/> + <menu_item_call label="UIサイズをデフォルトã«ã™ã‚‹" name="Set UI Size to Default"/> <menu_item_call label="ウィンドウサイズè¨å®šâ€¦" name="Set Window Size..."/> <menu_item_separator/> <menu_item_check label="オブジェクトã®é¸æŠžè·é›¢ã®åˆ¶é™" name="Limit Select Distance"/> @@ -233,7 +233,7 @@ <menu_item_check label="スナップショットをディスクã«ä¿å˜" name="QuietSnapshotsToDisk"/> <menu_item_separator/> <menu label="パフォーマンスツール" name="Performance Tools"> - <menu_item_call label="é…延メーター" name="Lag Meter"/> + <menu_item_call label="ラグメーター" name="Lag Meter"/> <menu_item_check label="統計ãƒãƒ¼" name="Statistics Bar"/> <menu_item_call label="ã‚·ãƒ¼ãƒ³è² è·ã®çµ±è¨ˆæƒ…å ±" name="Scene Load Statistics"/> <menu_item_check label="ã‚¢ãƒã‚¿ãƒ¼ã®è¤‡é›‘度を表示" name="Avatar Draw Info"/> @@ -262,7 +262,7 @@ <menu_item_check label="è¡çª" name="Rendering Type Bump"/> </menu> <menu label="レンダリング機能" name="Rendering Features"> - <menu_item_check label="UI" name="ToggleUI"/> + <menu_item_check label="UI" name="ToggleUI"/> <menu_item_check label="é¸æŠžæ¸ˆ" name="Selected"/> <menu_item_check label="ãƒã‚¤ãƒ©ã‚¤ãƒˆ" name="Highlighted"/> <menu_item_check label="動的テクスãƒãƒ£" name="Dynamic Textures"/> @@ -313,7 +313,7 @@ <menu_item_separator/> <menu_item_check label="カメラ" name="Camera"/> <menu_item_check label="風" name="Wind"/> - <menu_item_check label="FOV" name="FOV"/> + <menu_item_check label="FOV" name="FOV"/> <menu_item_check label="ãƒãƒƒã‚¸" name="Badge"/> </menu> <menu label="æƒ…å ±ã‚’è¡¨ç¤º" name="Display Info"> @@ -352,7 +352,7 @@ </menu> <menu label="ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã®æç”»" name="Render Metadata"> <menu_item_check label="ãƒã‚¦ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãƒœãƒƒã‚¯ã‚¹" name="Bounding Boxes"/> - <menu_item_check label="普通" name="Normals"/> + <menu_item_check label="法線" name="Normals"/> <menu_item_check label="八分木" name="Octree"/> <menu_item_check label="シャドウ円éŒ" name="Shadow Frusta"/> <menu_item_check label="実åƒ" name="Physics Shapes"/> @@ -363,7 +363,7 @@ <menu_item_check label="テクスãƒãƒ£å„ªå…ˆåº¦" name="Texture Priority"/> <menu_item_check label="テクスãƒãƒ£ã®ç¯„囲" name="Texture Area"/> <menu_item_check label="å´é¢" name="Face Area"/> - <menu_item_check label="ï¼¬ï¼¯ï¼¤æƒ…å ±" name="LOD Info"/> + <menu_item_check label="LODæƒ…å ±" name="LOD Info"/> <menu_item_check label="ä¸‰è§’å½¢ã®æ•°" name="Triangle Count"/> <menu_item_check label="制作・ã‚ュー" name="Build Queue"/> <menu_item_check label="å…‰" name="Lights"/> @@ -372,7 +372,7 @@ <menu_item_check label="ジョイント" name="Joints"/> <menu_item_check label="レイã‚ャスト" name="Raycast"/> <menu_item_check label="風ã®ãƒ™ã‚¯ãƒˆãƒ«" name="Wind Vectors"/> - <menu_item_check label="彫刻" name="Sculpt"/> + <menu_item_check label="スカルプト" name="Sculpt"/> <menu label="テクスãƒãƒ£ã®å¯†åº¦" name="Texture Density"> <menu_item_check label="ç„¡ã—" name="None"/> <menu_item_check label="原行" name="Current"/> @@ -389,10 +389,10 @@ <menu_item_check label="オブジェクト間ã®ã‚ªã‚¯ãƒ«ãƒ¼ã‚¸ãƒ§ãƒ³" name="Object-Object Occlusion"/> <menu_item_separator/> <menu_item_check label="高度ãªå…‰æºãƒ¢ãƒ‡ãƒ«" name="Advanced Lighting Model"/> - <menu_item_check label=" 太陽・月・プãƒã‚¸ã‚§ã‚¯ã‚¿ã‹ã‚‰ã®å½±" name="Shadows from Sun/Moon/Projectors"/> - <menu_item_check label=" SSAOã¨å½±ã®ã‚¹ãƒ ージング" name="SSAO and Shadow Smoothing"/> + <menu_item_check label=" 太陽・月・プãƒã‚¸ã‚§ã‚¯ã‚¿ã‹ã‚‰ã®å½±" name="Shadows from Sun/Moon/Projectors"/> + <menu_item_check label=" SSAOã¨å½±ã®ã‚¹ãƒ ージング" name="SSAO and Shadow Smoothing"/> <menu_item_separator/> - <menu_item_check label="次回起動時ã«ï¼§ï¼¬ã‚’デãƒãƒƒã‚°" name="Debug GL"/> + <menu_item_check label="次回起動時ã«GLã®ãƒ‡ãƒãƒƒã‚°ã‚’é–‹å§‹" name="Debug GL"/> <menu_item_check label="パイプラインをデãƒãƒƒã‚°" name="Debug Pipeline"/> <menu_item_check label="自動アルファマスク(é…延)" name="Automatic Alpha Masks (deferred)"/> <menu_item_check label="自動アルファマスク(é…å»¶ãªã—)" name="Automatic Alpha Masks (non-deferred)"/> @@ -439,7 +439,7 @@ <menu_item_call label="リージョンオブジェクトã®ã‚ャッシュをダンプ" name="Dump Region Object Cache"/> <menu_item_call label="関心リスト:フルアップデート" name="Interest List: Full Update"/> </menu> - <menu label="UI" name="UI"> + <menu label="UI" name="UI"> <menu_item_call label="メディアブラウザ" name="Media Browser"/> <menu_item_call label="インベントリã®å‡ºåŠ›" name="Dump Inventory"/> <menu_item_call label="タイマーをダンプ" name="Dump Timers"/> @@ -455,15 +455,15 @@ <menu_item_check label="デãƒãƒƒã‚°ã‚ー" name="Debug Keys"/> <menu_item_check label="WindowProcã®ãƒ‡ãƒãƒƒã‚°" name="Debug WindowProc"/> </menu> - <menu label="XUI" name="XUI"> + <menu label="XUI" name="XUI"> <menu_item_call label="色ã®è¨å®šã‚’リãƒãƒ¼ãƒ‰" name="Reload Color Settings"/> <menu_item_call label="フォントテストを表示" name="Show Font Test"/> - <menu_item_check label="XUIåを表示" name="Show XUI Names"/> - <menu_item_call label="テストIï¼ã‚’é€ä¿¡ã™ã‚‹" name="Send Test IMs"/> + <menu_item_check label="XUIåを表示" name="Show XUI Names"/> + <menu_item_call label="テストIMã‚’é€ä¿¡ã™ã‚‹" name="Send Test IMs"/> <menu_item_call label="åå‰ã‚ャッシュをフラッシュ" name="Flush Names Caches"/> </menu> - <menu label="ã‚¢ãƒã‚¿ãƒ¼" name="Character"> - <menu label="ベークドテクスãƒãƒ£ã‚’å–å¾—ã™ã‚‹" name="Grab Baked Texture"> + <menu label="ã‚ャラクター" name="Character"> + <menu label="ベイク済ã¿ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’å–å¾—ã™ã‚‹" name="Grab Baked Texture"> <menu_item_call label="çž³" name="Grab Iris"/> <menu_item_call label="é " name="Grab Head"/> <menu_item_call label="上åŠèº«" name="Grab Upper Body"/> @@ -488,7 +488,7 @@ <menu_item_check label="見ã¦ã„ã‚‹ã‚‚ã®ã‚’表示ã™ã‚‹" name="Show Look At"/> <menu_item_check label="クリックã—ãŸå ´æ‰€ã‚’表示ã™ã‚‹" name="Show Point At"/> <menu_item_check label="çµåˆéƒ¨ã®ã‚¢ãƒƒãƒ—デートã®ãƒ‡ãƒãƒƒã‚°" name="Debug Joint Updates"/> - <menu_item_check label="LODを無効ã«ã™ã‚‹" name="Disable LOD"/> + <menu_item_check label="LODを無効ã«ã™ã‚‹" name="Disable LOD"/> <menu_item_check label="ã‚ャラクターVisã®ãƒ‡ãƒãƒƒã‚°" name="Debug Character Vis"/> <menu_item_check label="スケルトンã®è¡çªåˆ¤å®šã‚’表示ã™ã‚‹" name="Show Collision Skeleton"/> <menu_item_check label="ボーンを表示" name="Show Bones"/> @@ -499,7 +499,7 @@ <menu_item_call label="ãƒãƒ¼ã‚«ãƒ«ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’ダンプ" name="Dump Local Textures"/> </menu> <menu_item_separator/> - <menu_item_check label="HTTPテスクãƒãƒ£" name="HTTP Textures"/> + <menu_item_check label="HTTPテスクãƒãƒ£" name="HTTP Textures"/> <menu_item_call label="圧縮画åƒ" name="Compress Images"/> <menu_item_call label="圧縮ファイルテスト" name="Compress File Test"/> <menu_item_call label="Visual Leak Detectorを有効ã«ã™ã‚‹" name="Enable Visual Leak Detector"/> @@ -517,14 +517,14 @@ <menu_item_call label="管ç†è€…ステータス解除" name="Leave Admin Options"/> <menu_item_check label="管ç†è€…メニューを表示ã™ã‚‹" name="View Admin Options"/> </menu> - <menu label="管ç†" name="Admin"> + <menu label="管ç†è€…" name="Admin"> <menu label="オブジェクト" name="AdminObject"> <menu_item_call label="コピーをå–ã‚‹" name="Admin Take Copy"/> <menu_item_call label="自分を所有者ã«ã™ã‚‹" name="Force Owner To Me"/> <menu_item_call label="所有者権é™ã®å®Ÿè¡Œ" name="Force Owner Permissive"/> <menu_item_call label="削除" name="Delete"/> <menu_item_call label="ãƒãƒƒã‚¯" name="Lock"/> - <menu_item_call label="アセットã®ï¼©ï¼¤ã‚’å–å¾—" name="Get Assets IDs"/> + <menu_item_call label="アセットã®IDã‚’å–å¾—" name="Get Assets IDs"/> </menu> <menu label="区画" name="Parcel"> <menu_item_call label="自分を所有者ã«ã™ã‚‹" name="Owner To Me"/> diff --git a/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml index 213a554bbd..2c13d50226 100644 --- a/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml +++ b/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml @@ -6,8 +6,8 @@ <menu_item_call label="触る" name="touch"/> <menu_item_call label="脱ã" name="take_off_or_detach"/> <menu_item_call label="å–り外ã™" name="detach"/> - <context_menu label="装ç€ï¼š" name="wearable_attach_to"/> - <context_menu label="HUDã«è£…ç€" name="wearable_attach_to_hud"/> + <context_menu label="装ç€" name="wearable_attach_to"/> + <context_menu label="HUDã«è£…ç€" name="wearable_attach_to_hud"/> <menu_item_call label="å–り外ã™" name="take_off"/> <menu_item_call label="編集" name="edit"/> <menu_item_call label="アイテムã®ãƒ—ãƒãƒ•ィール" name="object_profile"/> diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index 123e95df04..9ec7a0de98 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -451,7 +451,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ã </notification> <notification name="CreateGroupCost">ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—作æˆã«ã‹ã‹ã‚‹è²»ç”¨ï¼šL$ [COST] 一人ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã«ãªã‚‰ãªã„ã®ã§ã€æ°¸ä¹…ã«å‰Šé™¤ã•れã¦ã—ã¾ã„ã¾ã™ã€‚ -48時間以内ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’勧誘ã—ã€å…¥ä¼šã—ã¦ã‚‚らã£ã¦ãã ã•ã„。 +48時間以内ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’勧誘ã—ã€å…¥ä¼šã—ã¦ã‚‚らã£ã¦ãã ã•ã„。 <tag> group </tag> @@ -1260,7 +1260,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ã fail </tag> </notification> - <notification name="SoundFileInvalidTooLong">オーディオファイルãŒé•·ã™ãŽã¾ã™ã€‚(最大1ï¼ç§’): + <notification name="SoundFileInvalidTooLong">オーディオファイルãŒé•·ã™ãŽã¾ã™ã€‚(最大30秒): [FILE] <tag> fail @@ -1411,7 +1411,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ã fail </tag> </notification> - <notification name="invalid_tport">テレãƒãƒ¼ãƒˆã®è©¦è¡Œã¯ï¼‘分間ã«ï¼–回ã¾ã§ã¨åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚1分待ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¦ã¿ã¦ãã ã•ã„。å•題ãŒè§£æ±ºã—ãªã„å ´åˆã¯ã€ãƒã‚°ã‚¤ãƒ³ã—ç›´ã—ã¦ãã ã•ã„。 + <notification name="invalid_tport">テレãƒãƒ¼ãƒˆã®è©¦è¡Œã¯1分間ã«6回ã¾ã§ã¨åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚1分待ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¦ã¿ã¦ãã ã•ã„。å•題ãŒè§£æ±ºã—ãªã„å ´åˆã¯ã€ãƒã‚°ã‚¤ãƒ³ã—ç›´ã—ã¦ãã ã•ã„。 <tag> fail </tag> @@ -1735,7 +1735,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ã </tag> </notification> <notification name="YouHaveBeenLoggedOut">ã—ã¾ã£ãŸã€[SECOND_LIFE]ã‹ã‚‰ãƒã‚°ã‚¢ã‚¦ãƒˆã•れã¦ã—ã¾ã„ã¾ã—ãŸã€‚[MESSAGE] - <usetemplate name="okcancelbuttons" notext="終了" yestext="Iï¼ã§ãƒãƒ£ãƒƒãƒˆ"/> + <usetemplate name="okcancelbuttons" notext="終了" yestext="IM & ãƒãƒ£ãƒƒãƒˆã‚’見る"/> </notification> <notification name="InventoryUnusable">インベントリã®èªã¿è¾¼ã¿ä¸ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã¾ãšã€ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã¦å†åº¦ãƒã‚°ã‚¤ãƒ³ã—ç›´ã—ã¦ã¿ã¦ãã ã•ã„。 ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå†åº¦è¡¨ç¤ºã•ã‚Œã‚‹å ´åˆã¯ã€ã‚µãƒãƒ¼ãƒˆã«é€£çµ¡ã—ã¦å•題を解決ã—ã¦ãã ã•ã„。 @@ -2126,7 +2126,7 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries HUDComplexityWarning </context> </unique> - <usetemplate ignoretext="HUDãŒè¤‡é›‘ã™ãŽã‚‹å ´åˆã®è¦å‘Š" name="notifyignore"/> + <usetemplate ignoretext="HUDãŒè¤‡é›‘ã™ãŽã‚‹å ´åˆã®è¦å‘Š" name="notifyignore"/> </notification> <notification name="FirstRun">[APP_NAME]ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãŒå®Œäº†ã—ã¾ã—ãŸã€‚ [SECOND_LIFE]を使ã£ãŸã“ã¨ãŒãªã„å ´åˆã¯ã€ãƒã‚°ã‚¤ãƒ³ã™ã‚‹å‰ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ä½œæˆã‚’行ã£ã¦ãã ã•ã„。 @@ -2162,7 +2162,7 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries </form> </notification> <notification name="WelcomeChooseSex">ã¾ã‚‚ãªãã€ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ãŒè¡¨ç¤ºã•れã¾ã™ã€‚矢å°ã‚ーを使用ã—ã¦æ©ãã¾ã™ã€‚ -ヘルプãŒå¿…è¦ãªã¨ãã‚„ã€[SECOND_LIFE]ã«ã¤ã„ã¦çŸ¥ã‚ŠãŸã„ã¨ãã¯ã€ï¼¦ï¼‘ã‚ーを押ã—ã¦ãã ã•ã„。 +ヘルプãŒå¿…è¦ãªã¨ãã‚„ã€[SECOND_LIFE]ã«ã¤ã„ã¦çŸ¥ã‚ŠãŸã„ã¨ãã¯ã€F1ã‚ーを押ã—ã¦ãã ã•ã„。 男性ã‚ã‚‹ã„ã¯å¥³æ€§ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„。ã“ã®è¨å®šã¯å¾Œã§å¤‰æ›´ã§ãã¾ã™ã€‚ <tag> confirm @@ -2189,8 +2189,8 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries 発行元:[ISSUER_NAME_STRING] 有効日:[VALID_FROM] æ¬¡ã®æ›´æ–°æ—¥ï¼š[VALID_TO] -ï¼ï¼¤ï¼•フィンガープリント:[SHA1_DIGEST] -SHA1フィンガープリント:[MD5_DIGEST] +MD5フィンガープリント:[SHA1_DIGEST] +SHA1フィンガープリント:[MD5_DIGEST] ã‚ー使用法:[KEYUSAGE] æ‹¡å¼µã‚ー使用法:[EXTENDEDKEYUSAGE] サブジェクトã‚ーèªè˜åˆ¥å:[SUBJECTKEYIDENTIFIER] @@ -2201,15 +2201,15 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries </notification> <notification name="TrustCertificateError">ã“ã®ã‚µãƒ¼ãƒãƒ¼ã®èªè¨¼æ©Ÿé–¢ã¯ä¸æ˜Žã§ã™ã€‚ èªè¨¼æƒ…å ±ï¼š - サブジェクトå:[SUBJECT_NAME_STRING] - 発行元:[ISSUER_NAME_STRING] - 有効日:[VALID_FROM] -ã€€æ¬¡ã®æ›´æ–°æ—¥ï¼š[VALID_TO] - ï¼ï¼¤ï¼•フィンガープリント:[SHA1_DIGEST] - SHA1フィンガープリント:[MD5_DIGEST] - ã‚ー使用法:[KEYUSAGE] - 拡張ã‚ー使用法:[EXTENDEDKEYUSAGE] - サブジェクトã‚ーèªè˜åˆ¥å:[SUBJECTKEYIDENTIFIER] +サブジェクトå:[SUBJECT_NAME_STRING] +発行元:[ISSUER_NAME_STRING] +有効日:[VALID_FROM] +æ¬¡ã®æ›´æ–°æ—¥ï¼š[VALID_TO] +MD5フィンガープリント:[SHA1_DIGEST] +SHA1フィンガープリント:[MD5_DIGEST] +ã‚ー使用法:[KEYUSAGE] +æ‹¡å¼µã‚ー使用法:[EXTENDEDKEYUSAGE] +サブジェクトã‚ーèªè˜åˆ¥å:[SUBJECTKEYIDENTIFIER] ã“ã®èªè¨¼å±€ã‚’ä¿¡é ¼ã—ã¾ã™ã‹ï¼Ÿ <tag> @@ -2232,7 +2232,7 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries [NAME]ã¯ã€ã‚ªãƒ–ジェクトを編集ã™ã‚‹æ¨©é™ã‚’å–り消ã•れã¾ã—ãŸã€‚ </notification> <notification name="FlushMapVisibilityCaches">ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒžãƒƒãƒ—ã®ã‚ャッシュを消去ã—ã¾ã™ã€‚デãƒãƒƒã‚°ç›®çš„ã®ã¿ã«ä¾¿åˆ©ãªæ“作ã§ã™ã€‚ -(作æˆä¸ã¯ï¼•分経éŽã™ã‚‹ã¨ã€å…¨å“¡ã®ãƒžãƒƒãƒ—ãŒå†åº¦ãƒã‚°ã‚¤ãƒ³å¾Œã«æ›´æ–°ã•れã¾ã™ï¼‰ +(作æˆä¸ã¯5分経éŽã™ã‚‹ã¨ã€å…¨å“¡ã®ãƒžãƒƒãƒ—ãŒå†åº¦ãƒã‚°ã‚¤ãƒ³å¾Œã«æ›´æ–°ã•れã¾ã™ï¼‰ <tag> fail </tag> @@ -2281,7 +2281,7 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries テクスãƒãƒ£ã¯ã€24ビットã®512✕512以下ã®ç”»åƒã‚’é¸æŠžã—ã€ã€Œé©ç”¨ã€ãƒœã‚¿ãƒ³ã‚’å†åº¦ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。 </notification> <notification name="RawUploadStarted"> - アップãƒãƒ¼ãƒ‰ã‚’é–‹å§‹ã—ã¾ã—ãŸã€‚接続速度ã«ã‚ˆã£ã¦ã¯ã€æœ€å¤§ï¼’分程度ã‹ã‹ã‚Šã¾ã™ã€‚ + アップãƒãƒ¼ãƒ‰ã‚’é–‹å§‹ã—ã¾ã—ãŸã€‚接続速度ã«ã‚ˆã£ã¦ã¯ã€æœ€å¤§2分程度ã‹ã‹ã‚Šã¾ã™ã€‚ </notification> <notification name="ConfirmBakeTerrain">ç¾åœ¨ã®åœ°å½¢ã‚’構築ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ã“ã®æ“作を行ã†ã¨ç¾åœ¨ã®åœ°å½¢ãŒã€åœŸåœ°ã®éš†èµ·ã¨æ²ˆé™ã®åˆ¶é™ç¯„囲ã®åŸºæº–ã¨ãªã‚Šã€ã€Œå¾©å…ƒã€ãƒ„ールã®ãƒ‡ãƒ•ォルトã«ãªã‚Šã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ <tag> @@ -2606,7 +2606,7 @@ OKをクリックã—ã¦ã€ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã¨ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’é–‹å§‹ã—ã¾ </tag> <form name="form"> <input name="message"> - ã‚ãªãŸã¯ãƒ•リーズã•れã¦ã„ã¾ã™ã€‚å‹•ãã“ã¨ã‚‚ãƒãƒ£ãƒƒãƒˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。管ç†è€…ãŒï¼©ï¼ã§ã‚ãªãŸã«é€£çµ¡ã—ã¾ã™ã€‚ + ã‚ãªãŸã¯ãƒ•リーズã•れã¦ã„ã¾ã™ã€‚å‹•ãã“ã¨ã‚‚ãƒãƒ£ãƒƒãƒˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。管ç†è€…ãŒIMã§ã‚ãªãŸã«é€£çµ¡ã—ã¾ã™ã€‚ </input> <button name="OK" text="OK"/> <button name="Cancel" text="ã‚ャンセル"/> @@ -3150,19 +3150,19 @@ https://community.secondlife.com/knowledgebase/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83 fail </tag> </notification> - <notification name="UnableToLoadNotecardAsset">ç¾åœ¨ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®ã‚¢ã‚»ãƒƒãƒˆï¼©ï¼¤ã‚’èªã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 + <notification name="UnableToLoadNotecardAsset">ç¾åœ¨ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®ã‚¢ã‚»ãƒƒãƒˆIDã‚’èªã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 <tag> fail </tag> <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="NotAllowedToViewNotecard">è¦æ±‚ã—ãŸã‚¢ã‚»ãƒƒãƒˆï¼©ï¼¤ã«é–¢ã™ã‚‹ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’閲覧ã™ã‚‹ã«ã¯ã€æ¨©é™ãŒä¸å分ã§ã™ã€‚ + <notification name="NotAllowedToViewNotecard">è¦æ±‚ã—ãŸã‚¢ã‚»ãƒƒãƒˆIDã«é–¢ã™ã‚‹ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’閲覧ã™ã‚‹ã«ã¯ã€æ¨©é™ãŒä¸å分ã§ã™ã€‚ <tag> fail </tag> <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="MissingNotecardAssetID">ノートカード用ã®ã‚¢ã‚»ãƒƒãƒˆï¼©ï¼¤ãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“。 + <notification name="MissingNotecardAssetID">ノートカード用ã®ã‚¢ã‚»ãƒƒãƒˆIDãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“。 <tag> fail </tag> @@ -3189,7 +3189,7 @@ https://community.secondlife.com/knowledgebase/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83 </tag> <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> - <notification label="å†èµ·å‹•を確èª" name="ConfirmRestart">ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã‚’2分後ã«å†èµ·å‹•ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ã“ã®ã¾ã¾ç¶šã‘ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ + <notification label="å†èµ·å‹•を確èª" name="ConfirmRestart">ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã‚’2分後ã«å†èµ·å‹•ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ã“ã®ã¾ã¾ç¶šã‘ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ <tag> confirm </tag> @@ -3489,7 +3489,7 @@ https://community.secondlife.com/knowledgebase/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83 ⑴嫌ãŒã‚‰ã›ã®å ±å‘Šã®æ‰‹é †ã€‚å±…ä½è€…ãŒã€[SECOND_LIFE]権é™ã‚·ã‚¹ãƒ†ãƒ を悪用ã—ã¦ã„ã‚‹ã¨æ€ã‚ã‚Œã‚‹å ´åˆï¼ˆãŸã¨ãˆã°ã€CopyBotã¾ãŸã¯åŒæ§˜ã®ã‚³ãƒ”ーツールを使用ã—ã¦ã€çŸ¥çš„財産権を侵害ã—ã¦ã„ã‚‹ã¨æ€ã‚ã‚Œã‚‹å ´åˆï¼‰ã¯ã€ä¸æ£ä½¿ç”¨å ±å‘Šã‚’æå‡ºã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚䏿£è¡Œç‚ºãƒãƒ¼ãƒ ã¯ã€[SECOND_LIFE][http://secondlife.com/corporate/tos.php 利用è¦ç´„]ã‚„ã€[http://jp.secondlife.com/corporate/cs.php コミュニティ・スタンダード]ã«é•åã™ã‚‹è¡Œç‚ºã‚’調査ã—ã€ã«é•åã™ã‚‹è¡Œç‚ºã«å¯¾ã™ã‚‹é©åˆ‡ãªå‡¦ç½°ã‚’下ã—ã¾ã™ã€‚ãŸã ã—ã€æ‹…当ãƒãƒ¼ãƒ ã¯[SECOND_LIFE]ã®ä¸–界ã‹ã‚‰ã‚³ãƒ³ãƒ†ãƒ³ãƒ„を削除ã—ã¦æ¬²ã—ã„ã¨ã„ã†ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã¯å¿œã˜ã¾ã›ã‚“。 -⑵DMCA ã¾ãŸã¯ã‚³ãƒ³ãƒ†ãƒ³ãƒ„削除プãƒã‚»ã‚¹ã€‚[SECOND_LIFE]ã‹ã‚‰ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®å‰Šé™¤ã‚’リクエストã™ã‚‹ã«ã¯ã€[https://www.lindenlab.com/legal/intellectual-property-infringement-notification-policy DCï¼ï¼¡ãƒãƒªã‚·ãƒ¼]ã«è¦å®šã•れã¦ã„ã‚‹æœ‰åŠ¹ãªæ¨©åˆ©ä¾µå®³é€šçŸ¥ã‚’æå‡ºã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ +⑵DMCA ã¾ãŸã¯ã‚³ãƒ³ãƒ†ãƒ³ãƒ„削除プãƒã‚»ã‚¹ã€‚[SECOND_LIFE]ã‹ã‚‰ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®å‰Šé™¤ã‚’リクエストã™ã‚‹ã«ã¯ã€[https://www.lindenlab.com/legal/intellectual-property-infringement-notification-policy DMCAãƒãƒªã‚·ãƒ¼]ã«è¦å®šã•れã¦ã„ã‚‹æœ‰åŠ¹ãªæ¨©åˆ©ä¾µå®³é€šçŸ¥ã‚’æå‡ºã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ ã“ã®ã¾ã¾å«ŒãŒã‚‰ã›ã®å ±å‘Šã‚’ç¶šã‘ãŸã„å ´åˆã¯ã€ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã¦å ±å‘Šã®é€ä¿¡ã‚’完了ã—ã¦ãã ã•ã„。特å®šã®ã‚«ãƒ†ã‚´ãƒªã€Œã‚³ãƒ”ー Bot åŠã³æ¨©é™ã®æ‚ªç”¨ã€ã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆãŒã‚りã¾ã™ã€‚ @@ -3578,7 +3578,7 @@ Linden Lab </tag> <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="ã¯ã„"/> </notification> - <notification name="ConfirmClearMediaUrlList">ä¿å˜ã•れãŸï¼µï¼²ï¼¬ã®ãƒªã‚¹ãƒˆã‚’消去ã—ã¾ã™ã€‚ã“ã®ã¾ã¾ã€ãƒªã‚¹ãƒˆã‚’消去ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ + <notification name="ConfirmClearMediaUrlList">ä¿å˜ã•れãŸURLã®ãƒªã‚¹ãƒˆã‚’消去ã—ã¾ã™ã€‚ã“ã®ã¾ã¾ã€ãƒªã‚¹ãƒˆã‚’消去ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ <tag> confirm </tag> @@ -3669,10 +3669,10 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚ <notification name="AutoWearNewClothing">作æˆã™ã‚‹æœè£…を自動的ã«è£…ç€ã—ã¾ã™ã‹ï¼Ÿ <usetemplate ignoretext="「容姿ã€ã‚’編集ä¸ã«ã€ä½œæˆã™ã‚‹æœè£…を装ç€ã™ã‚‹ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> - <notification name="NotAgeVerified">訪å•ã—よã†ã¨ã—ã¦ã„ã‚‹å ´æ‰€ã¯ã€ï¼‘8æ³ä»¥ä¸Šã®ä½äººã«åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚ + <notification name="NotAgeVerified">訪å•ã—よã†ã¨ã—ã¦ã„ã‚‹å ´æ‰€ã¯ã€18æ³ä»¥ä¸Šã®ä½äººã«åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚ <usetemplate ignoretext="年齢制é™ä»˜ãã®ã‚¨ãƒªã‚¢ã‚’訪å•ã™ã‚‹å¹´é½¢ã«é”ã—ã¦ã„ã¾ã›ã‚“。" name="okignore" yestext="OK"/> </notification> - <notification name="NotAgeVerified_Notify">ã“ã®å ´æ‰€ã¸ã®å…¥å ´ã¯ã€ï¼‘8æ³ä»¥ä¸Šã«åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚ + <notification name="NotAgeVerified_Notify">ã“ã®å ´æ‰€ã¸ã®å…¥å ´ã¯ã€18æ³ä»¥ä¸Šã«åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚ <tag> fail </tag> @@ -3708,7 +3708,7 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚ <notification name="ReplacedMissingWearable"> æ¬ è½ã—ã¦ã„ã‚‹æœè£…や身体部ä½ã‚’デフォルトã«ç½®ãæ›ãˆã¾ã™ã€‚ </notification> - <notification name="GroupNotice">ä»¶å:[SUBJECT] メッセージ:[MESSAGE] + <notification name="GroupNotice">ä»¶å:[SUBJECT] メッセージ:[MESSAGE] <tag> group </tag> @@ -3726,7 +3726,7 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚ </notification> <notification name="UploadingAuctionSnapshot"> インワールドã¨Webサイトã®ã‚¹ãƒŠãƒƒãƒ—ショットをアップãƒãƒ¼ãƒ‰ä¸ã§ã™â€¦ -ï¼ˆæ‰€è¦æ™‚間:約5分) +ï¼ˆæ‰€è¦æ™‚間:約5分) </notification> <notification name="UploadPayment">アップãƒãƒ¼ãƒ‰ã«L$ [AMOUNT]支払ã„ã¾ã—ãŸã€‚ <tag> @@ -3774,7 +3774,7 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚ </tag> </notification> <notification name="IMAcrossParentEstates"> - 親ä¸å‹•産間ã§ã¯ã€ï¼©ï¼ã‚’é€ä¿¡ã§ãã¾ã›ã‚“。 + 親ä¸å‹•産間ã§ã¯ã€IMã‚’é€ä¿¡ã§ãã¾ã›ã‚“。 </notification> <notification name="TransferInventoryAcrossParentEstates"> 親ä¸å‹•産間ã§ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‚’移動ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 @@ -3855,7 +3855,7 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚ [NAME]ã¯ã€ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã®æä¾›ã‚’æ–りã¾ã—ãŸã€‚ </notification> <notification name="ObjectMessage"> - [NAME]:[MESSAGE] + [NAME]: [MESSAGE] </notification> <notification name="CallingCardAccepted"> コーリングカードãŒå—ç†ã•れã¾ã—ãŸã€‚ @@ -3870,7 +3870,7 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚ (ã“ã®æ“作ã¯ã€ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’ダブルクリックã™ã‚‹ã‹ã€å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€ã‚’é¸æŠžã—ã¦å®Ÿè¡Œã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚) </notification> <notification name="TeleportToPerson"> - 誰ã‹ã¨ã®ãƒ—ライベートãªä¼šè©±ã‚’é–‹ãã«ã¯ã€ç›¸æ‰‹ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’クリックã—ã¦ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰ã€Œï¼©ï¼ã€ã‚’é¸æŠžã—ã¾ã™ã€‚ + 誰ã‹ã¨ã®ãƒ—ライベートãªä¼šè©±ã‚’é–‹ãã«ã¯ã€ç›¸æ‰‹ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’クリックã—ã¦ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰ã€ŒIMã€ã‚’é¸æŠžã—ã¾ã™ã€‚ </notification> <notification name="CantSelectLandFromMultipleRegions">サーãƒãƒ¼ã®å¢ƒç•Œã‚’è¶Šãˆã¦åœŸåœ°ã‚’é¸æŠžã™ã‚‹ã“ã¨ã§ãã¾ã›ã‚“。 ã‚‚ã£ã¨å°ã•ãªåœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。 @@ -4000,14 +4000,14 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚ <unique/> <usetemplate name="okbutton" yestext="リージョンã®å†æ§‹ç¯‰"/> </notification> - <notification name="DynamicPathfindingDisabled">ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«ãŠã„ã¦ã€å‹•çš„çµŒè·¯æŽ¢ç´¢ãŒæœ‰åйã«ãªã£ã¦ã„ã¾ã›ã‚“。経路探索LSL呼ã³å‡ºã—を使用ã™ã‚‹ã‚¹ã‚¯ãƒªãƒ—トã®å…¥ã£ãŸã‚ªãƒ–ジェクトã¯ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§æœŸå¾…ã©ãŠã‚Šã«å‹•作ã—ãªã„å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ + <notification name="DynamicPathfindingDisabled">ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«ãŠã„ã¦ã€å‹•çš„çµŒè·¯æŽ¢ç´¢ãŒæœ‰åйã«ãªã£ã¦ã„ã¾ã›ã‚“。経路探索LSL呼ã³å‡ºã—を使用ã™ã‚‹ã‚¹ã‚¯ãƒªãƒ—トã®å…¥ã£ãŸã‚ªãƒ–ジェクトã¯ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§æœŸå¾…ã©ãŠã‚Šã«å‹•作ã—ãªã„å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ <unique/> </notification> <notification name="PathfindingCannotRebakeNavmesh">エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¾ãŸã¯ã‚µãƒ¼ãƒãƒ¼ã«å•題ãŒã‚ã‚‹ã‹ã€åˆ¶ä½œã™ã‚‹æ¨©é™ãŒãªã„å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ã“ã®å•題ã¯ã€ä¸€åº¦ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã¦ã‹ã‚‰ã€ãƒã‚°ã‚¤ãƒ³ã—ç›´ã™ã¨è§£æ±ºã•ã‚Œã‚‹å ´åˆãŒã‚りã¾ã™ã€‚ <unique/> <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="SeeAvatars">ã“ã®åŒºç”»ã«ã„ã‚‹ã‚¢ãƒã‚¿ãƒ¼ã‚„ã“ã®åŒºç”»å†…ã§è¡Œã‚れる文å—ãƒãƒ£ãƒƒãƒˆã¯ã€ä»–ã®åŒºç”»ã‹ã‚‰è¦‹ãˆã¾ã›ã‚“。ã‚ãªãŸã«ã¯ã€ã“ã®åŒºç”»å¤–ã«ã„ã‚‹ä½äººãŒè¦‹ãˆãšã€å¤–ã®ä½äººã«ã¯ã‚ãªãŸã®å§¿ãŒè¦‹ãˆã¾ã›ã‚“。ãƒãƒ£ãƒ³ãƒãƒ«ï¼ã§ã®é€šå¸¸ã®æ–‡å—ãƒãƒ£ãƒƒãƒˆã‚‚ブãƒãƒƒã‚¯ã•れã¾ã™ã€‚ + <notification name="SeeAvatars">ã“ã®åŒºç”»ã«ã„ã‚‹ã‚¢ãƒã‚¿ãƒ¼ã‚„ã“ã®åŒºç”»å†…ã§è¡Œã‚れる文å—ãƒãƒ£ãƒƒãƒˆã¯ã€ä»–ã®åŒºç”»ã‹ã‚‰è¦‹ãˆã¾ã›ã‚“。ã‚ãªãŸã«ã¯ã€ã“ã®åŒºç”»å¤–ã«ã„ã‚‹ä½äººãŒè¦‹ãˆãšã€å¤–ã®ä½äººã«ã¯ã‚ãªãŸã®å§¿ãŒè¦‹ãˆã¾ã›ã‚“。ãƒãƒ£ãƒ³ãƒãƒ«0ã§ã®é€šå¸¸ã®æ–‡å—ãƒãƒ£ãƒƒãƒˆã‚‚ブãƒãƒƒã‚¯ã•れã¾ã™ã€‚ <unique/> </notification> <notification name="ScriptsStopped"> @@ -4048,12 +4048,12 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚ fail </tag> </notification> - <notification name="MustGetAgeRegion">ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«å…¥ã‚‹ã«ã¯ã€ï¼‘8æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + <notification name="MustGetAgeRegion">ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«å…¥ã‚‹ã«ã¯ã€18æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ <tag> fail </tag> </notification> - <notification name="MustGetAgeParcel">ã“ã®åŒºç”»ã«å…¥ã‚‹ã«ã¯ã€ï¼‘8æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + <notification name="MustGetAgeParcel">ã“ã®åŒºç”»ã«å…¥ã‚‹ã«ã¯ã€18æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ <tag> fail </tag> @@ -4296,7 +4296,7 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚ </tag> </notification> <notification name="OfferCallingCard">[NAME]ãŒã€ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’渡ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ -ã‚ãªãŸã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«ãƒ–ックマークãŒè¿½åŠ ã•れã€ã“ã®ä½äººã«ç´ æ—©ãIï¼ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ +ã‚ãªãŸã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«ãƒ–ックマークãŒè¿½åŠ ã•れã€ã“ã®ä½äººã«ç´ æ—©ãIMã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ <tag> friendship </tag> @@ -4317,7 +4317,7 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚ [MESSAGE] -é€ä¿¡å…ƒã®ã‚ªãƒ–ジェクト:<nolink>[OBJECTNAME]</nolink> 所有者:[NAME_SLURL] +é€ä¿¡å…ƒã®ã‚ªãƒ–ジェクト:<nolink>[OBJECTNAME]</nolink> 所有者:[NAME_SLURL] <tag> confirm </tag> @@ -4457,7 +4457,7 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚ </notification> <notification name="BuyLindenDollarSuccess">ãŠæ”¯æ‰•ã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚ -ã‚ãªãŸã®L$残高ã¯ã€å‡¦ç†ãŒå®Œäº†ã™ã‚‹ã¨ã‚¢ãƒƒãƒ—デートã•れã¾ã™ã€‚処ç†ã«ï¼’ï¼åˆ†ä»¥ä¸Šã‹ã‹ã£ãŸå ´åˆã€ãŠå–り引ããŒã‚ャンセルã•れるã“ã¨ãŒã‚りã¾ã™ã€‚ãã®å ´åˆã¯ã€è³¼å…¥é‡‘é¡ã¯ã‚ãªãŸã® US$残高ã«è¿½åŠ ã•れã¾ã™ã€‚ [https://secondlife.com/my/account/?lang=ja-JP マイアカウント]ã®å–引履æ´ãƒšãƒ¼ã‚¸ã§ã€æ”¯æ‰•状æ³ã‚’確èªã§ãã¾ã™ã€‚ +ã‚ãªãŸã®L$残高ã¯ã€å‡¦ç†ãŒå®Œäº†ã™ã‚‹ã¨ã‚¢ãƒƒãƒ—デートã•れã¾ã™ã€‚処ç†ã«20分以上ã‹ã‹ã£ãŸå ´åˆã€ãŠå–り引ããŒã‚ャンセルã•れるã“ã¨ãŒã‚りã¾ã™ã€‚ãã®å ´åˆã¯ã€è³¼å…¥é‡‘é¡ã¯ã‚ãªãŸã® US$残高ã«è¿½åŠ ã•れã¾ã™ã€‚ [https://secondlife.com/my/account/?lang=ja-JP マイアカウント]ã®å–引履æ´ãƒšãƒ¼ã‚¸ã§ã€æ”¯æ‰•状æ³ã‚’確èªã§ãã¾ã™ã€‚ <tag> funds </tag> @@ -4745,11 +4745,11 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚ <button name="respondbutton" text="è¿”ç”"/> </form> </notification> - <notification name="ConfirmCloseAll">ã™ã¹ã¦ã®ï¼©ï¼ã‚’é–‰ã˜ã¾ã™ã‹ï¼Ÿ + <notification name="ConfirmCloseAll">ã™ã¹ã¦ã®IMã‚’é–‰ã˜ã¾ã™ã‹ï¼Ÿ <tag> confirm </tag> - <usetemplate ignoretext="ã™ã¹ã¦ã®ï¼©ï¼ã‚’é–‰ã˜ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + <usetemplate ignoretext="ã™ã¹ã¦ã®IMã‚’é–‰ã˜ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="AttachmentSaved"> 装ç€ç‰©ãŒä¿å˜ã•れã¾ã—ãŸã€‚ @@ -5075,7 +5075,7 @@ UDP:3478, 3479, 5060, 5062, 6250, 12000-32000 メモリプール残é‡ãŒå°‘ãªããªã£ã¦ã„ã¾ã™ã€‚クラッシュをé¿ã‘ã‚‹ãŸã‚[APP_NAME]ã®æ©Ÿèƒ½ã®ä¸€éƒ¨ã¯ç„¡åйã«ãªã‚Šã¾ã—ãŸã€‚ä»–ã®ã‚¢ãƒ—リケーションを終了ã—ã€çжæ³ãŒç¶™ç¶šã¾ãŸã¯å†ç™ºã™ã‚‹å ´åˆã«ã¯Second Lifeã‚’å†èµ·å‹•ã—ã¦ãã ã•ã„。 </notification> <notification name="ForceQuitDueToLowMemory"> - メモリä¸è¶³ã®ãŸã‚3ï¼ç§’以内ã«[APP_NAME]ã¯çµ‚了ã—ã¾ã™ã€‚ + メモリä¸è¶³ã®ãŸã‚30秒以内ã«[APP_NAME]ã¯çµ‚了ã—ã¾ã™ã€‚ </notification> <notification name="SOCKS_NOT_PERMITTED">ルールセットã«ã‚ˆã£ã¦è¨±å¯ã•れã¦ã„ãªã„ãŸã‚ã€SOCKS 5プãƒã‚ã‚·"[HOST]:[PORT]"ãŒæŽ¥ç¶šã‚’æ‹’çµ¶ã—ã¾ã—ãŸã€‚ <tag> @@ -5275,7 +5275,7 @@ UDP:3478, 3479, 5060, 5062, 6250, 12000-32000 <tag> confirm </tag> - <usetemplate ignoretext="UIをéžè¡¨ç¤ºå‰ã®ç¢ºèª" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + <usetemplate ignoretext="UIã‚’éžè¡¨ç¤ºå‰ã®ç¢ºèª" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="PathfindingLinksets_WarnOnPhantom">é¸æŠžã•れãŸä¸€éƒ¨ã®ãƒªãƒ³ã‚¯ã‚»ãƒƒãƒˆã¯ãƒ•ァントムフラグãŒåˆ‡ã‚Šæ›¿ãˆã‚‰ã‚Œã¾ã™ã€‚ @@ -6220,7 +6220,7 @@ UDP:3478, 3479, 5060, 5062, 6250, 12000-32000 fail </tag> </notification> - <notification name="TenObjectsDisabledPlzRefresh">é¸æŠžã•ã‚ŒãŸæœ€åˆã®ï¼‘ï¼å€‹ã®ã‚ªãƒ–ジェクトã®ã¿ãŒç„¡åйã«ã•れã¾ã—ãŸã€‚å¿…è¦ã«å¿œã˜ã¦ã€ãƒªãƒ•レッシュã—ã¦é¸æŠžå†…å®¹ã‚’è¿½åŠ ã—ã¦ãã ã•ã„。 + <notification name="TenObjectsDisabledPlzRefresh">é¸æŠžã•ã‚ŒãŸæœ€åˆã®10個ã®ã‚ªãƒ–ジェクトã®ã¿ãŒç„¡åйã«ã•れã¾ã—ãŸã€‚å¿…è¦ã«å¿œã˜ã¦ã€ãƒªãƒ•レッシュã—ã¦é¸æŠžå†…å®¹ã‚’è¿½åŠ ã—ã¦ãã ã•ã„。 <tag> fail </tag> @@ -6638,9 +6638,9 @@ UDP:3478, 3479, 5060, 5062, 6250, 12000-32000 fail </tag> </notification> - <notification name="CompressionTestResults">サイズ[SIZE]㎅ã®ãƒ•ァイル[FILE]ã‚’gzipã®ãƒ¬ãƒ™ãƒ«ï¼–ã§åœ§ç¸®ã—ãŸãƒ†ã‚¹ãƒˆçµæžœï¼š -圧縮:[PACK_TIME]秒 [PSIZE]㎅ -è§£å‡ï¼š[UNPACK_TIME]秒 [USIZE]㎅ + <notification name="CompressionTestResults">サイズ[SIZE]㎅ã®ãƒ•ァイル[FILE]ã‚’gzipã®ãƒ¬ãƒ™ãƒ«6ã§åœ§ç¸®ã—ãŸãƒ†ã‚¹ãƒˆçµæžœï¼š +圧縮:[PACK_TIME]ç§’ [PSIZE]㎅ +è§£å‡ï¼š[UNPACK_TIME]ç§’ [USIZE]㎅ <tag> fail </tag> @@ -6674,7 +6674,7 @@ UDP:3478, 3479, 5060, 5062, 6250, 12000-32000 </tag> <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="RiggedMeshAttachedToHUD">HUDãƒã‚¤ãƒ³ãƒˆã€Œ[POINT]ã€ã«ã‚¢ã‚¿ãƒƒãƒã•れãŸã‚ªãƒ–ジェクト「[NAME]ã€ã«ã¯ãƒªã‚°ãƒ¡ãƒƒã‚·ãƒ¥ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ + <notification name="RiggedMeshAttachedToHUD">HUDãƒã‚¤ãƒ³ãƒˆã€Œ[POINT]ã€ã«ã‚¢ã‚¿ãƒƒãƒã•れãŸã‚ªãƒ–ジェクト「[NAME]ã€ã«ã¯ãƒªã‚°ãƒ¡ãƒƒã‚·ãƒ¥ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ リグメッシュオブジェクトã¯ã€ã‚¢ãƒã‚¿ãƒ¼ã«å–り付ã‘るよã†ã«è¨è¨ˆã•れã¦ã„ã¾ã™ã€‚ã‚ãªãŸã«ã¯ã“ã®ã‚ªãƒ–ジェクトãŒè¡¨ç¤ºã•れã¾ã™ãŒã€ä»–ã®äººã«ã¯è¡¨ç¤ºã•れã¾ã›ã‚“。 @@ -6682,9 +6682,9 @@ UDP:3478, 3479, 5060, 5062, 6250, 12000-32000 <tag> confirm </tag> - <usetemplate ignoretext="リグメッシュãŒï¼¨ï¼µï¼¤ãƒã‚¤ãƒ³ãƒˆã«ã‚¢ã‚¿ãƒƒãƒã•れã¦ã„ã‚‹å ´åˆã«è¦å‘Šã—ã¾ã™ã€‚" name="okignore" yestext="OK"/> + <usetemplate ignoretext="リグメッシュãŒHUDãƒã‚¤ãƒ³ãƒˆã«ã‚¢ã‚¿ãƒƒãƒã•れã¦ã„ã‚‹å ´åˆã«è¦å‘Šã—ã¾ã™ã€‚" name="okignore" yestext="OK"/> </notification> - <notification name="EnableAutoFPSWarning" type="alertmodal">自動FPSを有効ã«ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ä¿å˜ã•れã¦ã„ãªã„グラフィックè¨å®šã¯ã™ã¹ã¦å¤±ã‚れã¾ã™ã€‚ + <notification name="EnableAutoFPSWarning" type="alertmodal">自動FPSを有効ã«ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ä¿å˜ã•れã¦ã„ãªã„グラフィックè¨å®šã¯ã™ã¹ã¦å¤±ã‚れã¾ã™ã€‚ ã¾ãšãれらをä¿å˜ã—ã¾ã™ã‹ï¼Ÿ <tag> diff --git a/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml index b920a0a8f7..848e3d2f33 100644 --- a/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml @@ -24,7 +24,7 @@ <icon name="hovered_icon"/> <icon name="selected_icon"/> <text name="avatar_name" value="(èªã¿è¾¼ã‚“ã§ã„ã¾ã™ï¼‰"/> - <text name="last_interaction" value="ï¼ç§’"/> + <text name="last_interaction" value="0ç§’"/> <icon name="permission_edit_theirs_icon" tool_tip="ã“ã®ãƒ•レンドã®ã‚ªãƒ–ジェクトを編集ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/> <icon name="permission_edit_mine_icon" tool_tip="ã“ã®ãƒ•レンドã¯ã€ã‚ãªãŸã®ã‚ªãƒ–ジェクトを編集・削除・å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/> <icon tool_tip="ã“ã®ãƒ•レンドã¯ãƒžãƒƒãƒ—上ã§ã‚ãªãŸã®ä½ç½®ã‚’表示ã§ãã¾ã™ã€‚" name="permission_map_icon"/> diff --git a/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml index 156f475fc6..56b6e88c7b 100644 --- a/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml +++ b/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="clothing_list_button_bar_panel"> - <button label="è¿½åŠ ï¼‹" name="add_btn"/> + <button label="è¿½åŠ +" name="add_btn"/> <button name="clothing_shop_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_universal.xml b/indra/newview/skins/default/xui/ja/panel_edit_universal.xml index fd5fe80848..6d6ee5622f 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_universal.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_universal.xml @@ -10,9 +10,9 @@ <texture_picker label="ç›®ã®ã‚¿ãƒˆã‚¥" name="Eyes Tattoo" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠžã™ã‚‹"/> <texture_picker label="左腕ã®ã‚¿ãƒˆã‚¥" name="Left Arm Tattoo" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠžã™ã‚‹"/> <texture_picker label="左脚ã®ã‚¿ãƒˆã‚¥" name="Left Leg Tattoo" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠžã™ã‚‹"/> - <texture_picker label="予備1ã®ã‚¿ãƒˆã‚¥" name="Aux1 Tattoo" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠžã™ã‚‹"/> - <texture_picker label="予備2ã®ã‚¿ãƒˆã‚¥" name="Aux2 Tattoo" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠžã™ã‚‹"/> - <texture_picker label="予備3ã®ã‚¿ãƒˆã‚¥" name="Aux3 Tattoo" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠžã™ã‚‹"/> + <texture_picker label="予備1ã®ã‚¿ãƒˆã‚¥" name="Aux1 Tattoo" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠžã™ã‚‹"/> + <texture_picker label="予備2ã®ã‚¿ãƒˆã‚¥" name="Aux2 Tattoo" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠžã™ã‚‹"/> + <texture_picker label="予備3ã®ã‚¿ãƒˆã‚¥" name="Aux3 Tattoo" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠžã™ã‚‹"/> <color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> </panel> </scroll_container> diff --git a/indra/newview/skins/default/xui/ja/panel_group_bulk_ban.xml b/indra/newview/skins/default/xui/ja/panel_group_bulk_ban.xml index 962d69c67c..27d9b088cb 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_bulk_ban.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_bulk_ban.xml @@ -4,7 +4,7 @@ (èªã¿è¾¼ã‚“ã§ã„ã¾ã™â€¦ï¼‰ </panel.string> <panel.string name="ban_selection_too_large"> - グループã®ãƒãƒ³ãŒé€ä¿¡ã•れã¦ã„ã¾ã›ã‚“ï¼šé¸æŠžã—ãŸä½äººãŒå¤šã™ãŽã¾ã™ã€‚グループã¸ã®ç«‹å…¥ç¦æ¢ã®æ•°ã¯ï¼‘リクエスト当ãŸã‚Šï¼‘ï¼ï¼äººã«åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚ + グループã®ãƒãƒ³ãŒé€ä¿¡ã•れã¦ã„ã¾ã›ã‚“ï¼šé¸æŠžã—ãŸä½äººãŒå¤šã™ãŽã¾ã™ã€‚グループã¸ã®ç«‹å…¥ç¦æ¢ã®æ•°ã¯1リクエスト当ãŸã‚Š100人ã«åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚ </panel.string> <panel.string name="ban_not_permitted"> グループã®ãƒãƒ³ãŒé€ä¿¡ã•れã¦ã„ã¾ã›ã‚“ï¼šã€Œç«‹å…¥ç¦æ¢ãƒªã‚¹ãƒˆã®ç®¡ç†ã€ã®èƒ½åŠ›ãŒã‚りã¾ã›ã‚“。 diff --git a/indra/newview/skins/default/xui/ja/panel_group_creation_sidetray.xml b/indra/newview/skins/default/xui/ja/panel_group_creation_sidetray.xml index 42e3b0050e..5e5fbfff9f 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_creation_sidetray.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_creation_sidetray.xml @@ -53,7 +53,7 @@ </layout_panel> </layout_stack> <text name="info_deletion"> - 注:48時間メンãƒãƒ¼ãŒï¼’人未満ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¯ã€è‡ªå‹•çš„ã«è§£æ•£ã•れã¾ã™ã€‚ + 注:48時間メンãƒãƒ¼ãŒ2人未満ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¯ã€è‡ªå‹•çš„ã«è§£æ•£ã•れã¾ã™ã€‚ </text> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/ja/panel_group_invite.xml b/indra/newview/skins/default/xui/ja/panel_group_invite.xml index 85f0cba760..1177d5930d 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_invite.xml @@ -11,7 +11,7 @@ </panel.string> <panel.string name="invite_selection_too_large"> グループã¸ã®æ‹›å¾…ãŒé€ä¿¡ã•れã¦ã„ã¾ã›ã‚“ï¼šé¸æŠžã•れãŸä½äººãŒå¤šã™ãŽã¾ã™ã€‚ -グループã¸ã®æ‹›å¾…ã¯ï¼‘回ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚ãŸã‚Šï¼‘ï¼ï¼äººã«åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚ +グループã¸ã®æ‹›å¾…ã¯1回ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚ãŸã‚Š100人ã«åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚ </panel.string> <text name="help_text"> グループã«ã¯ä¸€åº¦ã«è¤‡æ•°ã®ä½äººã‚’招待ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚「リストã‹ã‚‰ä½äººã‚’é¸æŠžã€ã‚’クリックã—ã¦ãã ã•ã„。 diff --git a/indra/newview/skins/default/xui/ja/panel_group_notices.xml b/indra/newview/skins/default/xui/ja/panel_group_notices.xml index ebde7f9944..8045c26724 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_notices.xml @@ -9,8 +9,8 @@ éŽåŽ»ã®é€šçŸ¥ã¯ã‚りã¾ã›ã‚“ </panel.string> <text name="lbl2"> - 通知ã¯ï¼‘4日間ä¿å˜ã•れã¾ã™ã€‚ -1日ã®åˆ¶é™æ•°ã¯ï¼’ï¼ï¼é€šã§ã™ã€‚ + 通知ã¯14日間ä¿å˜ã•れã¾ã™ã€‚ +1æ—¥ã®åˆ¶é™æ•°ã¯200通ã§ã™ã€‚ </text> <scroll_list name="notice_list"> <scroll_list.columns label="" name="icon"/> diff --git a/indra/newview/skins/default/xui/ja/panel_group_roles.xml b/indra/newview/skins/default/xui/ja/panel_group_roles.xml index bd16e3e986..1a063a3592 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_roles.xml @@ -30,7 +30,7 @@ Ctrlã‚ーを押ã—ãªãŒã‚‰ã€ãƒ¡ãƒ³ãƒãƒ¼åをクリックã™ã‚‹ã“ã¨ã§è¤‡æ <panel.string name="help_text"> 役割ã«ã¯ã€ã‚¿ã‚¤ãƒˆãƒ«ã¨è¨±å¯ã•れãŸèƒ½åŠ›ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚ メンãƒãƒ¼ã¯ï¼‘ã¤ä»¥ä¸Šã®å½¹å‰²ã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã™ã€‚ -グループã§ä½¿ãˆã‚‹å½¹å‰²ã¯ï¼‘ï¼å€‹ã¾ã§ã§ã€ã€Œå…¨å“¡ï¼ˆEveryone)ã€ã¨ã€Œæ‰€æœ‰è€…(Owner)ã€ãŒãれã«å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ +グループã§ä½¿ãˆã‚‹å½¹å‰²ã¯10個ã¾ã§ã§ã€ã€Œå…¨å“¡ï¼ˆEveryone)ã€ã¨ã€Œæ‰€æœ‰è€…(Owner)ã€ãŒãれã«å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ </panel.string> <panel.string name="cant_delete_role"> 「全員(Everyone)ã€ã¨ã€Œæ‰€æœ‰è€…(Owner)ã€ã®å½¹å‰²ã¯å‰Šé™¤ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 diff --git a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml index c95320e53a..4055e23d9f 100644 --- a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml @@ -16,7 +16,7 @@ ã“ã®ä½ç½®ã®æƒ…å ±ã¯ã€ã‚¢ã‚¯ã‚»ã‚¹åˆ¶é™ã®ãŸã‚ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。許å¯ã«ã¤ã„ã¦ã¯åŒºç”»æ‰€æœ‰è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 </string> <string name="acquired_date"> - [year,datetime,local]å¹´[mth,datetime,local]月[day,datetime,local]日([wkday,datetime,local]) [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] + [year,datetime,local]å¹´[mth,datetime,local]月[day,datetime,local]日([wkday,datetime,local]) [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] </string> <string name="icon_PG" value="Parcel_PG_Dark"/> <string name="icon_M" value="Parcel_M_Dark"/> diff --git a/indra/newview/skins/default/xui/ja/panel_main_inventory.xml b/indra/newview/skins/default/xui/ja/panel_main_inventory.xml index 5b5116a05d..c75fd8b1ca 100644 --- a/indra/newview/skins/default/xui/ja/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/ja/panel_main_inventory.xml @@ -19,7 +19,7 @@ <item label="åå‰" name="Name" value="search_by_name"/> <item label="制作者" name="Creator" value="search_by_creator"/> <item label="説明" name="Description" value="search_by_description"/> - <item label="UUID" name="UUID" value="search_by_UUID"/> + <item label="UUID" name="UUID" value="search_by_UUID"/> </combo_box> <menu_button tool_tip="検索表示オプションを表示" name="options_visibility_btn"/> <filter_editor label="検索用語を入力ã™ã‚‹" name="inventory search editor"/> diff --git a/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml b/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml index 5d984cb58c..39d9863a0a 100644 --- a/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml +++ b/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml @@ -28,7 +28,7 @@ サイズ: </text> <text name="X_label"> - X + X </text> <spinner label="" name="height_pixels"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml index 08edb447cb..7c7ce83a01 100644 --- a/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml +++ b/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="nearby_chat"> - <line_editor label="ã“ã“をクリックã—ã¦ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã—ã¾ã™ã€‚" name="chat_box" tool_tip="Enterã‚ーã§ç™ºè¨€ã—ã€Ctrl+Enterã‚ーã§ã‚·ãƒ£ã‚¦ãƒˆã—ã¾ã™ã€‚"/> + <line_editor label="ã“ã“をクリックã—ã¦ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã—ã¾ã™ã€‚" name="chat_box" tool_tip="Enterã‚ーã§ç™ºè¨€ã—ã€Ctrl+Enterã‚ーã§å«ã³ã¾ã™ã€‚"/> <button name="show_nearby_chat" tool_tip="近隣ãƒãƒ£ãƒƒãƒˆãƒã‚°ã‚’表示ï¼éžè¡¨ç¤º"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_media.xml b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml index 1093624cda..9c3b51adb9 100644 --- a/indra/newview/skins/default/xui/ja/panel_nearby_media.xml +++ b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml @@ -19,8 +19,8 @@ <button label="ã™ã¹ã¦åœæ¢" name="all_nearby_media_disable_btn" tool_tip="近隣ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ã™ã¹ã¦ã‚ªãƒ•ã«ã—ã¾ã™"/> <button label="ã™ã¹ã¦é–‹å§‹" name="all_nearby_media_enable_btn" tool_tip="近隣ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ã™ã¹ã¦ã‚ªãƒ³ã«ã—ã¾ã™"/> <button name="open_prefs_btn" tool_tip="メディアã®è¨å®šã‚’é–‹ãã¾ã™"/> - <button label="詳細 ≫" label_selected="≪ 簡易" name="more_btn" tool_tip="拡張コントãƒãƒ¼ãƒ«"/> - <button label="詳細 ≫" label_selected="≪ 簡易" name="less_btn" tool_tip="拡張コントãƒãƒ¼ãƒ«"/> + <button label="詳細 >>" label_selected="<< 簡易" name="more_btn" tool_tip="拡張コントãƒãƒ¼ãƒ«"/> + <button label="詳細 >>" label_selected="<< 簡易" name="less_btn" tool_tip="拡張コントãƒãƒ¼ãƒ«"/> </panel> <panel name="nearby_media_panel"> <text name="nearby_media_title"> diff --git a/indra/newview/skins/default/xui/ja/panel_notification_list_item.xml b/indra/newview/skins/default/xui/ja/panel_notification_list_item.xml index 00733bf79d..f1fa54d14e 100644 --- a/indra/newview/skins/default/xui/ja/panel_notification_list_item.xml +++ b/indra/newview/skins/default/xui/ja/panel_notification_list_item.xml @@ -40,7 +40,7 @@ <text name="sender_or_fee_box"> é€ä¿¡è€…ï¼šä½æ°‘ ã˜ã‚…ã†ã¿ã‚“ </text> - <text name="notification_time" value="2014å¹´12月24日 23:30"/> + <text name="notification_time" value="2014å¹´12月24æ—¥ 23:30"/> </panel> </panel> </layout_panel> @@ -76,7 +76,7 @@ <text name="sender_or_fee_box_exp"> é€ä¿¡è€…ï¼šä½æ°‘ ã˜ã‚…ã†ã¿ã‚“ </text> - <text name="notification_time_exp" value="2014å¹´12月24日 23:30"/> + <text name="notification_time_exp" value="2014å¹´12月24æ—¥ 23:30"/> </panel> <panel name="notification_text_panel_exp"> <chat_editor name="notification_text_exp"> diff --git a/indra/newview/skins/default/xui/ja/panel_people.xml b/indra/newview/skins/default/xui/ja/panel_people.xml index 516ee3c7d2..fbdaa319a2 100644 --- a/indra/newview/skins/default/xui/ja/panel_people.xml +++ b/indra/newview/skins/default/xui/ja/panel_people.xml @@ -19,7 +19,7 @@ <string name="AltMiniMapToolTipMsg" value="[地域](ダブルクリックã§ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€‚Shiftâ€ãƒ‰ãƒ©ãƒƒã‚°ã§æ°´å¹³ãƒ»åž‚直移動)"/> <string name="GroupCountWithInfo" value="ã‚ãªãŸã¯ç¾åœ¨ã€[COUNT]グループã«å±žã—ã¦ã„ã¾ã™ã€‚ã‚ã¨[REMAINING]グループã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚[secondlife:/// 上é™ã‚’増やã™]"/> <tab_container name="tabs"> - <panel label="近隣" name="nearby_panel"> + <panel label="è¿‘ã" name="nearby_panel"> <panel label="bottom_panel" name="nearby_buttons_panel"> <filter_editor label="人物をフィルタ" name="nearby_filter_input"/> <button name="gear_btn" tool_tip="é¸æŠžã—ãŸäººç‰©ã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³"/> diff --git a/indra/newview/skins/default/xui/ja/panel_performance_autoadjustments.xml b/indra/newview/skins/default/xui/ja/panel_performance_autoadjustments.xml index 3a0eeae6d5..fdbfca64ce 100644 --- a/indra/newview/skins/default/xui/ja/panel_performance_autoadjustments.xml +++ b/indra/newview/skins/default/xui/ja/panel_performance_autoadjustments.xml @@ -24,12 +24,12 @@ <combo_box.item label="ã‚¢ãƒã‚¿ãƒ¼ã¨ãƒ¯ãƒ¼ãƒ«ãƒ‰" name="av_and_scene" value="1"/> <combo_box.item label="ワールドã®ã¿" name="scene_only" value="2"/> </combo_box> - <button label="今ã™ã自動調整" name="start_autotune" tool_tip="ビューアーã¯ã€ç›®æ¨™ï¼¦ï¼°ï¼³ã‚’満ãŸã™ã‚ˆã†ã«è¨å®šãŒèª¿æ•´ã•れるã¾ã§åœæ¢ã—ã¾ã™ã€‚"/> + <button label="今ã™ã自動調整" name="start_autotune" tool_tip="ビューアーã¯ã€ç›®æ¨™FPSを満ãŸã™ã‚ˆã†ã«è¨å®šãŒèª¿æ•´ã•れるã¾ã§åœæ¢ã—ã¾ã™ã€‚"/> <button label="ã‚ャンセル" name="stop_autotune" tool_tip="è‡ªå‹•èª¿æ•´ã‚’ä¸æ–ã—ã¾ã™ã€‚"/> <text name="wip_desc"> 調整ä¸ã§ã™â€¦ </text> - <check_box label="継続的ã«èª¿æ•´ã™ã‚‹" name="AutoTuneContinuous" tool_tip="ビューアーã¯ã€ã“ã®ãƒ•ãƒãƒ¼ã‚¿ãƒ¼ãŒé–‰ã˜ã¦ã„ã¦ã‚‚åœæ¢ã™ã‚‹ã¾ã§ã€ç›®æ¨™ï¼¦ï¼°ï¼³ã‚’満ãŸã™ã‚ˆã†ã«è¨å®šã‚’継続的ã«èª¿æ•´ã—ã¾ã™ã€‚"> + <check_box label="継続的ã«èª¿æ•´ã™ã‚‹" name="AutoTuneContinuous" tool_tip="ビューアーã¯ã€ã“ã®ãƒ•ãƒãƒ¼ã‚¿ãƒ¼ãŒé–‰ã˜ã¦ã„ã¦ã‚‚åœæ¢ã™ã‚‹ã¾ã§ã€ç›®æ¨™FPSを満ãŸã™ã‚ˆã†ã«è¨å®šã‚’継続的ã«èª¿æ•´ã—ã¾ã™ã€‚"> </check_box> <radio_group name="autotune_lock_type"> <radio_item label="ã“ã®ãƒã‚°ã‚¤ãƒ³ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ã¿" name="one_session_lock" value="0"/> diff --git a/indra/newview/skins/default/xui/ja/panel_performance_huds.xml b/indra/newview/skins/default/xui/ja/panel_performance_huds.xml index 51d9e73540..2d53d74d0d 100644 --- a/indra/newview/skins/default/xui/ja/panel_performance_huds.xml +++ b/indra/newview/skins/default/xui/ja/panel_performance_huds.xml @@ -5,13 +5,13 @@ 戻る </text> <text name="huds_title"> - アクティブãªï¼¨ï¼µï¼¤ + アクティブãªHUD </text> <text name="huds_desc1"> - 使用ã—ã¦ã„ãªã„HUDをå–り外ã™ã¨ãƒ¡ãƒ¢ãƒªãŒç¯€ç´„ã•れã€Second Lifeã®å‡¦ç†ãŒé«˜é€ŸåŒ–ã•れã¾ã™ã€‚ + 使用ã—ã¦ã„ãªã„HUDã‚’å–り外ã™ã¨ãƒ¡ãƒ¢ãƒªãŒç¯€ç´„ã•れã€Second Lifeã®å‡¦ç†ãŒé«˜é€ŸåŒ–ã•れã¾ã™ã€‚ </text> <text name="huds_desc2"> - 注æ„ï¼šï¼¨ï¼µï¼¤ã®æœ€å°åŒ–ボタンを使用ã—ã¦ã‚‚ã€ï¼¨ï¼µï¼¤ã‚’å–り外ã—ãŸã“ã¨ã«ã¯ãªã‚Šã¾ã›ã‚“。 + 注æ„:HUDã®æœ€å°åŒ–ボタンを使用ã—ã¦ã‚‚ã€HUDã‚’å–り外ã—ãŸã“ã¨ã«ã¯ãªã‚Šã¾ã›ã‚“。 </text> <name_list name="hud_list"> <name_list.columns label="" name="complex_visual"/> diff --git a/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml b/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml index a031cd7176..2e165b11b6 100644 --- a/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml +++ b/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml @@ -7,7 +7,7 @@ <text name="settings_title"> グラフィックè¨å®š </text> - <button label="æ‹¡å¼µè¨å®šã‚’é–‹ã" name="advanced_btn"/> + <button label="詳細è¨å®šã‚’é–‹ã" name="advanced_btn"/> <button label="推奨è¨å®šã«ãƒªã‚»ãƒƒãƒˆ" name="defaults_btn"/> <view_border name="border0"/> <text name="quality_lbl"> @@ -40,7 +40,7 @@ </text> <slider name="draw_distance"/> <text name="draw_distance_m"> - ï½ + m </text> <text name="farther_lbl"> é æ™¯ @@ -58,7 +58,7 @@ <check_box label="大気(周辺)シェーダー" name="atmospheric_shaders"/> <check_box label="高度ãªå…‰æºãƒ¢ãƒ‡ãƒ«" name="advanced_lighting_model"/> <text name="RenderShadowDetailText"> - 影: + å½± </text> <combo_box name="ShadowDetail"> <combo_box.item label="ãªã—" name="0" value="0"/> @@ -96,25 +96,4 @@ <text name="photo_desc"> (0.0~4.0ã®å€¤ã‚’入れã¦ãã ã•ã„) </text> - <text name="1_lbl"> - 1 - </text> - <text name="2_lbl"> - 2 - </text> - <text name="3_lbl"> - 3 - </text> - <text name="4_lbl"> - 4 - </text> - <text name="5_lbl"> - 5 - </text> - <text name="6_lbl"> - 6 - </text> - <text name="7_lbl"> - 7 - </text> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_place_profile.xml b/indra/newview/skins/default/xui/ja/panel_place_profile.xml index 21843e4420..5bd1611a2e 100644 --- a/indra/newview/skins/default/xui/ja/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/ja/panel_place_profile.xml @@ -39,7 +39,7 @@ ã“ã®å ´æ‰€ã®æƒ…å ±ã¯ã€ã‚¢ã‚¯ã‚»ã‚¹åˆ¶é™ã®ãŸã‚ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。許å¯ã«ã¤ã„ã¦ã¯åŒºç”»æ‰€æœ‰è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 </string> <string name="acquired_date"> - [year,datetime,local]å¹´[mth,datetime,local]月[day,datetime,local]æ—¥[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] + [year,datetime,local]å¹´[mth,datetime,local]月[day,datetime,local]æ—¥[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] </string> <button name="back_btn" tool_tip="戻る"/> <text name="title" value="å ´æ‰€ã®ãƒ—ãƒãƒ•ィール"/> diff --git a/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml b/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml index 6373eadabc..f74059e7f1 100644 --- a/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml +++ b/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml @@ -2,9 +2,9 @@ <panel name="panel_postcard_settings"> <combo_box label="è§£åƒåº¦" name="postcard_size_combo"> <combo_box.item label="ç¾åœ¨ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="CurrentWindow"/> - <combo_box.item label="ï¼–ï¼”ï¼âœ•48ï¼" name="640x480"/> - <combo_box.item label="8ï¼ï¼âœ•ï¼–ï¼ï¼" name="800x600"/> - <combo_box.item label="1ï¼ï¼’4✕768" name="1024x768"/> + <combo_box.item label="640x480" name="640x480"/> + <combo_box.item label="800x600" name="800x600"/> + <combo_box.item label="1024x768" name="1024x768"/> <combo_box.item label="カスタム" name="Custom"/> </combo_box> <spinner label="横幅✕高ã•" name="postcard_snapshot_width"/> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml index 40998f8035..72da378efb 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="æ‹¡å¼µ" name="advanced"> +<panel label="アドãƒãƒ³ã‚¹" name="advanced"> <panel.string name="aspect_ratio_text"> - [NUM]:[DEN] + [NUM]:[DEN] </panel.string> <text name="Cache:"> ã‚ャッシュ: @@ -17,19 +17,19 @@ <button label="å‚ç…§" label_selected="å‚ç…§" name="set_cache"/> <button label="デフォルトã®å ´æ‰€" label_selected="デフォルトã®å ´æ‰€" name="default_cache_location"/> <text name="UI Size:"> - UIã®ã‚µã‚¤ã‚ºï¼š + UIã®ã‚µã‚¤ã‚ºï¼š </text> <text name="HUD Size:"> - HUDã®ã‚¹ã‚±ãƒ¼ãƒ«ï¼š + HUDã®ã‚¹ã‚±ãƒ¼ãƒ«ï¼š </text> - <check_box label="スクリプトã®ã‚¨ãƒ©ãƒ¼ã‚’表示:" name="show_script_errors"/> + <check_box label="スクリプトã®ã‚¨ãƒ©ãƒ¼ã‚’表示:" name="show_script_errors"/> <radio_group name="show_location"> <radio_item label="近隣ãƒãƒ£ãƒƒãƒˆ" name="0"/> <radio_item label="別々ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="1"/> </radio_group> <check_box label="複数ã®ãƒ“ューアを許å¯" name="allow_multiple_viewer_check"/> <check_box label="ãƒã‚°ã‚¤ãƒ³æ™‚ã«ã‚°ãƒªãƒƒãƒ‰é¸æŠžã‚’表示" name="show_grid_selection_check"/> - <check_box label="拡張メニューを表示" name="show_advanced_menu_check"/> + <check_box label="アドãƒãƒ³ã‚¹ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’表示" name="show_advanced_menu_check"/> <check_box label="開発メニューを表示" name="show_develop_menu_check"/> <button label="記録済ã¿ã®ãƒ¦ãƒ¼ã‚¶å" name="remembered_usernames"/> <button label="デフォルトã®ä½œæˆæ¨©é™" name="default_creation_permissions"/> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml index dd11296729..8246c1e07c 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml @@ -4,12 +4,12 @@ <panel name="general_chat_settings"> <check_box initial_value="true" label="ãƒãƒ£ãƒƒãƒˆä¸ã«ã‚¿ã‚¤ãƒ”ング動作ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†ç”Ÿ" name="play_typing_animation"/> <check_box label="オフライン時ã«å—ã‘å–ã£ãŸï¼©ï¼ã¯ãƒ¡ãƒ¼ãƒ«ã§å—ä¿¡ã™ã‚‹" name="send_im_to_email"/> - <check_box label="フレンドã¨ã‚°ãƒ«ãƒ¼ãƒ—以外ã‹ã‚‰ã®ã‚³ãƒ¼ãƒ«ã¨ï¼©ï¼ã¯å—ä¿¡ã—ãªã„" name="voice_call_friends_only_check"/> + <check_box label="フレンドã¨ã‚°ãƒ«ãƒ¼ãƒ—以外ã‹ã‚‰ã®ã‚³ãƒ¼ãƒ«ã¨IMã¯å—ä¿¡ã—ãªã„" name="voice_call_friends_only_check"/> <text name="email_settings"> - [https://accounts.secondlife.com/change_email?lang=ja オフライン時ã®ï¼©ï¼ã®ãƒ¡ãƒ¼ãƒ«é€ä¿¡å…ˆã®è¨å®š] + [https://accounts.secondlife.com/change_email?lang=ja オフライン時ã®IMã®ãƒ¡ãƒ¼ãƒ«é€ä¿¡å…ˆã®è¨å®š] </text> <text name="font_size"> - æ–‡å—ã®å¤§ãã•: + フォントサイズ: </text> <combo_box name="chat_font_size"> <item label="å°" name="Small" value="0"/> @@ -20,7 +20,7 @@ </panel> <panel name="im_notification_settings"> <text name="friend_ims"> - フレンドIï¼ï¼š + フレンドã‹ã‚‰ã®IM: </text> <combo_box name="FriendIMOptions"> <item label="é–‹ã„ã¦ã„る会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/> @@ -30,7 +30,7 @@ </combo_box> <check_box label="サウンドをå†ç”Ÿ" name="play_sound_friend_im"/> <text name="non_friend_ims"> - フレンドã®ã„ãªã„Iï¼ï¼š + フレンド以外ã‹ã‚‰ã®IM: </text> <combo_box name="NonFriendIMOptions"> <item label="é–‹ã„ã¦ã„る会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/> @@ -40,7 +40,7 @@ </combo_box> <check_box label="サウンドをå†ç”Ÿ" name="play_sound_non_friend_im"/> <text name="conference_ims"> - 会話Iï¼ï¼š + 会è°IM: </text> <combo_box name="ConferenceIMOptions"> <item label="é–‹ã„ã¦ã„る会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/> @@ -70,7 +70,7 @@ </combo_box> <check_box label="サウンドをå†ç”Ÿ" name="play_sound_nearby_chat_im"/> <text name="object_ims"> - オブジェクトã«ã‚ˆã‚‹ï¼©ï¼ï¼š + オブジェクトã«ã‚ˆã‚‹IM: </text> <combo_box name="ObjectIMOptions"> <item label="é–‹ã„ã¦ã„る会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml b/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml index b740f85806..d57f8d12f5 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml @@ -29,13 +29,13 @@ 所有者 </text> <text name="text_box9"> - URL + URL </text> <text name="bubble_chat"> åå‰ã®è¡¨ç¤ºã®èƒŒæ™¯è‰²ï¼ˆå¹ã出ã—ãƒãƒ£ãƒƒãƒˆã«ã‚‚é©ç”¨ï¼‰ï¼š </text> <color_swatch name="background" tool_tip="åå‰ã®è¡¨ç¤ºè‰²ã‚’é¸æŠž"/> - <slider label="ä¸é€æ˜Žåº¦ï¼š" name="bubble_chat_opacity" tool_tip="åå‰ã®è¡¨ç¤ºã®ä¸é€æ˜Žåº¦ã‚’é¸æŠž"/> + <slider label="ä¸é€æ˜Žåº¦:" name="bubble_chat_opacity" tool_tip="åå‰ã®è¡¨ç¤ºã®ä¸é€æ˜Žåº¦ã‚’é¸æŠž"/> <text name="floater_opacity"> フãƒãƒ¼ã‚¿ãƒ¼ã®é€éŽåº¦ï¼š </text> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml index 9309dda5af..eff831a7ac 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml @@ -45,7 +45,7 @@ <check_box label="ユーザーå" name="show_slids" tool_tip="bobsmith123 ãªã©ãƒ¦ãƒ¼ã‚¶ãƒ¼åを表示"/> <check_box label="グループタイトル" name="show_all_title_checkbox1" tool_tip="オフィサーã¾ãŸã¯ãƒ¡ãƒ³ãƒãƒ¼ãªã©ã€ã‚°ãƒ«ãƒ¼ãƒ—タイトルを表示"/> <check_box label="フレンドをãƒã‚¤ãƒ©ã‚¤ãƒˆè¡¨ç¤º" name="show_friends" tool_tip="フレンドã®åå‰ã‚’ãƒã‚¤ãƒ©ã‚¤ãƒˆè¡¨ç¤º"/> - <check_box label="表示åを表示" name="display_names_check" tool_tip="ã“ã‚Œã‚’é¸æŠžã™ã‚‹ã¨ã€ãƒãƒ£ãƒƒãƒˆã€ï¼©ï¼ãªã©ã§è¡¨ç¤ºåãŒè¡¨ç¤ºã•れã¾ã™ã€‚"/> + <check_box label="表示åを表示" name="display_names_check" tool_tip="ã“ã‚Œã‚’é¸æŠžã™ã‚‹ã¨ã€ãƒãƒ£ãƒƒãƒˆã€IMãªã©ã§è¡¨ç¤ºåãŒè¡¨ç¤ºã•れã¾ã™ã€‚"/> <text name="inworld_typing_rg_label"> 特定ã‚ーを押ã—ãŸã¨ãã®å‹•作: </text> @@ -57,10 +57,10 @@ 「離å¸ã€ã¨ã™ã‚‹ã¾ã§ã®æ™‚間: </text> <combo_box label="「離å¸ã€ã¨ã™ã‚‹ã¾ã§ã®æ™‚間:" name="afk"> - <combo_box.item label="2分" name="item0"/> - <combo_box.item label="5分" name="item1"/> - <combo_box.item label="1ï¼åˆ†" name="item2"/> - <combo_box.item label="3ï¼åˆ†" name="item3"/> + <combo_box.item label="2分" name="item0"/> + <combo_box.item label="5分" name="item1"/> + <combo_box.item label="10分" name="item2"/> + <combo_box.item label="30分" name="item3"/> <combo_box.item label="離å¸è¨å®šãªã—" name="item4"/> </combo_box> <text name="text_box3"> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml index 79a4689526..a70b30c57f 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml @@ -37,7 +37,7 @@ <slider name="QualityPerformanceSelection"/> <slider control_name="RenderFarClip" label="æç”»è·é›¢ï¼š" name="DrawDistance"/> <text name="DrawDistanceMeterText2"> - ï½ + m </text> <check_box initial_value="true" label="大気(周辺)シェーダー" name="WindLightUseAtmosShaders"/> <check_box initial_value="true" label="高度ãªå…‰æºãƒ¢ãƒ‡ãƒ«" name="UseLightShaders"/> @@ -56,5 +56,5 @@ <button label="プリセットを削除…" name="PrefDeleteButton"/> <button label="プリセットを削除…" name="PrefDeleteButton"/> <button label="推奨è¨å®šã«ãƒªã‚»ãƒƒãƒˆ" name="Defaults"/> - <button label="æ‹¡å¼µè¨å®šâ€¦" name="AdvancedSettings"/> + <button label="詳細è¨å®šâ€¦" name="AdvancedSettings"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml index 3956e07bf8..85be779053 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml @@ -4,10 +4,10 @@ ä¸å¤®ã®ãƒœã‚¿ãƒ³ </panel.string> <panel.string name="button4_mouse"> - 4ボタン + マウスボタン4 </panel.string> <panel.string name="button5_mouse"> - 5ボタン + マウスボタン5 </panel.string> <slider label="全体ã®ãƒœãƒªãƒ¥ãƒ¼ãƒ " name="System Volume"/> <button name="mute_audio"/> diff --git a/indra/newview/skins/default/xui/ja/panel_presets_pulldown.xml b/indra/newview/skins/default/xui/ja/panel_presets_pulldown.xml index b4504dd39a..128669260a 100644 --- a/indra/newview/skins/default/xui/ja/panel_presets_pulldown.xml +++ b/indra/newview/skins/default/xui/ja/panel_presets_pulldown.xml @@ -5,6 +5,6 @@ </text> <scroll_list name="preset_list"/> <view_border name="horiz_separator"/> - <button name="open_prefs_btn" label="ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯åˆæœŸè¨å®š" tool_tip="グラフィックè¨å®šã‚’呼ã³å‡ºã—ã¾ã™ã€‚"/> - <button name="open_autofps_btn" label="自動FPSè¨å®š" tool_tip="自動調整è¨å®šã‚’呼ã³å‡ºã—ã¾ã™ã€‚"/> + <button name="open_prefs_btn" label="グラフィックè¨å®š" tool_tip="グラフィックè¨å®šã‚’呼ã³å‡ºã—ã¾ã™ã€‚"/> + <button name="open_autofps_btn" label="自動FPSè¨å®š" tool_tip="自動調整è¨å®šã‚’呼ã³å‡ºã—ã¾ã™ã€‚"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml index 6c33bda5cd..038a7aa49f 100644 --- a/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml @@ -64,7 +64,7 @@ <button name="close_btn" tool_tip="ズームãƒãƒƒã‚¯"/> </layout_panel> <layout_panel name="new_window"> - <button name="new_window_btn" tool_tip="URLをブラウザã§é–‹ã"/> + <button name="new_window_btn" tool_tip="URLをブラウザã§é–‹ã"/> </layout_panel> </layout_stack> <icon name="media_secure_lock_flag" tool_tip="安全ãªãƒ–ラウジング"/> diff --git a/indra/newview/skins/default/xui/ja/panel_profile_secondlife.xml b/indra/newview/skins/default/xui/ja/panel_profile_secondlife.xml index 71e223b90b..1c9111606e 100644 --- a/indra/newview/skins/default/xui/ja/panel_profile_secondlife.xml +++ b/indra/newview/skins/default/xui/ja/panel_profile_secondlife.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_profile" label="プãƒãƒ•ィール"> - <string name="date_format" value="SLã§ã®èª•生日:[year,datetime,utc]å¹´[mth,datetime,utc]月[day,datetime,utc]æ—¥"/> + <string name="date_format" value="SLã§ã®èª•生日:[year,datetime,utc]å¹´[mth,datetime,utc]月[day,datetime,utc]æ—¥"/> <string name="age_format" value="[AGE]経éŽ"/> <string name="partner_text" value="パートナー:[LINK]"/> <string name="CaptionTextAcctInfo"> diff --git a/indra/newview/skins/default/xui/ja/panel_progress.xml b/indra/newview/skins/default/xui/ja/panel_progress.xml index 1edada6098..cafc7c2d1d 100644 --- a/indra/newview/skins/default/xui/ja/panel_progress.xml +++ b/indra/newview/skins/default/xui/ja/panel_progress.xml @@ -1,8 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="login_progress_panel"> + <layout_panel name="panel_icons"/> <layout_stack name="vertical_centering"/> <layout_panel name="panel4"/> <layout_panel name="center"/> <layout_stack name="horizontal_centering"> + <text name="logos_lbl"> + メガパイト使用 + </text> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_region_covenant.xml b/indra/newview/skins/default/xui/ja/panel_region_covenant.xml index 9b2239e0bb..16349b45d4 100644 --- a/indra/newview/skins/default/xui/ja/panel_region_covenant.xml +++ b/indra/newview/skins/default/xui/ja/panel_region_covenant.xml @@ -45,7 +45,7 @@ 種類: </text> <text name="region_landtype_text"> - メインランドï¼å…¥æ¤åœ° + メインランド / ホームステッド </text> <text name="region_maturity_lbl"> 区分: diff --git a/indra/newview/skins/default/xui/ja/panel_region_environment.xml b/indra/newview/skins/default/xui/ja/panel_region_environment.xml index 48aa2a0adb..969c8f699c 100644 --- a/indra/newview/skins/default/xui/ja/panel_region_environment.xml +++ b/indra/newview/skins/default/xui/ja/panel_region_environment.xml @@ -7,7 +7,7 @@ リージョン(地域)ã®è¨å®šã‚’使用 </string> <string name="str_altitude_desription"> - 空 [INDEX]([ALTITUDE]ï½ï¼‰ + 空 [INDEX]([ALTITUDE]m) </string> <string name="str_no_parcel"> 区画ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。環境ã®è¨å®šã¯ç„¡åйã«ãªã£ã¦ã„ã¾ã™ã€‚ @@ -48,7 +48,7 @@ </layout_panel> <layout_panel name="pnl_environment_length"> <text name="lbl_apparent_time"> - [AP] [HH]:[MM]([PRC]%) + [AP] [HH]:[MM] ([PRC]%) </text> </layout_panel> <layout_panel name="pnl_environment_buttons"/> @@ -57,7 +57,7 @@ <layout_panel name="pnl_environment_altitudes"> <panel name="pnl_alt1"> <text name="txt_alt1"> - 空[INDEX] [ALTITUDE]ï½ + 空[INDEX] [ALTITUDE]m </text> <line_editor name="edt_invname_alt1"> 䏿˜Ž @@ -66,7 +66,7 @@ </panel> <panel name="pnl_alt2"> <text name="txt_alt2"> - 空[INDEX] [ALTITUDE]ï½ + 空[INDEX] [ALTITUDE]m </text> <line_editor name="edt_invname_alt2"> 䏿˜Ž @@ -75,7 +75,7 @@ </panel> <panel name="pnl_alt3"> <text name="txt_alt3"> - 空[INDEX] [ALTITUDE]ï½ + 空[INDEX] [ALTITUDE]m </text> <line_editor name="edt_invname_alt3"> 䏿˜Ž diff --git a/indra/newview/skins/default/xui/ja/panel_region_estate.xml b/indra/newview/skins/default/xui/ja/panel_region_estate.xml index df790376ec..429b55cb32 100644 --- a/indra/newview/skins/default/xui/ja/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/ja/panel_region_estate.xml @@ -19,7 +19,7 @@ <radio_item label="アクセスタブã«è¨˜è¼‰ã•れãŸä½äººã¨ã‚°ãƒ«ãƒ¼ãƒ—ã®ã¿è¨±å¯ã™ã‚‹" name="estate_restricted_access"/> <radio_item label="誰ã§ã‚‚訪å•å¯" name="estate_public_access"/> </radio_group> - <check_box label="18æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" name="limit_age_verified" tool_tip="ã“ã®ä¸å‹•産(ä¸å‹•産)ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€18 æ‰ä»¥ä¸Šã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。詳細ã«ã¤ã„ã¦ã¯ã€[SUPPORT_SITE]ã‚’ã”覧ãã ã•ã„。"/> + <check_box label="18æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" name="limit_age_verified" tool_tip="ã“ã®ä¸å‹•産(ä¸å‹•産)ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€18 æ‰ä»¥ä¸Šã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。詳細ã«ã¤ã„ã¦ã¯ã€[SUPPORT_SITE]ã‚’ã”覧ãã ã•ã„。"/> <check_box label="æ”¯æ‰•æƒ…å ±ãŒç™»éŒ²ã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™" name="limit_payment" tool_tip="æ”¯æ‰•æƒ…å ±ãŒç™»éŒ²ã•れã¦ã„ãªã„ã¨ã€ã“ã®ä¸å‹•産ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。詳細ã«ã¤ã„ã¦ã¯ã€[SUPPORT_SITE]ã‚’ã”覧ãã ã•ã„。"/> <check_box label="区画所有者" name="parcel_access_override"/> <check_box label="ボイスãƒãƒ£ãƒƒãƒˆã‚’許å¯" name="voice_chat_check"/> diff --git a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml index 11e8d0d169..398f8d6718 100644 --- a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml @@ -13,16 +13,16 @@ 地形テクスãƒãƒ£ </text> <text name="height_text_lbl"> - 1(低) + 1(低) </text> <text name="height_text_lbl2"> - ï¼’ + 2 </text> <text name="height_text_lbl3"> - 3 + 3 </text> <text name="height_text_lbl4"> - 4(高) + 4(高) </text> <text name="height_text_lbl5"> 地形ã®éš†èµ·ç¯„囲 @@ -31,7 +31,7 @@ 数値ã¯ä¸Šã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ãƒ–レンド範囲を示ã—ã¾ã™ã€‚ </text> <text name="height_text_lbl11"> - 計測å˜ä½ã¯ãƒ¡ãƒ¼ãƒˆãƒ«ã§ã€ã€Œä½Žã€ã®å€¤ã¯ã€ï¼‘番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®ã€Œæœ€å¤§å€¤ã€ã§ã™ã€‚「高ã€ã®å€¤ã¯ã€ï¼”番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®ã€Œæœ€ä½Žå€¤ã€ã§ã™ã€‚ + 計測å˜ä½ã¯ãƒ¡ãƒ¼ãƒˆãƒ«ã§ã€ã€Œä½Žã€ã®å€¤ã¯ã€1番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®ã€Œæœ€å¤§å€¤ã€ã§ã™ã€‚「高ã€ã®å€¤ã¯ã€4番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®ã€Œæœ€ä½Žå€¤ã€ã§ã™ã€‚ </text> <text name="height_text_lbl6"> 北西 diff --git a/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml index c717b71194..68eb8b4f9d 100644 --- a/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml +++ b/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml @@ -8,7 +8,7 @@ </text> <scroll_list name="scripts_list"> <scroll_list.columns label="サイズ (㎅)" name="size"/> - <scroll_list.columns label="URL" name="urls"/> + <scroll_list.columns label="URL" name="urls"/> <scroll_list.columns label="オブジェクトå" name="name"/> <scroll_list.columns label="å ´æ‰€" name="location"/> </scroll_list> diff --git a/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml index 71dedb55a6..30c3fdc9b5 100644 --- a/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml +++ b/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml @@ -10,7 +10,7 @@ </text> <scroll_list name="scripts_list"> <scroll_list.columns label="サイズ (㎅)" name="size"/> - <scroll_list.columns label="URL" name="urls"/> + <scroll_list.columns label="URL" name="urls"/> <scroll_list.columns label="オブジェクトå" name="name"/> <scroll_list.columns label="ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…" name="owner"/> <scroll_list.columns label="区画" name="parcel"/> diff --git a/indra/newview/skins/default/xui/ja/panel_settings_sky_sunmoon.xml b/indra/newview/skins/default/xui/ja/panel_settings_sky_sunmoon.xml index f8837c40a7..844a556af1 100644 --- a/indra/newview/skins/default/xui/ja/panel_settings_sky_sunmoon.xml +++ b/indra/newview/skins/default/xui/ja/panel_settings_sky_sunmoon.xml @@ -44,8 +44,6 @@ <check_box label="ビーコンを表示" name="sunbeacon"/> </layout_panel> <layout_panel name="moon_layout"> - <layout_stack name="moon_stack"> - <layout_panel name="moon_layout"> <text name="moon_label"> 月 </text> @@ -74,8 +72,6 @@ </text> <slider name="moon_brightness"/> <check_box label="ビーコンを表示" name="moonbeacon"/> - </layout_panel> - </layout_stack> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_settings_water.xml b/indra/newview/skins/default/xui/ja/panel_settings_water.xml index ead1ca9b2f..2510523897 100644 --- a/indra/newview/skins/default/xui/ja/panel_settings_water.xml +++ b/indra/newview/skins/default/xui/ja/panel_settings_water.xml @@ -63,7 +63,7 @@ <text follows="left|top|right" font="SansSerif" height="16" layout="topleft" left_delta="-5" top_pad="5" width="215"> ブラー乗数 </text> - <slider control_name="water_blur_multip" follows="left|top" height="16" increment="0.001" initial_value="0" layout="topleft" left_delta="5" min_val="-0.5" max_val="0.5" name="water_blur_multip" top_pad="5" width="200" can_edit_text="true"/> + <slider control_name="water_blur_multip" follows="left|top" height="16" increment="0.001" initial_value="0" layout="topleft" left_delta="5" min_val="0" max_val="0.5" name="water_blur_multip" top_pad="5" width="200" can_edit_text="true"/> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml index c55c11e928..04ecba4264 100644 --- a/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml @@ -6,7 +6,7 @@ </text> <view_border name="hr"/> <combo_box label="è§£åƒåº¦" name="texture_size_combo"> - <combo_box.item label="ç¾åœ¨ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ (512✕512)" name="CurrentWindow"/> + <combo_box.item label="ç¾åœ¨ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="CurrentWindow"/> <combo_box.item label="å°ï¼ˆ128✕128)" name="Small(128x128)"/> <combo_box.item label="ä¸ï¼ˆ256✕256)" name="Medium(256x256)"/> <combo_box.item label="大(512✕512)" name="Large(512x512)"/> @@ -16,7 +16,7 @@ <spinner label="" name="inventory_snapshot_height"/> <check_box label="縦横比ã®å›ºå®š" name="inventory_keep_aspect_check"/> <text name="hint_lbl"> - ç”»åƒã‚’テクスãƒãƒ£ã¨ã—ã¦ä¿å˜ã™ã‚‹å ´åˆã¯ã€ã„ãšã‚Œã‹ã®æ£æ–¹å½¢ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + ç”»åƒã‚’インベントリã«ä¿å˜ã™ã‚‹ã«ã¯ L$[UPLOAD_COST] ã®è²»ç”¨ãŒã‹ã‹ã‚Šã¾ã™ã€‚ç”»åƒã‚’テクスãƒãƒ£ã¨ã—ã¦ä¿å˜ã™ã‚‹ã«ã¯å¹³æ–¹å½¢å¼ã® 1 ã¤ã‚’é¸æŠžã—ã¦ãã ã•ã„。 </text> <button label="ã‚ャンセル" name="cancel_btn"/> <button label="ä¿å˜" name="save_btn"/> diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml index 7a1aa280ec..a979e31c9a 100644 --- a/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_snapshot_options"> <button label="ディスクã«ä¿å˜" name="save_to_computer_btn"/> - <button label="インベントリã«ä¿å˜ï¼ˆL$ [AMOUNT])" name="save_to_inventory_btn"/> + <button label="インベントリã«ä¿å˜" name="save_to_inventory_btn"/> <button label="プãƒãƒ•ィールフィードã§å…±æœ‰ã™ã‚‹" name="save_to_profile_btn"/> <button label="メールã§é€ä¿¡" name="save_to_email_btn"/> <text name="fee_hint_lbl"> diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml index 9cb0b8f116..27a55aa653 100644 --- a/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml +++ b/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml @@ -10,7 +10,7 @@ é€ä¿¡ä¸â€¦ </string> <text name="title"> - Eメール + Eメール </text> <tab_container name="postcard_tabs"> <panel label="メッセージ" name="panel_postcard_message"/> diff --git a/indra/newview/skins/default/xui/ja/panel_status_bar.xml b/indra/newview/skins/default/xui/ja/panel_status_bar.xml index 9feae80624..bbb9d7daf1 100644 --- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml @@ -6,11 +6,11 @@ <panel.string name="bandwidth_tooltip"> 帯域幅 </panel.string> - <panel.string name="time"> - [ampm, datetime, slt] [hour12, datetime, slt]:[min, datetime, slt] [timezone,datetime, slt] + <panel.string name="time_ampm"> + [ampm, datetime, slt] [hour12, datetime, slt]:[min, datetime, slt] [timezone,datetime, slt] </panel.string> <panel.string name="timeTooltip"> - [year, datetime, slt]å¹´[month, datetime, slt]月[day, datetime, slt]日([weekday, datetime, slt]) + [year, datetime, slt]å¹´[month, datetime, slt][day, datetime, slt]日([weekday, datetime, slt]) </panel.string> <panel.string name="buycurrencylabel"> L$ [AMT] @@ -24,7 +24,7 @@ <button label="ショップ" name="goShop" tool_tip="Second Lifeã®ãƒžãƒ¼ã‚±ãƒƒãƒˆãƒ—レイスを開ãã¾ã™ã€‚" width="70"/> </panel> <text name="TimeText" tool_tip="ç¾åœ¨æ™‚刻(太平洋)"> - åˆå‰ã€€24:00 PST + åˆå‰ 24:00 PST </text> <icon image_name="Cam_FreeCam_Off" name="presets_icon_camera" tool_tip="カメラ"/> <icon image_name="Presets_Icon" name="presets_icon_graphic" tool_tip="グラフィックã®ãƒ—リセット"/> diff --git a/indra/newview/skins/default/xui/ja/panel_tools_texture.xml b/indra/newview/skins/default/xui/ja/panel_tools_texture.xml index 49efc529e4..968635e55b 100644 --- a/indra/newview/skins/default/xui/ja/panel_tools_texture.xml +++ b/indra/newview/skins/default/xui/ja/panel_tools_texture.xml @@ -17,7 +17,7 @@ </combo_box> <radio_group name="radio_material_type"> <radio_item label="テクスãƒãƒ£ (æ‹¡æ•£)" name="Texture (diffuse)" value="0"/> - <radio_item label="凹凸 (標準)" name="Bumpiness (normal)" value="1"/> + <radio_item label="凹凸 (法線)" name="Bumpiness (normal)" value="1"/> <radio_item label="è¼ã (åå°„)" name="Shininess (specular)" value="2"/> </radio_group> <check_box initial_value="false" label="繰り返ã—ã‚’ãƒãƒƒã‚¯ã™ã‚‹" name="checkbox_sync_settings" tool_tip="ã™ã¹ã¦ã®ãƒžãƒƒãƒ—ã®ç¹°ã‚Šè¿”ã—を調整ã™ã‚‹"/> @@ -79,7 +79,7 @@ </text> <color_swatch label="" name="shinycolorswatch" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> <text name="media_info"> - é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã®ï¼µï¼²ï¼¬ãŒã‚‚ã—ã‚れã°ã€ã“ã“ã«å…¥ã‚Šã¾ã™ã€‚ + é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã®URLãŒã‚‚ã—ã‚れã°ã€ã“ã“ã«å…¥ã‚Šã¾ã™ã€‚ </text> <button label="é¸æŠžâ€¦" name="add_media" tool_tip="ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’è¿½åŠ ã—ã¾ã™"/> <button label="削除" name="delete_media" tool_tip="ã“ã®ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’削除ã—ã¾ã™"/> diff --git a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml index fe9998b4ce..520ef848a0 100644 --- a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml @@ -19,7 +19,7 @@ 所有者ãŒã§ãã‚‹ã“ã¨ï¼š </panel.string> <panel.string name="acquiredDate"> - [year,datetime,local]å¹´[mth,datetime,local]月[day,datetime,local]æ—¥[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] + [year,datetime,local]å¹´[mth,datetime,local]月[day,datetime,local]æ—¥[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] </panel.string> <panel.string name="origin_inventory"> (インベントリ) diff --git a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml index 8ff543bf92..1240a2e670 100644 --- a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml @@ -48,7 +48,7 @@ <text name="Name:"> åå‰ï¼š </text> - <line_editor name="Object Name" tool_tip="使用ã§ãã‚‹åå‰ã®æ–‡å—æ•°ã¯æœ€å¤§ï¼–3文å—ã¾ã§ã§ã™ã€‚é•·ã„プリムåã¯çŸç¸®ã•れã¾ã™ã€‚åå‰ã«ä½¿ç”¨ã§ãã‚‹æ–‡å—ã¯ASCII-7 ï¼ˆéžæ‹¡å¼µï¼‰ã«å«ã¾ã‚Œã‚‹å°å—å¯èƒ½ãªæ–‡å—ã®ã¿ã§ã™ï¼ˆç¸¦ç·šã€Œ|ã€ã¯ä¾‹å¤–)。"/> + <line_editor name="Object Name" tool_tip="使用ã§ãã‚‹åå‰ã®æ–‡å—æ•°ã¯æœ€å¤§63æ–‡å—ã¾ã§ã§ã™ã€‚é•·ã„プリムåã¯çŸç¸®ã•れã¾ã™ã€‚åå‰ã«ä½¿ç”¨ã§ãã‚‹æ–‡å—ã¯ASCII-7 ï¼ˆéžæ‹¡å¼µï¼‰ã«å«ã¾ã‚Œã‚‹å°å—å¯èƒ½ãªæ–‡å—ã®ã¿ã§ã™ï¼ˆç¸¦ç·šã€Œ|ã€ã¯ä¾‹å¤–)。"/> <text name="Description:"> 説明: </text> @@ -68,7 +68,7 @@ <text name="label click action"> クリックã§ï¼š </text> - <combo_box name="clickaction" tool_tip="マウスã§ï¼‘回左クリックã™ã‚‹ã¨ã€ã‚ªãƒ–ジェクトã«å¯¾ã—ã¦ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’èµ·ã“ã›ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚å„クリックアクションã«ã¯ã€ä½•ãŒã§ãã‚‹ã‹ã‚’示ã™ç‰¹åˆ¥ãªã‚«ãƒ¼ã‚½ãƒ«ãŒã‚りã¾ã™ã€‚クリックアクションã«ã‚ˆã£ã¦ã¯ã€å‹•作è¦ä»¶ãŒå¿…è¦ãªã‚‚ã®ã‚‚ã‚りã¾ã™ã€‚例ãˆã°ã€ã€Œè§¦ã‚‹ã€ã‚„「支払ã„ã€ã«ã¯ã‚¹ã‚¯ãƒªãƒ—トãŒå¿…è¦ã«ãªã‚Šã¾ã™ã€‚"> + <combo_box name="clickaction" tool_tip="マウスã§1回左クリックã™ã‚‹ã¨ã€ã‚ªãƒ–ジェクトã«å¯¾ã—ã¦ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’èµ·ã“ã›ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚å„クリックアクションã«ã¯ã€ä½•ãŒã§ãã‚‹ã‹ã‚’示ã™ç‰¹åˆ¥ãªã‚«ãƒ¼ã‚½ãƒ«ãŒã‚りã¾ã™ã€‚クリックアクションã«ã‚ˆã£ã¦ã¯ã€å‹•作è¦ä»¶ãŒå¿…è¦ãªã‚‚ã®ã‚‚ã‚りã¾ã™ã€‚例ãˆã°ã€ã€Œè§¦ã‚‹ã€ã‚„「支払ã„ã€ã«ã¯ã‚¹ã‚¯ãƒªãƒ—トãŒå¿…è¦ã«ãªã‚Šã¾ã™ã€‚"> <combo_box.item label="触る(デフォルト)" name="Touch/grab(default)"/> <combo_box.item label="オブジェクトã«åº§ã‚‹" name="Sitonobject"/> <combo_box.item label="オブジェクトを買ã†" name="Buyobject"/> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index d04c514322..99909d80d1 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -31,7 +31,7 @@ ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚グラフィックドライãƒã‚’æ›´æ–°ã—ã¦ãã ã•ã„。 </string> <string name="AboutHeader"> - [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3]([ADDRESS_SIZE]bit) + [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3]([ADDRESS_SIZE]bit) [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] </string> <string name="BuildConfig"> @@ -39,16 +39,16 @@ </string> <string name="AboutPosition"> ã‚ãªãŸã¯ã€ç¾åœ¨[REGION]ã®[POSITION_LOCAL_0,number,1],[POSITION_LOCAL_1,number,1],[POSITION_LOCAL_2,number,1]ã«ã„ã¾ã™ã€‚ -ä½ç½®ã¯ã€<nolink>[HOSTNAME]</nolink>ã§ã™ã€‚([HOSTIP]) +ä½ç½®ã¯ã€<nolink>[HOSTNAME]</nolink>ã§ã™ã€‚ SLURL:<nolink>[SLURL]</nolink> (グãƒãƒ¼ãƒãƒ«åº§æ¨™ã¯ã€[POSITION_0,number,1],[POSITION_1,number,1],[POSITION_2,number,1]ã§ã™ã€‚) [SERVER_VERSION] [SERVER_RELEASE_NOTES_URL] </string> <string name="AboutSystem"> - CPU:[CPU] + CPU:[CPU] メモリ:[MEMORY_MB]㎆ -OSã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š[OS_VERSION] +OSã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š[OS_VERSION] ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰è£½é€ å…ƒï¼š[GRAPHICS_CARD_VENDOR] グラフィックカード:[GRAPHICS_CARD] </string> @@ -61,16 +61,15 @@ SLURL:<nolink>[SLURL]</nolink> <string name="AboutSettings"> ウィンドウサイズ:[WINDOW_WIDTH]x[WINDOW_HEIGHT] フォントサイズ調整:[FONT_SIZE_ADJUSTMENT]pt -UIスケーリング:[UI_SCALE] -æç”»è·é›¢ï¼š[DRAW_DISTANCE]ï½ -帯域幅:[NET_BANDWITH]kbitï¼ç§’ -LOD係数:[LOD_FACTOR] +UIスケーリング:[UI_SCALE] +æç”»è·é›¢ï¼š[DRAW_DISTANCE]m +帯域幅:[NET_BANDWITH]kbit/s +LOD係数:[LOD_FACTOR] æç”»ã®è³ªï¼š[RENDER_QUALITY] -高度ãªå…‰æºãƒ¢ãƒ‡ãƒ«ï¼š[GPU_SHADERS] テクスãƒãƒ£ãƒ¡ãƒ¢ãƒªï¼š[TEXTURE_MEMORY]㎆ </string> <string name="AboutOSXHiDPI"> - 高DPI表示モード:[HIDPI] + 高DPI表示モード:[HIDPI] </string> <string name="AboutLibs"> J2Cデコーダãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š[J2C_VERSION] @@ -83,10 +82,10 @@ LibVLCãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š[LIBVLC_VERSION] パケットæå¤±ï¼š[PACKETS_LOST,number,0]ï¼[PACKETS_IN,number,0]([PACKETS_PCT,number,1]%) </string> <string name="AboutTime"> - [year, datetime, slt]å¹´[month, datetime, slt]月[day, datetime, slt]日 [hour, datetime, slt]:[min,datetime, slt]:[second,datetime,slt] + [year, datetime, slt]å¹´[month, datetime, slt]月[day, datetime, slt]æ—¥ [hour, datetime, slt]:[min,datetime, slt]:[second,datetime,slt] </string> <string name="ErrorFetchingServerReleaseNotesURL"> - サーãƒãƒ¼ã®ãƒªãƒªãƒ¼ã‚¹ãƒŽãƒ¼ãƒˆã®ï¼µï¼²ï¼¬å–得時ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ + サーãƒãƒ¼ã®ãƒªãƒªãƒ¼ã‚¹ãƒŽãƒ¼ãƒˆã®URLå–得時ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ </string> <string name="BuildConfiguration"> ãƒ“ãƒ«ãƒ‰æ§‹æˆ @@ -358,7 +357,7 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 白黒 </string> <string name="Colors1970"> - 197ï¼å¹´ä»£ã®ã‚«ãƒ©ãƒ¼ + 1970年代ã®ã‚«ãƒ©ãƒ¼ </string> <string name="Intense"> 強調 @@ -541,7 +540,7 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 <string name="TooltipSLAPP"> クリックã—㦠secondlife:// コマンドを出ã—ã¾ã™ã€‚ </string> - <string name="CurrentURL" value="ç¾åœ¨ã®ï¼µï¼²ï¼¬ï¼š[CurrentURL]"/> + <string name="CurrentURL" value="ç¾åœ¨ã®URL:[CurrentURL]"/> <string name="TooltipEmail"> クリックã—ã¦é›»åメールを作æˆã—ã¾ã™ã€‚ </string> @@ -558,7 +557,7 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 ミュート解除 </string> <string name="SLappAgentIM"> - ï¼©ï¼ + IM </string> <string name="SLappAgentPay"> 支払ㄠ@@ -822,28 +821,28 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 æ³£ã </string> <string name="anim_dance1"> - ダンス1 + ダンス1 </string> <string name="anim_dance2"> - ダンス2 + ダンス2 </string> <string name="anim_dance3"> - ダンス3 + ダンス3 </string> <string name="anim_dance4"> - ダンス4 + ダンス4 </string> <string name="anim_dance5"> - ダンス5 + ダンス5 </string> <string name="anim_dance6"> - ダンス6 + ダンス6 </string> <string name="anim_dance7"> - ダンス7 + ダンス7 </string> <string name="anim_dance8"> - ダンス8 + ダンス8 </string> <string name="anim_express_disdain"> 侮蔑 @@ -1011,7 +1010,7 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 オフライン </string> <string name="worldmap_item_tooltip_format"> - [AREA]㎡ L$ [PRICE]([SQMPRICE] L$ï¼ãŽ¡ï¼‰ + [AREA]㎡ L$ [PRICE]([SQMPRICE] L$ï¼ãŽ¡ï¼‰ </string> <string name="worldmap_results_none_found"> 何も見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ @@ -1035,7 +1034,7 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 ã®ã•ã•ã‚„ã: </string> <string name="shout"> - ã®ã‚·ãƒ£ã‚¦ãƒˆï¼š + ã®å«ã³ï¼š </string> <string name="ringing"> インワールドボイスãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸â€¦ @@ -1143,16 +1142,16 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 ï¼ˆä¸æ˜Žï¼‰ </string> <string name="Estate / Full Region"> - ä¸å‹•産ï¼ãƒ•ルリージョン + ä¸å‹•産 / フルリージョン </string> <string name="Estate / Homestead"> - ä¸å‹•産ï¼å…¥æ¤åœ° + ä¸å‹•産 / ホームステッド </string> <string name="Mainland / Homestead"> - メインランドï¼å…¥æ¤åœ° + メインランド / ホームステッド </string> <string name="Mainland / Full Region"> - メインランドï¼ãƒ•ルリージョン + メインランド / フルリージョン </string> <string name="all_files"> å…¨ã¦ã®ãƒ•ァイル @@ -3226,7 +3225,7 @@ For AI Character: Get the closest navigable point to the point provided. 料金ã¯ã‚µãƒ–スクリプションã®ãƒ¬ãƒ™ãƒ«ã«ã‚ˆã‚Šç•°ãªã‚Šã¾ã™ã€‚レベルãŒé«˜ã„ã»ã©ã€æ–™é‡‘ãŒä¸‹ãŒã‚Šã¾ã™ã€‚[https://accounts.secondlife.com/change_membership/?lang=ja-JP 詳細] </string> <string name="Open landmarks"> - オープン ランドマーク + ランドマーク一覧を開ã </string> <string name="Unconstrained"> アンコンストレインド(制約ãªã—) @@ -3603,7 +3602,7 @@ For AI Character: Get the closest navigable point to the point provided. ã‚ãªãŸã¯ã€å‘¨å›²ã®èª°ã‹ã‚‰ã‚‚見ãˆã¦ã„ãªã„å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ </string> <string name="hud_description_total"> - 利用ä¸ã®ï¼¨ï¼µï¼¤ + 利用ä¸ã®HUD </string> <string name="hud_name_with_joint"> [OBJ_NAME]([JNT_NAME]ã«è£…ç€ä¸ï¼‰ @@ -3696,7 +3695,7 @@ For AI Character: Get the closest navigable point to the point provided. å¹´é½¢æœªç¢ºèª </string> <string name="Center 2"> - ä¸å¤®ï¼’ + ä¸å¤®2 </string> <string name="Top Right"> å³ä¸Š @@ -3875,19 +3874,19 @@ For AI Character: Get the closest navigable point to the point provided. 区画一覧:[PARCELS]個 </string> <string name="ScriptLimitsMemoryUsed"> - 使用ã•れãŸãƒ¡ãƒ¢ãƒªï¼š[MAX]㎅ä¸[COUNT]㎅ [AVAILABLE]ãŽ…åˆ©ç”¨å¯ + 使用ã•れãŸãƒ¡ãƒ¢ãƒªï¼š[MAX]㎅ä¸[COUNT]㎅ [AVAILABLE]ãŽ…åˆ©ç”¨å¯ </string> <string name="ScriptLimitsMemoryUsedSimple"> 使用ã•れãŸãƒ¡ãƒ¢ãƒªï¼š[COUNT]㎅ </string> <string name="ScriptLimitsParcelScriptURLs"> - 区画ã®ã‚¹ã‚¯ãƒªãƒ—トURL + 区画ã®ã‚¹ã‚¯ãƒªãƒ—トURL </string> <string name="ScriptLimitsURLsUsed"> - 使用ã•れãŸï¼µï¼²ï¼¬ï¼š[MAX]ä»¶ä¸[COUNT]件 [AVAILABLE]ä»¶åˆ©ç”¨å¯ + 使用ã•れãŸURL:[MAX]ä»¶ä¸[COUNT]ä»¶ [AVAILABLE]ä»¶åˆ©ç”¨å¯ </string> <string name="ScriptLimitsURLsUsedSimple"> - 使用ã•れãŸï¼µï¼²ï¼¬ï¼š[COUNT]ä»¶ + 使用ã•れãŸURL:[COUNT]ä»¶ </string> <string name="ScriptLimitsRequestError"> æƒ…å ±ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—㟠@@ -3998,28 +3997,28 @@ For AI Character: Get the closest navigable point to the point provided. å³èƒ¸ç‹ </string> <string name="ATTACH_HUD_CENTER_2"> - HUD(ä¸å¤® 2) + HUD(ä¸å¤® 2) </string> <string name="ATTACH_HUD_TOP_RIGHT"> - HUD(å³ä¸Šï¼‰ + HUD(å³ä¸Šï¼‰ </string> <string name="ATTACH_HUD_TOP_CENTER"> - HUD(上・ä¸å¤®ï¼‰ + HUD(上・ä¸å¤®ï¼‰ </string> <string name="ATTACH_HUD_TOP_LEFT"> - HUD(左上) + HUD(左上) </string> <string name="ATTACH_HUD_CENTER_1"> - HUD(ä¸å¤® 1) + HUD(ä¸å¤® 1) </string> <string name="ATTACH_HUD_BOTTOM_LEFT"> - HUD(左下) + HUD(左下) </string> <string name="ATTACH_HUD_BOTTOM"> - HUD(下) + HUD(下) </string> <string name="ATTACH_HUD_BOTTOM_RIGHT"> - HUD(å³ä¸‹ï¼‰ + HUD(å³ä¸‹ï¼‰ </string> <string name="ATTACH_NECK"> 首 @@ -4079,10 +4078,10 @@ For AI Character: Get the closest navigable point to the point provided. [COUNT]件見ã¤ã‹ã‚Šã¾ã—㟠</string> <string name="PanelDirTimeStr"> - [ampm,datetime,utc] [hour12,datetime,utc]:[min,datetime,utc] + [ampm,datetime,utc] [hour12,datetime,utc]:[min,datetime,utc] </string> <string name="PanelDirEventsDateText"> - [mthnum,datetime,slt]ï¼[day,datetime,slt] + [mthnum,datetime,slt]/[day,datetime,slt] </string> <string name="PanelContentsTooltip"> オブジェクトã®ä¸èº« @@ -4546,10 +4545,10 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã ピクセル形å¼ãŒè¨å®šã§ãã¾ã›ã‚“。 </string> <string name="MBGLContextErr"> - GLレンダーコンテã‚ストãŒä½œã‚Œã¾ã›ã‚“ + GLレンダーコンテã‚ストãŒä½œã‚Œã¾ã›ã‚“ </string> <string name="MBGLContextActErr"> - GLレンダーコンテã‚ストを有効化ã§ãã¾ã›ã‚“。 + GLレンダーコンテã‚ストを有効化ã§ãã¾ã›ã‚“。 </string> <string name="MBVideoDrvErr"> ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューターã®ãƒ“デオカードã®ãƒ‰ãƒ©ã‚¤ãƒãŒæ£å¸¸ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ãªã„ã‹ã€å¤ã„ã¾ãŸã¯ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ãŸã‚ã€[APP_NAME]を実行ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ @@ -6150,11 +6149,15 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã <string name="inventory_folder_offered-im"> フォルダ「[ITEM_NAME]ã€ãŒã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«é€ã‚‰ã‚Œã¦ãã¾ã—ãŸã€‚ </string> + <string name="bot_warning"> + [NAME]ã¨ãƒãƒ£ãƒƒãƒˆã—ã¦ã„ã¾ã™ã€‚å€‹äººæƒ…å ±ã‚’å…±æœ‰ã—ãªã„ã§ãã ã•ã„。 +詳細㯠https://second.life/scripted-agents ã‚’ã”覧ãã ã•ã„。 + </string> <string name="share_alert"> インベントリã‹ã‚‰ã“ã“ã«ã‚¢ã‚¤ãƒ†ãƒ をドラッグã—ã¾ã™ã€‚ </string> <string name="no_session_message"> - (Iï¼ã‚»ãƒƒã‚·ãƒ§ãƒ³ãŒå˜åœ¨ã—ã¾ã›ã‚“) + (IMセッションãŒå˜åœ¨ã—ã¾ã›ã‚“) </string> <string name="only_user_message"> ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã„るユーザーã¯ã‚ãªãŸã ã‘ã§ã™ã€‚ @@ -6579,28 +6582,28 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã 一時退å¸ä¸ </string> <string name="dance1"> - ダンス1 + ダンス1 </string> <string name="dance2"> - ダンス2 + ダンス2 </string> <string name="dance3"> - ダンス3 + ダンス3 </string> <string name="dance4"> - ダンス4 + ダンス4 </string> <string name="dance5"> - ダンス5 + ダンス5 </string> <string name="dance6"> - ダンス6 + ダンス6 </string> <string name="dance7"> - ダンス7 + ダンス7 </string> <string name="dance8"> - ダンス8 + ダンス8 </string> <string name="AvatarBirthDateFormat"> [year,datetime,slt]å¹´[mthnum,datetime,slt]月[day,datetime,slt]æ—¥ @@ -6620,7 +6623,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã <string name="outfit_photo_verify_dimensions_error"> ç”»åƒã®å¯¸æ³•を確èªã§ãã¾ã›ã‚“。画åƒã‚µã‚¤ã‚ºãŒãƒ”ッカーã«è¡¨ç¤ºã•れるã¾ã§ãŠå¾…ã¡ãã ã•ã„。 </string> - <string name="sentences_separator" value=" "/> + <string name="sentences_separator" value=" "/> <string name="words_separator" value="ã€"/> <string name="server_is_down"> 大変申ã—訳ã”ã–ã„ã¾ã›ã‚“ãŒã€äºˆæœŸã—ãªã„å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚サービスã«é–¢ã™ã‚‹æ—¢çŸ¥ã®å•題ã«ã¤ã„ã¦ã¯ã€ https://status.secondlifegrid.net/?lang=ja-JP ã‚’ã”覧ãã ã•ã„。 @@ -6633,7 +6636,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã æ—¥:月:ç«:æ°´:木:金:土 </string> <string name="dateTimeMonthNames"> - 1月:2月:3月:4月:5月:6月:7月:8月:9月:ï¼‘ï¼æœˆ:11月:12月 + 1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月 </string> <string name="dateTimeMonthShortNames"> ã‹€:ã‹:ã‹‚:㋃:ã‹„:ã‹…:㋆:㋇:㋈:㋉:㋊:ã‹‹ @@ -7105,7 +7108,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã パーティクルをéžè¡¨ç¤º </string> <string name="Command_360_Capture_Label"> - 36ï¼åº¦ï¼³ã‚·ãƒ§ãƒƒãƒˆ + 360度スナップショット </string> <string name="Command_AboutLand_Label"> åœŸåœ°æƒ…å ± @@ -7195,7 +7198,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã ボイスè¨å®š </string> <string name="Command_360_Capture_Tooltip"> - 36ï¼åº¦ã®æ£è·å††ç’図法ã®ã‚¹ãƒŠãƒƒãƒ—ショット画åƒã‚’撮影ã—ã¾ã™ã€‚ + 360åº¦ã®æ£è·å††ç’図法ã®ã‚¹ãƒŠãƒƒãƒ—ショット画åƒã‚’撮影ã—ã¾ã™ã€‚ </string> <string name="Command_AboutLand_Tooltip"> 訪å•å…ˆã«é–¢ã™ã‚‹æƒ…å ±ã‚’è¡¨ç¤ºã—ã¾ã™ã€‚ @@ -7480,7 +7483,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã 物ç†å½¢çжã«ä¸æ£ãªç¢ºèªãƒ‡ãƒ¼ã‚¿ãŒã‚りã¾ã™ã€‚物ç†ãƒ¢ãƒ‡ãƒ«ã‚’ä¿®æ£ã—ã¦ãã ã•ã„。 </string> <string name="Mav_Details_MAV_BLOCK_MISSING"> - データãŒã‚りã¾ã›ã‚“。高LODãŒå˜åœ¨ã—ã€æœ‰åйã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。è¨å®šã•れã¦ã„ãªã„å ´åˆã¯ã€ç‰©ç†ãƒ¢ãƒ‡ãƒ«ã‚’è¨å®šã—ã¾ã™ã€‚ + データãŒã‚りã¾ã›ã‚“。高LODãŒå˜åœ¨ã—ã€æœ‰åйã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。è¨å®šã•れã¦ã„ãªã„å ´åˆã¯ã€ç‰©ç†ãƒ¢ãƒ‡ãƒ«ã‚’è¨å®šã—ã¾ã™ã€‚ </string> <string name="Mav_Details_MAV_UNKNOWN_VERSION"> 物ç†å½¢çжã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒæ£ã—ãã‚りã¾ã›ã‚“。物ç†ãƒ¢ãƒ‡ãƒ«ã«æ£ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’è¨å®šã—ã¦ãã ã•ã„。 @@ -7491,7 +7494,7 @@ www.secondlife.com ã®ã‚¦ã‚§ãƒ–ã‚µã‚¤ãƒˆã«æŽ¥ç¶šã§ãã‚‹ã‹ã”確èªãã ã•ã æŽ¥ç¶šã§ãã¦ã‚‚ã€ã“ã®ã‚¨ãƒ©ãƒ¼ãŒç¶™ç¶šçš„ã«èµ·ã“ã‚‹å ´åˆã¯ã€ã‚µãƒãƒ¼ãƒˆã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‹ã‚‰å•é¡Œã‚’å ±å‘Šã—ã¦ãã ã•ã„。 </string> <string name="ssl_peer_certificate"> - ãƒã‚°ã‚¤ãƒ³ã‚µãƒ¼ãƒãƒ¼ãŒï¼³ï¼³ï¼¬çµŒç”±ã§ç¢ºèªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + ãƒã‚°ã‚¤ãƒ³ã‚µãƒ¼ãƒãƒ¼ãŒSSL経由ã§ç¢ºèªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ ã“ã®ã‚¨ãƒ©ãƒ¼ãŒç¶™ç¶šçš„ã«èµ·ã“ã‚‹å ´åˆã¯ã€Secondlife.com ã®ã‚µãƒãƒ¼ãƒˆã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‹ã‚‰å•é¡Œã‚’å ±å‘Šã—ã¦ãã ã•ã„。 </string> <string name="ssl_connect_error"> diff --git a/indra/newview/skins/default/xui/ja/teleport_strings.xml b/indra/newview/skins/default/xui/ja/teleport_strings.xml index c1be98bef9..cdfdb1628b 100644 --- a/indra/newview/skins/default/xui/ja/teleport_strings.xml +++ b/indra/newview/skins/default/xui/ja/teleport_strings.xml @@ -47,7 +47,7 @@ インベントリシステムã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。 </message> <message name="MustGetAgeRegion"> - ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«å…¥ã‚‹ã«ã¯ã€ï¼‘8æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«å…¥ã‚‹ã«ã¯ã€18æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ </message> <message name="RegionTPSpecialUsageBlocked"> リージョンã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 diff --git a/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml b/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml index 18f5a40ea5..ee5e4d277c 100644 --- a/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml @@ -14,7 +14,7 @@ prerenderowane kompozytowe </text> <button label="Zrzuć ID do Konsoli" label_selected="Zrzuć" name="Dump" /> - <panel name="scroll_content_panel"> + <panel name="scroll_content_panel2"> <texture_picker label="WÅ‚osy" name="hair-baked" /> <texture_picker label="WÅ‚osy" name="hair_grain" /> <texture_picker label="Alpha wÅ‚osów" name="hair_alpha" /> diff --git a/indra/newview/skins/default/xui/pl/panel_progress.xml b/indra/newview/skins/default/xui/pl/panel_progress.xml index 8da982cc3f..3f68a32a7f 100644 --- a/indra/newview/skins/default/xui/pl/panel_progress.xml +++ b/indra/newview/skins/default/xui/pl/panel_progress.xml @@ -5,6 +5,11 @@ <layout_stack name="vertical_centering1"> <layout_panel name="panel4"> <layout_stack name="vertical_centering2"> + <layout_panel name="panel_icons"> + <text name="logos_lbl"> + Megapahit używa + </text> + </layout_panel> </layout_stack> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/pl/panel_settings_sky_sunmoon.xml b/indra/newview/skins/default/xui/pl/panel_settings_sky_sunmoon.xml index f807148617..7f9dee2369 100644 --- a/indra/newview/skins/default/xui/pl/panel_settings_sky_sunmoon.xml +++ b/indra/newview/skins/default/xui/pl/panel_settings_sky_sunmoon.xml @@ -35,8 +35,6 @@ <check_box label="Pokaż emiter" name="sunbeacon" /> </layout_panel> <layout_panel name="moon_layout"> - <layout_stack name="moon_stack"> - <layout_panel name="moon_layout"> <text name="moon_label"> Księżyc </text> @@ -59,8 +57,6 @@ Jasność: </text> <check_box label="Pokaż emiter" name="moonbeacon" /> - </layout_panel> - </layout_stack> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_snapshot_options.xml b/indra/newview/skins/default/xui/pl/panel_snapshot_options.xml index 016b9ca197..04c01940e1 100644 --- a/indra/newview/skins/default/xui/pl/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/pl/panel_snapshot_options.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel name="panel_snapshot_options"> <button label="Zapisz na dysku twardym" name="save_to_computer_btn" /> - <button label="Zapisz do Szafy ([AMOUNT]L$)" name="save_to_inventory_btn" /> + <button label="Zapisz do Szafy" name="save_to_inventory_btn" /> <button label="WyÅ›lij na mój KanaÅ‚" name="save_to_profile_btn" /> <button label="ZaÅ‚aduj na Facebook" name="send_to_facebook_btn" /> <button label="ZaÅ‚aduj na Twitter" name="send_to_twitter_btn" /> diff --git a/indra/newview/skins/default/xui/pl/panel_status_bar.xml b/indra/newview/skins/default/xui/pl/panel_status_bar.xml index d50ed3387c..12091225f7 100644 --- a/indra/newview/skins/default/xui/pl/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/pl/panel_status_bar.xml @@ -6,9 +6,6 @@ <panel.string name="bandwidth_tooltip"> Przepustowość </panel.string> - <panel.string name="time"> - [hour, datetime, slt]:[min, datetime, slt] [timezone,datetime, slt] - </panel.string> <panel.string name="buycurrencylabel"> [AMT] L$ </panel.string> diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index 26ec6cc9dc..7a61878618 100644 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml @@ -22,14 +22,14 @@ Konfiguracja budowania: [BUILD_CONFIG] </string> <string name="AboutPosition"> -PoÅ‚ożenie [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] w [REGION] zlokalizowanym w <nolink>[HOSTNAME]</nolink> + PoÅ‚ożenie [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] w [REGION] zlokalizowanym w <nolink>[HOSTNAME]</nolink> SLURL: <nolink>[SLURL]</nolink> (koordynaty globalne [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] [SERVER_RELEASE_NOTES_URL] </string> <string name="AboutSystem"> -Procesor (CPU): [CPU] + Procesor (CPU): [CPU] Pamięć (Memory): [MEMORY_MB] MB System operacyjny (OS Version): [OS_VERSION] Dostawca karty graficznej (Graphics Card Vendor): [GRAPHICS_CARD_VENDOR] @@ -42,14 +42,13 @@ Karta graficzna (Graphics Card): [GRAPHICS_CARD] Wersja OpenGL: [OPENGL_VERSION] </string> <string name="AboutSettings"> -Rozmiar okna (Window size): [WINDOW_WIDTH]x[WINDOW_HEIGHT] + Rozmiar okna (Window size): [WINDOW_WIDTH]x[WINDOW_HEIGHT] Dostrojenie rozmiaru czcionki: [FONT_SIZE_ADJUSTMENT]pt Skalowanie interfejsu (UI Scaling): [UI_SCALE] Pole widzenia (Draw Distance): [DRAW_DISTANCE]m Przepustowość (Bandwidth): [NET_BANDWITH]kbit/s Mnożnik poziomu detali (LOD Factor): [LOD_FACTOR] Jakość wyÅ›wietlania (Render quality): [RENDER_QUALITY] -Zaawansowane oÅ›wietlenie (Advanced Lighting Model): [GPU_SHADERS] Pamięć tekstur (Texture memory): [TEXTURE_MEMORY]MB Pamięć podrÄ™czna dysku (Disk cache): [DISK_CACHE_INFO] </string> @@ -57,7 +56,7 @@ Pamięć podrÄ™czna dysku (Disk cache): [DISK_CACHE_INFO] Tryb obrazu HiDPI: [HIDPI] </string> <string name="AboutLibs"> -Wersja dekodera J2C: [J2C_VERSION] + Wersja dekodera J2C: [J2C_VERSION] Wersja sterownika dźwiÄ™ku (Audio Driver): [AUDIO_DRIVER_VERSION] [LIBCEF_VERSION] Wersja LibVLC: [LIBVLC_VERSION] @@ -573,7 +572,7 @@ JeÅ›li myÅ›lisz, że to błąd skontaktuj siÄ™ z support@secondlife.com UsuniÄ™cie znajomego </string> <string name="BUTTON_CLOSE_DARWIN"> - Zamknij (⌘W) + Zamknij (⌘W) </string> <string name="BUTTON_CLOSE_WIN"> Zamknij (Ctrl+W) @@ -597,11 +596,11 @@ JeÅ›li myÅ›lisz, że to błąd skontaktuj siÄ™ z support@secondlife.com Pokaż Pomoc </string> <string name="TooltipNotecardNotAllowedTypeDrop"> -Przedmioty tego typu nie mogÄ… być dołączane + Przedmioty tego typu nie mogÄ… być dołączane do notek z tego regionu. </string> <string name="TooltipNotecardOwnerRestrictedDrop"> -Tylko przedmioty z nieograniczonymi + Tylko przedmioty z nieograniczonymi uprawnieniami 'nastÄ™pnego wÅ‚aÅ›ciciela' mogÄ… być dołączane do notek. </string> @@ -1623,7 +1622,7 @@ JeÅ›li ciÄ…gle otrzymujesz tÄ… wiadomość, to skontaktuj siÄ™ z pomocÄ… technic <string name="Scripts" value=" Skrypty,"/> <string name="Sounds" value=" DźwiÄ™ki,"/> <string name="Textures" value=" Tekstury,"/> - <string name="Settings" value=" Otoczenia," /> + <string name="Settings" value=" Otoczenia,"/> <string name="Snapshots" value=" ZdjÄ™cia,"/> <string name="No Filters" value="Nie "/> <string name="Since Logoff" value=" - od wylogowania"/> @@ -4360,7 +4359,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. (Zapisano [LONG_TIMESTAMP]) </string> <string name="IM_unblock_only_groups_friends"> - Aby zobaczyć tÄ… wiadomość musisz odznaczyć 'Tylko znajomi i grupy mogÄ… wysyÅ‚ać mi wiad. prywatne (IM) oraz rozmowy gÅ‚osowe' w Ustawieniach/PrywatnoÅ›ci. + Aby zobaczyć tÄ… wiadomość musisz odznaczyć 'Tylko znajomi i grupy mogÄ… wysyÅ‚ać mi wiad. prywatne (IM) oraz rozmowy gÅ‚osowe' w Ustawieniach/PrywatnoÅ›ci. </string> <string name="OnlineStatus"> dostÄ™pny/a @@ -4413,6 +4412,10 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. <string name="inventory_folder_offered-im"> Zaoferowano folder: '[ITEM_NAME]' </string> + <string name="bot_warning"> + Rozmawiasz z botem [NAME]. Nie udostÄ™pniaj żadnych danych osobowych. +Dowiedz siÄ™ wiÄ™cej na https://second.life/scripted-agents. + </string> <string name="share_alert"> PrzeciÄ…gaj tutaj rzeczy z Szafy </string> @@ -5287,10 +5290,10 @@ Spróbuj załączyć Å›cieżkÄ™ do edytora w cytowaniu. Otoczenie </string> <string name="logging_calls_disabled_log_empty"> - Rozmowy nie sÄ… zapisywane do dziennika. JeÅ›li chcesz zacząć je logować wybierz "Zapisywanie: tylko dziennik" lub "Zapisywanie: dziennik i logi rozmów" w Preferencje > Czat. + Rozmowy nie sÄ… zapisywane do dziennika. JeÅ›li chcesz zacząć je logować wybierz "Zapisywanie: tylko dziennik" lub "Zapisywanie: dziennik i logi rozmów" w Preferencje > Czat. </string> <string name="logging_calls_disabled_log_not_empty"> - Rozmowy nie bÄ™dÄ… wiÄ™cej zapisywane. JeÅ›li chcesz kontynuować ich logowanie wybierz "Zapisywanie: tylko dziennik" lub "Zapisywanie: dziennik i logi rozmów" w Preferencje > Czat. + Rozmowy nie bÄ™dÄ… wiÄ™cej zapisywane. JeÅ›li chcesz kontynuować ich logowanie wybierz "Zapisywanie: tylko dziennik" lub "Zapisywanie: dziennik i logi rozmów" w Preferencje > Czat. </string> <string name="logging_calls_enabled_log_empty"> Nie ma zapisanych rozmów. JeÅ›li skontaktujesz siÄ™ z kimÅ›, lub ktoÅ› z TobÄ…, to wpis dziennika pojawi siÄ™ tutaj. diff --git a/indra/newview/skins/default/xui/pl/teleport_strings.xml b/indra/newview/skins/default/xui/pl/teleport_strings.xml index e86255100e..e091f79fe4 100644 --- a/indra/newview/skins/default/xui/pl/teleport_strings.xml +++ b/indra/newview/skins/default/xui/pl/teleport_strings.xml @@ -22,7 +22,7 @@ Spróbuj jeszcze raz. </message> <message name="NoHelpIslandTP"> Brak możliwoÅ›ci ponownej teleportacji do Welcome Island. -Odwiedź 'Welcome Island Public' by powtórzyć szkolenie. +Odwiedź 'Welcome Island Public' by powtórzyć szkolenie. </message> <message name="noaccess_tport"> Przepraszamy, ale nie masz dostÄ™pu do miejsca docelowego. diff --git a/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml b/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml index 6cdf66cb14..3a0c2febd7 100644 --- a/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml @@ -8,7 +8,7 @@ Texturas</text> <text name="composite_label">Compósito: Texturas</text> <button label="Enviar IDs para painel" label_selected="Dump" name="Dump"/> - <panel name="scroll_content_panel"> + <panel name="scroll_content_panel2"> <texture_picker label="Cabelo" name="hair-baked"/> <texture_picker label="Cabelo" name="hair_grain"/> <texture_picker label="Cabelo alpha" name="hair_alpha"/> diff --git a/indra/newview/skins/default/xui/pt/floater_search.xml b/indra/newview/skins/default/xui/pt/floater_search.xml deleted file mode 100644 index 3509cb786d..0000000000 --- a/indra/newview/skins/default/xui/pt/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> - <floater.string name="loading_text"> - Carregando... - </floater.string> - <floater.string name="done_text"> - Pronto - </floater.string> - <layout_stack name="stack1"> - <layout_panel name="browser_layout"> - <text name="refresh_search"> - Buscar novamente com status God - </text> - </layout_panel> - </layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/pt/panel_progress.xml b/indra/newview/skins/default/xui/pt/panel_progress.xml index c9bed9fd9b..be0364a70a 100644 --- a/indra/newview/skins/default/xui/pt/panel_progress.xml +++ b/indra/newview/skins/default/xui/pt/panel_progress.xml @@ -1,8 +1,10 @@ <?xml version="1.0" ?> <panel name="login_progress_panel"> + <layout_panel name="panel_icons"/> <layout_stack name="vertical_centering"/> <layout_panel name="panel4"/> <layout_panel name="center"/> <layout_stack name="horizontal_centering"> + <text name="logos_lbl">Usos do Megapahit</text> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml index f3357026d5..28a5142baa 100644 --- a/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@ Salvar uma imagem em seu inventário custa L$[UPLOAD_COST]. Para salvar sua imagem como uma textura, selecione um dos formatos quadrados. </text> <combo_box label="Resolução" name="texture_size_combo"> - <combo_box.item label="Janela ativa (512x512)" name="CurrentWindow"/> + <combo_box.item label="Janela ativa" name="CurrentWindow"/> <combo_box.item label="Pequeno (128x128)" name="Small(128x128)"/> <combo_box.item label="Médio (256x256)" name="Medium(256x256)"/> <combo_box.item label="Grande (512x512)" name="Large(512x512)"/> diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml index 067e5dbd76..f71bc7cd12 100644 --- a/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_snapshot_options"> <button label="Salvar no disco" name="save_to_computer_btn"/> - <button label="Salvar em inventário (L$[AMOUNT])" name="save_to_inventory_btn"/> + <button label="Salvar em inventário" name="save_to_inventory_btn"/> <button label="Compartilhar no feed do perfil" name="save_to_profile_btn"/> <button label="Compartilhar no Facebook" name="send_to_facebook_btn"/> <button label="Compartilhar no Twitter" name="send_to_twitter_btn"/> diff --git a/indra/newview/skins/default/xui/pt/panel_status_bar.xml b/indra/newview/skins/default/xui/pt/panel_status_bar.xml index 9e15f9a02c..47712ad28b 100644 --- a/indra/newview/skins/default/xui/pt/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/pt/panel_status_bar.xml @@ -6,7 +6,7 @@ <panel.string name="bandwidth_tooltip"> Banda </panel.string> - <panel.string name="time"> + <panel.string name="time_ampm"> [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] </panel.string> <panel.string name="timeTooltip"> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 0b12dd2aa0..34ddf434f2 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -1,575 +1,1628 @@ <?xml version="1.0" ?> <strings> - <string name="CAPITALIZED_APP_NAME">MEGAPAHIT</string> - <string name="SUPPORT_SITE">Portal de Supporte Second Life</string> - <string name="StartupDetectingHardware">Detectando hardware...</string> - <string name="StartupLoading">Carregando [APP_NAME]...</string> - <string name="StartupClearingCache">Limpando o cache...</string> - <string name="StartupInitializingTextureCache">Iniciando cache de texturas...</string> - <string name="StartupRequireDriverUpdate">Falha na inicialização dos gráficos. Atualize seu driver gráfico!</string> - <string name="AboutHeader">[CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) -[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]</string> - <string name="BuildConfig">Configuração do corpo [BUILD_CONFIG]</string> - <string name="AboutPosition">Você está em [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] em [REGION] localizado em <nolink>[HOSTNAME]</nolink> ([HOSTIP]) + <string name="CAPITALIZED_APP_NAME"> + MEGAPAHIT + </string> + <string name="SUPPORT_SITE"> + Portal de Supporte Second Life + </string> + <string name="StartupDetectingHardware"> + Detectando hardware... + </string> + <string name="StartupLoading"> + Carregando [APP_NAME]... + </string> + <string name="StartupClearingCache"> + Limpando o cache... + </string> + <string name="StartupInitializingTextureCache"> + Iniciando cache de texturas... + </string> + <string name="StartupRequireDriverUpdate"> + Falha na inicialização dos gráficos. Atualize seu driver gráfico! + </string> + <string name="AboutHeader"> + [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) +[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] + </string> + <string name="BuildConfig"> + Configuração do corpo [BUILD_CONFIG] + </string> + <string name="AboutPosition"> + Você está em [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] em [REGION] localizado em <nolink>[HOSTNAME]</nolink> SLURL: <nolink>[SLURL]</nolink> (coordenadas globais [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] -[SERVER_RELEASE_NOTES_URL]</string> - <string name="AboutSystem">CPU: [CPU] +[SERVER_RELEASE_NOTES_URL] + </string> + <string name="AboutSystem"> + CPU: [CPU] Memória: [MEMORY_MB] MBs Versão OS: [OS_VERSION] Placa de vÃdeo: [GRAPHICS_CARD_VENDOR] -Placa gráfica: [GRAPHICS_CARD]</string> - <string name="AboutDriver">Versão do driver de vÃdeo Windows: [GRAPHICS_DRIVER_VERSION]</string> - <string name="AboutOGL">Versão do OpenGL: [OPENGL_VERSION]</string> - <string name="AboutSettings">Tamanho da janela: [WINDOW_WIDTH]x[WINDOW_HEIGHT] +Placa gráfica: [GRAPHICS_CARD] + </string> + <string name="AboutDriver"> + Versão do driver de vÃdeo Windows: [GRAPHICS_DRIVER_VERSION] + </string> + <string name="AboutOGL"> + Versão do OpenGL: [OPENGL_VERSION] + </string> + <string name="AboutSettings"> + Tamanho da janela: [WINDOW_WIDTH]x[WINDOW_HEIGHT] Ajuste do tamanho da fonte: [FONT_SIZE_ADJUSTMENT]pt UI Escala: [UI_SCALE] Estabelecer a distância: [DRAW_DISTANCE]m Largura da banda: [NET_BANDWITH]kbit/s LOD fator: [LOD_FACTOR] Qualidade de renderização: [RENDER_QUALITY] -Modelo avançado de luzes: [GPU_SHADERS] -Memória de textura: [TEXTURE_MEMORY]MB</string> - <string name="AboutOSXHiDPI">HiDPI modo de exibição: [HIDPI]</string> - <string name="AboutLibs">Versão do J2C Decoder: [J2C_VERSION] +Memória de textura: [TEXTURE_MEMORY]MB + </string> + <string name="AboutOSXHiDPI"> + HiDPI modo de exibição: [HIDPI] + </string> + <string name="AboutLibs"> + Versão do J2C Decoder: [J2C_VERSION] Versão do driver de áudio: [AUDIO_DRIVER_VERSION] [LIBCEF_VERSION] Versão do LibVLC: [LIBVLC_VERSION] -Versão do servidor de voz: [VOICE_VERSION]</string> - <string name="AboutTraffic">Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)</string> - <string name="AboutTime">[month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]</string> - <string name="ErrorFetchingServerReleaseNotesURL">Erro ao obter URL de notas de versão do servidor.</string> - <string name="BuildConfiguration">Configuração do corpo</string> - <string name="ProgressRestoring">Restaurando...</string> - <string name="ProgressChangingResolution">Alterando a resolução...</string> - <string name="Fullbright">Fullbright (antigo)</string> - <string name="LoginInProgress">Fazendo login. [APP_NAME] pode parecer congelado. Por favor, aguarde.</string> - <string name="LoginInProgressNoFrozen">Logando...</string> - <string name="LoginAuthenticating">Autenticando</string> - <string name="LoginMaintenance">Executando manutenção da conta...</string> - <string name="LoginAttempt">Falha na tentativa anterior de login. Login, tentativa [NUMBER]</string> - <string name="LoginPrecaching">Carregando mundo...</string> - <string name="LoginInitializingBrowser">Inicializando navegador embutido...</string> - <string name="LoginInitializingMultimedia">Inicializando multimÃdia...</string> - <string name="LoginInitializingFonts">Carregando fontes...</string> - <string name="LoginVerifyingCache">Verificando arquivos cache (pode levar de 60-90 segundos)...</string> - <string name="LoginProcessingResponse">Processando resposta...</string> - <string name="LoginInitializingWorld">Inicializando mundo...</string> - <string name="LoginDecodingImages">Decodificando imagens...</string> - <string name="LoginInitializingQuicktime">Inicializando o QuickTime...</string> - <string name="LoginQuicktimeNotFound">O QuickTime não foi encontrado - falha ao iniciar.</string> - <string name="LoginQuicktimeOK">O QuickTime foi inicializado com sucesso.</string> - <string name="LoginRequestSeedCapGrant">Solicitando recursos da região...</string> - <string name="LoginRetrySeedCapGrant">Solicitando recursos da região, tentativa [NUMBER]...</string> - <string name="LoginWaitingForRegionHandshake">Aguardando handshake com a região...</string> - <string name="LoginConnectingToRegion">Conectando à região...</string> - <string name="LoginDownloadingClothing">Baixando roupas...</string> - <string name="InvalidCertificate">O servidor respondeu com um certificado inválido ou corrompido. Por favor contate o administrador do Grid.</string> - <string name="CertInvalidHostname">Um hostname inválido foi usado para acessar o servidor. Verifique o SLURL ou hostname do Grid.</string> - <string name="CertExpired">O certificado dado pelo Grid parece estar vencido. Verifique o relógio do sistema ou contate o administrador do Grid.</string> - <string name="CertKeyUsage">O certificado dado pelo servidor não pôde ser usado para SSL. Por favor contate o administrador do Grid.</string> - <string name="CertBasicConstraints">A cadeia de certificados do servidor tinha certificados demais. Por favor contate o administrador do Grid.</string> - <string name="CertInvalidSignature">A assinatura do certificado dado pelo servidor do Grid não pôde ser verificada. Contate o administrador do seu Grid.</string> - <string name="LoginFailedNoNetwork">Erro de rede: Falha de conexão: verifique sua conexão à internet.</string> - <string name="LoginFailedHeader">Falha do login.</string> - <string name="Quit">Sair</string> - <string name="create_account_url">http://join.secondlife.com/?sourceid=[sourceid]</string> - <string name="AgniGridLabel">Grade principal do Second Life (Agni)</string> - <string name="AditiGridLabel">Grade de teste beta do Second Life (Aditi)</string> - <string name="ViewerDownloadURL">http://secondlife.com/download</string> - <string name="LoginFailedViewerNotPermitted">O visualizador utilizado já não é compatÃvel com o Second Life. Visite a página abaixo para baixar uma versão atual: http://secondlife.com/download +Versão do servidor de voz: [VOICE_VERSION] + </string> + <string name="AboutTraffic"> + Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) + </string> + <string name="AboutTime"> + [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt] + </string> + <string name="ErrorFetchingServerReleaseNotesURL"> + Erro ao obter URL de notas de versão do servidor. + </string> + <string name="BuildConfiguration"> + Configuração do corpo + </string> + <string name="ProgressRestoring"> + Restaurando... + </string> + <string name="ProgressChangingResolution"> + Alterando a resolução... + </string> + <string name="Fullbright"> + Fullbright (antigo) + </string> + <string name="LoginInProgress"> + Fazendo login. [APP_NAME] pode parecer congelado. Por favor, aguarde. + </string> + <string name="LoginInProgressNoFrozen"> + Logando... + </string> + <string name="LoginAuthenticating"> + Autenticando + </string> + <string name="LoginMaintenance"> + Executando manutenção da conta... + </string> + <string name="LoginAttempt"> + Falha na tentativa anterior de login. Login, tentativa [NUMBER] + </string> + <string name="LoginPrecaching"> + Carregando mundo... + </string> + <string name="LoginInitializingBrowser"> + Inicializando navegador embutido... + </string> + <string name="LoginInitializingMultimedia"> + Inicializando multimÃdia... + </string> + <string name="LoginInitializingFonts"> + Carregando fontes... + </string> + <string name="LoginVerifyingCache"> + Verificando arquivos cache (pode levar de 60-90 segundos)... + </string> + <string name="LoginProcessingResponse"> + Processando resposta... + </string> + <string name="LoginInitializingWorld"> + Inicializando mundo... + </string> + <string name="LoginDecodingImages"> + Decodificando imagens... + </string> + <string name="LoginInitializingQuicktime"> + Inicializando o QuickTime... + </string> + <string name="LoginQuicktimeNotFound"> + O QuickTime não foi encontrado - falha ao iniciar. + </string> + <string name="LoginQuicktimeOK"> + O QuickTime foi inicializado com sucesso. + </string> + <string name="LoginRequestSeedCapGrant"> + Solicitando recursos da região... + </string> + <string name="LoginRetrySeedCapGrant"> + Solicitando recursos da região, tentativa [NUMBER]... + </string> + <string name="LoginWaitingForRegionHandshake"> + Aguardando handshake com a região... + </string> + <string name="LoginConnectingToRegion"> + Conectando à região... + </string> + <string name="LoginDownloadingClothing"> + Baixando roupas... + </string> + <string name="InvalidCertificate"> + O servidor respondeu com um certificado inválido ou corrompido. Por favor contate o administrador do Grid. + </string> + <string name="CertInvalidHostname"> + Um hostname inválido foi usado para acessar o servidor. Verifique o SLURL ou hostname do Grid. + </string> + <string name="CertExpired"> + O certificado dado pelo Grid parece estar vencido. Verifique o relógio do sistema ou contate o administrador do Grid. + </string> + <string name="CertKeyUsage"> + O certificado dado pelo servidor não pôde ser usado para SSL. Por favor contate o administrador do Grid. + </string> + <string name="CertBasicConstraints"> + A cadeia de certificados do servidor tinha certificados demais. Por favor contate o administrador do Grid. + </string> + <string name="CertInvalidSignature"> + A assinatura do certificado dado pelo servidor do Grid não pôde ser verificada. Contate o administrador do seu Grid. + </string> + <string name="LoginFailedNoNetwork"> + Erro de rede: Falha de conexão: verifique sua conexão à internet. + </string> + <string name="LoginFailedHeader"> + Falha do login. + </string> + <string name="Quit"> + Sair + </string> + <string name="create_account_url"> + http://join.secondlife.com/?sourceid=[sourceid] + </string> + <string name="AgniGridLabel"> + Grade principal do Second Life (Agni) + </string> + <string name="AditiGridLabel"> + Grade de teste beta do Second Life (Aditi) + </string> + <string name="ViewerDownloadURL"> + http://secondlife.com/download + </string> + <string name="LoginFailedViewerNotPermitted"> + O visualizador utilizado já não é compatÃvel com o Second Life. Visite a página abaixo para baixar uma versão atual: http://secondlife.com/download -Para saber mais, visite as perguntas frequentes abaixo: http://secondlife.com/viewer-access-faq</string> - <string name="LoginIntermediateOptionalUpdateAvailable">Existe uma versão atualizada do seu visualizador: [VERSION]</string> - <string name="LoginFailedRequiredUpdate">Atualização de visualizador obrigatória: [VERSION]</string> - <string name="LoginFailedAlreadyLoggedIn">Este agente já fez login.</string> - <string name="LoginFailedAuthenticationFailed">Desculpe! Não foi possÃvel fazer seu login. Verifique se digitou o nome de usuário correto* (como kiki45 ou astro.fÃsica) * e senha. Verifique também que a tecla Maiúscula está desativada.</string> - <string name="LoginFailedPasswordChanged">Como medida de precaução, sua senha foi alterada. Visite sua conta em http://secondlife.com/password e responda a pergunta de segurança para mudar sua senha. Lamentamos qualquer inconveniente.</string> - <string name="LoginFailedPasswordReset">Fizemos algumas alterações a seu sistema. Você precisa selecionar outra senha. Visite sua conta em http://secondlife.com/password e responda a pergunta de segurança para mudar sua senha. Lamentamos qualquer inconveniente.</string> - <string name="LoginFailedEmployeesOnly">O Second Life está fechado para manutenção no momento. Somente funcionários podem acessá-lo. Consulte www.secondlife.com/status para as últimas atualizações.</string> - <string name="LoginFailedPremiumOnly">Logons do Second Life estão temporariamente restritos para garantir a melhor experiência possÃvel para os usuários no mundo virtual. +Para saber mais, visite as perguntas frequentes abaixo: http://secondlife.com/viewer-access-faq + </string> + <string name="LoginIntermediateOptionalUpdateAvailable"> + Existe uma versão atualizada do seu visualizador: [VERSION] + </string> + <string name="LoginFailedRequiredUpdate"> + Atualização de visualizador obrigatória: [VERSION] + </string> + <string name="LoginFailedAlreadyLoggedIn"> + Este agente já fez login. + </string> + <string name="LoginFailedAuthenticationFailed"> + Desculpe! Não foi possÃvel fazer seu login. Verifique se digitou o nome de usuário correto* (como kiki45 ou astro.fÃsica) * e senha. Verifique também que a tecla Maiúscula está desativada. + </string> + <string name="LoginFailedPasswordChanged"> + Como medida de precaução, sua senha foi alterada. Visite sua conta em http://secondlife.com/password e responda a pergunta de segurança para mudar sua senha. Lamentamos qualquer inconveniente. + </string> + <string name="LoginFailedPasswordReset"> + Fizemos algumas alterações a seu sistema. Você precisa selecionar outra senha. Visite sua conta em http://secondlife.com/password e responda a pergunta de segurança para mudar sua senha. Lamentamos qualquer inconveniente. + </string> + <string name="LoginFailedEmployeesOnly"> + O Second Life está fechado para manutenção no momento. Somente funcionários podem acessá-lo. Consulte www.secondlife.com/status para as últimas atualizações. + </string> + <string name="LoginFailedPremiumOnly"> + Logons do Second Life estão temporariamente restritos para garantir a melhor experiência possÃvel para os usuários no mundo virtual. -Pessoas com contas gratuitas não poderão acessar o Second Life no momento para dar espaço para aquelas que pagaram pelo Second Life.</string> - <string name="LoginFailedComputerProhibited">O Second Life não pode ser acessado deste computador. Se você acredita que houve algum equÃvoco, contate support@secondlife.com.</string> - <string name="LoginFailedAcountSuspended">Sua conta não está disponÃvel para acesso até [TIME], horário do PacÃfico nos EUA (GMT-08).</string> - <string name="LoginFailedAccountDisabled">Não é possÃvel concluir a solicitação neste momento. -Entre em contato com o suporte do Second Life para obter ajuda em http://support.secondlife.com.</string> - <string name="LoginFailedTransformError">Dados discrepantes detectados durante o login. Contate support@secondlife.com.</string> - <string name="LoginFailedAccountMaintenance">Sua conta está passando por um breve perÃodo de manutenção. Sua conta não está disponÃvel para acesso até [TIME], horário do PacÃfico nos EUA (GMT-08). Se você acredita que houve algum equÃvoco, contate support@secondlife.com.</string> - <string name="LoginFailedPendingLogoutFault">Reação à solicitação de saÃda foi uma falha do simulador.</string> - <string name="LoginFailedPendingLogout">O sistema o está desconectando no momento. -Aguarde um minuto antes que tentar logar-se novamente.</string> - <string name="LoginFailedUnableToCreateSession">ImpossÃvel criar sessão válida.</string> - <string name="LoginFailedUnableToConnectToSimulator">Não foi possÃvel conectar o simulador.</string> - <string name="LoginFailedRestrictedHours">Sua conta possui acesso ao Second Life das [START] à s [END], horário da costa leste dos EUA. Volte novamente durante seu horário de acesso. Se você acredita que houve algum equÃvoco, contate support@secondlife.com.</string> - <string name="LoginFailedIncorrectParameters">Parâmetros incorretos. Se você acredita que houve algum equÃvoco, contate support@secondlife.com.</string> - <string name="LoginFailedFirstNameNotAlphanumeric">O parâmetro de primeiro nome deve ser alfanumérico. Se você acredita que houve algum equÃvoco, contate support@secondlife.com.</string> - <string name="LoginFailedLastNameNotAlphanumeric">O parâmetro de sobrenome deve ser alfanumérico. Se você acredita que houve algum equÃvoco, contate support@secondlife.com.</string> - <string name="LogoutFailedRegionGoingOffline">Região passando para modo offline. Tente novamente dentro de alguns instantes.</string> - <string name="LogoutFailedAgentNotInRegion">Não há agente na região. Tente novamente dentro de alguns instantes.</string> - <string name="LogoutFailedPendingLogin">A região estava acessada por outra sessão. Tente novamente dentro de alguns instantes.</string> - <string name="LogoutFailedLoggingOut">A região estava passando para o modo offline na sessão anterior. Tente novamente dentro de alguns instantes.</string> - <string name="LogoutFailedStillLoggingOut">A região estava passando para o modo offline na sessão anterior. Tente novamente dentro de alguns instantes.</string> - <string name="LogoutSucceeded">A região passou para o modo offline na última sessão. Tente novamente dentro de alguns instantes.</string> - <string name="LogoutFailedLogoutBegun">A região inicou o modo offline. Tente novamente dentro de alguns instantes.</string> - <string name="LoginFailedLoggingOutSession">O sistema iniciou o modo offline em sua sessão anterior. Tente novamente dentro de alguns instantes.</string> - <string name="AgentLostConnection">Esta região pode estar passando por problemas. Por favor, verifique sua conexão com a internet.</string> - <string name="SavingSettings">Salvando configurações...</string> - <string name="LoggingOut">Saindo...</string> - <string name="ShuttingDown">Fechando...</string> - <string name="YouHaveBeenDisconnected">Você foi desconectado da região onde estava.</string> - <string name="SentToInvalidRegion">Você foi enviado para uma região inválida.</string> - <string name="TestingDisconnect">Teste de desconexão</string> - <string name="SocialFacebookConnecting">Conectando ao Facebook...</string> - <string name="SocialFacebookPosting">Publicando...</string> - <string name="SocialFacebookDisconnecting">Desconectando do Facebook...</string> - <string name="SocialFacebookErrorConnecting">Problema ao conectar ao Facebook</string> - <string name="SocialFacebookErrorPosting">Problema ao publicar no Facebook</string> - <string name="SocialFacebookErrorDisconnecting">Problema ao desconectar do Facebook</string> - <string name="SocialFlickrConnecting">Conectando ao Flickr...</string> - <string name="SocialFlickrPosting">Publicando...</string> - <string name="SocialFlickrDisconnecting">Desconectando do Flickr...</string> - <string name="SocialFlickrErrorConnecting">Problema ao conectar ao Flickr</string> - <string name="SocialFlickrErrorPosting">Problema ao publicar no Flickr</string> - <string name="SocialFlickrErrorDisconnecting">Problema ao desconectar do Flickr</string> - <string name="SocialTwitterConnecting">Conectando ao Twitter...</string> - <string name="SocialTwitterPosting">Publicando...</string> - <string name="SocialTwitterDisconnecting">Desconectando do Twitter...</string> - <string name="SocialTwitterErrorConnecting">Problema ao conectar ao Twitter</string> - <string name="SocialTwitterErrorPosting">Problema ao publicar no Twitter</string> - <string name="SocialTwitterErrorDisconnecting">Problema ao desconectar do Twitter</string> - <string name="BlackAndWhite">Preto e branco</string> - <string name="Colors1970">Cores dos anos 1970</string> - <string name="Intense">Intenso</string> - <string name="Newspaper">RetÃcula</string> - <string name="Sepia">Sépia</string> - <string name="Spotlight">Destaque</string> - <string name="Video">VÃdeo</string> - <string name="Autocontrast">Autocontraste</string> - <string name="LensFlare">Reflexo de flash</string> - <string name="Miniature">Miniatura</string> - <string name="Toycamera">Câmera de brinquedo</string> - <string name="TooltipPerson">Pessoa</string> - <string name="TooltipNoName">(sem nome)</string> - <string name="TooltipOwner">Proprietário:</string> - <string name="TooltipPublic">Público</string> - <string name="TooltipIsGroup">(Grupo)</string> - <string name="TooltipForSaleL$">À venda: L$[AMOUNT]</string> - <string name="TooltipFlagGroupBuild">ConstruÃdo por Grupo</string> - <string name="TooltipFlagNoBuild">Não é permitido construir</string> - <string name="TooltipFlagNoEdit">ConstruÃdo por Grupo</string> - <string name="TooltipFlagNotSafe">Não é seguro</string> - <string name="TooltipFlagNoFly">Não é permitido voar</string> - <string name="TooltipFlagGroupScripts">Scripts de Grupo</string> - <string name="TooltipFlagNoScripts">Não são permitidos scripts</string> - <string name="TooltipLand">Terreno:</string> - <string name="TooltipMustSingleDrop">Apenas um item único pode ser arrastado para este local</string> - <string name="TooltipTooManyWearables">Você não pode usar uma pasta que contenha mais de [AMOUNT] itens. Você pode mudar esse limite em Avançado > Mostrar configurações de depuração > WearFolderLimit.</string> +Pessoas com contas gratuitas não poderão acessar o Second Life no momento para dar espaço para aquelas que pagaram pelo Second Life. + </string> + <string name="LoginFailedComputerProhibited"> + O Second Life não pode ser acessado deste computador. Se você acredita que houve algum equÃvoco, contate support@secondlife.com. + </string> + <string name="LoginFailedAcountSuspended"> + Sua conta não está disponÃvel para acesso até [TIME], horário do PacÃfico nos EUA (GMT-08). + </string> + <string name="LoginFailedAccountDisabled"> + Não é possÃvel concluir a solicitação neste momento. +Entre em contato com o suporte do Second Life para obter ajuda em http://support.secondlife.com. + </string> + <string name="LoginFailedTransformError"> + Dados discrepantes detectados durante o login. Contate support@secondlife.com. + </string> + <string name="LoginFailedAccountMaintenance"> + Sua conta está passando por um breve perÃodo de manutenção. Sua conta não está disponÃvel para acesso até [TIME], horário do PacÃfico nos EUA (GMT-08). Se você acredita que houve algum equÃvoco, contate support@secondlife.com. + </string> + <string name="LoginFailedPendingLogoutFault"> + Reação à solicitação de saÃda foi uma falha do simulador. + </string> + <string name="LoginFailedPendingLogout"> + O sistema o está desconectando no momento. +Aguarde um minuto antes que tentar logar-se novamente. + </string> + <string name="LoginFailedUnableToCreateSession"> + ImpossÃvel criar sessão válida. + </string> + <string name="LoginFailedUnableToConnectToSimulator"> + Não foi possÃvel conectar o simulador. + </string> + <string name="LoginFailedRestrictedHours"> + Sua conta possui acesso ao Second Life das [START] à s [END], horário da costa leste dos EUA. Volte novamente durante seu horário de acesso. Se você acredita que houve algum equÃvoco, contate support@secondlife.com. + </string> + <string name="LoginFailedIncorrectParameters"> + Parâmetros incorretos. Se você acredita que houve algum equÃvoco, contate support@secondlife.com. + </string> + <string name="LoginFailedFirstNameNotAlphanumeric"> + O parâmetro de primeiro nome deve ser alfanumérico. Se você acredita que houve algum equÃvoco, contate support@secondlife.com. + </string> + <string name="LoginFailedLastNameNotAlphanumeric"> + O parâmetro de sobrenome deve ser alfanumérico. Se você acredita que houve algum equÃvoco, contate support@secondlife.com. + </string> + <string name="LogoutFailedRegionGoingOffline"> + Região passando para modo offline. Tente novamente dentro de alguns instantes. + </string> + <string name="LogoutFailedAgentNotInRegion"> + Não há agente na região. Tente novamente dentro de alguns instantes. + </string> + <string name="LogoutFailedPendingLogin"> + A região estava acessada por outra sessão. Tente novamente dentro de alguns instantes. + </string> + <string name="LogoutFailedLoggingOut"> + A região estava passando para o modo offline na sessão anterior. Tente novamente dentro de alguns instantes. + </string> + <string name="LogoutFailedStillLoggingOut"> + A região estava passando para o modo offline na sessão anterior. Tente novamente dentro de alguns instantes. + </string> + <string name="LogoutSucceeded"> + A região passou para o modo offline na última sessão. Tente novamente dentro de alguns instantes. + </string> + <string name="LogoutFailedLogoutBegun"> + A região inicou o modo offline. Tente novamente dentro de alguns instantes. + </string> + <string name="LoginFailedLoggingOutSession"> + O sistema iniciou o modo offline em sua sessão anterior. Tente novamente dentro de alguns instantes. + </string> + <string name="AgentLostConnection"> + Esta região pode estar passando por problemas. Por favor, verifique sua conexão com a internet. + </string> + <string name="SavingSettings"> + Salvando configurações... + </string> + <string name="LoggingOut"> + Saindo... + </string> + <string name="ShuttingDown"> + Fechando... + </string> + <string name="YouHaveBeenDisconnected"> + Você foi desconectado da região onde estava. + </string> + <string name="SentToInvalidRegion"> + Você foi enviado para uma região inválida. + </string> + <string name="TestingDisconnect"> + Teste de desconexão + </string> + <string name="SocialFacebookConnecting"> + Conectando ao Facebook... + </string> + <string name="SocialFacebookPosting"> + Publicando... + </string> + <string name="SocialFacebookDisconnecting"> + Desconectando do Facebook... + </string> + <string name="SocialFacebookErrorConnecting"> + Problema ao conectar ao Facebook + </string> + <string name="SocialFacebookErrorPosting"> + Problema ao publicar no Facebook + </string> + <string name="SocialFacebookErrorDisconnecting"> + Problema ao desconectar do Facebook + </string> + <string name="SocialFlickrConnecting"> + Conectando ao Flickr... + </string> + <string name="SocialFlickrPosting"> + Publicando... + </string> + <string name="SocialFlickrDisconnecting"> + Desconectando do Flickr... + </string> + <string name="SocialFlickrErrorConnecting"> + Problema ao conectar ao Flickr + </string> + <string name="SocialFlickrErrorPosting"> + Problema ao publicar no Flickr + </string> + <string name="SocialFlickrErrorDisconnecting"> + Problema ao desconectar do Flickr + </string> + <string name="SocialTwitterConnecting"> + Conectando ao Twitter... + </string> + <string name="SocialTwitterPosting"> + Publicando... + </string> + <string name="SocialTwitterDisconnecting"> + Desconectando do Twitter... + </string> + <string name="SocialTwitterErrorConnecting"> + Problema ao conectar ao Twitter + </string> + <string name="SocialTwitterErrorPosting"> + Problema ao publicar no Twitter + </string> + <string name="SocialTwitterErrorDisconnecting"> + Problema ao desconectar do Twitter + </string> + <string name="BlackAndWhite"> + Preto e branco + </string> + <string name="Colors1970"> + Cores dos anos 1970 + </string> + <string name="Intense"> + Intenso + </string> + <string name="Newspaper"> + RetÃcula + </string> + <string name="Sepia"> + Sépia + </string> + <string name="Spotlight"> + Destaque + </string> + <string name="Video"> + VÃdeo + </string> + <string name="Autocontrast"> + Autocontraste + </string> + <string name="LensFlare"> + Reflexo de flash + </string> + <string name="Miniature"> + Miniatura + </string> + <string name="Toycamera"> + Câmera de brinquedo + </string> + <string name="TooltipPerson"> + Pessoa + </string> + <string name="TooltipNoName"> + (sem nome) + </string> + <string name="TooltipOwner"> + Proprietário: + </string> + <string name="TooltipPublic"> + Público + </string> + <string name="TooltipIsGroup"> + (Grupo) + </string> + <string name="TooltipForSaleL$"> + À venda: L$[AMOUNT] + </string> + <string name="TooltipFlagGroupBuild"> + ConstruÃdo por Grupo + </string> + <string name="TooltipFlagNoBuild"> + Não é permitido construir + </string> + <string name="TooltipFlagNoEdit"> + ConstruÃdo por Grupo + </string> + <string name="TooltipFlagNotSafe"> + Não é seguro + </string> + <string name="TooltipFlagNoFly"> + Não é permitido voar + </string> + <string name="TooltipFlagGroupScripts"> + Scripts de Grupo + </string> + <string name="TooltipFlagNoScripts"> + Não são permitidos scripts + </string> + <string name="TooltipLand"> + Terreno: + </string> + <string name="TooltipMustSingleDrop"> + Apenas um item único pode ser arrastado para este local + </string> + <string name="TooltipTooManyWearables"> + Você não pode usar uma pasta que contenha mais de [AMOUNT] itens. Você pode mudar esse limite em Avançado > Mostrar configurações de depuração > WearFolderLimit. + </string> <string name="TooltipPrice" value="L$[AMOUNT]"/> - <string name="TooltipSLIcon">Isso contém um link para uma página no domÃnio oficial do SecondLife.com ou LindenLab.com.</string> - <string name="TooltipOutboxDragToWorld">Não é possÃvel fazer rez de itens da pasta Listagens do Marketplace</string> - <string name="TooltipOutboxWorn">Não é possÃvel colocar itens que você estiver usando na pasta Listagens do Marketplace</string> - <string name="TooltipOutboxFolderLevels">A profundidade das pastas aninhadas excede [AMOUNT]. Diminua a profundidade das pastas dentro de pastas. Agrupe os itens se necessário.</string> - <string name="TooltipOutboxTooManyFolders">O número de subpastas excede [AMOUNT]. Diminua a o número de pastas em sua listagem. Agrupe os itens se necessário.</string> - <string name="TooltipOutboxTooManyObjects">O número de itens excede [AMOUNT]. Para vender mais que [AMOUNT] itens em uma listagem, você deve agrupar alguns deles.</string> - <string name="TooltipOutboxTooManyStockItems">O número de itens de estoque excede [AMOUNT].</string> - <string name="TooltipOutboxCannotDropOnRoot">Você pode soltar somente itens ou pastas na aba TUDO ou NÃO ASSOCIADOS. Selecione uma dessas abas e mova seus itens ou pastas novamente.</string> - <string name="TooltipOutboxNoTransfer">Um ou mais objetos não podem ser vendidos ou transferidos</string> - <string name="TooltipOutboxNotInInventory">É possÃvel colocar somente itens do seu inventário no Marketplace</string> - <string name="TooltipOutboxLinked">Não é possÃvel colocar itens ou pastas vinculadas no Marketplace</string> - <string name="TooltipOutboxCallingCard">Não é possÃvel colocar cartões de visitas no Marketplace</string> - <string name="TooltipOutboxDragActive">Não é possÃvel mover uma listagem publicada</string> - <string name="TooltipOutboxCannotMoveRoot">Não é possÃvel mover a pasta raiz das listagens do Marketplace</string> - <string name="TooltipOutboxMixedStock">Todos os itens em uma pasta de estoque têm o mesmo tipo e permissão</string> - <string name="TooltipDragOntoOwnChild">Não é possÃvel mover uma pasta para seu filho</string> - <string name="TooltipDragOntoSelf">Não é possÃvel mover uma pasta para dentro dela mesma</string> - <string name="TooltipHttpUrl">Clique para ver a página web</string> - <string name="TooltipSLURL">Clique para ver os dados desta localização</string> - <string name="TooltipAgentUrl">Clique para ver o perfil deste residente</string> - <string name="TooltipAgentInspect">Saiba mais sobre este residente</string> - <string name="TooltipAgentMute">Clique para silenciar este residente</string> - <string name="TooltipAgentUnmute">Clique para desfazer silenciar neste residente</string> - <string name="TooltipAgentIM">Clique para enviar uma MI para este residente</string> - <string name="TooltipAgentPay">Clique para pagar este residente</string> - <string name="TooltipAgentOfferTeleport">Clique para enviar um pedido de amizade a este residente</string> - <string name="TooltipAgentRequestFriend">Clique para enviar um pedido de amizade a este residente</string> - <string name="TooltipGroupUrl">Clique para ver a descrição deste Grupo</string> - <string name="TooltipEventUrl">Clique para ver a descrição deste evento</string> - <string name="TooltipClassifiedUrl">Clique para ver este anúncio</string> - <string name="TooltipParcelUrl">Clique para ver a descrição desta parcela</string> - <string name="TooltipTeleportUrl">Clique para teletransportar para esta localização</string> - <string name="TooltipObjectIMUrl">Clique para ver a descrição deste objeto</string> - <string name="TooltipMapUrl">Clique para ver esta localização no mapa</string> - <string name="TooltipSLAPP">Clique para ativar no secondlife:// comando</string> + <string name="TooltipSLIcon"> + Isso contém um link para uma página no domÃnio oficial do SecondLife.com ou LindenLab.com. + </string> + <string name="TooltipOutboxDragToWorld"> + Não é possÃvel fazer rez de itens da pasta Listagens do Marketplace + </string> + <string name="TooltipOutboxWorn"> + Não é possÃvel colocar itens que você estiver usando na pasta Listagens do Marketplace + </string> + <string name="TooltipOutboxFolderLevels"> + A profundidade das pastas aninhadas excede [AMOUNT]. Diminua a profundidade das pastas dentro de pastas. Agrupe os itens se necessário. + </string> + <string name="TooltipOutboxTooManyFolders"> + O número de subpastas excede [AMOUNT]. Diminua a o número de pastas em sua listagem. Agrupe os itens se necessário. + </string> + <string name="TooltipOutboxTooManyObjects"> + O número de itens excede [AMOUNT]. Para vender mais que [AMOUNT] itens em uma listagem, você deve agrupar alguns deles. + </string> + <string name="TooltipOutboxTooManyStockItems"> + O número de itens de estoque excede [AMOUNT]. + </string> + <string name="TooltipOutboxCannotDropOnRoot"> + Você pode soltar somente itens ou pastas na aba TUDO ou NÃO ASSOCIADOS. Selecione uma dessas abas e mova seus itens ou pastas novamente. + </string> + <string name="TooltipOutboxNoTransfer"> + Um ou mais objetos não podem ser vendidos ou transferidos + </string> + <string name="TooltipOutboxNotInInventory"> + É possÃvel colocar somente itens do seu inventário no Marketplace + </string> + <string name="TooltipOutboxLinked"> + Não é possÃvel colocar itens ou pastas vinculadas no Marketplace + </string> + <string name="TooltipOutboxCallingCard"> + Não é possÃvel colocar cartões de visitas no Marketplace + </string> + <string name="TooltipOutboxDragActive"> + Não é possÃvel mover uma listagem publicada + </string> + <string name="TooltipOutboxCannotMoveRoot"> + Não é possÃvel mover a pasta raiz das listagens do Marketplace + </string> + <string name="TooltipOutboxMixedStock"> + Todos os itens em uma pasta de estoque têm o mesmo tipo e permissão + </string> + <string name="TooltipDragOntoOwnChild"> + Não é possÃvel mover uma pasta para seu filho + </string> + <string name="TooltipDragOntoSelf"> + Não é possÃvel mover uma pasta para dentro dela mesma + </string> + <string name="TooltipHttpUrl"> + Clique para ver a página web + </string> + <string name="TooltipSLURL"> + Clique para ver os dados desta localização + </string> + <string name="TooltipAgentUrl"> + Clique para ver o perfil deste residente + </string> + <string name="TooltipAgentInspect"> + Saiba mais sobre este residente + </string> + <string name="TooltipAgentMute"> + Clique para silenciar este residente + </string> + <string name="TooltipAgentUnmute"> + Clique para desfazer silenciar neste residente + </string> + <string name="TooltipAgentIM"> + Clique para enviar uma MI para este residente + </string> + <string name="TooltipAgentPay"> + Clique para pagar este residente + </string> + <string name="TooltipAgentOfferTeleport"> + Clique para enviar um pedido de amizade a este residente + </string> + <string name="TooltipAgentRequestFriend"> + Clique para enviar um pedido de amizade a este residente + </string> + <string name="TooltipGroupUrl"> + Clique para ver a descrição deste Grupo + </string> + <string name="TooltipEventUrl"> + Clique para ver a descrição deste evento + </string> + <string name="TooltipClassifiedUrl"> + Clique para ver este anúncio + </string> + <string name="TooltipParcelUrl"> + Clique para ver a descrição desta parcela + </string> + <string name="TooltipTeleportUrl"> + Clique para teletransportar para esta localização + </string> + <string name="TooltipObjectIMUrl"> + Clique para ver a descrição deste objeto + </string> + <string name="TooltipMapUrl"> + Clique para ver esta localização no mapa + </string> + <string name="TooltipSLAPP"> + Clique para ativar no secondlife:// comando + </string> <string name="CurrentURL" value="URL atual: [CurrentURL]"/> - <string name="TooltipEmail">Clique para escrever um email</string> - <string name="SLurlLabelTeleport">Teletransportar para</string> - <string name="SLurlLabelShowOnMap">Mostrar no mapa para</string> - <string name="SLappAgentMute">Silenciar</string> - <string name="SLappAgentUnmute">Desfazer silenciar</string> - <string name="SLappAgentIM">MI</string> - <string name="SLappAgentPay">Pagar</string> - <string name="SLappAgentOfferTeleport">Oferecer teletransporte para</string> - <string name="SLappAgentRequestFriend">Pedido de amizade</string> - <string name="SLappAgentRemoveFriend">Remoção de amigo</string> - <string name="BUTTON_CLOSE_DARWIN">Fechar (⌘W)</string> - <string name="BUTTON_CLOSE_WIN">Fechar (Ctrl+W)</string> - <string name="BUTTON_CLOSE_CHROME">Fechar</string> - <string name="BUTTON_RESTORE">Restaurar</string> - <string name="BUTTON_MINIMIZE">Minimizar</string> - <string name="BUTTON_TEAR_OFF">Separar-se da janela</string> - <string name="BUTTON_DOCK">conectar-se à barra</string> - <string name="BUTTON_HELP">Mostrar ajuda</string> - <string name="TooltipNotecardNotAllowedTypeDrop">Os itens deste tipo não podem ser anexados -à s anotações desta região.</string> - <string name="TooltipNotecardOwnerRestrictedDrop">Somente itens com permissões irrestritas + <string name="TooltipEmail"> + Clique para escrever um email + </string> + <string name="SLurlLabelTeleport"> + Teletransportar para + </string> + <string name="SLurlLabelShowOnMap"> + Mostrar no mapa para + </string> + <string name="SLappAgentMute"> + Silenciar + </string> + <string name="SLappAgentUnmute"> + Desfazer silenciar + </string> + <string name="SLappAgentIM"> + MI + </string> + <string name="SLappAgentPay"> + Pagar + </string> + <string name="SLappAgentOfferTeleport"> + Oferecer teletransporte para + </string> + <string name="SLappAgentRequestFriend"> + Pedido de amizade + </string> + <string name="SLappAgentRemoveFriend"> + Remoção de amigo + </string> + <string name="BUTTON_CLOSE_DARWIN"> + Fechar (⌘W) + </string> + <string name="BUTTON_CLOSE_WIN"> + Fechar (Ctrl+W) + </string> + <string name="BUTTON_CLOSE_CHROME"> + Fechar + </string> + <string name="BUTTON_RESTORE"> + Restaurar + </string> + <string name="BUTTON_MINIMIZE"> + Minimizar + </string> + <string name="BUTTON_TEAR_OFF"> + Separar-se da janela + </string> + <string name="BUTTON_DOCK"> + conectar-se à barra + </string> + <string name="BUTTON_HELP"> + Mostrar ajuda + </string> + <string name="TooltipNotecardNotAllowedTypeDrop"> + Os itens deste tipo não podem ser anexados +à s anotações desta região. + </string> + <string name="TooltipNotecardOwnerRestrictedDrop"> + Somente itens com permissões irrestritas do 'próximo proprietário’ pode -ser anexado à s anotações.</string> - <string name="Searching">Buscando...</string> - <string name="NoneFound">Não encontrado.</string> - <string name="RetrievingData">Buscando...</string> - <string name="ReleaseNotes">Notas de versão</string> - <string name="RELEASE_NOTES_BASE_URL">https://megapahit.net/</string> - <string name="LoadingData">Carregando...</string> - <string name="AvatarNameNobody">(ninguém)</string> - <string name="AvatarNameWaiting">(aguardando)</string> - <string name="GroupNameNone">(nenhum)</string> - <string name="AssetErrorNone">Nenhum erro</string> - <string name="AssetErrorRequestFailed">Item pedido falhou</string> - <string name="AssetErrorNonexistentFile">Item pedido: arquivo inexistente</string> - <string name="AssetErrorNotInDatabase">Item pedido: item não encontrado na base de dados.</string> - <string name="AssetErrorEOF">Fim do arquivo</string> - <string name="AssetErrorCannotOpenFile">Não é possÃvel abrir arquivo</string> - <string name="AssetErrorFileNotFound">Arquivo não encontrado</string> - <string name="AssetErrorTCPTimeout">Tempo de transferência de arquivo expirado</string> - <string name="AssetErrorCircuitGone">Circuito caiu</string> - <string name="AssetErrorPriceMismatch">Visualizador e servidor não concordam no preço</string> - <string name="AssetErrorUnknownStatus">Status desconhecido</string> - <string name="AssetUploadServerUnreacheble">Serviço não disponÃvel.</string> - <string name="AssetUploadServerDifficulties">O servidor está enfrentando dificuldades inesperadas.</string> - <string name="AssetUploadServerUnavaliable">Serviço não disponÃvel ou o tempo final para upload foi atingido.</string> - <string name="AssetUploadRequestInvalid">Erro na solicitação de upload. Acesso -http://secondlife.com/support para ajuda ao resolver este problema.</string> - <string name="SettingValidationError">Falha na validação para importação das configurações [NAME]</string> - <string name="SettingImportFileError">Não foi possÃvel abrir o arquivo [FILE]</string> - <string name="SettingParseFileError">Não foi possÃvel abrir o arquivo [FILE]</string> - <string name="SettingTranslateError">Não foi possÃvel traduzir o vento antigo [NAME]</string> - <string name="texture">textura</string> - <string name="sound">som</string> - <string name="calling card">cartão de visitas</string> - <string name="landmark">landmark</string> - <string name="legacy script">script obsoleto</string> - <string name="clothing">roupas</string> - <string name="object">objeto</string> - <string name="note card">anotação</string> - <string name="folder">pasta</string> - <string name="root">raiz</string> - <string name="lsl2 script">script LSL2</string> - <string name="lsl bytecode">bytecode LSL</string> - <string name="tga texture">textura tga</string> - <string name="body part">parte do corpo</string> - <string name="snapshot">fotografia</string> - <string name="lost and found">Achados e Perdidos</string> - <string name="targa image">imagem targa</string> - <string name="trash">Lixo</string> - <string name="jpeg image">imagem jpeg</string> - <string name="animation">animação</string> - <string name="gesture">gesto</string> - <string name="simstate">simstate</string> - <string name="favorite">favorito</string> - <string name="symbolic link">link</string> - <string name="symbolic folder link">link da pasta</string> - <string name="settings blob">configurações</string> - <string name="mesh">mesh</string> - <string name="AvatarEditingAppearance">(Edição Aparência)</string> - <string name="AvatarAway">Distante</string> - <string name="AvatarDoNotDisturb">Não perturbe</string> - <string name="AvatarMuted">Mudo</string> - <string name="anim_express_afraid">Temeroso</string> - <string name="anim_express_anger">Bravo</string> - <string name="anim_away">Distante</string> - <string name="anim_backflip">Virar para trás</string> - <string name="anim_express_laugh">Rir segurando a barriga</string> - <string name="anim_express_toothsmile">Sorriso largo</string> - <string name="anim_blowkiss">Mandar beijo</string> - <string name="anim_express_bored">Entediado</string> - <string name="anim_bow">Reverência</string> - <string name="anim_clap">Aplaudir</string> - <string name="anim_courtbow">Saudação formal</string> - <string name="anim_express_cry">Chorar</string> - <string name="anim_dance1">Dança 1</string> - <string name="anim_dance2">Dança 2</string> - <string name="anim_dance3">Dança 3</string> - <string name="anim_dance4">Dança 4</string> - <string name="anim_dance5">Dança 5</string> - <string name="anim_dance6">Dança 6</string> - <string name="anim_dance7">Dança 7</string> - <string name="anim_dance8">Dança 8</string> - <string name="anim_express_disdain">Desdém</string> - <string name="anim_drink">Beber</string> - <string name="anim_express_embarrased">Envergonhado</string> - <string name="anim_angry_fingerwag">Negar com o dedo.</string> - <string name="anim_fist_pump">Vibrar provocando</string> - <string name="anim_yoga_float">Levitar Yoga</string> - <string name="anim_express_frown">Careta</string> - <string name="anim_impatient">Impaciente</string> - <string name="anim_jumpforjoy">Pular de alegria</string> - <string name="anim_kissmybutt">Beije meu bumbum</string> - <string name="anim_express_kiss">Beijar</string> - <string name="anim_laugh_short">Rir</string> - <string name="anim_musclebeach">Exibir músculos</string> - <string name="anim_no_unhappy">Não (descontente)</string> - <string name="anim_no_head">Não</string> - <string name="anim_nyanya">Nya-nya-nya</string> - <string name="anim_punch_onetwo">Soco um-dois</string> - <string name="anim_express_open_mouth">Abrir a boca</string> - <string name="anim_peace">Paz</string> - <string name="anim_point_you">Apontar para o outro</string> - <string name="anim_point_me">Apontar para si</string> - <string name="anim_punch_l">Soco esquerdo</string> - <string name="anim_punch_r">Soco direito</string> - <string name="anim_rps_countdown">RPS contar</string> - <string name="anim_rps_paper">RPS papel</string> - <string name="anim_rps_rock">RPS pedra</string> - <string name="anim_rps_scissors">RPS tesoura</string> - <string name="anim_express_repulsed">Repulsa</string> - <string name="anim_kick_roundhouse_r">Chute giratório</string> - <string name="anim_express_sad">Triste</string> - <string name="anim_salute">Saúde</string> - <string name="anim_shout">Gritar</string> - <string name="anim_express_shrug">Encolher ombros</string> - <string name="anim_express_smile">Sorrir</string> - <string name="anim_smoke_idle">Fumar à toa</string> - <string name="anim_smoke_inhale">Inalar fumaça</string> - <string name="anim_smoke_throw_down">Expelir fumaça</string> - <string name="anim_express_surprise">Surpresa</string> - <string name="anim_sword_strike_r">Golpe de espada</string> - <string name="anim_angry_tantrum">Enraivecer</string> - <string name="anim_express_tongue_out">Mostrar a lÃngua</string> - <string name="anim_hello">Onda</string> - <string name="anim_whisper">Sussurrar</string> - <string name="anim_whistle">Assobiar</string> - <string name="anim_express_wink">Piscar</string> - <string name="anim_wink_hollywood">Piscar (Hollywood)</string> - <string name="anim_express_worry">Preocupar-se</string> - <string name="anim_yes_happy">Sim (Feliz)</string> - <string name="anim_yes_head">Sim</string> - <string name="multiple_textures">Múltiplo</string> - <string name="use_texture">Usar textura</string> - <string name="manip_hint1">Mova o cursor do mouse sobre a regra</string> - <string name="manip_hint2">para ajustar à grade</string> - <string name="texture_loading">Carregando...</string> - <string name="worldmap_offline">Offline</string> - <string name="worldmap_item_tooltip_format">L$[PRICE] por [AREA] m²</string> - <string name="worldmap_results_none_found">Nenhum encontrado.</string> - <string name="Ok">OK</string> - <string name="Premature end of file">término prematuro do arquivo</string> - <string name="ST_NO_JOINT">Não é possÃvel encontrar a raiz (ROOT) ou junção (JOINT).</string> - <string name="NearbyChatTitle">Bate-papo local</string> - <string name="NearbyChatLabel">(Bate-papo local)</string> - <string name="whisper">sussurra:</string> - <string name="shout">grita:</string> - <string name="ringing">Conectando à conversa de voz no mundo</string> - <string name="connected">Conectado</string> - <string name="unavailable">Voz não disponÃvel na sua localização atual</string> - <string name="hang_up">Desconectado da conversa de Voz no mundo</string> - <string name="reconnect_nearby">Agora você será reconectado ao bate-papo local.</string> - <string name="ScriptQuestionCautionChatGranted">'[OBJECTNAME]', um objeto de '[OWNERNAME]', localizado em [REGIONNAME] a [REGIONPOS], obteve permissão para: [PERMISSIONS].</string> - <string name="ScriptQuestionCautionChatDenied">'[OBJECTNAME]', um objeto de '[OWNERNAME]', localizado em [REGIONNAME] a [REGIONPOS], teve permissão negada para: [PERMISSIONS].</string> - <string name="AdditionalPermissionsRequestHeader">Se você permitir acesso à sua conta, o objeto também poderá:</string> - <string name="ScriptTakeMoney">Tomar linden dólares (L$) de você</string> - <string name="ActOnControlInputs">Atue nas suas entradas de controle</string> - <string name="RemapControlInputs">Remapeie suas entradas de controle</string> - <string name="AnimateYourAvatar">Faça uma animação para o seu avatar</string> - <string name="AttachToYourAvatar">Anexe ao seu avatar</string> - <string name="ReleaseOwnership">Libere a propriedade e torne-a pública</string> - <string name="LinkAndDelink">Una e desuna de outros objetos</string> - <string name="AddAndRemoveJoints">Adicione e remova junções com outros objetos</string> - <string name="ChangePermissions">Modifique as permissões</string> - <string name="TrackYourCamera">Acompanhe sua câmera</string> - <string name="ControlYourCamera">Controle sua camera</string> - <string name="TeleportYourAgent">Teletransportá-lo</string> - <string name="ForceSitAvatar">Forçar o avatar a sentar</string> - <string name="ChangeEnvSettings">Alterar sua configurações de ambiente</string> - <string name="AgentNameSubst">(Você)</string> +ser anexado à s anotações. + </string> + <string name="Searching"> + Buscando... + </string> + <string name="NoneFound"> + Não encontrado. + </string> + <string name="RetrievingData"> + Buscando... + </string> + <string name="ReleaseNotes"> + Notas de versão + </string> + <string name="RELEASE_NOTES_BASE_URL"> + https://megapahit.net/ + </string> + <string name="LoadingData"> + Carregando... + </string> + <string name="AvatarNameNobody"> + (ninguém) + </string> + <string name="AvatarNameWaiting"> + (aguardando) + </string> + <string name="GroupNameNone"> + (nenhum) + </string> + <string name="AssetErrorNone"> + Nenhum erro + </string> + <string name="AssetErrorRequestFailed"> + Item pedido falhou + </string> + <string name="AssetErrorNonexistentFile"> + Item pedido: arquivo inexistente + </string> + <string name="AssetErrorNotInDatabase"> + Item pedido: item não encontrado na base de dados. + </string> + <string name="AssetErrorEOF"> + Fim do arquivo + </string> + <string name="AssetErrorCannotOpenFile"> + Não é possÃvel abrir arquivo + </string> + <string name="AssetErrorFileNotFound"> + Arquivo não encontrado + </string> + <string name="AssetErrorTCPTimeout"> + Tempo de transferência de arquivo expirado + </string> + <string name="AssetErrorCircuitGone"> + Circuito caiu + </string> + <string name="AssetErrorPriceMismatch"> + Visualizador e servidor não concordam no preço + </string> + <string name="AssetErrorUnknownStatus"> + Status desconhecido + </string> + <string name="AssetUploadServerUnreacheble"> + Serviço não disponÃvel. + </string> + <string name="AssetUploadServerDifficulties"> + O servidor está enfrentando dificuldades inesperadas. + </string> + <string name="AssetUploadServerUnavaliable"> + Serviço não disponÃvel ou o tempo final para upload foi atingido. + </string> + <string name="AssetUploadRequestInvalid"> + Erro na solicitação de upload. Acesso +http://secondlife.com/support para ajuda ao resolver este problema. + </string> + <string name="SettingValidationError"> + Falha na validação para importação das configurações [NAME] + </string> + <string name="SettingImportFileError"> + Não foi possÃvel abrir o arquivo [FILE] + </string> + <string name="SettingParseFileError"> + Não foi possÃvel abrir o arquivo [FILE] + </string> + <string name="SettingTranslateError"> + Não foi possÃvel traduzir o vento antigo [NAME] + </string> + <string name="texture"> + textura + </string> + <string name="sound"> + som + </string> + <string name="calling card"> + cartão de visitas + </string> + <string name="landmark"> + landmark + </string> + <string name="legacy script"> + script obsoleto + </string> + <string name="clothing"> + roupas + </string> + <string name="object"> + objeto + </string> + <string name="note card"> + anotação + </string> + <string name="folder"> + pasta + </string> + <string name="root"> + raiz + </string> + <string name="lsl2 script"> + script LSL2 + </string> + <string name="lsl bytecode"> + bytecode LSL + </string> + <string name="tga texture"> + textura tga + </string> + <string name="body part"> + parte do corpo + </string> + <string name="snapshot"> + fotografia + </string> + <string name="lost and found"> + Achados e Perdidos + </string> + <string name="targa image"> + imagem targa + </string> + <string name="trash"> + Lixo + </string> + <string name="jpeg image"> + imagem jpeg + </string> + <string name="animation"> + animação + </string> + <string name="gesture"> + gesto + </string> + <string name="simstate"> + simstate + </string> + <string name="favorite"> + favorito + </string> + <string name="symbolic link"> + link + </string> + <string name="symbolic folder link"> + link da pasta + </string> + <string name="settings blob"> + configurações + </string> + <string name="mesh"> + mesh + </string> + <string name="AvatarEditingAppearance"> + (Edição Aparência) + </string> + <string name="AvatarAway"> + Distante + </string> + <string name="AvatarDoNotDisturb"> + Não perturbe + </string> + <string name="AvatarMuted"> + Mudo + </string> + <string name="anim_express_afraid"> + Temeroso + </string> + <string name="anim_express_anger"> + Bravo + </string> + <string name="anim_away"> + Distante + </string> + <string name="anim_backflip"> + Virar para trás + </string> + <string name="anim_express_laugh"> + Rir segurando a barriga + </string> + <string name="anim_express_toothsmile"> + Sorriso largo + </string> + <string name="anim_blowkiss"> + Mandar beijo + </string> + <string name="anim_express_bored"> + Entediado + </string> + <string name="anim_bow"> + Reverência + </string> + <string name="anim_clap"> + Aplaudir + </string> + <string name="anim_courtbow"> + Saudação formal + </string> + <string name="anim_express_cry"> + Chorar + </string> + <string name="anim_dance1"> + Dança 1 + </string> + <string name="anim_dance2"> + Dança 2 + </string> + <string name="anim_dance3"> + Dança 3 + </string> + <string name="anim_dance4"> + Dança 4 + </string> + <string name="anim_dance5"> + Dança 5 + </string> + <string name="anim_dance6"> + Dança 6 + </string> + <string name="anim_dance7"> + Dança 7 + </string> + <string name="anim_dance8"> + Dança 8 + </string> + <string name="anim_express_disdain"> + Desdém + </string> + <string name="anim_drink"> + Beber + </string> + <string name="anim_express_embarrased"> + Envergonhado + </string> + <string name="anim_angry_fingerwag"> + Negar com o dedo. + </string> + <string name="anim_fist_pump"> + Vibrar provocando + </string> + <string name="anim_yoga_float"> + Levitar Yoga + </string> + <string name="anim_express_frown"> + Careta + </string> + <string name="anim_impatient"> + Impaciente + </string> + <string name="anim_jumpforjoy"> + Pular de alegria + </string> + <string name="anim_kissmybutt"> + Beije meu bumbum + </string> + <string name="anim_express_kiss"> + Beijar + </string> + <string name="anim_laugh_short"> + Rir + </string> + <string name="anim_musclebeach"> + Exibir músculos + </string> + <string name="anim_no_unhappy"> + Não (descontente) + </string> + <string name="anim_no_head"> + Não + </string> + <string name="anim_nyanya"> + Nya-nya-nya + </string> + <string name="anim_punch_onetwo"> + Soco um-dois + </string> + <string name="anim_express_open_mouth"> + Abrir a boca + </string> + <string name="anim_peace"> + Paz + </string> + <string name="anim_point_you"> + Apontar para o outro + </string> + <string name="anim_point_me"> + Apontar para si + </string> + <string name="anim_punch_l"> + Soco esquerdo + </string> + <string name="anim_punch_r"> + Soco direito + </string> + <string name="anim_rps_countdown"> + RPS contar + </string> + <string name="anim_rps_paper"> + RPS papel + </string> + <string name="anim_rps_rock"> + RPS pedra + </string> + <string name="anim_rps_scissors"> + RPS tesoura + </string> + <string name="anim_express_repulsed"> + Repulsa + </string> + <string name="anim_kick_roundhouse_r"> + Chute giratório + </string> + <string name="anim_express_sad"> + Triste + </string> + <string name="anim_salute"> + Saúde + </string> + <string name="anim_shout"> + Gritar + </string> + <string name="anim_express_shrug"> + Encolher ombros + </string> + <string name="anim_express_smile"> + Sorrir + </string> + <string name="anim_smoke_idle"> + Fumar à toa + </string> + <string name="anim_smoke_inhale"> + Inalar fumaça + </string> + <string name="anim_smoke_throw_down"> + Expelir fumaça + </string> + <string name="anim_express_surprise"> + Surpresa + </string> + <string name="anim_sword_strike_r"> + Golpe de espada + </string> + <string name="anim_angry_tantrum"> + Enraivecer + </string> + <string name="anim_express_tongue_out"> + Mostrar a lÃngua + </string> + <string name="anim_hello"> + Onda + </string> + <string name="anim_whisper"> + Sussurrar + </string> + <string name="anim_whistle"> + Assobiar + </string> + <string name="anim_express_wink"> + Piscar + </string> + <string name="anim_wink_hollywood"> + Piscar (Hollywood) + </string> + <string name="anim_express_worry"> + Preocupar-se + </string> + <string name="anim_yes_happy"> + Sim (Feliz) + </string> + <string name="anim_yes_head"> + Sim + </string> + <string name="multiple_textures"> + Múltiplo + </string> + <string name="use_texture"> + Usar textura + </string> + <string name="manip_hint1"> + Mova o cursor do mouse sobre a regra + </string> + <string name="manip_hint2"> + para ajustar à grade + </string> + <string name="texture_loading"> + Carregando... + </string> + <string name="worldmap_offline"> + Offline + </string> + <string name="worldmap_item_tooltip_format"> + L$[PRICE] por [AREA] m² + </string> + <string name="worldmap_results_none_found"> + Nenhum encontrado. + </string> + <string name="Ok"> + OK + </string> + <string name="Premature end of file"> + término prematuro do arquivo + </string> + <string name="ST_NO_JOINT"> + Não é possÃvel encontrar a raiz (ROOT) ou junção (JOINT). + </string> + <string name="NearbyChatTitle"> + Bate-papo local + </string> + <string name="NearbyChatLabel"> + (Bate-papo local) + </string> + <string name="whisper"> + sussurra: + </string> + <string name="shout"> + grita: + </string> + <string name="ringing"> + Conectando à conversa de voz no mundo + </string> + <string name="connected"> + Conectado + </string> + <string name="unavailable"> + Voz não disponÃvel na sua localização atual + </string> + <string name="hang_up"> + Desconectado da conversa de Voz no mundo + </string> + <string name="reconnect_nearby"> + Agora você será reconectado ao bate-papo local. + </string> + <string name="ScriptQuestionCautionChatGranted"> + '[OBJECTNAME]', um objeto de '[OWNERNAME]', localizado em [REGIONNAME] a [REGIONPOS], obteve permissão para: [PERMISSIONS]. + </string> + <string name="ScriptQuestionCautionChatDenied"> + '[OBJECTNAME]', um objeto de '[OWNERNAME]', localizado em [REGIONNAME] a [REGIONPOS], teve permissão negada para: [PERMISSIONS]. + </string> + <string name="AdditionalPermissionsRequestHeader"> + Se você permitir acesso à sua conta, o objeto também poderá: + </string> + <string name="ScriptTakeMoney"> + Tomar linden dólares (L$) de você + </string> + <string name="ActOnControlInputs"> + Atue nas suas entradas de controle + </string> + <string name="RemapControlInputs"> + Remapeie suas entradas de controle + </string> + <string name="AnimateYourAvatar"> + Faça uma animação para o seu avatar + </string> + <string name="AttachToYourAvatar"> + Anexe ao seu avatar + </string> + <string name="ReleaseOwnership"> + Libere a propriedade e torne-a pública + </string> + <string name="LinkAndDelink"> + Una e desuna de outros objetos + </string> + <string name="AddAndRemoveJoints"> + Adicione e remova junções com outros objetos + </string> + <string name="ChangePermissions"> + Modifique as permissões + </string> + <string name="TrackYourCamera"> + Acompanhe sua câmera + </string> + <string name="ControlYourCamera"> + Controle sua camera + </string> + <string name="TeleportYourAgent"> + Teletransportá-lo + </string> + <string name="ForceSitAvatar"> + Forçar o avatar a sentar + </string> + <string name="ChangeEnvSettings"> + Alterar sua configurações de ambiente + </string> + <string name="AgentNameSubst"> + (Você) + </string> <string name="JoinAnExperience"/> - <string name="SilentlyManageEstateAccess">Suprimir alertas ao gerenciar listas de acesso ao terreno</string> - <string name="OverrideYourAnimations">Substituir suas animações padrão</string> - <string name="ScriptReturnObjects">Retornar objetos em seu nome</string> - <string name="UnknownScriptPermission">(desconhecido)!</string> - <string name="SIM_ACCESS_PG">Público geral</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">Desconhecido</string> - <string name="land_type_unknown">(desconhecido)</string> - <string name="Estate / Full Region">Propriedadade / Região inteira:</string> - <string name="Estate / Homestead">Imóvel / Homestead</string> - <string name="Mainland / Homestead">Continente / Homestead</string> - <string name="Mainland / Full Region">Continente / Região inteira:</string> - <string name="all_files">Todos os arquivos</string> - <string name="sound_files">Sons</string> - <string name="animation_files">Animações</string> - <string name="image_files">Imagens</string> - <string name="save_file_verb">Salvar</string> - <string name="load_file_verb">Carregar</string> - <string name="targa_image_files">Imagens Targa</string> - <string name="bitmap_image_files">Imagens Bitmap</string> - <string name="png_image_files">Imagens PNG</string> - <string name="save_texture_image_files">Imagens targa ou PNG</string> - <string name="avi_movie_file">Arquivo de vÃdeo AVI</string> - <string name="xaf_animation_file">Arquivo de animação XAF</string> - <string name="xml_file">Arquivo XML</string> - <string name="raw_file">Arquivo RAW</string> - <string name="compressed_image_files">Imagens compactadas</string> - <string name="load_files">Carregar arquivos</string> - <string name="choose_the_directory">Selecionar pasta</string> - <string name="script_files">Scripts</string> - <string name="dictionary_files">Dicionários</string> - <string name="shape">Silhueta</string> - <string name="skin">Pele</string> - <string name="hair">Cabelo</string> - <string name="eyes">Olhos</string> - <string name="shirt">Camisa</string> - <string name="pants">Calças</string> - <string name="shoes">Sapatos</string> - <string name="socks">Meias</string> - <string name="jacket">Blusa</string> - <string name="gloves">Luvas</string> - <string name="undershirt">Camiseta</string> - <string name="underpants">Roupa de baixo</string> - <string name="skirt">Saia</string> - <string name="alpha">Alpha</string> - <string name="tattoo">Tatuagem</string> - <string name="universal">Universal</string> - <string name="physics">FÃsico</string> - <string name="invalid">Inválido</string> - <string name="none">nenhum</string> - <string name="shirt_not_worn">Camisa não vestida</string> - <string name="pants_not_worn">Calças não vestidas</string> - <string name="shoes_not_worn">Sapatos não calçados</string> - <string name="socks_not_worn">Meias não calçadas</string> - <string name="jacket_not_worn">Jaqueta não vestida</string> - <string name="gloves_not_worn">Luvas não calçadas</string> - <string name="undershirt_not_worn">Camiseta não vestida</string> - <string name="underpants_not_worn">Roupa de baixo não vestida</string> - <string name="skirt_not_worn">Saia não vestida</string> - <string name="alpha_not_worn">Alpha não vestido</string> - <string name="tattoo_not_worn">Tatuagem não usada</string> - <string name="universal_not_worn">Universal não usado</string> - <string name="physics_not_worn">FÃsico não usado</string> - <string name="invalid_not_worn">inválido</string> - <string name="create_new_shape">Criar novo fÃsico</string> - <string name="create_new_skin">Criar pele nova</string> - <string name="create_new_hair">Criar cabelo novo</string> - <string name="create_new_eyes">Criar olhos novos</string> - <string name="create_new_shirt">Criar camisa nova</string> - <string name="create_new_pants">Criar calças novas</string> - <string name="create_new_shoes">Criar sapatos novos</string> - <string name="create_new_socks">Criar meias novas</string> - <string name="create_new_jacket">Criar jaqueta nova</string> - <string name="create_new_gloves">Criar luvas novas</string> - <string name="create_new_undershirt">Criar camiseta nova</string> - <string name="create_new_underpants">Criar roupa de baixo nova</string> - <string name="create_new_skirt">Criar saia nova</string> - <string name="create_new_alpha">Criar Alpha novo</string> - <string name="create_new_tattoo">Criar nova tatuagem</string> - <string name="create_new_universal">Criar um novo universal</string> - <string name="create_new_physics">Criar novo fÃsico</string> - <string name="create_new_invalid">inválido</string> - <string name="NewWearable">Novo [WEARABLE_ITEM]</string> - <string name="next">Próximo</string> - <string name="ok">OK</string> - <string name="GroupNotifyGroupNotice">Anúncio de grupo</string> - <string name="GroupNotifyGroupNotices">Anúncios do grupo</string> - <string name="GroupNotifySentBy">Enviado por</string> - <string name="GroupNotifyAttached">Anexo:</string> - <string name="GroupNotifyViewPastNotices">Ver últimos anúncios ou optar por não receber essas mensagens aqui.</string> - <string name="GroupNotifyOpenAttachment">Abrir anexo</string> - <string name="GroupNotifySaveAttachment">Salvar anexo</string> - <string name="TeleportOffer">Oferta de teletransporte</string> - <string name="StartUpNotifications">Novas notificações chegaram enquanto você estava fora...</string> - <string name="OverflowInfoChannelString">Você tem mais [%d] notificações</string> - <string name="BodyPartsRightArm">Braço direito</string> - <string name="BodyPartsHead">Cabeça</string> - <string name="BodyPartsLeftArm">Braço esquerdo</string> - <string name="BodyPartsLeftLeg">Perna esquerda</string> - <string name="BodyPartsTorso">Tronco</string> - <string name="BodyPartsRightLeg">Perna direita</string> - <string name="BodyPartsEnhancedSkeleton">Esqueleto aprimorado</string> - <string name="GraphicsQualityLow">Baixo</string> - <string name="GraphicsQualityMid">Meio</string> - <string name="GraphicsQualityHigh">Alto</string> - <string name="LeaveMouselook">Pressione ESC para retornar para visão do mundo</string> - <string name="InventoryNoMatchingItems">Não encontrou o que procura? Tente buscar no [secondlife:///app/search/people/[SEARCH_TERM] Search].</string> - <string name="InventoryNoMatchingRecentItems">Não encontrou o que procura? Tente [secondlife:///app/inventory/filters Show filters].</string> - <string name="PlacesNoMatchingItems">Não encontrou o que procura? Tente buscar no [secondlife:///app/search/groups/[SEARCH_TERM] Search].</string> - <string name="FavoritesNoMatchingItems">Arraste um marco para adicioná-lo aos seus favoritos.</string> - <string name="MarketplaceNoMatchingItems">Nenhum item correspondente encontrado. Verifique a ortografia de sua cadeia de pesquisa e tente novamente.</string> - <string name="InventoryNoTexture">Você não possui uma cópia desta textura no seu inventário</string> - <string name="InventoryInboxNoItems">Suas compras do Marketplace aparecerão aqui. Depois, você poderá arrastá-las para seu inventário para usá-las.</string> - <string name="MarketplaceURL">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/</string> - <string name="MarketplaceURL_CreateStore">http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3</string> - <string name="MarketplaceURL_Dashboard">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard</string> - <string name="MarketplaceURL_Imports">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports</string> - <string name="MarketplaceURL_LearnMore">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more</string> - <string name="InventoryPlayAnimationTooltip">Abrir a janela com as opções do Jogo.</string> - <string name="InventoryPlayGestureTooltip">Executar o gesto selecionado no mundo.</string> - <string name="InventoryPlaySoundTooltip">Abrir a janela com as opções do Jogo.</string> - <string name="InventoryOutboxNotMerchantTitle">Qualquer um pode vender itens no Mercado.</string> + <string name="SilentlyManageEstateAccess"> + Suprimir alertas ao gerenciar listas de acesso ao terreno + </string> + <string name="OverrideYourAnimations"> + Substituir suas animações padrão + </string> + <string name="ScriptReturnObjects"> + Retornar objetos em seu nome + </string> + <string name="UnknownScriptPermission"> + (desconhecido)! + </string> + <string name="SIM_ACCESS_PG"> + Público geral + </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"> + Desconhecido + </string> + <string name="land_type_unknown"> + (desconhecido) + </string> + <string name="Estate / Full Region"> + Propriedadade / Região inteira: + </string> + <string name="Estate / Homestead"> + Imóvel / Homestead + </string> + <string name="Mainland / Homestead"> + Continente / Homestead + </string> + <string name="Mainland / Full Region"> + Continente / Região inteira: + </string> + <string name="all_files"> + Todos os arquivos + </string> + <string name="sound_files"> + Sons + </string> + <string name="animation_files"> + Animações + </string> + <string name="image_files"> + Imagens + </string> + <string name="save_file_verb"> + Salvar + </string> + <string name="load_file_verb"> + Carregar + </string> + <string name="targa_image_files"> + Imagens Targa + </string> + <string name="bitmap_image_files"> + Imagens Bitmap + </string> + <string name="png_image_files"> + Imagens PNG + </string> + <string name="save_texture_image_files"> + Imagens targa ou PNG + </string> + <string name="avi_movie_file"> + Arquivo de vÃdeo AVI + </string> + <string name="xaf_animation_file"> + Arquivo de animação XAF + </string> + <string name="xml_file"> + Arquivo XML + </string> + <string name="raw_file"> + Arquivo RAW + </string> + <string name="compressed_image_files"> + Imagens compactadas + </string> + <string name="load_files"> + Carregar arquivos + </string> + <string name="choose_the_directory"> + Selecionar pasta + </string> + <string name="script_files"> + Scripts + </string> + <string name="dictionary_files"> + Dicionários + </string> + <string name="shape"> + Silhueta + </string> + <string name="skin"> + Pele + </string> + <string name="hair"> + Cabelo + </string> + <string name="eyes"> + Olhos + </string> + <string name="shirt"> + Camisa + </string> + <string name="pants"> + Calças + </string> + <string name="shoes"> + Sapatos + </string> + <string name="socks"> + Meias + </string> + <string name="jacket"> + Blusa + </string> + <string name="gloves"> + Luvas + </string> + <string name="undershirt"> + Camiseta + </string> + <string name="underpants"> + Roupa de baixo + </string> + <string name="skirt"> + Saia + </string> + <string name="alpha"> + Alpha + </string> + <string name="tattoo"> + Tatuagem + </string> + <string name="universal"> + Universal + </string> + <string name="physics"> + FÃsico + </string> + <string name="invalid"> + Inválido + </string> + <string name="none"> + nenhum + </string> + <string name="shirt_not_worn"> + Camisa não vestida + </string> + <string name="pants_not_worn"> + Calças não vestidas + </string> + <string name="shoes_not_worn"> + Sapatos não calçados + </string> + <string name="socks_not_worn"> + Meias não calçadas + </string> + <string name="jacket_not_worn"> + Jaqueta não vestida + </string> + <string name="gloves_not_worn"> + Luvas não calçadas + </string> + <string name="undershirt_not_worn"> + Camiseta não vestida + </string> + <string name="underpants_not_worn"> + Roupa de baixo não vestida + </string> + <string name="skirt_not_worn"> + Saia não vestida + </string> + <string name="alpha_not_worn"> + Alpha não vestido + </string> + <string name="tattoo_not_worn"> + Tatuagem não usada + </string> + <string name="universal_not_worn"> + Universal não usado + </string> + <string name="physics_not_worn"> + FÃsico não usado + </string> + <string name="invalid_not_worn"> + inválido + </string> + <string name="create_new_shape"> + Criar novo fÃsico + </string> + <string name="create_new_skin"> + Criar pele nova + </string> + <string name="create_new_hair"> + Criar cabelo novo + </string> + <string name="create_new_eyes"> + Criar olhos novos + </string> + <string name="create_new_shirt"> + Criar camisa nova + </string> + <string name="create_new_pants"> + Criar calças novas + </string> + <string name="create_new_shoes"> + Criar sapatos novos + </string> + <string name="create_new_socks"> + Criar meias novas + </string> + <string name="create_new_jacket"> + Criar jaqueta nova + </string> + <string name="create_new_gloves"> + Criar luvas novas + </string> + <string name="create_new_undershirt"> + Criar camiseta nova + </string> + <string name="create_new_underpants"> + Criar roupa de baixo nova + </string> + <string name="create_new_skirt"> + Criar saia nova + </string> + <string name="create_new_alpha"> + Criar Alpha novo + </string> + <string name="create_new_tattoo"> + Criar nova tatuagem + </string> + <string name="create_new_universal"> + Criar um novo universal + </string> + <string name="create_new_physics"> + Criar novo fÃsico + </string> + <string name="create_new_invalid"> + inválido + </string> + <string name="NewWearable"> + Novo [WEARABLE_ITEM] + </string> + <string name="next"> + Próximo + </string> + <string name="ok"> + OK + </string> + <string name="GroupNotifyGroupNotice"> + Anúncio de grupo + </string> + <string name="GroupNotifyGroupNotices"> + Anúncios do grupo + </string> + <string name="GroupNotifySentBy"> + Enviado por + </string> + <string name="GroupNotifyAttached"> + Anexo: + </string> + <string name="GroupNotifyViewPastNotices"> + Ver últimos anúncios ou optar por não receber essas mensagens aqui. + </string> + <string name="GroupNotifyOpenAttachment"> + Abrir anexo + </string> + <string name="GroupNotifySaveAttachment"> + Salvar anexo + </string> + <string name="TeleportOffer"> + Oferta de teletransporte + </string> + <string name="StartUpNotifications"> + Novas notificações chegaram enquanto você estava fora... + </string> + <string name="OverflowInfoChannelString"> + Você tem mais [%d] notificações + </string> + <string name="BodyPartsRightArm"> + Braço direito + </string> + <string name="BodyPartsHead"> + Cabeça + </string> + <string name="BodyPartsLeftArm"> + Braço esquerdo + </string> + <string name="BodyPartsLeftLeg"> + Perna esquerda + </string> + <string name="BodyPartsTorso"> + Tronco + </string> + <string name="BodyPartsRightLeg"> + Perna direita + </string> + <string name="BodyPartsEnhancedSkeleton"> + Esqueleto aprimorado + </string> + <string name="GraphicsQualityLow"> + Baixo + </string> + <string name="GraphicsQualityMid"> + Meio + </string> + <string name="GraphicsQualityHigh"> + Alto + </string> + <string name="LeaveMouselook"> + Pressione ESC para retornar para visão do mundo + </string> + <string name="InventoryNoMatchingItems"> + Não encontrou o que procura? Tente buscar no [secondlife:///app/search/people/[SEARCH_TERM] Search]. + </string> + <string name="InventoryNoMatchingRecentItems"> + Não encontrou o que procura? Tente [secondlife:///app/inventory/filters Show filters]. + </string> + <string name="PlacesNoMatchingItems"> + Não encontrou o que procura? Tente buscar no [secondlife:///app/search/groups/[SEARCH_TERM] Search]. + </string> + <string name="FavoritesNoMatchingItems"> + Arraste um marco para adicioná-lo aos seus favoritos. + </string> + <string name="MarketplaceNoMatchingItems"> + Nenhum item correspondente encontrado. Verifique a ortografia de sua cadeia de pesquisa e tente novamente. + </string> + <string name="InventoryNoTexture"> + Você não possui uma cópia desta textura no seu inventário + </string> + <string name="InventoryInboxNoItems"> + Suas compras do Marketplace aparecerão aqui. Depois, você poderá arrastá-las para seu inventário para usá-las. + </string> + <string name="MarketplaceURL"> + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ + </string> + <string name="MarketplaceURL_CreateStore"> + http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 + </string> + <string name="MarketplaceURL_Dashboard"> + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard + </string> + <string name="MarketplaceURL_Imports"> + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports + </string> + <string name="MarketplaceURL_LearnMore"> + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more + </string> + <string name="InventoryPlayAnimationTooltip"> + Abrir a janela com as opções do Jogo. + </string> + <string name="InventoryPlayGestureTooltip"> + Executar o gesto selecionado no mundo. + </string> + <string name="InventoryPlaySoundTooltip"> + Abrir a janela com as opções do Jogo. + </string> + <string name="InventoryOutboxNotMerchantTitle"> + Qualquer um pode vender itens no Mercado. + </string> <string name="InventoryOutboxNotMerchantTooltip"/> - <string name="InventoryOutboxNotMerchant">Se você deseja se tornar um lojista, precisará [[MARKETPLACE_CREATE_STORE_URL] criar uma loja no Mercado].</string> - <string name="InventoryOutboxNoItemsTitle">Sua caixa de saÃda está vazia</string> + <string name="InventoryOutboxNotMerchant"> + Se você deseja se tornar um lojista, precisará [[MARKETPLACE_CREATE_STORE_URL] criar uma loja no Mercado]. + </string> + <string name="InventoryOutboxNoItemsTitle"> + Sua caixa de saÃda está vazia + </string> <string name="InventoryOutboxNoItemsTooltip"/> - <string name="InventoryOutboxNoItems">Arraste as pastas para estas áreas e então clique em "Enviar para Mercado" para listar os itens para venda no [[MARKETPLACE_DASHBOARD_URL] Mercado].</string> - <string name="InventoryOutboxInitializingTitle">Inicializando o Marketplace.</string> - <string name="InventoryOutboxInitializing">Estamos acessando sua conta na [loja [MARKETPLACE_CREATE_STORE_URL] do Marketplace].</string> - <string name="InventoryOutboxErrorTitle">Erros do Marketplace.</string> - <string name="InventoryOutboxError">A loja [[MARKETPLACE_CREATE_STORE_URL] no Marketplace] está retornando erros.</string> - <string name="InventoryMarketplaceError">Erro ao abrir as listagens do Marketplace. -Se você continuar a receber essa mensagem, entre em contato com o suporte do Second Life para obter ajuda em http://support.secondlife.com</string> - <string name="InventoryMarketplaceListingsNoItemsTitle">Sua pasta Listagens do Marketplace está vazia.</string> - <string name="InventoryMarketplaceListingsNoItems">Arraste pastas para esta área para listá-las para venda no [Marketplace [MARKETPLACE_DASHBOARD_URL]].</string> - <string name="InventoryItemsCount">( [ITEMS_COUNT] Items )</string> - <string name="Marketplace Validation Warning Stock">a pasta de estoque deve estar em uma pasta de versões</string> - <string name="Marketplace Validation Error Mixed Stock">: Erro: todos os itens em uma pasta de estoque devem ser de cópia proibida e todos do mesmo tipo</string> - <string name="Marketplace Validation Error Subfolder In Stock">: Erro: a pasta de estoque não pode ter subpastas</string> - <string name="Marketplace Validation Warning Empty">: Aviso: a pasta não contém itens</string> - <string name="Marketplace Validation Warning Create Stock">: Aviso: criando pasta de estoque</string> - <string name="Marketplace Validation Warning Create Version">: Aviso: criando pasta de versões</string> - <string name="Marketplace Validation Warning Move">: Aviso: movendo itens</string> - <string name="Marketplace Validation Warning Delete">: Aviso: conteúdo da pasta transferido para pasta de estoque, removendo pasta vazia</string> - <string name="Marketplace Validation Error Stock Item">: Erro: itens de cópia proibida devem estar em uma pasta de estoque</string> - <string name="Marketplace Validation Warning Unwrapped Item">: Aviso: os itens devem estar em uma pasta de versões</string> - <string name="Marketplace Validation Error">: Erro:</string> - <string name="Marketplace Validation Warning">: Aviso:</string> - <string name="Marketplace Validation Error Empty Version">: Aviso: a pasta de versões deve conter pelo menos 1 item</string> - <string name="Marketplace Validation Error Empty Stock">: Aviso: a pasta de estoque deve conter pelo menos 1 item</string> - <string name="Marketplace Validation No Error">Não há erros ou avisos</string> - <string name="Marketplace Error None">Sem erros</string> - <string name="Marketplace Error Prefix">Erro:</string> - <string name="Marketplace Error Not Merchant">antes de enviar os itens para o Marketplace, é necessário que você se defina como um lojista (sem custos).</string> - <string name="Marketplace Error Not Accepted">Não é possÃvel mover o item nessa pasta.</string> - <string name="Marketplace Error Unsellable Item">Este item não pode ser vendido no Marketplace.</string> - <string name="MarketplaceNoID">no Mkt ID</string> - <string name="MarketplaceLive">publicada</string> - <string name="MarketplaceActive">ativo</string> - <string name="MarketplaceMax">máx</string> - <string name="MarketplaceStock">estoque</string> - <string name="MarketplaceNoStock">esgotado</string> - <string name="MarketplaceUpdating">atualizando...</string> - <string name="UploadFeeInfo">A taxa é baseada em seu nÃvel de inscrição. NÃveis mais altos possuem taxas mais baixas. [https://secondlife.com/my/account/membership.php? Saiba mais]</string> - <string name="Open landmarks">Marcos em aberto</string> - <string name="Unconstrained">Ilimitado</string> + <string name="InventoryOutboxNoItems"> + Arraste as pastas para estas áreas e então clique em "Enviar para Mercado" para listar os itens para venda no [[MARKETPLACE_DASHBOARD_URL] Mercado]. + </string> + <string name="InventoryOutboxInitializingTitle"> + Inicializando o Marketplace. + </string> + <string name="InventoryOutboxInitializing"> + Estamos acessando sua conta na [loja [MARKETPLACE_CREATE_STORE_URL] do Marketplace]. + </string> + <string name="InventoryOutboxErrorTitle"> + Erros do Marketplace. + </string> + <string name="InventoryOutboxError"> + A loja [[MARKETPLACE_CREATE_STORE_URL] no Marketplace] está retornando erros. + </string> + <string name="InventoryMarketplaceError"> + Erro ao abrir as listagens do Marketplace. +Se você continuar a receber essa mensagem, entre em contato com o suporte do Second Life para obter ajuda em http://support.secondlife.com + </string> + <string name="InventoryMarketplaceListingsNoItemsTitle"> + Sua pasta Listagens do Marketplace está vazia. + </string> + <string name="InventoryMarketplaceListingsNoItems"> + Arraste pastas para esta área para listá-las para venda no [Marketplace [MARKETPLACE_DASHBOARD_URL]]. + </string> + <string name="InventoryItemsCount"> + ( [ITEMS_COUNT] Items ) + </string> + <string name="Marketplace Validation Warning Stock"> + a pasta de estoque deve estar em uma pasta de versões + </string> + <string name="Marketplace Validation Error Mixed Stock"> + : Erro: todos os itens em uma pasta de estoque devem ser de cópia proibida e todos do mesmo tipo + </string> + <string name="Marketplace Validation Error Subfolder In Stock"> + : Erro: a pasta de estoque não pode ter subpastas + </string> + <string name="Marketplace Validation Warning Empty"> + : Aviso: a pasta não contém itens + </string> + <string name="Marketplace Validation Warning Create Stock"> + : Aviso: criando pasta de estoque + </string> + <string name="Marketplace Validation Warning Create Version"> + : Aviso: criando pasta de versões + </string> + <string name="Marketplace Validation Warning Move"> + : Aviso: movendo itens + </string> + <string name="Marketplace Validation Warning Delete"> + : Aviso: conteúdo da pasta transferido para pasta de estoque, removendo pasta vazia + </string> + <string name="Marketplace Validation Error Stock Item"> + : Erro: itens de cópia proibida devem estar em uma pasta de estoque + </string> + <string name="Marketplace Validation Warning Unwrapped Item"> + : Aviso: os itens devem estar em uma pasta de versões + </string> + <string name="Marketplace Validation Error"> + : Erro: + </string> + <string name="Marketplace Validation Warning"> + : Aviso: + </string> + <string name="Marketplace Validation Error Empty Version"> + : Aviso: a pasta de versões deve conter pelo menos 1 item + </string> + <string name="Marketplace Validation Error Empty Stock"> + : Aviso: a pasta de estoque deve conter pelo menos 1 item + </string> + <string name="Marketplace Validation No Error"> + Não há erros ou avisos + </string> + <string name="Marketplace Error None"> + Sem erros + </string> + <string name="Marketplace Error Prefix"> + Erro: + </string> + <string name="Marketplace Error Not Merchant"> + antes de enviar os itens para o Marketplace, é necessário que você se defina como um lojista (sem custos). + </string> + <string name="Marketplace Error Not Accepted"> + Não é possÃvel mover o item nessa pasta. + </string> + <string name="Marketplace Error Unsellable Item"> + Este item não pode ser vendido no Marketplace. + </string> + <string name="MarketplaceNoID"> + no Mkt ID + </string> + <string name="MarketplaceLive"> + publicada + </string> + <string name="MarketplaceActive"> + ativo + </string> + <string name="MarketplaceMax"> + máx + </string> + <string name="MarketplaceStock"> + estoque + </string> + <string name="MarketplaceNoStock"> + esgotado + </string> + <string name="MarketplaceUpdating"> + atualizando... + </string> + <string name="UploadFeeInfo"> + A taxa é baseada em seu nÃvel de inscrição. NÃveis mais altos possuem taxas mais baixas. [https://secondlife.com/my/account/membership.php? Saiba mais] + </string> + <string name="Open landmarks"> + Marcos em aberto + </string> + <string name="Unconstrained"> + Ilimitado + </string> <string name="no_transfer" value="(não transferÃvel)"/> <string name="no_modify" value="(não modificável)"/> <string name="no_copy" value="(não copiável)"/> <string name="worn" value="(vestido)"/> <string name="link" value="(link)"/> <string name="broken_link" value="(link_quebrado)""/> - <string name="LoadingContents">Carregando conteúdo...</string> - <string name="NoContents">Nenhum conteúdo</string> + <string name="LoadingContents"> + Carregando conteúdo... + </string> + <string name="NoContents"> + Nenhum conteúdo + </string> <string name="WornOnAttachmentPoint" value="(vestido em [ATTACHMENT_POINT])"/> <string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/> <string name="ActiveGesture" value="[GESLABEL] (ativado)"/> @@ -596,1413 +1649,4139 @@ Se você continuar a receber essa mensagem, entre em contato com o suporte do Se <string name="Snapshots" value="Fotografias"/> <string name="No Filters" value="Não"/> <string name="Since Logoff" value="- Desde desligado"/> - <string name="InvFolder My Inventory">Meu inventário</string> - <string name="InvFolder Library">Biblioteca</string> - <string name="InvFolder Textures">Texturas</string> - <string name="InvFolder Sounds">Sons</string> - <string name="InvFolder Calling Cards">Cartões de visitas</string> - <string name="InvFolder Landmarks">Marcos</string> - <string name="InvFolder Scripts">Scripts</string> - <string name="InvFolder Clothing">Vestuário</string> - <string name="InvFolder Objects">Objetos</string> - <string name="InvFolder Notecards">Anotações</string> - <string name="InvFolder New Folder">Nova pasta</string> - <string name="InvFolder Inventory">Inventário</string> - <string name="InvFolder Uncompressed Images">Imagens descompactadas</string> - <string name="InvFolder Body Parts">Corpo</string> - <string name="InvFolder Trash">Lixo</string> - <string name="InvFolder Photo Album">Ãlbum de fotografias</string> - <string name="InvFolder Lost And Found">Achados e Perdidos</string> - <string name="InvFolder Uncompressed Sounds">Sons descompactados</string> - <string name="InvFolder Animations">Animações</string> - <string name="InvFolder Gestures">Gestos</string> - <string name="InvFolder Favorite">Meus favoritos</string> - <string name="InvFolder favorite">Meus favoritos</string> - <string name="InvFolder Favorites">Meus favoritos</string> - <string name="InvFolder favorites">Meus favoritos</string> - <string name="InvFolder Current Outfit">Look atual</string> - <string name="InvFolder Initial Outfits">Looks iniciais</string> - <string name="InvFolder My Outfits">Meus looks</string> - <string name="InvFolder Accessories">Acessórios</string> - <string name="InvFolder Meshes">Meshes:</string> - <string name="InvFolder Received Items">Itens recebidos</string> - <string name="InvFolder Merchant Outbox">Caixa de saÃda do lojista</string> - <string name="InvFolder Friends">Amigos</string> - <string name="InvFolder All">Tudo</string> - <string name="no_attachments">Nenhum anexo vestido</string> - <string name="Attachments remain">Anexos ([COUNT] slots permanecem)</string> - <string name="Buy">Comprar</string> - <string name="BuyforL$">Comprar por L$</string> - <string name="Stone">Pedra</string> - <string name="Metal">Metal</string> - <string name="Glass">Vidro</string> - <string name="Wood">Madeira</string> - <string name="Flesh">Carne</string> - <string name="Plastic">Plástico</string> - <string name="Rubber">Borrracha</string> - <string name="Light">Luz</string> - <string name="KBShift">Shift</string> - <string name="KBCtrl">Ctrl</string> - <string name="Chest">Peito</string> - <string name="Skull">Crânio</string> - <string name="Left Shoulder">Ombro esquerdo</string> - <string name="Right Shoulder">Ombro direito</string> - <string name="Left Hand">Mão esquerda</string> - <string name="Right Hand">Mão direita</string> - <string name="Left Foot">Pé esquerdo</string> - <string name="Right Foot">Pé direito</string> - <string name="Spine">Espinha</string> - <string name="Pelvis">Pélvis</string> - <string name="Mouth">Boca</string> - <string name="Chin">Queixo</string> - <string name="Left Ear">Orelha esquerda</string> - <string name="Right Ear">Orelha direita</string> - <string name="Left Eyeball">Globo ocular esquerdo</string> - <string name="Right Eyeball">Globo ocular direito</string> - <string name="Nose">Nariz</string> - <string name="R Upper Arm">Braço superior D</string> - <string name="R Forearm">Antebraço D</string> - <string name="L Upper Arm">Braço superior E</string> - <string name="L Forearm">Antebraço E</string> - <string name="Right Hip">Quadril direito</string> - <string name="R Upper Leg">Coxa D</string> - <string name="R Lower Leg">Perna inferior D</string> - <string name="Left Hip">Quadril esquerdo</string> - <string name="L Upper Leg">Coxa E</string> - <string name="L Lower Leg">Perna inferior E</string> - <string name="Stomach">Estômago</string> - <string name="Left Pec">Peitoral E</string> - <string name="Right Pec">Peitoral D</string> - <string name="Neck">Pescoço</string> - <string name="Avatar Center">Centro do avatar</string> - <string name="Left Ring Finger">Anelar esquerdo</string> - <string name="Right Ring Finger">Anelar direito</string> - <string name="Tail Base">Base do rabo</string> - <string name="Tail Tip">Ponta do rabo</string> - <string name="Left Wing">Asa esquerda</string> - <string name="Right Wing">Asa direita</string> - <string name="Jaw">Maxilar</string> - <string name="Alt Left Ear">Orelha esquerda alt.</string> - <string name="Alt Right Ear">Orelha direita alt.</string> - <string name="Alt Left Eye">Olho esquerdo alt.</string> - <string name="Alt Right Eye">Olho direito alt.</string> - <string name="Tongue">LÃngua</string> - <string name="Groin">Virilha</string> - <string name="Left Hind Foot">Pata esq. traseira</string> - <string name="Right Hind Foot">Pata dir. traseira</string> - <string name="Invalid Attachment">Ponto de encaixe inválido</string> - <string name="ATTACHMENT_MISSING_ITEM">Erro: item ausente</string> - <string name="ATTACHMENT_MISSING_BASE_ITEM">Erro: item base ausente</string> - <string name="ATTACHMENT_NOT_ATTACHED">Erro: o objeto está no look atual, mas não foi anexado</string> - <string name="YearsMonthsOld">[AGEYEARS] [AGEMONTHS] de idade</string> - <string name="YearsOld">[AGEYEARS] de idade</string> - <string name="MonthsOld">[AGEMONTHS] de idade</string> - <string name="WeeksOld">[AGEWEEKS] de idade</string> - <string name="DaysOld">[AGEDAYS] de idade</string> - <string name="TodayOld">Cadastrado hoje</string> - <string name="av_render_everyone_now">Agora, todos podem te ver.</string> - <string name="av_render_not_everyone">Sua renderização pode não acontecer para todos ao seu redor.</string> - <string name="av_render_over_half">Sua renderização pode não acontecer para metade das pessoas ao seu redor.</string> - <string name="av_render_most_of">Sua renderização pode não acontecer para a maioria das pessoas ao seu redor.</string> - <string name="av_render_anyone">Sua renderização pode não acontecer para ninguém ao seu redor.</string> - <string name="hud_description_total">Seu HUD</string> - <string name="hud_name_with_joint">[OBJ_NAME] (vestido em [JNT_NAME])</string> - <string name="hud_render_memory_warning">[HUD_DETAILS] usa muita memória de textura</string> - <string name="hud_render_cost_warning">[HUD_DETAILS] contém muitos objetos e texturas que utilizam o máximo de recursos</string> - <string name="hud_render_heavy_textures_warning">[HUD_DETAILS] contém muitas texturas grandes</string> - <string name="hud_render_cramped_warning">[HUD_DETAILS] contém muitos objetos</string> - <string name="hud_render_textures_warning">[HUD_DETAILS] contém muitas texturas</string> - <string name="AgeYearsA">[COUNT] ano</string> - <string name="AgeYearsB">[COUNT] anos</string> - <string name="AgeYearsC">[COUNT] anos</string> - <string name="AgeMonthsA">[COUNT] mês</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] dia</string> - <string name="AgeDaysB">[COUNT] dias</string> - <string name="AgeDaysC">[COUNT] dias</string> - <string name="GroupMembersA">[COUNT] membro</string> - <string name="GroupMembersB">[COUNT] membros</string> - <string name="GroupMembersC">[COUNT] membros</string> - <string name="AcctTypeResident">Residente</string> - <string name="AcctTypeTrial">Prova</string> - <string name="AcctTypeCharterMember">Lista de membros</string> - <string name="AcctTypeEmployee">Empregado da Linden Lab</string> - <string name="PaymentInfoUsed">Dados de pagamento usados</string> - <string name="PaymentInfoOnFile">Dados de pagamento fornecidos</string> - <string name="NoPaymentInfoOnFile">Nenhum dado de pagamento</string> - <string name="AgeVerified">Idade comprovada</string> - <string name="NotAgeVerified">Idade não comprovada</string> - <string name="Center 2">Centro 2</string> - <string name="Top Right">Topo direita</string> - <string name="Top">Topo</string> - <string name="Top Left">Topo esquerda</string> - <string name="Center">Centro</string> - <string name="Bottom Left">Inferior esquerdo</string> - <string name="Bottom">Inferior</string> - <string name="Bottom Right">Inferior direito</string> - <string name="CompileQueueDownloadedCompiling">Baixado, agora compilando</string> - <string name="CompileQueueServiceUnavailable">Serviço de compilação de scripts não disponÃvel</string> - <string name="CompileQueueScriptNotFound">Script não encontrado no servidor.</string> - <string name="CompileQueueProblemDownloading">Problema no download</string> - <string name="CompileQueueInsufficientPermDownload">Permissões insuficientes para fazer o download do script.</string> - <string name="CompileQueueInsufficientPermFor">Permissões insuficientes para</string> - <string name="CompileQueueUnknownFailure">Falha desconhecida para download</string> - <string name="CompileNoExperiencePerm">Pulando script [SCRIPT] com experiência [EXPERIENCE]</string> - <string name="CompileQueueTitle">Progresso do recompilamento</string> - <string name="CompileQueueStart">recompilar</string> - <string name="ResetQueueTitle">Reset Progresso</string> - <string name="ResetQueueStart">Zerar</string> - <string name="RunQueueTitle">Definir funcionamento do progresso</string> - <string name="RunQueueStart">deixar funcionando</string> - <string name="NotRunQueueTitle">Definir progresso não funcionando</string> - <string name="NotRunQueueStart">não deixar funcionando</string> - <string name="CompileSuccessful">Compilação bem sucedida</string> - <string name="CompileSuccessfulSaving">Compilação bem sucedida, salvando...</string> - <string name="SaveComplete">Salvo.</string> - <string name="UploadFailed">Falha ao carregar arquivo:</string> - <string name="ObjectOutOfRange">Script (objeto fora de alcance)</string> - <string name="ScriptWasDeleted">Script (excluÃdo do inventário)</string> - <string name="GodToolsObjectOwnedBy">Objeto [OBJECT] de propriedade de [OWNER]</string> - <string name="GroupsNone">nenhum</string> + <string name="InvFolder My Inventory"> + Meu inventário + </string> + <string name="InvFolder Library"> + Biblioteca + </string> + <string name="InvFolder Textures"> + Texturas + </string> + <string name="InvFolder Sounds"> + Sons + </string> + <string name="InvFolder Calling Cards"> + Cartões de visitas + </string> + <string name="InvFolder Landmarks"> + Marcos + </string> + <string name="InvFolder Scripts"> + Scripts + </string> + <string name="InvFolder Clothing"> + Vestuário + </string> + <string name="InvFolder Objects"> + Objetos + </string> + <string name="InvFolder Notecards"> + Anotações + </string> + <string name="InvFolder New Folder"> + Nova pasta + </string> + <string name="InvFolder Inventory"> + Inventário + </string> + <string name="InvFolder Uncompressed Images"> + Imagens descompactadas + </string> + <string name="InvFolder Body Parts"> + Corpo + </string> + <string name="InvFolder Trash"> + Lixo + </string> + <string name="InvFolder Photo Album"> + Ãlbum de fotografias + </string> + <string name="InvFolder Lost And Found"> + Achados e Perdidos + </string> + <string name="InvFolder Uncompressed Sounds"> + Sons descompactados + </string> + <string name="InvFolder Animations"> + Animações + </string> + <string name="InvFolder Gestures"> + Gestos + </string> + <string name="InvFolder Favorite"> + Meus favoritos + </string> + <string name="InvFolder favorite"> + Meus favoritos + </string> + <string name="InvFolder Favorites"> + Meus favoritos + </string> + <string name="InvFolder favorites"> + Meus favoritos + </string> + <string name="InvFolder Current Outfit"> + Look atual + </string> + <string name="InvFolder Initial Outfits"> + Looks iniciais + </string> + <string name="InvFolder My Outfits"> + Meus looks + </string> + <string name="InvFolder Accessories"> + Acessórios + </string> + <string name="InvFolder Meshes"> + Meshes: + </string> + <string name="InvFolder Received Items"> + Itens recebidos + </string> + <string name="InvFolder Merchant Outbox"> + Caixa de saÃda do lojista + </string> + <string name="InvFolder Friends"> + Amigos + </string> + <string name="InvFolder All"> + Tudo + </string> + <string name="no_attachments"> + Nenhum anexo vestido + </string> + <string name="Attachments remain"> + Anexos ([COUNT] slots permanecem) + </string> + <string name="Buy"> + Comprar + </string> + <string name="BuyforL$"> + Comprar por L$ + </string> + <string name="Stone"> + Pedra + </string> + <string name="Metal"> + Metal + </string> + <string name="Glass"> + Vidro + </string> + <string name="Wood"> + Madeira + </string> + <string name="Flesh"> + Carne + </string> + <string name="Plastic"> + Plástico + </string> + <string name="Rubber"> + Borrracha + </string> + <string name="Light"> + Luz + </string> + <string name="KBShift"> + Shift + </string> + <string name="KBCtrl"> + Ctrl + </string> + <string name="Chest"> + Peito + </string> + <string name="Skull"> + Crânio + </string> + <string name="Left Shoulder"> + Ombro esquerdo + </string> + <string name="Right Shoulder"> + Ombro direito + </string> + <string name="Left Hand"> + Mão esquerda + </string> + <string name="Right Hand"> + Mão direita + </string> + <string name="Left Foot"> + Pé esquerdo + </string> + <string name="Right Foot"> + Pé direito + </string> + <string name="Spine"> + Espinha + </string> + <string name="Pelvis"> + Pélvis + </string> + <string name="Mouth"> + Boca + </string> + <string name="Chin"> + Queixo + </string> + <string name="Left Ear"> + Orelha esquerda + </string> + <string name="Right Ear"> + Orelha direita + </string> + <string name="Left Eyeball"> + Globo ocular esquerdo + </string> + <string name="Right Eyeball"> + Globo ocular direito + </string> + <string name="Nose"> + Nariz + </string> + <string name="R Upper Arm"> + Braço superior D + </string> + <string name="R Forearm"> + Antebraço D + </string> + <string name="L Upper Arm"> + Braço superior E + </string> + <string name="L Forearm"> + Antebraço E + </string> + <string name="Right Hip"> + Quadril direito + </string> + <string name="R Upper Leg"> + Coxa D + </string> + <string name="R Lower Leg"> + Perna inferior D + </string> + <string name="Left Hip"> + Quadril esquerdo + </string> + <string name="L Upper Leg"> + Coxa E + </string> + <string name="L Lower Leg"> + Perna inferior E + </string> + <string name="Stomach"> + Estômago + </string> + <string name="Left Pec"> + Peitoral E + </string> + <string name="Right Pec"> + Peitoral D + </string> + <string name="Neck"> + Pescoço + </string> + <string name="Avatar Center"> + Centro do avatar + </string> + <string name="Left Ring Finger"> + Anelar esquerdo + </string> + <string name="Right Ring Finger"> + Anelar direito + </string> + <string name="Tail Base"> + Base do rabo + </string> + <string name="Tail Tip"> + Ponta do rabo + </string> + <string name="Left Wing"> + Asa esquerda + </string> + <string name="Right Wing"> + Asa direita + </string> + <string name="Jaw"> + Maxilar + </string> + <string name="Alt Left Ear"> + Orelha esquerda alt. + </string> + <string name="Alt Right Ear"> + Orelha direita alt. + </string> + <string name="Alt Left Eye"> + Olho esquerdo alt. + </string> + <string name="Alt Right Eye"> + Olho direito alt. + </string> + <string name="Tongue"> + LÃngua + </string> + <string name="Groin"> + Virilha + </string> + <string name="Left Hind Foot"> + Pata esq. traseira + </string> + <string name="Right Hind Foot"> + Pata dir. traseira + </string> + <string name="Invalid Attachment"> + Ponto de encaixe inválido + </string> + <string name="ATTACHMENT_MISSING_ITEM"> + Erro: item ausente + </string> + <string name="ATTACHMENT_MISSING_BASE_ITEM"> + Erro: item base ausente + </string> + <string name="ATTACHMENT_NOT_ATTACHED"> + Erro: o objeto está no look atual, mas não foi anexado + </string> + <string name="YearsMonthsOld"> + [AGEYEARS] [AGEMONTHS] de idade + </string> + <string name="YearsOld"> + [AGEYEARS] de idade + </string> + <string name="MonthsOld"> + [AGEMONTHS] de idade + </string> + <string name="WeeksOld"> + [AGEWEEKS] de idade + </string> + <string name="DaysOld"> + [AGEDAYS] de idade + </string> + <string name="TodayOld"> + Cadastrado hoje + </string> + <string name="av_render_everyone_now"> + Agora, todos podem te ver. + </string> + <string name="av_render_not_everyone"> + Sua renderização pode não acontecer para todos ao seu redor. + </string> + <string name="av_render_over_half"> + Sua renderização pode não acontecer para metade das pessoas ao seu redor. + </string> + <string name="av_render_most_of"> + Sua renderização pode não acontecer para a maioria das pessoas ao seu redor. + </string> + <string name="av_render_anyone"> + Sua renderização pode não acontecer para ninguém ao seu redor. + </string> + <string name="hud_description_total"> + Seu HUD + </string> + <string name="hud_name_with_joint"> + [OBJ_NAME] (vestido em [JNT_NAME]) + </string> + <string name="hud_render_memory_warning"> + [HUD_DETAILS] usa muita memória de textura + </string> + <string name="hud_render_cost_warning"> + [HUD_DETAILS] contém muitos objetos e texturas que utilizam o máximo de recursos + </string> + <string name="hud_render_heavy_textures_warning"> + [HUD_DETAILS] contém muitas texturas grandes + </string> + <string name="hud_render_cramped_warning"> + [HUD_DETAILS] contém muitos objetos + </string> + <string name="hud_render_textures_warning"> + [HUD_DETAILS] contém muitas texturas + </string> + <string name="AgeYearsA"> + [COUNT] ano + </string> + <string name="AgeYearsB"> + [COUNT] anos + </string> + <string name="AgeYearsC"> + [COUNT] anos + </string> + <string name="AgeMonthsA"> + [COUNT] mês + </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] dia + </string> + <string name="AgeDaysB"> + [COUNT] dias + </string> + <string name="AgeDaysC"> + [COUNT] dias + </string> + <string name="GroupMembersA"> + [COUNT] membro + </string> + <string name="GroupMembersB"> + [COUNT] membros + </string> + <string name="GroupMembersC"> + [COUNT] membros + </string> + <string name="AcctTypeResident"> + Residente + </string> + <string name="AcctTypeTrial"> + Prova + </string> + <string name="AcctTypeCharterMember"> + Lista de membros + </string> + <string name="AcctTypeEmployee"> + Empregado da Linden Lab + </string> + <string name="PaymentInfoUsed"> + Dados de pagamento usados + </string> + <string name="PaymentInfoOnFile"> + Dados de pagamento fornecidos + </string> + <string name="NoPaymentInfoOnFile"> + Nenhum dado de pagamento + </string> + <string name="AgeVerified"> + Idade comprovada + </string> + <string name="NotAgeVerified"> + Idade não comprovada + </string> + <string name="Center 2"> + Centro 2 + </string> + <string name="Top Right"> + Topo direita + </string> + <string name="Top"> + Topo + </string> + <string name="Top Left"> + Topo esquerda + </string> + <string name="Center"> + Centro + </string> + <string name="Bottom Left"> + Inferior esquerdo + </string> + <string name="Bottom"> + Inferior + </string> + <string name="Bottom Right"> + Inferior direito + </string> + <string name="CompileQueueDownloadedCompiling"> + Baixado, agora compilando + </string> + <string name="CompileQueueServiceUnavailable"> + Serviço de compilação de scripts não disponÃvel + </string> + <string name="CompileQueueScriptNotFound"> + Script não encontrado no servidor. + </string> + <string name="CompileQueueProblemDownloading"> + Problema no download + </string> + <string name="CompileQueueInsufficientPermDownload"> + Permissões insuficientes para fazer o download do script. + </string> + <string name="CompileQueueInsufficientPermFor"> + Permissões insuficientes para + </string> + <string name="CompileQueueUnknownFailure"> + Falha desconhecida para download + </string> + <string name="CompileNoExperiencePerm"> + Pulando script [SCRIPT] com experiência [EXPERIENCE] + </string> + <string name="CompileQueueTitle"> + Progresso do recompilamento + </string> + <string name="CompileQueueStart"> + recompilar + </string> + <string name="ResetQueueTitle"> + Reset Progresso + </string> + <string name="ResetQueueStart"> + Zerar + </string> + <string name="RunQueueTitle"> + Definir funcionamento do progresso + </string> + <string name="RunQueueStart"> + deixar funcionando + </string> + <string name="NotRunQueueTitle"> + Definir progresso não funcionando + </string> + <string name="NotRunQueueStart"> + não deixar funcionando + </string> + <string name="CompileSuccessful"> + Compilação bem sucedida + </string> + <string name="CompileSuccessfulSaving"> + Compilação bem sucedida, salvando... + </string> + <string name="SaveComplete"> + Salvo. + </string> + <string name="UploadFailed"> + Falha ao carregar arquivo: + </string> + <string name="ObjectOutOfRange"> + Script (objeto fora de alcance) + </string> + <string name="ScriptWasDeleted"> + Script (excluÃdo do inventário) + </string> + <string name="GodToolsObjectOwnedBy"> + Objeto [OBJECT] de propriedade de [OWNER] + </string> + <string name="GroupsNone"> + nenhum + </string> <string name="Group" value="(grupo)"/> - <string name="Unknown">(Desconhecido)</string> + <string name="Unknown"> + (Desconhecido) + </string> <string name="SummaryForTheWeek" value="Resumo para esta semana, com inÃcio em "/> <string name="NextStipendDay" value=". Próximo dia de salário é "/> - <string name="GroupPlanningDate">[mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]</string> + <string name="GroupPlanningDate"> + [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc] + </string> <string name="GroupIndividualShare" value="Grupo Divisão individualI"/> <string name="GroupColumn" value="Grupo"/> - <string name="Balance">Balanço</string> - <string name="Credits">Créditos</string> - <string name="Debits">Débitos</string> - <string name="Total">Total</string> - <string name="NoGroupDataFound">Não há dados de grupo</string> - <string name="IMParentEstate">Propriedade-pai</string> - <string name="IMMainland">continente</string> - <string name="IMTeen">adolescente</string> - <string name="Anyone">qualquer um</string> - <string name="RegionInfoError">erro</string> - <string name="RegionInfoAllEstatesOwnedBy">todas as propriedades pertencem a [OWNER]</string> - <string name="RegionInfoAllEstatesYouOwn">todas as propriedades que você possui</string> - <string name="RegionInfoAllEstatesYouManage">todas as propriedades que você gerencia para [OWNER]</string> - <string name="RegionInfoAllowedResidents">Sempre permitido: ([ALLOWEDAGENTS], máx [MAXACCESS])</string> - <string name="RegionInfoAllowedGroups">Grupos sempre permitidos: ([ALLOWEDGROUPS], máx [MAXACCESS])</string> - <string name="RegionInfoBannedResidents">Grupos banidos: ([BANNEDAGENTS], máx [MAXBANNED])</string> - <string name="RegionInfoListTypeAllowedAgents">Sempre permitido</string> - <string name="RegionInfoListTypeBannedAgents">Sempre banido</string> - <string name="RegionInfoAllEstates">todos os terrenos</string> - <string name="RegionInfoManagedEstates">administre terrenos</string> - <string name="RegionInfoThisEstate">este terreno</string> - <string name="AndNMore">e [EXTRA_COUNT] mais</string> - <string name="ScriptLimitsParcelScriptMemory">Memória de scripts no lote</string> - <string name="ScriptLimitsParcelsOwned">Lotes listados: [PARCELS]</string> - <string name="ScriptLimitsMemoryUsed">Memória usada: [COUNT] kb de [MAX] kb; [AVAILABLE] kb disponÃveis</string> - <string name="ScriptLimitsMemoryUsedSimple">Memória usada: [COUNT] kb</string> - <string name="ScriptLimitsParcelScriptURLs">URL dos scripts do lote</string> - <string name="ScriptLimitsURLsUsed">URLs usados: [COUNT] de [MAX]; [AVAILABLE] disponÃveis</string> - <string name="ScriptLimitsURLsUsedSimple">URLs usados: [COUNT]</string> - <string name="ScriptLimitsRequestError">Erro ao solicitar dados</string> - <string name="ScriptLimitsRequestNoParcelSelected">Nenhum lote foi selecionado</string> - <string name="ScriptLimitsRequestWrongRegion">Erro: dados de script só disponÃveis na região da posição atual</string> - <string name="ScriptLimitsRequestWaiting">Obtendo dados...</string> - <string name="ScriptLimitsRequestDontOwnParcel">Você não está autorizado a examinar este lote.</string> - <string name="SITTING_ON">Sentado em</string> - <string name="ATTACH_CHEST">Peito</string> - <string name="ATTACH_HEAD">Crânio</string> - <string name="ATTACH_LSHOULDER">Ombro esquerdo</string> - <string name="ATTACH_RSHOULDER">Ombro direito</string> - <string name="ATTACH_LHAND">Mão esquerda</string> - <string name="ATTACH_RHAND">Mão direita</string> - <string name="ATTACH_LFOOT">Pé esquerdo</string> - <string name="ATTACH_RFOOT">Pé direito</string> - <string name="ATTACH_BACK">Coluna</string> - <string name="ATTACH_PELVIS">Pélvis</string> - <string name="ATTACH_MOUTH">Boca</string> - <string name="ATTACH_CHIN">Queixo</string> - <string name="ATTACH_LEAR">Orelha esquerda</string> - <string name="ATTACH_REAR">Orelha direita</string> - <string name="ATTACH_LEYE">Olho esquerdo</string> - <string name="ATTACH_REYE">Olho direito</string> - <string name="ATTACH_NOSE">Nariz</string> - <string name="ATTACH_RUARM">Braço direito</string> - <string name="ATTACH_RLARM">Antebraço direito</string> - <string name="ATTACH_LUARM">Braço esquerdo</string> - <string name="ATTACH_LLARM">Antebraço esquerdo</string> - <string name="ATTACH_RHIP">Quadril direito</string> - <string name="ATTACH_RULEG">Coxa direita</string> - <string name="ATTACH_RLLEG">Perna direita</string> - <string name="ATTACH_LHIP">Quadril esquerdo</string> - <string name="ATTACH_LULEG">Coxa esquerda</string> - <string name="ATTACH_LLLEG">Perna esquerda</string> - <string name="ATTACH_BELLY">Estômago</string> - <string name="ATTACH_LEFT_PEC">Peitorais E</string> - <string name="ATTACH_RIGHT_PEC">Peitorais D</string> - <string name="ATTACH_HUD_CENTER_2">HUD Central 2</string> - <string name="ATTACH_HUD_TOP_RIGHT">HUD superior direito</string> - <string name="ATTACH_HUD_TOP_CENTER">HUD centro superior</string> - <string name="ATTACH_HUD_TOP_LEFT">HUD superior esquerdo</string> - <string name="ATTACH_HUD_CENTER_1">HUD Central 1</string> - <string name="ATTACH_HUD_BOTTOM_LEFT">HUD esquerda inferior</string> - <string name="ATTACH_HUD_BOTTOM">HUD inferior</string> - <string name="ATTACH_HUD_BOTTOM_RIGHT">HUD direito inferior</string> - <string name="ATTACH_NECK">Pescoço</string> - <string name="ATTACH_AVATAR_CENTER">Centro do avatar</string> - <string name="ATTACH_LHAND_RING1">Anelar esquerdo</string> - <string name="ATTACH_RHAND_RING1">Anelar direito</string> - <string name="ATTACH_TAIL_BASE">Base do rabo</string> - <string name="ATTACH_TAIL_TIP">Ponta do rabo</string> - <string name="ATTACH_LWING">Asa esquerda</string> - <string name="ATTACH_RWING">Asa direita</string> - <string name="ATTACH_FACE_JAW">Maxilar</string> - <string name="ATTACH_FACE_LEAR">Orelha esquerda alt.</string> - <string name="ATTACH_FACE_REAR">Orelha direita alt.</string> - <string name="ATTACH_FACE_LEYE">Olho esquerdo alt.</string> - <string name="ATTACH_FACE_REYE">Olho direito alt.</string> - <string name="ATTACH_FACE_TONGUE">LÃngua</string> - <string name="ATTACH_GROIN">Virilha</string> - <string name="ATTACH_HIND_LFOOT">Pata esq. traseira</string> - <string name="ATTACH_HIND_RFOOT">Pata dir. traseira</string> - <string name="CursorPos">Linha [LINE], Coluna [COLUMN]</string> - <string name="PanelDirCountFound">[COUNT] encontrado</string> - <string name="PanelContentsTooltip">Conteúdo do objeto</string> - <string name="PanelContentsNewScript">Novo Script</string> - <string name="DoNotDisturbModeResponseDefault">Este residente ativou o "Não perturbe" e verá sua mensagem mais tarde.</string> - <string name="MuteByName">(por nome)</string> - <string name="MuteAgent">(residente)</string> - <string name="MuteObject">(objeto)</string> - <string name="MuteGroup">(grupo)</string> - <string name="MuteExternal">(Externo)</string> - <string name="RegionNoCovenant">Não foi definido um contrato para essa região.</string> - <string name="RegionNoCovenantOtherOwner">Não foi definido um contrato para essa Região. O terreno nesta região está sendo vendido pelo Proprietário, não pela Linden Lab. Favor contatar o Proprietário da região para detalhes de venda.</string> + <string name="Balance"> + Balanço + </string> + <string name="Credits"> + Créditos + </string> + <string name="Debits"> + Débitos + </string> + <string name="Total"> + Total + </string> + <string name="NoGroupDataFound"> + Não há dados de grupo + </string> + <string name="IMParentEstate"> + Propriedade-pai + </string> + <string name="IMMainland"> + continente + </string> + <string name="IMTeen"> + adolescente + </string> + <string name="Anyone"> + qualquer um + </string> + <string name="RegionInfoError"> + erro + </string> + <string name="RegionInfoAllEstatesOwnedBy"> + todas as propriedades pertencem a [OWNER] + </string> + <string name="RegionInfoAllEstatesYouOwn"> + todas as propriedades que você possui + </string> + <string name="RegionInfoAllEstatesYouManage"> + todas as propriedades que você gerencia para [OWNER] + </string> + <string name="RegionInfoAllowedResidents"> + Sempre permitido: ([ALLOWEDAGENTS], máx [MAXACCESS]) + </string> + <string name="RegionInfoAllowedGroups"> + Grupos sempre permitidos: ([ALLOWEDGROUPS], máx [MAXACCESS]) + </string> + <string name="RegionInfoBannedResidents"> + Grupos banidos: ([BANNEDAGENTS], máx [MAXBANNED]) + </string> + <string name="RegionInfoListTypeAllowedAgents"> + Sempre permitido + </string> + <string name="RegionInfoListTypeBannedAgents"> + Sempre banido + </string> + <string name="RegionInfoAllEstates"> + todos os terrenos + </string> + <string name="RegionInfoManagedEstates"> + administre terrenos + </string> + <string name="RegionInfoThisEstate"> + este terreno + </string> + <string name="AndNMore"> + e [EXTRA_COUNT] mais + </string> + <string name="ScriptLimitsParcelScriptMemory"> + Memória de scripts no lote + </string> + <string name="ScriptLimitsParcelsOwned"> + Lotes listados: [PARCELS] + </string> + <string name="ScriptLimitsMemoryUsed"> + Memória usada: [COUNT] kb de [MAX] kb; [AVAILABLE] kb disponÃveis + </string> + <string name="ScriptLimitsMemoryUsedSimple"> + Memória usada: [COUNT] kb + </string> + <string name="ScriptLimitsParcelScriptURLs"> + URL dos scripts do lote + </string> + <string name="ScriptLimitsURLsUsed"> + URLs usados: [COUNT] de [MAX]; [AVAILABLE] disponÃveis + </string> + <string name="ScriptLimitsURLsUsedSimple"> + URLs usados: [COUNT] + </string> + <string name="ScriptLimitsRequestError"> + Erro ao solicitar dados + </string> + <string name="ScriptLimitsRequestNoParcelSelected"> + Nenhum lote foi selecionado + </string> + <string name="ScriptLimitsRequestWrongRegion"> + Erro: dados de script só disponÃveis na região da posição atual + </string> + <string name="ScriptLimitsRequestWaiting"> + Obtendo dados... + </string> + <string name="ScriptLimitsRequestDontOwnParcel"> + Você não está autorizado a examinar este lote. + </string> + <string name="SITTING_ON"> + Sentado em + </string> + <string name="ATTACH_CHEST"> + Peito + </string> + <string name="ATTACH_HEAD"> + Crânio + </string> + <string name="ATTACH_LSHOULDER"> + Ombro esquerdo + </string> + <string name="ATTACH_RSHOULDER"> + Ombro direito + </string> + <string name="ATTACH_LHAND"> + Mão esquerda + </string> + <string name="ATTACH_RHAND"> + Mão direita + </string> + <string name="ATTACH_LFOOT"> + Pé esquerdo + </string> + <string name="ATTACH_RFOOT"> + Pé direito + </string> + <string name="ATTACH_BACK"> + Coluna + </string> + <string name="ATTACH_PELVIS"> + Pélvis + </string> + <string name="ATTACH_MOUTH"> + Boca + </string> + <string name="ATTACH_CHIN"> + Queixo + </string> + <string name="ATTACH_LEAR"> + Orelha esquerda + </string> + <string name="ATTACH_REAR"> + Orelha direita + </string> + <string name="ATTACH_LEYE"> + Olho esquerdo + </string> + <string name="ATTACH_REYE"> + Olho direito + </string> + <string name="ATTACH_NOSE"> + Nariz + </string> + <string name="ATTACH_RUARM"> + Braço direito + </string> + <string name="ATTACH_RLARM"> + Antebraço direito + </string> + <string name="ATTACH_LUARM"> + Braço esquerdo + </string> + <string name="ATTACH_LLARM"> + Antebraço esquerdo + </string> + <string name="ATTACH_RHIP"> + Quadril direito + </string> + <string name="ATTACH_RULEG"> + Coxa direita + </string> + <string name="ATTACH_RLLEG"> + Perna direita + </string> + <string name="ATTACH_LHIP"> + Quadril esquerdo + </string> + <string name="ATTACH_LULEG"> + Coxa esquerda + </string> + <string name="ATTACH_LLLEG"> + Perna esquerda + </string> + <string name="ATTACH_BELLY"> + Estômago + </string> + <string name="ATTACH_LEFT_PEC"> + Peitorais E + </string> + <string name="ATTACH_RIGHT_PEC"> + Peitorais D + </string> + <string name="ATTACH_HUD_CENTER_2"> + HUD Central 2 + </string> + <string name="ATTACH_HUD_TOP_RIGHT"> + HUD superior direito + </string> + <string name="ATTACH_HUD_TOP_CENTER"> + HUD centro superior + </string> + <string name="ATTACH_HUD_TOP_LEFT"> + HUD superior esquerdo + </string> + <string name="ATTACH_HUD_CENTER_1"> + HUD Central 1 + </string> + <string name="ATTACH_HUD_BOTTOM_LEFT"> + HUD esquerda inferior + </string> + <string name="ATTACH_HUD_BOTTOM"> + HUD inferior + </string> + <string name="ATTACH_HUD_BOTTOM_RIGHT"> + HUD direito inferior + </string> + <string name="ATTACH_NECK"> + Pescoço + </string> + <string name="ATTACH_AVATAR_CENTER"> + Centro do avatar + </string> + <string name="ATTACH_LHAND_RING1"> + Anelar esquerdo + </string> + <string name="ATTACH_RHAND_RING1"> + Anelar direito + </string> + <string name="ATTACH_TAIL_BASE"> + Base do rabo + </string> + <string name="ATTACH_TAIL_TIP"> + Ponta do rabo + </string> + <string name="ATTACH_LWING"> + Asa esquerda + </string> + <string name="ATTACH_RWING"> + Asa direita + </string> + <string name="ATTACH_FACE_JAW"> + Maxilar + </string> + <string name="ATTACH_FACE_LEAR"> + Orelha esquerda alt. + </string> + <string name="ATTACH_FACE_REAR"> + Orelha direita alt. + </string> + <string name="ATTACH_FACE_LEYE"> + Olho esquerdo alt. + </string> + <string name="ATTACH_FACE_REYE"> + Olho direito alt. + </string> + <string name="ATTACH_FACE_TONGUE"> + LÃngua + </string> + <string name="ATTACH_GROIN"> + Virilha + </string> + <string name="ATTACH_HIND_LFOOT"> + Pata esq. traseira + </string> + <string name="ATTACH_HIND_RFOOT"> + Pata dir. traseira + </string> + <string name="CursorPos"> + Linha [LINE], Coluna [COLUMN] + </string> + <string name="PanelDirCountFound"> + [COUNT] encontrado + </string> + <string name="PanelContentsTooltip"> + Conteúdo do objeto + </string> + <string name="PanelContentsNewScript"> + Novo Script + </string> + <string name="DoNotDisturbModeResponseDefault"> + Este residente ativou o "Não perturbe" e verá sua mensagem mais tarde. + </string> + <string name="MuteByName"> + (por nome) + </string> + <string name="MuteAgent"> + (residente) + </string> + <string name="MuteObject"> + (objeto) + </string> + <string name="MuteGroup"> + (grupo) + </string> + <string name="MuteExternal"> + (Externo) + </string> + <string name="RegionNoCovenant"> + Não foi definido um contrato para essa região. + </string> + <string name="RegionNoCovenantOtherOwner"> + Não foi definido um contrato para essa Região. O terreno nesta região está sendo vendido pelo Proprietário, não pela Linden Lab. Favor contatar o Proprietário da região para detalhes de venda. + </string> <string name="covenant_last_modified" value="Última modificação: "/> <string name="none_text" value="(nenhum)"/> <string name="never_text" value="(nunca)"/> - <string name="GroupOwned">Propriedade do Grupo</string> - <string name="Public">Público</string> - <string name="LocalSettings">Configurações locais</string> - <string name="RegionSettings">Configurações da região</string> - <string name="NoEnvironmentSettings">Esta Região não suporta as configurações do ambiente.</string> - <string name="EnvironmentSun">Dom</string> - <string name="EnvironmentMoon">Lua</string> - <string name="EnvironmentBloom">Florescer</string> - <string name="EnvironmentCloudNoise">RuÃdo na nuvem</string> - <string name="EnvironmentNormalMap">Mapa normal</string> - <string name="EnvironmentTransparent">Transparente</string> - <string name="ClassifiedClicksTxt">Cliques: [TELEPORT] teletransporte, [MAP] mapa, [PROFILE] perfil</string> - <string name="ClassifiedUpdateAfterPublish">(vai atualizar depois de publicado)</string> - <string name="NoPicksClassifiedsText">Você não criou nenhum Destaque ou Anúncio. Clique no botão "+" para criar um Destaque ou Anúncio.</string> - <string name="NoPicksText">Você não criou nenhuma Escolha. Clique em Novo Botão para criar um Escolher</string> - <string name="NoClassifiedsText">Você criou nenhum Anúncio. Clique em Novo Botão para criar um Classificado</string> - <string name="NoAvatarPicksClassifiedsText">O usuário não tem nenhum destaque ou anúncio</string> - <string name="NoAvatarPicksText">Usuário não tem escolha</string> - <string name="NoAvatarClassifiedsText">Usuário não tem anúncio</string> - <string name="PicksClassifiedsLoadingText">Carregando...</string> - <string name="MultiPreviewTitle">Preview</string> - <string name="MultiPropertiesTitle">Propriedades</string> - <string name="InvOfferAnObjectNamed">um objeto chamado</string> - <string name="InvOfferOwnedByGroup">possuÃdo pelo grupo</string> - <string name="InvOfferOwnedByUnknownGroup">de um grupo desconhecido</string> - <string name="InvOfferOwnedBy">de</string> - <string name="InvOfferOwnedByUnknownUser">de usuário desconhecido</string> - <string name="InvOfferGaveYou">deu a você</string> - <string name="InvOfferDecline">Você recusou um(a) [DESC] de <nolink>[NAME]</nolink>.</string> - <string name="GroupMoneyTotal">Total</string> - <string name="GroupMoneyBought">comprou</string> - <string name="GroupMoneyPaidYou">pagou a você</string> - <string name="GroupMoneyPaidInto">depositado</string> - <string name="GroupMoneyBoughtPassTo">comprou passe para</string> - <string name="GroupMoneyPaidFeeForEvent">pagou taxa para o evento</string> - <string name="GroupMoneyPaidPrizeForEvent">pagou prêmio para o evento</string> - <string name="GroupMoneyBalance">Saldo</string> - <string name="GroupMoneyCredits">Créditos</string> - <string name="GroupMoneyDebits">Débitos</string> - <string name="GroupMoneyDate">[weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]</string> - <string name="AcquiredItems">Itens adquiridos</string> - <string name="Cancel">Cancelar</string> - <string name="UploadingCosts">Carregar [NAME] custa L$ [AMOUNT]</string> - <string name="BuyingCosts">Isso custa L$ [AMOUNT]</string> - <string name="UnknownFileExtension">Extensão de arquivo desconhecida [.%s] -Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh</string> - <string name="MuteObject2">Bloquear</string> - <string name="AddLandmarkNavBarMenu">Adicionar marco...</string> - <string name="EditLandmarkNavBarMenu">Editar marco...</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">Shift+</string> - <string name="FileSaved">Arquivo salvo</string> - <string name="Receiving">Recebendo</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">Frente</string> - <string name="Direction_Left">Esquerda</string> - <string name="Direction_Right">Direita</string> - <string name="Direction_Back">Atrás</string> - <string name="Direction_North">Norte</string> - <string name="Direction_South">Sul</string> - <string name="Direction_West">Oeste</string> - <string name="Direction_East">Leste</string> - <string name="Direction_Up">P/ cima</string> - <string name="Direction_Down">P/ baixo</string> - <string name="Any Category">Qualquer categoria</string> - <string name="Shopping">Compras</string> - <string name="Land Rental">Aluguel de terrenos</string> - <string name="Property Rental">Aluguel de propriedade</string> - <string name="Special Attraction">Atração especial</string> - <string name="New Products">Novos Produtos</string> - <string name="Employment">Emprego</string> - <string name="Wanted">Desejado</string> - <string name="Service">Serviço</string> - <string name="Personal">Pessoal</string> - <string name="None">Nenhum</string> - <string name="Linden Location">Locação Linden</string> - <string name="Adult">Adulto</string> - <string name="Arts&Culture">Artes e Cultura</string> - <string name="Business">Negócios</string> - <string name="Educational">Educacional</string> - <string name="Gaming">Games</string> - <string name="Hangout">Moradia</string> - <string name="Newcomer Friendly">Para recém-chegados</string> - <string name="Parks&Nature">Parques & Natureza</string> - <string name="Residential">Residencial</string> - <string name="Stage">Estágio</string> - <string name="Other">Outros</string> - <string name="Rental">Aluguel</string> - <string name="Any">Qualquer</string> - <string name="You">Você</string> - <string name="Multiple Media">MÃdia múltipla</string> - <string name="Play Media">Tocar/Pausar mÃdia</string> - <string name="IntelDriverPage">http://www.intel.com/p/en_US/support/detect/graphics</string> - <string name="NvidiaDriverPage">http://www.nvidia.com.br/Download/index.aspx?lang=br</string> - <string name="AMDDriverPage">http://support.amd.com/us/Pages/AMDSupportHub.aspx</string> - <string name="MBCmdLineError">Um erro foi encontrado analisando a linha de comando. + <string name="GroupOwned"> + Propriedade do Grupo + </string> + <string name="Public"> + Público + </string> + <string name="LocalSettings"> + Configurações locais + </string> + <string name="RegionSettings"> + Configurações da região + </string> + <string name="NoEnvironmentSettings"> + Esta Região não suporta as configurações do ambiente. + </string> + <string name="EnvironmentSun"> + Dom + </string> + <string name="EnvironmentMoon"> + Lua + </string> + <string name="EnvironmentBloom"> + Florescer + </string> + <string name="EnvironmentCloudNoise"> + RuÃdo na nuvem + </string> + <string name="EnvironmentNormalMap"> + Mapa normal + </string> + <string name="EnvironmentTransparent"> + Transparente + </string> + <string name="ClassifiedClicksTxt"> + Cliques: [TELEPORT] teletransporte, [MAP] mapa, [PROFILE] perfil + </string> + <string name="ClassifiedUpdateAfterPublish"> + (vai atualizar depois de publicado) + </string> + <string name="NoPicksClassifiedsText"> + Você não criou nenhum Destaque ou Anúncio. Clique no botão "+" para criar um Destaque ou Anúncio. + </string> + <string name="NoPicksText"> + Você não criou nenhuma Escolha. Clique em Novo Botão para criar um Escolher + </string> + <string name="NoClassifiedsText"> + Você criou nenhum Anúncio. Clique em Novo Botão para criar um Classificado + </string> + <string name="NoAvatarPicksClassifiedsText"> + O usuário não tem nenhum destaque ou anúncio + </string> + <string name="NoAvatarPicksText"> + Usuário não tem escolha + </string> + <string name="NoAvatarClassifiedsText"> + Usuário não tem anúncio + </string> + <string name="PicksClassifiedsLoadingText"> + Carregando... + </string> + <string name="MultiPreviewTitle"> + Preview + </string> + <string name="MultiPropertiesTitle"> + Propriedades + </string> + <string name="InvOfferAnObjectNamed"> + um objeto chamado + </string> + <string name="InvOfferOwnedByGroup"> + possuÃdo pelo grupo + </string> + <string name="InvOfferOwnedByUnknownGroup"> + de um grupo desconhecido + </string> + <string name="InvOfferOwnedBy"> + de + </string> + <string name="InvOfferOwnedByUnknownUser"> + de usuário desconhecido + </string> + <string name="InvOfferGaveYou"> + deu a você + </string> + <string name="InvOfferDecline"> + Você recusou um(a) [DESC] de <nolink>[NAME]</nolink>. + </string> + <string name="GroupMoneyTotal"> + Total + </string> + <string name="GroupMoneyBought"> + comprou + </string> + <string name="GroupMoneyPaidYou"> + pagou a você + </string> + <string name="GroupMoneyPaidInto"> + depositado + </string> + <string name="GroupMoneyBoughtPassTo"> + comprou passe para + </string> + <string name="GroupMoneyPaidFeeForEvent"> + pagou taxa para o evento + </string> + <string name="GroupMoneyPaidPrizeForEvent"> + pagou prêmio para o evento + </string> + <string name="GroupMoneyBalance"> + Saldo + </string> + <string name="GroupMoneyCredits"> + Créditos + </string> + <string name="GroupMoneyDebits"> + Débitos + </string> + <string name="GroupMoneyDate"> + [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc] + </string> + <string name="AcquiredItems"> + Itens adquiridos + </string> + <string name="Cancel"> + Cancelar + </string> + <string name="UploadingCosts"> + Carregar [NAME] custa L$ [AMOUNT] + </string> + <string name="BuyingCosts"> + Isso custa L$ [AMOUNT] + </string> + <string name="UnknownFileExtension"> + Extensão de arquivo desconhecida [.%s] +Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh + </string> + <string name="MuteObject2"> + Bloquear + </string> + <string name="AddLandmarkNavBarMenu"> + Adicionar marco... + </string> + <string name="EditLandmarkNavBarMenu"> + Editar marco... + </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"> + Shift+ + </string> + <string name="FileSaved"> + Arquivo salvo + </string> + <string name="Receiving"> + Recebendo + </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"> + Frente + </string> + <string name="Direction_Left"> + Esquerda + </string> + <string name="Direction_Right"> + Direita + </string> + <string name="Direction_Back"> + Atrás + </string> + <string name="Direction_North"> + Norte + </string> + <string name="Direction_South"> + Sul + </string> + <string name="Direction_West"> + Oeste + </string> + <string name="Direction_East"> + Leste + </string> + <string name="Direction_Up"> + P/ cima + </string> + <string name="Direction_Down"> + P/ baixo + </string> + <string name="Any Category"> + Qualquer categoria + </string> + <string name="Shopping"> + Compras + </string> + <string name="Land Rental"> + Aluguel de terrenos + </string> + <string name="Property Rental"> + Aluguel de propriedade + </string> + <string name="Special Attraction"> + Atração especial + </string> + <string name="New Products"> + Novos Produtos + </string> + <string name="Employment"> + Emprego + </string> + <string name="Wanted"> + Desejado + </string> + <string name="Service"> + Serviço + </string> + <string name="Personal"> + Pessoal + </string> + <string name="None"> + Nenhum + </string> + <string name="Linden Location"> + Locação Linden + </string> + <string name="Adult"> + Adulto + </string> + <string name="Arts&Culture"> + Artes e Cultura + </string> + <string name="Business"> + Negócios + </string> + <string name="Educational"> + Educacional + </string> + <string name="Gaming"> + Games + </string> + <string name="Hangout"> + Moradia + </string> + <string name="Newcomer Friendly"> + Para recém-chegados + </string> + <string name="Parks&Nature"> + Parques & Natureza + </string> + <string name="Residential"> + Residencial + </string> + <string name="Stage"> + Estágio + </string> + <string name="Other"> + Outros + </string> + <string name="Rental"> + Aluguel + </string> + <string name="Any"> + Qualquer + </string> + <string name="You"> + Você + </string> + <string name="Multiple Media"> + MÃdia múltipla + </string> + <string name="Play Media"> + Tocar/Pausar mÃdia + </string> + <string name="IntelDriverPage"> + http://www.intel.com/p/en_US/support/detect/graphics + </string> + <string name="NvidiaDriverPage"> + http://www.nvidia.com.br/Download/index.aspx?lang=br + </string> + <string name="AMDDriverPage"> + http://support.amd.com/us/Pages/AMDSupportHub.aspx + </string> + <string name="MBCmdLineError"> + Um erro foi encontrado analisando a linha de comando. Consulte: http://wiki.secondlife.com/wiki/Client_parameters -Erro:</string> - <string name="MBCmdLineUsg">[APP_NAME] Uso de linha de comando:</string> - <string name="MBUnableToAccessFile">[APP_NAME] não é capaz de acessar um arquivo que ele precisa. +Erro: + </string> + <string name="MBCmdLineUsg"> + [APP_NAME] Uso de linha de comando: + </string> + <string name="MBUnableToAccessFile"> + [APP_NAME] não é capaz de acessar um arquivo que ele precisa. Isto pode ocorrer porque você de alguma maneira tem várias cópias em execução, ou o seu sistema acredita de maneira incorreta que um arquivo está aberto. Se a mensagem persistir, reinicie o computador e tente novamente. -Se o error persistir, pode ser necessário desinstalar completamente [APP_NAME] e reinstalá-lo.</string> - <string name="MBFatalError">Erro fatal</string> - <string name="MBRequiresAltiVec">[APP_NAME] exige processador com AltiVec (G4 ou superior).</string> - <string name="MBAlreadyRunning">[APP_NAME] já está em execução. +Se o error persistir, pode ser necessário desinstalar completamente [APP_NAME] e reinstalá-lo. + </string> + <string name="MBFatalError"> + Erro fatal + </string> + <string name="MBRequiresAltiVec"> + [APP_NAME] exige processador com AltiVec (G4 ou superior). + </string> + <string name="MBAlreadyRunning"> + [APP_NAME] já está em execução. Verifique a sua barra de tarefas para obter uma cópia do programa minimizado. -Se a mensagem persistir, reinicie o computador.</string> - <string name="MBFrozenCrashed">[APP_NAME] parece ter congelado ou falhado na execução anterior. Enviar relatório de falha?</string> - <string name="MBAlert">Alerta</string> - <string name="MBNoDirectX">[APP_NAME] é incapaz de detectar o DirectX 9.0b ou superior. +Se a mensagem persistir, reinicie o computador. + </string> + <string name="MBFrozenCrashed"> + [APP_NAME] parece ter congelado ou falhado na execução anterior. Enviar relatório de falha? + </string> + <string name="MBAlert"> + Alerta + </string> + <string name="MBNoDirectX"> + [APP_NAME] é incapaz de detectar o DirectX 9.0b ou superior. [APP_NAME] usa o DirectX para a detecção de hardware e / ou controladores desatualizados que podem causar problemas de estabilidade, desempenho ruim e falhas. Embora você possa executar [APP_NAME] sem ele, nós recomendamos fortemente que utilize o DirectX 9.0b. -Deseja continuar?</string> - <string name="MBWarning">Aviso</string> - <string name="MBNoAutoUpdate">Atualização automática ainda não está implementada para o Linux. -Faça o download da versão mais recente do www.secondlife.com.</string> - <string name="MBRegClassFailed">RegisterClass falhou</string> - <string name="MBError">Erro</string> - <string name="MBFullScreenErr">Incapaz de funcionar com tela cheia de [WIDTH] x [HEIGHT]. -Executando em janela.</string> - <string name="MBDestroyWinFailed">Erro de desligamento ao destruir janela (DestroyWindow() failed)</string> - <string name="MBShutdownErr">Erro de desligamento</string> - <string name="MBDevContextErr">Não é possÃvel fazer contexto do dispositivo GL</string> - <string name="MBPixelFmtErr">Não é possÃvel encontrar um formato de pixel adequado</string> - <string name="MBPixelFmtDescErr">Não é possÃvel encontrar descrição de formato de pixel</string> - <string name="MBTrueColorWindow">[APP_NAME] requer True Color (32-bit) para ser executado. -Por favor, vá para as configurações de vÃdeo do computador e defina o modo de cores para 32-bit.</string> - <string name="MBAlpha">[APP_NAME] é incapaz de executar porque ele não consegue obter um canal alpha de 8 bits. Geralmente isso ocorre devido a problemas de drivers da placa de vÃdeo. +Deseja continuar? + </string> + <string name="MBWarning"> + Aviso + </string> + <string name="MBNoAutoUpdate"> + Atualização automática ainda não está implementada para o Linux. +Faça o download da versão mais recente do www.secondlife.com. + </string> + <string name="MBRegClassFailed"> + RegisterClass falhou + </string> + <string name="MBError"> + Erro + </string> + <string name="MBFullScreenErr"> + Incapaz de funcionar com tela cheia de [WIDTH] x [HEIGHT]. +Executando em janela. + </string> + <string name="MBDestroyWinFailed"> + Erro de desligamento ao destruir janela (DestroyWindow() failed) + </string> + <string name="MBShutdownErr"> + Erro de desligamento + </string> + <string name="MBDevContextErr"> + Não é possÃvel fazer contexto do dispositivo GL + </string> + <string name="MBPixelFmtErr"> + Não é possÃvel encontrar um formato de pixel adequado + </string> + <string name="MBPixelFmtDescErr"> + Não é possÃvel encontrar descrição de formato de pixel + </string> + <string name="MBTrueColorWindow"> + [APP_NAME] requer True Color (32-bit) para ser executado. +Por favor, vá para as configurações de vÃdeo do computador e defina o modo de cores para 32-bit. + </string> + <string name="MBAlpha"> + [APP_NAME] é incapaz de executar porque ele não consegue obter um canal alpha de 8 bits. Geralmente isso ocorre devido a problemas de drivers da placa de vÃdeo. Por favor, certifique-se que os últimos drivers da placa de vÃdeo estão instalados. Também não se esqueça de definir seu monitor para True Color (32-bit), em painéis de controle Configurações> Display>. -Se você continuar a receber esta mensagem, contate o [SUPPORT_SITE].</string> - <string name="MBPixelFmtSetErr">Não é possÃvel definir o formato de pixel</string> - <string name="MBGLContextErr">Não é possÃvel criar o contexto de renderização GL</string> - <string name="MBGLContextActErr">Não é possÃvel ativar o contexto de renderização GL</string> - <string name="MBVideoDrvErr">[APP_NAME] é incapaz de funcionar por causa do seu driver de video não ter sido instalado corretamente, estão desatualizados, ou não são suportados pelo hardware. Por favor certifique-se que você possui os drivers de placa de vÃdeo mais recente e mesmo assim, tente reinstalá-los. +Se você continuar a receber esta mensagem, contate o [SUPPORT_SITE]. + </string> + <string name="MBPixelFmtSetErr"> + Não é possÃvel definir o formato de pixel + </string> + <string name="MBGLContextErr"> + Não é possÃvel criar o contexto de renderização GL + </string> + <string name="MBGLContextActErr"> + Não é possÃvel ativar o contexto de renderização GL + </string> + <string name="MBVideoDrvErr"> + [APP_NAME] é incapaz de funcionar por causa do seu driver de video não ter sido instalado corretamente, estão desatualizados, ou não são suportados pelo hardware. Por favor certifique-se que você possui os drivers de placa de vÃdeo mais recente e mesmo assim, tente reinstalá-los. -If you continue to receive this message, contact the [SUPPORT_SITE].</string> - <string name="5 O'Clock Shadow">Barba por fazer</string> - <string name="All White">Todo branco</string> - <string name="Anime Eyes">Olhos de Anime</string> - <string name="Arced">Arqueados</string> - <string name="Arm Length">Comprimento do braço</string> - <string name="Attached">Anexado</string> - <string name="Attached Earlobes">Lóbulos da orelha anexados</string> - <string name="Back Fringe">corte traseiro</string> - <string name="Baggy">folgado</string> - <string name="Bangs">Franja</string> - <string name="Beady Eyes">Olhos pequenos</string> - <string name="Belly Size">Tamanho da barriga</string> - <string name="Big">Grande</string> - <string name="Big Butt">Bunda grande</string> - <string name="Big Hair Back">Cabelo volumoso: Trás</string> - <string name="Big Hair Front">Cabelo volumoso: Frente</string> - <string name="Big Hair Top">Cabelo volumoso: Topo</string> - <string name="Big Head">cabeça grande</string> - <string name="Big Pectorals">Peitorais grandes</string> - <string name="Big Spikes">Pontas grandes</string> - <string name="Black">Negro</string> - <string name="Blonde">Loiro</string> - <string name="Blonde Hair">Cabelo loiro</string> - <string name="Blush">Blush</string> - <string name="Blush Color">Cor do blush</string> - <string name="Blush Opacity">Opacidade do blush</string> - <string name="Body Definition">Definição do corpo</string> - <string name="Body Fat">Gordura</string> - <string name="Body Freckles">Sardas</string> - <string name="Body Thick">Corpo cheio</string> - <string name="Body Thickness">Ossatura</string> - <string name="Body Thin">Corpo magro</string> - <string name="Bow Legged">Pernas arqueadas</string> - <string name="Breast Buoyancy">Caimento dos seios</string> - <string name="Breast Cleavage">Separação dos seios</string> - <string name="Breast Size">Tamanho dos seios</string> - <string name="Bridge Width">Largura do nariz</string> - <string name="Broad">Largo</string> - <string name="Brow Size">Tamanho da sobrancelha</string> - <string name="Bug Eyes">Olhos saltados</string> - <string name="Bugged Eyes">Olhos esbugalhados</string> - <string name="Bulbous">Bulbos</string> - <string name="Bulbous Nose">Nariz em bulbo</string> - <string name="Breast Physics Mass">Seios - massa</string> - <string name="Breast Physics Smoothing">Seios - suavização</string> - <string name="Breast Physics Gravity">Seios - gravidade</string> - <string name="Breast Physics Drag">Seios - resistência do ar</string> - <string name="Breast Physics InOut Max Effect">Efeito máximo</string> - <string name="Breast Physics InOut Spring">Vibração</string> - <string name="Breast Physics InOut Gain">Ganho</string> - <string name="Breast Physics InOut Damping">Duração</string> - <string name="Breast Physics UpDown Max Effect">Efeito máximo</string> - <string name="Breast Physics UpDown Spring">Vibração</string> - <string name="Breast Physics UpDown Gain">Ganho</string> - <string name="Breast Physics UpDown Damping">Duração</string> - <string name="Breast Physics LeftRight Max Effect">Efeito máximo</string> - <string name="Breast Physics LeftRight Spring">Vibração</string> - <string name="Breast Physics LeftRight Gain">Ganho</string> - <string name="Breast Physics LeftRight Damping">Duração</string> - <string name="Belly Physics Mass">Barriga - massa</string> - <string name="Belly Physics Smoothing">Barriga - suavização</string> - <string name="Belly Physics Gravity">Barriga - gravidade</string> - <string name="Belly Physics Drag">Barriga - resistência do ar</string> - <string name="Belly Physics UpDown Max Effect">Efeito máximo</string> - <string name="Belly Physics UpDown Spring">Vibração</string> - <string name="Belly Physics UpDown Gain">Ganho</string> - <string name="Belly Physics UpDown Damping">Duração</string> - <string name="Butt Physics Mass">Nádegas - massa</string> - <string name="Butt Physics Smoothing">Nádegas - suavização</string> - <string name="Butt Physics Gravity">Nádegas - gravidade</string> - <string name="Butt Physics Drag">Nádegas - resistência do ar</string> - <string name="Butt Physics UpDown Max Effect">Efeito máximo</string> - <string name="Butt Physics UpDown Spring">Vibração</string> - <string name="Butt Physics UpDown Gain">Ganho</string> - <string name="Butt Physics UpDown Damping">Duração</string> - <string name="Butt Physics LeftRight Max Effect">Efeito máximo</string> - <string name="Butt Physics LeftRight Spring">Vibração</string> - <string name="Butt Physics LeftRight Gain">Ganho</string> - <string name="Butt Physics LeftRight Damping">Duração</string> - <string name="Bushy Eyebrows">Sobrancelhas grossas</string> - <string name="Bushy Hair">Cabelo grosso</string> - <string name="Butt Size">Tamanho do traseiro</string> - <string name="Butt Gravity">Nádegas - gravidade</string> - <string name="bustle skirt">Saia armada</string> - <string name="no bustle">Saia reta</string> - <string name="more bustle">Mais</string> - <string name="Chaplin">Chaplin</string> - <string name="Cheek Bones">Maçãs do rosto</string> - <string name="Chest Size">Tamanho do peito</string> - <string name="Chin Angle">Ângulo do queixo</string> - <string name="Chin Cleft">Fissura do queixo</string> - <string name="Chin Curtains">Barba de contorno</string> - <string name="Chin Depth">Profundidade do queixo</string> - <string name="Chin Heavy">Queixo pronunciado</string> - <string name="Chin In">Queixo para dentro</string> - <string name="Chin Out">Queixo para fora</string> - <string name="Chin-Neck">Queixo-pescoço</string> - <string name="Clear">Limpar</string> - <string name="Cleft">Fenda</string> - <string name="Close Set Eyes">Fechar conjunto de olhos</string> - <string name="Closed">Fechado</string> - <string name="Closed Back">Trás fechada</string> - <string name="Closed Front">Frente fechada</string> - <string name="Closed Left">Esquerda fechada</string> - <string name="Closed Right">Direita fechada</string> - <string name="Coin Purse">Pouco volume</string> - <string name="Collar Back">Colarinho posterior</string> - <string name="Collar Front">Colarinho anterior</string> - <string name="Corner Down">Canto para baixo</string> - <string name="Corner Up">Canto para cima</string> - <string name="Creased">Vincado</string> - <string name="Crooked Nose">Nariz torto</string> - <string name="Cuff Flare">Bainha larga</string> - <string name="Dark">Escuro</string> - <string name="Dark Green">Verde escuro</string> - <string name="Darker">Mais escuro</string> - <string name="Deep">Profundidade</string> - <string name="Default Heels">Salto padrão</string> - <string name="Dense">Densidade</string> - <string name="Double Chin">Queixo duplo</string> - <string name="Downturned">Curvado para baixo</string> - <string name="Duffle Bag">Mais volume</string> - <string name="Ear Angle">Ângulo da orelha</string> - <string name="Ear Size">Tamanho da orelha</string> - <string name="Ear Tips">Pontas das orelhas</string> - <string name="Egg Head">Cabeça oval</string> - <string name="Eye Bags">Olheiras</string> - <string name="Eye Color">Cor dos olhos</string> - <string name="Eye Depth">Profundidade dos olhos</string> - <string name="Eye Lightness">Luminosidade dos olhos</string> - <string name="Eye Opening">Abertura dos olhos</string> - <string name="Eye Pop">Olho saltado</string> - <string name="Eye Size">Tamanho dos olhos</string> - <string name="Eye Spacing">Espaçamento dos olhos</string> - <string name="Eyebrow Arc">Arco da sobrancelha</string> - <string name="Eyebrow Density">Densidade da sobrancelha</string> - <string name="Eyebrow Height">Altura da sobrancelha</string> - <string name="Eyebrow Points">Pontas da sobrancelha</string> - <string name="Eyebrow Size">Tamanho da sobrancelha</string> - <string name="Eyelash Length">Comprimento das pestanas</string> - <string name="Eyeliner">Delineador</string> - <string name="Eyeliner Color">Cor do delineador</string> - <string name="Eyes Bugged">Olhos esbugalhados</string> - <string name="Face Shear">Face raspada</string> - <string name="Facial Definition">Definição facial</string> - <string name="Far Set Eyes">Distância entre os olhos</string> - <string name="Fat Lips">Lábios carnudos</string> - <string name="Female">Feminino</string> - <string name="Fingerless">Dedos</string> - <string name="Fingers">Dedos</string> - <string name="Flared Cuffs">Punhos largos</string> - <string name="Flat">Chato</string> - <string name="Flat Butt">Traseiro chato</string> - <string name="Flat Head">Cabeça chata</string> - <string name="Flat Toe">Dedos dos pés chatos</string> - <string name="Foot Size">Tamanho dos pés</string> - <string name="Forehead Angle">Ângulo da testa</string> - <string name="Forehead Heavy">Testa pronunciada</string> - <string name="Freckles">Sardas</string> - <string name="Front Fringe">Franja</string> - <string name="Full Back">Trás cheia</string> - <string name="Full Eyeliner">Delienador cheio</string> - <string name="Full Front">Frente cheia</string> - <string name="Full Hair Sides">Cabelos laterais cheios</string> - <string name="Full Sides">Lados cheios</string> - <string name="Glossy">Brilhante</string> - <string name="Glove Fingers">Dedos da luva</string> - <string name="Glove Length">Comprimento das luvas</string> - <string name="Hair">Cabelo</string> - <string name="Hair Back">Cabelo: Trás</string> - <string name="Hair Front">Cabelo: Frente</string> - <string name="Hair Sides">Cabelos: Lateral</string> - <string name="Hair Sweep">Cabelo penteado</string> - <string name="Hair Thickess">Espessura do cabelo</string> - <string name="Hair Thickness">Espessura do cabelo</string> - <string name="Hair Tilt">Divisão do cabelo</string> - <string name="Hair Tilted Left">Divistão do cabelo esquerda</string> - <string name="Hair Tilted Right">Divisão do cabelo direita</string> - <string name="Hair Volume">Cabelo: Volume</string> - <string name="Hand Size">Tamanho das mãos</string> - <string name="Handlebars">Bigode</string> - <string name="Head Length">Comprimento da cabeça</string> - <string name="Head Shape">Formato da cabeça</string> - <string name="Head Size">Tamanho da cabeça</string> - <string name="Head Stretch">Extensão da cabeça</string> - <string name="Heel Height">Altura do salto</string> - <string name="Heel Shape">Formato do salto</string> - <string name="Height">Altura</string> - <string name="High">Alto</string> - <string name="High Heels">Salto alto</string> - <string name="High Jaw">Maxilar alto</string> - <string name="High Platforms">Plataformas altas</string> - <string name="High and Tight">Alto e justo</string> - <string name="Higher">Mais alto</string> - <string name="Hip Length">Comprimento do quadril</string> - <string name="Hip Width">Largura do quadril</string> - <string name="Hover">Pairar</string> - <string name="In">Dentro</string> - <string name="In Shdw Color">Cor da sombra interna</string> - <string name="In Shdw Opacity">Opacidade da sombra interna</string> - <string name="Inner Eye Corner">Canto interno dos olhos</string> - <string name="Inner Eye Shadow">Sombra interna dos olhos</string> - <string name="Inner Shadow">Sombra interna</string> - <string name="Jacket Length">Comprimento da blusa</string> - <string name="Jacket Wrinkles">Dobras da jaqueta</string> - <string name="Jaw Angle">Ângulo da mandÃbula</string> - <string name="Jaw Jut">Posição do maxilar</string> - <string name="Jaw Shape">Formato do maxilar</string> - <string name="Join">Juntar</string> - <string name="Jowls">Papo</string> - <string name="Knee Angle">Ângulo do joelho</string> - <string name="Knock Kneed">Joelhos para dentro</string> - <string name="Large">Grande</string> - <string name="Large Hands">Mãos grandes</string> - <string name="Left Part">Parte esquerda</string> - <string name="Leg Length">Comprimento da perna</string> - <string name="Leg Muscles">Musculatura da perna</string> - <string name="Less">Menos</string> - <string name="Less Body Fat">Menos gordura</string> - <string name="Less Curtains">Menos barba</string> - <string name="Less Freckles">Menos sardas</string> - <string name="Less Full">Menos</string> - <string name="Less Gravity">Menos gravidade</string> - <string name="Less Love">Menos excesso</string> - <string name="Less Muscles">Menos músculos</string> - <string name="Less Muscular">Menos musculoso</string> - <string name="Less Rosy">Menos rosado</string> - <string name="Less Round">Menos arredondado</string> - <string name="Less Saddle">Menos ancas</string> - <string name="Less Square">Menos quadrado</string> - <string name="Less Volume">Menos volume</string> - <string name="Less soul">Menos alma</string> - <string name="Lighter">Lighter</string> - <string name="Lip Cleft">Fenda dos lábios</string> - <string name="Lip Cleft Depth">Profundidade da fenda dos lábios</string> - <string name="Lip Fullness">Volume dos lábios</string> - <string name="Lip Pinkness">Rosado dos lábios</string> - <string name="Lip Ratio">Proporção dos lábios</string> - <string name="Lip Thickness">Espessura dos lábios</string> - <string name="Lip Width">Largura dos lábios</string> - <string name="Lipgloss">Brilho dos lábios</string> - <string name="Lipstick">Batom</string> - <string name="Lipstick Color">Cor do batom</string> - <string name="Long">Longo</string> - <string name="Long Head">Cabeça alongada</string> - <string name="Long Hips">Lábios longos</string> - <string name="Long Legs">Pernas longas</string> - <string name="Long Neck">Pescoço longo</string> - <string name="Long Pigtails">Chiquinhas longas</string> - <string name="Long Ponytail">Rabo de cavalo longo</string> - <string name="Long Torso">Torso longo</string> - <string name="Long arms">Braços longos</string> - <string name="Loose Pants">Pantalonas</string> - <string name="Loose Shirt">Camisa folgada</string> - <string name="Loose Sleeves">Mangas folgadas</string> - <string name="Love Handles">Pneu</string> - <string name="Low">Baixo</string> - <string name="Low Heels">Salto baixo</string> - <string name="Low Jaw">Maxilar baixo</string> - <string name="Low Platforms">Plataformas baixas</string> - <string name="Low and Loose">Baixo e solto</string> - <string name="Lower">Mais baixo</string> - <string name="Lower Bridge">Mais baixa</string> - <string name="Lower Cheeks">Bochechas abaixadas</string> - <string name="Male">Masculino</string> - <string name="Middle Part">Parte do meio</string> - <string name="More">Mais</string> - <string name="More Blush">Mais blush</string> - <string name="More Body Fat">Mais gordura</string> - <string name="More Curtains">Mais barba</string> - <string name="More Eyeshadow">Mais sombra dos olhos</string> - <string name="More Freckles">Mais sardas</string> - <string name="More Full">Mais volume</string> - <string name="More Gravity">Mais gravidade</string> - <string name="More Lipstick">Mais batom</string> - <string name="More Love">Mais cintura</string> - <string name="More Lower Lip">Mais lábio inferior</string> - <string name="More Muscles">Mais músculos</string> - <string name="More Muscular">Mais musculoso</string> - <string name="More Rosy">Mais rosado</string> - <string name="More Round">Mais arredondado</string> - <string name="More Saddle">Mais ancas</string> - <string name="More Sloped">Mais inclinado</string> - <string name="More Square">Mais quadrado</string> - <string name="More Upper Lip">Mais lábios superiores</string> - <string name="More Vertical">Mais vertical</string> - <string name="More Volume">Mais volume</string> - <string name="More soul">Mais alma</string> - <string name="Moustache">Bigode</string> - <string name="Mouth Corner">Canto da boca</string> - <string name="Mouth Position">Posição da boca</string> - <string name="Mowhawk">Moicano</string> - <string name="Muscular">Muscular</string> - <string name="Mutton Chops">Costeletas</string> - <string name="Nail Polish">Esmate das unhas</string> - <string name="Nail Polish Color">Cor do esmalte das unhas</string> - <string name="Narrow">Estreito</string> - <string name="Narrow Back">Costas estreitas</string> - <string name="Narrow Front">Frente estreita</string> - <string name="Narrow Lips">Lábios estreitos</string> - <string name="Natural">Natural</string> - <string name="Neck Length">Comprimento do pescoço</string> - <string name="Neck Thickness">Espessura do pescoço</string> - <string name="No Blush">Sem blush</string> - <string name="No Eyeliner">Sem delineador</string> - <string name="No Eyeshadow">Sem sombra</string> - <string name="No Lipgloss">Sem brilho</string> - <string name="No Lipstick">Sem batom</string> - <string name="No Part">Sem parte</string> - <string name="No Polish">Sem esmalte</string> - <string name="No Red">Sem vermelho</string> - <string name="No Spikes">Sem pontas</string> - <string name="No White">Sem branco</string> - <string name="No Wrinkles">Sem dobras</string> - <string name="Normal Lower">Normal inferior</string> - <string name="Normal Upper">Normal superior</string> - <string name="Nose Left">Nariz para esquerda</string> - <string name="Nose Right">Nariz para direita</string> - <string name="Nose Size">Tamanho do nariz</string> - <string name="Nose Thickness">Espessura do nariz</string> - <string name="Nose Tip Angle">Ângulo da ponta do nariz</string> - <string name="Nose Tip Shape">Formato da ponta do nariz</string> - <string name="Nose Width">Largura do nariz</string> - <string name="Nostril Division">Divisão das narinas</string> - <string name="Nostril Width">Largura das narinas</string> - <string name="Opaque">Opaco</string> - <string name="Open">Abrir</string> - <string name="Open Back">Aberto atrás</string> - <string name="Open Front">Aberto na frente</string> - <string name="Open Left">Aberto esquerdo</string> - <string name="Open Right">Aberto direito</string> - <string name="Orange">Laranja</string> - <string name="Out">Fora</string> - <string name="Out Shdw Color">Cor da sombra externa</string> - <string name="Out Shdw Opacity">Opacidade da sombra externa</string> - <string name="Outer Eye Corner">Canto externo do olho</string> - <string name="Outer Eye Shadow">Sombra externa do olho</string> - <string name="Outer Shadow">Sombra externa</string> - <string name="Overbite">Má oclusão</string> - <string name="Package">Púbis</string> - <string name="Painted Nails">Unhas pintadas</string> - <string name="Pale">Pálido</string> - <string name="Pants Crotch">Cavalo da calça</string> - <string name="Pants Fit">Caimento das calças</string> - <string name="Pants Length">Comprimento das calças</string> - <string name="Pants Waist">Cintura da calça</string> - <string name="Pants Wrinkles">Dobras das calças</string> - <string name="Part">Parte</string> - <string name="Part Bangs">Divisão da franja</string> - <string name="Pectorals">Peitorais</string> - <string name="Pigment">Pigmento</string> - <string name="Pigtails">Chiquinhas</string> - <string name="Pink">Rosa</string> - <string name="Pinker">Mais rosado</string> - <string name="Platform Height">Altura da plataforma</string> - <string name="Platform Width">Largura da plataforma</string> - <string name="Pointy">Pontudo</string> - <string name="Pointy Heels">Salto agulha</string> - <string name="Ponytail">Rabo de cavalo</string> - <string name="Poofy Skirt">Saia bufante</string> - <string name="Pop Left Eye">Olho saltado esquerdo</string> - <string name="Pop Right Eye">Olho saltado direito</string> - <string name="Puffy">Inchado</string> - <string name="Puffy Eyelids">Pálpebras inchadas</string> - <string name="Rainbow Color">Cor do arco Ãris</string> - <string name="Red Hair">Cabelo ruivo</string> - <string name="Regular">Normal</string> - <string name="Right Part">Parte direita</string> - <string name="Rosy Complexion">Rosado da face</string> - <string name="Round">Arredondado</string> - <string name="Ruddiness">Rubor</string> - <string name="Ruddy">Corado</string> - <string name="Rumpled Hair">Cabelo desalinhado</string> - <string name="Saddle Bags">Culote</string> - <string name="Scrawny Leg">Pernas magricelas</string> - <string name="Separate">Separar</string> - <string name="Shallow">Raso</string> - <string name="Shear Back">Trás rente</string> - <string name="Shear Face">Face raspada</string> - <string name="Shear Front">Frente rente</string> - <string name="Shear Left Up">Esquerda rente para cima</string> - <string name="Shear Right Up">Trás rente para cima</string> - <string name="Sheared Back">Rente atrás</string> - <string name="Sheared Front">Rente frente</string> - <string name="Shift Left">Deslocar p/ esquerda</string> - <string name="Shift Mouth">Deslocar boca</string> - <string name="Shift Right">Deslocar p/ direita</string> - <string name="Shirt Bottom">Barra da camisa</string> - <string name="Shirt Fit">Ajuste da camisa</string> - <string name="Shirt Wrinkles">+/- amassada</string> - <string name="Shoe Height">Altura do sapato</string> - <string name="Short">Curto</string> - <string name="Short Arms">Braços curtos</string> - <string name="Short Legs">Pernas curtas</string> - <string name="Short Neck">Pescoço curto</string> - <string name="Short Pigtails">Chiquinhas curtas</string> - <string name="Short Ponytail">Rabo de cavalo curto</string> - <string name="Short Sideburns">Costeletas curtas</string> - <string name="Short Torso">Tronco curto</string> - <string name="Short hips">Quadril curto</string> - <string name="Shoulders">Ombros</string> - <string name="Side Fringe">pontas laterais</string> - <string name="Sideburns">Costeletas</string> - <string name="Sides Hair">Cabelo lateral</string> - <string name="Sides Hair Down">Cabelo lateral long</string> - <string name="Sides Hair Up">Cabelo lateral superior</string> - <string name="Skinny Neck">Pescoço fino</string> - <string name="Skirt Fit">Ajuste de saia</string> - <string name="Skirt Length">Comprimento da saia</string> - <string name="Slanted Forehead">Testa inclinada</string> - <string name="Sleeve Length">Comprimento da manga</string> - <string name="Sleeve Looseness">Folga da manga</string> - <string name="Slit Back">Abertura : Atrás</string> - <string name="Slit Front">Abertura: Frente</string> - <string name="Slit Left">Abertura: Esquerda</string> - <string name="Slit Right">Abertura: Direita</string> - <string name="Small">Pequeno</string> - <string name="Small Hands">Mãos pequenas</string> - <string name="Small Head">Cabeça pequena</string> - <string name="Smooth">Suavizar</string> - <string name="Smooth Hair">Suavizar cabelo</string> - <string name="Socks Length">Comprimento das meias</string> - <string name="Soulpatch">Cavanhaque</string> - <string name="Sparse">Disperso</string> - <string name="Spiked Hair">Cabelo espetado</string> - <string name="Square">Quadrado</string> - <string name="Square Toe">Dedo quadrado</string> - <string name="Squash Head">Cabeça de Pera</string> - <string name="Stretch Head">Cabeça esticada</string> - <string name="Sunken">Afundar</string> - <string name="Sunken Chest">Peito afundado</string> - <string name="Sunken Eyes">Olhos afundados</string> - <string name="Sweep Back">Pentear para trás</string> - <string name="Sweep Forward">Pentear para frente</string> - <string name="Tall">Alto</string> - <string name="Taper Back">Afinar atrás</string> - <string name="Taper Front">Afinar a frente</string> - <string name="Thick Heels">Salto grosso</string> - <string name="Thick Neck">Pescoço grosso</string> - <string name="Thick Toe">Dedo grosso</string> - <string name="Thin">Fino</string> - <string name="Thin Eyebrows">Sobrancelhas finas</string> - <string name="Thin Lips">Lábios finos</string> - <string name="Thin Nose">Nariz fino</string> - <string name="Tight Chin">Queixo apertado</string> - <string name="Tight Cuffs">Punho justo</string> - <string name="Tight Pants">Calça justa</string> - <string name="Tight Shirt">Camisa justa</string> - <string name="Tight Skirt">Saia justa</string> - <string name="Tight Sleeves">Tight Sleeves</string> - <string name="Toe Shape">Formato dos dedos</string> - <string name="Toe Thickness">Espessura dos dos dedos</string> - <string name="Torso Length">Comprimento do tronco</string> - <string name="Torso Muscles">Músculos do tronco</string> - <string name="Torso Scrawny">Tronco magricela</string> - <string name="Unattached">Desanexado</string> - <string name="Uncreased">Uncreased</string> - <string name="Underbite">Underbite</string> - <string name="Unnatural">Não natural</string> - <string name="Upper Bridge">Parte alta do nariz</string> - <string name="Upper Cheeks">Bochechas altas</string> - <string name="Upper Chin Cleft">fenda do queixo alta</string> - <string name="Upper Eyelid Fold">Curvatura dos cÃlios supériores</string> - <string name="Upturned">Voltado para cima</string> - <string name="Very Red">Bem vermelho</string> - <string name="Waist Height">Altura da cintura</string> - <string name="Well-Fed">Corpulento</string> - <string name="White Hair">Grisalho</string> - <string name="Wide">Amplo</string> - <string name="Wide Back">Costas largas</string> - <string name="Wide Front">Testa larga</string> - <string name="Wide Lips">Lábios amplos</string> - <string name="Wild">Selvagem</string> - <string name="Wrinkles">Rugas</string> - <string name="LocationCtrlAddLandmarkTooltip">Adicionar à s minhas Landmarks</string> - <string name="LocationCtrlEditLandmarkTooltip">Editar minhas Landmarks</string> - <string name="LocationCtrlInfoBtnTooltip">Ver mais informações sobre a localização atual</string> - <string name="LocationCtrlComboBtnTooltip">Histórico de localizações</string> - <string name="LocationCtrlAdultIconTooltip">Região Adulta</string> - <string name="LocationCtrlModerateIconTooltip">Região Moderada</string> - <string name="LocationCtrlGeneralIconTooltip">Região em geral</string> - <string name="LocationCtrlSeeAVsTooltip">Os avatares neste lote não podem ser vistos ou ouvidos por avatares fora dele</string> - <string name="LocationCtrlPathfindingDirtyTooltip">Os objetos que se movem podem não se comportar corretamente nesta região até que ela seja recarregada.</string> - <string name="LocationCtrlPathfindingDisabledTooltip">O pathfinding dinâmico não está habilitado nesta região.</string> - <string name="UpdaterWindowTitle">[APP_NAME] Atualização</string> - <string name="UpdaterNowUpdating">Atualizando agora o [APP_NAME]...</string> - <string name="UpdaterNowInstalling">Instalando [APP_NAME]...</string> - <string name="UpdaterUpdatingDescriptive">Seu visualizador [APP_NAME] está sendo atualizado para a versão mais recente. Isso pode levar algum tempo, então por favor seja paciente.</string> - <string name="UpdaterProgressBarTextWithEllipses">Fazendo o download da atualização...</string> - <string name="UpdaterProgressBarText">Fazendo o download da atualização</string> - <string name="UpdaterFailDownloadTitle">Falha no download da atualização</string> - <string name="UpdaterFailUpdateDescriptive">Um erro ocorreu ao atualizar [APP_NAME]. Por favor, faça o download da versão mais recente em www.secondlife.com.</string> - <string name="UpdaterFailInstallTitle">Falha ao instalar a atualização</string> - <string name="UpdaterFailStartTitle">Falha ao iniciar o visualizador</string> - <string name="ItemsComingInTooFastFrom">[APP_NAME]: Entrada de itens rápida demais de [FROM_NAME], visualização automática suspensa por [TIME] segundos</string> - <string name="ItemsComingInTooFast">[APP_NAME]: Entrada de itens rápida demais, visualização automática suspensa por [TIME] segundos</string> - <string name="IM_logging_string">-- Log de mensagem instantânea habilitado --</string> - <string name="IM_typing_start_string">[NAME] está digitando...</string> - <string name="Unnamed">(Anônimo)</string> - <string name="IM_moderated_chat_label">(Moderado: Voz desativado por padrão)</string> - <string name="IM_unavailable_text_label">Bate-papo de texto não está disponÃvel para esta chamada.</string> - <string name="IM_muted_text_label">Seu bate- papo de texto foi desabilitado por um Moderador do Grupo.</string> - <string name="IM_default_text_label">Clique aqui para menagem instantânea.</string> - <string name="IM_to_label">Para</string> - <string name="IM_moderator_label">(Moderador)</string> - <string name="Saved_message">(Salvo em [LONG_TIMESTAMP])</string> - <string name="IM_unblock_only_groups_friends">Para visualizar esta mensagem, você deve desmarcar "Apenas amigos e grupos podem me ligar ou enviar MIs" em Preferências/Privacidade.</string> - <string name="OnlineStatus">Conectado</string> - <string name="OfflineStatus">Desconectado</string> - <string name="not_online_msg">O usuário não está online. As mensagens serão armazenadas e enviadas mais tarde.</string> - <string name="not_online_inventory">O usuário não está online. O inventário foi salvo.</string> - <string name="answered_call">Ligação atendida</string> - <string name="you_started_call">Você iniciou uma ligação de voz</string> - <string name="you_joined_call">Você entrou na ligação</string> - <string name="you_auto_rejected_call-im">Você recusou automaticamente a chamada de voz enquanto "Não perturbe" estava ativado.</string> - <string name="name_started_call">[NAME] iniciou uma ligação de voz</string> - <string name="ringing-im">Entrando em ligação de voz...</string> - <string name="connected-im">Conectado. Para sair, clique em Desligar</string> - <string name="hang_up-im">Saiu da ligação de voz</string> - <string name="conference-title">Bate-papo com várias pessoas</string> - <string name="conference-title-incoming">Conversa com [AGENT_NAME]</string> - <string name="inventory_item_offered-im">Item do inventário '[ITEM_NAME]' oferecido</string> - <string name="inventory_folder_offered-im">Pasta do inventário '[ITEM_NAME]' oferecida</string> - <string name="facebook_post_success">Você publicou no Facebook.</string> - <string name="flickr_post_success">Você publicou no Flickr.</string> - <string name="twitter_post_success">Você publicou no Twitter.</string> - <string name="no_session_message">(Sessão de MI inexistente)</string> - <string name="only_user_message">Você é o único usuário desta sessão.</string> - <string name="offline_message">[NAME] está offline.</string> - <string name="invite_message">Clique no botão [BUTTON NAME] para aceitar/ conectar a este bate-papo em voz.</string> - <string name="muted_message">Você bloqueou este residente. Se quiser retirar o bloqueio, basta enviar uma mensagem.</string> - <string name="generic">Erro de solicitação, tente novamente mais tarde.</string> - <string name="generic_request_error">Erro na requisição, por favor, tente novamente.</string> - <string name="insufficient_perms_error">Você não tem permissões suficientes.</string> - <string name="session_does_not_exist_error">A sessão deixou de existir</string> - <string name="no_ability_error">Você não possui esta habilidade.</string> - <string name="no_ability">Você não possui esta habilidade.</string> - <string name="not_a_mod_error">Você não é um moderador de sessão.</string> - <string name="muted">Bate-papo de texto desativado por um moderador.</string> - <string name="muted_error">Um moderador do grupo desabilitou seu bate-papo em texto.</string> - <string name="add_session_event">Não foi possÃvel adicionar usuários na sessão de bate-papo com [RECIPIENT].</string> - <string name="message">Não foi possÃvel enviar sua mensagem para o bate-papo com [RECIPIENT].</string> - <string name="message_session_event">Não foi possÃvel enviar sua mensagem na sessão de bate- papo com [RECIPIENT].</string> - <string name="mute">Erro durante a moderação.</string> - <string name="removed">Você foi tirado do grupo.</string> - <string name="removed_from_group">Você foi removido do grupo.</string> - <string name="close_on_no_ability">Você não possui mais a habilidade de estar na sessão de bate-papo.</string> - <string name="unread_chat_single">[SOURCES] disse alguma coisa</string> - <string name="unread_chat_multiple">[SOURCES] disseram alguma coisa</string> - <string name="session_initialization_timed_out_error">A inicialização da sessão expirou</string> - <string name="Home position set.">Posição inicial definida.</string> - <string name="voice_morphing_url">https://secondlife.com/destination/voice-island</string> - <string name="premium_voice_morphing_url">https://secondlife.com/destination/voice-morphing-premium</string> - <string name="paid_you_ldollars">[NAME] lhe pagou L$ [AMOUNT] [REASON].</string> - <string name="paid_you_ldollars_gift">[NAME] lhe pagou L$ [AMOUNT]: [REASON]</string> - <string name="paid_you_ldollars_no_reason">[NAME] lhe pagou L$ [AMOUNT]</string> - <string name="you_paid_ldollars">Você pagou L$[AMOUNT] por [REASON] a [NAME].</string> - <string name="you_paid_ldollars_gift">Você pagou L$[AMOUNT] a [NAME]: [REASON]</string> - <string name="you_paid_ldollars_no_info">Você acaba de pagar L$[AMOUNT].</string> - <string name="you_paid_ldollars_no_reason">Você pagou L$[AMOUNT] a [NAME].</string> - <string name="you_paid_ldollars_no_name">Você pagou L$[AMOUNT] por [REASON].</string> - <string name="you_paid_failure_ldollars">Você não pagou L$[AMOUNT] a [NAME] referentes a [REASON].</string> - <string name="you_paid_failure_ldollars_gift">Você não pagou L$[AMOUNT] a [NAME]: [REASON]</string> - <string name="you_paid_failure_ldollars_no_info">Você não pagou L$[AMOUNT].</string> - <string name="you_paid_failure_ldollars_no_reason">Você não pagou L$[AMOUNT] a [NAME].</string> - <string name="you_paid_failure_ldollars_no_name">Você não pagou L$[AMOUNT] referentes a [REASON].</string> - <string name="for item">por [ITEM]</string> - <string name="for a parcel of land">por uma parcela</string> - <string name="for a land access pass">por um passe de acesso</string> - <string name="for deeding land">para doar um terreno</string> - <string name="to create a group">para criar um grupo</string> - <string name="to join a group">para entrar em um grupo</string> - <string name="to upload">para carregar</string> - <string name="to publish a classified ad">para publicar um anúncio</string> - <string name="giving">Dando L$ [AMOUNT]</string> - <string name="uploading_costs">O upload custa L$ [AMOUNT]</string> - <string name="this_costs">Isso custa L$ [AMOUNT]</string> - <string name="buying_selected_land">Comprando terreno selecionado L$ [AMOUNT]</string> - <string name="this_object_costs">Esse objeto custa L$ [AMOUNT]</string> - <string name="group_role_everyone">Todos</string> - <string name="group_role_officers">Oficiais</string> - <string name="group_role_owners">Proprietários</string> - <string name="group_member_status_online">Conectado</string> - <string name="uploading_abuse_report">Carregando... +If you continue to receive this message, contact the [SUPPORT_SITE]. + </string> + <string name="5 O'Clock Shadow"> + Barba por fazer + </string> + <string name="All White"> + Todo branco + </string> + <string name="Anime Eyes"> + Olhos de Anime + </string> + <string name="Arced"> + Arqueados + </string> + <string name="Arm Length"> + Comprimento do braço + </string> + <string name="Attached"> + Anexado + </string> + <string name="Attached Earlobes"> + Lóbulos da orelha anexados + </string> + <string name="Back Fringe"> + corte traseiro + </string> + <string name="Baggy"> + folgado + </string> + <string name="Bangs"> + Franja + </string> + <string name="Beady Eyes"> + Olhos pequenos + </string> + <string name="Belly Size"> + Tamanho da barriga + </string> + <string name="Big"> + Grande + </string> + <string name="Big Butt"> + Bunda grande + </string> + <string name="Big Hair Back"> + Cabelo volumoso: Trás + </string> + <string name="Big Hair Front"> + Cabelo volumoso: Frente + </string> + <string name="Big Hair Top"> + Cabelo volumoso: Topo + </string> + <string name="Big Head"> + cabeça grande + </string> + <string name="Big Pectorals"> + Peitorais grandes + </string> + <string name="Big Spikes"> + Pontas grandes + </string> + <string name="Black"> + Negro + </string> + <string name="Blonde"> + Loiro + </string> + <string name="Blonde Hair"> + Cabelo loiro + </string> + <string name="Blush"> + Blush + </string> + <string name="Blush Color"> + Cor do blush + </string> + <string name="Blush Opacity"> + Opacidade do blush + </string> + <string name="Body Definition"> + Definição do corpo + </string> + <string name="Body Fat"> + Gordura + </string> + <string name="Body Freckles"> + Sardas + </string> + <string name="Body Thick"> + Corpo cheio + </string> + <string name="Body Thickness"> + Ossatura + </string> + <string name="Body Thin"> + Corpo magro + </string> + <string name="Bow Legged"> + Pernas arqueadas + </string> + <string name="Breast Buoyancy"> + Caimento dos seios + </string> + <string name="Breast Cleavage"> + Separação dos seios + </string> + <string name="Breast Size"> + Tamanho dos seios + </string> + <string name="Bridge Width"> + Largura do nariz + </string> + <string name="Broad"> + Largo + </string> + <string name="Brow Size"> + Tamanho da sobrancelha + </string> + <string name="Bug Eyes"> + Olhos saltados + </string> + <string name="Bugged Eyes"> + Olhos esbugalhados + </string> + <string name="Bulbous"> + Bulbos + </string> + <string name="Bulbous Nose"> + Nariz em bulbo + </string> + <string name="Breast Physics Mass"> + Seios - massa + </string> + <string name="Breast Physics Smoothing"> + Seios - suavização + </string> + <string name="Breast Physics Gravity"> + Seios - gravidade + </string> + <string name="Breast Physics Drag"> + Seios - resistência do ar + </string> + <string name="Breast Physics InOut Max Effect"> + Efeito máximo + </string> + <string name="Breast Physics InOut Spring"> + Vibração + </string> + <string name="Breast Physics InOut Gain"> + Ganho + </string> + <string name="Breast Physics InOut Damping"> + Duração + </string> + <string name="Breast Physics UpDown Max Effect"> + Efeito máximo + </string> + <string name="Breast Physics UpDown Spring"> + Vibração + </string> + <string name="Breast Physics UpDown Gain"> + Ganho + </string> + <string name="Breast Physics UpDown Damping"> + Duração + </string> + <string name="Breast Physics LeftRight Max Effect"> + Efeito máximo + </string> + <string name="Breast Physics LeftRight Spring"> + Vibração + </string> + <string name="Breast Physics LeftRight Gain"> + Ganho + </string> + <string name="Breast Physics LeftRight Damping"> + Duração + </string> + <string name="Belly Physics Mass"> + Barriga - massa + </string> + <string name="Belly Physics Smoothing"> + Barriga - suavização + </string> + <string name="Belly Physics Gravity"> + Barriga - gravidade + </string> + <string name="Belly Physics Drag"> + Barriga - resistência do ar + </string> + <string name="Belly Physics UpDown Max Effect"> + Efeito máximo + </string> + <string name="Belly Physics UpDown Spring"> + Vibração + </string> + <string name="Belly Physics UpDown Gain"> + Ganho + </string> + <string name="Belly Physics UpDown Damping"> + Duração + </string> + <string name="Butt Physics Mass"> + Nádegas - massa + </string> + <string name="Butt Physics Smoothing"> + Nádegas - suavização + </string> + <string name="Butt Physics Gravity"> + Nádegas - gravidade + </string> + <string name="Butt Physics Drag"> + Nádegas - resistência do ar + </string> + <string name="Butt Physics UpDown Max Effect"> + Efeito máximo + </string> + <string name="Butt Physics UpDown Spring"> + Vibração + </string> + <string name="Butt Physics UpDown Gain"> + Ganho + </string> + <string name="Butt Physics UpDown Damping"> + Duração + </string> + <string name="Butt Physics LeftRight Max Effect"> + Efeito máximo + </string> + <string name="Butt Physics LeftRight Spring"> + Vibração + </string> + <string name="Butt Physics LeftRight Gain"> + Ganho + </string> + <string name="Butt Physics LeftRight Damping"> + Duração + </string> + <string name="Bushy Eyebrows"> + Sobrancelhas grossas + </string> + <string name="Bushy Hair"> + Cabelo grosso + </string> + <string name="Butt Size"> + Tamanho do traseiro + </string> + <string name="Butt Gravity"> + Nádegas - gravidade + </string> + <string name="bustle skirt"> + Saia armada + </string> + <string name="no bustle"> + Saia reta + </string> + <string name="more bustle"> + Mais + </string> + <string name="Chaplin"> + Chaplin + </string> + <string name="Cheek Bones"> + Maçãs do rosto + </string> + <string name="Chest Size"> + Tamanho do peito + </string> + <string name="Chin Angle"> + Ângulo do queixo + </string> + <string name="Chin Cleft"> + Fissura do queixo + </string> + <string name="Chin Curtains"> + Barba de contorno + </string> + <string name="Chin Depth"> + Profundidade do queixo + </string> + <string name="Chin Heavy"> + Queixo pronunciado + </string> + <string name="Chin In"> + Queixo para dentro + </string> + <string name="Chin Out"> + Queixo para fora + </string> + <string name="Chin-Neck"> + Queixo-pescoço + </string> + <string name="Clear"> + Limpar + </string> + <string name="Cleft"> + Fenda + </string> + <string name="Close Set Eyes"> + Fechar conjunto de olhos + </string> + <string name="Closed"> + Fechado + </string> + <string name="Closed Back"> + Trás fechada + </string> + <string name="Closed Front"> + Frente fechada + </string> + <string name="Closed Left"> + Esquerda fechada + </string> + <string name="Closed Right"> + Direita fechada + </string> + <string name="Coin Purse"> + Pouco volume + </string> + <string name="Collar Back"> + Colarinho posterior + </string> + <string name="Collar Front"> + Colarinho anterior + </string> + <string name="Corner Down"> + Canto para baixo + </string> + <string name="Corner Up"> + Canto para cima + </string> + <string name="Creased"> + Vincado + </string> + <string name="Crooked Nose"> + Nariz torto + </string> + <string name="Cuff Flare"> + Bainha larga + </string> + <string name="Dark"> + Escuro + </string> + <string name="Dark Green"> + Verde escuro + </string> + <string name="Darker"> + Mais escuro + </string> + <string name="Deep"> + Profundidade + </string> + <string name="Default Heels"> + Salto padrão + </string> + <string name="Dense"> + Densidade + </string> + <string name="Double Chin"> + Queixo duplo + </string> + <string name="Downturned"> + Curvado para baixo + </string> + <string name="Duffle Bag"> + Mais volume + </string> + <string name="Ear Angle"> + Ângulo da orelha + </string> + <string name="Ear Size"> + Tamanho da orelha + </string> + <string name="Ear Tips"> + Pontas das orelhas + </string> + <string name="Egg Head"> + Cabeça oval + </string> + <string name="Eye Bags"> + Olheiras + </string> + <string name="Eye Color"> + Cor dos olhos + </string> + <string name="Eye Depth"> + Profundidade dos olhos + </string> + <string name="Eye Lightness"> + Luminosidade dos olhos + </string> + <string name="Eye Opening"> + Abertura dos olhos + </string> + <string name="Eye Pop"> + Olho saltado + </string> + <string name="Eye Size"> + Tamanho dos olhos + </string> + <string name="Eye Spacing"> + Espaçamento dos olhos + </string> + <string name="Eyebrow Arc"> + Arco da sobrancelha + </string> + <string name="Eyebrow Density"> + Densidade da sobrancelha + </string> + <string name="Eyebrow Height"> + Altura da sobrancelha + </string> + <string name="Eyebrow Points"> + Pontas da sobrancelha + </string> + <string name="Eyebrow Size"> + Tamanho da sobrancelha + </string> + <string name="Eyelash Length"> + Comprimento das pestanas + </string> + <string name="Eyeliner"> + Delineador + </string> + <string name="Eyeliner Color"> + Cor do delineador + </string> + <string name="Eyes Bugged"> + Olhos esbugalhados + </string> + <string name="Face Shear"> + Face raspada + </string> + <string name="Facial Definition"> + Definição facial + </string> + <string name="Far Set Eyes"> + Distância entre os olhos + </string> + <string name="Fat Lips"> + Lábios carnudos + </string> + <string name="Female"> + Feminino + </string> + <string name="Fingerless"> + Dedos + </string> + <string name="Fingers"> + Dedos + </string> + <string name="Flared Cuffs"> + Punhos largos + </string> + <string name="Flat"> + Chato + </string> + <string name="Flat Butt"> + Traseiro chato + </string> + <string name="Flat Head"> + Cabeça chata + </string> + <string name="Flat Toe"> + Dedos dos pés chatos + </string> + <string name="Foot Size"> + Tamanho dos pés + </string> + <string name="Forehead Angle"> + Ângulo da testa + </string> + <string name="Forehead Heavy"> + Testa pronunciada + </string> + <string name="Freckles"> + Sardas + </string> + <string name="Front Fringe"> + Franja + </string> + <string name="Full Back"> + Trás cheia + </string> + <string name="Full Eyeliner"> + Delienador cheio + </string> + <string name="Full Front"> + Frente cheia + </string> + <string name="Full Hair Sides"> + Cabelos laterais cheios + </string> + <string name="Full Sides"> + Lados cheios + </string> + <string name="Glossy"> + Brilhante + </string> + <string name="Glove Fingers"> + Dedos da luva + </string> + <string name="Glove Length"> + Comprimento das luvas + </string> + <string name="Hair"> + Cabelo + </string> + <string name="Hair Back"> + Cabelo: Trás + </string> + <string name="Hair Front"> + Cabelo: Frente + </string> + <string name="Hair Sides"> + Cabelos: Lateral + </string> + <string name="Hair Sweep"> + Cabelo penteado + </string> + <string name="Hair Thickess"> + Espessura do cabelo + </string> + <string name="Hair Thickness"> + Espessura do cabelo + </string> + <string name="Hair Tilt"> + Divisão do cabelo + </string> + <string name="Hair Tilted Left"> + Divistão do cabelo esquerda + </string> + <string name="Hair Tilted Right"> + Divisão do cabelo direita + </string> + <string name="Hair Volume"> + Cabelo: Volume + </string> + <string name="Hand Size"> + Tamanho das mãos + </string> + <string name="Handlebars"> + Bigode + </string> + <string name="Head Length"> + Comprimento da cabeça + </string> + <string name="Head Shape"> + Formato da cabeça + </string> + <string name="Head Size"> + Tamanho da cabeça + </string> + <string name="Head Stretch"> + Extensão da cabeça + </string> + <string name="Heel Height"> + Altura do salto + </string> + <string name="Heel Shape"> + Formato do salto + </string> + <string name="Height"> + Altura + </string> + <string name="High"> + Alto + </string> + <string name="High Heels"> + Salto alto + </string> + <string name="High Jaw"> + Maxilar alto + </string> + <string name="High Platforms"> + Plataformas altas + </string> + <string name="High and Tight"> + Alto e justo + </string> + <string name="Higher"> + Mais alto + </string> + <string name="Hip Length"> + Comprimento do quadril + </string> + <string name="Hip Width"> + Largura do quadril + </string> + <string name="Hover"> + Pairar + </string> + <string name="In"> + Dentro + </string> + <string name="In Shdw Color"> + Cor da sombra interna + </string> + <string name="In Shdw Opacity"> + Opacidade da sombra interna + </string> + <string name="Inner Eye Corner"> + Canto interno dos olhos + </string> + <string name="Inner Eye Shadow"> + Sombra interna dos olhos + </string> + <string name="Inner Shadow"> + Sombra interna + </string> + <string name="Jacket Length"> + Comprimento da blusa + </string> + <string name="Jacket Wrinkles"> + Dobras da jaqueta + </string> + <string name="Jaw Angle"> + Ângulo da mandÃbula + </string> + <string name="Jaw Jut"> + Posição do maxilar + </string> + <string name="Jaw Shape"> + Formato do maxilar + </string> + <string name="Join"> + Juntar + </string> + <string name="Jowls"> + Papo + </string> + <string name="Knee Angle"> + Ângulo do joelho + </string> + <string name="Knock Kneed"> + Joelhos para dentro + </string> + <string name="Large"> + Grande + </string> + <string name="Large Hands"> + Mãos grandes + </string> + <string name="Left Part"> + Parte esquerda + </string> + <string name="Leg Length"> + Comprimento da perna + </string> + <string name="Leg Muscles"> + Musculatura da perna + </string> + <string name="Less"> + Menos + </string> + <string name="Less Body Fat"> + Menos gordura + </string> + <string name="Less Curtains"> + Menos barba + </string> + <string name="Less Freckles"> + Menos sardas + </string> + <string name="Less Full"> + Menos + </string> + <string name="Less Gravity"> + Menos gravidade + </string> + <string name="Less Love"> + Menos excesso + </string> + <string name="Less Muscles"> + Menos músculos + </string> + <string name="Less Muscular"> + Menos musculoso + </string> + <string name="Less Rosy"> + Menos rosado + </string> + <string name="Less Round"> + Menos arredondado + </string> + <string name="Less Saddle"> + Menos ancas + </string> + <string name="Less Square"> + Menos quadrado + </string> + <string name="Less Volume"> + Menos volume + </string> + <string name="Less soul"> + Menos alma + </string> + <string name="Lighter"> + Lighter + </string> + <string name="Lip Cleft"> + Fenda dos lábios + </string> + <string name="Lip Cleft Depth"> + Profundidade da fenda dos lábios + </string> + <string name="Lip Fullness"> + Volume dos lábios + </string> + <string name="Lip Pinkness"> + Rosado dos lábios + </string> + <string name="Lip Ratio"> + Proporção dos lábios + </string> + <string name="Lip Thickness"> + Espessura dos lábios + </string> + <string name="Lip Width"> + Largura dos lábios + </string> + <string name="Lipgloss"> + Brilho dos lábios + </string> + <string name="Lipstick"> + Batom + </string> + <string name="Lipstick Color"> + Cor do batom + </string> + <string name="Long"> + Longo + </string> + <string name="Long Head"> + Cabeça alongada + </string> + <string name="Long Hips"> + Lábios longos + </string> + <string name="Long Legs"> + Pernas longas + </string> + <string name="Long Neck"> + Pescoço longo + </string> + <string name="Long Pigtails"> + Chiquinhas longas + </string> + <string name="Long Ponytail"> + Rabo de cavalo longo + </string> + <string name="Long Torso"> + Torso longo + </string> + <string name="Long arms"> + Braços longos + </string> + <string name="Loose Pants"> + Pantalonas + </string> + <string name="Loose Shirt"> + Camisa folgada + </string> + <string name="Loose Sleeves"> + Mangas folgadas + </string> + <string name="Love Handles"> + Pneu + </string> + <string name="Low"> + Baixo + </string> + <string name="Low Heels"> + Salto baixo + </string> + <string name="Low Jaw"> + Maxilar baixo + </string> + <string name="Low Platforms"> + Plataformas baixas + </string> + <string name="Low and Loose"> + Baixo e solto + </string> + <string name="Lower"> + Mais baixo + </string> + <string name="Lower Bridge"> + Mais baixa + </string> + <string name="Lower Cheeks"> + Bochechas abaixadas + </string> + <string name="Male"> + Masculino + </string> + <string name="Middle Part"> + Parte do meio + </string> + <string name="More"> + Mais + </string> + <string name="More Blush"> + Mais blush + </string> + <string name="More Body Fat"> + Mais gordura + </string> + <string name="More Curtains"> + Mais barba + </string> + <string name="More Eyeshadow"> + Mais sombra dos olhos + </string> + <string name="More Freckles"> + Mais sardas + </string> + <string name="More Full"> + Mais volume + </string> + <string name="More Gravity"> + Mais gravidade + </string> + <string name="More Lipstick"> + Mais batom + </string> + <string name="More Love"> + Mais cintura + </string> + <string name="More Lower Lip"> + Mais lábio inferior + </string> + <string name="More Muscles"> + Mais músculos + </string> + <string name="More Muscular"> + Mais musculoso + </string> + <string name="More Rosy"> + Mais rosado + </string> + <string name="More Round"> + Mais arredondado + </string> + <string name="More Saddle"> + Mais ancas + </string> + <string name="More Sloped"> + Mais inclinado + </string> + <string name="More Square"> + Mais quadrado + </string> + <string name="More Upper Lip"> + Mais lábios superiores + </string> + <string name="More Vertical"> + Mais vertical + </string> + <string name="More Volume"> + Mais volume + </string> + <string name="More soul"> + Mais alma + </string> + <string name="Moustache"> + Bigode + </string> + <string name="Mouth Corner"> + Canto da boca + </string> + <string name="Mouth Position"> + Posição da boca + </string> + <string name="Mowhawk"> + Moicano + </string> + <string name="Muscular"> + Muscular + </string> + <string name="Mutton Chops"> + Costeletas + </string> + <string name="Nail Polish"> + Esmate das unhas + </string> + <string name="Nail Polish Color"> + Cor do esmalte das unhas + </string> + <string name="Narrow"> + Estreito + </string> + <string name="Narrow Back"> + Costas estreitas + </string> + <string name="Narrow Front"> + Frente estreita + </string> + <string name="Narrow Lips"> + Lábios estreitos + </string> + <string name="Natural"> + Natural + </string> + <string name="Neck Length"> + Comprimento do pescoço + </string> + <string name="Neck Thickness"> + Espessura do pescoço + </string> + <string name="No Blush"> + Sem blush + </string> + <string name="No Eyeliner"> + Sem delineador + </string> + <string name="No Eyeshadow"> + Sem sombra + </string> + <string name="No Lipgloss"> + Sem brilho + </string> + <string name="No Lipstick"> + Sem batom + </string> + <string name="No Part"> + Sem parte + </string> + <string name="No Polish"> + Sem esmalte + </string> + <string name="No Red"> + Sem vermelho + </string> + <string name="No Spikes"> + Sem pontas + </string> + <string name="No White"> + Sem branco + </string> + <string name="No Wrinkles"> + Sem dobras + </string> + <string name="Normal Lower"> + Normal inferior + </string> + <string name="Normal Upper"> + Normal superior + </string> + <string name="Nose Left"> + Nariz para esquerda + </string> + <string name="Nose Right"> + Nariz para direita + </string> + <string name="Nose Size"> + Tamanho do nariz + </string> + <string name="Nose Thickness"> + Espessura do nariz + </string> + <string name="Nose Tip Angle"> + Ângulo da ponta do nariz + </string> + <string name="Nose Tip Shape"> + Formato da ponta do nariz + </string> + <string name="Nose Width"> + Largura do nariz + </string> + <string name="Nostril Division"> + Divisão das narinas + </string> + <string name="Nostril Width"> + Largura das narinas + </string> + <string name="Opaque"> + Opaco + </string> + <string name="Open"> + Abrir + </string> + <string name="Open Back"> + Aberto atrás + </string> + <string name="Open Front"> + Aberto na frente + </string> + <string name="Open Left"> + Aberto esquerdo + </string> + <string name="Open Right"> + Aberto direito + </string> + <string name="Orange"> + Laranja + </string> + <string name="Out"> + Fora + </string> + <string name="Out Shdw Color"> + Cor da sombra externa + </string> + <string name="Out Shdw Opacity"> + Opacidade da sombra externa + </string> + <string name="Outer Eye Corner"> + Canto externo do olho + </string> + <string name="Outer Eye Shadow"> + Sombra externa do olho + </string> + <string name="Outer Shadow"> + Sombra externa + </string> + <string name="Overbite"> + Má oclusão + </string> + <string name="Package"> + Púbis + </string> + <string name="Painted Nails"> + Unhas pintadas + </string> + <string name="Pale"> + Pálido + </string> + <string name="Pants Crotch"> + Cavalo da calça + </string> + <string name="Pants Fit"> + Caimento das calças + </string> + <string name="Pants Length"> + Comprimento das calças + </string> + <string name="Pants Waist"> + Cintura da calça + </string> + <string name="Pants Wrinkles"> + Dobras das calças + </string> + <string name="Part"> + Parte + </string> + <string name="Part Bangs"> + Divisão da franja + </string> + <string name="Pectorals"> + Peitorais + </string> + <string name="Pigment"> + Pigmento + </string> + <string name="Pigtails"> + Chiquinhas + </string> + <string name="Pink"> + Rosa + </string> + <string name="Pinker"> + Mais rosado + </string> + <string name="Platform Height"> + Altura da plataforma + </string> + <string name="Platform Width"> + Largura da plataforma + </string> + <string name="Pointy"> + Pontudo + </string> + <string name="Pointy Heels"> + Salto agulha + </string> + <string name="Ponytail"> + Rabo de cavalo + </string> + <string name="Poofy Skirt"> + Saia bufante + </string> + <string name="Pop Left Eye"> + Olho saltado esquerdo + </string> + <string name="Pop Right Eye"> + Olho saltado direito + </string> + <string name="Puffy"> + Inchado + </string> + <string name="Puffy Eyelids"> + Pálpebras inchadas + </string> + <string name="Rainbow Color"> + Cor do arco Ãris + </string> + <string name="Red Hair"> + Cabelo ruivo + </string> + <string name="Regular"> + Normal + </string> + <string name="Right Part"> + Parte direita + </string> + <string name="Rosy Complexion"> + Rosado da face + </string> + <string name="Round"> + Arredondado + </string> + <string name="Ruddiness"> + Rubor + </string> + <string name="Ruddy"> + Corado + </string> + <string name="Rumpled Hair"> + Cabelo desalinhado + </string> + <string name="Saddle Bags"> + Culote + </string> + <string name="Scrawny Leg"> + Pernas magricelas + </string> + <string name="Separate"> + Separar + </string> + <string name="Shallow"> + Raso + </string> + <string name="Shear Back"> + Trás rente + </string> + <string name="Shear Face"> + Face raspada + </string> + <string name="Shear Front"> + Frente rente + </string> + <string name="Shear Left Up"> + Esquerda rente para cima + </string> + <string name="Shear Right Up"> + Trás rente para cima + </string> + <string name="Sheared Back"> + Rente atrás + </string> + <string name="Sheared Front"> + Rente frente + </string> + <string name="Shift Left"> + Deslocar p/ esquerda + </string> + <string name="Shift Mouth"> + Deslocar boca + </string> + <string name="Shift Right"> + Deslocar p/ direita + </string> + <string name="Shirt Bottom"> + Barra da camisa + </string> + <string name="Shirt Fit"> + Ajuste da camisa + </string> + <string name="Shirt Wrinkles"> + +/- amassada + </string> + <string name="Shoe Height"> + Altura do sapato + </string> + <string name="Short"> + Curto + </string> + <string name="Short Arms"> + Braços curtos + </string> + <string name="Short Legs"> + Pernas curtas + </string> + <string name="Short Neck"> + Pescoço curto + </string> + <string name="Short Pigtails"> + Chiquinhas curtas + </string> + <string name="Short Ponytail"> + Rabo de cavalo curto + </string> + <string name="Short Sideburns"> + Costeletas curtas + </string> + <string name="Short Torso"> + Tronco curto + </string> + <string name="Short hips"> + Quadril curto + </string> + <string name="Shoulders"> + Ombros + </string> + <string name="Side Fringe"> + pontas laterais + </string> + <string name="Sideburns"> + Costeletas + </string> + <string name="Sides Hair"> + Cabelo lateral + </string> + <string name="Sides Hair Down"> + Cabelo lateral long + </string> + <string name="Sides Hair Up"> + Cabelo lateral superior + </string> + <string name="Skinny Neck"> + Pescoço fino + </string> + <string name="Skirt Fit"> + Ajuste de saia + </string> + <string name="Skirt Length"> + Comprimento da saia + </string> + <string name="Slanted Forehead"> + Testa inclinada + </string> + <string name="Sleeve Length"> + Comprimento da manga + </string> + <string name="Sleeve Looseness"> + Folga da manga + </string> + <string name="Slit Back"> + Abertura : Atrás + </string> + <string name="Slit Front"> + Abertura: Frente + </string> + <string name="Slit Left"> + Abertura: Esquerda + </string> + <string name="Slit Right"> + Abertura: Direita + </string> + <string name="Small"> + Pequeno + </string> + <string name="Small Hands"> + Mãos pequenas + </string> + <string name="Small Head"> + Cabeça pequena + </string> + <string name="Smooth"> + Suavizar + </string> + <string name="Smooth Hair"> + Suavizar cabelo + </string> + <string name="Socks Length"> + Comprimento das meias + </string> + <string name="Soulpatch"> + Cavanhaque + </string> + <string name="Sparse"> + Disperso + </string> + <string name="Spiked Hair"> + Cabelo espetado + </string> + <string name="Square"> + Quadrado + </string> + <string name="Square Toe"> + Dedo quadrado + </string> + <string name="Squash Head"> + Cabeça de Pera + </string> + <string name="Stretch Head"> + Cabeça esticada + </string> + <string name="Sunken"> + Afundar + </string> + <string name="Sunken Chest"> + Peito afundado + </string> + <string name="Sunken Eyes"> + Olhos afundados + </string> + <string name="Sweep Back"> + Pentear para trás + </string> + <string name="Sweep Forward"> + Pentear para frente + </string> + <string name="Tall"> + Alto + </string> + <string name="Taper Back"> + Afinar atrás + </string> + <string name="Taper Front"> + Afinar a frente + </string> + <string name="Thick Heels"> + Salto grosso + </string> + <string name="Thick Neck"> + Pescoço grosso + </string> + <string name="Thick Toe"> + Dedo grosso + </string> + <string name="Thin"> + Fino + </string> + <string name="Thin Eyebrows"> + Sobrancelhas finas + </string> + <string name="Thin Lips"> + Lábios finos + </string> + <string name="Thin Nose"> + Nariz fino + </string> + <string name="Tight Chin"> + Queixo apertado + </string> + <string name="Tight Cuffs"> + Punho justo + </string> + <string name="Tight Pants"> + Calça justa + </string> + <string name="Tight Shirt"> + Camisa justa + </string> + <string name="Tight Skirt"> + Saia justa + </string> + <string name="Tight Sleeves"> + Tight Sleeves + </string> + <string name="Toe Shape"> + Formato dos dedos + </string> + <string name="Toe Thickness"> + Espessura dos dos dedos + </string> + <string name="Torso Length"> + Comprimento do tronco + </string> + <string name="Torso Muscles"> + Músculos do tronco + </string> + <string name="Torso Scrawny"> + Tronco magricela + </string> + <string name="Unattached"> + Desanexado + </string> + <string name="Uncreased"> + Uncreased + </string> + <string name="Underbite"> + Underbite + </string> + <string name="Unnatural"> + Não natural + </string> + <string name="Upper Bridge"> + Parte alta do nariz + </string> + <string name="Upper Cheeks"> + Bochechas altas + </string> + <string name="Upper Chin Cleft"> + fenda do queixo alta + </string> + <string name="Upper Eyelid Fold"> + Curvatura dos cÃlios supériores + </string> + <string name="Upturned"> + Voltado para cima + </string> + <string name="Very Red"> + Bem vermelho + </string> + <string name="Waist Height"> + Altura da cintura + </string> + <string name="Well-Fed"> + Corpulento + </string> + <string name="White Hair"> + Grisalho + </string> + <string name="Wide"> + Amplo + </string> + <string name="Wide Back"> + Costas largas + </string> + <string name="Wide Front"> + Testa larga + </string> + <string name="Wide Lips"> + Lábios amplos + </string> + <string name="Wild"> + Selvagem + </string> + <string name="Wrinkles"> + Rugas + </string> + <string name="LocationCtrlAddLandmarkTooltip"> + Adicionar à s minhas Landmarks + </string> + <string name="LocationCtrlEditLandmarkTooltip"> + Editar minhas Landmarks + </string> + <string name="LocationCtrlInfoBtnTooltip"> + Ver mais informações sobre a localização atual + </string> + <string name="LocationCtrlComboBtnTooltip"> + Histórico de localizações + </string> + <string name="LocationCtrlAdultIconTooltip"> + Região Adulta + </string> + <string name="LocationCtrlModerateIconTooltip"> + Região Moderada + </string> + <string name="LocationCtrlGeneralIconTooltip"> + Região em geral + </string> + <string name="LocationCtrlSeeAVsTooltip"> + Os avatares neste lote não podem ser vistos ou ouvidos por avatares fora dele + </string> + <string name="LocationCtrlPathfindingDirtyTooltip"> + Os objetos que se movem podem não se comportar corretamente nesta região até que ela seja recarregada. + </string> + <string name="LocationCtrlPathfindingDisabledTooltip"> + O pathfinding dinâmico não está habilitado nesta região. + </string> + <string name="UpdaterWindowTitle"> + [APP_NAME] Atualização + </string> + <string name="UpdaterNowUpdating"> + Atualizando agora o [APP_NAME]... + </string> + <string name="UpdaterNowInstalling"> + Instalando [APP_NAME]... + </string> + <string name="UpdaterUpdatingDescriptive"> + Seu visualizador [APP_NAME] está sendo atualizado para a versão mais recente. Isso pode levar algum tempo, então por favor seja paciente. + </string> + <string name="UpdaterProgressBarTextWithEllipses"> + Fazendo o download da atualização... + </string> + <string name="UpdaterProgressBarText"> + Fazendo o download da atualização + </string> + <string name="UpdaterFailDownloadTitle"> + Falha no download da atualização + </string> + <string name="UpdaterFailUpdateDescriptive"> + Um erro ocorreu ao atualizar [APP_NAME]. Por favor, faça o download da versão mais recente em www.secondlife.com. + </string> + <string name="UpdaterFailInstallTitle"> + Falha ao instalar a atualização + </string> + <string name="UpdaterFailStartTitle"> + Falha ao iniciar o visualizador + </string> + <string name="ItemsComingInTooFastFrom"> + [APP_NAME]: Entrada de itens rápida demais de [FROM_NAME], visualização automática suspensa por [TIME] segundos + </string> + <string name="ItemsComingInTooFast"> + [APP_NAME]: Entrada de itens rápida demais, visualização automática suspensa por [TIME] segundos + </string> + <string name="IM_logging_string"> + -- Log de mensagem instantânea habilitado -- + </string> + <string name="IM_typing_start_string"> + [NAME] está digitando... + </string> + <string name="Unnamed"> + (Anônimo) + </string> + <string name="IM_moderated_chat_label"> + (Moderado: Voz desativado por padrão) + </string> + <string name="IM_unavailable_text_label"> + Bate-papo de texto não está disponÃvel para esta chamada. + </string> + <string name="IM_muted_text_label"> + Seu bate- papo de texto foi desabilitado por um Moderador do Grupo. + </string> + <string name="IM_default_text_label"> + Clique aqui para menagem instantânea. + </string> + <string name="IM_to_label"> + Para + </string> + <string name="IM_moderator_label"> + (Moderador) + </string> + <string name="Saved_message"> + (Salvo em [LONG_TIMESTAMP]) + </string> + <string name="IM_unblock_only_groups_friends"> + Para visualizar esta mensagem, você deve desmarcar "Apenas amigos e grupos podem me ligar ou enviar MIs" em Preferências/Privacidade. + </string> + <string name="OnlineStatus"> + Conectado + </string> + <string name="OfflineStatus"> + Desconectado + </string> + <string name="not_online_msg"> + O usuário não está online. As mensagens serão armazenadas e enviadas mais tarde. + </string> + <string name="not_online_inventory"> + O usuário não está online. O inventário foi salvo. + </string> + <string name="answered_call"> + Ligação atendida + </string> + <string name="you_started_call"> + Você iniciou uma ligação de voz + </string> + <string name="you_joined_call"> + Você entrou na ligação + </string> + <string name="you_auto_rejected_call-im"> + Você recusou automaticamente a chamada de voz enquanto "Não perturbe" estava ativado. + </string> + <string name="name_started_call"> + [NAME] iniciou uma ligação de voz + </string> + <string name="ringing-im"> + Entrando em ligação de voz... + </string> + <string name="connected-im"> + Conectado. Para sair, clique em Desligar + </string> + <string name="hang_up-im"> + Saiu da ligação de voz + </string> + <string name="conference-title"> + Bate-papo com várias pessoas + </string> + <string name="conference-title-incoming"> + Conversa com [AGENT_NAME] + </string> + <string name="inventory_item_offered-im"> + Item do inventário '[ITEM_NAME]' oferecido + </string> + <string name="inventory_folder_offered-im"> + Pasta do inventário '[ITEM_NAME]' oferecida + </string> + <string name="bot_warning"> + Você está conversando com um bot, [NAME]. Não compartilhe informações pessoais. +Saiba mais em https://second.life/scripted-agents. + </string> + <string name="facebook_post_success"> + Você publicou no Facebook. + </string> + <string name="flickr_post_success"> + Você publicou no Flickr. + </string> + <string name="twitter_post_success"> + Você publicou no Twitter. + </string> + <string name="no_session_message"> + (Sessão de MI inexistente) + </string> + <string name="only_user_message"> + Você é o único usuário desta sessão. + </string> + <string name="offline_message"> + [NAME] está offline. + </string> + <string name="invite_message"> + Clique no botão [BUTTON NAME] para aceitar/ conectar a este bate-papo em voz. + </string> + <string name="muted_message"> + Você bloqueou este residente. Se quiser retirar o bloqueio, basta enviar uma mensagem. + </string> + <string name="generic"> + Erro de solicitação, tente novamente mais tarde. + </string> + <string name="generic_request_error"> + Erro na requisição, por favor, tente novamente. + </string> + <string name="insufficient_perms_error"> + Você não tem permissões suficientes. + </string> + <string name="session_does_not_exist_error"> + A sessão deixou de existir + </string> + <string name="no_ability_error"> + Você não possui esta habilidade. + </string> + <string name="no_ability"> + Você não possui esta habilidade. + </string> + <string name="not_a_mod_error"> + Você não é um moderador de sessão. + </string> + <string name="muted"> + Bate-papo de texto desativado por um moderador. + </string> + <string name="muted_error"> + Um moderador do grupo desabilitou seu bate-papo em texto. + </string> + <string name="add_session_event"> + Não foi possÃvel adicionar usuários na sessão de bate-papo com [RECIPIENT]. + </string> + <string name="message"> + Não foi possÃvel enviar sua mensagem para o bate-papo com [RECIPIENT]. + </string> + <string name="message_session_event"> + Não foi possÃvel enviar sua mensagem na sessão de bate- papo com [RECIPIENT]. + </string> + <string name="mute"> + Erro durante a moderação. + </string> + <string name="removed"> + Você foi tirado do grupo. + </string> + <string name="removed_from_group"> + Você foi removido do grupo. + </string> + <string name="close_on_no_ability"> + Você não possui mais a habilidade de estar na sessão de bate-papo. + </string> + <string name="unread_chat_single"> + [SOURCES] disse alguma coisa + </string> + <string name="unread_chat_multiple"> + [SOURCES] disseram alguma coisa + </string> + <string name="session_initialization_timed_out_error"> + A inicialização da sessão expirou + </string> + <string name="Home position set."> + Posição inicial definida. + </string> + <string name="voice_morphing_url"> + https://secondlife.com/destination/voice-island + </string> + <string name="premium_voice_morphing_url"> + https://secondlife.com/destination/voice-morphing-premium + </string> + <string name="paid_you_ldollars"> + [NAME] lhe pagou L$ [AMOUNT] [REASON]. + </string> + <string name="paid_you_ldollars_gift"> + [NAME] lhe pagou L$ [AMOUNT]: [REASON] + </string> + <string name="paid_you_ldollars_no_reason"> + [NAME] lhe pagou L$ [AMOUNT] + </string> + <string name="you_paid_ldollars"> + Você pagou L$[AMOUNT] por [REASON] a [NAME]. + </string> + <string name="you_paid_ldollars_gift"> + Você pagou L$[AMOUNT] a [NAME]: [REASON] + </string> + <string name="you_paid_ldollars_no_info"> + Você acaba de pagar L$[AMOUNT]. + </string> + <string name="you_paid_ldollars_no_reason"> + Você pagou L$[AMOUNT] a [NAME]. + </string> + <string name="you_paid_ldollars_no_name"> + Você pagou L$[AMOUNT] por [REASON]. + </string> + <string name="you_paid_failure_ldollars"> + Você não pagou L$[AMOUNT] a [NAME] referentes a [REASON]. + </string> + <string name="you_paid_failure_ldollars_gift"> + Você não pagou L$[AMOUNT] a [NAME]: [REASON] + </string> + <string name="you_paid_failure_ldollars_no_info"> + Você não pagou L$[AMOUNT]. + </string> + <string name="you_paid_failure_ldollars_no_reason"> + Você não pagou L$[AMOUNT] a [NAME]. + </string> + <string name="you_paid_failure_ldollars_no_name"> + Você não pagou L$[AMOUNT] referentes a [REASON]. + </string> + <string name="for item"> + por [ITEM] + </string> + <string name="for a parcel of land"> + por uma parcela + </string> + <string name="for a land access pass"> + por um passe de acesso + </string> + <string name="for deeding land"> + para doar um terreno + </string> + <string name="to create a group"> + para criar um grupo + </string> + <string name="to join a group"> + para entrar em um grupo + </string> + <string name="to upload"> + para carregar + </string> + <string name="to publish a classified ad"> + para publicar um anúncio + </string> + <string name="giving"> + Dando L$ [AMOUNT] + </string> + <string name="uploading_costs"> + O upload custa L$ [AMOUNT] + </string> + <string name="this_costs"> + Isso custa L$ [AMOUNT] + </string> + <string name="buying_selected_land"> + Comprando terreno selecionado L$ [AMOUNT] + </string> + <string name="this_object_costs"> + Esse objeto custa L$ [AMOUNT] + </string> + <string name="group_role_everyone"> + Todos + </string> + <string name="group_role_officers"> + Oficiais + </string> + <string name="group_role_owners"> + Proprietários + </string> + <string name="group_member_status_online"> + Conectado + </string> + <string name="uploading_abuse_report"> + Carregando... -Denunciar abuso</string> - <string name="New Shape">Nova forma</string> - <string name="New Skin">Nova pele</string> - <string name="New Hair">Novo cabelo</string> - <string name="New Eyes">Novos olhos</string> - <string name="New Shirt">Nova camisa</string> - <string name="New Pants">Novas calças</string> - <string name="New Shoes">Novos sapatos</string> - <string name="New Socks">Novas meias</string> - <string name="New Jacket">Nova blusa</string> - <string name="New Gloves">Novas luvas</string> - <string name="New Undershirt">Nova camiseta</string> - <string name="New Underpants">Novas roupa de baixo</string> - <string name="New Skirt">Nova saia</string> - <string name="New Alpha">Novo alpha</string> - <string name="New Tattoo">Nova tatuagem</string> - <string name="New Universal">Novo universal</string> - <string name="New Physics">Novo fÃsico</string> - <string name="Invalid Wearable">Item inválido</string> - <string name="New Gesture">Novo gesto</string> - <string name="New Script">Novo script</string> - <string name="New Note">Nova nota</string> - <string name="New Folder">Nova pasta</string> - <string name="Contents">Conteúdo</string> - <string name="Gesture">Gesto</string> - <string name="Male Gestures">Gestos masculinos</string> - <string name="Female Gestures">Gestos femininos</string> - <string name="Other Gestures">Outros gestos</string> - <string name="Speech Gestures">Gestos da fala</string> - <string name="Common Gestures">Gestos comuns</string> - <string name="Male - Excuse me">Perdão - masculino</string> - <string name="Male - Get lost">Deixe-me em paz - masculino</string> - <string name="Male - Blow kiss">Mandar beijo - masculino</string> - <string name="Male - Boo">Vaia - masculino</string> - <string name="Male - Bored">Maçante - masculino</string> - <string name="Male - Hey">Ôpa! - masculino</string> - <string name="Male - Laugh">Risada - masculino</string> - <string name="Male - Repulsed">Quero distância! - masculino</string> - <string name="Male - Shrug">Encolher de ombros - masculino</string> - <string name="Male - Stick tougue out">Mostrar a lÃngua - masculino</string> - <string name="Male - Wow">Wow - masculino</string> - <string name="Female - Chuckle">Engraçado - Feminino</string> - <string name="Female - Cry">Chorar - Feminino</string> - <string name="Female - Embarrassed">Com vergonha - Feminino</string> - <string name="Female - Excuse me">Perdão - fem</string> - <string name="Female - Get lost">Deixe-me em paz - feminino</string> - <string name="Female - Blow kiss">Mandar beijo - fem</string> - <string name="Female - Boo">Vaia - fem</string> - <string name="Female - Bored">Maçante - feminino</string> - <string name="Female - Hey">Ôpa - feminino</string> - <string name="Female - Hey baby">E aÃ, beliza? - Feminino</string> - <string name="Female - Laugh">Risada - feminina</string> - <string name="Female - Looking good">Que chique - Feminino</string> - <string name="Female - Over here">Acenar - Feminino</string> - <string name="Female - Please">Por favor - Feminino</string> - <string name="Female - Repulsed">Quero distância! - feminino</string> - <string name="Female - Shrug">Encolher ombros - feminino</string> - <string name="Female - Stick tougue out">Mostrar a lÃngua - feminino</string> - <string name="Female - Wow">Wow - feminino</string> - <string name="New Daycycle">Novo ciclo de dias</string> - <string name="New Water">Nova água</string> - <string name="New Sky">Novo céu</string> - <string name="/bow">/reverência</string> - <string name="/clap">/palmas</string> - <string name="/count">/contar</string> - <string name="/extinguish">/apagar</string> - <string name="/kmb">/dane_se</string> - <string name="/muscle">/músculos</string> - <string name="/no">/não</string> - <string name="/no!">/não!</string> - <string name="/paper">/papel</string> - <string name="/pointme">/apontar_eu</string> - <string name="/pointyou">/apontar_você</string> - <string name="/rock">/pedra</string> - <string name="/scissor">/tesoura</string> - <string name="/smoke">/fumar</string> - <string name="/stretch">/alongar</string> - <string name="/whistle">/assobiar</string> - <string name="/yes">/sim</string> - <string name="/yes!">/sim!</string> - <string name="afk">ldt</string> - <string name="dance1">dança1</string> - <string name="dance2">dança2</string> - <string name="dance3">dança3</string> - <string name="dance4">dança4</string> - <string name="dance5">dança5</string> - <string name="dance6">dança6</string> - <string name="dance7">dança7</string> - <string name="dance8">dança8</string> - <string name="AvatarBirthDateFormat">[mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]</string> - <string name="DefaultMimeType">nenhum/nehum</string> - <string name="texture_load_dimensions_error">A imagem excede o limite [WIDTH]*[HEIGHT]</string> - <string name="outfit_photo_load_dimensions_error">O tamanho máx. do look é [WIDTH]*[HEIGHT]. Redimensione ou use outra imagem</string> - <string name="outfit_photo_select_dimensions_error">O tamanho máx. do look é [WIDTH]*[HEIGHT]. Selecione outra textura</string> - <string name="outfit_photo_verify_dimensions_error">Não foi possÃvel confirmar as dimensões da foto. Aguarde até que o tamanho da foto seja exibido no seletor</string> +Denunciar abuso + </string> + <string name="New Shape"> + Nova forma + </string> + <string name="New Skin"> + Nova pele + </string> + <string name="New Hair"> + Novo cabelo + </string> + <string name="New Eyes"> + Novos olhos + </string> + <string name="New Shirt"> + Nova camisa + </string> + <string name="New Pants"> + Novas calças + </string> + <string name="New Shoes"> + Novos sapatos + </string> + <string name="New Socks"> + Novas meias + </string> + <string name="New Jacket"> + Nova blusa + </string> + <string name="New Gloves"> + Novas luvas + </string> + <string name="New Undershirt"> + Nova camiseta + </string> + <string name="New Underpants"> + Novas roupa de baixo + </string> + <string name="New Skirt"> + Nova saia + </string> + <string name="New Alpha"> + Novo alpha + </string> + <string name="New Tattoo"> + Nova tatuagem + </string> + <string name="New Universal"> + Novo universal + </string> + <string name="New Physics"> + Novo fÃsico + </string> + <string name="Invalid Wearable"> + Item inválido + </string> + <string name="New Gesture"> + Novo gesto + </string> + <string name="New Script"> + Novo script + </string> + <string name="New Note"> + Nova nota + </string> + <string name="New Folder"> + Nova pasta + </string> + <string name="Contents"> + Conteúdo + </string> + <string name="Gesture"> + Gesto + </string> + <string name="Male Gestures"> + Gestos masculinos + </string> + <string name="Female Gestures"> + Gestos femininos + </string> + <string name="Other Gestures"> + Outros gestos + </string> + <string name="Speech Gestures"> + Gestos da fala + </string> + <string name="Common Gestures"> + Gestos comuns + </string> + <string name="Male - Excuse me"> + Perdão - masculino + </string> + <string name="Male - Get lost"> + Deixe-me em paz - masculino + </string> + <string name="Male - Blow kiss"> + Mandar beijo - masculino + </string> + <string name="Male - Boo"> + Vaia - masculino + </string> + <string name="Male - Bored"> + Maçante - masculino + </string> + <string name="Male - Hey"> + Ôpa! - masculino + </string> + <string name="Male - Laugh"> + Risada - masculino + </string> + <string name="Male - Repulsed"> + Quero distância! - masculino + </string> + <string name="Male - Shrug"> + Encolher de ombros - masculino + </string> + <string name="Male - Stick tougue out"> + Mostrar a lÃngua - masculino + </string> + <string name="Male - Wow"> + Wow - masculino + </string> + <string name="Female - Chuckle"> + Engraçado - Feminino + </string> + <string name="Female - Cry"> + Chorar - Feminino + </string> + <string name="Female - Embarrassed"> + Com vergonha - Feminino + </string> + <string name="Female - Excuse me"> + Perdão - fem + </string> + <string name="Female - Get lost"> + Deixe-me em paz - feminino + </string> + <string name="Female - Blow kiss"> + Mandar beijo - fem + </string> + <string name="Female - Boo"> + Vaia - fem + </string> + <string name="Female - Bored"> + Maçante - feminino + </string> + <string name="Female - Hey"> + Ôpa - feminino + </string> + <string name="Female - Hey baby"> + E aÃ, beliza? - Feminino + </string> + <string name="Female - Laugh"> + Risada - feminina + </string> + <string name="Female - Looking good"> + Que chique - Feminino + </string> + <string name="Female - Over here"> + Acenar - Feminino + </string> + <string name="Female - Please"> + Por favor - Feminino + </string> + <string name="Female - Repulsed"> + Quero distância! - feminino + </string> + <string name="Female - Shrug"> + Encolher ombros - feminino + </string> + <string name="Female - Stick tougue out"> + Mostrar a lÃngua - feminino + </string> + <string name="Female - Wow"> + Wow - feminino + </string> + <string name="New Daycycle"> + Novo ciclo de dias + </string> + <string name="New Water"> + Nova água + </string> + <string name="New Sky"> + Novo céu + </string> + <string name="/bow"> + /reverência + </string> + <string name="/clap"> + /palmas + </string> + <string name="/count"> + /contar + </string> + <string name="/extinguish"> + /apagar + </string> + <string name="/kmb"> + /dane_se + </string> + <string name="/muscle"> + /músculos + </string> + <string name="/no"> + /não + </string> + <string name="/no!"> + /não! + </string> + <string name="/paper"> + /papel + </string> + <string name="/pointme"> + /apontar_eu + </string> + <string name="/pointyou"> + /apontar_você + </string> + <string name="/rock"> + /pedra + </string> + <string name="/scissor"> + /tesoura + </string> + <string name="/smoke"> + /fumar + </string> + <string name="/stretch"> + /alongar + </string> + <string name="/whistle"> + /assobiar + </string> + <string name="/yes"> + /sim + </string> + <string name="/yes!"> + /sim! + </string> + <string name="afk"> + ldt + </string> + <string name="dance1"> + dança1 + </string> + <string name="dance2"> + dança2 + </string> + <string name="dance3"> + dança3 + </string> + <string name="dance4"> + dança4 + </string> + <string name="dance5"> + dança5 + </string> + <string name="dance6"> + dança6 + </string> + <string name="dance7"> + dança7 + </string> + <string name="dance8"> + dança8 + </string> + <string name="AvatarBirthDateFormat"> + [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt] + </string> + <string name="DefaultMimeType"> + nenhum/nehum + </string> + <string name="texture_load_dimensions_error"> + A imagem excede o limite [WIDTH]*[HEIGHT] + </string> + <string name="outfit_photo_load_dimensions_error"> + O tamanho máx. do look é [WIDTH]*[HEIGHT]. Redimensione ou use outra imagem + </string> + <string name="outfit_photo_select_dimensions_error"> + O tamanho máx. do look é [WIDTH]*[HEIGHT]. Selecione outra textura + </string> + <string name="outfit_photo_verify_dimensions_error"> + Não foi possÃvel confirmar as dimensões da foto. Aguarde até que o tamanho da foto seja exibido no seletor + </string> <string name="words_separator" value=","/> - <string name="server_is_down">Aconteceu algo inesperado, apesar de termos tentado impedir isso. + <string name="server_is_down"> + Aconteceu algo inesperado, apesar de termos tentado impedir isso. Visite http://status.secondlifegrid.net para saber se foi detectado um problema com o serviço. - Se o problema persistir, cheque a configuração da sua rede e firewall.</string> - <string name="dateTimeWeekdaysNames">Domingo:Segunda:Terça:Quarta:Quinta:Sexta:Sábado</string> - <string name="dateTimeWeekdaysShortNames">Dom:Seg:Ter:Qua:Qui:Sex:Sab</string> - <string name="dateTimeMonthNames">Janeiro:Fevereiro:Março:Abril:Maio:Junho:Julho:Agosto:Setembro:Outubro:Novembro:Dezembro</string> - <string name="dateTimeMonthShortNames">Jan:Fev:Mar:Abr:Maio:Jun:Jul:Ago:Set:Out:Nov:Dez</string> - <string name="dateTimeDayFormat">[MDAY]</string> - <string name="dateTimeAM">AM</string> - <string name="dateTimePM">PM</string> - <string name="LocalEstimateUSD">US$ [AMOUNT]</string> - <string name="Group Ban">Banimento do grupo</string> - <string name="Membership">Plano</string> - <string name="Roles">Cargos</string> - <string name="Group Identity">Identidade do lote</string> - <string name="Parcel Management">Gestão do lote</string> - <string name="Parcel Identity">ID do lote</string> - <string name="Parcel Settings">Configurações do lote</string> - <string name="Parcel Powers">Poderes do lote</string> - <string name="Parcel Access">Acesso ao lote</string> - <string name="Parcel Content">Conteúdo do lote</string> - <string name="Object Management">Gestão de objetos</string> - <string name="Accounting">Contabilidade</string> - <string name="Notices">Avisos</string> - <string name="Chat" value="Bate papo">Bate-papo</string> - <string name="BaseMembership">Base</string> - <string name="DeleteItems">Excluir itens selecionados?</string> - <string name="DeleteItem">Excluir item selecionado?</string> - <string name="EmptyOutfitText">Este look não possui nenhuma peça</string> - <string name="ExternalEditorNotSet">Selecione um editor utilizando a configuração ExternalEditor.</string> - <string name="ExternalEditorNotFound">O editor externo especificado não foi localizado. + Se o problema persistir, cheque a configuração da sua rede e firewall. + </string> + <string name="dateTimeWeekdaysNames"> + Domingo:Segunda:Terça:Quarta:Quinta:Sexta:Sábado + </string> + <string name="dateTimeWeekdaysShortNames"> + Dom:Seg:Ter:Qua:Qui:Sex:Sab + </string> + <string name="dateTimeMonthNames"> + Janeiro:Fevereiro:Março:Abril:Maio:Junho:Julho:Agosto:Setembro:Outubro:Novembro:Dezembro + </string> + <string name="dateTimeMonthShortNames"> + Jan:Fev:Mar:Abr:Maio:Jun:Jul:Ago:Set:Out:Nov:Dez + </string> + <string name="dateTimeDayFormat"> + [MDAY] + </string> + <string name="dateTimeAM"> + AM + </string> + <string name="dateTimePM"> + PM + </string> + <string name="LocalEstimateUSD"> + US$ [AMOUNT] + </string> + <string name="Group Ban"> + Banimento do grupo + </string> + <string name="Membership"> + Plano + </string> + <string name="Roles"> + Cargos + </string> + <string name="Group Identity"> + Identidade do lote + </string> + <string name="Parcel Management"> + Gestão do lote + </string> + <string name="Parcel Identity"> + ID do lote + </string> + <string name="Parcel Settings"> + Configurações do lote + </string> + <string name="Parcel Powers"> + Poderes do lote + </string> + <string name="Parcel Access"> + Acesso ao lote + </string> + <string name="Parcel Content"> + Conteúdo do lote + </string> + <string name="Object Management"> + Gestão de objetos + </string> + <string name="Accounting"> + Contabilidade + </string> + <string name="Notices"> + Avisos + </string> + <string name="Chat" value="Bate papo"> + Bate-papo + </string> + <string name="BaseMembership"> + Base + </string> + <string name="DeleteItems"> + Excluir itens selecionados? + </string> + <string name="DeleteItem"> + Excluir item selecionado? + </string> + <string name="EmptyOutfitText"> + Este look não possui nenhuma peça + </string> + <string name="ExternalEditorNotSet"> + Selecione um editor utilizando a configuração ExternalEditor. + </string> + <string name="ExternalEditorNotFound"> + O editor externo especificado não foi localizado. Tente colocar o caminho do editor entre aspas. -(ex. "/caminho para/editor" "%s")</string> - <string name="ExternalEditorCommandParseError">Error ao analisar o comando do editor externo.</string> - <string name="ExternalEditorFailedToRun">Falha de execução do editor externo.</string> - <string name="TranslationFailed">Falha na tradução: [REASON]</string> - <string name="TranslationResponseParseError">Erro ao analisar resposta de tradução.</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">InÃcio</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">Adicionar</string> - <string name="Subtract">Subtrair</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">Vendo balizas de partÃculas (azul)</string> - <string name="BeaconPhysical">Vendo balizas de objetos fÃsicos (verde)</string> - <string name="BeaconScripted">Vendo balizas de objetos com script (vermelho)</string> - <string name="BeaconScriptedTouch">Vendo objeto com script com balizas com funcionalidade de toque (vermelho)</string> - <string name="BeaconSound">Vendo balizas de som (amarelo)</string> - <string name="BeaconMedia">Vendo balizas de mÃdia (branco)</string> - <string name="BeaconSun">Visualizando farol de direção do sol (alaranjado)</string> - <string name="BeaconMoon">Visualizando farol de direção da lua (roxo)</string> - <string name="ParticleHiding">Ocultar partÃculas</string> - <string name="Command_AboutLand_Label">Sobre terrenos</string> - <string name="Command_Appearance_Label">Aparência</string> - <string name="Command_Avatar_Label">Avatar</string> - <string name="Command_Build_Label">Construir</string> - <string name="Command_Chat_Label">Bate-papo</string> - <string name="Command_Conversations_Label">Conversas</string> - <string name="Command_Compass_Label">Bússola</string> - <string name="Command_Destinations_Label">Destinos</string> - <string name="Command_Environments_Label">Meus ambientes</string> - <string name="Command_Facebook_Label">Facebook</string> - <string name="Command_Flickr_Label">Flickr</string> - <string name="Command_Gestures_Label">Gestos</string> - <string name="Command_Grid_Status_Label">Status da grade</string> - <string name="Command_HowTo_Label">Como</string> - <string name="Command_Inventory_Label">Inventário</string> - <string name="Command_Map_Label">Mapa</string> - <string name="Command_Marketplace_Label">Mercado</string> - <string name="Command_MarketplaceListings_Label">Marketplace</string> - <string name="Command_MiniMap_Label">Mini Mapa</string> - <string name="Command_Move_Label">Andar/correr/voar</string> - <string name="Command_Outbox_Label">Caixa de saÃda do lojista</string> - <string name="Command_People_Label">Pessoas</string> - <string name="Command_Picks_Label">Destaques</string> - <string name="Command_Places_Label">Lugares</string> - <string name="Command_Preferences_Label">Preferências</string> - <string name="Command_Profile_Label">Perfil</string> - <string name="Command_Report_Abuse_Label">Relatar abuso</string> - <string name="Command_Search_Label">Buscar</string> - <string name="Command_Snapshot_Label">Foto</string> - <string name="Command_Speak_Label">Falar</string> - <string name="Command_Twitter_Label">Twitter</string> - <string name="Command_View_Label">Controles da câmera</string> - <string name="Command_Voice_Label">Configurações de voz</string> - <string name="Command_AboutLand_Tooltip">Informações sobre o terreno que você está visitando</string> - <string name="Command_Appearance_Tooltip">Mudar seu avatar</string> - <string name="Command_Avatar_Tooltip">Escolha um avatar completo</string> - <string name="Command_Build_Tooltip">Construindo objetos e redimensionando terreno</string> - <string name="Command_Chat_Tooltip">Bater papo com pessoas próximas usando texto</string> - <string name="Command_Conversations_Tooltip">Conversar com todos</string> - <string name="Command_Compass_Tooltip">Bússola</string> - <string name="Command_Destinations_Tooltip">Destinos de interesse</string> - <string name="Command_Environments_Tooltip">Meus ambientes</string> - <string name="Command_Facebook_Tooltip">Publicar no Facebook</string> - <string name="Command_Flickr_Tooltip">Carregar no Flickr</string> - <string name="Command_Gestures_Tooltip">Gestos para seu avatar</string> - <string name="Command_Grid_Status_Tooltip">Mostrar status da grade atual</string> - <string name="Command_HowTo_Tooltip">Como executar tarefas comuns</string> - <string name="Command_Inventory_Tooltip">Exibir e usar seus pertences</string> - <string name="Command_Map_Tooltip">Mapa-múndi</string> - <string name="Command_Marketplace_Tooltip">Faça compras</string> - <string name="Command_MarketplaceListings_Tooltip">Venda suas criações</string> - <string name="Command_MiniMap_Tooltip">Mostrar quem está aqui</string> - <string name="Command_Move_Tooltip">Movendo seu avatar</string> - <string name="Command_Outbox_Tooltip">Transferir itens para o seu mercado para venda</string> - <string name="Command_People_Tooltip">Amigos, grupos e pessoas próximas</string> - <string name="Command_Picks_Tooltip">Lugares mostrados como favoritos em seu perfil</string> - <string name="Command_Places_Tooltip">Lugares salvos</string> - <string name="Command_Preferences_Tooltip">Preferências</string> - <string name="Command_Profile_Tooltip">Edite ou visualize seu perfil</string> - <string name="Command_Report_Abuse_Tooltip">Relatar abuso</string> - <string name="Command_Search_Tooltip">Encontre lugares, eventos, pessoas</string> - <string name="Command_Snapshot_Tooltip">Tirar uma foto</string> - <string name="Command_Speak_Tooltip">Fale com pessoas próximas usando seu microfone</string> - <string name="Command_Twitter_Tooltip">Twitter</string> - <string name="Command_View_Tooltip">Alterar o ângulo da câmera</string> - <string name="Command_Voice_Tooltip">Controles de volume das chamadas e pessoas próximas a você no mundo virtual</string> - <string name="Toolbar_Bottom_Tooltip">atualmente na sua barra de ferramentas inferior</string> - <string name="Toolbar_Left_Tooltip">atualmente na sua barra de ferramentas esquerda</string> - <string name="Toolbar_Right_Tooltip">atualmente na sua barra de ferramentas direita</string> - <string name="Retain%">Reter%</string> - <string name="Detail">Detalhe</string> - <string name="Better Detail">Detalhamento maior</string> - <string name="Surface">SuperfÃcie</string> - <string name="Solid">Sólido</string> - <string name="Wrap">Conclusão</string> - <string name="Preview">Visualizar</string> - <string name="Normal">Normal</string> - <string name="Pathfinding_Wiki_URL">http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer</string> - <string name="Pathfinding_Object_Attr_None">Nenhum</string> - <string name="Pathfinding_Object_Attr_Permanent">Afeta o navmesh</string> - <string name="Pathfinding_Object_Attr_Character">Personagem</string> - <string name="Pathfinding_Object_Attr_MultiSelect">(Múltiplo)</string> - <string name="snapshot_quality_very_low">Muito baixo</string> - <string name="snapshot_quality_low">Baixo</string> - <string name="snapshot_quality_medium">Médio</string> - <string name="snapshot_quality_high">Alto</string> - <string name="snapshot_quality_very_high">Muito alto</string> - <string name="TeleportMaturityExceeded">O residente não pode visitar a região.</string> - <string name="UserDictionary">[Usuário]</string> - <string name="experience_tools_experience">Experiência</string> - <string name="ExperienceNameNull">(nenhuma experiência)</string> - <string name="ExperienceNameUntitled">(experiência sem tÃtulo)</string> - <string name="Land-Scope">Dentro do terreno</string> - <string name="Grid-Scope">Dentro da grade</string> - <string name="Allowed_Experiences_Tab">PERMITIDO</string> - <string name="Blocked_Experiences_Tab">BLOQUEADO</string> - <string name="Contrib_Experiences_Tab">COLABORADOR</string> - <string name="Admin_Experiences_Tab">ADMINISTRADOR</string> - <string name="Recent_Experiences_Tab">RECENTE</string> - <string name="Owned_Experiences_Tab">PRÓPRIAS</string> - <string name="ExperiencesCounter">([EXPERIENCES], máx. [MAXEXPERIENCES])</string> - <string name="ExperiencePermission1">assumir seus controles</string> - <string name="ExperiencePermission3">acionar animações no seu avatar</string> - <string name="ExperiencePermission4">anexar ao avatar</string> - <string name="ExperiencePermission9">rastrear sua câmera</string> - <string name="ExperiencePermission10">controlar sua câmera</string> - <string name="ExperiencePermission11">teletransportar você</string> - <string name="ExperiencePermission12">aceitar automaticamente permissões de experiência</string> - <string name="ExperiencePermission16">forçar o avatar a sentar</string> - <string name="ExperiencePermission17">alterar sua configurações de ambiente</string> - <string name="ExperiencePermissionShortUnknown">realizar uma operação desconhecida: [Permission]</string> - <string name="ExperiencePermissionShort1">Assumir o controle</string> - <string name="ExperiencePermissionShort3">Acionar animações</string> - <string name="ExperiencePermissionShort4">Anexar</string> - <string name="ExperiencePermissionShort9">Rastrear câmera</string> - <string name="ExperiencePermissionShort10">Controlar câmera</string> - <string name="ExperiencePermissionShort11">Teletransportar</string> - <string name="ExperiencePermissionShort12">Autorização</string> - <string name="ExperiencePermissionShort16">Sentar</string> - <string name="ExperiencePermissionShort17">Ambiente</string> - <string name="logging_calls_disabled_log_empty">As conversas não estão sendo registradas. Para começar a manter um registro, selecione "Salvar: apenas registro" ou "Salvar: registro e transcrições" em Preferências> Bate-papo.</string> - <string name="logging_calls_disabled_log_not_empty">Nenhuma conversa será registrada. Para recomeçar a gravação de registros, selecione "Salvar: apenas registro" ou "Salvar: registro e transcrições" em Preferências> Bate-papo.</string> - <string name="logging_calls_enabled_log_empty">Não há conversas registradas. Depois que você entrar em contato com alguém, ou alguém entrar em contato com você, um registro será exibido aqui.</string> - <string name="loading_chat_logs">Carregando...</string> - <string name="na">n/d</string> - <string name="preset_combo_label">-Lista vazia-</string> - <string name="Default">Padrão</string> - <string name="none_paren_cap">(nenhum)</string> - <string name="no_limit">Sem limite</string> - <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">A forma fÃsica contém triângulos muito pequenos. Tente simplificar o modelo fÃsico.</string> - <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH">A forma fÃsica contém dados de confirmação ruins. Tente consertar o modelo fÃsico.</string> - <string name="Mav_Details_MAV_UNKNOWN_VERSION">A forma fÃsica não tem a versão correta. Defina a versão correta para o modelo fÃsico.</string> - <string name="couldnt_resolve_host">O DNS não pode resolver o nome do host([HOSTNAME]). +(ex. "/caminho para/editor" "%s") + </string> + <string name="ExternalEditorCommandParseError"> + Error ao analisar o comando do editor externo. + </string> + <string name="ExternalEditorFailedToRun"> + Falha de execução do editor externo. + </string> + <string name="TranslationFailed"> + Falha na tradução: [REASON] + </string> + <string name="TranslationResponseParseError"> + Erro ao analisar resposta de tradução. + </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"> + InÃcio + </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"> + Adicionar + </string> + <string name="Subtract"> + Subtrair + </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"> + Vendo balizas de partÃculas (azul) + </string> + <string name="BeaconPhysical"> + Vendo balizas de objetos fÃsicos (verde) + </string> + <string name="BeaconScripted"> + Vendo balizas de objetos com script (vermelho) + </string> + <string name="BeaconScriptedTouch"> + Vendo objeto com script com balizas com funcionalidade de toque (vermelho) + </string> + <string name="BeaconSound"> + Vendo balizas de som (amarelo) + </string> + <string name="BeaconMedia"> + Vendo balizas de mÃdia (branco) + </string> + <string name="BeaconSun"> + Visualizando farol de direção do sol (alaranjado) + </string> + <string name="BeaconMoon"> + Visualizando farol de direção da lua (roxo) + </string> + <string name="ParticleHiding"> + Ocultar partÃculas + </string> + <string name="Command_AboutLand_Label"> + Sobre terrenos + </string> + <string name="Command_Appearance_Label"> + Aparência + </string> + <string name="Command_Avatar_Label"> + Avatar + </string> + <string name="Command_Build_Label"> + Construir + </string> + <string name="Command_Chat_Label"> + Bate-papo + </string> + <string name="Command_Conversations_Label"> + Conversas + </string> + <string name="Command_Compass_Label"> + Bússola + </string> + <string name="Command_Destinations_Label"> + Destinos + </string> + <string name="Command_Environments_Label"> + Meus ambientes + </string> + <string name="Command_Facebook_Label"> + Facebook + </string> + <string name="Command_Flickr_Label"> + Flickr + </string> + <string name="Command_Gestures_Label"> + Gestos + </string> + <string name="Command_Grid_Status_Label"> + Status da grade + </string> + <string name="Command_HowTo_Label"> + Como + </string> + <string name="Command_Inventory_Label"> + Inventário + </string> + <string name="Command_Map_Label"> + Mapa + </string> + <string name="Command_Marketplace_Label"> + Mercado + </string> + <string name="Command_MarketplaceListings_Label"> + Marketplace + </string> + <string name="Command_MiniMap_Label"> + Mini Mapa + </string> + <string name="Command_Move_Label"> + Andar/correr/voar + </string> + <string name="Command_Outbox_Label"> + Caixa de saÃda do lojista + </string> + <string name="Command_People_Label"> + Pessoas + </string> + <string name="Command_Picks_Label"> + Destaques + </string> + <string name="Command_Places_Label"> + Lugares + </string> + <string name="Command_Preferences_Label"> + Preferências + </string> + <string name="Command_Profile_Label"> + Perfil + </string> + <string name="Command_Report_Abuse_Label"> + Relatar abuso + </string> + <string name="Command_Search_Label"> + Buscar + </string> + <string name="Command_Snapshot_Label"> + Foto + </string> + <string name="Command_Speak_Label"> + Falar + </string> + <string name="Command_Twitter_Label"> + Twitter + </string> + <string name="Command_View_Label"> + Controles da câmera + </string> + <string name="Command_Voice_Label"> + Configurações de voz + </string> + <string name="Command_AboutLand_Tooltip"> + Informações sobre o terreno que você está visitando + </string> + <string name="Command_Appearance_Tooltip"> + Mudar seu avatar + </string> + <string name="Command_Avatar_Tooltip"> + Escolha um avatar completo + </string> + <string name="Command_Build_Tooltip"> + Construindo objetos e redimensionando terreno + </string> + <string name="Command_Chat_Tooltip"> + Bater papo com pessoas próximas usando texto + </string> + <string name="Command_Conversations_Tooltip"> + Conversar com todos + </string> + <string name="Command_Compass_Tooltip"> + Bússola + </string> + <string name="Command_Destinations_Tooltip"> + Destinos de interesse + </string> + <string name="Command_Environments_Tooltip"> + Meus ambientes + </string> + <string name="Command_Facebook_Tooltip"> + Publicar no Facebook + </string> + <string name="Command_Flickr_Tooltip"> + Carregar no Flickr + </string> + <string name="Command_Gestures_Tooltip"> + Gestos para seu avatar + </string> + <string name="Command_Grid_Status_Tooltip"> + Mostrar status da grade atual + </string> + <string name="Command_HowTo_Tooltip"> + Como executar tarefas comuns + </string> + <string name="Command_Inventory_Tooltip"> + Exibir e usar seus pertences + </string> + <string name="Command_Map_Tooltip"> + Mapa-múndi + </string> + <string name="Command_Marketplace_Tooltip"> + Faça compras + </string> + <string name="Command_MarketplaceListings_Tooltip"> + Venda suas criações + </string> + <string name="Command_MiniMap_Tooltip"> + Mostrar quem está aqui + </string> + <string name="Command_Move_Tooltip"> + Movendo seu avatar + </string> + <string name="Command_Outbox_Tooltip"> + Transferir itens para o seu mercado para venda + </string> + <string name="Command_People_Tooltip"> + Amigos, grupos e pessoas próximas + </string> + <string name="Command_Picks_Tooltip"> + Lugares mostrados como favoritos em seu perfil + </string> + <string name="Command_Places_Tooltip"> + Lugares salvos + </string> + <string name="Command_Preferences_Tooltip"> + Preferências + </string> + <string name="Command_Profile_Tooltip"> + Edite ou visualize seu perfil + </string> + <string name="Command_Report_Abuse_Tooltip"> + Relatar abuso + </string> + <string name="Command_Search_Tooltip"> + Encontre lugares, eventos, pessoas + </string> + <string name="Command_Snapshot_Tooltip"> + Tirar uma foto + </string> + <string name="Command_Speak_Tooltip"> + Fale com pessoas próximas usando seu microfone + </string> + <string name="Command_Twitter_Tooltip"> + Twitter + </string> + <string name="Command_View_Tooltip"> + Alterar o ângulo da câmera + </string> + <string name="Command_Voice_Tooltip"> + Controles de volume das chamadas e pessoas próximas a você no mundo virtual + </string> + <string name="Toolbar_Bottom_Tooltip"> + atualmente na sua barra de ferramentas inferior + </string> + <string name="Toolbar_Left_Tooltip"> + atualmente na sua barra de ferramentas esquerda + </string> + <string name="Toolbar_Right_Tooltip"> + atualmente na sua barra de ferramentas direita + </string> + <string name="Retain%"> + Reter% + </string> + <string name="Detail"> + Detalhe + </string> + <string name="Better Detail"> + Detalhamento maior + </string> + <string name="Surface"> + SuperfÃcie + </string> + <string name="Solid"> + Sólido + </string> + <string name="Wrap"> + Conclusão + </string> + <string name="Preview"> + Visualizar + </string> + <string name="Normal"> + Normal + </string> + <string name="Pathfinding_Wiki_URL"> + http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer + </string> + <string name="Pathfinding_Object_Attr_None"> + Nenhum + </string> + <string name="Pathfinding_Object_Attr_Permanent"> + Afeta o navmesh + </string> + <string name="Pathfinding_Object_Attr_Character"> + Personagem + </string> + <string name="Pathfinding_Object_Attr_MultiSelect"> + (Múltiplo) + </string> + <string name="snapshot_quality_very_low"> + Muito baixo + </string> + <string name="snapshot_quality_low"> + Baixo + </string> + <string name="snapshot_quality_medium"> + Médio + </string> + <string name="snapshot_quality_high"> + Alto + </string> + <string name="snapshot_quality_very_high"> + Muito alto + </string> + <string name="TeleportMaturityExceeded"> + O residente não pode visitar a região. + </string> + <string name="UserDictionary"> + [Usuário] + </string> + <string name="experience_tools_experience"> + Experiência + </string> + <string name="ExperienceNameNull"> + (nenhuma experiência) + </string> + <string name="ExperienceNameUntitled"> + (experiência sem tÃtulo) + </string> + <string name="Land-Scope"> + Dentro do terreno + </string> + <string name="Grid-Scope"> + Dentro da grade + </string> + <string name="Allowed_Experiences_Tab"> + PERMITIDO + </string> + <string name="Blocked_Experiences_Tab"> + BLOQUEADO + </string> + <string name="Contrib_Experiences_Tab"> + COLABORADOR + </string> + <string name="Admin_Experiences_Tab"> + ADMINISTRADOR + </string> + <string name="Recent_Experiences_Tab"> + RECENTE + </string> + <string name="Owned_Experiences_Tab"> + PRÓPRIAS + </string> + <string name="ExperiencesCounter"> + ([EXPERIENCES], máx. [MAXEXPERIENCES]) + </string> + <string name="ExperiencePermission1"> + assumir seus controles + </string> + <string name="ExperiencePermission3"> + acionar animações no seu avatar + </string> + <string name="ExperiencePermission4"> + anexar ao avatar + </string> + <string name="ExperiencePermission9"> + rastrear sua câmera + </string> + <string name="ExperiencePermission10"> + controlar sua câmera + </string> + <string name="ExperiencePermission11"> + teletransportar você + </string> + <string name="ExperiencePermission12"> + aceitar automaticamente permissões de experiência + </string> + <string name="ExperiencePermission16"> + forçar o avatar a sentar + </string> + <string name="ExperiencePermission17"> + alterar sua configurações de ambiente + </string> + <string name="ExperiencePermissionShortUnknown"> + realizar uma operação desconhecida: [Permission] + </string> + <string name="ExperiencePermissionShort1"> + Assumir o controle + </string> + <string name="ExperiencePermissionShort3"> + Acionar animações + </string> + <string name="ExperiencePermissionShort4"> + Anexar + </string> + <string name="ExperiencePermissionShort9"> + Rastrear câmera + </string> + <string name="ExperiencePermissionShort10"> + Controlar câmera + </string> + <string name="ExperiencePermissionShort11"> + Teletransportar + </string> + <string name="ExperiencePermissionShort12"> + Autorização + </string> + <string name="ExperiencePermissionShort16"> + Sentar + </string> + <string name="ExperiencePermissionShort17"> + Ambiente + </string> + <string name="logging_calls_disabled_log_empty"> + As conversas não estão sendo registradas. Para começar a manter um registro, selecione "Salvar: apenas registro" ou "Salvar: registro e transcrições" em Preferências> Bate-papo. + </string> + <string name="logging_calls_disabled_log_not_empty"> + Nenhuma conversa será registrada. Para recomeçar a gravação de registros, selecione "Salvar: apenas registro" ou "Salvar: registro e transcrições" em Preferências> Bate-papo. + </string> + <string name="logging_calls_enabled_log_empty"> + Não há conversas registradas. Depois que você entrar em contato com alguém, ou alguém entrar em contato com você, um registro será exibido aqui. + </string> + <string name="loading_chat_logs"> + Carregando... + </string> + <string name="na"> + n/d + </string> + <string name="preset_combo_label"> + -Lista vazia- + </string> + <string name="Default"> + Padrão + </string> + <string name="none_paren_cap"> + (nenhum) + </string> + <string name="no_limit"> + Sem limite + </string> + <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES"> + A forma fÃsica contém triângulos muito pequenos. Tente simplificar o modelo fÃsico. + </string> + <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH"> + A forma fÃsica contém dados de confirmação ruins. Tente consertar o modelo fÃsico. + </string> + <string name="Mav_Details_MAV_UNKNOWN_VERSION"> + A forma fÃsica não tem a versão correta. Defina a versão correta para o modelo fÃsico. + </string> + <string name="couldnt_resolve_host"> + O DNS não pode resolver o nome do host([HOSTNAME]). Verifique se você pode conectar ao site www.secondlife.com . Se você puder, mas se continuar recebendo esta mensagem de erro, vá à sessão -Suporte no site Secondlife.com e informe o problema.</string> - <string name="ssl_peer_certificate">O servidor de acesso não pôde verificá-lo pelo SSL. +Suporte no site Secondlife.com e informe o problema. + </string> + <string name="ssl_peer_certificate"> + O servidor de acesso não pôde verificá-lo pelo SSL. Se você continuar recebendo esta mensagem de erro, vá à sessão Suporte no site Secondlife.com -e informe o problema.</string> - <string name="ssl_connect_error">Geralmente, esse erro significa que o relógio do seu computador não está com o horário correto. +e informe o problema. + </string> + <string name="ssl_connect_error"> + Geralmente, esse erro significa que o relógio do seu computador não está com o horário correto. Vá em Painel de Controles e certifique-se de que a hora e data estejam corretos. Além disso, verifique se a sua rede e firewall estejam corretos. Se você continuar recebendo esta mensagem de erro, vá à sessão Suporte no site Secondlife.com e informe o problema. -[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de conhecimento]</string> +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de conhecimento] + </string> </strings> diff --git a/indra/newview/skins/default/xui/pt/teleport_strings.xml b/indra/newview/skins/default/xui/pt/teleport_strings.xml index 0cbf4dccd8..014e44a175 100644 --- a/indra/newview/skins/default/xui/pt/teleport_strings.xml +++ b/indra/newview/skins/default/xui/pt/teleport_strings.xml @@ -1,38 +1,94 @@ <?xml version="1.0" ?> <teleport_messages> <message_set name="errors"> - <message name="invalid_tport">Houve um problema ao processar o teletransporte. Talvez seja preciso sair e entrar do Second Life para fazer o teletransporte. -Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE].</message> - <message name="invalid_region_handoff">Problema encontrado ao processar a passagem de regiões. Talvez seja preciso sair e entrar do Second Life atravessar regiões novamente. -Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE].</message> - <message name="blocked_tport">Desculpe, teletransportes estão atualmente bloqueados. Tente novamente dentro de alguns instantes. Se você continuar com problemas de teletransporte, por favor tente deslogar e relogar para resolver o problema.</message> - <message name="nolandmark_tport">Desculpe, mas o sistema não conseguiu localizar a landmark de destino.</message> - <message name="timeout_tport">Desculpe, não foi possÃvel para o sistema executar o teletransporte. Tente novamente dentro de alguns instantes.</message> - <message name="NoHelpIslandTP">Não é possÃvel se teletransportar de volta à Ilha Welcome. -Vá para a 'Ilha Welcome Pública' para repetir o tutorial.</message> - <message name="noaccess_tport">Desculpe, você não tem acesso ao destino deste teletransporte.</message> - <message name="missing_attach_tport">Seu anexos ainda não chegaram. Tente esperar por alguns momentos ou deslogar e logar antes de tentar teleransportar-se novamente.</message> - <message name="too_many_uploads_tport">Afluxo nesta região é atualmente tão alto que seu pedido de teletransporte não será possÃvel em tempo oportuno. Por favor, tente novamente em alguns minutos ou vá a uma área menos ocupada.</message> - <message name="expired_tport">Desculpe, mas o sistema não conseguiu concluir o seu pedido de teletransporte em tempo hábil. Por favor, tente novamente em alguns minutos.</message> - <message name="expired_region_handoff">Desculpe, mas o sistema não pôde concluir a sua travessia de região em tempo hábil. Por favor, tente novamente em alguns minutos.</message> - <message name="no_host">Não foi possÃvel encontrar o destino do teletransporte. O destino pode estar temporariamente indisponÃvel ou não existir mais. Por favor, tente novamente em poucos minutos.</message> - <message name="no_inventory_host">O sistema de inventário está indisponÃvel no momento.</message> - <message name="MustGetAgeRegion">Você deve ter 18 anos ou mais para acessar esta região.</message> - <message name="RegionTPSpecialUsageBlocked">Não é possÃvel inserir a região. '[REGION_NAME]' é uma Região de Skill Gaming, portanto você deve atender certos critérios para poder entrar. Para maiores detalhes, consulte as [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ].</message> - <message name="preexisting_tport">Desculpe, mas o sistema falhou ao iniciar o seu teletransporte. Por favor, tente novamente dentro de alguns minutos.</message> + <message name="invalid_tport"> + Houve um problema ao processar o teletransporte. Talvez seja preciso sair e entrar do Second Life para fazer o teletransporte. +Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE]. + </message> + <message name="invalid_region_handoff"> + Problema encontrado ao processar a passagem de regiões. Talvez seja preciso sair e entrar do Second Life atravessar regiões novamente. +Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE]. + </message> + <message name="blocked_tport"> + Desculpe, teletransportes estão atualmente bloqueados. Tente novamente dentro de alguns instantes. Se você continuar com problemas de teletransporte, por favor tente deslogar e relogar para resolver o problema. + </message> + <message name="nolandmark_tport"> + Desculpe, mas o sistema não conseguiu localizar a landmark de destino. + </message> + <message name="timeout_tport"> + Desculpe, não foi possÃvel para o sistema executar o teletransporte. Tente novamente dentro de alguns instantes. + </message> + <message name="NoHelpIslandTP"> + Não é possÃvel se teletransportar de volta à Ilha Welcome. +Vá para a 'Ilha Welcome Pública' para repetir o tutorial. + </message> + <message name="noaccess_tport"> + Desculpe, você não tem acesso ao destino deste teletransporte. + </message> + <message name="missing_attach_tport"> + Seu anexos ainda não chegaram. Tente esperar por alguns momentos ou deslogar e logar antes de tentar teleransportar-se novamente. + </message> + <message name="too_many_uploads_tport"> + Afluxo nesta região é atualmente tão alto que seu pedido de teletransporte não será possÃvel em tempo oportuno. Por favor, tente novamente em alguns minutos ou vá a uma área menos ocupada. + </message> + <message name="expired_tport"> + Desculpe, mas o sistema não conseguiu concluir o seu pedido de teletransporte em tempo hábil. Por favor, tente novamente em alguns minutos. + </message> + <message name="expired_region_handoff"> + Desculpe, mas o sistema não pôde concluir a sua travessia de região em tempo hábil. Por favor, tente novamente em alguns minutos. + </message> + <message name="no_host"> + Não foi possÃvel encontrar o destino do teletransporte. O destino pode estar temporariamente indisponÃvel ou não existir mais. Por favor, tente novamente em poucos minutos. + </message> + <message name="no_inventory_host"> + O sistema de inventário está indisponÃvel no momento. + </message> + <message name="MustGetAgeRegion"> + Você deve ter 18 anos ou mais para acessar esta região. + </message> + <message name="RegionTPSpecialUsageBlocked"> + Não é possÃvel inserir a região. '[REGION_NAME]' é uma Região de Skill Gaming, portanto você deve atender certos critérios para poder entrar. Para maiores detalhes, consulte as [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ]. + </message> + <message name="preexisting_tport"> + Desculpe, mas o sistema falhou ao iniciar o seu teletransporte. Por favor, tente novamente dentro de alguns minutos. + </message> </message_set> <message_set name="progress"> - <message name="sending_dest">Enviando para o destino.</message> - <message name="redirecting">Redirecionando para uma localidade diferente.</message> - <message name="relaying">Transferindo para o destino.</message> - <message name="sending_home">Enviando solicitação de localização de inÃcio.</message> - <message name="sending_landmark">Enviando solicitação de localização de landmark.</message> - <message name="completing">Completando teletransporte.</message> - <message name="completed_from">Teletransporte de [T_SLURL] concluÃdo</message> - <message name="resolving">Identificando destino.</message> - <message name="contacting">Contactando nova região.</message> - <message name="arriving">Chegando...</message> - <message name="requesting">Solicitando teletransporte...</message> - <message name="pending">Teletransporte pendente...</message> + <message name="sending_dest"> + Enviando para o destino. + </message> + <message name="redirecting"> + Redirecionando para uma localidade diferente. + </message> + <message name="relaying"> + Transferindo para o destino. + </message> + <message name="sending_home"> + Enviando solicitação de localização de inÃcio. + </message> + <message name="sending_landmark"> + Enviando solicitação de localização de landmark. + </message> + <message name="completing"> + Completando teletransporte. + </message> + <message name="completed_from"> + Teletransporte de [T_SLURL] concluÃdo + </message> + <message name="resolving"> + Identificando destino. + </message> + <message name="contacting"> + Contactando nova região. + </message> + <message name="arriving"> + Chegando... + </message> + <message name="requesting"> + Solicitando teletransporte... + </message> + <message name="pending"> + Teletransporte pendente... + </message> </message_set> </teleport_messages> diff --git a/indra/newview/skins/default/xui/ru/floater_avatar_textures.xml b/indra/newview/skins/default/xui/ru/floater_avatar_textures.xml index cb39f66247..b8906eebbd 100644 --- a/indra/newview/skins/default/xui/ru/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/ru/floater_avatar_textures.xml @@ -14,7 +14,7 @@ ТекÑтуры </text> <button label="Вывод ID на конÑоль" label_selected="Вывод" name="Dump"/> - <panel name="scroll_content_panel"> + <panel name="scroll_content_panel2"> <texture_picker label="ВолоÑÑ‹" name="hair-baked"/> <texture_picker label="ВолоÑÑ‹" name="hair_grain"/> <texture_picker label="Ðльфа волоÑ" name="hair_alpha"/> diff --git a/indra/newview/skins/default/xui/ru/floater_search.xml b/indra/newview/skins/default/xui/ru/floater_search.xml deleted file mode 100644 index 405a6598ac..0000000000 --- a/indra/newview/skins/default/xui/ru/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> - <floater.string name="loading_text"> - Загрузка... - </floater.string> - <floater.string name="done_text"> - Готово - </floater.string> - <layout_stack name="stack1"> - <layout_panel name="browser_layout"> - <text name="refresh_search"> - Повторить поиÑк, чтобы показать текущий уровень творца - </text> - </layout_panel> - </layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml index f07e12e0ed..adc612dfd8 100644 --- a/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@ Сохранение Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² инвентаре Ñтоит L$[UPLOAD_COST]. Чтобы Ñохранить его как текÑтуру, выберите один из квадратных форматов. </text> <combo_box label="Размер" name="texture_size_combo"> - <combo_box.item label="Текущее окно (512x512)" name="CurrentWindow"/> + <combo_box.item label="Текущее окно" name="CurrentWindow"/> <combo_box.item label="Маленький (128x128)" name="Small(128x128)"/> <combo_box.item label="Средний (256x256)" name="Medium(256x256)"/> <combo_box.item label="Большой (512x512)" name="Large(512x512)"/> diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml index 7ba03ee0c9..f7fda0b1dc 100644 --- a/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_snapshot_options"> <button label="Сохранить на диÑке" name="save_to_computer_btn"/> - <button label="Сохранить в инвентаре (L$[AMOUNT])" name="save_to_inventory_btn"/> + <button label="Сохранить в инвентаре" name="save_to_inventory_btn"/> <button label="ПоделитьÑÑ Ð² профиле" name="save_to_profile_btn"/> <button label="ПоделитьÑÑ Ð² Facebook" name="send_to_facebook_btn"/> <button label="ПоделитьÑÑ Ð² Twitter" name="send_to_twitter_btn"/> diff --git a/indra/newview/skins/default/xui/ru/panel_status_bar.xml b/indra/newview/skins/default/xui/ru/panel_status_bar.xml index 124b8f2cff..1fd9b94406 100644 --- a/indra/newview/skins/default/xui/ru/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/ru/panel_status_bar.xml @@ -6,9 +6,6 @@ <panel.string name="bandwidth_tooltip"> Ширина канала </panel.string> - <panel.string name="time"> - [hour, datetime, slt]:[min, datetime, slt] [timezone,datetime, slt] - </panel.string> <panel.string name="timeTooltip"> [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] </panel.string> diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index 649d5e7107..682acd9191 100644 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -1,8 +1,4 @@ <?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="SECOND_LIFE"> Second Life @@ -42,7 +38,7 @@ ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¿Ð¾ÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ [BUILD_CONFIG] </string> <string name="AboutPosition"> - Ð’Ñ‹ в точке [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] в регионе «[REGION]», раÑположенном на <nolink>[HOSTNAME]</nolink> ([HOSTIP]) + Ð’Ñ‹ в точке [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] в регионе «[REGION]», раÑположенном на <nolink>[HOSTNAME]</nolink> SLURL: <nolink>[SLURL]</nolink> (глобальные координаты [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] @@ -69,7 +65,6 @@ SLURL: <nolink>[SLURL]</nolink> Ширина канала: [NET_BANDWITH] кбит/Ñ ÐšÐ¾Ñффициент детализации: [LOD_FACTOR] КачеÑтво визуализации: [RENDER_QUALITY] -РаÑÑˆÐ¸Ñ€ÐµÐ½Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ оÑвещениÑ: [GPU_SHADERS] ПамÑть текÑтур: [TEXTURE_MEMORY] МБ </string> <string name="AboutOSXHiDPI"> @@ -1658,7 +1653,7 @@ support@secondlife.com. Тариф завиÑит от типа вашей подпиÑки. Тарифы Ð´Ð»Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ² раÑширенных пакетов меньше. [https://secondlife.com/my/account/membership.php? Узнать больше] </string> <string name="Open landmarks"> - Открыть Ñохраненные локации + Открыть Ñохраненные локации </string> <string name="Unconstrained"> Без ограничений @@ -2871,8 +2866,8 @@ support@secondlife.com. <string name="."> . </string> - <string name="'"> - ' + <string name="'"> + ' </string> <string name="---"> --- @@ -2984,7 +2979,7 @@ support@secondlife.com. Ðе удаетÑÑ Ð·Ð°Ð¿ÑƒÑтить приложение [APP_NAME], поÑкольку драйверы видеокарты неправильно уÑтановлены, уÑтарели или предназначены Ð´Ð»Ñ Ð¾Ð±Ð¾Ñ€ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ, которое не поддерживаетÑÑ. УÑтановите или переуÑтановите поÑледние драйверы видеокарты. ЕÑли Ñто Ñообщение продолжает отображатьÑÑ, обратитеÑÑŒ на Ñайт [SUPPORT_SITE]. </string> - <string name="5 O'Clock Shadow"> + <string name="5 O'Clock Shadow"> Жидкие </string> <string name="All White"> @@ -4577,6 +4572,10 @@ support@secondlife.com. <string name="inventory_folder_offered-im"> Предложена папка Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Â«[ITEM_NAME]» </string> + <string name="bot_warning"> + Ð’Ñ‹ общаетеÑÑŒ Ñ Ð±Ð¾Ñ‚Ð¾Ð¼ [NAME]. Ðе передавайте личные данные. +Подробнее на https://second.life/scripted-agents. + </string> <string name="share_alert"> ПеретаÑкивайте вещи из Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ñюда </string> @@ -5144,7 +5143,7 @@ support@secondlife.com. <string name="ExternalEditorNotFound"> Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ указанный внешний редактор. Попробуйте взÑть путь к редактору в двойные кавычки -(например "/path to my/editor" "%s") +(например "/path to my/editor" "%s") </string> <string name="ExternalEditorCommandParseError"> Ошибка анализа командной Ñтроки Ð´Ð»Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ редактора. diff --git a/indra/newview/skins/default/xui/tr/floater_avatar_textures.xml b/indra/newview/skins/default/xui/tr/floater_avatar_textures.xml index b519cfa1a9..2dabab2bca 100644 --- a/indra/newview/skins/default/xui/tr/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/tr/floater_avatar_textures.xml @@ -14,7 +14,7 @@ Dokular Dokular </text> <button label="Kimlikleri Konsole Yığ" label_selected="Yığ" name="Dump"/> - <panel name="scroll_content_panel"> + <panel name="scroll_content_panel2"> <texture_picker label="Saç" name="hair-baked"/> <texture_picker label="Saç" name="hair_grain"/> <texture_picker label="Saç Alfası" name="hair_alpha"/> diff --git a/indra/newview/skins/default/xui/tr/floater_search.xml b/indra/newview/skins/default/xui/tr/floater_search.xml deleted file mode 100644 index 08c1e5162c..0000000000 --- a/indra/newview/skins/default/xui/tr/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> - <floater.string name="loading_text"> - Yükleniyor... - </floater.string> - <floater.string name="done_text"> - Tamamlandı - </floater.string> - <layout_stack name="stack1"> - <layout_panel name="browser_layout"> - <text name="refresh_search"> - Mevcut Yönetici seviyesini dikkate alarak aramayı yenile - </text> - </layout_panel> - </layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml index be5940c4b9..160cba8700 100644 --- a/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@ Bir görüntüyü envanterinize kaydetmenin maliyeti L$[UPLOAD_COST] olur. Görüntünüzü bir doku olarak kaydetmek için kare formatlardan birini seçin. </text> <combo_box label="Çözünürlük" name="texture_size_combo"> - <combo_box.item label="Mevcut Pencere(512x512)" name="CurrentWindow"/> + <combo_box.item label="Mevcut Pencere" name="CurrentWindow"/> <combo_box.item label="Küçük (128x128)" name="Small(128x128)"/> <combo_box.item label="Orta (256x256)" name="Medium(256x256)"/> <combo_box.item label="Büyük (512x512)" name="Large(512x512)"/> diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml index 1b48bbeec2..a028710b98 100644 --- a/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_snapshot_options"> <button label="Diske Kaydet" name="save_to_computer_btn"/> - <button label="Envantere Kaydet (L$[AMOUNT])" name="save_to_inventory_btn"/> + <button label="Envantere Kaydet" name="save_to_inventory_btn"/> <button label="Profil Akışında PaylaÅŸ" name="save_to_profile_btn"/> <button label="Facebook'ta PaylaÅŸ" name="send_to_facebook_btn"/> <button label="Twitter'da PaylaÅŸ" name="send_to_twitter_btn"/> diff --git a/indra/newview/skins/default/xui/tr/panel_status_bar.xml b/indra/newview/skins/default/xui/tr/panel_status_bar.xml index 616960ffb4..9ae5a251ec 100644 --- a/indra/newview/skins/default/xui/tr/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/tr/panel_status_bar.xml @@ -6,7 +6,7 @@ <panel.string name="bandwidth_tooltip"> Bant geniÅŸliÄŸi </panel.string> - <panel.string name="time"> + <panel.string name="time_ampm"> [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] </panel.string> <panel.string name="timeTooltip"> diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml index f80d8e3382..5c3f7ae256 100644 --- a/indra/newview/skins/default/xui/tr/strings.xml +++ b/indra/newview/skins/default/xui/tr/strings.xml @@ -1,8 +1,4 @@ <?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="SECOND_LIFE"> Second Life @@ -42,7 +38,7 @@ Yapı Konfigürasyonu [BUILD_CONFIG] </string> <string name="AboutPosition"> - <nolink>[HOSTNAME]</nolink> ([HOSTIP]) üzerinde bulunan [REGION] içerisinde [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] konumundasınız + <nolink>[HOSTNAME]</nolink> üzerinde bulunan [REGION] içerisinde [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] konumundasınız SLURL: <nolink>[SLURL]</nolink> (küresel koordinatlar [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] @@ -69,7 +65,6 @@ UI Ölçeklendirme: [UI_SCALE] Bant geniÅŸliÄŸi: [NET_BANDWITH]kbit/s LOD faktörü: [LOD_FACTOR] İşleme kalitesi: [RENDER_QUALITY] -GeliÅŸmiÅŸ Aydınlatma Modeli: [GPU_SHADERS] Doku belleÄŸi: [TEXTURE_MEMORY]MB </string> <string name="AboutOSXHiDPI"> @@ -89,7 +84,7 @@ Ses Sunucusu Sürümü: [VOICE_VERSION] [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt] </string> <string name="ErrorFetchingServerReleaseNotesURL"> - Sunucu sürümü notları URL'si alınırken hata oluÅŸtu. + Sunucu sürümü notları URL'si alınırken hata oluÅŸtu. </string> <string name="BuildConfiguration"> Yapı Konfigürasyonu @@ -206,7 +201,7 @@ Ses Sunucusu Sürümü: [VOICE_VERSION] http://secondlife.com/download </string> <string name="LoginFailedViewerNotPermitted"> - Kullandığınız görüntüleyici ile artık Second Life'a eriÅŸemezsiniz. Yeni bir görüntüleyiciyi karşıdan yüklemek için lütfen ÅŸu sayfayı ziyaret edin: + Kullandığınız görüntüleyici ile artık Second Life'a eriÅŸemezsiniz. Yeni bir görüntüleyiciyi karşıdan yüklemek için lütfen ÅŸu sayfayı ziyaret edin: http://secondlife.com/download Daha fazla bilgi edinmek için asağıdaki SSS sayfamızı ziyaret edin: @@ -248,10 +243,10 @@ GüncelleÅŸtirmeler için www.secondlife.com/status adresini kontrol edin. <string name="LoginFailedPremiumOnly"> Second Life üzerindeki aktif kullanıcıların olası en iyi deneyimi yaÅŸamasını saÄŸlamak için, oturum açılması geçici olarak kısıtlanmıştır. -Second Life için ödeme yapmış olan kiÅŸilere öncelik tanımak amacıyla, ücretsiz hesaplara sahip kiÅŸiler bu süre içerisinde Second Life'a eriÅŸemeyecekler. +Second Life için ödeme yapmış olan kiÅŸilere öncelik tanımak amacıyla, ücretsiz hesaplara sahip kiÅŸiler bu süre içerisinde Second Life'a eriÅŸemeyecekler. </string> <string name="LoginFailedComputerProhibited"> - Second Life'a bu bilgisayardan eriÅŸemezsiniz. + Second Life'a bu bilgisayardan eriÅŸemezsiniz. Bunun bir hata olduÄŸunu düşünüyorsanız, lütfen ÅŸu adrese baÅŸvurun: support@secondlife.com. </string> @@ -287,7 +282,7 @@ Lütfen yeniden oturum açmayı denemeden önce bir dakika bekleyin. Bir simülatöre baÄŸlanılamadı. </string> <string name="LoginFailedRestrictedHours"> - Hesabınız Second Life'a sadece + Hesabınız Second Life'a sadece Pasifik Saati ile [START] ve [END] arasında eriÅŸebilir. Lütfen bu saatler arasında tekrar uÄŸrayın. Bunun bir hata olduÄŸunu düşünüyorsanız, lütfen ÅŸu adrese baÅŸvurun: support@secondlife.com @@ -370,7 +365,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. Facebook ile baÄŸlantı kurulurken sorun oluÅŸtu </string> <string name="SocialFacebookErrorPosting"> - Facebook'ta yayınlarken sorun oluÅŸtu + Facebook'ta yayınlarken sorun oluÅŸtu </string> <string name="SocialFacebookErrorDisconnecting"> Facebook baÄŸlantısı kesilirken sorun oluÅŸtu @@ -388,7 +383,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. Flickr baÄŸlantısı kurulurken sorun çıktı </string> <string name="SocialFlickrErrorPosting"> - Flickr'da yayınlarken sorun çıktı + Flickr'da yayınlarken sorun çıktı </string> <string name="SocialFlickrErrorDisconnecting"> Flickr baÄŸlantısı kesilirken sorun çıktı @@ -406,7 +401,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. Twitter baÄŸlantısı kurulurken sorun çıktı </string> <string name="SocialTwitterErrorPosting"> - Twitter'da yayınlarken sorun çıktı + Twitter'da yayınlarken sorun çıktı </string> <string name="SocialTwitterErrorDisconnecting"> Twitter baÄŸlantısı kesilirken sorun çıktı @@ -415,7 +410,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. Siyah Beyaz </string> <string name="Colors1970"> - 70'lerin Renkleri + 70'lerin Renkleri </string> <string name="Intense"> YoÄŸun @@ -658,7 +653,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. not kartlarına eklenemez. </string> <string name="TooltipNotecardOwnerRestrictedDrop"> - Sadece kısıtlamasız 'sonraki sahip' + Sadece kısıtlamasız 'sonraki sahip' izinlerini içeren öğeler not kartlarına eklenebilir. </string> @@ -1108,10 +1103,10 @@ http://secondlife.com/support adresini ziyaret edin. Åžimdi Yakındaki bir Sesli Sohbete yeniden baÄŸlanılacaksınız. </string> <string name="ScriptQuestionCautionChatGranted"> - '[OWNERNAME]' adlı kiÅŸiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan '[OBJECTNAME]' nesnesine ÅŸunu yapma izni verildi: [PERMISSIONS]. + '[OWNERNAME]' adlı kiÅŸiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan '[OBJECTNAME]' nesnesine ÅŸunu yapma izni verildi: [PERMISSIONS]. </string> <string name="ScriptQuestionCautionChatDenied"> - '[OWNERNAME]' adlı kiÅŸiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan '[OBJECTNAME]' nesnesine ÅŸunu yapma izni verilmedi: [PERMISSIONS]. + '[OWNERNAME]' adlı kiÅŸiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan '[OBJECTNAME]' nesnesine ÅŸunu yapma izni verilmedi: [PERMISSIONS]. </string> <string name="AdditionalPermissionsRequestHeader"> EÄŸer hesabınıza eriÅŸime izin verirseniz, bu nesneye aynı zamanda ÅŸunun için izin vermiÅŸ olacaksınız: @@ -1487,7 +1482,7 @@ http://secondlife.com/support adresini ziyaret edin. Yüksek </string> <string name="LeaveMouselook"> - Dünya Görünümüne dönmek için ESC'e basın + Dünya Görünümüne dönmek için ESC'e basın </string> <string name="InventoryNoMatchingItems"> Aradığınızı bulamadınız mı? [secondlife:///app/search/all/[SEARCH_TERM] Arama] ile bulmayı deneyin. @@ -1546,7 +1541,7 @@ http://secondlife.com/support adresini ziyaret edin. </string> <string name="InventoryOutboxNoItemsTooltip"/> <string name="InventoryOutboxNoItems"> - Bu alana klasörleri sürükleyin ve bunları [[MARKETPLACE_DASHBOARD_URL] Pazaryerinde] satılık olarak duyurmak için "Pazaryerine Gönder" üzerine tıklayın. + Bu alana klasörleri sürükleyin ve bunları [[MARKETPLACE_DASHBOARD_URL] Pazaryerinde] satılık olarak duyurmak için "Pazaryerine Gönder" üzerine tıklayın. </string> <string name="InventoryOutboxInitializingTitle"> Pazaryeri BaÅŸlatılıyor. @@ -1816,7 +1811,7 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin Satın Al </string> <string name="BuyforL$"> - L$'a Satın Al + L$'a Satın Al </string> <string name="Stone"> TaÅŸ @@ -2002,19 +1997,19 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin Hata: Nesne mevcut dış görünüme dahil ama eklenmemiÅŸ </string> <string name="YearsMonthsOld"> - [AGEYEARS] [AGEMONTHS]'lık + [AGEYEARS] [AGEMONTHS]'lık </string> <string name="YearsOld"> [AGEYEARS] yaşında </string> <string name="MonthsOld"> - [AGEMONTHS]'lık + [AGEMONTHS]'lık </string> <string name="WeeksOld"> - [AGEWEEKS]'lık + [AGEWEEKS]'lık </string> <string name="DaysOld"> - [AGEDAYS]'lük + [AGEDAYS]'lük </string> <string name="TodayOld"> Bugün katıldı @@ -2035,7 +2030,7 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin Çevrenizdeki kimse sizi iÅŸleyemeyebilir. </string> <string name="hud_description_total"> - BÜG'niz + BÜG'niz </string> <string name="hud_name_with_joint"> [OBJ_NAME] ([JNT_NAME] üzerinde) @@ -2313,13 +2308,13 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin Kullanılan bellek: [COUNT] kb </string> <string name="ScriptLimitsParcelScriptURLs"> - Parsel Komut Dosyası URL'leri + Parsel Komut Dosyası URL'leri </string> <string name="ScriptLimitsURLsUsed"> - Kullanılan URL'ler: [COUNT] / [MAX] içerisinden; [AVAILABLE] serbest + Kullanılan URL'ler: [COUNT] / [MAX] içerisinden; [AVAILABLE] serbest </string> <string name="ScriptLimitsURLsUsedSimple"> - Kullanılan URL'ler: [COUNT] + Kullanılan URL'ler: [COUNT] </string> <string name="ScriptLimitsRequestError"> Bilgi talep edilirken hata oluÅŸtu @@ -2523,7 +2518,7 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin Yeni Komut Dosyası </string> <string name="DoNotDisturbModeResponseDefault"> - Bu sakin "Rahatsız Etme" seçeneÄŸini devreye almış, mesajınızı sonra görecek. + Bu sakin "Rahatsız Etme" seçeneÄŸini devreye almış, mesajınızı sonra görecek. </string> <string name="MuteByName"> (Adına göre) @@ -2634,7 +2629,7 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin size verdi: </string> <string name="InvOfferDecline"> - <nolink>[NAME]</nolink> tarafından gönderilen [DESC]'i reddettiniz. + <nolink>[NAME]</nolink> tarafından gönderilen [DESC]'i reddettiniz. </string> <string name="GroupMoneyTotal"> Toplam @@ -2871,8 +2866,8 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin <string name="."> . </string> - <string name="'"> - ' + <string name="'"> + ' </string> <string name="---"> --- @@ -2987,7 +2982,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne baÅŸvurun. Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne baÅŸvurun. </string> - <string name="5 O'Clock Shadow"> + <string name="5 O'Clock Shadow"> Bir Günlük Sakal </string> <string name="All White"> @@ -4491,7 +4486,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne baÅŸvurun. Görüntüleyici baÅŸlatılamadı </string> <string name="ItemsComingInTooFastFrom"> - [APP_NAME]: [FROM_NAME]'den öğeler çok hızlı geliyor, [TIME] saniye boyunca otomatik ön izleme devre dışı bırakıldı + [APP_NAME]: [FROM_NAME]'den öğeler çok hızlı geliyor, [TIME] saniye boyunca otomatik ön izleme devre dışı bırakıldı </string> <string name="ItemsComingInTooFast"> [APP_NAME]: Öğeler çok hızlı geliyor, [TIME] saniye boyunca otomatik ön izleme devre dışı bırakıldı @@ -4527,7 +4522,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne baÅŸvurun. (Kaydedildi [LONG_TIMESTAMP]) </string> <string name="IM_unblock_only_groups_friends"> - Bu mesajı görmek için Tercihler/Gizlilik'de 'Sadece arkadaÅŸlar ve gruplar beni arasın veya Aİ göndersin' seçeneÄŸinin iÅŸaretini kaldırmalısınız. + Bu mesajı görmek için Tercihler/Gizlilik'de 'Sadece arkadaÅŸlar ve gruplar beni arasın veya Aİ göndersin' seçeneÄŸinin iÅŸaretini kaldırmalısınız. </string> <string name="OnlineStatus"> Çevrimiçi @@ -4551,7 +4546,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne baÅŸvurun. Sesli aramaya katıldınız </string> <string name="you_auto_rejected_call-im"> - "Rahatsız Etme" seçeneÄŸini devredeyken sesli aramayı otomatik olarak reddettiniz. + "Rahatsız Etme" seçeneÄŸini devredeyken sesli aramayı otomatik olarak reddettiniz. </string> <string name="name_started_call"> [NAME] bir sesli arama baÅŸlattı @@ -4575,22 +4570,26 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne baÅŸvurun. [AGENT_NAME] ile konferans </string> <string name="inventory_item_offered-im"> - "[ITEM_NAME]" envanter öğesi sunuldu + "[ITEM_NAME]" envanter öğesi sunuldu </string> <string name="inventory_folder_offered-im"> - "[ITEM_NAME]" envanter klasörü sunuldu + "[ITEM_NAME]" envanter klasörü sunuldu + </string> + <string name="bot_warning"> + Bir bot ile sohbet ediyorsunuz, [NAME]. KiÅŸisel bilgilerinizi paylaÅŸmayın. +Daha fazla bilgi için: https://second.life/scripted-agents. </string> <string name="share_alert"> Envanterinizden buraya öğeler sürükleyin </string> <string name="facebook_post_success"> - Facebook'ta yayınladınız. + Facebook'ta yayınladınız. </string> <string name="flickr_post_success"> - Flickr'da yayınladınız. + Flickr'da yayınladınız. </string> <string name="twitter_post_success"> - Twitter'da yayınladınız. + Twitter'da yayınladınız. </string> <string name="no_session_message"> (Aİ Oturumu Mevcut DeÄŸil) @@ -4683,7 +4682,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne baÅŸvurun. [NAME] size L$[AMOUNT] ödedi. </string> <string name="you_paid_ldollars"> - [NAME]'e [REASON] L$[AMOUNT] ödediniz. + [NAME]'e [REASON] L$[AMOUNT] ödediniz. </string> <string name="you_paid_ldollars_gift"> [NAME] adlı kullanıcıya [AMOUNT] L$ ödediniz. [REASON] @@ -4692,13 +4691,13 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne baÅŸvurun. L$[AMOUNT] ödediniz. </string> <string name="you_paid_ldollars_no_reason"> - [NAME]'e L$[AMOUNT] ödediniz. + [NAME]'e L$[AMOUNT] ödediniz. </string> <string name="you_paid_ldollars_no_name"> [REASON] L$[AMOUNT] ödediniz. </string> <string name="you_paid_failure_ldollars"> - [REASON] [NAME]'e L$[AMOUNT] ödeyemediniz. + [REASON] [NAME]'e L$[AMOUNT] ödeyemediniz. </string> <string name="you_paid_failure_ldollars_gift"> [NAME] adlı kullanıcıya [AMOUNT] L$ ödeyemediniz. [REASON] @@ -4707,7 +4706,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne baÅŸvurun. L$[AMOUNT] ödeyemediniz. </string> <string name="you_paid_failure_ldollars_no_reason"> - [NAME]'e L$[AMOUNT] ödeyemediniz. + [NAME]'e L$[AMOUNT] ödeyemediniz. </string> <string name="you_paid_failure_ldollars_no_name"> [REASON] L$[AMOUNT] ödeyemediniz. @@ -5139,7 +5138,7 @@ Hizmetle iliÅŸkili bilinen bir sorun olup olmadığını görmek için lütfen h <string name="ExternalEditorNotFound"> BelirttiÄŸiniz harici düzenleyici bulunamadı. Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin. -(örn. "/yolum/duzenleyici" "%s") +(örn. "/yolum/duzenleyici" "%s") </string> <string name="ExternalEditorCommandParseError"> Harici düzenleyici komutu ayrıştırılırken hata oluÅŸtu. @@ -5628,10 +5627,10 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin. Ortamlarım </string> <string name="Command_Facebook_Tooltip"> - Facebook'ta Yayınla + Facebook'ta Yayınla </string> <string name="Command_Flickr_Tooltip"> - Flickr'a yükle + Flickr'a yükle </string> <string name="Command_Gestures_Tooltip"> Avatarınız için mimikler @@ -5862,10 +5861,10 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin. Ortam </string> <string name="logging_calls_disabled_log_empty"> - Sohbetlerin günlüğü tutulmuyor. Bir günlük tutmaya baÅŸlamak için, Tercihler > Sohbet altında "Kaydet: Sadece günlük" veya "Kaydet: Günlük ve dökümler" seçimini yapın. + Sohbetlerin günlüğü tutulmuyor. Bir günlük tutmaya baÅŸlamak için, Tercihler > Sohbet altında "Kaydet: Sadece günlük" veya "Kaydet: Günlük ve dökümler" seçimini yapın. </string> <string name="logging_calls_disabled_log_not_empty"> - Bundan böyle sohbetlerin günlükleri tutulmayacak. Bir günlük tutmaya devam etmek için, Tercihler > Sohbet altında "Kaydet: Sadece günlük" veya "Kaydet: Günlük ve dökümler" seçimini yapın. + Bundan böyle sohbetlerin günlükleri tutulmayacak. Bir günlük tutmaya devam etmek için, Tercihler > Sohbet altında "Kaydet: Sadece günlük" veya "Kaydet: Günlük ve dökümler" seçimini yapın. </string> <string name="logging_calls_enabled_log_empty"> Günlüğü tutulmuÅŸ sohbet yok. Siz biriyle iletiÅŸime geçtikten sonra veya biri sizinle iletiÅŸime geçtikten sonra, burada bir günlük giriÅŸi gösterilir. @@ -5911,7 +5910,7 @@ bölümüne gidin ve sorunu bildirin. </string> <string name="ssl_connect_error"> ÇoÄŸunlukla, bu durum, bilgisayarınızın saatinin yanlış ayarlandığı anlamına gelir. -Lütfen Denetim Masası'na gidin ve tarih ve saat ayarlarının doÄŸru yapıldığından emin olun. +Lütfen Denetim Masası'na gidin ve tarih ve saat ayarlarının doÄŸru yapıldığından emin olun. Ayrıca, ağınızın ve güvenlik duvarınızın doÄŸru ÅŸekilde ayarlanıp ayarlanmadığını kontrol edin. Bu hatayı almaya devam ederseniz, lütfen SecondLife.com web sitesinin Destek bölümüne gidin ve sorunu bildirin. diff --git a/indra/newview/skins/default/xui/tr/teleport_strings.xml b/indra/newview/skins/default/xui/tr/teleport_strings.xml index e3a08e04b2..b403786bd2 100644 --- a/indra/newview/skins/default/xui/tr/teleport_strings.xml +++ b/indra/newview/skins/default/xui/tr/teleport_strings.xml @@ -21,8 +21,8 @@ Hala ışınlanamıyorsanız, sorunu çözmek için lütfen çıkış yapıp otu Bir dakika sonra tekrar deneyin. </message> <message name="NoHelpIslandTP"> - Karşılama Ada'sına geri ışınlanamazsınız. -Öğreticiyi tekrarlamak için 'Karşılama Ada'sı Kamusal Alanı'na gidin. + Karşılama Ada'sına geri ışınlanamazsınız. +Öğreticiyi tekrarlamak için 'Karşılama Ada'sı Kamusal Alanı'na gidin. </message> <message name="noaccess_tport"> Üzgünüz, bu ışınlanma hedef konumuna eriÅŸim hakkına sahip deÄŸilsiniz. @@ -49,7 +49,7 @@ Bir dakika sonra tekrar deneyin. Bu bölgeye girebilmek için 18 veya üzeri bir yaÅŸta olmanız gerekir. </message> <message name="RegionTPSpecialUsageBlocked"> - Bölgeye girilemiyor. "[REGION_NAME]" bir Yetenek Oyunu Bölgesi. Buraya girebilmek için bazı ölçütleri karşılamanız gerekiyor. Ayrıntılar için lütfen [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ] adresini ziyaret edin. + Bölgeye girilemiyor. "[REGION_NAME]" bir Yetenek Oyunu Bölgesi. Buraya girebilmek için bazı ölçütleri karşılamanız gerekiyor. Ayrıntılar için lütfen [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ] adresini ziyaret edin. </message> </message_set> <message_set name="progress"> diff --git a/indra/newview/skins/default/xui/zh/floater_avatar_textures.xml b/indra/newview/skins/default/xui/zh/floater_avatar_textures.xml index 69309c96de..260216fb15 100644 --- a/indra/newview/skins/default/xui/zh/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/zh/floater_avatar_textures.xml @@ -14,7 +14,7 @@ æè³ª </text> <button label="å‚¾å° ID 到控制臺" label_selected="傾å°" name="Dump"/> - <panel name="scroll_content_panel"> + <panel name="scroll_content_panel2"> <texture_picker label="é é«®" name="hair-baked"/> <texture_picker label="é é«®" name="hair_grain"/> <texture_picker label="é é«®åŠé€æ˜Ž" name="hair_alpha"/> diff --git a/indra/newview/skins/default/xui/zh/floater_search.xml b/indra/newview/skins/default/xui/zh/floater_search.xml deleted file mode 100644 index 3e85a529ae..0000000000 --- a/indra/newview/skins/default/xui/zh/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> - <floater.string name="loading_text"> - 載入ä¸... - </floater.string> - <floater.string name="done_text"> - å®Œæˆ - </floater.string> - <layout_stack name="stack1"> - <layout_panel name="browser_layout"> - <text name="refresh_search"> - 以目å‰å…·å‚™çš„ç¥žéšŽç´šå†æœå°‹ä¸€æ¬¡ - </text> - </layout_panel> - </layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml index 094bf019b4..9c45c54a5e 100644 --- a/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@ 將圖åƒå„²å˜åˆ°æ”¶ç´å€çš„費用為 L$[UPLOAD_COST]。 è‹¥è¦å°‡åœ–åƒå˜ç‚ºæè³ªï¼Œè«‹é¸æ“‡ä¸€å€‹æ£æ–¹æ ¼å¼ã€‚ </text> <combo_box label="è§£æžåº¦" name="texture_size_combo"> - <combo_box.item label="ç›®å‰è¦–窗(512x512)" name="CurrentWindow"/> + <combo_box.item label="ç›®å‰è¦–窗" name="CurrentWindow"/> <combo_box.item label="å°ï¼ˆ128x128)" name="Small(128x128)"/> <combo_box.item label="ä¸ï¼ˆ256x256)" name="Medium(256x256)"/> <combo_box.item label="大(512x512)" name="Large(512x512)"/> diff --git a/indra/newview/skins/default/xui/zh/panel_snapshot_options.xml b/indra/newview/skins/default/xui/zh/panel_snapshot_options.xml index d7c65bb25e..d9536882ac 100644 --- a/indra/newview/skins/default/xui/zh/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/zh/panel_snapshot_options.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_snapshot_options"> <button label="儲å˜åˆ°ç¡¬ç¢Ÿ" name="save_to_computer_btn"/> - <button label="儲å˜åˆ°æ”¶ç´å€ï¼ˆL$[AMOUNT])" name="save_to_inventory_btn"/> + <button label="儲å˜åˆ°æ”¶ç´å€" name="save_to_inventory_btn"/> <button label="分享至檔案訊æ¯ç™¼ä½ˆ" name="save_to_profile_btn"/> <button label="分享到臉書" name="send_to_facebook_btn"/> <button label="分享到推特" name="send_to_twitter_btn"/> diff --git a/indra/newview/skins/default/xui/zh/panel_status_bar.xml b/indra/newview/skins/default/xui/zh/panel_status_bar.xml index 0d6fcea451..90155fea86 100644 --- a/indra/newview/skins/default/xui/zh/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/zh/panel_status_bar.xml @@ -6,7 +6,7 @@ <panel.string name="bandwidth_tooltip"> é »å¯¬ </panel.string> - <panel.string name="time"> + <panel.string name="time_ampm"> [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] </panel.string> <panel.string name="timeTooltip"> diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml index bdb16c9bf1..cf6fa1d85f 100644 --- a/indra/newview/skins/default/xui/zh/strings.xml +++ b/indra/newview/skins/default/xui/zh/strings.xml @@ -1,8 +1,4 @@ <?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="SECOND_LIFE"> 第二人生 @@ -42,7 +38,7 @@ 建製è¨ç½® [BUILD_CONFIG] </string> <string name="AboutPosition"> - ä½ çš„æ–¹ä½æ˜¯ [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1],地å€å:[REGION],主機:<nolink>[HOSTNAME]</nolink> ([HOSTIP]) + ä½ çš„æ–¹ä½æ˜¯ [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1],地å€å:[REGION],主機:<nolink>[HOSTNAME]</nolink> 第二人生URL:<nolink>[SLURL]</nolink> ï¼ˆå…¨åŸŸåæ¨™ï¼š[POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] @@ -69,7 +65,6 @@ é »å¯¬ï¼š[NET_BANDWITH]åƒä½å…ƒ/ç§’ 細節層次率:[LOD_FACTOR] 呈åƒå“質:[RENDER_QUALITY] -進階照明模型:[GPU_SHADERS] æè³ªè¨˜æ†¶é«”:[TEXTURE_MEMORY]MB </string> <string name="AboutOSXHiDPI"> @@ -1104,10 +1099,10 @@ http://secondlife.com/support 求助解決å•題。 ç¾åœ¨ä½ 將釿–°è¯æŽ¥åˆ°é™„近的語音èŠå¤© </string> <string name="ScriptQuestionCautionChatGranted"> - 物件「[OBJECTNAME]'ã€ï¼ˆæ‰€æœ‰äººã€Œ[OWNERNAME]ã€ï¼Œä½æ–¼ã€Œ[REGIONNAME]ã€ï¼Œæ–¹ä½ã€Œ[REGIONPOS]ã€ï¼‰å·²ç²å¾—下列權é™ï¼š[PERMISSIONS]。 + 物件「[OBJECTNAME]'ã€ï¼ˆæ‰€æœ‰äººã€Œ[OWNERNAME]ã€ï¼Œä½æ–¼ã€Œ[REGIONNAME]ã€ï¼Œæ–¹ä½ã€Œ[REGIONPOS]ã€ï¼‰å·²ç²å¾—下列權é™ï¼š[PERMISSIONS]。 </string> <string name="ScriptQuestionCautionChatDenied"> - 物件「[OBJECTNAME]'ã€ï¼ˆæ‰€æœ‰äººã€Œ[OWNERNAME]ã€ï¼Œä½æ–¼ã€Œ[REGIONNAME]ã€ï¼Œæ–¹ä½ã€Œ[REGIONPOS]ã€ï¼‰å·²è¢«æ’¤é™¤ä¸‹åˆ—權é™ï¼š[PERMISSIONS]。 + 物件「[OBJECTNAME]'ã€ï¼ˆæ‰€æœ‰äººã€Œ[OWNERNAME]ã€ï¼Œä½æ–¼ã€Œ[REGIONNAME]ã€ï¼Œæ–¹ä½ã€Œ[REGIONPOS]ã€ï¼‰å·²è¢«æ’¤é™¤ä¸‹åˆ—權é™ï¼š[PERMISSIONS]。 </string> <string name="AdditionalPermissionsRequestHeader"> ä½ å¦‚æžœæ‰“é–‹å¸³æˆ¶æ¬Šé™ï¼Œä¹Ÿå°‡ä¸€ä½µå…許該物件: @@ -2864,8 +2859,8 @@ http://secondlife.com/support 求助解決å•題。 <string name="."> . </string> - <string name="'"> - ' + <string name="'"> + ' </string> <string name="---"> --- @@ -2980,7 +2975,7 @@ http://secondlife.com/support 求助解決å•題。 å¦‚æžœä½ ç¹¼çºŒçœ‹åˆ°æ¤è¨Šæ¯ï¼Œè«‹è¯çµ¡ [SUPPORT_SITE]。 </string> - <string name="5 O'Clock Shadow"> + <string name="5 O'Clock Shadow"> 下åˆäº”é»žçš„æ–°é¬æ¸£ </string> <string name="All White"> @@ -4568,10 +4563,14 @@ http://secondlife.com/support 求助解決å•題。 å’Œ [AGENT_NAME] 多方通話 </string> <string name="inventory_item_offered-im"> - æ”¶ç´å€ç‰©å“'[ITEM_NAME]'å·²å‘人æä¾› + æ”¶ç´å€ç‰©å“'[ITEM_NAME]'å·²å‘人æä¾› </string> <string name="inventory_folder_offered-im"> - æ”¶ç´å€è³‡æ–™å¤¾'[ITEM_NAME]'å·²å‘人æä¾› + æ”¶ç´å€è³‡æ–™å¤¾'[ITEM_NAME]'å·²å‘人æä¾› + </string> + <string name="bot_warning"> + 您æ£åœ¨ä¸Žäººå·¥æ™ºèƒ½æœºå™¨äºº [NAME] èŠå¤©ã€‚请勿分享任何个人信æ¯ã€‚ +了解更多:https://second.life/scripted-agents。 </string> <string name="share_alert"> 將收ç´å€ç‰©å“拖曳到這裡 @@ -5131,7 +5130,7 @@ http://secondlife.com/support 求助解決å•題。 <string name="ExternalEditorNotFound"> 找ä¸åˆ°ä½ 指定的外部編輯器。 請嘗試在編輯器路經å‰å¾ŒåŠ ä¸Šè‹±æ–‡é›™æ‹¬è™Ÿã€‚ -(例:"/path to my/editor" "%s") +(例:"/path to my/editor" "%s") </string> <string name="ExternalEditorCommandParseError"> è§£æžå¤–部編輯器指令時出錯。 diff --git a/indra/newview/skins/default/xui/zh/teleport_strings.xml b/indra/newview/skins/default/xui/zh/teleport_strings.xml index 61db294272..5523c598b4 100644 --- a/indra/newview/skins/default/xui/zh/teleport_strings.xml +++ b/indra/newview/skins/default/xui/zh/teleport_strings.xml @@ -49,7 +49,7 @@ ä½ å¿…é ˆå¹´æ»¿ 18 æ²æ‰å¯é€²å…¥é€™åœ°å€ã€‚ </message> <message name="RegionTPSpecialUsageBlocked"> - 無法進入地å€ã€‚ '[REGION_NAME]' 是個「技巧性åšå¥•ã€(Skill Gaming)地å€ï¼Œä½ å¿…é ˆç¬¦åˆä¸€å®šæ¢ä»¶æ‰å¯é€²å…¥ã€‚ 欲知詳情,請åƒé–± [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life 技巧性åšå¥•常見å•題集]。 + 無法進入地å€ã€‚ '[REGION_NAME]' 是個「技巧性åšå¥•ã€(Skill Gaming)地å€ï¼Œä½ å¿…é ˆç¬¦åˆä¸€å®šæ¢ä»¶æ‰å¯é€²å…¥ã€‚ 欲知詳情,請åƒé–± [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life 技巧性åšå¥•常見å•題集]。 </message> </message_set> <message_set name="progress"> diff --git a/indra/newview/skins/gold/colors.xml b/indra/newview/skins/gold/colors.xml new file mode 100644 index 0000000000..9755d19e17 --- /dev/null +++ b/indra/newview/skins/gold/colors.xml @@ -0,0 +1,1019 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<colors> + + <!-- Named Colors --> + <color + name="EmphasisColor" + value="0.25 0.48 0.70 1" /> + <color + name="EmphasisColor_13" + value="0.25 0.48 0.70 0.13" /> + <color + name="EmphasisColor_35" + value="0.25 0.48 0.70 0.35" /> + <color + name="BeaconColor" + value="0.749 0.298 0 1" /> + <color + name="White" + value="1 1 1 1" /> + <color + name="White_05" + value="1 1 1 0.05" /> + <color + name="White_10" + value="1 1 1 0.1" /> + <color + name="White_25" + value="1 1 1 0.25" /> + <color + name="White_50" + value="1 1 1 0.5" /> + <color + name="LtGray" + value="0.75 0.75 0.75 1" /> + <color + name="LtGray_35" + value="0.75 0.75 0.75 0.35" /> + <color + name="LtGray_50" + value="0.75 0.75 0.75 0.50" /> + <color + name="Gray" + value="0.5 0.5 0.5 1" /> + <color + name="DkGray0" + value="0.27 0.27 0.27 1" /> + <color + name="DkGray" + value="0.125 0.125 0.125 1" /> + <color + name="DkGray_66" + value="0.125 0.125 0.125 .66" /> + <color + name="DkGray2" + value="0.169 0.169 0.169 1" /> + <color + name="MouseGray" + value="0.191 0.191 0.191 1" /> + <color + name="Black" + value="0 0 0 1" /> + <color + name="Black_10" + value="0 0 0 0.1" /> + <color + name="Black_25" + value="0 0 0 0.25" /> + <color + name="Black_50" + value="0 0 0 0.5" /> + <color + name="FrogGreen" + value="0.26 0.33 0.42 1" /> + <!-- ^(Not actually green) --> + <color + name="Red" + value="1 0 0 1" /> + <color + name="Blue" + value="0 0 1 1" /> + <color + name="Yellow" + value="1 1 0 1" /> + <color + name="Green" + value="0 1 0 1" /> + <color + name="Transparent" + value="0 0 0 0" /> + <color + name="Purple" + value="1 0 1 1" /> + <color + name="Lime" + value=".8 1 .73 1" /> + <color + name="LtYellow" + value="1 1 .79 1" /> + <color + name="DrYellow" + value="1 0.86 0 1" /> + <color + name="LtOrange" + value="1 .85 .73 1" /> + <color + name="MdBlue" + value=".07 .38 .51 1" /> + <color + name="DkBlue" + value=".06 .06 .3 1" /> + <color + name="LtRed" + value="1 0.2 0.2 1" /> + <color + name="LtGreen" + value="0.2 1 0.2 1" /> + <color + name="Red_80" + value="1 0 0 0.8" /> + <color + name="DkRed" + value="0.3 0.06 0.06 1" /> + <color + name="Green_80" + value="0 1 0 0.8" /> + <color + name="Blue_80" + value="0 0 1 0.8" /> + <color + name="Orange" + value="1 .82 .46 1" /> + + <!-- This color name makes potentially unused colors show up bright purple. + Leave this here until all Unused? are removed below, otherwise + the viewer generates many warnings on startup. --> + <color + name="Unused?" + value=".831 1 0 1" /> + + <!-- UI Definitions --> + + <color + name="AccordionHeaderTextColor" + reference="LtGray" /> + <color + name="AgentChatColor" + reference="White" /> + <color + name="AlertBoxColor" + value="0.24 0.24 0.24 1" /> + <color + name="AlertCautionBoxColor" + value="1 0.82 0.46 1" /> + <color + name="AlertCautionTextColor" + reference="LtYellow" /> + <color + name="AvatarListItemIconDefaultColor" + reference="White" /> + <color + name="AvatarListItemIconOnlineColor" + reference="White" /> + <color + name="AvatarListItemIconOfflineColor" + value="0.5 0.5 0.5 0.5" /> + <color + name="AvatarListItemIconVoiceInvitedColor" + reference="AvatarListItemIconOfflineColor" /> + <color + name="AvatarListItemIconVoiceJoinedColor" + reference="AvatarListItemIconOnlineColor" /> + <color + name="AvatarListItemIconVoiceLeftColor" + reference="AvatarListItemIconOfflineColor" /> + <color + name="BadgeImageColor" + value="1.0 0.40 0.0 1.0" /> + <color + name="BadgeBorderColor" + value="0.9 0.9 0.9 1.0" /> + <color + name="BadgeLabelColor" + reference="White" /> + <color + name="ButtonBorderColor" + reference="Unused?" /> + <color + name="ButtonCautionImageColor" + reference="Unused?" /> + <color + name="ButtonColor" + reference="Unused?" /> + <color + name="ButtonFlashBgColor" + reference="Unused?" /> + <color + name="ButtonImageColor" + reference="White" /> + <color + name="ButtonLabelColor" + reference="LtGray" /> + <color + name="ButtonLabelDisabledColor" + reference="White_25" /> + <color + name="ButtonLabelSelectedColor" + reference="White" /> + <color + name="ButtonLabelSelectedDisabledColor" + reference="White_25" /> + <color + name="ButtonSelectedBgColor" + reference="Unused?" /> + <color + name="ButtonSelectedColor" + reference="Unused?" /> + <color + name="ButtonUnselectedBgColor" + reference="Unused?" /> + <color + name="ButtonUnselectedFgColor" + reference="Unused?" /> + <color + name="ChatHistoryBgColor" + reference="Transparent" /> + <color + name="ChatHistoryTextColor" + reference="LtGray" /> + <color + name="ChicletFlashColor" + value="0.114 0.65 0.1" /> + <color + name="ColorDropShadow" + reference="Black_50" /> + <color + name="ColorPaletteEntry01" + reference="Black" /> + <color + name="ColorPaletteEntry02" + reference="Gray" /> + <color + name="ColorPaletteEntry03" + value="0.5 0 0 1" /> + <color + name="ColorPaletteEntry04" + value="0.5 0.5 0 1" /> + <color + name="ColorPaletteEntry05" + value="0 0.5 0 1" /> + <color + name="ColorPaletteEntry06" + value="0 0.5 0.5 1" /> + <color + name="ColorPaletteEntry07" + value="0 0 0.5 1" /> + <color + name="ColorPaletteEntry08" + value="0.5 0 0.5 1" /> + <color + name="ColorPaletteEntry09" + value="0.5 0.5 0 1" /> + <color + name="ColorPaletteEntry10" + value="0 0.25 0.25 1" /> + <color + name="ColorPaletteEntry11" + value="0 0.5 1 1" /> + <color + name="ColorPaletteEntry12" + value="0 0.25 0.5 1" /> + <color + name="ColorPaletteEntry13" + value="0.5 0 1 1" /> + <color + name="ColorPaletteEntry14" + value="0.5 0.25 0 1" /> + <color + name="ColorPaletteEntry15" + reference="White" /> + <color + name="ColorPaletteEntry16" + reference="LtYellow" /> + <color + name="ColorPaletteEntry17" + reference="White" /> + <color + name="ColorPaletteEntry18" + reference="LtGray" /> + <color + name="ColorPaletteEntry19" + reference="Red" /> + <color + name="ColorPaletteEntry20" + reference="Yellow" /> + <color + name="ColorPaletteEntry21" + reference="Green" /> + <color + name="ColorPaletteEntry22" + value="0 1 1 1" /> + <color + name="ColorPaletteEntry23" + reference="Blue" /> + <color + name="ColorPaletteEntry24" + reference="Purple" /> + <color + name="ColorPaletteEntry25" + value="1 1 0.5 1" /> + <color + name="ColorPaletteEntry26" + value="0 1 0.5 1" /> + <color + name="ColorPaletteEntry27" + value="0.5 1 1 1" /> + <color + name="ColorPaletteEntry28" + value="0.5 0.5 1 1" /> + <color + name="ColorPaletteEntry29" + value="1 0 0.5 1" /> + <color + name="ColorPaletteEntry30" + value="1 0.5 0 1" /> + <color + name="ColorPaletteEntry31" + reference="White" /> + <color + name="ColorPaletteEntry32" + reference="White" /> + <color + name="ComboListBgColor" + reference="DkGray" /> + <color + name="ConsoleBackground" + reference="Black" /> + <color + name="ContextSilhouetteColor" + reference="EmphasisColor" /> + <color + name="ConversationFriendColor" + value="0.5 0.7 0.85 1" /> + <color + name="DefaultHighlightDark" + reference="White_10" /> + <color + name="DefaultHighlightLight" + reference="White_25" /> + <color + name="DefaultShadowDark" + reference="Black_50" /> + <color + name="DefaultShadowLight" + reference="Black_50" /> + <color + name="EffectColor" + reference="White" /> + <color + name="FilterBackgroundColor" + reference="Black" /> + <color + name="FilterTextColor" + reference="EmphasisColor" /> + <color + name="FloaterButtonImageColor" + reference="LtGray" /> + <color + name="FloaterDefaultBackgroundColor" + reference="DkGray_66" /> + <color + name="FloaterFocusBackgroundColor" + reference="DkGray2" /> + <color + name="FloaterFocusBorderColor" + reference="Black_50" /> + <color + name="FloaterUnfocusBorderColor" + reference="Black_50" /> + <color + name="FocusColor" + reference="EmphasisColor" /> + <color + name="FolderViewLoadingMessageTextColor" + value="0.3344 0.545 0.645 1" /> + <color + name="FpsTextColor" + value="0.34 0.51 0.64 0.8" /> + <color + name="GridFocusPointColor" + reference="White_50" /> + <color + name="GridlineBGColor" + value="0.92 0.92 1 0.78" /> + <color + name="GridlineColor" + reference="White" /> + <color + name="GridlineShadowColor" + value="0 0 0 0.31" /> + <color + name="GroupNotifyBoxColor" + value="0.3344 0.5456 0.5159 1" /> + <color + name="GroupNotifyTextColor" + reference="White"/> + <color + name="GroupNotifyDimmedTextColor" + reference="LtGray" /> + <color + name="GroupOverTierColor" + value="0.43 0.06 0.06 1" /> + <color + name="HTMLLinkColor" + reference="EmphasisColor" /> + <color + name="HealthTextColor" + reference="White" /> + <color + name="HelpBgColor" + reference="Unused?" /> + <color + name="HelpFgColor" + reference="Unused?" /> + <color + name="HelpScrollHighlightColor" + reference="Unused?" /> + <color + name="HelpScrollShadowColor" + reference="Unused?" /> + <color + name="HelpScrollThumbColor" + reference="Unused?" /> + <color + name="HelpScrollTrackColor" + reference="Unused?" /> + <color + name="HighlightChildColor" + reference="Yellow" /> + <color + name="HighlightInspectColor" + value="1 0 1 1" /> + <color + name="HighlightParentColor" + value="0.5 0.65 0.8 1" /> + <color + name="IMHistoryBgColor" + reference="Unused?" /> + <color + name="IMHistoryTextColor" + reference="Unused?" /> + <color + name="IconDisabledColor" + reference="White_25" /> + <color + name="IconEnabledColor" + reference="White" /> + <color + name="InventoryBackgroundColor" + reference="DkGray2" /> + <color + name="InventoryFocusOutlineColor" + reference="White_25" /> + <color + name="InventoryItemSuffixColor" + reference="White_25" /> + <color + name="InventoryItemLibraryColor" + reference="EmphasisColor" /> + <color + name="InventoryItemLinkColor" + reference="LtGray_50" /> + <color + name="InventoryMouseOverColor" + reference="LtGray_35" /> + <color + name="InventorySearchStatusColor" + reference="EmphasisColor" /> + <color + name="LabelDisabledColor" + reference="White_25" /> + <color + name="LabelSelectedColor" + reference="White" /> + <color + name="LabelSelectedDisabledColor" + reference="White_25" /> + <color + name="LabelTextColor" + reference="LtGray" /> + <color + name="LoginProgressBarBgColor" + reference="Unused?" /> + <color + name="LoginProgressBarFgColor" + reference="Unused?" /> + <color + name="LoginProgressBoxBorderColor" + value="0 0.12 0.24 0" /> + <color + name="LoginProgressBoxCenterColor" + value="0 0 0 0.78" /> + <color + name="LoginProgressBoxShadowColor" + value="0 0 0 0.78" /> + <color + name="LoginProgressBoxTextColor" + reference="White" /> + <color + name="MapAvatarColor" + reference="White" /> + <color + name="MapAvatarFriendColor" + value="0.5 0.7 0.85 1" /> + <color + name="MapAvatarSelfColor" + value="0.53125 0 0.498047 1" /> + <color + name="MapFrustumColor" + reference="White_10" /> + <color + name="MapParcelOutlineColor" + value="1 1 1 0.5" /> + <color + name="MapTrackColor" + reference="Red" /> + <color + name="MapTrackColorUnder" + reference="Blue" /> + <color + name="MapTrackDisabledColor" + value="0.5 0 0 1" /> + <color + name="MenuBarBgColor" + reference="MouseGray" /> + <color + name="MenuBarGodBgColor" + reference="FrogGreen" /> + <color + name="MenuDefaultBgColor" + reference="DkGray2" /> + <color + name="MenuItemDisabledColor" + reference="LtGray_50" /> + <color + name="MenuItemEnabledColor" + reference="LtGray" /> + <color + name="MenuItemHighlightBgColor" + reference="EmphasisColor_35" /> + <color + name="MenuItemFlashBgColor" + reference="BeaconColor" /> + <color + name="MenuItemHighlightFgColor" + reference="White" /> + <color + name="MenuNonProductionBgColor" + reference="Black" /> + <color + name="MenuNonProductionGodBgColor" + value="0.263 0.325 0.345 1" /> + <color + name="MenuPopupBgColor" + reference="DkGray2" /> + <color + name="ModelUploaderLabels" + value="1 0.6 0 1" /> + <color + name="MultiSliderDisabledThumbColor" + reference="Black" /> + <color + name="MultiSliderThumbCenterColor" + reference="White" /> + <color + name="MultiSliderThumbCenterSelectedColor" + reference="Green" /> + <color + name="MultiSliderThumbOutlineColor" + reference="Unused?" /> + <color + name="MultiSliderTrackColor" + reference="LtGray" /> + <color + name="MultiSliderTriangleColor" + reference="Yellow" /> + <!-- + <color + name="NameTagBackground" + value="0.85 0.85 0.85 0.80" /> + --> + <color + name="NameTagBackground" + value="0.101 0.101 0.101 0.6" /> + <color + name="NameTagChat" + reference="White" /> + <color + name="NameTagFriend" + value="0.85 0.75 0.5 1" /> + <color + name="NameTagLegacy" + reference="White" /> + <color + name="NameTagMatch" + reference="White" /> + <color + name="NameTagMismatch" + reference="White" /> + <color + name="NetMapBackgroundColor" + value="0 0 0 1" /> + <color + name="NetMapGroupOwnAboveWater" + value="0.85 0 0.85 1" /> + <color + name="NetMapGroupOwnBelowWater" + value="0.63 0 0.63 1" /> + <color + name="NetMapOtherOwnAboveWater" + value="0.24 0.24 0.24 1" /> + <color + name="NetMapOtherOwnBelowWater" + value="0.12 0.12 0.12 1" /> + <color + name="NetMapYouOwnAboveWater" + value="0 0.85 0.85 1" /> + <color + name="NetMapYouOwnBelowWater" + value="0 0.63 0.63 1" /> + <color + name="NotifyBoxColor" + value="LtGray" /> + <color + name="NotifyCautionBoxColor" + value="1 0.82 0.46 1" /> + <color + name="NotifyCautionWarnColor" + reference="White" /> + <color + name="NotifyTextColor" + reference="White" /> + <color + name="ObjectBubbleColor" + reference="DkGray_66" /> + <color + name="ObjectChatColor" + reference="LtYellow" /> + <color + name="OverdrivenColor" + reference="Red" /> + <color + name="PanelDefaultBackgroundColor" + reference="DkGray" /> + <color + name="PanelDefaultHighlightLight" + reference="White_50" /> + <color + name="PanelFocusBackgroundColor" + reference="DkGray2" /> + <color + name="PanelNotificationBackground" + value="1 0.3 0.3 0" /> + <color + name="ParcelHoverColor" + reference="White" /> + <color + name="PathfindingErrorColor" + reference="LtRed" /> + <color + name="PathfindingWarningColor" + reference="DrYellow" /> + <color + name="PathfindingGoodColor" + reference="LtGreen" /> + <color + name="MaterialErrorColor" + reference="LtRed" /> + <color + name="MaterialWarningColor" + reference="DrYellow" /> + <color + name="MaterialGoodColor" + reference="LtGreen" /> + <color + name="PathfindingDefaultBeaconColor" + reference="Red_80" /> + <color + name="PathfindingDefaultBeaconTextColor" + reference="White" /> + <color + name="PathfindingLinksetBeaconColor" + reference="Blue_80" /> + <color + name="PathfindingCharacterBeaconColor" + reference="Red_80" /> + <color + name="PieMenuBgColor" + value="0.24 0.24 0.24 0.59" /> + <color + name="PieMenuLineColor" + value="0 0 0 0.5" /> + <color + name="PieMenuSelectedColor" + value="0.72 0.72 0.74 0.3" /> + <color + name="PropertyColorAuction" + value="0.5 0 1 0.4" /> + <color + name="PropertyColorAvail" + reference="Transparent" /> + <color + name="PropertyColorForSale" + value="1 0.5 0 0.4" /> + <color + name="PropertyColorGroup" + value="0 0.72 0.72 0.4" /> + <color + name="PropertyColorOther" + value="1 0 0 0.4" /> + <color + name="PropertyColorSelf" + value="0 1 0 0.4" /> + <color + name="ScriptBgReadOnlyColor" + value="0.39 0.39 0.39 1" /> + <color + name="ScriptErrorColor" + reference="Red" /> + <color + name="ScrollBGStripeColor" + reference="Transparent" /> + <color + name="ScrollBgReadOnlyColor" + reference="Transparent" /> + <color + name="ScrollBgWriteableColor" + reference="White_05" /> + <color + name="ScrollDisabledColor" + reference="White_25" /> + <color + name="ScrollHighlightedColor" + reference="Unused?" /> + <color + name="ScrollHoveredColor" + reference="EmphasisColor_13" /> + <color + name="ScrollSelectedBGColor" + reference="EmphasisColor_35" /> + <color + name="ScrollSelectedFGColor" + reference="White" /> + <color + name="ScrollUnselectedColor" + reference="LtGray" /> + <color + name="ScrollbarThumbColor" + reference="White" /> + <color + name="ScrollbarTrackColor" + reference="Black" /> + <color + name="SelectedOutfitTextColor" + reference="EmphasisColor" /> + <color + name="SearchableControlHighlightFontColor" + value="1 0 0 1" /> + <color + name="SearchableControlHighlightBgColor" + value="0.5 0.1 0.1 1" /> + <color + name="SilhouetteChildColor" + value="0.13 0.42 0.77 1" /> + <color + name="SilhouetteParentColor" + reference="Yellow" /> + <color + name="SliderDisabledThumbColor" + reference="White_25" /> + <color + name="SliderThumbCenterColor" + reference="White" /> + <color + name="SliderThumbOutlineColor" + reference="White" /> + <color + name="SliderTrackColor" + reference="Unused?" /> + <color + name="SpeakingColor" + reference="FrogGreen" /> + <color + name="SystemChatColor" + reference="LtGray" /> + <color + name="TextBgFocusColor" + reference="White" /> + <color + name="TextBgReadOnlyColor" + reference="White_05" /> + <color + name="TextBgWriteableColor" + reference="LtGray" /> + <color + name="TextCursorColor" + reference="Black" /> + <color + name="TextDefaultColor" + reference="Black" /> + <color + name="TextEmbeddedItemColor" + value="0 0 0.5 1" /> + <color + name="TextEmbeddedItemReadOnlyColor" + reference="Unused?" /> + <color + name="TextFgColor" + value="0.102 0.102 0.102 1" /> + <color + name="TextFgReadOnlyColor" + reference="LtGray" /> + <color + name="TextFgTentativeColor" + value="0.4 0.4 0.4 1" /> + <color + name="TimeTextColor" + reference="LtGray" /> + <color + name="TitleBarFocusColor" + reference="White_10" /> + <color + name="ToastBackground" + value="0.3 0.3 0.3 0" /> + <color + name="ToolTipBgColor" + value="0.937 0.89 0.655 1" /> + <color + name="ToolTipBorderColor" + value="0.812 0.753 0.451 1" /> + <color + name="ToolTipTextColor" + reference="DkGray2" /> + <color + name="InspectorTipTextColor" + reference="LtGray" /> + <color + name="UserChatColor" + reference="White" /> + <color + name="llOwnerSayChatColor" + reference="LtOrange" /> + + <!-- New Colors --> + <color + name="OutputMonitorMutedColor" + reference="DkGray2" /> + <color + name="SysWellItemUnselected" + value="0 0 0 0" /> + <color + name="SysWellItemSelected" + value="0.3 0.3 0.3 1.0" /> + <color + name="ColorSwatchBorderColor" + value="0.45098 0.517647 0.607843 1"/> + <color + name="ChatTeleportSeparatorColor" + reference="Black" /> + <color + name="ChatTimestampColor" + reference="White" /> + <color + name="MenuBarBetaBgColor" + reference="DkBlue" /> + <color + name="MenuBarProjectBgColor" + reference="MdBlue" /> + <color + name="MenuBarTestBgColor" + reference="DkRed" /> + <color + name="MeshImportTableNormalColor" + value="1 1 1 1"/> + <color + name="MeshImportTableHighlightColor" + value="0.2 0.8 1 1"/> + + <color + name="DirectChatColor" + reference="LtOrange" /> + + <color + name="ToolbarDropZoneColor" + value=".48 .69 1 .5" /> + <color + name="PanelNotificationListItem" + value="0.3 0.3 0.3 .3" /> + + <!-- profiles --> + <color + name="StatusUserOnline" + reference="White" /> + <color + name="StatusUserOffline" + reference="LtGray_35" /> + <!-- Groups visible in own profiles --> + <color + name="GroupVisibleInProfile" + reference="TextBgFocusColor" /> + <color + name="GroupHiddenInProfile" + reference="Gray" /> + + + <!-- Generic color names (legacy) --> + <color + name="white" + value="1 1 1 1"/> + <color + name="black" + value="0 0 0 1"/> + <color + name="red" + value="1 0 0 1"/> + <color + name="green" + value="0 1 0 1"/> + <color + name="blue" + value="0 0 1 1"/> + + <!--Resize bar colors --> + + <color + name="ResizebarBorderLight" + value="0.231 0.231 0.231 1"/> + + <color + name="ResizebarBorderDark" + value="0.133 0.133 0.133 1"/> + + <color + name="ResizebarBody" + value="0.208 0.208 0.208 1"/> + + <!-- syntax highlighting (LSL Scripts) --> + <color + name="ScriptText" + reference="Black" /> + <color + name="ScriptBackground" + reference="White" /> + <color + name="ScriptCursorColor" + reference="Black" /> + <color + name="SyntaxLslComment" + value="0 0.5 0 1" /> + <color + name="SyntaxLslConstant" + value="0 0.6 0.6 1" /> + <color + name="SyntaxLslControlFlow" + value="0.4 0 0.8 1" /> + <color + name="SyntaxLslControlLabel" + value="0 0 0.8 1" /> + <color + name="SyntaxLslDataType" + value="0.8 0.4 0 1" /> + <color + name="SyntaxLslDeprecated" + value="0.9 0.0 0.66, 1" /> + <color + name="SyntaxLslEvent" + value="0 0.3 0.5 1" /> + <color + name="SyntaxLslFunction" + value="0.3 0 0.5 1" /> + <color + name="SyntaxLslGodMode" + value="0.7 .2 .35 1" /> + <color + name="SyntaxLslStringLiteral" + value="1 0.14 0 1" /> + <color + name="OutfitGalleryItemSelected" + reference="EmphasisColor_35" /> + <color + name="OutfitGalleryItemWorn" + reference="EmphasisColor_13" /> + <color + name="OutfitGalleryItemUnselected" + value="0.4 0.4 0.4 1" /> + <color + name="PanelGray" + value="0.27 0.27 0.27 1" /> + <color + name="PerformanceMid" + value="1 0.8 0 1" /> + <color + name="OutfitSnapshotMacMask" + value="0.115 0.115 0.115 1"/> + <color + name="OutfitSnapshotMacMask2" + value="0.1 0.1 0.1 1"/> + <color + name="ChatMentionFont" + value="0.3 0.82 1 1" /> + <color + name="ChatMentionHighlight" + value="0.82 0.91 0.98 0.15" /> + <color + name="ChatSelfMentionHighlight" + value="1 1 0 0.35" /> + <color + name="MentionFlashBgColor" + value="1 1 0 0.5" /> +</colors> diff --git a/indra/newview/skins/gold/textures/3p_icons/fmod_logo.png b/indra/newview/skins/gold/textures/3p_icons/fmod_logo.png Binary files differnew file mode 100644 index 0000000000..5a50e0ad34 --- /dev/null +++ b/indra/newview/skins/gold/textures/3p_icons/fmod_logo.png diff --git a/indra/newview/skins/gold/textures/3p_icons/havok_logo.png b/indra/newview/skins/gold/textures/3p_icons/havok_logo.png Binary files differnew file mode 100644 index 0000000000..ff1ea3a72e --- /dev/null +++ b/indra/newview/skins/gold/textures/3p_icons/havok_logo.png diff --git a/indra/newview/skins/contrast/textures/Blank.png b/indra/newview/skins/gold/textures/Blank.png Binary files differindex f38e9f9100..f38e9f9100 100644 --- a/indra/newview/skins/contrast/textures/Blank.png +++ b/indra/newview/skins/gold/textures/Blank.png diff --git a/indra/newview/skins/contrast/textures/Rounded_Rect.png b/indra/newview/skins/gold/textures/Rounded_Rect.png Binary files differindex c270c28039..c270c28039 100644 --- a/indra/newview/skins/contrast/textures/Rounded_Rect.png +++ b/indra/newview/skins/gold/textures/Rounded_Rect.png diff --git a/indra/newview/skins/contrast/textures/alpha_gradient.tga b/indra/newview/skins/gold/textures/alpha_gradient.tga Binary files differindex 6fdba25d4e..6fdba25d4e 100644 --- a/indra/newview/skins/contrast/textures/alpha_gradient.tga +++ b/indra/newview/skins/gold/textures/alpha_gradient.tga diff --git a/indra/newview/skins/contrast/textures/alpha_gradient_2d.j2c b/indra/newview/skins/gold/textures/alpha_gradient_2d.j2c Binary files differindex 5de5a80a65..5de5a80a65 100644 --- a/indra/newview/skins/contrast/textures/alpha_gradient_2d.j2c +++ b/indra/newview/skins/gold/textures/alpha_gradient_2d.j2c diff --git a/indra/newview/skins/contrast/textures/arrow_down.tga b/indra/newview/skins/gold/textures/arrow_down.tga Binary files differindex 81dc9d3b6c..81dc9d3b6c 100644 --- a/indra/newview/skins/contrast/textures/arrow_down.tga +++ b/indra/newview/skins/gold/textures/arrow_down.tga diff --git a/indra/newview/skins/contrast/textures/arrow_up.tga b/indra/newview/skins/gold/textures/arrow_up.tga Binary files differindex 22195cf7fb..22195cf7fb 100644 --- a/indra/newview/skins/contrast/textures/arrow_up.tga +++ b/indra/newview/skins/gold/textures/arrow_up.tga diff --git a/indra/newview/skins/contrast/textures/avatar_thumb_bkgrnd.png b/indra/newview/skins/gold/textures/avatar_thumb_bkgrnd.png Binary files differindex 84cc2159c1..84cc2159c1 100644 --- a/indra/newview/skins/contrast/textures/avatar_thumb_bkgrnd.png +++ b/indra/newview/skins/gold/textures/avatar_thumb_bkgrnd.png diff --git a/indra/newview/skins/contrast/textures/badge_note.j2c b/indra/newview/skins/gold/textures/badge_note.j2c Binary files differindex 1ab5233faf..1ab5233faf 100644 --- a/indra/newview/skins/contrast/textures/badge_note.j2c +++ b/indra/newview/skins/gold/textures/badge_note.j2c diff --git a/indra/newview/skins/contrast/textures/badge_ok.j2c b/indra/newview/skins/gold/textures/badge_ok.j2c Binary files differindex f85b880f1d..f85b880f1d 100644 --- a/indra/newview/skins/contrast/textures/badge_ok.j2c +++ b/indra/newview/skins/gold/textures/badge_ok.j2c diff --git a/indra/newview/skins/contrast/textures/badge_warn.j2c b/indra/newview/skins/gold/textures/badge_warn.j2c Binary files differindex 26437ca426..26437ca426 100644 --- a/indra/newview/skins/contrast/textures/badge_warn.j2c +++ b/indra/newview/skins/gold/textures/badge_warn.j2c diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_Avatar_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Avatar_Off.png Binary files differindex 6b725e153a..6b725e153a 100644 --- a/indra/newview/skins/contrast/textures/bottomtray/Cam_Avatar_Off.png +++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Avatar_Off.png diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_FreeCam_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_FreeCam_Off.png Binary files differindex 9f22080d13..9f22080d13 100644 --- a/indra/newview/skins/contrast/textures/bottomtray/Cam_FreeCam_Off.png +++ b/indra/newview/skins/gold/textures/bottomtray/Cam_FreeCam_Off.png diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_Orbit_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Orbit_Off.png Binary files differindex 5b2a8eb339..5b2a8eb339 100644 --- a/indra/newview/skins/contrast/textures/bottomtray/Cam_Orbit_Off.png +++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Orbit_Off.png diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_Pan_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Pan_Off.png Binary files differindex 9acf7053d5..9acf7053d5 100644 --- a/indra/newview/skins/contrast/textures/bottomtray/Cam_Pan_Off.png +++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Pan_Off.png diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Back_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Back_Off.png Binary files differindex 00158a7bc2..00158a7bc2 100644 --- a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Back_Off.png +++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Back_Off.png diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Back_On.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Back_On.png Binary files differindex 3748f5e190..3748f5e190 100644 --- a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Back_On.png +++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Back_On.png diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Eye_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Eye_Off.png Binary files differindex 2b50986780..2b50986780 100644 --- a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Eye_Off.png +++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Eye_Off.png diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Front_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Front_Off.png Binary files differindex c49b8f9a27..c49b8f9a27 100644 --- a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Front_Off.png +++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Front_Off.png diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Front_On.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Front_On.png Binary files differindex bc8c4db04d..bc8c4db04d 100644 --- a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Front_On.png +++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Front_On.png diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Side_Off.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Side_Off.png Binary files differindex b919a0a152..b919a0a152 100644 --- a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Side_Off.png +++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Side_Off.png diff --git a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Side_On.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Side_On.png Binary files differindex de9da359a0..de9da359a0 100644 --- a/indra/newview/skins/contrast/textures/bottomtray/Cam_Preset_Side_On.png +++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Preset_Side_On.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_Center.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_Center.png Binary files differnew file mode 100644 index 0000000000..0f1d1936f0 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_Center.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_In.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_In.png Binary files differnew file mode 100644 index 0000000000..60d88e9316 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_In.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_Out.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_Out.png Binary files differnew file mode 100644 index 0000000000..cc4e6f99ff --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Rotate_Out.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_Center.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_Center.png Binary files differnew file mode 100644 index 0000000000..fca4041b56 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_Center.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_In.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_In.png Binary files differnew file mode 100644 index 0000000000..d2ede098e4 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_In.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_Out.png b/indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_Out.png Binary files differnew file mode 100644 index 0000000000..cffead1703 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Cam_Tracking_Out.png diff --git a/indra/newview/skins/gold/textures/bottomtray/ChatBarHandle.png b/indra/newview/skins/gold/textures/bottomtray/ChatBarHandle.png Binary files differnew file mode 100644 index 0000000000..50239c8af8 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/ChatBarHandle.png diff --git a/indra/newview/skins/gold/textures/bottomtray/DownArrow.png b/indra/newview/skins/gold/textures/bottomtray/DownArrow.png Binary files differnew file mode 100644 index 0000000000..82f58b22b9 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/DownArrow.png diff --git a/indra/newview/skins/contrast/textures/bottomtray/Mouselook_View_Off.png b/indra/newview/skins/gold/textures/bottomtray/Mouselook_View_Off.png Binary files differindex 8d32cad95f..8d32cad95f 100644 --- a/indra/newview/skins/contrast/textures/bottomtray/Mouselook_View_Off.png +++ b/indra/newview/skins/gold/textures/bottomtray/Mouselook_View_Off.png diff --git a/indra/newview/skins/contrast/textures/bottomtray/Mouselook_View_On.png b/indra/newview/skins/gold/textures/bottomtray/Mouselook_View_On.png Binary files differindex 4c98e35868..4c98e35868 100644 --- a/indra/newview/skins/contrast/textures/bottomtray/Mouselook_View_On.png +++ b/indra/newview/skins/gold/textures/bottomtray/Mouselook_View_On.png diff --git a/indra/newview/skins/contrast/textures/bottomtray/Move_Fly_Off.png b/indra/newview/skins/gold/textures/bottomtray/Move_Fly_Off.png Binary files differindex fade065ce7..fade065ce7 100644 --- a/indra/newview/skins/contrast/textures/bottomtray/Move_Fly_Off.png +++ b/indra/newview/skins/gold/textures/bottomtray/Move_Fly_Off.png diff --git a/indra/newview/skins/contrast/textures/bottomtray/Move_Run_Off.png b/indra/newview/skins/gold/textures/bottomtray/Move_Run_Off.png Binary files differindex e2eb38e12d..e2eb38e12d 100644 --- a/indra/newview/skins/contrast/textures/bottomtray/Move_Run_Off.png +++ b/indra/newview/skins/gold/textures/bottomtray/Move_Run_Off.png diff --git a/indra/newview/skins/contrast/textures/bottomtray/Move_Walk_Off.png b/indra/newview/skins/gold/textures/bottomtray/Move_Walk_Off.png Binary files differindex f314d4e001..f314d4e001 100644 --- a/indra/newview/skins/contrast/textures/bottomtray/Move_Walk_Off.png +++ b/indra/newview/skins/gold/textures/bottomtray/Move_Walk_Off.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Backward_Off.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Backward_Off.png Binary files differnew file mode 100644 index 0000000000..4dddc2b391 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Backward_Off.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Backward_On.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Backward_On.png Binary files differnew file mode 100644 index 0000000000..a2ac8bd8c6 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Backward_On.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Down_Off.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Down_Off.png Binary files differnew file mode 100644 index 0000000000..2893c9a9f1 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Down_Off.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Down_On.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Down_On.png Binary files differnew file mode 100644 index 0000000000..0cb73798b3 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Down_On.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Forward_Off.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Forward_Off.png Binary files differnew file mode 100644 index 0000000000..80d227b6a7 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Forward_Off.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Forward_On.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Forward_On.png Binary files differnew file mode 100644 index 0000000000..2ee906cd6a --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Forward_On.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Left_Off.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Left_Off.png Binary files differnew file mode 100644 index 0000000000..3602efa9d9 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Left_Off.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Left_On.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Left_On.png Binary files differnew file mode 100644 index 0000000000..6e7975818e --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Left_On.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Right_Off.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Right_Off.png Binary files differnew file mode 100644 index 0000000000..9c3fc37dfe --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Right_Off.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Right_On.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Right_On.png Binary files differnew file mode 100644 index 0000000000..fe9bab6c17 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Right_On.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_TurnLeft_Off.png b/indra/newview/skins/gold/textures/bottomtray/Movement_TurnLeft_Off.png Binary files differnew file mode 100644 index 0000000000..282e8d62de --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Movement_TurnLeft_Off.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_TurnLeft_On.png b/indra/newview/skins/gold/textures/bottomtray/Movement_TurnLeft_On.png Binary files differnew file mode 100644 index 0000000000..329bd5b042 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Movement_TurnLeft_On.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_TurnRight_Off.png b/indra/newview/skins/gold/textures/bottomtray/Movement_TurnRight_Off.png Binary files differnew file mode 100644 index 0000000000..5039e57c32 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Movement_TurnRight_Off.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_TurnRight_On.png b/indra/newview/skins/gold/textures/bottomtray/Movement_TurnRight_On.png Binary files differnew file mode 100644 index 0000000000..5654d44bfa --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Movement_TurnRight_On.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Up_Off.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Up_Off.png Binary files differnew file mode 100644 index 0000000000..a49c43c2cf --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Up_Off.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Movement_Up_On.png b/indra/newview/skins/gold/textures/bottomtray/Movement_Up_On.png Binary files differnew file mode 100644 index 0000000000..bc205d592c --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Movement_Up_On.png diff --git a/indra/newview/skins/contrast/textures/bottomtray/Notices_Unread.png b/indra/newview/skins/gold/textures/bottomtray/Notices_Unread.png Binary files differindex eb2f3dbaa4..eb2f3dbaa4 100644 --- a/indra/newview/skins/contrast/textures/bottomtray/Notices_Unread.png +++ b/indra/newview/skins/gold/textures/bottomtray/Notices_Unread.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Object_View_Off.png b/indra/newview/skins/gold/textures/bottomtray/Object_View_Off.png Binary files differnew file mode 100644 index 0000000000..e9dea7e17e --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Object_View_Off.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Object_View_On.png b/indra/newview/skins/gold/textures/bottomtray/Object_View_On.png Binary files differnew file mode 100644 index 0000000000..7a348ba22e --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Object_View_On.png diff --git a/indra/newview/skins/contrast/textures/bottomtray/PanOrbit_Off.png b/indra/newview/skins/gold/textures/bottomtray/PanOrbit_Off.png Binary files differindex 53efa3a9a9..53efa3a9a9 100644 --- a/indra/newview/skins/contrast/textures/bottomtray/PanOrbit_Off.png +++ b/indra/newview/skins/gold/textures/bottomtray/PanOrbit_Off.png diff --git a/indra/newview/skins/contrast/textures/bottomtray/Snapshot_Off.png b/indra/newview/skins/gold/textures/bottomtray/Snapshot_Off.png Binary files differindex 4ab4bbe4af..4ab4bbe4af 100644 --- a/indra/newview/skins/contrast/textures/bottomtray/Snapshot_Off.png +++ b/indra/newview/skins/gold/textures/bottomtray/Snapshot_Off.png diff --git a/indra/newview/skins/gold/textures/bottomtray/Unread_Chiclet.png b/indra/newview/skins/gold/textures/bottomtray/Unread_Chiclet.png Binary files differnew file mode 100644 index 0000000000..e8fe243dc7 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/Unread_Chiclet.png diff --git a/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl1.png b/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl1.png Binary files differnew file mode 100644 index 0000000000..438b4912f8 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl1.png diff --git a/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl2.png b/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl2.png Binary files differnew file mode 100644 index 0000000000..693adc4781 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl2.png diff --git a/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl3.png b/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl3.png Binary files differnew file mode 100644 index 0000000000..14ec77b99a --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Lvl3.png diff --git a/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Off.png b/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Off.png Binary files differnew file mode 100644 index 0000000000..48be51e9af --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/VoicePTT_Off.png diff --git a/indra/newview/skins/gold/textures/bottomtray/VoicePTT_On.png b/indra/newview/skins/gold/textures/bottomtray/VoicePTT_On.png Binary files differnew file mode 100644 index 0000000000..818b34d40f --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/VoicePTT_On.png diff --git a/indra/newview/skins/gold/textures/bottomtray/WellButton_Lit.png b/indra/newview/skins/gold/textures/bottomtray/WellButton_Lit.png Binary files differnew file mode 100644 index 0000000000..84711ddc29 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/WellButton_Lit.png diff --git a/indra/newview/skins/gold/textures/bottomtray/WellButton_Lit_Selected.png b/indra/newview/skins/gold/textures/bottomtray/WellButton_Lit_Selected.png Binary files differnew file mode 100644 index 0000000000..9b9468c574 --- /dev/null +++ b/indra/newview/skins/gold/textures/bottomtray/WellButton_Lit_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Cone.png b/indra/newview/skins/gold/textures/build/Object_Cone.png Binary files differindex 5167f1a820..5167f1a820 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Cone.png +++ b/indra/newview/skins/gold/textures/build/Object_Cone.png diff --git a/indra/newview/skins/gold/textures/build/Object_Cone_Selected.png b/indra/newview/skins/gold/textures/build/Object_Cone_Selected.png Binary files differnew file mode 100644 index 0000000000..0f04cb2f28 --- /dev/null +++ b/indra/newview/skins/gold/textures/build/Object_Cone_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Cube.png b/indra/newview/skins/gold/textures/build/Object_Cube.png Binary files differindex e82af1ca82..e82af1ca82 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Cube.png +++ b/indra/newview/skins/gold/textures/build/Object_Cube.png diff --git a/indra/newview/skins/gold/textures/build/Object_Cube_Selected.png b/indra/newview/skins/gold/textures/build/Object_Cube_Selected.png Binary files differnew file mode 100644 index 0000000000..2a10237771 --- /dev/null +++ b/indra/newview/skins/gold/textures/build/Object_Cube_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Cylinder.png b/indra/newview/skins/gold/textures/build/Object_Cylinder.png Binary files differindex fe1041d4c7..fe1041d4c7 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Cylinder.png +++ b/indra/newview/skins/gold/textures/build/Object_Cylinder.png diff --git a/indra/newview/skins/gold/textures/build/Object_Cylinder_Selected.png b/indra/newview/skins/gold/textures/build/Object_Cylinder_Selected.png Binary files differnew file mode 100644 index 0000000000..ee6db5d64e --- /dev/null +++ b/indra/newview/skins/gold/textures/build/Object_Cylinder_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Grass.png b/indra/newview/skins/gold/textures/build/Object_Grass.png Binary files differindex a88efd5f3e..a88efd5f3e 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Grass.png +++ b/indra/newview/skins/gold/textures/build/Object_Grass.png diff --git a/indra/newview/skins/gold/textures/build/Object_Grass_Selected.png b/indra/newview/skins/gold/textures/build/Object_Grass_Selected.png Binary files differnew file mode 100644 index 0000000000..37f35f9339 --- /dev/null +++ b/indra/newview/skins/gold/textures/build/Object_Grass_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Hemi_Cone.png b/indra/newview/skins/gold/textures/build/Object_Hemi_Cone.png Binary files differindex 595f64d480..595f64d480 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Hemi_Cone.png +++ b/indra/newview/skins/gold/textures/build/Object_Hemi_Cone.png diff --git a/indra/newview/skins/gold/textures/build/Object_Hemi_Cone_Selected.png b/indra/newview/skins/gold/textures/build/Object_Hemi_Cone_Selected.png Binary files differnew file mode 100644 index 0000000000..ad6ba66bed --- /dev/null +++ b/indra/newview/skins/gold/textures/build/Object_Hemi_Cone_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Hemi_Cylinder.png b/indra/newview/skins/gold/textures/build/Object_Hemi_Cylinder.png Binary files differindex dd41d56fb3..dd41d56fb3 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Hemi_Cylinder.png +++ b/indra/newview/skins/gold/textures/build/Object_Hemi_Cylinder.png diff --git a/indra/newview/skins/gold/textures/build/Object_Hemi_Cylinder_Selected.png b/indra/newview/skins/gold/textures/build/Object_Hemi_Cylinder_Selected.png Binary files differnew file mode 100644 index 0000000000..03a47494f5 --- /dev/null +++ b/indra/newview/skins/gold/textures/build/Object_Hemi_Cylinder_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Hemi_Sphere.png b/indra/newview/skins/gold/textures/build/Object_Hemi_Sphere.png Binary files differindex 1489630624..1489630624 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Hemi_Sphere.png +++ b/indra/newview/skins/gold/textures/build/Object_Hemi_Sphere.png diff --git a/indra/newview/skins/gold/textures/build/Object_Hemi_Sphere_Selected.png b/indra/newview/skins/gold/textures/build/Object_Hemi_Sphere_Selected.png Binary files differnew file mode 100644 index 0000000000..daefae7389 --- /dev/null +++ b/indra/newview/skins/gold/textures/build/Object_Hemi_Sphere_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Prism.png b/indra/newview/skins/gold/textures/build/Object_Prism.png Binary files differindex 51c6c161a0..51c6c161a0 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Prism.png +++ b/indra/newview/skins/gold/textures/build/Object_Prism.png diff --git a/indra/newview/skins/gold/textures/build/Object_Prism_Selected.png b/indra/newview/skins/gold/textures/build/Object_Prism_Selected.png Binary files differnew file mode 100644 index 0000000000..73470c7af9 --- /dev/null +++ b/indra/newview/skins/gold/textures/build/Object_Prism_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Pyramid.png b/indra/newview/skins/gold/textures/build/Object_Pyramid.png Binary files differindex a147b59553..a147b59553 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Pyramid.png +++ b/indra/newview/skins/gold/textures/build/Object_Pyramid.png diff --git a/indra/newview/skins/gold/textures/build/Object_Pyramid_Selected.png b/indra/newview/skins/gold/textures/build/Object_Pyramid_Selected.png Binary files differnew file mode 100644 index 0000000000..361c915231 --- /dev/null +++ b/indra/newview/skins/gold/textures/build/Object_Pyramid_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Ring.png b/indra/newview/skins/gold/textures/build/Object_Ring.png Binary files differindex a9790fd60c..a9790fd60c 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Ring.png +++ b/indra/newview/skins/gold/textures/build/Object_Ring.png diff --git a/indra/newview/skins/gold/textures/build/Object_Ring_Selected.png b/indra/newview/skins/gold/textures/build/Object_Ring_Selected.png Binary files differnew file mode 100644 index 0000000000..49b76d137e --- /dev/null +++ b/indra/newview/skins/gold/textures/build/Object_Ring_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Sphere.png b/indra/newview/skins/gold/textures/build/Object_Sphere.png Binary files differindex 8e2dd92a82..8e2dd92a82 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Sphere.png +++ b/indra/newview/skins/gold/textures/build/Object_Sphere.png diff --git a/indra/newview/skins/gold/textures/build/Object_Sphere_Selected.png b/indra/newview/skins/gold/textures/build/Object_Sphere_Selected.png Binary files differnew file mode 100644 index 0000000000..473b90e867 --- /dev/null +++ b/indra/newview/skins/gold/textures/build/Object_Sphere_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Tetrahedron.png b/indra/newview/skins/gold/textures/build/Object_Tetrahedron.png Binary files differindex 23e22b1796..23e22b1796 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Tetrahedron.png +++ b/indra/newview/skins/gold/textures/build/Object_Tetrahedron.png diff --git a/indra/newview/skins/gold/textures/build/Object_Tetrahedron_Selected.png b/indra/newview/skins/gold/textures/build/Object_Tetrahedron_Selected.png Binary files differnew file mode 100644 index 0000000000..20278c8f6d --- /dev/null +++ b/indra/newview/skins/gold/textures/build/Object_Tetrahedron_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Torus.png b/indra/newview/skins/gold/textures/build/Object_Torus.png Binary files differindex 15c62423a9..15c62423a9 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Torus.png +++ b/indra/newview/skins/gold/textures/build/Object_Torus.png diff --git a/indra/newview/skins/gold/textures/build/Object_Torus_Selected.png b/indra/newview/skins/gold/textures/build/Object_Torus_Selected.png Binary files differnew file mode 100644 index 0000000000..e6cad859fd --- /dev/null +++ b/indra/newview/skins/gold/textures/build/Object_Torus_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Tree.png b/indra/newview/skins/gold/textures/build/Object_Tree.png Binary files differindex 82c422419b..82c422419b 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Tree.png +++ b/indra/newview/skins/gold/textures/build/Object_Tree.png diff --git a/indra/newview/skins/gold/textures/build/Object_Tree_Selected.png b/indra/newview/skins/gold/textures/build/Object_Tree_Selected.png Binary files differnew file mode 100644 index 0000000000..52b4f535f8 --- /dev/null +++ b/indra/newview/skins/gold/textures/build/Object_Tree_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Tube.png b/indra/newview/skins/gold/textures/build/Object_Tube.png Binary files differindex e47fce7511..e47fce7511 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Tube.png +++ b/indra/newview/skins/gold/textures/build/Object_Tube.png diff --git a/indra/newview/skins/gold/textures/build/Object_Tube_Selected.png b/indra/newview/skins/gold/textures/build/Object_Tube_Selected.png Binary files differnew file mode 100644 index 0000000000..4469814e1a --- /dev/null +++ b/indra/newview/skins/gold/textures/build/Object_Tube_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Tool_Create.png b/indra/newview/skins/gold/textures/build/Tool_Create.png Binary files differindex 1f1097def5..1f1097def5 100644..100755 --- a/indra/newview/skins/contrast/textures/build/Tool_Create.png +++ b/indra/newview/skins/gold/textures/build/Tool_Create.png diff --git a/indra/newview/skins/gold/textures/build/Tool_Create_Selected.png b/indra/newview/skins/gold/textures/build/Tool_Create_Selected.png Binary files differnew file mode 100755 index 0000000000..48db281d27 --- /dev/null +++ b/indra/newview/skins/gold/textures/build/Tool_Create_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Tool_Dozer.png b/indra/newview/skins/gold/textures/build/Tool_Dozer.png Binary files differindex 61744666f4..61744666f4 100644..100755 --- a/indra/newview/skins/contrast/textures/build/Tool_Dozer.png +++ b/indra/newview/skins/gold/textures/build/Tool_Dozer.png diff --git a/indra/newview/skins/gold/textures/build/Tool_Dozer_Selected.png b/indra/newview/skins/gold/textures/build/Tool_Dozer_Selected.png Binary files differnew file mode 100755 index 0000000000..0b44fca939 --- /dev/null +++ b/indra/newview/skins/gold/textures/build/Tool_Dozer_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Tool_Face.png b/indra/newview/skins/gold/textures/build/Tool_Face.png Binary files differindex 5ab42a4ad6..5ab42a4ad6 100644..100755 --- a/indra/newview/skins/contrast/textures/build/Tool_Face.png +++ b/indra/newview/skins/gold/textures/build/Tool_Face.png diff --git a/indra/newview/skins/gold/textures/build/Tool_Face_Selected.png b/indra/newview/skins/gold/textures/build/Tool_Face_Selected.png Binary files differnew file mode 100755 index 0000000000..5fd649a577 --- /dev/null +++ b/indra/newview/skins/gold/textures/build/Tool_Face_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Tool_Grab.png b/indra/newview/skins/gold/textures/build/Tool_Grab.png Binary files differindex 5c58288d5e..5c58288d5e 100644..100755 --- a/indra/newview/skins/contrast/textures/build/Tool_Grab.png +++ b/indra/newview/skins/gold/textures/build/Tool_Grab.png diff --git a/indra/newview/skins/gold/textures/build/Tool_Grab_Selected.png b/indra/newview/skins/gold/textures/build/Tool_Grab_Selected.png Binary files differnew file mode 100755 index 0000000000..664f6914a6 --- /dev/null +++ b/indra/newview/skins/gold/textures/build/Tool_Grab_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Tool_Zoom.png b/indra/newview/skins/gold/textures/build/Tool_Zoom.png Binary files differindex ad493b0d66..ad493b0d66 100644..100755 --- a/indra/newview/skins/contrast/textures/build/Tool_Zoom.png +++ b/indra/newview/skins/gold/textures/build/Tool_Zoom.png diff --git a/indra/newview/skins/gold/textures/build/Tool_Zoom_Selected.png b/indra/newview/skins/gold/textures/build/Tool_Zoom_Selected.png Binary files differnew file mode 100755 index 0000000000..e503c09d74 --- /dev/null +++ b/indra/newview/skins/gold/textures/build/Tool_Zoom_Selected.png diff --git a/indra/newview/skins/contrast/textures/button_anim_pause.tga b/indra/newview/skins/gold/textures/button_anim_pause.tga Binary files differindex 577f9195d0..577f9195d0 100644 --- a/indra/newview/skins/contrast/textures/button_anim_pause.tga +++ b/indra/newview/skins/gold/textures/button_anim_pause.tga diff --git a/indra/newview/skins/contrast/textures/button_anim_pause_selected.tga b/indra/newview/skins/gold/textures/button_anim_pause_selected.tga Binary files differindex 21384316a8..21384316a8 100644 --- a/indra/newview/skins/contrast/textures/button_anim_pause_selected.tga +++ b/indra/newview/skins/gold/textures/button_anim_pause_selected.tga diff --git a/indra/newview/skins/contrast/textures/button_anim_play.tga b/indra/newview/skins/gold/textures/button_anim_play.tga Binary files differindex 9ed55f829d..9ed55f829d 100644 --- a/indra/newview/skins/contrast/textures/button_anim_play.tga +++ b/indra/newview/skins/gold/textures/button_anim_play.tga diff --git a/indra/newview/skins/contrast/textures/button_anim_play_selected.tga b/indra/newview/skins/gold/textures/button_anim_play_selected.tga Binary files differindex b166a4178d..b166a4178d 100644 --- a/indra/newview/skins/contrast/textures/button_anim_play_selected.tga +++ b/indra/newview/skins/gold/textures/button_anim_play_selected.tga diff --git a/indra/newview/skins/contrast/textures/checker.png b/indra/newview/skins/gold/textures/checker.png Binary files differindex 1ab87e3f02..1ab87e3f02 100644 --- a/indra/newview/skins/contrast/textures/checker.png +++ b/indra/newview/skins/gold/textures/checker.png diff --git a/indra/newview/skins/gold/textures/cloud-particle.png b/indra/newview/skins/gold/textures/cloud-particle.png Binary files differnew file mode 100644 index 0000000000..f2080ddb9f --- /dev/null +++ b/indra/newview/skins/gold/textures/cloud-particle.png diff --git a/indra/newview/skins/contrast/textures/color_swatch_alpha.tga b/indra/newview/skins/gold/textures/color_swatch_alpha.tga Binary files differindex 814a004e62..814a004e62 100644 --- a/indra/newview/skins/contrast/textures/color_swatch_alpha.tga +++ b/indra/newview/skins/gold/textures/color_swatch_alpha.tga diff --git a/indra/newview/skins/gold/textures/containers/Accordion_ArrowClosed_Off.png b/indra/newview/skins/gold/textures/containers/Accordion_ArrowClosed_Off.png Binary files differnew file mode 100644 index 0000000000..19c842b816 --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/Accordion_ArrowClosed_Off.png diff --git a/indra/newview/skins/gold/textures/containers/Accordion_ArrowClosed_Press.png b/indra/newview/skins/gold/textures/containers/Accordion_ArrowClosed_Press.png Binary files differnew file mode 100644 index 0000000000..b9879dcc8a --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/Accordion_ArrowClosed_Press.png diff --git a/indra/newview/skins/gold/textures/containers/Accordion_ArrowOpened_Off.png b/indra/newview/skins/gold/textures/containers/Accordion_ArrowOpened_Off.png Binary files differnew file mode 100644 index 0000000000..d506cda5c9 --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/Accordion_ArrowOpened_Off.png diff --git a/indra/newview/skins/gold/textures/containers/Accordion_ArrowOpened_Press.png b/indra/newview/skins/gold/textures/containers/Accordion_ArrowOpened_Press.png Binary files differnew file mode 100644 index 0000000000..08f7493a02 --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/Accordion_ArrowOpened_Press.png diff --git a/indra/newview/skins/gold/textures/containers/Accordion_Off.png b/indra/newview/skins/gold/textures/containers/Accordion_Off.png Binary files differnew file mode 100644 index 0000000000..414f4509c6 --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/Accordion_Off.png diff --git a/indra/newview/skins/gold/textures/containers/Accordion_Over.png b/indra/newview/skins/gold/textures/containers/Accordion_Over.png Binary files differnew file mode 100644 index 0000000000..5416d73310 --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/Accordion_Over.png diff --git a/indra/newview/skins/gold/textures/containers/Accordion_Press.png b/indra/newview/skins/gold/textures/containers/Accordion_Press.png Binary files differnew file mode 100644 index 0000000000..1578e0dfc5 --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/Accordion_Press.png diff --git a/indra/newview/skins/gold/textures/containers/Accordion_Selected.png b/indra/newview/skins/gold/textures/containers/Accordion_Selected.png Binary files differnew file mode 100644 index 0000000000..2222954332 --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/Accordion_Selected.png diff --git a/indra/newview/skins/gold/textures/containers/Container.png b/indra/newview/skins/gold/textures/containers/Container.png Binary files differnew file mode 100644 index 0000000000..511eb94386 --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/Container.png diff --git a/indra/newview/skins/gold/textures/containers/TabTop_Left_Off.png b/indra/newview/skins/gold/textures/containers/TabTop_Left_Off.png Binary files differnew file mode 100644 index 0000000000..c5b232d9ab --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/TabTop_Left_Off.png diff --git a/indra/newview/skins/gold/textures/containers/TabTop_Left_Selected.png b/indra/newview/skins/gold/textures/containers/TabTop_Left_Selected.png Binary files differnew file mode 100644 index 0000000000..345caaab1b --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/TabTop_Left_Selected.png diff --git a/indra/newview/skins/gold/textures/containers/TabTop_Middle.png b/indra/newview/skins/gold/textures/containers/TabTop_Middle.png Binary files differnew file mode 100644 index 0000000000..a558943a9d --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/TabTop_Middle.png diff --git a/indra/newview/skins/gold/textures/containers/TabTop_Middle_Off.png b/indra/newview/skins/gold/textures/containers/TabTop_Middle_Off.png Binary files differnew file mode 100644 index 0000000000..be624ab273 --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/TabTop_Middle_Off.png diff --git a/indra/newview/skins/gold/textures/containers/TabTop_Middle_Selected.png b/indra/newview/skins/gold/textures/containers/TabTop_Middle_Selected.png Binary files differnew file mode 100644 index 0000000000..a9a358645a --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/TabTop_Middle_Selected.png diff --git a/indra/newview/skins/gold/textures/containers/TabTop_Right_Flashing.png b/indra/newview/skins/gold/textures/containers/TabTop_Right_Flashing.png Binary files differnew file mode 100644 index 0000000000..fd13bb699d --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/TabTop_Right_Flashing.png diff --git a/indra/newview/skins/gold/textures/containers/TabTop_Right_Off.png b/indra/newview/skins/gold/textures/containers/TabTop_Right_Off.png Binary files differnew file mode 100644 index 0000000000..db28e9e13a --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/TabTop_Right_Off.png diff --git a/indra/newview/skins/gold/textures/containers/TabTop_Right_Selected.png b/indra/newview/skins/gold/textures/containers/TabTop_Right_Selected.png Binary files differnew file mode 100644 index 0000000000..9544f96984 --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/TabTop_Right_Selected.png diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Left_Flash.png b/indra/newview/skins/gold/textures/containers/Toolbar_Left_Flash.png Binary files differnew file mode 100644 index 0000000000..9f1e2a469d --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/Toolbar_Left_Flash.png diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Left_Off.png b/indra/newview/skins/gold/textures/containers/Toolbar_Left_Off.png Binary files differnew file mode 100644 index 0000000000..f347505772 --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/Toolbar_Left_Off.png diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Left_Over.png b/indra/newview/skins/gold/textures/containers/Toolbar_Left_Over.png Binary files differnew file mode 100644 index 0000000000..fd24e5b430 --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/Toolbar_Left_Over.png diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Left_Selected.png b/indra/newview/skins/gold/textures/containers/Toolbar_Left_Selected.png Binary files differnew file mode 100644 index 0000000000..9299b563cc --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/Toolbar_Left_Selected.png diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Flash.png b/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Flash.png Binary files differnew file mode 100644 index 0000000000..dd73d655e9 --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Flash.png diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Off.png b/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Off.png Binary files differnew file mode 100644 index 0000000000..cf30330f1c --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Off.png diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Over.png b/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Over.png Binary files differnew file mode 100644 index 0000000000..6ac1ce3ffb --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Over.png diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Selected.png b/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Selected.png Binary files differnew file mode 100644 index 0000000000..e921cf84e2 --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/Toolbar_Middle_Selected.png diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Right_Flash.png b/indra/newview/skins/gold/textures/containers/Toolbar_Right_Flash.png Binary files differnew file mode 100644 index 0000000000..f6b775c2a0 --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/Toolbar_Right_Flash.png diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Right_Off.png b/indra/newview/skins/gold/textures/containers/Toolbar_Right_Off.png Binary files differnew file mode 100644 index 0000000000..d4881e21d3 --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/Toolbar_Right_Off.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Tetrahedron_Selected.png b/indra/newview/skins/gold/textures/containers/Toolbar_Right_Over.png Binary files differindex 1afb115ce5..bf2a72d6f4 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Tetrahedron_Selected.png +++ b/indra/newview/skins/gold/textures/containers/Toolbar_Right_Over.png diff --git a/indra/newview/skins/gold/textures/containers/Toolbar_Right_Selected.png b/indra/newview/skins/gold/textures/containers/Toolbar_Right_Selected.png Binary files differnew file mode 100644 index 0000000000..69459ad8aa --- /dev/null +++ b/indra/newview/skins/gold/textures/containers/Toolbar_Right_Selected.png diff --git a/indra/newview/skins/contrast/textures/crosshairs.tga b/indra/newview/skins/gold/textures/crosshairs.tga Binary files differindex ac4d63dc59..ac4d63dc59 100644 --- a/indra/newview/skins/contrast/textures/crosshairs.tga +++ b/indra/newview/skins/gold/textures/crosshairs.tga diff --git a/indra/newview/skins/contrast/textures/default_irradiance.png b/indra/newview/skins/gold/textures/default_irradiance.png Binary files differindex 899e0ddf2a..899e0ddf2a 100644 --- a/indra/newview/skins/contrast/textures/default_irradiance.png +++ b/indra/newview/skins/gold/textures/default_irradiance.png diff --git a/indra/newview/skins/gold/textures/default_land_picture.j2c b/indra/newview/skins/gold/textures/default_land_picture.j2c Binary files differnew file mode 100644 index 0000000000..34df0291ae --- /dev/null +++ b/indra/newview/skins/gold/textures/default_land_picture.j2c diff --git a/indra/newview/skins/gold/textures/default_profile_picture.j2c b/indra/newview/skins/gold/textures/default_profile_picture.j2c Binary files differnew file mode 100644 index 0000000000..f21742cf09 --- /dev/null +++ b/indra/newview/skins/gold/textures/default_profile_picture.j2c diff --git a/indra/newview/skins/contrast/textures/direction_arrow.tga b/indra/newview/skins/gold/textures/direction_arrow.tga Binary files differindex f3ef1068c4..f3ef1068c4 100644 --- a/indra/newview/skins/contrast/textures/direction_arrow.tga +++ b/indra/newview/skins/gold/textures/direction_arrow.tga diff --git a/indra/newview/skins/contrast/textures/down_arrow.png b/indra/newview/skins/gold/textures/down_arrow.png Binary files differindex 21a0fc5ec0..21a0fc5ec0 100644 --- a/indra/newview/skins/contrast/textures/down_arrow.png +++ b/indra/newview/skins/gold/textures/down_arrow.png diff --git a/indra/newview/skins/contrast/textures/eye_button_active.tga b/indra/newview/skins/gold/textures/eye_button_active.tga Binary files differindex 014f785a7b..014f785a7b 100644 --- a/indra/newview/skins/contrast/textures/eye_button_active.tga +++ b/indra/newview/skins/gold/textures/eye_button_active.tga diff --git a/indra/newview/skins/contrast/textures/eye_button_inactive.tga b/indra/newview/skins/gold/textures/eye_button_inactive.tga Binary files differindex 8666f0bbe6..8666f0bbe6 100644 --- a/indra/newview/skins/contrast/textures/eye_button_inactive.tga +++ b/indra/newview/skins/gold/textures/eye_button_inactive.tga diff --git a/indra/newview/skins/contrast/textures/flatnormal.tga b/indra/newview/skins/gold/textures/flatnormal.tga Binary files differindex 6d5abd1782..6d5abd1782 100644 --- a/indra/newview/skins/contrast/textures/flatnormal.tga +++ b/indra/newview/skins/gold/textures/flatnormal.tga diff --git a/indra/newview/skins/contrast/textures/folder_arrow.tga b/indra/newview/skins/gold/textures/folder_arrow.tga Binary files differindex 77d470731b..77d470731b 100644 --- a/indra/newview/skins/contrast/textures/folder_arrow.tga +++ b/indra/newview/skins/gold/textures/folder_arrow.tga diff --git a/indra/newview/skins/contrast/textures/foot_shadow.j2c b/indra/newview/skins/gold/textures/foot_shadow.j2c Binary files differindex f9ce9da7d1..f9ce9da7d1 100644 --- a/indra/newview/skins/contrast/textures/foot_shadow.j2c +++ b/indra/newview/skins/gold/textures/foot_shadow.j2c diff --git a/indra/newview/skins/contrast/textures/green_checkmark.png b/indra/newview/skins/gold/textures/green_checkmark.png Binary files differindex d2a5b348dc..d2a5b348dc 100644 --- a/indra/newview/skins/contrast/textures/green_checkmark.png +++ b/indra/newview/skins/gold/textures/green_checkmark.png diff --git a/indra/newview/skins/contrast/textures/icn_media_movie.tga b/indra/newview/skins/gold/textures/icn_media_movie.tga Binary files differindex 43dd342c9d..43dd342c9d 100644 --- a/indra/newview/skins/contrast/textures/icn_media_movie.tga +++ b/indra/newview/skins/gold/textures/icn_media_movie.tga diff --git a/indra/newview/skins/contrast/textures/icn_media_web.tga b/indra/newview/skins/gold/textures/icn_media_web.tga Binary files differindex 7c9131dfff..7c9131dfff 100644 --- a/indra/newview/skins/contrast/textures/icn_media_web.tga +++ b/indra/newview/skins/gold/textures/icn_media_web.tga diff --git a/indra/newview/skins/contrast/textures/icon_auction.tga b/indra/newview/skins/gold/textures/icon_auction.tga Binary files differindex baf7d0d000..baf7d0d000 100644 --- a/indra/newview/skins/contrast/textures/icon_auction.tga +++ b/indra/newview/skins/gold/textures/icon_auction.tga diff --git a/indra/newview/skins/contrast/textures/icon_avatar_offline.tga b/indra/newview/skins/gold/textures/icon_avatar_offline.tga Binary files differindex cfa95eb00e..cfa95eb00e 100644 --- a/indra/newview/skins/contrast/textures/icon_avatar_offline.tga +++ b/indra/newview/skins/gold/textures/icon_avatar_offline.tga diff --git a/indra/newview/skins/contrast/textures/icon_avatar_online.tga b/indra/newview/skins/gold/textures/icon_avatar_online.tga Binary files differindex 45221213eb..45221213eb 100644 --- a/indra/newview/skins/contrast/textures/icon_avatar_online.tga +++ b/indra/newview/skins/gold/textures/icon_avatar_online.tga diff --git a/indra/newview/skins/contrast/textures/icon_diurnal.tga b/indra/newview/skins/gold/textures/icon_diurnal.tga Binary files differindex fc720c8269..fc720c8269 100644 --- a/indra/newview/skins/contrast/textures/icon_diurnal.tga +++ b/indra/newview/skins/gold/textures/icon_diurnal.tga diff --git a/indra/newview/skins/contrast/textures/icon_for_sale_adult.tga b/indra/newview/skins/gold/textures/icon_for_sale_adult.tga Binary files differindex 6a99188f87..6a99188f87 100644 --- a/indra/newview/skins/contrast/textures/icon_for_sale_adult.tga +++ b/indra/newview/skins/gold/textures/icon_for_sale_adult.tga diff --git a/indra/newview/skins/contrast/textures/icon_group.tga b/indra/newview/skins/gold/textures/icon_group.tga Binary files differindex 79cd71689d..79cd71689d 100644 --- a/indra/newview/skins/contrast/textures/icon_group.tga +++ b/indra/newview/skins/gold/textures/icon_group.tga diff --git a/indra/newview/skins/default/textures/icon_legacy_event.tga b/indra/newview/skins/gold/textures/icon_legacy_event.tga Binary files differindex 7805dbce60..7805dbce60 100644 --- a/indra/newview/skins/default/textures/icon_legacy_event.tga +++ b/indra/newview/skins/gold/textures/icon_legacy_event.tga diff --git a/indra/newview/skins/default/textures/icon_legacy_event_adult.tga b/indra/newview/skins/gold/textures/icon_legacy_event_adult.tga Binary files differindex c344fb1e78..c344fb1e78 100644 --- a/indra/newview/skins/default/textures/icon_legacy_event_adult.tga +++ b/indra/newview/skins/gold/textures/icon_legacy_event_adult.tga diff --git a/indra/newview/skins/default/textures/icon_legacy_event_mature.tga b/indra/newview/skins/gold/textures/icon_legacy_event_mature.tga Binary files differindex 61c879bc92..61c879bc92 100644 --- a/indra/newview/skins/default/textures/icon_legacy_event_mature.tga +++ b/indra/newview/skins/gold/textures/icon_legacy_event_mature.tga diff --git a/indra/newview/skins/contrast/textures/icon_place.tga b/indra/newview/skins/gold/textures/icon_place.tga Binary files differindex e10655c6ec..e10655c6ec 100644 --- a/indra/newview/skins/contrast/textures/icon_place.tga +++ b/indra/newview/skins/gold/textures/icon_place.tga diff --git a/indra/newview/skins/contrast/textures/icon_top_pick.tga b/indra/newview/skins/gold/textures/icon_top_pick.tga Binary files differindex 0b34882d2f..0b34882d2f 100644 --- a/indra/newview/skins/contrast/textures/icon_top_pick.tga +++ b/indra/newview/skins/gold/textures/icon_top_pick.tga diff --git a/indra/newview/skins/gold/textures/icons/AddItem_Disabled.png b/indra/newview/skins/gold/textures/icons/AddItem_Disabled.png Binary files differnew file mode 100644 index 0000000000..d21b72b973 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/AddItem_Disabled.png diff --git a/indra/newview/skins/gold/textures/icons/AddItem_Off.png b/indra/newview/skins/gold/textures/icons/AddItem_Off.png Binary files differnew file mode 100644 index 0000000000..64108d133a --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/AddItem_Off.png diff --git a/indra/newview/skins/gold/textures/icons/AddItem_Press.png b/indra/newview/skins/gold/textures/icons/AddItem_Press.png Binary files differnew file mode 100644 index 0000000000..3168f51757 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/AddItem_Press.png diff --git a/indra/newview/skins/gold/textures/icons/AudioMute_Off.png b/indra/newview/skins/gold/textures/icons/AudioMute_Off.png Binary files differnew file mode 100644 index 0000000000..dd89920fae --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/AudioMute_Off.png diff --git a/indra/newview/skins/gold/textures/icons/AudioMute_Over.png b/indra/newview/skins/gold/textures/icons/AudioMute_Over.png Binary files differnew file mode 100644 index 0000000000..a4fbec4144 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/AudioMute_Over.png diff --git a/indra/newview/skins/gold/textures/icons/Audio_Off.png b/indra/newview/skins/gold/textures/icons/Audio_Off.png Binary files differnew file mode 100644 index 0000000000..4f6f5512c8 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/Audio_Off.png diff --git a/indra/newview/skins/gold/textures/icons/Audio_Press.png b/indra/newview/skins/gold/textures/icons/Audio_Press.png Binary files differnew file mode 100644 index 0000000000..0268a0f9fb --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/Audio_Press.png diff --git a/indra/newview/skins/contrast/textures/icons/BackArrow_Off.png b/indra/newview/skins/gold/textures/icons/BackArrow_Off.png Binary files differindex 3775690531..3775690531 100644 --- a/indra/newview/skins/contrast/textures/icons/BackArrow_Off.png +++ b/indra/newview/skins/gold/textures/icons/BackArrow_Off.png diff --git a/indra/newview/skins/contrast/textures/icons/ClipboardMenu_Disabled.png b/indra/newview/skins/gold/textures/icons/ClipboardMenu_Disabled.png Binary files differindex c219ac4446..c219ac4446 100644 --- a/indra/newview/skins/contrast/textures/icons/ClipboardMenu_Disabled.png +++ b/indra/newview/skins/gold/textures/icons/ClipboardMenu_Disabled.png diff --git a/indra/newview/skins/contrast/textures/icons/ClipboardMenu_Off.png b/indra/newview/skins/gold/textures/icons/ClipboardMenu_Off.png Binary files differindex 586f577181..586f577181 100644 --- a/indra/newview/skins/contrast/textures/icons/ClipboardMenu_Off.png +++ b/indra/newview/skins/gold/textures/icons/ClipboardMenu_Off.png diff --git a/indra/newview/skins/contrast/textures/icons/ClipboardMenu_Press.png b/indra/newview/skins/gold/textures/icons/ClipboardMenu_Press.png Binary files differindex 697bee3bbd..697bee3bbd 100644 --- a/indra/newview/skins/contrast/textures/icons/ClipboardMenu_Press.png +++ b/indra/newview/skins/gold/textures/icons/ClipboardMenu_Press.png diff --git a/indra/newview/skins/contrast/textures/icons/ClipboardSmallMenu_Disabled.png b/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Disabled.png Binary files differindex 12cc1857d4..12cc1857d4 100644 --- a/indra/newview/skins/contrast/textures/icons/ClipboardSmallMenu_Disabled.png +++ b/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Disabled.png diff --git a/indra/newview/skins/contrast/textures/icons/ClipboardSmallMenu_Off.png b/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Off.png Binary files differindex 7b40e33e11..7b40e33e11 100644 --- a/indra/newview/skins/contrast/textures/icons/ClipboardSmallMenu_Off.png +++ b/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Off.png diff --git a/indra/newview/skins/contrast/textures/icons/ClipboardSmallMenu_Press.png b/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Press.png Binary files differindex e030c44f01..e030c44f01 100644 --- a/indra/newview/skins/contrast/textures/icons/ClipboardSmallMenu_Press.png +++ b/indra/newview/skins/gold/textures/icons/ClipboardSmallMenu_Press.png diff --git a/indra/newview/skins/contrast/textures/icons/Conv_log_inbox.png b/indra/newview/skins/gold/textures/icons/Conv_log_inbox.png Binary files differindex f4bbdc059d..f4bbdc059d 100644 --- a/indra/newview/skins/contrast/textures/icons/Conv_log_inbox.png +++ b/indra/newview/skins/gold/textures/icons/Conv_log_inbox.png diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_add_person.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_add_person.png Binary files differindex acb3904e32..acb3904e32 100644 --- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_add_person.png +++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_add_person.png diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_arrow_ne.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_arrow_ne.png Binary files differindex 70dec7cad1..70dec7cad1 100644 --- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_arrow_ne.png +++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_arrow_ne.png diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_arrow_sw.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_arrow_sw.png Binary files differindex 13d424832b..13d424832b 100644 --- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_arrow_sw.png +++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_arrow_sw.png diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_call_log.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_call_log.png Binary files differindex 1866dd965c..1866dd965c 100644 --- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_call_log.png +++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_call_log.png diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_close.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_close.png Binary files differindex f4f2e2fd37..f4f2e2fd37 100644 --- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_close.png +++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_close.png diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_collapse.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_collapse.png Binary files differindex 3c427a3cc5..3c427a3cc5 100644 --- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_collapse.png +++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_collapse.png diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_expand.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_expand.png Binary files differindex 6e8031b42c..6e8031b42c 100644 --- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_expand.png +++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_expand.png diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_hang_up.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_hang_up.png Binary files differindex 887a3b8335..887a3b8335 100644 --- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_hang_up.png +++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_hang_up.png diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_open_call.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_open_call.png Binary files differindex fc0da5a810..fc0da5a810 100644 --- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_open_call.png +++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_open_call.png diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_plus.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_plus.png Binary files differindex 6d45dbbff6..6d45dbbff6 100644 --- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_plus.png +++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_plus.png diff --git a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_sort.png b/indra/newview/skins/gold/textures/icons/Conv_toolbar_sort.png Binary files differindex e3e5f49741..e3e5f49741 100644 --- a/indra/newview/skins/contrast/textures/icons/Conv_toolbar_sort.png +++ b/indra/newview/skins/gold/textures/icons/Conv_toolbar_sort.png diff --git a/indra/newview/skins/contrast/textures/icons/Copy.png b/indra/newview/skins/gold/textures/icons/Copy.png Binary files differindex 8448e70385..8448e70385 100644 --- a/indra/newview/skins/contrast/textures/icons/Copy.png +++ b/indra/newview/skins/gold/textures/icons/Copy.png diff --git a/indra/newview/skins/contrast/textures/icons/CopyBright.png b/indra/newview/skins/gold/textures/icons/CopyBright.png Binary files differindex ac65d68e0b..ac65d68e0b 100644 --- a/indra/newview/skins/contrast/textures/icons/CopyBright.png +++ b/indra/newview/skins/gold/textures/icons/CopyBright.png diff --git a/indra/newview/skins/contrast/textures/icons/Default_Outfit_Photo.png b/indra/newview/skins/gold/textures/icons/Default_Outfit_Photo.png Binary files differindex 1113b4effe..1113b4effe 100644 --- a/indra/newview/skins/contrast/textures/icons/Default_Outfit_Photo.png +++ b/indra/newview/skins/gold/textures/icons/Default_Outfit_Photo.png diff --git a/indra/newview/skins/contrast/textures/icons/DownArrow_Off.png b/indra/newview/skins/gold/textures/icons/DownArrow_Off.png Binary files differindex 2e1e2964a0..2e1e2964a0 100644 --- a/indra/newview/skins/contrast/textures/icons/DownArrow_Off.png +++ b/indra/newview/skins/gold/textures/icons/DownArrow_Off.png diff --git a/indra/newview/skins/contrast/textures/icons/Edit_Wrench.png b/indra/newview/skins/gold/textures/icons/Edit_Wrench.png Binary files differindex 2b9ba9dc10..2b9ba9dc10 100644 --- a/indra/newview/skins/contrast/textures/icons/Edit_Wrench.png +++ b/indra/newview/skins/gold/textures/icons/Edit_Wrench.png diff --git a/indra/newview/skins/contrast/textures/icons/ExternalBrowser_Off.png b/indra/newview/skins/gold/textures/icons/ExternalBrowser_Off.png Binary files differindex dc4532b5a1..dc4532b5a1 100644 --- a/indra/newview/skins/contrast/textures/icons/ExternalBrowser_Off.png +++ b/indra/newview/skins/gold/textures/icons/ExternalBrowser_Off.png diff --git a/indra/newview/skins/contrast/textures/icons/Facebook.png b/indra/newview/skins/gold/textures/icons/Facebook.png Binary files differindex 9e51e3ac7f..9e51e3ac7f 100644 --- a/indra/newview/skins/contrast/textures/icons/Facebook.png +++ b/indra/newview/skins/gold/textures/icons/Facebook.png diff --git a/indra/newview/skins/contrast/textures/icons/Female.png b/indra/newview/skins/gold/textures/icons/Female.png Binary files differindex c9fef87b6e..c9fef87b6e 100644 --- a/indra/newview/skins/contrast/textures/icons/Female.png +++ b/indra/newview/skins/gold/textures/icons/Female.png diff --git a/indra/newview/skins/contrast/textures/icons/ForSale_Badge.png b/indra/newview/skins/gold/textures/icons/ForSale_Badge.png Binary files differindex 3b3a41c7c1..3b3a41c7c1 100644 --- a/indra/newview/skins/contrast/textures/icons/ForSale_Badge.png +++ b/indra/newview/skins/gold/textures/icons/ForSale_Badge.png diff --git a/indra/newview/skins/contrast/textures/icons/ForwardArrow_Off.png b/indra/newview/skins/gold/textures/icons/ForwardArrow_Off.png Binary files differindex c33320cf6e..c33320cf6e 100644 --- a/indra/newview/skins/contrast/textures/icons/ForwardArrow_Off.png +++ b/indra/newview/skins/gold/textures/icons/ForwardArrow_Off.png diff --git a/indra/newview/skins/contrast/textures/icons/ForwardArrow_Press.png b/indra/newview/skins/gold/textures/icons/ForwardArrow_Press.png Binary files differindex 86eb39c43a..86eb39c43a 100644 --- a/indra/newview/skins/contrast/textures/icons/ForwardArrow_Press.png +++ b/indra/newview/skins/gold/textures/icons/ForwardArrow_Press.png diff --git a/indra/newview/skins/contrast/textures/icons/Generic_Group.png b/indra/newview/skins/gold/textures/icons/Generic_Group.png Binary files differindex e96b7fc992..e96b7fc992 100644 --- a/indra/newview/skins/contrast/textures/icons/Generic_Group.png +++ b/indra/newview/skins/gold/textures/icons/Generic_Group.png diff --git a/indra/newview/skins/contrast/textures/icons/Generic_Group_Large.png b/indra/newview/skins/gold/textures/icons/Generic_Group_Large.png Binary files differindex 9396819bfb..9396819bfb 100644 --- a/indra/newview/skins/contrast/textures/icons/Generic_Group_Large.png +++ b/indra/newview/skins/gold/textures/icons/Generic_Group_Large.png diff --git a/indra/newview/skins/contrast/textures/icons/Generic_Object_Small.png b/indra/newview/skins/gold/textures/icons/Generic_Object_Small.png Binary files differindex 142390e3f3..142390e3f3 100644 --- a/indra/newview/skins/contrast/textures/icons/Generic_Object_Small.png +++ b/indra/newview/skins/gold/textures/icons/Generic_Object_Small.png diff --git a/indra/newview/skins/contrast/textures/icons/Generic_Person.png b/indra/newview/skins/gold/textures/icons/Generic_Person.png Binary files differindex 162735d979..162735d979 100644 --- a/indra/newview/skins/contrast/textures/icons/Generic_Person.png +++ b/indra/newview/skins/gold/textures/icons/Generic_Person.png diff --git a/indra/newview/skins/contrast/textures/icons/Generic_Person_Large.png b/indra/newview/skins/gold/textures/icons/Generic_Person_Large.png Binary files differindex 5be82418c1..5be82418c1 100644 --- a/indra/newview/skins/contrast/textures/icons/Generic_Person_Large.png +++ b/indra/newview/skins/gold/textures/icons/Generic_Person_Large.png diff --git a/indra/newview/skins/contrast/textures/icons/Group_Notices.png b/indra/newview/skins/gold/textures/icons/Group_Notices.png Binary files differindex 601502d374..601502d374 100644 --- a/indra/newview/skins/contrast/textures/icons/Group_Notices.png +++ b/indra/newview/skins/gold/textures/icons/Group_Notices.png diff --git a/indra/newview/skins/contrast/textures/icons/Hierarchy_View_Disabled.png b/indra/newview/skins/gold/textures/icons/Hierarchy_View_Disabled.png Binary files differindex 6d8ea5fd93..6d8ea5fd93 100644 --- a/indra/newview/skins/contrast/textures/icons/Hierarchy_View_Disabled.png +++ b/indra/newview/skins/gold/textures/icons/Hierarchy_View_Disabled.png diff --git a/indra/newview/skins/contrast/textures/icons/Hierarchy_View_On.png b/indra/newview/skins/gold/textures/icons/Hierarchy_View_On.png Binary files differindex 24f5210286..24f5210286 100644 --- a/indra/newview/skins/contrast/textures/icons/Hierarchy_View_On.png +++ b/indra/newview/skins/gold/textures/icons/Hierarchy_View_On.png diff --git a/indra/newview/skins/contrast/textures/icons/Icon_Attachment_Large.png b/indra/newview/skins/gold/textures/icons/Icon_Attachment_Large.png Binary files differindex fb57265dac..fb57265dac 100644 --- a/indra/newview/skins/contrast/textures/icons/Icon_Attachment_Large.png +++ b/indra/newview/skins/gold/textures/icons/Icon_Attachment_Large.png diff --git a/indra/newview/skins/contrast/textures/icons/Icon_Attachment_Small.png b/indra/newview/skins/gold/textures/icons/Icon_Attachment_Small.png Binary files differindex 907113cbb7..907113cbb7 100644 --- a/indra/newview/skins/contrast/textures/icons/Icon_Attachment_Small.png +++ b/indra/newview/skins/gold/textures/icons/Icon_Attachment_Small.png diff --git a/indra/newview/skins/contrast/textures/icons/Icon_Color_Palette.png b/indra/newview/skins/gold/textures/icons/Icon_Color_Palette.png Binary files differindex 28906001ea..28906001ea 100644 --- a/indra/newview/skins/contrast/textures/icons/Icon_Color_Palette.png +++ b/indra/newview/skins/gold/textures/icons/Icon_Color_Palette.png diff --git a/indra/newview/skins/contrast/textures/icons/Icon_Font_Size.png b/indra/newview/skins/gold/textures/icons/Icon_Font_Size.png Binary files differindex 37bdde69aa..37bdde69aa 100644 --- a/indra/newview/skins/contrast/textures/icons/Icon_Font_Size.png +++ b/indra/newview/skins/gold/textures/icons/Icon_Font_Size.png diff --git a/indra/newview/skins/contrast/textures/icons/Icon_For_Sale.png b/indra/newview/skins/gold/textures/icons/Icon_For_Sale.png Binary files differindex 57a376f1bf..57a376f1bf 100644 --- a/indra/newview/skins/contrast/textures/icons/Icon_For_Sale.png +++ b/indra/newview/skins/gold/textures/icons/Icon_For_Sale.png diff --git a/indra/newview/skins/gold/textures/icons/Icon_Notification_Condense.png b/indra/newview/skins/gold/textures/icons/Icon_Notification_Condense.png Binary files differnew file mode 100644 index 0000000000..3a19e79f82 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/Icon_Notification_Condense.png diff --git a/indra/newview/skins/gold/textures/icons/Icon_Notification_Expand.png b/indra/newview/skins/gold/textures/icons/Icon_Notification_Expand.png Binary files differnew file mode 100644 index 0000000000..f5331feb02 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/Icon_Notification_Expand.png diff --git a/indra/newview/skins/gold/textures/icons/Info.png b/indra/newview/skins/gold/textures/icons/Info.png Binary files differnew file mode 100644 index 0000000000..e05a585f0b --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/Info.png diff --git a/indra/newview/skins/gold/textures/icons/Info_Over.png b/indra/newview/skins/gold/textures/icons/Info_Over.png Binary files differnew file mode 100644 index 0000000000..07b65ddf8b --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/Info_Over.png diff --git a/indra/newview/skins/gold/textures/icons/Info_Small.png b/indra/newview/skins/gold/textures/icons/Info_Small.png Binary files differnew file mode 100644 index 0000000000..c4ce13e132 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/Info_Small.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Alpha.png b/indra/newview/skins/gold/textures/icons/Inv_Alpha.png Binary files differindex fdad36e2d3..fdad36e2d3 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Alpha.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Alpha.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Animation.png b/indra/newview/skins/gold/textures/icons/Inv_Animation.png Binary files differindex 6715c736e7..6715c736e7 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Animation.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Animation.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_BodyShape.png b/indra/newview/skins/gold/textures/icons/Inv_BodyShape.png Binary files differindex cb908a39fb..cb908a39fb 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_BodyShape.png +++ b/indra/newview/skins/gold/textures/icons/Inv_BodyShape.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_CallingCard.png b/indra/newview/skins/gold/textures/icons/Inv_CallingCard.png Binary files differindex ee87f8e595..ee87f8e595 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_CallingCard.png +++ b/indra/newview/skins/gold/textures/icons/Inv_CallingCard.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Clothing.png b/indra/newview/skins/gold/textures/icons/Inv_Clothing.png Binary files differindex 430dca6b5e..430dca6b5e 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Clothing.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Clothing.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Eye.png b/indra/newview/skins/gold/textures/icons/Inv_Eye.png Binary files differindex d715f135d3..d715f135d3 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Eye.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Eye.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_FolderClosed.png b/indra/newview/skins/gold/textures/icons/Inv_FolderClosed.png Binary files differindex ec99eaee9e..ec99eaee9e 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_FolderClosed.png +++ b/indra/newview/skins/gold/textures/icons/Inv_FolderClosed.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_FolderOpen.png b/indra/newview/skins/gold/textures/icons/Inv_FolderOpen.png Binary files differindex 615a6ec11b..615a6ec11b 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_FolderOpen.png +++ b/indra/newview/skins/gold/textures/icons/Inv_FolderOpen.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Gesture.png b/indra/newview/skins/gold/textures/icons/Inv_Gesture.png Binary files differindex 9fee34915e..9fee34915e 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Gesture.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Gesture.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Gloves.png b/indra/newview/skins/gold/textures/icons/Inv_Gloves.png Binary files differindex aa151d5404..aa151d5404 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Gloves.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Gloves.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Hair.png b/indra/newview/skins/gold/textures/icons/Inv_Hair.png Binary files differindex 62b3ae81c2..62b3ae81c2 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Hair.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Hair.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Invalid.png b/indra/newview/skins/gold/textures/icons/Inv_Invalid.png Binary files differindex 6ab5ba5217..6ab5ba5217 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Invalid.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Invalid.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Jacket.png b/indra/newview/skins/gold/textures/icons/Inv_Jacket.png Binary files differindex 26514f1c0f..26514f1c0f 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Jacket.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Jacket.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Landmark.png b/indra/newview/skins/gold/textures/icons/Inv_Landmark.png Binary files differindex 338323fcee..338323fcee 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Landmark.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Landmark.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Link.png b/indra/newview/skins/gold/textures/icons/Inv_Link.png Binary files differindex 28c5f3635a..28c5f3635a 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Link.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Link.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_LinkFolder.png b/indra/newview/skins/gold/textures/icons/Inv_LinkFolder.png Binary files differindex 7c43ed3a43..7c43ed3a43 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_LinkFolder.png +++ b/indra/newview/skins/gold/textures/icons/Inv_LinkFolder.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_LinkItem.png b/indra/newview/skins/gold/textures/icons/Inv_LinkItem.png Binary files differindex 7c43ed3a43..7c43ed3a43 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_LinkItem.png +++ b/indra/newview/skins/gold/textures/icons/Inv_LinkItem.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_LookFolderClosed.png b/indra/newview/skins/gold/textures/icons/Inv_LookFolderClosed.png Binary files differindex 46f2038279..46f2038279 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_LookFolderClosed.png +++ b/indra/newview/skins/gold/textures/icons/Inv_LookFolderClosed.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_LookFolderOpen.png b/indra/newview/skins/gold/textures/icons/Inv_LookFolderOpen.png Binary files differindex 06a1b05983..06a1b05983 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_LookFolderOpen.png +++ b/indra/newview/skins/gold/textures/icons/Inv_LookFolderOpen.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_LostClosed.png b/indra/newview/skins/gold/textures/icons/Inv_LostClosed.png Binary files differindex fc9a2a2156..fc9a2a2156 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_LostClosed.png +++ b/indra/newview/skins/gold/textures/icons/Inv_LostClosed.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_LostOpen.png b/indra/newview/skins/gold/textures/icons/Inv_LostOpen.png Binary files differindex b15dc3cfa3..b15dc3cfa3 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_LostOpen.png +++ b/indra/newview/skins/gold/textures/icons/Inv_LostOpen.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Material.png b/indra/newview/skins/gold/textures/icons/Inv_Material.png Binary files differindex 5cbb4fc5c9..5cbb4fc5c9 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Material.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Material.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Mesh.png b/indra/newview/skins/gold/textures/icons/Inv_Mesh.png Binary files differindex 69217d1cdc..69217d1cdc 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Mesh.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Mesh.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Notecard.png b/indra/newview/skins/gold/textures/icons/Inv_Notecard.png Binary files differindex 96f45bc55e..96f45bc55e 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Notecard.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Notecard.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Object.png b/indra/newview/skins/gold/textures/icons/Inv_Object.png Binary files differindex fe6b201570..fe6b201570 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Object.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Object.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Object_Multi.png b/indra/newview/skins/gold/textures/icons/Inv_Object_Multi.png Binary files differindex 3793594059..3793594059 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Object_Multi.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Object_Multi.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Pants.png b/indra/newview/skins/gold/textures/icons/Inv_Pants.png Binary files differindex 5673bc29ed..5673bc29ed 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Pants.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Pants.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Physics.png b/indra/newview/skins/gold/textures/icons/Inv_Physics.png Binary files differindex 43bd082d8a..43bd082d8a 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Physics.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Physics.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Script.png b/indra/newview/skins/gold/textures/icons/Inv_Script.png Binary files differindex 68d2ac425f..68d2ac425f 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Script.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Script.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Settings.png b/indra/newview/skins/gold/textures/icons/Inv_Settings.png Binary files differindex ca6cf10314..ca6cf10314 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Settings.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Settings.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_SettingsDay.png b/indra/newview/skins/gold/textures/icons/Inv_SettingsDay.png Binary files differindex d0c4b2cdcd..d0c4b2cdcd 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_SettingsDay.png +++ b/indra/newview/skins/gold/textures/icons/Inv_SettingsDay.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_SettingsSky.png b/indra/newview/skins/gold/textures/icons/Inv_SettingsSky.png Binary files differindex 5332404d37..5332404d37 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_SettingsSky.png +++ b/indra/newview/skins/gold/textures/icons/Inv_SettingsSky.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_SettingsWater.png b/indra/newview/skins/gold/textures/icons/Inv_SettingsWater.png Binary files differindex 88ff803756..88ff803756 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_SettingsWater.png +++ b/indra/newview/skins/gold/textures/icons/Inv_SettingsWater.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Shape.png b/indra/newview/skins/gold/textures/icons/Inv_Shape.png Binary files differindex e5db447b36..e5db447b36 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Shape.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Shape.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Shirt.png b/indra/newview/skins/gold/textures/icons/Inv_Shirt.png Binary files differindex ffabff9c6c..ffabff9c6c 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Shirt.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Shirt.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Shoe.png b/indra/newview/skins/gold/textures/icons/Inv_Shoe.png Binary files differindex 784d1d23a3..784d1d23a3 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Shoe.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Shoe.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Skin.png b/indra/newview/skins/gold/textures/icons/Inv_Skin.png Binary files differindex a232c5ac67..a232c5ac67 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Skin.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Skin.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Skirt.png b/indra/newview/skins/gold/textures/icons/Inv_Skirt.png Binary files differindex 5970f39b1b..5970f39b1b 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Skirt.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Skirt.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Snapshot.png b/indra/newview/skins/gold/textures/icons/Inv_Snapshot.png Binary files differindex 9eaca9e7ef..9eaca9e7ef 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Snapshot.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Snapshot.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Socks.png b/indra/newview/skins/gold/textures/icons/Inv_Socks.png Binary files differindex 95a3a68de6..95a3a68de6 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Socks.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Socks.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Sound.png b/indra/newview/skins/gold/textures/icons/Inv_Sound.png Binary files differindex 138d4c5c36..138d4c5c36 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Sound.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Sound.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_StockFolderClosed.png b/indra/newview/skins/gold/textures/icons/Inv_StockFolderClosed.png Binary files differindex c3aae7c736..c3aae7c736 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_StockFolderClosed.png +++ b/indra/newview/skins/gold/textures/icons/Inv_StockFolderClosed.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_StockFolderOpen.png b/indra/newview/skins/gold/textures/icons/Inv_StockFolderOpen.png Binary files differindex 15fd8225fc..15fd8225fc 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_StockFolderOpen.png +++ b/indra/newview/skins/gold/textures/icons/Inv_StockFolderOpen.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_SysClosed.png b/indra/newview/skins/gold/textures/icons/Inv_SysClosed.png Binary files differindex 2550cae0d4..2550cae0d4 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_SysClosed.png +++ b/indra/newview/skins/gold/textures/icons/Inv_SysClosed.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_SysOpen.png b/indra/newview/skins/gold/textures/icons/Inv_SysOpen.png Binary files differindex 5b56d86184..5b56d86184 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_SysOpen.png +++ b/indra/newview/skins/gold/textures/icons/Inv_SysOpen.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Tattoo.png b/indra/newview/skins/gold/textures/icons/Inv_Tattoo.png Binary files differindex af5a780685..af5a780685 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Tattoo.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Tattoo.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Texture.png b/indra/newview/skins/gold/textures/icons/Inv_Texture.png Binary files differindex 168a97515a..168a97515a 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Texture.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Texture.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Toolbar_SearchVisibility.png b/indra/newview/skins/gold/textures/icons/Inv_Toolbar_SearchVisibility.png Binary files differindex c4b186c3de..c4b186c3de 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Toolbar_SearchVisibility.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Toolbar_SearchVisibility.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_TrashClosed.png b/indra/newview/skins/gold/textures/icons/Inv_TrashClosed.png Binary files differindex 89f0caa5a2..89f0caa5a2 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_TrashClosed.png +++ b/indra/newview/skins/gold/textures/icons/Inv_TrashClosed.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_TrashOpen.png b/indra/newview/skins/gold/textures/icons/Inv_TrashOpen.png Binary files differindex d1f1eeaf42..d1f1eeaf42 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_TrashOpen.png +++ b/indra/newview/skins/gold/textures/icons/Inv_TrashOpen.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Underpants.png b/indra/newview/skins/gold/textures/icons/Inv_Underpants.png Binary files differindex 77f8e55270..77f8e55270 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Underpants.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Underpants.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Undershirt.png b/indra/newview/skins/gold/textures/icons/Inv_Undershirt.png Binary files differindex 477d76cf11..477d76cf11 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Undershirt.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Undershirt.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_Universal.png b/indra/newview/skins/gold/textures/icons/Inv_Universal.png Binary files differindex 65b2f88f02..65b2f88f02 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_Universal.png +++ b/indra/newview/skins/gold/textures/icons/Inv_Universal.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_UnknownObject.png b/indra/newview/skins/gold/textures/icons/Inv_UnknownObject.png Binary files differindex 603a6d7aaa..603a6d7aaa 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_UnknownObject.png +++ b/indra/newview/skins/gold/textures/icons/Inv_UnknownObject.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_VersionFolderClosed.png b/indra/newview/skins/gold/textures/icons/Inv_VersionFolderClosed.png Binary files differindex cd561d24ba..cd561d24ba 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_VersionFolderClosed.png +++ b/indra/newview/skins/gold/textures/icons/Inv_VersionFolderClosed.png diff --git a/indra/newview/skins/contrast/textures/icons/Inv_VersionFolderOpen.png b/indra/newview/skins/gold/textures/icons/Inv_VersionFolderOpen.png Binary files differindex 6dc9d451cc..6dc9d451cc 100644 --- a/indra/newview/skins/contrast/textures/icons/Inv_VersionFolderOpen.png +++ b/indra/newview/skins/gold/textures/icons/Inv_VersionFolderOpen.png diff --git a/indra/newview/skins/contrast/textures/icons/List_View_Disabled.png b/indra/newview/skins/gold/textures/icons/List_View_Disabled.png Binary files differindex 125034b0cb..125034b0cb 100644 --- a/indra/newview/skins/contrast/textures/icons/List_View_Disabled.png +++ b/indra/newview/skins/gold/textures/icons/List_View_Disabled.png diff --git a/indra/newview/skins/contrast/textures/icons/List_View_On.png b/indra/newview/skins/gold/textures/icons/List_View_On.png Binary files differindex fcf77f004f..fcf77f004f 100644 --- a/indra/newview/skins/contrast/textures/icons/List_View_On.png +++ b/indra/newview/skins/gold/textures/icons/List_View_On.png diff --git a/indra/newview/skins/contrast/textures/icons/Lock.png b/indra/newview/skins/gold/textures/icons/Lock.png Binary files differindex 2db6ed0213..2db6ed0213 100644 --- a/indra/newview/skins/contrast/textures/icons/Lock.png +++ b/indra/newview/skins/gold/textures/icons/Lock.png diff --git a/indra/newview/skins/contrast/textures/icons/Locked_Icon.png b/indra/newview/skins/gold/textures/icons/Locked_Icon.png Binary files differindex 4985af1be1..4985af1be1 100644 --- a/indra/newview/skins/contrast/textures/icons/Locked_Icon.png +++ b/indra/newview/skins/gold/textures/icons/Locked_Icon.png diff --git a/indra/newview/skins/gold/textures/icons/MP_Logo.png b/indra/newview/skins/gold/textures/icons/MP_Logo.png Binary files differnew file mode 100644 index 0000000000..6aba54189f --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/MP_Logo.png diff --git a/indra/newview/skins/contrast/textures/icons/Male.png b/indra/newview/skins/gold/textures/icons/Male.png Binary files differindex 803171f5c6..803171f5c6 100644 --- a/indra/newview/skins/contrast/textures/icons/Male.png +++ b/indra/newview/skins/gold/textures/icons/Male.png diff --git a/indra/newview/skins/contrast/textures/icons/Microphone_On.png b/indra/newview/skins/gold/textures/icons/Microphone_On.png Binary files differindex 7a7d39d982..7a7d39d982 100644 --- a/indra/newview/skins/contrast/textures/icons/Microphone_On.png +++ b/indra/newview/skins/gold/textures/icons/Microphone_On.png diff --git a/indra/newview/skins/gold/textures/icons/MinusItem_Disabled.png b/indra/newview/skins/gold/textures/icons/MinusItem_Disabled.png Binary files differnew file mode 100644 index 0000000000..b62ed35182 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/MinusItem_Disabled.png diff --git a/indra/newview/skins/gold/textures/icons/MinusItem_Off.png b/indra/newview/skins/gold/textures/icons/MinusItem_Off.png Binary files differnew file mode 100644 index 0000000000..eb7b8838f7 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/MinusItem_Off.png diff --git a/indra/newview/skins/gold/textures/icons/MinusItem_Press.png b/indra/newview/skins/gold/textures/icons/MinusItem_Press.png Binary files differnew file mode 100644 index 0000000000..2dc6081cb0 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/MinusItem_Press.png diff --git a/indra/newview/skins/contrast/textures/icons/MusicNote.png b/indra/newview/skins/gold/textures/icons/MusicNote.png Binary files differindex 8d3534a94b..8d3534a94b 100644 --- a/indra/newview/skins/contrast/textures/icons/MusicNote.png +++ b/indra/newview/skins/gold/textures/icons/MusicNote.png diff --git a/indra/newview/skins/contrast/textures/icons/OptionsMenu_Disabled.png b/indra/newview/skins/gold/textures/icons/OptionsMenu_Disabled.png Binary files differindex 5755315e23..5755315e23 100644 --- a/indra/newview/skins/contrast/textures/icons/OptionsMenu_Disabled.png +++ b/indra/newview/skins/gold/textures/icons/OptionsMenu_Disabled.png diff --git a/indra/newview/skins/contrast/textures/icons/OptionsMenu_Off.png b/indra/newview/skins/gold/textures/icons/OptionsMenu_Off.png Binary files differindex 2e9a5faa21..2e9a5faa21 100644 --- a/indra/newview/skins/contrast/textures/icons/OptionsMenu_Off.png +++ b/indra/newview/skins/gold/textures/icons/OptionsMenu_Off.png diff --git a/indra/newview/skins/contrast/textures/icons/OptionsMenu_Press.png b/indra/newview/skins/gold/textures/icons/OptionsMenu_Press.png Binary files differindex 1b08648b51..1b08648b51 100644 --- a/indra/newview/skins/contrast/textures/icons/OptionsMenu_Press.png +++ b/indra/newview/skins/gold/textures/icons/OptionsMenu_Press.png diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Disabled.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Disabled.png Binary files differindex 1d2dbd6349..1d2dbd6349 100644 --- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Disabled.png +++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Disabled.png diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Off.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Off.png Binary files differindex f8f3367c42..f8f3367c42 100644 --- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Off.png +++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Off.png diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_On.png b/indra/newview/skins/gold/textures/icons/OutboxPush_On.png Binary files differindex b1fd734100..b1fd734100 100644 --- a/indra/newview/skins/contrast/textures/icons/OutboxPush_On.png +++ b/indra/newview/skins/gold/textures/icons/OutboxPush_On.png diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_On_Over.png b/indra/newview/skins/gold/textures/icons/OutboxPush_On_Over.png Binary files differindex e234400b72..e234400b72 100644 --- a/indra/newview/skins/contrast/textures/icons/OutboxPush_On_Over.png +++ b/indra/newview/skins/gold/textures/icons/OutboxPush_On_Over.png diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Over.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Over.png Binary files differindex 9e1b0e2dfc..9e1b0e2dfc 100644 --- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Over.png +++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Over.png diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Press.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Press.png Binary files differindex 14d9eacc52..14d9eacc52 100644 --- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Press.png +++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Press.png diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_1.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_1.png Binary files differindex 85015fc913..85015fc913 100644 --- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_1.png +++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_1.png diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_2.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_2.png Binary files differindex 6158242b68..6158242b68 100644 --- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_2.png +++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_2.png diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_3.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_3.png Binary files differindex 7105380bff..7105380bff 100644 --- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_3.png +++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_3.png diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_4.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_4.png Binary files differindex 0e65a60fc8..0e65a60fc8 100644 --- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_4.png +++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_4.png diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_5.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_5.png Binary files differindex 7acef05891..7acef05891 100644 --- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_5.png +++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_5.png diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_6.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_6.png Binary files differindex 4f5b34a643..4f5b34a643 100644 --- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Progress_6.png +++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Progress_6.png diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Selected.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected.png Binary files differindex d58826da67..d58826da67 100644 --- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Selected.png +++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected.png diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Selected_Disabled.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Disabled.png Binary files differindex cad9f118b1..cad9f118b1 100644 --- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Selected_Disabled.png +++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Disabled.png diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Selected_Over.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Over.png Binary files differindex 65d914c6b3..65d914c6b3 100644 --- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Selected_Over.png +++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Over.png diff --git a/indra/newview/skins/contrast/textures/icons/OutboxPush_Selected_Press.png b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Press.png Binary files differindex cd50d41903..cd50d41903 100644 --- a/indra/newview/skins/contrast/textures/icons/OutboxPush_Selected_Press.png +++ b/indra/newview/skins/gold/textures/icons/OutboxPush_Selected_Press.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_BuildNo_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_BuildNo_Dark.png Binary files differindex dd12d94ad2..dd12d94ad2 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_BuildNo_Dark.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_BuildNo_Dark.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_BuildNo_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_BuildNo_Light.png Binary files differindex 4739c501ad..4739c501ad 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_BuildNo_Light.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_BuildNo_Light.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_Build_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Build_Dark.png Binary files differindex 9826491efd..9826491efd 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_Build_Dark.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_Build_Dark.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_DamageNo_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_DamageNo_Dark.png Binary files differindex 7634e5fab0..7634e5fab0 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_DamageNo_Dark.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_DamageNo_Dark.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_Damage_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Damage_Dark.png Binary files differindex 7ecd645df2..7ecd645df2 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_Damage_Dark.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_Damage_Dark.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_Exp_Color.png b/indra/newview/skins/gold/textures/icons/Parcel_Exp_Color.png Binary files differindex a1b0faa008..a1b0faa008 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_Exp_Color.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_Exp_Color.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_FlyNo_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_FlyNo_Dark.png Binary files differindex 831c25a34b..831c25a34b 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_FlyNo_Dark.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_FlyNo_Dark.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_FlyNo_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_FlyNo_Light.png Binary files differindex be829fb5ef..be829fb5ef 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_FlyNo_Light.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_FlyNo_Light.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_Fly_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Fly_Dark.png Binary files differindex 579bfe58f8..579bfe58f8 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_Fly_Dark.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_Fly_Dark.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_ForSale_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_ForSale_Light.png Binary files differindex 3f4ee0b482..3f4ee0b482 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_ForSale_Light.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_ForSale_Light.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_Health_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Health_Dark.png Binary files differindex 98618de927..98618de927 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_Health_Dark.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_Health_Dark.png diff --git a/indra/newview/skins/gold/textures/icons/Parcel_M_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_M_Dark.png Binary files differnew file mode 100644 index 0000000000..ab5a1680a7 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/Parcel_M_Dark.png diff --git a/indra/newview/skins/gold/textures/icons/Parcel_M_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_M_Light.png Binary files differnew file mode 100644 index 0000000000..2db94e37c9 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/Parcel_M_Light.png diff --git a/indra/newview/skins/gold/textures/icons/Parcel_PG_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_PG_Dark.png Binary files differnew file mode 100644 index 0000000000..e1f7613d04 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/Parcel_PG_Dark.png diff --git a/indra/newview/skins/gold/textures/icons/Parcel_PG_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_PG_Light.png Binary files differnew file mode 100644 index 0000000000..04d13027d2 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/Parcel_PG_Light.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_PushNo_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_PushNo_Dark.png Binary files differindex 2867004014..2867004014 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_PushNo_Dark.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_PushNo_Dark.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_PushNo_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_PushNo_Light.png Binary files differindex a3a51973af..a3a51973af 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_PushNo_Light.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_PushNo_Light.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_Push_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Push_Dark.png Binary files differindex e8487ca092..e8487ca092 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_Push_Dark.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_Push_Dark.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_R_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_R_Dark.png Binary files differindex 5c165c2fac..5c165c2fac 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_R_Dark.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_R_Dark.png diff --git a/indra/newview/skins/gold/textures/icons/Parcel_R_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_R_Light.png Binary files differnew file mode 100644 index 0000000000..dbf43152b3 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/Parcel_R_Light.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_ScriptsNo_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_ScriptsNo_Dark.png Binary files differindex bfc55fc403..bfc55fc403 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_ScriptsNo_Dark.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_ScriptsNo_Dark.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_Scripts_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Scripts_Dark.png Binary files differindex 3477e0654c..3477e0654c 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_Scripts_Dark.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_Scripts_Dark.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_SeeAVsOff_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOff_Dark.png Binary files differindex eff089487e..eff089487e 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_SeeAVsOff_Dark.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOff_Dark.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_SeeAVsOff_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOff_Light.png Binary files differindex 68f0b14d44..68f0b14d44 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_SeeAVsOff_Light.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOff_Light.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_SeeAVsOn_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOn_Dark.png Binary files differindex 200e04a59f..200e04a59f 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_SeeAVsOn_Dark.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOn_Dark.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_SeeAVsOn_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOn_Light.png Binary files differindex 14cafc5bd2..14cafc5bd2 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_SeeAVsOn_Light.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_SeeAVsOn_Light.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_VoiceNo_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_VoiceNo_Dark.png Binary files differindex ec316e822e..ec316e822e 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_VoiceNo_Dark.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_VoiceNo_Dark.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_VoiceNo_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_VoiceNo_Light.png Binary files differindex de3532a70b..de3532a70b 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_VoiceNo_Light.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_VoiceNo_Light.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_Voice_Dark.png b/indra/newview/skins/gold/textures/icons/Parcel_Voice_Dark.png Binary files differindex 329620fa69..329620fa69 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_Voice_Dark.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_Voice_Dark.png diff --git a/indra/newview/skins/contrast/textures/icons/Parcel_Voice_Light.png b/indra/newview/skins/gold/textures/icons/Parcel_Voice_Light.png Binary files differindex 81e0fa7bc4..81e0fa7bc4 100644 --- a/indra/newview/skins/contrast/textures/icons/Parcel_Voice_Light.png +++ b/indra/newview/skins/gold/textures/icons/Parcel_Voice_Light.png diff --git a/indra/newview/skins/contrast/textures/icons/Pathfinding_Dirty.png b/indra/newview/skins/gold/textures/icons/Pathfinding_Dirty.png Binary files differindex d8fee0fef7..d8fee0fef7 100644 --- a/indra/newview/skins/contrast/textures/icons/Pathfinding_Dirty.png +++ b/indra/newview/skins/gold/textures/icons/Pathfinding_Dirty.png diff --git a/indra/newview/skins/contrast/textures/icons/Pathfinding_Disabled.png b/indra/newview/skins/gold/textures/icons/Pathfinding_Disabled.png Binary files differindex ea2ad79611..ea2ad79611 100644 --- a/indra/newview/skins/contrast/textures/icons/Pathfinding_Disabled.png +++ b/indra/newview/skins/gold/textures/icons/Pathfinding_Disabled.png diff --git a/indra/newview/skins/contrast/textures/icons/Pause_Off.png b/indra/newview/skins/gold/textures/icons/Pause_Off.png Binary files differindex 5d44412783..5d44412783 100644 --- a/indra/newview/skins/contrast/textures/icons/Pause_Off.png +++ b/indra/newview/skins/gold/textures/icons/Pause_Off.png diff --git a/indra/newview/skins/contrast/textures/icons/Pause_Over.png b/indra/newview/skins/gold/textures/icons/Pause_Over.png Binary files differindex d1609a144b..d1609a144b 100644 --- a/indra/newview/skins/contrast/textures/icons/Pause_Over.png +++ b/indra/newview/skins/gold/textures/icons/Pause_Over.png diff --git a/indra/newview/skins/contrast/textures/icons/Pause_Press.png b/indra/newview/skins/gold/textures/icons/Pause_Press.png Binary files differindex 6b918d1ae6..6b918d1ae6 100644 --- a/indra/newview/skins/contrast/textures/icons/Pause_Press.png +++ b/indra/newview/skins/gold/textures/icons/Pause_Press.png diff --git a/indra/newview/skins/contrast/textures/icons/Permission_Ungranted.png b/indra/newview/skins/gold/textures/icons/Permission_Ungranted.png Binary files differindex d206af4433..d206af4433 100644 --- a/indra/newview/skins/contrast/textures/icons/Permission_Ungranted.png +++ b/indra/newview/skins/gold/textures/icons/Permission_Ungranted.png diff --git a/indra/newview/skins/contrast/textures/icons/Person_Check.png b/indra/newview/skins/gold/textures/icons/Person_Check.png Binary files differindex 39a63a70cf..39a63a70cf 100644 --- a/indra/newview/skins/contrast/textures/icons/Person_Check.png +++ b/indra/newview/skins/gold/textures/icons/Person_Check.png diff --git a/indra/newview/skins/contrast/textures/icons/Person_Star.png b/indra/newview/skins/gold/textures/icons/Person_Star.png Binary files differindex c4e625b3c1..c4e625b3c1 100644 --- a/indra/newview/skins/contrast/textures/icons/Person_Star.png +++ b/indra/newview/skins/gold/textures/icons/Person_Star.png diff --git a/indra/newview/skins/contrast/textures/icons/Play_Off.png b/indra/newview/skins/gold/textures/icons/Play_Off.png Binary files differindex dac2f2d6db..dac2f2d6db 100644 --- a/indra/newview/skins/contrast/textures/icons/Play_Off.png +++ b/indra/newview/skins/gold/textures/icons/Play_Off.png diff --git a/indra/newview/skins/contrast/textures/icons/Play_Over.png b/indra/newview/skins/gold/textures/icons/Play_Over.png Binary files differindex 1d261efcda..1d261efcda 100644 --- a/indra/newview/skins/contrast/textures/icons/Play_Over.png +++ b/indra/newview/skins/gold/textures/icons/Play_Over.png diff --git a/indra/newview/skins/contrast/textures/icons/Play_Press.png b/indra/newview/skins/gold/textures/icons/Play_Press.png Binary files differindex f7251ce549..f7251ce549 100644 --- a/indra/newview/skins/contrast/textures/icons/Play_Press.png +++ b/indra/newview/skins/gold/textures/icons/Play_Press.png diff --git a/indra/newview/skins/contrast/textures/icons/Presets_Icon.png b/indra/newview/skins/gold/textures/icons/Presets_Icon.png Binary files differindex 13642e88d1..13642e88d1 100644 --- a/indra/newview/skins/contrast/textures/icons/Presets_Icon.png +++ b/indra/newview/skins/gold/textures/icons/Presets_Icon.png diff --git a/indra/newview/skins/contrast/textures/icons/Presets_Icon_Graphic.png b/indra/newview/skins/gold/textures/icons/Presets_Icon_Graphic.png Binary files differindex 96d1021f81..96d1021f81 100644 --- a/indra/newview/skins/contrast/textures/icons/Presets_Icon_Graphic.png +++ b/indra/newview/skins/gold/textures/icons/Presets_Icon_Graphic.png diff --git a/indra/newview/skins/contrast/textures/icons/Profile_Friend_Offline.png b/indra/newview/skins/gold/textures/icons/Profile_Friend_Offline.png Binary files differindex 55d922cda7..55d922cda7 100644 --- a/indra/newview/skins/contrast/textures/icons/Profile_Friend_Offline.png +++ b/indra/newview/skins/gold/textures/icons/Profile_Friend_Offline.png diff --git a/indra/newview/skins/contrast/textures/icons/Profile_Friend_Online.png b/indra/newview/skins/gold/textures/icons/Profile_Friend_Online.png Binary files differindex febe8e78fa..febe8e78fa 100644 --- a/indra/newview/skins/contrast/textures/icons/Profile_Friend_Online.png +++ b/indra/newview/skins/gold/textures/icons/Profile_Friend_Online.png diff --git a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Find_Disabled.png b/indra/newview/skins/gold/textures/icons/Profile_Perm_Find_Disabled.png Binary files differindex 2632eb173b..2632eb173b 100644 --- a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Find_Disabled.png +++ b/indra/newview/skins/gold/textures/icons/Profile_Perm_Find_Disabled.png diff --git a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Find_Enabled.png b/indra/newview/skins/gold/textures/icons/Profile_Perm_Find_Enabled.png Binary files differindex fd8b152c12..fd8b152c12 100644 --- a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Find_Enabled.png +++ b/indra/newview/skins/gold/textures/icons/Profile_Perm_Find_Enabled.png diff --git a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Objects_Disabled.png b/indra/newview/skins/gold/textures/icons/Profile_Perm_Objects_Disabled.png Binary files differindex cef3ec4e5a..cef3ec4e5a 100644 --- a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Objects_Disabled.png +++ b/indra/newview/skins/gold/textures/icons/Profile_Perm_Objects_Disabled.png diff --git a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Objects_Enabled.png b/indra/newview/skins/gold/textures/icons/Profile_Perm_Objects_Enabled.png Binary files differindex 5821566703..5821566703 100644 --- a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Objects_Enabled.png +++ b/indra/newview/skins/gold/textures/icons/Profile_Perm_Objects_Enabled.png diff --git a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Online_Disabled.png b/indra/newview/skins/gold/textures/icons/Profile_Perm_Online_Disabled.png Binary files differindex ea1b55eca0..ea1b55eca0 100644 --- a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Online_Disabled.png +++ b/indra/newview/skins/gold/textures/icons/Profile_Perm_Online_Disabled.png diff --git a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Online_Enabled.png b/indra/newview/skins/gold/textures/icons/Profile_Perm_Online_Enabled.png Binary files differindex eb3fc9e713..eb3fc9e713 100644 --- a/indra/newview/skins/contrast/textures/icons/Profile_Perm_Online_Enabled.png +++ b/indra/newview/skins/gold/textures/icons/Profile_Perm_Online_Enabled.png diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_1.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_1.png Binary files differindex ff277fc431..ff277fc431 100644 --- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_1.png +++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_1.png diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_10.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_10.png Binary files differindex 1c94e21d89..1c94e21d89 100644 --- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_10.png +++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_10.png diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_11.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_11.png Binary files differindex 89bea9b474..89bea9b474 100644 --- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_11.png +++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_11.png diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_12.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_12.png Binary files differindex da38475ba4..da38475ba4 100644 --- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_12.png +++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_12.png diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_2.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_2.png Binary files differindex c024275ebe..c024275ebe 100644 --- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_2.png +++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_2.png diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_3.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_3.png Binary files differindex 87b931e72e..87b931e72e 100644 --- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_3.png +++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_3.png diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_4.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_4.png Binary files differindex 6dbef74361..6dbef74361 100644 --- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_4.png +++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_4.png diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_5.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_5.png Binary files differindex daccf9b375..daccf9b375 100644 --- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_5.png +++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_5.png diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_6.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_6.png Binary files differindex cafddcb88d..cafddcb88d 100644 --- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_6.png +++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_6.png diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_7.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_7.png Binary files differindex 8acf6472d4..8acf6472d4 100644 --- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_7.png +++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_7.png diff --git a/indra/newview/skins/gold/textures/icons/ProgressLarge_8.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_8.png Binary files differnew file mode 100644 index 0000000000..df0e825cef --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_8.png diff --git a/indra/newview/skins/contrast/textures/icons/ProgressLarge_9.png b/indra/newview/skins/gold/textures/icons/ProgressLarge_9.png Binary files differindex 293a7b8f5c..293a7b8f5c 100644 --- a/indra/newview/skins/contrast/textures/icons/ProgressLarge_9.png +++ b/indra/newview/skins/gold/textures/icons/ProgressLarge_9.png diff --git a/indra/newview/skins/contrast/textures/icons/Progress_1.png b/indra/newview/skins/gold/textures/icons/Progress_1.png Binary files differindex bc7a1e7e96..bc7a1e7e96 100644 --- a/indra/newview/skins/contrast/textures/icons/Progress_1.png +++ b/indra/newview/skins/gold/textures/icons/Progress_1.png diff --git a/indra/newview/skins/contrast/textures/icons/Progress_10.png b/indra/newview/skins/gold/textures/icons/Progress_10.png Binary files differindex acf4d21aba..acf4d21aba 100644 --- a/indra/newview/skins/contrast/textures/icons/Progress_10.png +++ b/indra/newview/skins/gold/textures/icons/Progress_10.png diff --git a/indra/newview/skins/contrast/textures/icons/Progress_11.png b/indra/newview/skins/gold/textures/icons/Progress_11.png Binary files differindex 1842cd09d0..1842cd09d0 100644 --- a/indra/newview/skins/contrast/textures/icons/Progress_11.png +++ b/indra/newview/skins/gold/textures/icons/Progress_11.png diff --git a/indra/newview/skins/contrast/textures/icons/Progress_12.png b/indra/newview/skins/gold/textures/icons/Progress_12.png Binary files differindex 0ea9dda83e..0ea9dda83e 100644 --- a/indra/newview/skins/contrast/textures/icons/Progress_12.png +++ b/indra/newview/skins/gold/textures/icons/Progress_12.png diff --git a/indra/newview/skins/contrast/textures/icons/Progress_2.png b/indra/newview/skins/gold/textures/icons/Progress_2.png Binary files differindex 29d6bbcbcb..29d6bbcbcb 100644 --- a/indra/newview/skins/contrast/textures/icons/Progress_2.png +++ b/indra/newview/skins/gold/textures/icons/Progress_2.png diff --git a/indra/newview/skins/contrast/textures/icons/Progress_3.png b/indra/newview/skins/gold/textures/icons/Progress_3.png Binary files differindex 52a03125e9..52a03125e9 100644 --- a/indra/newview/skins/contrast/textures/icons/Progress_3.png +++ b/indra/newview/skins/gold/textures/icons/Progress_3.png diff --git a/indra/newview/skins/contrast/textures/icons/Progress_4.png b/indra/newview/skins/gold/textures/icons/Progress_4.png Binary files differindex 4b2798519f..4b2798519f 100644 --- a/indra/newview/skins/contrast/textures/icons/Progress_4.png +++ b/indra/newview/skins/gold/textures/icons/Progress_4.png diff --git a/indra/newview/skins/contrast/textures/icons/Progress_5.png b/indra/newview/skins/gold/textures/icons/Progress_5.png Binary files differindex 3f02b8f31a..3f02b8f31a 100644 --- a/indra/newview/skins/contrast/textures/icons/Progress_5.png +++ b/indra/newview/skins/gold/textures/icons/Progress_5.png diff --git a/indra/newview/skins/contrast/textures/icons/Progress_6.png b/indra/newview/skins/gold/textures/icons/Progress_6.png Binary files differindex 04c8f716d4..04c8f716d4 100644 --- a/indra/newview/skins/contrast/textures/icons/Progress_6.png +++ b/indra/newview/skins/gold/textures/icons/Progress_6.png diff --git a/indra/newview/skins/contrast/textures/icons/Progress_7.png b/indra/newview/skins/gold/textures/icons/Progress_7.png Binary files differindex c96b4c08d6..c96b4c08d6 100644 --- a/indra/newview/skins/contrast/textures/icons/Progress_7.png +++ b/indra/newview/skins/gold/textures/icons/Progress_7.png diff --git a/indra/newview/skins/contrast/textures/icons/Progress_8.png b/indra/newview/skins/gold/textures/icons/Progress_8.png Binary files differindex 9463f50707..9463f50707 100644 --- a/indra/newview/skins/contrast/textures/icons/Progress_8.png +++ b/indra/newview/skins/gold/textures/icons/Progress_8.png diff --git a/indra/newview/skins/contrast/textures/icons/Progress_9.png b/indra/newview/skins/gold/textures/icons/Progress_9.png Binary files differindex 928a3e934e..928a3e934e 100644 --- a/indra/newview/skins/contrast/textures/icons/Progress_9.png +++ b/indra/newview/skins/gold/textures/icons/Progress_9.png diff --git a/indra/newview/skins/contrast/textures/icons/Refresh_Off.png b/indra/newview/skins/gold/textures/icons/Refresh_Off.png Binary files differindex e645a8159f..e645a8159f 100644 --- a/indra/newview/skins/contrast/textures/icons/Refresh_Off.png +++ b/indra/newview/skins/gold/textures/icons/Refresh_Off.png diff --git a/indra/newview/skins/gold/textures/icons/SL_Logo.png b/indra/newview/skins/gold/textures/icons/SL_Logo.png Binary files differnew file mode 100644 index 0000000000..5e376c72f9 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/SL_Logo.png diff --git a/indra/newview/skins/contrast/textures/icons/Search_Icon.png b/indra/newview/skins/gold/textures/icons/Search_Icon.png Binary files differindex 0ea7b14f81..0ea7b14f81 100644 --- a/indra/newview/skins/contrast/textures/icons/Search_Icon.png +++ b/indra/newview/skins/gold/textures/icons/Search_Icon.png diff --git a/indra/newview/skins/contrast/textures/icons/Shirt_Large.png b/indra/newview/skins/gold/textures/icons/Shirt_Large.png Binary files differindex 06fce6bbaa..06fce6bbaa 100644 --- a/indra/newview/skins/contrast/textures/icons/Shirt_Large.png +++ b/indra/newview/skins/gold/textures/icons/Shirt_Large.png diff --git a/indra/newview/skins/contrast/textures/icons/Shop.png b/indra/newview/skins/gold/textures/icons/Shop.png Binary files differindex 93353cf2fe..93353cf2fe 100644 --- a/indra/newview/skins/contrast/textures/icons/Shop.png +++ b/indra/newview/skins/gold/textures/icons/Shop.png diff --git a/indra/newview/skins/contrast/textures/icons/SkipBackward_Off.png b/indra/newview/skins/gold/textures/icons/SkipBackward_Off.png Binary files differindex 20fd2b8e22..20fd2b8e22 100644 --- a/indra/newview/skins/contrast/textures/icons/SkipBackward_Off.png +++ b/indra/newview/skins/gold/textures/icons/SkipBackward_Off.png diff --git a/indra/newview/skins/contrast/textures/icons/SkipForward_Off.png b/indra/newview/skins/gold/textures/icons/SkipForward_Off.png Binary files differindex 30e28d3d31..30e28d3d31 100644 --- a/indra/newview/skins/contrast/textures/icons/SkipForward_Off.png +++ b/indra/newview/skins/gold/textures/icons/SkipForward_Off.png diff --git a/indra/newview/skins/contrast/textures/icons/StopReload_Off.png b/indra/newview/skins/gold/textures/icons/StopReload_Off.png Binary files differindex 500a81d715..500a81d715 100644 --- a/indra/newview/skins/contrast/textures/icons/StopReload_Off.png +++ b/indra/newview/skins/gold/textures/icons/StopReload_Off.png diff --git a/indra/newview/skins/contrast/textures/icons/StopReload_Over.png b/indra/newview/skins/gold/textures/icons/StopReload_Over.png Binary files differindex a065a37d14..a065a37d14 100644 --- a/indra/newview/skins/contrast/textures/icons/StopReload_Over.png +++ b/indra/newview/skins/gold/textures/icons/StopReload_Over.png diff --git a/indra/newview/skins/contrast/textures/icons/Stop_Off.png b/indra/newview/skins/gold/textures/icons/Stop_Off.png Binary files differindex 2d00083e2e..2d00083e2e 100644 --- a/indra/newview/skins/contrast/textures/icons/Stop_Off.png +++ b/indra/newview/skins/gold/textures/icons/Stop_Off.png diff --git a/indra/newview/skins/contrast/textures/icons/Sync_Disabled.png b/indra/newview/skins/gold/textures/icons/Sync_Disabled.png Binary files differindex 7b39e7cd6f..7b39e7cd6f 100644 --- a/indra/newview/skins/contrast/textures/icons/Sync_Disabled.png +++ b/indra/newview/skins/gold/textures/icons/Sync_Disabled.png diff --git a/indra/newview/skins/contrast/textures/icons/Sync_Enabled.png b/indra/newview/skins/gold/textures/icons/Sync_Enabled.png Binary files differindex 0e7e5157cb..0e7e5157cb 100644 --- a/indra/newview/skins/contrast/textures/icons/Sync_Enabled.png +++ b/indra/newview/skins/gold/textures/icons/Sync_Enabled.png diff --git a/indra/newview/skins/contrast/textures/icons/Sync_Progress_1.png b/indra/newview/skins/gold/textures/icons/Sync_Progress_1.png Binary files differindex 218edaa986..218edaa986 100644 --- a/indra/newview/skins/contrast/textures/icons/Sync_Progress_1.png +++ b/indra/newview/skins/gold/textures/icons/Sync_Progress_1.png diff --git a/indra/newview/skins/contrast/textures/icons/Sync_Progress_2.png b/indra/newview/skins/gold/textures/icons/Sync_Progress_2.png Binary files differindex 23cb9d63c0..23cb9d63c0 100644 --- a/indra/newview/skins/contrast/textures/icons/Sync_Progress_2.png +++ b/indra/newview/skins/gold/textures/icons/Sync_Progress_2.png diff --git a/indra/newview/skins/contrast/textures/icons/Sync_Progress_3.png b/indra/newview/skins/gold/textures/icons/Sync_Progress_3.png Binary files differindex 490826011a..490826011a 100644 --- a/indra/newview/skins/contrast/textures/icons/Sync_Progress_3.png +++ b/indra/newview/skins/gold/textures/icons/Sync_Progress_3.png diff --git a/indra/newview/skins/contrast/textures/icons/Sync_Progress_4.png b/indra/newview/skins/gold/textures/icons/Sync_Progress_4.png Binary files differindex de1c815e90..de1c815e90 100644 --- a/indra/newview/skins/contrast/textures/icons/Sync_Progress_4.png +++ b/indra/newview/skins/gold/textures/icons/Sync_Progress_4.png diff --git a/indra/newview/skins/contrast/textures/icons/Sync_Progress_5.png b/indra/newview/skins/gold/textures/icons/Sync_Progress_5.png Binary files differindex 2897b37382..2897b37382 100644 --- a/indra/newview/skins/contrast/textures/icons/Sync_Progress_5.png +++ b/indra/newview/skins/gold/textures/icons/Sync_Progress_5.png diff --git a/indra/newview/skins/contrast/textures/icons/Sync_Progress_6.png b/indra/newview/skins/gold/textures/icons/Sync_Progress_6.png Binary files differindex 862410e9e4..862410e9e4 100644 --- a/indra/newview/skins/contrast/textures/icons/Sync_Progress_6.png +++ b/indra/newview/skins/gold/textures/icons/Sync_Progress_6.png diff --git a/indra/newview/skins/contrast/textures/icons/System_Notification_Large.png b/indra/newview/skins/gold/textures/icons/System_Notification_Large.png Binary files differindex 01c6e31f41..01c6e31f41 100644 --- a/indra/newview/skins/contrast/textures/icons/System_Notification_Large.png +++ b/indra/newview/skins/gold/textures/icons/System_Notification_Large.png diff --git a/indra/newview/skins/contrast/textures/icons/System_Notification_Small.png b/indra/newview/skins/gold/textures/icons/System_Notification_Small.png Binary files differindex 69b823d852..69b823d852 100644 --- a/indra/newview/skins/contrast/textures/icons/System_Notification_Small.png +++ b/indra/newview/skins/gold/textures/icons/System_Notification_Small.png diff --git a/indra/newview/skins/contrast/textures/icons/TrashItem_Disabled.png b/indra/newview/skins/gold/textures/icons/TrashItem_Disabled.png Binary files differindex 800d9434d2..800d9434d2 100644 --- a/indra/newview/skins/contrast/textures/icons/TrashItem_Disabled.png +++ b/indra/newview/skins/gold/textures/icons/TrashItem_Disabled.png diff --git a/indra/newview/skins/contrast/textures/icons/TrashItem_Off.png b/indra/newview/skins/gold/textures/icons/TrashItem_Off.png Binary files differindex 0cbff4f1d7..0cbff4f1d7 100644 --- a/indra/newview/skins/contrast/textures/icons/TrashItem_Off.png +++ b/indra/newview/skins/gold/textures/icons/TrashItem_Off.png diff --git a/indra/newview/skins/contrast/textures/icons/TrashItem_Press.png b/indra/newview/skins/gold/textures/icons/TrashItem_Press.png Binary files differindex fac13226e7..fac13226e7 100644 --- a/indra/newview/skins/contrast/textures/icons/TrashItem_Press.png +++ b/indra/newview/skins/gold/textures/icons/TrashItem_Press.png diff --git a/indra/newview/skins/contrast/textures/icons/UnZoom_Off.png b/indra/newview/skins/gold/textures/icons/UnZoom_Off.png Binary files differindex 34ec3f5de8..34ec3f5de8 100644 --- a/indra/newview/skins/contrast/textures/icons/UnZoom_Off.png +++ b/indra/newview/skins/gold/textures/icons/UnZoom_Off.png diff --git a/indra/newview/skins/contrast/textures/icons/UpArrow_Off.png b/indra/newview/skins/gold/textures/icons/UpArrow_Off.png Binary files differindex d5ddc353e7..d5ddc353e7 100644 --- a/indra/newview/skins/contrast/textures/icons/UpArrow_Off.png +++ b/indra/newview/skins/gold/textures/icons/UpArrow_Off.png diff --git a/indra/newview/skins/contrast/textures/icons/Video_URL_Off.png b/indra/newview/skins/gold/textures/icons/Video_URL_Off.png Binary files differindex d37a189645..d37a189645 100644 --- a/indra/newview/skins/contrast/textures/icons/Video_URL_Off.png +++ b/indra/newview/skins/gold/textures/icons/Video_URL_Off.png diff --git a/indra/newview/skins/gold/textures/icons/VoiceMute_Off.png b/indra/newview/skins/gold/textures/icons/VoiceMute_Off.png Binary files differnew file mode 100644 index 0000000000..425ba267a5 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/VoiceMute_Off.png diff --git a/indra/newview/skins/gold/textures/icons/VoicePTT_Lvl1.png b/indra/newview/skins/gold/textures/icons/VoicePTT_Lvl1.png Binary files differnew file mode 100644 index 0000000000..cc3407b57d --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/VoicePTT_Lvl1.png diff --git a/indra/newview/skins/gold/textures/icons/VoicePTT_Lvl2.png b/indra/newview/skins/gold/textures/icons/VoicePTT_Lvl2.png Binary files differnew file mode 100644 index 0000000000..49f58d7cd0 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/VoicePTT_Lvl2.png diff --git a/indra/newview/skins/gold/textures/icons/VoicePTT_Lvl3.png b/indra/newview/skins/gold/textures/icons/VoicePTT_Lvl3.png Binary files differnew file mode 100644 index 0000000000..a4a171bd81 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/VoicePTT_Lvl3.png diff --git a/indra/newview/skins/gold/textures/icons/VoicePTT_Off.png b/indra/newview/skins/gold/textures/icons/VoicePTT_Off.png Binary files differnew file mode 100644 index 0000000000..533663a4fa --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/VoicePTT_Off.png diff --git a/indra/newview/skins/gold/textures/icons/VoicePTT_On.png b/indra/newview/skins/gold/textures/icons/VoicePTT_On.png Binary files differnew file mode 100644 index 0000000000..204c4a376e --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/VoicePTT_On.png diff --git a/indra/newview/skins/contrast/textures/icons/Web_Profile_Off.png b/indra/newview/skins/gold/textures/icons/Web_Profile_Off.png Binary files differindex cf8f9c8f94..cf8f9c8f94 100644 --- a/indra/newview/skins/contrast/textures/icons/Web_Profile_Off.png +++ b/indra/newview/skins/gold/textures/icons/Web_Profile_Off.png diff --git a/indra/newview/skins/contrast/textures/icons/YouAreHere_Badge.png b/indra/newview/skins/gold/textures/icons/YouAreHere_Badge.png Binary files differindex ed1805c096..ed1805c096 100644 --- a/indra/newview/skins/contrast/textures/icons/YouAreHere_Badge.png +++ b/indra/newview/skins/gold/textures/icons/YouAreHere_Badge.png diff --git a/indra/newview/skins/contrast/textures/icons/Zoom_Off.png b/indra/newview/skins/gold/textures/icons/Zoom_Off.png Binary files differindex 833e608201..833e608201 100644 --- a/indra/newview/skins/contrast/textures/icons/Zoom_Off.png +++ b/indra/newview/skins/gold/textures/icons/Zoom_Off.png diff --git a/indra/newview/skins/gold/textures/icons/add_icon.png b/indra/newview/skins/gold/textures/icons/add_icon.png Binary files differnew file mode 100644 index 0000000000..b5b09ae6e0 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/add_icon.png diff --git a/indra/newview/skins/gold/textures/icons/back_arrow_off.png b/indra/newview/skins/gold/textures/icons/back_arrow_off.png Binary files differnew file mode 100644 index 0000000000..512d78669f --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/back_arrow_off.png diff --git a/indra/newview/skins/gold/textures/icons/back_arrow_over.png b/indra/newview/skins/gold/textures/icons/back_arrow_over.png Binary files differnew file mode 100644 index 0000000000..222cf067b2 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/back_arrow_over.png diff --git a/indra/newview/skins/gold/textures/icons/back_arrow_press.png b/indra/newview/skins/gold/textures/icons/back_arrow_press.png Binary files differnew file mode 100644 index 0000000000..bfa68d3a8a --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/back_arrow_press.png diff --git a/indra/newview/skins/gold/textures/icons/check_mark.png b/indra/newview/skins/gold/textures/icons/check_mark.png Binary files differnew file mode 100755 index 0000000000..3bc5665ee9 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/check_mark.png diff --git a/indra/newview/skins/contrast/textures/icons/collapse_to_one_line.png b/indra/newview/skins/gold/textures/icons/collapse_to_one_line.png Binary files differindex 3730924ad8..3730924ad8 100644 --- a/indra/newview/skins/contrast/textures/icons/collapse_to_one_line.png +++ b/indra/newview/skins/gold/textures/icons/collapse_to_one_line.png diff --git a/indra/newview/skins/contrast/textures/icons/copy_clipboard.png b/indra/newview/skins/gold/textures/icons/copy_clipboard.png Binary files differindex 9ce67d8547..9ce67d8547 100644 --- a/indra/newview/skins/contrast/textures/icons/copy_clipboard.png +++ b/indra/newview/skins/gold/textures/icons/copy_clipboard.png diff --git a/indra/newview/skins/contrast/textures/icons/delete_icon.png b/indra/newview/skins/gold/textures/icons/delete_icon.png Binary files differindex 5a80155d8b..5a80155d8b 100644 --- a/indra/newview/skins/contrast/textures/icons/delete_icon.png +++ b/indra/newview/skins/gold/textures/icons/delete_icon.png diff --git a/indra/newview/skins/contrast/textures/icons/edit_mine.png b/indra/newview/skins/gold/textures/icons/edit_mine.png Binary files differindex 2fb10deba2..2fb10deba2 100644 --- a/indra/newview/skins/contrast/textures/icons/edit_mine.png +++ b/indra/newview/skins/gold/textures/icons/edit_mine.png diff --git a/indra/newview/skins/contrast/textures/icons/edit_theirs.png b/indra/newview/skins/gold/textures/icons/edit_theirs.png Binary files differindex 586c08c181..586c08c181 100644 --- a/indra/newview/skins/contrast/textures/icons/edit_theirs.png +++ b/indra/newview/skins/gold/textures/icons/edit_theirs.png diff --git a/indra/newview/skins/contrast/textures/icons/emoji_picker_icon.png b/indra/newview/skins/gold/textures/icons/emoji_picker_icon.png Binary files differindex 6c1a1a3c62..6c1a1a3c62 100644 --- a/indra/newview/skins/contrast/textures/icons/emoji_picker_icon.png +++ b/indra/newview/skins/gold/textures/icons/emoji_picker_icon.png diff --git a/indra/newview/skins/contrast/textures/icons/expand_one_liner.png b/indra/newview/skins/gold/textures/icons/expand_one_liner.png Binary files differindex 0d1a60547a..0d1a60547a 100644 --- a/indra/newview/skins/contrast/textures/icons/expand_one_liner.png +++ b/indra/newview/skins/gold/textures/icons/expand_one_liner.png diff --git a/indra/newview/skins/contrast/textures/icons/file_upload.png b/indra/newview/skins/gold/textures/icons/file_upload.png Binary files differindex 78b75fdd72..78b75fdd72 100644 --- a/indra/newview/skins/contrast/textures/icons/file_upload.png +++ b/indra/newview/skins/gold/textures/icons/file_upload.png diff --git a/indra/newview/skins/gold/textures/icons/hand.png b/indra/newview/skins/gold/textures/icons/hand.png Binary files differnew file mode 100644 index 0000000000..5fbdb70c2b --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/hand.png diff --git a/indra/newview/skins/contrast/textures/icons/map_placeholder.png b/indra/newview/skins/gold/textures/icons/map_placeholder.png Binary files differindex 80e5deac7e..80e5deac7e 100644 --- a/indra/newview/skins/contrast/textures/icons/map_placeholder.png +++ b/indra/newview/skins/gold/textures/icons/map_placeholder.png diff --git a/indra/newview/skins/contrast/textures/icons/multi_folder_mode.png b/indra/newview/skins/gold/textures/icons/multi_folder_mode.png Binary files differindex b363848aba..b363848aba 100644 --- a/indra/newview/skins/contrast/textures/icons/multi_folder_mode.png +++ b/indra/newview/skins/gold/textures/icons/multi_folder_mode.png diff --git a/indra/newview/skins/contrast/textures/icons/nearby_chat_icon.png b/indra/newview/skins/gold/textures/icons/nearby_chat_icon.png Binary files differindex c5f52f010e..c5f52f010e 100644 --- a/indra/newview/skins/contrast/textures/icons/nearby_chat_icon.png +++ b/indra/newview/skins/gold/textures/icons/nearby_chat_icon.png diff --git a/indra/newview/skins/contrast/textures/icons/object_icon.png b/indra/newview/skins/gold/textures/icons/object_icon.png Binary files differindex 51bf0b0649..51bf0b0649 100644 --- a/indra/newview/skins/contrast/textures/icons/object_icon.png +++ b/indra/newview/skins/gold/textures/icons/object_icon.png diff --git a/indra/newview/skins/contrast/textures/icons/paste_clipboard.png b/indra/newview/skins/gold/textures/icons/paste_clipboard.png Binary files differindex ff8493d4ad..ff8493d4ad 100644 --- a/indra/newview/skins/contrast/textures/icons/paste_clipboard.png +++ b/indra/newview/skins/gold/textures/icons/paste_clipboard.png diff --git a/indra/newview/skins/contrast/textures/icons/pop_up_caution.png b/indra/newview/skins/gold/textures/icons/pop_up_caution.png Binary files differindex 63b5cdfe83..63b5cdfe83 100644 --- a/indra/newview/skins/contrast/textures/icons/pop_up_caution.png +++ b/indra/newview/skins/gold/textures/icons/pop_up_caution.png diff --git a/indra/newview/skins/contrast/textures/icons/profile_badge_beta.png b/indra/newview/skins/gold/textures/icons/profile_badge_beta.png Binary files differindex 95e277aab0..95e277aab0 100644 --- a/indra/newview/skins/contrast/textures/icons/profile_badge_beta.png +++ b/indra/newview/skins/gold/textures/icons/profile_badge_beta.png diff --git a/indra/newview/skins/contrast/textures/icons/profile_badge_beta_lifetime.png b/indra/newview/skins/gold/textures/icons/profile_badge_beta_lifetime.png Binary files differindex fb145901e2..fb145901e2 100644 --- a/indra/newview/skins/contrast/textures/icons/profile_badge_beta_lifetime.png +++ b/indra/newview/skins/gold/textures/icons/profile_badge_beta_lifetime.png diff --git a/indra/newview/skins/contrast/textures/icons/profile_badge_lifetime.png b/indra/newview/skins/gold/textures/icons/profile_badge_lifetime.png Binary files differindex 3f7fd343b3..3f7fd343b3 100644 --- a/indra/newview/skins/contrast/textures/icons/profile_badge_lifetime.png +++ b/indra/newview/skins/gold/textures/icons/profile_badge_lifetime.png diff --git a/indra/newview/skins/contrast/textures/icons/profile_badge_linden.png b/indra/newview/skins/gold/textures/icons/profile_badge_linden.png Binary files differindex 6ab9fcebea..6ab9fcebea 100644 --- a/indra/newview/skins/contrast/textures/icons/profile_badge_linden.png +++ b/indra/newview/skins/gold/textures/icons/profile_badge_linden.png diff --git a/indra/newview/skins/contrast/textures/icons/profile_badge_pplus_lifetime.png b/indra/newview/skins/gold/textures/icons/profile_badge_pplus_lifetime.png Binary files differindex 5c68ad40ce..5c68ad40ce 100644 --- a/indra/newview/skins/contrast/textures/icons/profile_badge_pplus_lifetime.png +++ b/indra/newview/skins/gold/textures/icons/profile_badge_pplus_lifetime.png diff --git a/indra/newview/skins/contrast/textures/icons/profile_badge_premium_lifetime.png b/indra/newview/skins/gold/textures/icons/profile_badge_premium_lifetime.png Binary files differindex 58957b7b96..58957b7b96 100644 --- a/indra/newview/skins/contrast/textures/icons/profile_badge_premium_lifetime.png +++ b/indra/newview/skins/gold/textures/icons/profile_badge_premium_lifetime.png diff --git a/indra/newview/skins/contrast/textures/icons/profile_group_visibility_eye_off.png b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_off.png Binary files differindex 331553492c..331553492c 100644 --- a/indra/newview/skins/contrast/textures/icons/profile_group_visibility_eye_off.png +++ b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_off.png diff --git a/indra/newview/skins/contrast/textures/icons/profile_group_visibility_eye_off_pressed.png b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_off_pressed.png Binary files differindex e9e9c1b626..e9e9c1b626 100644 --- a/indra/newview/skins/contrast/textures/icons/profile_group_visibility_eye_off_pressed.png +++ b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_off_pressed.png diff --git a/indra/newview/skins/contrast/textures/icons/profile_group_visibility_eye_on.png b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_on.png Binary files differindex 4f5374d614..4f5374d614 100644 --- a/indra/newview/skins/contrast/textures/icons/profile_group_visibility_eye_on.png +++ b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_on.png diff --git a/indra/newview/skins/contrast/textures/icons/profile_group_visibility_eye_on_pressed.png b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_on_pressed.png Binary files differindex e8a64541ee..e8a64541ee 100644 --- a/indra/newview/skins/contrast/textures/icons/profile_group_visibility_eye_on_pressed.png +++ b/indra/newview/skins/gold/textures/icons/profile_group_visibility_eye_on_pressed.png diff --git a/indra/newview/skins/contrast/textures/icons/remove_icon.png b/indra/newview/skins/gold/textures/icons/remove_icon.png Binary files differindex d8a45cc21c..d8a45cc21c 100644 --- a/indra/newview/skins/contrast/textures/icons/remove_icon.png +++ b/indra/newview/skins/gold/textures/icons/remove_icon.png diff --git a/indra/newview/skins/gold/textures/icons/see_me_online.png b/indra/newview/skins/gold/textures/icons/see_me_online.png Binary files differnew file mode 100644 index 0000000000..adc37f5528 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/see_me_online.png diff --git a/indra/newview/skins/gold/textures/icons/see_on_map.png b/indra/newview/skins/gold/textures/icons/see_on_map.png Binary files differnew file mode 100644 index 0000000000..73415b9afe --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/see_on_map.png diff --git a/indra/newview/skins/gold/textures/icons/see_them_on_map.png b/indra/newview/skins/gold/textures/icons/see_them_on_map.png Binary files differnew file mode 100644 index 0000000000..e5f2978dc0 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/see_them_on_map.png diff --git a/indra/newview/skins/gold/textures/icons/see_them_online.png b/indra/newview/skins/gold/textures/icons/see_them_online.png Binary files differnew file mode 100644 index 0000000000..7ddd41f9a0 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/see_them_online.png diff --git a/indra/newview/skins/contrast/textures/icons/single_folder_back.png b/indra/newview/skins/gold/textures/icons/single_folder_back.png Binary files differindex b93bb2525a..b93bb2525a 100644 --- a/indra/newview/skins/contrast/textures/icons/single_folder_back.png +++ b/indra/newview/skins/gold/textures/icons/single_folder_back.png diff --git a/indra/newview/skins/contrast/textures/icons/single_folder_forward.png b/indra/newview/skins/gold/textures/icons/single_folder_forward.png Binary files differindex 12a21b2bba..12a21b2bba 100644 --- a/indra/newview/skins/contrast/textures/icons/single_folder_forward.png +++ b/indra/newview/skins/gold/textures/icons/single_folder_forward.png diff --git a/indra/newview/skins/contrast/textures/icons/single_folder_mode.png b/indra/newview/skins/gold/textures/icons/single_folder_mode.png Binary files differindex 0fc8475917..0fc8475917 100644 --- a/indra/newview/skins/contrast/textures/icons/single_folder_mode.png +++ b/indra/newview/skins/gold/textures/icons/single_folder_mode.png diff --git a/indra/newview/skins/contrast/textures/icons/single_folder_up.png b/indra/newview/skins/gold/textures/icons/single_folder_up.png Binary files differindex c1c8c63870..c1c8c63870 100644 --- a/indra/newview/skins/contrast/textures/icons/single_folder_up.png +++ b/indra/newview/skins/gold/textures/icons/single_folder_up.png diff --git a/indra/newview/skins/contrast/textures/icons/snapshot_icon.png b/indra/newview/skins/gold/textures/icons/snapshot_icon.png Binary files differindex 9b6ac6eeb0..9b6ac6eeb0 100644 --- a/indra/newview/skins/contrast/textures/icons/snapshot_icon.png +++ b/indra/newview/skins/gold/textures/icons/snapshot_icon.png diff --git a/indra/newview/skins/contrast/textures/icons/texture_icon.png b/indra/newview/skins/gold/textures/icons/texture_icon.png Binary files differindex f5c205208c..f5c205208c 100644 --- a/indra/newview/skins/contrast/textures/icons/texture_icon.png +++ b/indra/newview/skins/gold/textures/icons/texture_icon.png diff --git a/indra/newview/skins/contrast/textures/icons/thumbnail_fallback_icon.png b/indra/newview/skins/gold/textures/icons/thumbnail_fallback_icon.png Binary files differindex 19629aba04..19629aba04 100644 --- a/indra/newview/skins/contrast/textures/icons/thumbnail_fallback_icon.png +++ b/indra/newview/skins/gold/textures/icons/thumbnail_fallback_icon.png diff --git a/indra/newview/skins/gold/textures/icons/unknown_icon.png b/indra/newview/skins/gold/textures/icons/unknown_icon.png Binary files differnew file mode 100644 index 0000000000..9a4e7f8616 --- /dev/null +++ b/indra/newview/skins/gold/textures/icons/unknown_icon.png diff --git a/indra/newview/skins/contrast/textures/jump_left_in.tga b/indra/newview/skins/gold/textures/jump_left_in.tga Binary files differindex e0656c901d..e0656c901d 100644 --- a/indra/newview/skins/contrast/textures/jump_left_in.tga +++ b/indra/newview/skins/gold/textures/jump_left_in.tga diff --git a/indra/newview/skins/contrast/textures/jump_left_out.tga b/indra/newview/skins/gold/textures/jump_left_out.tga Binary files differindex fb6dac0c3d..fb6dac0c3d 100644 --- a/indra/newview/skins/contrast/textures/jump_left_out.tga +++ b/indra/newview/skins/gold/textures/jump_left_out.tga diff --git a/indra/newview/skins/contrast/textures/jump_right_in.tga b/indra/newview/skins/gold/textures/jump_right_in.tga Binary files differindex 010c748c2a..010c748c2a 100644 --- a/indra/newview/skins/contrast/textures/jump_right_in.tga +++ b/indra/newview/skins/gold/textures/jump_right_in.tga diff --git a/indra/newview/skins/contrast/textures/jump_right_out.tga b/indra/newview/skins/gold/textures/jump_right_out.tga Binary files differindex 33355262d4..33355262d4 100644 --- a/indra/newview/skins/contrast/textures/jump_right_out.tga +++ b/indra/newview/skins/gold/textures/jump_right_out.tga diff --git a/indra/newview/skins/contrast/textures/lag_status_critical.tga b/indra/newview/skins/gold/textures/lag_status_critical.tga Binary files differindex bbc71d9e77..bbc71d9e77 100644 --- a/indra/newview/skins/contrast/textures/lag_status_critical.tga +++ b/indra/newview/skins/gold/textures/lag_status_critical.tga diff --git a/indra/newview/skins/contrast/textures/lag_status_good.tga b/indra/newview/skins/gold/textures/lag_status_good.tga Binary files differindex 680ba90f17..680ba90f17 100644 --- a/indra/newview/skins/contrast/textures/lag_status_good.tga +++ b/indra/newview/skins/gold/textures/lag_status_good.tga diff --git a/indra/newview/skins/contrast/textures/lag_status_warning.tga b/indra/newview/skins/gold/textures/lag_status_warning.tga Binary files differindex 13ce3cc396..13ce3cc396 100644 --- a/indra/newview/skins/contrast/textures/lag_status_warning.tga +++ b/indra/newview/skins/gold/textures/lag_status_warning.tga diff --git a/indra/newview/skins/contrast/textures/legend.tga b/indra/newview/skins/gold/textures/legend.tga Binary files differindex 0dbb8fda4f..0dbb8fda4f 100644 --- a/indra/newview/skins/contrast/textures/legend.tga +++ b/indra/newview/skins/gold/textures/legend.tga diff --git a/indra/newview/skins/contrast/textures/locked_image.j2c b/indra/newview/skins/gold/textures/locked_image.j2c Binary files differindex 9e8998d675..9e8998d675 100644 --- a/indra/newview/skins/contrast/textures/locked_image.j2c +++ b/indra/newview/skins/gold/textures/locked_image.j2c diff --git a/indra/newview/skins/contrast/textures/map_avatar_16.tga b/indra/newview/skins/gold/textures/map_avatar_16.tga Binary files differindex f59e9e9193..f59e9e9193 100644 --- a/indra/newview/skins/contrast/textures/map_avatar_16.tga +++ b/indra/newview/skins/gold/textures/map_avatar_16.tga diff --git a/indra/newview/skins/contrast/textures/map_avatar_32.tga b/indra/newview/skins/gold/textures/map_avatar_32.tga Binary files differindex aebeab4093..aebeab4093 100644 --- a/indra/newview/skins/contrast/textures/map_avatar_32.tga +++ b/indra/newview/skins/gold/textures/map_avatar_32.tga diff --git a/indra/newview/skins/contrast/textures/map_avatar_8.tga b/indra/newview/skins/gold/textures/map_avatar_8.tga Binary files differindex 8500eadeba..8500eadeba 100644 --- a/indra/newview/skins/contrast/textures/map_avatar_8.tga +++ b/indra/newview/skins/gold/textures/map_avatar_8.tga diff --git a/indra/newview/skins/contrast/textures/map_avatar_above_32.tga b/indra/newview/skins/gold/textures/map_avatar_above_32.tga Binary files differindex 65bd0561a7..65bd0561a7 100644 --- a/indra/newview/skins/contrast/textures/map_avatar_above_32.tga +++ b/indra/newview/skins/gold/textures/map_avatar_above_32.tga diff --git a/indra/newview/skins/contrast/textures/map_avatar_below_32.tga b/indra/newview/skins/gold/textures/map_avatar_below_32.tga Binary files differindex 496c44b369..496c44b369 100644 --- a/indra/newview/skins/contrast/textures/map_avatar_below_32.tga +++ b/indra/newview/skins/gold/textures/map_avatar_below_32.tga diff --git a/indra/newview/skins/contrast/textures/map_avatar_unknown_32.tga b/indra/newview/skins/gold/textures/map_avatar_unknown_32.tga Binary files differindex d1192478c6..d1192478c6 100644 --- a/indra/newview/skins/contrast/textures/map_avatar_unknown_32.tga +++ b/indra/newview/skins/gold/textures/map_avatar_unknown_32.tga diff --git a/indra/newview/skins/contrast/textures/map_avatar_you_32.tga b/indra/newview/skins/gold/textures/map_avatar_you_32.tga Binary files differindex 84b57aceaf..84b57aceaf 100644 --- a/indra/newview/skins/contrast/textures/map_avatar_you_32.tga +++ b/indra/newview/skins/gold/textures/map_avatar_you_32.tga diff --git a/indra/newview/skins/contrast/textures/map_event.tga b/indra/newview/skins/gold/textures/map_event.tga Binary files differindex 2c06d08fd2..2c06d08fd2 100644 --- a/indra/newview/skins/contrast/textures/map_event.tga +++ b/indra/newview/skins/gold/textures/map_event.tga diff --git a/indra/newview/skins/contrast/textures/map_home.tga b/indra/newview/skins/gold/textures/map_home.tga Binary files differindex acaaa3db44..acaaa3db44 100644 --- a/indra/newview/skins/contrast/textures/map_home.tga +++ b/indra/newview/skins/gold/textures/map_home.tga diff --git a/indra/newview/skins/contrast/textures/map_infohub.tga b/indra/newview/skins/gold/textures/map_infohub.tga Binary files differindex d0134fa5fe..d0134fa5fe 100644 --- a/indra/newview/skins/contrast/textures/map_infohub.tga +++ b/indra/newview/skins/gold/textures/map_infohub.tga diff --git a/indra/newview/skins/contrast/textures/map_telehub.tga b/indra/newview/skins/gold/textures/map_telehub.tga Binary files differindex 545b8e532c..545b8e532c 100644 --- a/indra/newview/skins/contrast/textures/map_telehub.tga +++ b/indra/newview/skins/gold/textures/map_telehub.tga diff --git a/indra/newview/skins/contrast/textures/map_track_16.tga b/indra/newview/skins/gold/textures/map_track_16.tga Binary files differindex 451ce24cf0..451ce24cf0 100644 --- a/indra/newview/skins/contrast/textures/map_track_16.tga +++ b/indra/newview/skins/gold/textures/map_track_16.tga diff --git a/indra/newview/skins/contrast/textures/map_ui_collapse_icon.png b/indra/newview/skins/gold/textures/map_ui_collapse_icon.png Binary files differindex e4de49d4af..e4de49d4af 100644 --- a/indra/newview/skins/contrast/textures/map_ui_collapse_icon.png +++ b/indra/newview/skins/gold/textures/map_ui_collapse_icon.png diff --git a/indra/newview/skins/contrast/textures/map_ui_expand_icon.png b/indra/newview/skins/gold/textures/map_ui_expand_icon.png Binary files differindex 08734b4cc0..08734b4cc0 100644 --- a/indra/newview/skins/contrast/textures/map_ui_expand_icon.png +++ b/indra/newview/skins/gold/textures/map_ui_expand_icon.png diff --git a/indra/newview/skins/contrast/textures/materials_ui_x_24.png b/indra/newview/skins/gold/textures/materials_ui_x_24.png Binary files differindex 6d88554914..6d88554914 100644 --- a/indra/newview/skins/contrast/textures/materials_ui_x_24.png +++ b/indra/newview/skins/gold/textures/materials_ui_x_24.png diff --git a/indra/newview/skins/gold/textures/megapahit/icon_group.png b/indra/newview/skins/gold/textures/megapahit/icon_group.png Binary files differnew file mode 100644 index 0000000000..f3872dea3f --- /dev/null +++ b/indra/newview/skins/gold/textures/megapahit/icon_group.png diff --git a/indra/newview/skins/gold/textures/megapahit/icon_land_auction.png b/indra/newview/skins/gold/textures/megapahit/icon_land_auction.png Binary files differnew file mode 100644 index 0000000000..550703968f --- /dev/null +++ b/indra/newview/skins/gold/textures/megapahit/icon_land_auction.png diff --git a/indra/newview/skins/gold/textures/megapahit/icon_land_forsale.png b/indra/newview/skins/gold/textures/megapahit/icon_land_forsale.png Binary files differnew file mode 100644 index 0000000000..209bb868ea --- /dev/null +++ b/indra/newview/skins/gold/textures/megapahit/icon_land_forsale.png diff --git a/indra/newview/skins/gold/textures/megapahit/icon_place.png b/indra/newview/skins/gold/textures/megapahit/icon_place.png Binary files differnew file mode 100644 index 0000000000..60cf42424a --- /dev/null +++ b/indra/newview/skins/gold/textures/megapahit/icon_place.png diff --git a/indra/newview/skins/contrast/textures/menu_separator.png b/indra/newview/skins/gold/textures/menu_separator.png Binary files differindex 7bb27c499d..7bb27c499d 100644 --- a/indra/newview/skins/contrast/textures/menu_separator.png +++ b/indra/newview/skins/gold/textures/menu_separator.png diff --git a/indra/newview/skins/contrast/textures/missing_asset.tga b/indra/newview/skins/gold/textures/missing_asset.tga Binary files differindex 9a43f4db5d..9a43f4db5d 100644 --- a/indra/newview/skins/contrast/textures/missing_asset.tga +++ b/indra/newview/skins/gold/textures/missing_asset.tga diff --git a/indra/newview/skins/gold/textures/model_wizard/progress_bar_bg.png b/indra/newview/skins/gold/textures/model_wizard/progress_bar_bg.png Binary files differnew file mode 100644 index 0000000000..7c6920205f --- /dev/null +++ b/indra/newview/skins/gold/textures/model_wizard/progress_bar_bg.png diff --git a/indra/newview/skins/gold/textures/model_wizard/progress_light.png b/indra/newview/skins/gold/textures/model_wizard/progress_light.png Binary files differnew file mode 100755 index 0000000000..41de60badf --- /dev/null +++ b/indra/newview/skins/gold/textures/model_wizard/progress_light.png diff --git a/indra/newview/skins/contrast/textures/navbar/Arrow_Left_Off.png b/indra/newview/skins/gold/textures/navbar/Arrow_Left_Off.png Binary files differindex 19569501fe..19569501fe 100644 --- a/indra/newview/skins/contrast/textures/navbar/Arrow_Left_Off.png +++ b/indra/newview/skins/gold/textures/navbar/Arrow_Left_Off.png diff --git a/indra/newview/skins/contrast/textures/navbar/Arrow_Right_Off.png b/indra/newview/skins/gold/textures/navbar/Arrow_Right_Off.png Binary files differindex 3648c42656..3648c42656 100644 --- a/indra/newview/skins/contrast/textures/navbar/Arrow_Right_Off.png +++ b/indra/newview/skins/gold/textures/navbar/Arrow_Right_Off.png diff --git a/indra/newview/skins/gold/textures/navbar/BuyArrow_Off.png b/indra/newview/skins/gold/textures/navbar/BuyArrow_Off.png Binary files differnew file mode 100755 index 0000000000..e7203bcb45 --- /dev/null +++ b/indra/newview/skins/gold/textures/navbar/BuyArrow_Off.png diff --git a/indra/newview/skins/gold/textures/navbar/BuyArrow_Over.png b/indra/newview/skins/gold/textures/navbar/BuyArrow_Over.png Binary files differnew file mode 100755 index 0000000000..75f33d1c1b --- /dev/null +++ b/indra/newview/skins/gold/textures/navbar/BuyArrow_Over.png diff --git a/indra/newview/skins/gold/textures/navbar/BuyArrow_Press.png b/indra/newview/skins/gold/textures/navbar/BuyArrow_Press.png Binary files differnew file mode 100755 index 0000000000..e0924e56b7 --- /dev/null +++ b/indra/newview/skins/gold/textures/navbar/BuyArrow_Press.png diff --git a/indra/newview/skins/contrast/textures/navbar/Favorite_Link_Over.png b/indra/newview/skins/gold/textures/navbar/Favorite_Link_Over.png Binary files differindex d4f126f969..d4f126f969 100644 --- a/indra/newview/skins/contrast/textures/navbar/Favorite_Link_Over.png +++ b/indra/newview/skins/gold/textures/navbar/Favorite_Link_Over.png diff --git a/indra/newview/skins/gold/textures/navbar/Favorite_Star_Active.png b/indra/newview/skins/gold/textures/navbar/Favorite_Star_Active.png Binary files differnew file mode 100644 index 0000000000..e662ca9577 --- /dev/null +++ b/indra/newview/skins/gold/textures/navbar/Favorite_Star_Active.png diff --git a/indra/newview/skins/gold/textures/navbar/Favorite_Star_Off.png b/indra/newview/skins/gold/textures/navbar/Favorite_Star_Off.png Binary files differnew file mode 100644 index 0000000000..82d044d817 --- /dev/null +++ b/indra/newview/skins/gold/textures/navbar/Favorite_Star_Off.png diff --git a/indra/newview/skins/gold/textures/navbar/Favorite_Star_Over.png b/indra/newview/skins/gold/textures/navbar/Favorite_Star_Over.png Binary files differnew file mode 100644 index 0000000000..03fef8334f --- /dev/null +++ b/indra/newview/skins/gold/textures/navbar/Favorite_Star_Over.png diff --git a/indra/newview/skins/gold/textures/navbar/Favorite_Star_Press.png b/indra/newview/skins/gold/textures/navbar/Favorite_Star_Press.png Binary files differnew file mode 100644 index 0000000000..6670667022 --- /dev/null +++ b/indra/newview/skins/gold/textures/navbar/Favorite_Star_Press.png diff --git a/indra/newview/skins/contrast/textures/navbar/FileMenu_Divider.png b/indra/newview/skins/gold/textures/navbar/FileMenu_Divider.png Binary files differindex 5ab4abc5b8..5ab4abc5b8 100644 --- a/indra/newview/skins/contrast/textures/navbar/FileMenu_Divider.png +++ b/indra/newview/skins/gold/textures/navbar/FileMenu_Divider.png diff --git a/indra/newview/skins/contrast/textures/navbar/Flag.png b/indra/newview/skins/gold/textures/navbar/Flag.png Binary files differindex df53c89224..df53c89224 100644 --- a/indra/newview/skins/contrast/textures/navbar/Flag.png +++ b/indra/newview/skins/gold/textures/navbar/Flag.png diff --git a/indra/newview/skins/contrast/textures/navbar/Help_Press.png b/indra/newview/skins/gold/textures/navbar/Help_Press.png Binary files differindex ed3695f9d5..ed3695f9d5 100644 --- a/indra/newview/skins/contrast/textures/navbar/Help_Press.png +++ b/indra/newview/skins/gold/textures/navbar/Help_Press.png diff --git a/indra/newview/skins/contrast/textures/navbar/Home_Off.png b/indra/newview/skins/gold/textures/navbar/Home_Off.png Binary files differindex fe3bc63b77..fe3bc63b77 100644 --- a/indra/newview/skins/contrast/textures/navbar/Home_Off.png +++ b/indra/newview/skins/gold/textures/navbar/Home_Off.png diff --git a/indra/newview/skins/gold/textures/navbar/Info_Off.png b/indra/newview/skins/gold/textures/navbar/Info_Off.png Binary files differnew file mode 100644 index 0000000000..07b65ddf8b --- /dev/null +++ b/indra/newview/skins/gold/textures/navbar/Info_Off.png diff --git a/indra/newview/skins/gold/textures/navbar/Info_Over.png b/indra/newview/skins/gold/textures/navbar/Info_Over.png Binary files differnew file mode 100644 index 0000000000..fb7ff78fa4 --- /dev/null +++ b/indra/newview/skins/gold/textures/navbar/Info_Over.png diff --git a/indra/newview/skins/gold/textures/navbar/Info_Press.png b/indra/newview/skins/gold/textures/navbar/Info_Press.png Binary files differnew file mode 100644 index 0000000000..93e82f270b --- /dev/null +++ b/indra/newview/skins/gold/textures/navbar/Info_Press.png diff --git a/indra/newview/skins/contrast/textures/navbar/Landmarks.png b/indra/newview/skins/gold/textures/navbar/Landmarks.png Binary files differindex 2b35de913b..2b35de913b 100644 --- a/indra/newview/skins/contrast/textures/navbar/Landmarks.png +++ b/indra/newview/skins/gold/textures/navbar/Landmarks.png diff --git a/indra/newview/skins/contrast/textures/navbar/Lock.png b/indra/newview/skins/gold/textures/navbar/Lock.png Binary files differindex cf569d6ad2..cf569d6ad2 100644 --- a/indra/newview/skins/contrast/textures/navbar/Lock.png +++ b/indra/newview/skins/gold/textures/navbar/Lock.png diff --git a/indra/newview/skins/gold/textures/navbar/NavBar_BG.png b/indra/newview/skins/gold/textures/navbar/NavBar_BG.png Binary files differnew file mode 100644 index 0000000000..6a91700ae0 --- /dev/null +++ b/indra/newview/skins/gold/textures/navbar/NavBar_BG.png diff --git a/indra/newview/skins/gold/textures/navbar/NavBar_BG_NoFav_Bevel.png b/indra/newview/skins/gold/textures/navbar/NavBar_BG_NoFav_Bevel.png Binary files differnew file mode 100644 index 0000000000..c61dcde58c --- /dev/null +++ b/indra/newview/skins/gold/textures/navbar/NavBar_BG_NoFav_Bevel.png diff --git a/indra/newview/skins/gold/textures/navbar/NavBar_BG_NoNav_Bevel.png b/indra/newview/skins/gold/textures/navbar/NavBar_BG_NoNav_Bevel.png Binary files differnew file mode 100644 index 0000000000..9e3da34596 --- /dev/null +++ b/indra/newview/skins/gold/textures/navbar/NavBar_BG_NoNav_Bevel.png diff --git a/indra/newview/skins/gold/textures/navbar/Row_Selection.png b/indra/newview/skins/gold/textures/navbar/Row_Selection.png Binary files differnew file mode 100644 index 0000000000..cfc31f8d32 --- /dev/null +++ b/indra/newview/skins/gold/textures/navbar/Row_Selection.png diff --git a/indra/newview/skins/contrast/textures/navbar/Search.png b/indra/newview/skins/gold/textures/navbar/Search.png Binary files differindex 4c29e57f7b..4c29e57f7b 100644 --- a/indra/newview/skins/contrast/textures/navbar/Search.png +++ b/indra/newview/skins/gold/textures/navbar/Search.png diff --git a/indra/newview/skins/gold/textures/navbar/separator.png b/indra/newview/skins/gold/textures/navbar/separator.png Binary files differnew file mode 100644 index 0000000000..c1d74e5a64 --- /dev/null +++ b/indra/newview/skins/gold/textures/navbar/separator.png diff --git a/indra/newview/skins/contrast/textures/notify_caution_icon.tga b/indra/newview/skins/gold/textures/notify_caution_icon.tga Binary files differindex abc23d1d7a..abc23d1d7a 100644 --- a/indra/newview/skins/contrast/textures/notify_caution_icon.tga +++ b/indra/newview/skins/gold/textures/notify_caution_icon.tga diff --git a/indra/newview/skins/contrast/textures/pixiesmall.j2c b/indra/newview/skins/gold/textures/pixiesmall.j2c Binary files differindex a1ff64014b..a1ff64014b 100644 --- a/indra/newview/skins/contrast/textures/pixiesmall.j2c +++ b/indra/newview/skins/gold/textures/pixiesmall.j2c diff --git a/indra/newview/skins/contrast/textures/red_x.png b/indra/newview/skins/gold/textures/red_x.png Binary files differindex a61202f09b..a61202f09b 100644 --- a/indra/newview/skins/contrast/textures/red_x.png +++ b/indra/newview/skins/gold/textures/red_x.png diff --git a/indra/newview/skins/contrast/textures/rounded_square.j2c b/indra/newview/skins/gold/textures/rounded_square.j2c Binary files differindex c8bb572fa9..c8bb572fa9 100644 --- a/indra/newview/skins/contrast/textures/rounded_square.j2c +++ b/indra/newview/skins/gold/textures/rounded_square.j2c diff --git a/indra/newview/skins/contrast/textures/script_error.j2c b/indra/newview/skins/gold/textures/script_error.j2c Binary files differindex 893cb642e7..893cb642e7 100644 --- a/indra/newview/skins/contrast/textures/script_error.j2c +++ b/indra/newview/skins/gold/textures/script_error.j2c diff --git a/indra/newview/skins/contrast/textures/silhouette.j2c b/indra/newview/skins/gold/textures/silhouette.j2c Binary files differindex 3859d4cb34..3859d4cb34 100644 --- a/indra/newview/skins/contrast/textures/silhouette.j2c +++ b/indra/newview/skins/gold/textures/silhouette.j2c diff --git a/indra/newview/skins/contrast/textures/slim_icon_16_viewer.tga b/indra/newview/skins/gold/textures/slim_icon_16_viewer.tga Binary files differindex 552181d36a..552181d36a 100644 --- a/indra/newview/skins/contrast/textures/slim_icon_16_viewer.tga +++ b/indra/newview/skins/gold/textures/slim_icon_16_viewer.tga diff --git a/indra/newview/skins/contrast/textures/snapshot_download.png b/indra/newview/skins/gold/textures/snapshot_download.png Binary files differindex 6aa1abded5..6aa1abded5 100644 --- a/indra/newview/skins/contrast/textures/snapshot_download.png +++ b/indra/newview/skins/gold/textures/snapshot_download.png diff --git a/indra/newview/skins/contrast/textures/snapshot_email.png b/indra/newview/skins/gold/textures/snapshot_email.png Binary files differindex dee784a9bf..dee784a9bf 100644 --- a/indra/newview/skins/contrast/textures/snapshot_email.png +++ b/indra/newview/skins/gold/textures/snapshot_email.png diff --git a/indra/newview/skins/contrast/textures/spacer24.tga b/indra/newview/skins/gold/textures/spacer24.tga Binary files differindex c7cab6b38c..c7cab6b38c 100644 --- a/indra/newview/skins/contrast/textures/spacer24.tga +++ b/indra/newview/skins/gold/textures/spacer24.tga diff --git a/indra/newview/skins/contrast/textures/tabarea.tga b/indra/newview/skins/gold/textures/tabarea.tga Binary files differindex 5517aebfc8..5517aebfc8 100644 --- a/indra/newview/skins/contrast/textures/tabarea.tga +++ b/indra/newview/skins/gold/textures/tabarea.tga diff --git a/indra/newview/skins/contrast/textures/taskpanel/Activate_Checkmark.png b/indra/newview/skins/gold/textures/taskpanel/Activate_Checkmark.png Binary files differindex 213acbe87b..213acbe87b 100644 --- a/indra/newview/skins/contrast/textures/taskpanel/Activate_Checkmark.png +++ b/indra/newview/skins/gold/textures/taskpanel/Activate_Checkmark.png diff --git a/indra/newview/skins/contrast/textures/taskpanel/Sidebar_Icon_Dock_Foreground.png b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Dock_Foreground.png Binary files differindex 4e59042e33..4e59042e33 100644 --- a/indra/newview/skins/contrast/textures/taskpanel/Sidebar_Icon_Dock_Foreground.png +++ b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Dock_Foreground.png diff --git a/indra/newview/skins/contrast/textures/taskpanel/Sidebar_Icon_Dock_Press.png b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Dock_Press.png Binary files differindex be7b298bb8..be7b298bb8 100644 --- a/indra/newview/skins/contrast/textures/taskpanel/Sidebar_Icon_Dock_Press.png +++ b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Dock_Press.png diff --git a/indra/newview/skins/contrast/textures/taskpanel/Sidebar_Icon_Undock_Foreground.png b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Undock_Foreground.png Binary files differindex 1e234ff09b..1e234ff09b 100644 --- a/indra/newview/skins/contrast/textures/taskpanel/Sidebar_Icon_Undock_Foreground.png +++ b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Undock_Foreground.png diff --git a/indra/newview/skins/contrast/textures/taskpanel/Sidebar_Icon_Undock_Press.png b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Undock_Press.png Binary files differindex 48c78b453d..48c78b453d 100644 --- a/indra/newview/skins/contrast/textures/taskpanel/Sidebar_Icon_Undock_Press.png +++ b/indra/newview/skins/gold/textures/taskpanel/Sidebar_Icon_Undock_Press.png diff --git a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Close_Off.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Close_Off.png Binary files differindex bc4e00c646..bc4e00c646 100644 --- a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Close_Off.png +++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Close_Off.png diff --git a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Home_Selected.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Home_Selected.png Binary files differindex 293aeef5e6..293aeef5e6 100644 --- a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Home_Selected.png +++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Home_Selected.png diff --git a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Me_Off.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Me_Off.png Binary files differindex 760db9360d..760db9360d 100644 --- a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Me_Off.png +++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Me_Off.png diff --git a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Open_Off.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Open_Off.png Binary files differindex 4556602f58..4556602f58 100644 --- a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Open_Off.png +++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Open_Off.png diff --git a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_People_Off.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_People_Off.png Binary files differindex 691b600510..691b600510 100644 --- a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_People_Off.png +++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_People_Off.png diff --git a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Places_Off.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Places_Off.png Binary files differindex f5a5f7a846..f5a5f7a846 100644 --- a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Places_Off.png +++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Places_Off.png diff --git a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Things_Off.png b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Things_Off.png Binary files differindex e56eda9802..e56eda9802 100644 --- a/indra/newview/skins/contrast/textures/taskpanel/TabIcon_Things_Off.png +++ b/indra/newview/skins/gold/textures/taskpanel/TabIcon_Things_Off.png diff --git a/indra/newview/skins/contrast/textures/taskpanel/TaskPanel_Tab_Off.png b/indra/newview/skins/gold/textures/taskpanel/TaskPanel_Tab_Off.png Binary files differindex 4ed7a2b183..4ed7a2b183 100644 --- a/indra/newview/skins/contrast/textures/taskpanel/TaskPanel_Tab_Off.png +++ b/indra/newview/skins/gold/textures/taskpanel/TaskPanel_Tab_Off.png diff --git a/indra/newview/skins/contrast/textures/taskpanel/TaskPanel_Tab_Selected.png b/indra/newview/skins/gold/textures/taskpanel/TaskPanel_Tab_Selected.png Binary files differindex b3316386b9..b3316386b9 100644 --- a/indra/newview/skins/contrast/textures/taskpanel/TaskPanel_Tab_Selected.png +++ b/indra/newview/skins/gold/textures/taskpanel/TaskPanel_Tab_Selected.png diff --git a/indra/newview/skins/contrast/textures/tearoff_pressed.tga b/indra/newview/skins/gold/textures/tearoff_pressed.tga Binary files differindex 620d109de0..620d109de0 100644 --- a/indra/newview/skins/contrast/textures/tearoff_pressed.tga +++ b/indra/newview/skins/gold/textures/tearoff_pressed.tga diff --git a/indra/newview/skins/contrast/textures/tearoffbox.tga b/indra/newview/skins/gold/textures/tearoffbox.tga Binary files differindex 0670d2e91b..0670d2e91b 100644 --- a/indra/newview/skins/contrast/textures/tearoffbox.tga +++ b/indra/newview/skins/gold/textures/tearoffbox.tga diff --git a/indra/newview/skins/contrast/textures/textures.xml b/indra/newview/skins/gold/textures/textures.xml index f824816183..1fe1ff333a 100644 --- a/indra/newview/skins/contrast/textures/textures.xml +++ b/indra/newview/skins/gold/textures/textures.xml @@ -796,7 +796,7 @@ with the same filename but different name <texture name="script_error.j2c" use_mips="true" /> <texture name="silhouette.j2c" use_mips="true" /> <texture name="foot_shadow.j2c" use_mips="true" /> - <texture name="cloud-particle.j2c" use_mips="true" /> + <texture name="cloud-particle.png" use_mips="true" /> <texture name="transparent.j2c" use_mips="true" /> <!--WARNING OLD ART BELOW *do not use*--> diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/360_capture.png b/indra/newview/skins/gold/textures/toolbar_icons/360_capture.png Binary files differindex 163cebe29f..163cebe29f 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/360_capture.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/360_capture.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/appearance.png b/indra/newview/skins/gold/textures/toolbar_icons/appearance.png Binary files differindex e6b1365388..e6b1365388 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/appearance.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/appearance.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/avatars.png b/indra/newview/skins/gold/textures/toolbar_icons/avatars.png Binary files differindex 8fa0600cee..8fa0600cee 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/avatars.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/avatars.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/build.png b/indra/newview/skins/gold/textures/toolbar_icons/build.png Binary files differindex e21ab3f0e4..e21ab3f0e4 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/build.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/build.png diff --git a/indra/newview/skins/gold/textures/toolbar_icons/caret_bottom.png b/indra/newview/skins/gold/textures/toolbar_icons/caret_bottom.png Binary files differnew file mode 100644 index 0000000000..5f6a01eaa1 --- /dev/null +++ b/indra/newview/skins/gold/textures/toolbar_icons/caret_bottom.png diff --git a/indra/newview/skins/gold/textures/toolbar_icons/caret_left.png b/indra/newview/skins/gold/textures/toolbar_icons/caret_left.png Binary files differnew file mode 100644 index 0000000000..0b8090314c --- /dev/null +++ b/indra/newview/skins/gold/textures/toolbar_icons/caret_left.png diff --git a/indra/newview/skins/gold/textures/toolbar_icons/caret_right.png b/indra/newview/skins/gold/textures/toolbar_icons/caret_right.png Binary files differnew file mode 100644 index 0000000000..044751560f --- /dev/null +++ b/indra/newview/skins/gold/textures/toolbar_icons/caret_right.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/chat.png b/indra/newview/skins/gold/textures/toolbar_icons/chat.png Binary files differindex e0dbac495f..e0dbac495f 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/chat.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/chat.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/destinations.png b/indra/newview/skins/gold/textures/toolbar_icons/destinations.png Binary files differindex e2325f083a..e2325f083a 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/destinations.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/destinations.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/environments.png b/indra/newview/skins/gold/textures/toolbar_icons/environments.png Binary files differindex 620db9f793..620db9f793 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/environments.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/environments.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/facebook.png b/indra/newview/skins/gold/textures/toolbar_icons/facebook.png Binary files differindex ae524b643f..ae524b643f 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/facebook.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/facebook.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/favorite_folder.png b/indra/newview/skins/gold/textures/toolbar_icons/favorite_folder.png Binary files differindex 811efffc0b..811efffc0b 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/favorite_folder.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/favorite_folder.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/flickr.png b/indra/newview/skins/gold/textures/toolbar_icons/flickr.png Binary files differindex 7fce9f0df2..7fce9f0df2 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/flickr.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/flickr.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/gestures.png b/indra/newview/skins/gold/textures/toolbar_icons/gestures.png Binary files differindex 2404bb4e25..2404bb4e25 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/gestures.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/gestures.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/grid_status.png b/indra/newview/skins/gold/textures/toolbar_icons/grid_status.png Binary files differindex b92b93cfb4..b92b93cfb4 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/grid_status.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/grid_status.png diff --git a/indra/newview/skins/gold/textures/toolbar_icons/highlighting.png b/indra/newview/skins/gold/textures/toolbar_icons/highlighting.png Binary files differnew file mode 100644 index 0000000000..093bace257 --- /dev/null +++ b/indra/newview/skins/gold/textures/toolbar_icons/highlighting.png diff --git a/indra/newview/skins/gold/textures/toolbar_icons/highlighting_selected.png b/indra/newview/skins/gold/textures/toolbar_icons/highlighting_selected.png Binary files differnew file mode 100644 index 0000000000..899fefbdf4 --- /dev/null +++ b/indra/newview/skins/gold/textures/toolbar_icons/highlighting_selected.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/howto.png b/indra/newview/skins/gold/textures/toolbar_icons/howto.png Binary files differindex 8594d71113..8594d71113 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/howto.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/howto.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/inventory.png b/indra/newview/skins/gold/textures/toolbar_icons/inventory.png Binary files differindex ab3191255e..ab3191255e 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/inventory.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/inventory.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/land.png b/indra/newview/skins/gold/textures/toolbar_icons/land.png Binary files differindex 89ea7604a4..89ea7604a4 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/land.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/land.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/map.png b/indra/newview/skins/gold/textures/toolbar_icons/map.png Binary files differindex ed1049b7db..ed1049b7db 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/map.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/map.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/marketplace.png b/indra/newview/skins/gold/textures/toolbar_icons/marketplace.png Binary files differindex 62bad20be6..62bad20be6 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/marketplace.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/marketplace.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/mini_cart.png b/indra/newview/skins/gold/textures/toolbar_icons/mini_cart.png Binary files differindex 9eeb1d4e09..9eeb1d4e09 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/mini_cart.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/mini_cart.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/mini_map.png b/indra/newview/skins/gold/textures/toolbar_icons/mini_map.png Binary files differindex ab0a654056..ab0a654056 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/mini_map.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/mini_map.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/mktlistings.png b/indra/newview/skins/gold/textures/toolbar_icons/mktlistings.png Binary files differindex a6f90461d7..a6f90461d7 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/mktlistings.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/mktlistings.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/move.png b/indra/newview/skins/gold/textures/toolbar_icons/move.png Binary files differindex 5c2ced7375..5c2ced7375 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/move.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/move.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/nearbyvoice.png b/indra/newview/skins/gold/textures/toolbar_icons/nearbyvoice.png Binary files differindex 77a7cd5f44..77a7cd5f44 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/nearbyvoice.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/nearbyvoice.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/outbox.png b/indra/newview/skins/gold/textures/toolbar_icons/outbox.png Binary files differindex 0f3db1c47c..0f3db1c47c 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/outbox.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/outbox.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/people.png b/indra/newview/skins/gold/textures/toolbar_icons/people.png Binary files differindex 7228ae8e2f..7228ae8e2f 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/people.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/people.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/performance.png b/indra/newview/skins/gold/textures/toolbar_icons/performance.png Binary files differindex 91baf849c8..91baf849c8 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/performance.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/performance.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/picks.png b/indra/newview/skins/gold/textures/toolbar_icons/picks.png Binary files differindex befda04b42..befda04b42 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/picks.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/picks.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/places.png b/indra/newview/skins/gold/textures/toolbar_icons/places.png Binary files differindex 97d9fa066c..97d9fa066c 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/places.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/places.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/preferences.png b/indra/newview/skins/gold/textures/toolbar_icons/preferences.png Binary files differindex 4ccd7b8ae1..4ccd7b8ae1 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/preferences.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/preferences.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/profile.png b/indra/newview/skins/gold/textures/toolbar_icons/profile.png Binary files differindex 32fe2bf8ac..32fe2bf8ac 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/profile.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/profile.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/report_abuse.png b/indra/newview/skins/gold/textures/toolbar_icons/report_abuse.png Binary files differindex d5cb6ca259..d5cb6ca259 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/report_abuse.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/report_abuse.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/resync_animations.png b/indra/newview/skins/gold/textures/toolbar_icons/resync_animations.png Binary files differindex dc9ee9c428..dc9ee9c428 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/resync_animations.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/resync_animations.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/search.png b/indra/newview/skins/gold/textures/toolbar_icons/search.png Binary files differindex bcb11e950d..bcb11e950d 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/search.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/search.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/snapshot.png b/indra/newview/skins/gold/textures/toolbar_icons/snapshot.png Binary files differindex d26da9b1d2..d26da9b1d2 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/snapshot.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/snapshot.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/speak.png b/indra/newview/skins/gold/textures/toolbar_icons/speak.png Binary files differindex 10cd354c5c..10cd354c5c 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/speak.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/speak.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/twitter.png b/indra/newview/skins/gold/textures/toolbar_icons/twitter.png Binary files differindex 0ad56f7802..0ad56f7802 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/twitter.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/twitter.png diff --git a/indra/newview/skins/contrast/textures/toolbar_icons/view.png b/indra/newview/skins/gold/textures/toolbar_icons/view.png Binary files differindex ddf0df7c26..ddf0df7c26 100644 --- a/indra/newview/skins/contrast/textures/toolbar_icons/view.png +++ b/indra/newview/skins/gold/textures/toolbar_icons/view.png diff --git a/indra/newview/skins/contrast/textures/transparent.j2c b/indra/newview/skins/gold/textures/transparent.j2c Binary files differindex 1068e940b9..1068e940b9 100644 --- a/indra/newview/skins/contrast/textures/transparent.j2c +++ b/indra/newview/skins/gold/textures/transparent.j2c diff --git a/indra/newview/skins/contrast/textures/up_arrow.png b/indra/newview/skins/gold/textures/up_arrow.png Binary files differindex 76f839510e..76f839510e 100644 --- a/indra/newview/skins/contrast/textures/up_arrow.png +++ b/indra/newview/skins/gold/textures/up_arrow.png diff --git a/indra/newview/skins/contrast/textures/uv_test1.j2c b/indra/newview/skins/gold/textures/uv_test1.j2c Binary files differindex 3d5b541796..3d5b541796 100644 --- a/indra/newview/skins/contrast/textures/uv_test1.j2c +++ b/indra/newview/skins/gold/textures/uv_test1.j2c diff --git a/indra/newview/skins/contrast/textures/uv_test2.tga b/indra/newview/skins/gold/textures/uv_test2.tga Binary files differindex a16000d1e4..a16000d1e4 100644 --- a/indra/newview/skins/contrast/textures/uv_test2.tga +++ b/indra/newview/skins/gold/textures/uv_test2.tga diff --git a/indra/newview/skins/contrast/textures/voice_meter_dot.j2c b/indra/newview/skins/gold/textures/voice_meter_dot.j2c Binary files differindex e536c3338a..e536c3338a 100644 --- a/indra/newview/skins/contrast/textures/voice_meter_dot.j2c +++ b/indra/newview/skins/gold/textures/voice_meter_dot.j2c diff --git a/indra/newview/skins/contrast/textures/voice_meter_rings.j2c b/indra/newview/skins/gold/textures/voice_meter_rings.j2c Binary files differindex 17e7c6c6a1..17e7c6c6a1 100644 --- a/indra/newview/skins/contrast/textures/voice_meter_rings.j2c +++ b/indra/newview/skins/gold/textures/voice_meter_rings.j2c diff --git a/indra/newview/skins/contrast/textures/white.tga b/indra/newview/skins/gold/textures/white.tga Binary files differindex 9fe68631cf..9fe68631cf 100644 --- a/indra/newview/skins/contrast/textures/white.tga +++ b/indra/newview/skins/gold/textures/white.tga diff --git a/indra/newview/skins/gold/textures/widgets/Arrow_Down.png b/indra/newview/skins/gold/textures/widgets/Arrow_Down.png Binary files differnew file mode 100644 index 0000000000..8b592ed840 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Arrow_Down.png diff --git a/indra/newview/skins/gold/textures/widgets/Arrow_Left.png b/indra/newview/skins/gold/textures/widgets/Arrow_Left.png Binary files differnew file mode 100644 index 0000000000..04416541b9 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Arrow_Left.png diff --git a/indra/newview/skins/gold/textures/widgets/Arrow_Right.png b/indra/newview/skins/gold/textures/widgets/Arrow_Right.png Binary files differnew file mode 100644 index 0000000000..e57452a558 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Arrow_Right.png diff --git a/indra/newview/skins/gold/textures/widgets/Arrow_Small_Down.png b/indra/newview/skins/gold/textures/widgets/Arrow_Small_Down.png Binary files differnew file mode 100644 index 0000000000..8694cdf2d4 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Arrow_Small_Down.png diff --git a/indra/newview/skins/gold/textures/widgets/Arrow_Small_Left.png b/indra/newview/skins/gold/textures/widgets/Arrow_Small_Left.png Binary files differnew file mode 100644 index 0000000000..a1b82d5101 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Arrow_Small_Left.png diff --git a/indra/newview/skins/gold/textures/widgets/Arrow_Small_Right.png b/indra/newview/skins/gold/textures/widgets/Arrow_Small_Right.png Binary files differnew file mode 100644 index 0000000000..0e05d76852 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Arrow_Small_Right.png diff --git a/indra/newview/skins/gold/textures/widgets/Arrow_Small_Up.png b/indra/newview/skins/gold/textures/widgets/Arrow_Small_Up.png Binary files differnew file mode 100644 index 0000000000..348bc4c019 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Arrow_Small_Up.png diff --git a/indra/newview/skins/gold/textures/widgets/Arrow_Up.png b/indra/newview/skins/gold/textures/widgets/Arrow_Up.png Binary files differnew file mode 100644 index 0000000000..8b3da09d79 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Arrow_Up.png diff --git a/indra/newview/skins/gold/textures/widgets/Badge_Background.png b/indra/newview/skins/gold/textures/widgets/Badge_Background.png Binary files differnew file mode 100644 index 0000000000..5abc1bf489 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Badge_Background.png diff --git a/indra/newview/skins/gold/textures/widgets/Badge_Border.png b/indra/newview/skins/gold/textures/widgets/Badge_Border.png Binary files differnew file mode 100644 index 0000000000..57d3be2320 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Badge_Border.png diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Disabled.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Disabled.png Binary files differnew file mode 100644 index 0000000000..139d71ae2e --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Disabled.png diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Off.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Off.png Binary files differnew file mode 100755 index 0000000000..cb0ae6b0c9 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Off.png diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Over.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Over.png Binary files differnew file mode 100755 index 0000000000..426c2c9d79 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Over.png diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Press.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Press.png Binary files differnew file mode 100755 index 0000000000..9e71d224fa --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Left_Press.png diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Disabled.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Disabled.png Binary files differnew file mode 100644 index 0000000000..2cf3de24c0 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Disabled.png diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Off.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Off.png Binary files differnew file mode 100755 index 0000000000..c6f1d2f5d6 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Off.png diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Over.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Over.png Binary files differnew file mode 100755 index 0000000000..c87d907a68 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Over.png diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Press.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Press.png Binary files differnew file mode 100755 index 0000000000..a36a3aaf02 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Middle_Press.png diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Disabled.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Disabled.png Binary files differnew file mode 100644 index 0000000000..d9c9692114 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Disabled.png diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Off.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Off.png Binary files differnew file mode 100644 index 0000000000..bf7744ac21 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Off.png diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Over.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Over.png Binary files differnew file mode 100644 index 0000000000..23e7be65a2 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Over.png diff --git a/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Press.png b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Press.png Binary files differnew file mode 100644 index 0000000000..16ed3effa3 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/BreadCrumbBtn_Right_Press.png diff --git a/indra/newview/skins/gold/textures/widgets/Checkbox_Disabled.png b/indra/newview/skins/gold/textures/widgets/Checkbox_Disabled.png Binary files differnew file mode 100644 index 0000000000..8439f82e29 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Checkbox_Disabled.png diff --git a/indra/newview/skins/gold/textures/widgets/Checkbox_Off.png b/indra/newview/skins/gold/textures/widgets/Checkbox_Off.png Binary files differnew file mode 100644 index 0000000000..cb9a04d84f --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Checkbox_Off.png diff --git a/indra/newview/skins/gold/textures/widgets/Checkbox_On.png b/indra/newview/skins/gold/textures/widgets/Checkbox_On.png Binary files differnew file mode 100644 index 0000000000..0ec090504a --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Checkbox_On.png diff --git a/indra/newview/skins/gold/textures/widgets/Checkbox_On_Disabled.png b/indra/newview/skins/gold/textures/widgets/Checkbox_On_Disabled.png Binary files differnew file mode 100644 index 0000000000..5759f7de69 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Checkbox_On_Disabled.png diff --git a/indra/newview/skins/gold/textures/widgets/Checkbox_On_Press.png b/indra/newview/skins/gold/textures/widgets/Checkbox_On_Press.png Binary files differnew file mode 100644 index 0000000000..ba46e91c55 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Checkbox_On_Press.png diff --git a/indra/newview/skins/gold/textures/widgets/Checkbox_Press.png b/indra/newview/skins/gold/textures/widgets/Checkbox_Press.png Binary files differnew file mode 100644 index 0000000000..5f5a33d878 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Checkbox_Press.png diff --git a/indra/newview/skins/gold/textures/widgets/ComboButton_Disabled.png b/indra/newview/skins/gold/textures/widgets/ComboButton_Disabled.png Binary files differnew file mode 100644 index 0000000000..ebeb813349 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ComboButton_Disabled.png diff --git a/indra/newview/skins/gold/textures/widgets/ComboButton_Hover.png b/indra/newview/skins/gold/textures/widgets/ComboButton_Hover.png Binary files differnew file mode 100644 index 0000000000..1377d35e1a --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ComboButton_Hover.png diff --git a/indra/newview/skins/gold/textures/widgets/ComboButton_Off.png b/indra/newview/skins/gold/textures/widgets/ComboButton_Off.png Binary files differnew file mode 100644 index 0000000000..8c315a9d25 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ComboButton_Off.png diff --git a/indra/newview/skins/gold/textures/widgets/ComboButton_On.png b/indra/newview/skins/gold/textures/widgets/ComboButton_On.png Binary files differnew file mode 100644 index 0000000000..94cbf85ea7 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ComboButton_On.png diff --git a/indra/newview/skins/gold/textures/widgets/ComboButton_Selected.png b/indra/newview/skins/gold/textures/widgets/ComboButton_Selected.png Binary files differnew file mode 100644 index 0000000000..1bb4a43c4c --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ComboButton_Selected.png diff --git a/indra/newview/skins/gold/textures/widgets/ComboButton_UpOff.png b/indra/newview/skins/gold/textures/widgets/ComboButton_UpOff.png Binary files differnew file mode 100644 index 0000000000..34edea9421 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ComboButton_UpOff.png diff --git a/indra/newview/skins/gold/textures/widgets/ComboButton_UpSelected.png b/indra/newview/skins/gold/textures/widgets/ComboButton_UpSelected.png Binary files differnew file mode 100644 index 0000000000..2ee213ecd9 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ComboButton_UpSelected.png diff --git a/indra/newview/skins/gold/textures/widgets/DisclosureArrow_Opened_Off.png b/indra/newview/skins/gold/textures/widgets/DisclosureArrow_Opened_Off.png Binary files differnew file mode 100644 index 0000000000..115ec7a11f --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/DisclosureArrow_Opened_Off.png diff --git a/indra/newview/skins/gold/textures/widgets/DropDown_Disabled.png b/indra/newview/skins/gold/textures/widgets/DropDown_Disabled.png Binary files differnew file mode 100644 index 0000000000..9a69f7e0d9 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/DropDown_Disabled.png diff --git a/indra/newview/skins/gold/textures/widgets/DropDown_Off.png b/indra/newview/skins/gold/textures/widgets/DropDown_Off.png Binary files differnew file mode 100644 index 0000000000..b118e7a7d4 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/DropDown_Off.png diff --git a/indra/newview/skins/gold/textures/widgets/DropDown_On.png b/indra/newview/skins/gold/textures/widgets/DropDown_On.png Binary files differnew file mode 100644 index 0000000000..614c1fccc5 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/DropDown_On.png diff --git a/indra/newview/skins/gold/textures/widgets/DropDown_Press.png b/indra/newview/skins/gold/textures/widgets/DropDown_Press.png Binary files differnew file mode 100644 index 0000000000..0dc92f2435 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/DropDown_Press.png diff --git a/indra/newview/skins/gold/textures/widgets/DropTarget.png b/indra/newview/skins/gold/textures/widgets/DropTarget.png Binary files differnew file mode 100644 index 0000000000..01e7a88861 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/DropTarget.png diff --git a/indra/newview/skins/gold/textures/widgets/Error_Tag_Background.png b/indra/newview/skins/gold/textures/widgets/Error_Tag_Background.png Binary files differnew file mode 100644 index 0000000000..439fce3dd3 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Error_Tag_Background.png diff --git a/indra/newview/skins/gold/textures/widgets/Linden_Dollar_Alert.png b/indra/newview/skins/gold/textures/widgets/Linden_Dollar_Alert.png Binary files differnew file mode 100644 index 0000000000..76e078100f --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Linden_Dollar_Alert.png diff --git a/indra/newview/skins/gold/textures/widgets/Linden_Dollar_Background.png b/indra/newview/skins/gold/textures/widgets/Linden_Dollar_Background.png Binary files differnew file mode 100644 index 0000000000..6e71ef7b72 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Linden_Dollar_Background.png diff --git a/indra/newview/skins/gold/textures/widgets/ListItem_Over.png b/indra/newview/skins/gold/textures/widgets/ListItem_Over.png Binary files differnew file mode 100644 index 0000000000..8c80522232 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ListItem_Over.png diff --git a/indra/newview/skins/gold/textures/widgets/ListItem_Select.png b/indra/newview/skins/gold/textures/widgets/ListItem_Select.png Binary files differnew file mode 100644 index 0000000000..b27e0ee787 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ListItem_Select.png diff --git a/indra/newview/skins/gold/textures/widgets/MarketplaceBtn_Off.png b/indra/newview/skins/gold/textures/widgets/MarketplaceBtn_Off.png Binary files differnew file mode 100644 index 0000000000..de71f763d3 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/MarketplaceBtn_Off.png diff --git a/indra/newview/skins/gold/textures/widgets/MarketplaceBtn_Selected.png b/indra/newview/skins/gold/textures/widgets/MarketplaceBtn_Selected.png Binary files differnew file mode 100644 index 0000000000..a627dbaf34 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/MarketplaceBtn_Selected.png diff --git a/indra/newview/skins/gold/textures/widgets/Marketplace_Dropzone_Background.png b/indra/newview/skins/gold/textures/widgets/Marketplace_Dropzone_Background.png Binary files differnew file mode 100644 index 0000000000..9eb4a5c55d --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Marketplace_Dropzone_Background.png diff --git a/indra/newview/skins/gold/textures/widgets/New_Tag_Background.png b/indra/newview/skins/gold/textures/widgets/New_Tag_Background.png Binary files differnew file mode 100644 index 0000000000..3631d90825 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/New_Tag_Background.png diff --git a/indra/newview/skins/gold/textures/widgets/New_Tag_Border.png b/indra/newview/skins/gold/textures/widgets/New_Tag_Border.png Binary files differnew file mode 100644 index 0000000000..d9b78eeea4 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/New_Tag_Border.png diff --git a/indra/newview/skins/gold/textures/widgets/ProgressBar.png b/indra/newview/skins/gold/textures/widgets/ProgressBar.png Binary files differnew file mode 100644 index 0000000000..23e7ee4f16 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ProgressBar.png diff --git a/indra/newview/skins/gold/textures/widgets/ProgressBarSolid.png b/indra/newview/skins/gold/textures/widgets/ProgressBarSolid.png Binary files differnew file mode 100644 index 0000000000..59a798464d --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ProgressBarSolid.png diff --git a/indra/newview/skins/gold/textures/widgets/ProgressTrack.png b/indra/newview/skins/gold/textures/widgets/ProgressTrack.png Binary files differnew file mode 100644 index 0000000000..f4be9f5ccd --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ProgressTrack.png diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_Disabled.png b/indra/newview/skins/gold/textures/widgets/PushButton_Disabled.png Binary files differnew file mode 100644 index 0000000000..e99ec4b14b --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/PushButton_Disabled.png diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_Login.png b/indra/newview/skins/gold/textures/widgets/PushButton_Login.png Binary files differnew file mode 100644 index 0000000000..8e7d932ab1 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/PushButton_Login.png diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_Login_Over.png b/indra/newview/skins/gold/textures/widgets/PushButton_Login_Over.png Binary files differnew file mode 100644 index 0000000000..038ba23be2 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/PushButton_Login_Over.png diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_Login_Pressed.png b/indra/newview/skins/gold/textures/widgets/PushButton_Login_Pressed.png Binary files differnew file mode 100644 index 0000000000..828aa1a139 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/PushButton_Login_Pressed.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Hemi_Cylinder_Selected.png b/indra/newview/skins/gold/textures/widgets/PushButton_Off.png Binary files differindex c837e953da..c74cea62d3 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Hemi_Cylinder_Selected.png +++ b/indra/newview/skins/gold/textures/widgets/PushButton_Off.png diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_On.png b/indra/newview/skins/gold/textures/widgets/PushButton_On.png Binary files differnew file mode 100644 index 0000000000..fddde585a1 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/PushButton_On.png diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_On_Selected.png b/indra/newview/skins/gold/textures/widgets/PushButton_On_Selected.png Binary files differnew file mode 100644 index 0000000000..6f0cd3574d --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/PushButton_On_Selected.png diff --git a/indra/newview/skins/contrast/textures/build/Object_Cube_Selected.png b/indra/newview/skins/gold/textures/widgets/PushButton_Over.png Binary files differindex 9c9d4f506a..34a64a3ade 100644 --- a/indra/newview/skins/contrast/textures/build/Object_Cube_Selected.png +++ b/indra/newview/skins/gold/textures/widgets/PushButton_Over.png diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_Press.png b/indra/newview/skins/gold/textures/widgets/PushButton_Press.png Binary files differnew file mode 100644 index 0000000000..e5cc0ba1d2 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/PushButton_Press.png diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_Selected.png b/indra/newview/skins/gold/textures/widgets/PushButton_Selected.png Binary files differnew file mode 100644 index 0000000000..d711319160 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/PushButton_Selected.png diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_Selected_Disabled.png b/indra/newview/skins/gold/textures/widgets/PushButton_Selected_Disabled.png Binary files differnew file mode 100644 index 0000000000..26a47e0ab5 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/PushButton_Selected_Disabled.png diff --git a/indra/newview/skins/gold/textures/widgets/PushButton_Selected_Press.png b/indra/newview/skins/gold/textures/widgets/PushButton_Selected_Press.png Binary files differnew file mode 100644 index 0000000000..f1549f9379 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/PushButton_Selected_Press.png diff --git a/indra/newview/skins/gold/textures/widgets/RadioButton_Disabled.png b/indra/newview/skins/gold/textures/widgets/RadioButton_Disabled.png Binary files differnew file mode 100644 index 0000000000..32ec25fe0e --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/RadioButton_Disabled.png diff --git a/indra/newview/skins/gold/textures/widgets/RadioButton_Off.png b/indra/newview/skins/gold/textures/widgets/RadioButton_Off.png Binary files differnew file mode 100644 index 0000000000..5d267af5dc --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/RadioButton_Off.png diff --git a/indra/newview/skins/gold/textures/widgets/RadioButton_On.png b/indra/newview/skins/gold/textures/widgets/RadioButton_On.png Binary files differnew file mode 100644 index 0000000000..e6bf0db157 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/RadioButton_On.png diff --git a/indra/newview/skins/gold/textures/widgets/RadioButton_On_Disabled.png b/indra/newview/skins/gold/textures/widgets/RadioButton_On_Disabled.png Binary files differnew file mode 100644 index 0000000000..72aae43618 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/RadioButton_On_Disabled.png diff --git a/indra/newview/skins/gold/textures/widgets/RadioButton_On_Press.png b/indra/newview/skins/gold/textures/widgets/RadioButton_On_Press.png Binary files differnew file mode 100644 index 0000000000..f3883b82b3 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/RadioButton_On_Press.png diff --git a/indra/newview/skins/gold/textures/widgets/RadioButton_Press.png b/indra/newview/skins/gold/textures/widgets/RadioButton_Press.png Binary files differnew file mode 100644 index 0000000000..0025256045 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/RadioButton_Press.png diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Down.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Down.png Binary files differnew file mode 100644 index 0000000000..768909d447 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Down.png diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Down_Opaque.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Down_Opaque.png Binary files differnew file mode 100644 index 0000000000..1c57521e9e --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Down_Opaque.png diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Down_Over_Opaque.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Down_Over_Opaque.png Binary files differnew file mode 100644 index 0000000000..3db7be9ffa --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Down_Over_Opaque.png diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Left.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Left.png Binary files differnew file mode 100644 index 0000000000..9ef73f48a5 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Left.png diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Left_Opaque.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Left_Opaque.png Binary files differnew file mode 100644 index 0000000000..0fb0671036 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Left_Opaque.png diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Left_Over_Opaque.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Left_Over_Opaque.png Binary files differnew file mode 100644 index 0000000000..464130c359 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Left_Over_Opaque.png diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Right.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Right.png Binary files differnew file mode 100644 index 0000000000..8a59274b8a --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Right.png diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Right_Opaque.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Right_Opaque.png Binary files differnew file mode 100644 index 0000000000..ab1f1ac90b --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Right_Opaque.png diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Right_Over_Opaque.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Right_Over_Opaque.png Binary files differnew file mode 100644 index 0000000000..e5a94429a3 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Right_Over_Opaque.png diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Up.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Up.png Binary files differnew file mode 100644 index 0000000000..064580f0c8 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Up.png diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Up_Opaque.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Up_Opaque.png Binary files differnew file mode 100644 index 0000000000..2cc4857d27 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Up_Opaque.png diff --git a/indra/newview/skins/gold/textures/widgets/ScrollArrow_Up_Over_Opaque.png b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Up_Over_Opaque.png Binary files differnew file mode 100644 index 0000000000..2018b53af9 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ScrollArrow_Up_Over_Opaque.png diff --git a/indra/newview/skins/gold/textures/widgets/ScrollThumb_Horiz.png b/indra/newview/skins/gold/textures/widgets/ScrollThumb_Horiz.png Binary files differnew file mode 100644 index 0000000000..9afc907c1c --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ScrollThumb_Horiz.png diff --git a/indra/newview/skins/gold/textures/widgets/ScrollThumb_Vert.png b/indra/newview/skins/gold/textures/widgets/ScrollThumb_Vert.png Binary files differnew file mode 100644 index 0000000000..ede643e528 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ScrollThumb_Vert.png diff --git a/indra/newview/skins/gold/textures/widgets/ScrollTrack_Horiz.png b/indra/newview/skins/gold/textures/widgets/ScrollTrack_Horiz.png Binary files differnew file mode 100644 index 0000000000..35da770073 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ScrollTrack_Horiz.png diff --git a/indra/newview/skins/gold/textures/widgets/ScrollTrack_Vert.png b/indra/newview/skins/gold/textures/widgets/ScrollTrack_Vert.png Binary files differnew file mode 100644 index 0000000000..cf67c23133 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/ScrollTrack_Vert.png diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Disabled.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Disabled.png Binary files differnew file mode 100644 index 0000000000..ef50fb5d51 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Disabled.png diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Off.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Off.png Binary files differnew file mode 100644 index 0000000000..191dbf08fc --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Off.png diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Over.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Over.png Binary files differnew file mode 100644 index 0000000000..d5882bce85 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Over.png diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Press.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Press.png Binary files differnew file mode 100644 index 0000000000..ddaab1cfcd --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Press.png diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected.png Binary files differnew file mode 100644 index 0000000000..c8634b1294 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected.png diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Disabled.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Disabled.png Binary files differnew file mode 100644 index 0000000000..d47a21fff7 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Disabled.png diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Over.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Over.png Binary files differnew file mode 100644 index 0000000000..4919c9bcc3 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Over.png diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Press.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Press.png Binary files differnew file mode 100644 index 0000000000..1182f90a11 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Left_Selected_Press.png diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Disabled.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Disabled.png Binary files differnew file mode 100644 index 0000000000..65d082b993 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Disabled.png diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected.png Binary files differnew file mode 100644 index 0000000000..12f55c599e --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected.png diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png Binary files differnew file mode 100644 index 0000000000..123524f0e4 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected_Press.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected_Press.png Binary files differnew file mode 100644 index 0000000000..8fd7086252 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Middle_Selected_Press.png diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Disabled.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Disabled.png Binary files differnew file mode 100644 index 0000000000..ccea8fc784 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Disabled.png diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Off.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Off.png Binary files differnew file mode 100644 index 0000000000..f90ede3b71 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Off.png diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_On_Selected.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_On_Selected.png Binary files differnew file mode 100644 index 0000000000..a8dba17a75 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_On_Selected.png diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Over.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Over.png Binary files differnew file mode 100644 index 0000000000..cadcec085a --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Over.png diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Press.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Press.png Binary files differnew file mode 100644 index 0000000000..889d06a690 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Press.png diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected.png Binary files differnew file mode 100644 index 0000000000..aa3906d236 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected.png diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected_Disabled.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected_Disabled.png Binary files differnew file mode 100644 index 0000000000..2befd6985b --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected_Disabled.png diff --git a/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected_Press.png b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected_Press.png Binary files differnew file mode 100644 index 0000000000..7fe8926628 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SegmentedBtn_Right_Selected_Press.png diff --git a/indra/newview/skins/gold/textures/widgets/SliderThumb_Disabled.png b/indra/newview/skins/gold/textures/widgets/SliderThumb_Disabled.png Binary files differnew file mode 100644 index 0000000000..5cfa3ae4e1 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SliderThumb_Disabled.png diff --git a/indra/newview/skins/gold/textures/widgets/SliderThumb_Off.png b/indra/newview/skins/gold/textures/widgets/SliderThumb_Off.png Binary files differnew file mode 100644 index 0000000000..66cdcbeb94 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SliderThumb_Off.png diff --git a/indra/newview/skins/gold/textures/widgets/SliderThumb_Press.png b/indra/newview/skins/gold/textures/widgets/SliderThumb_Press.png Binary files differnew file mode 100644 index 0000000000..0bf8e43e81 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SliderThumb_Press.png diff --git a/indra/newview/skins/gold/textures/widgets/SliderTrack_Horiz.png b/indra/newview/skins/gold/textures/widgets/SliderTrack_Horiz.png Binary files differnew file mode 100644 index 0000000000..720830f83f --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SliderTrack_Horiz.png diff --git a/indra/newview/skins/gold/textures/widgets/SliderTrack_Vert.png b/indra/newview/skins/gold/textures/widgets/SliderTrack_Vert.png Binary files differnew file mode 100644 index 0000000000..c01db44707 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/SliderTrack_Vert.png diff --git a/indra/newview/skins/gold/textures/widgets/Stepper_Down_Off.png b/indra/newview/skins/gold/textures/widgets/Stepper_Down_Off.png Binary files differnew file mode 100644 index 0000000000..ff21034095 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Stepper_Down_Off.png diff --git a/indra/newview/skins/gold/textures/widgets/Stepper_Down_Press.png b/indra/newview/skins/gold/textures/widgets/Stepper_Down_Press.png Binary files differnew file mode 100644 index 0000000000..40f42a670f --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Stepper_Down_Press.png diff --git a/indra/newview/skins/gold/textures/widgets/Stepper_Up_Off.png b/indra/newview/skins/gold/textures/widgets/Stepper_Up_Off.png Binary files differnew file mode 100644 index 0000000000..133845bdbc --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Stepper_Up_Off.png diff --git a/indra/newview/skins/gold/textures/widgets/Stepper_Up_Press.png b/indra/newview/skins/gold/textures/widgets/Stepper_Up_Press.png Binary files differnew file mode 100644 index 0000000000..8cefa97129 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Stepper_Up_Press.png diff --git a/indra/newview/skins/gold/textures/widgets/TextField_Active.png b/indra/newview/skins/gold/textures/widgets/TextField_Active.png Binary files differnew file mode 100644 index 0000000000..66c3867b81 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/TextField_Active.png diff --git a/indra/newview/skins/gold/textures/widgets/TextField_Disabled.png b/indra/newview/skins/gold/textures/widgets/TextField_Disabled.png Binary files differnew file mode 100644 index 0000000000..baf747f581 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/TextField_Disabled.png diff --git a/indra/newview/skins/gold/textures/widgets/TextField_Off.png b/indra/newview/skins/gold/textures/widgets/TextField_Off.png Binary files differnew file mode 100644 index 0000000000..a35562f950 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/TextField_Off.png diff --git a/indra/newview/skins/gold/textures/widgets/TextField_Search_Active.png b/indra/newview/skins/gold/textures/widgets/TextField_Search_Active.png Binary files differnew file mode 100644 index 0000000000..572535f1ab --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/TextField_Search_Active.png diff --git a/indra/newview/skins/gold/textures/widgets/TextField_Search_Disabled.png b/indra/newview/skins/gold/textures/widgets/TextField_Search_Disabled.png Binary files differnew file mode 100644 index 0000000000..94b4b158f7 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/TextField_Search_Disabled.png diff --git a/indra/newview/skins/gold/textures/widgets/TextField_Search_Highlight.png b/indra/newview/skins/gold/textures/widgets/TextField_Search_Highlight.png Binary files differnew file mode 100644 index 0000000000..7768da04e8 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/TextField_Search_Highlight.png diff --git a/indra/newview/skins/gold/textures/widgets/TextField_Search_Off.png b/indra/newview/skins/gold/textures/widgets/TextField_Search_Off.png Binary files differnew file mode 100644 index 0000000000..fccd38c807 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/TextField_Search_Off.png diff --git a/indra/newview/skins/gold/textures/widgets/Tooltip.png b/indra/newview/skins/gold/textures/widgets/Tooltip.png Binary files differnew file mode 100644 index 0000000000..1be53bdaa2 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/Tooltip.png diff --git a/indra/newview/skins/gold/textures/widgets/bevel_background.png b/indra/newview/skins/gold/textures/widgets/bevel_background.png Binary files differnew file mode 100644 index 0000000000..6304124aec --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/bevel_background.png diff --git a/indra/newview/skins/gold/textures/widgets/buy_off.png b/indra/newview/skins/gold/textures/widgets/buy_off.png Binary files differnew file mode 100644 index 0000000000..2582b6cfab --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/buy_off.png diff --git a/indra/newview/skins/gold/textures/widgets/buy_over.png b/indra/newview/skins/gold/textures/widgets/buy_over.png Binary files differnew file mode 100644 index 0000000000..5b8a39085d --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/buy_over.png diff --git a/indra/newview/skins/gold/textures/widgets/buy_press.png b/indra/newview/skins/gold/textures/widgets/buy_press.png Binary files differnew file mode 100644 index 0000000000..8e0cc9f787 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/buy_press.png diff --git a/indra/newview/skins/gold/textures/widgets/horizontal_drag_handle.png b/indra/newview/skins/gold/textures/widgets/horizontal_drag_handle.png Binary files differnew file mode 100644 index 0000000000..631d653968 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/horizontal_drag_handle.png diff --git a/indra/newview/skins/gold/textures/widgets/jump_left_in.png b/indra/newview/skins/gold/textures/widgets/jump_left_in.png Binary files differnew file mode 100644 index 0000000000..073606628c --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/jump_left_in.png diff --git a/indra/newview/skins/gold/textures/widgets/jump_left_out.png b/indra/newview/skins/gold/textures/widgets/jump_left_out.png Binary files differnew file mode 100644 index 0000000000..71d5c5c36a --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/jump_left_out.png diff --git a/indra/newview/skins/gold/textures/widgets/jump_right_in.png b/indra/newview/skins/gold/textures/widgets/jump_right_in.png Binary files differnew file mode 100644 index 0000000000..96f8501932 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/jump_right_in.png diff --git a/indra/newview/skins/gold/textures/widgets/jump_right_out.png b/indra/newview/skins/gold/textures/widgets/jump_right_out.png Binary files differnew file mode 100644 index 0000000000..9c02f5f649 --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/jump_right_out.png diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_moon_back.png b/indra/newview/skins/gold/textures/widgets/track_control_moon_back.png Binary files differindex 03d1e805e1..03d1e805e1 100644 --- a/indra/newview/skins/contrast/textures/widgets/track_control_moon_back.png +++ b/indra/newview/skins/gold/textures/widgets/track_control_moon_back.png diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_moon_front.png b/indra/newview/skins/gold/textures/widgets/track_control_moon_front.png Binary files differindex cdc52fe08a..cdc52fe08a 100644 --- a/indra/newview/skins/contrast/textures/widgets/track_control_moon_front.png +++ b/indra/newview/skins/gold/textures/widgets/track_control_moon_front.png diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_bottom.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_bottom.png Binary files differindex c08b54c269..c08b54c269 100644 --- a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_bottom.png +++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_bottom.png diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_bottom_active.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_bottom_active.png Binary files differindex a2b37d1b43..a2b37d1b43 100644 --- a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_bottom_active.png +++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_bottom_active.png diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_left_side.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_left_side.png Binary files differindex 3439e8717f..3439e8717f 100644 --- a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_left_side.png +++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_left_side.png diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_left_side_active.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_left_side_active.png Binary files differindex fa745175be..fa745175be 100644 --- a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_left_side_active.png +++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_left_side_active.png diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_right_side.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_right_side.png Binary files differindex f92fdb3d92..f92fdb3d92 100644 --- a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_right_side.png +++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_right_side.png diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_right_side_active.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_right_side_active.png Binary files differindex 23571d6473..23571d6473 100644 --- a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_right_side_active.png +++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_right_side_active.png diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_top.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_top.png Binary files differindex ae67084a7d..ae67084a7d 100644 --- a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_top.png +++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_top.png diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_top_active.png b/indra/newview/skins/gold/textures/widgets/track_control_rotate_top_active.png Binary files differindex 4e1d0ad096..4e1d0ad096 100644 --- a/indra/newview/skins/contrast/textures/widgets/track_control_rotate_top_active.png +++ b/indra/newview/skins/gold/textures/widgets/track_control_rotate_top_active.png diff --git a/indra/newview/skins/gold/textures/widgets/track_control_sphere.png b/indra/newview/skins/gold/textures/widgets/track_control_sphere.png Binary files differnew file mode 100644 index 0000000000..02b0854c7b --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/track_control_sphere.png diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_sun_back.png b/indra/newview/skins/gold/textures/widgets/track_control_sun_back.png Binary files differindex b3191ccc5d..b3191ccc5d 100644 --- a/indra/newview/skins/contrast/textures/widgets/track_control_sun_back.png +++ b/indra/newview/skins/gold/textures/widgets/track_control_sun_back.png diff --git a/indra/newview/skins/contrast/textures/widgets/track_control_sun_front.png b/indra/newview/skins/gold/textures/widgets/track_control_sun_front.png Binary files differindex 1cdcbf7861..1cdcbf7861 100644 --- a/indra/newview/skins/contrast/textures/widgets/track_control_sun_front.png +++ b/indra/newview/skins/gold/textures/widgets/track_control_sun_front.png diff --git a/indra/newview/skins/gold/textures/widgets/vertical_drag_handle.png b/indra/newview/skins/gold/textures/widgets/vertical_drag_handle.png Binary files differnew file mode 100644 index 0000000000..d78e898a9c --- /dev/null +++ b/indra/newview/skins/gold/textures/widgets/vertical_drag_handle.png diff --git a/indra/newview/skins/gold/textures/windows/Dragbar.png b/indra/newview/skins/gold/textures/windows/Dragbar.png Binary files differnew file mode 100644 index 0000000000..3a998abdc3 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Dragbar.png diff --git a/indra/newview/skins/gold/textures/windows/Flyout_Left.png b/indra/newview/skins/gold/textures/windows/Flyout_Left.png Binary files differnew file mode 100644 index 0000000000..3110d7f6b5 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Flyout_Left.png diff --git a/indra/newview/skins/gold/textures/windows/Flyout_Pointer.png b/indra/newview/skins/gold/textures/windows/Flyout_Pointer.png Binary files differnew file mode 100644 index 0000000000..4076bb393e --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Flyout_Pointer.png diff --git a/indra/newview/skins/gold/textures/windows/Flyout_Right.png b/indra/newview/skins/gold/textures/windows/Flyout_Right.png Binary files differnew file mode 100644 index 0000000000..4c55cd6287 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Flyout_Right.png diff --git a/indra/newview/skins/gold/textures/windows/Icon_Close_Foreground.png b/indra/newview/skins/gold/textures/windows/Icon_Close_Foreground.png Binary files differnew file mode 100644 index 0000000000..cb516886a2 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Icon_Close_Foreground.png diff --git a/indra/newview/skins/gold/textures/windows/Icon_Close_Press.png b/indra/newview/skins/gold/textures/windows/Icon_Close_Press.png Binary files differnew file mode 100644 index 0000000000..283981f6ea --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Icon_Close_Press.png diff --git a/indra/newview/skins/gold/textures/windows/Icon_Close_Toast.png b/indra/newview/skins/gold/textures/windows/Icon_Close_Toast.png Binary files differnew file mode 100644 index 0000000000..b08ffbc742 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Icon_Close_Toast.png diff --git a/indra/newview/skins/gold/textures/windows/Icon_Dock_Foreground.png b/indra/newview/skins/gold/textures/windows/Icon_Dock_Foreground.png Binary files differnew file mode 100644 index 0000000000..7508fcb25e --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Icon_Dock_Foreground.png diff --git a/indra/newview/skins/gold/textures/windows/Icon_Dock_Press.png b/indra/newview/skins/gold/textures/windows/Icon_Dock_Press.png Binary files differnew file mode 100644 index 0000000000..3f2c560398 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Icon_Dock_Press.png diff --git a/indra/newview/skins/gold/textures/windows/Icon_Gear.png b/indra/newview/skins/gold/textures/windows/Icon_Gear.png Binary files differnew file mode 100644 index 0000000000..7cf85bece4 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Icon_Gear.png diff --git a/indra/newview/skins/gold/textures/windows/Icon_Gear_Background.png b/indra/newview/skins/gold/textures/windows/Icon_Gear_Background.png Binary files differnew file mode 100644 index 0000000000..09d83e62e4 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Icon_Gear_Background.png diff --git a/indra/newview/skins/gold/textures/windows/Icon_Gear_Foreground.png b/indra/newview/skins/gold/textures/windows/Icon_Gear_Foreground.png Binary files differnew file mode 100644 index 0000000000..fa998eee5d --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Icon_Gear_Foreground.png diff --git a/indra/newview/skins/gold/textures/windows/Icon_Gear_Press.png b/indra/newview/skins/gold/textures/windows/Icon_Gear_Press.png Binary files differnew file mode 100644 index 0000000000..603fa2f388 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Icon_Gear_Press.png diff --git a/indra/newview/skins/gold/textures/windows/Icon_Help_Foreground.png b/indra/newview/skins/gold/textures/windows/Icon_Help_Foreground.png Binary files differnew file mode 100644 index 0000000000..1bde4c040a --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Icon_Help_Foreground.png diff --git a/indra/newview/skins/gold/textures/windows/Icon_Help_Press.png b/indra/newview/skins/gold/textures/windows/Icon_Help_Press.png Binary files differnew file mode 100644 index 0000000000..f3b885283f --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Icon_Help_Press.png diff --git a/indra/newview/skins/gold/textures/windows/Icon_Minimize_Foreground.png b/indra/newview/skins/gold/textures/windows/Icon_Minimize_Foreground.png Binary files differnew file mode 100644 index 0000000000..942efb40f7 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Icon_Minimize_Foreground.png diff --git a/indra/newview/skins/gold/textures/windows/Icon_Minimize_Press.png b/indra/newview/skins/gold/textures/windows/Icon_Minimize_Press.png Binary files differnew file mode 100644 index 0000000000..1fe37b7a2e --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Icon_Minimize_Press.png diff --git a/indra/newview/skins/gold/textures/windows/Icon_Restore_Foreground.png b/indra/newview/skins/gold/textures/windows/Icon_Restore_Foreground.png Binary files differnew file mode 100644 index 0000000000..7840deccb8 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Icon_Restore_Foreground.png diff --git a/indra/newview/skins/gold/textures/windows/Icon_Restore_Press.png b/indra/newview/skins/gold/textures/windows/Icon_Restore_Press.png Binary files differnew file mode 100644 index 0000000000..33258a0bc5 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Icon_Restore_Press.png diff --git a/indra/newview/skins/gold/textures/windows/Icon_Undock_Foreground.png b/indra/newview/skins/gold/textures/windows/Icon_Undock_Foreground.png Binary files differnew file mode 100644 index 0000000000..df826226e6 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Icon_Undock_Foreground.png diff --git a/indra/newview/skins/gold/textures/windows/Inspector_Background.png b/indra/newview/skins/gold/textures/windows/Inspector_Background.png Binary files differnew file mode 100644 index 0000000000..3053269b84 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Inspector_Background.png diff --git a/indra/newview/skins/gold/textures/windows/Inspector_Hover.png b/indra/newview/skins/gold/textures/windows/Inspector_Hover.png Binary files differnew file mode 100644 index 0000000000..0cb846eba0 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Inspector_Hover.png diff --git a/indra/newview/skins/gold/textures/windows/Inspector_I.png b/indra/newview/skins/gold/textures/windows/Inspector_I.png Binary files differnew file mode 100644 index 0000000000..f0848838e2 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Inspector_I.png diff --git a/indra/newview/skins/gold/textures/windows/Resize_Corner.png b/indra/newview/skins/gold/textures/windows/Resize_Corner.png Binary files differnew file mode 100644 index 0000000000..4a533011df --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Resize_Corner.png diff --git a/indra/newview/skins/gold/textures/windows/Toast_Background.png b/indra/newview/skins/gold/textures/windows/Toast_Background.png Binary files differnew file mode 100644 index 0000000000..00676350ca --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Toast_Background.png diff --git a/indra/newview/skins/gold/textures/windows/Toast_CloseBtn.png b/indra/newview/skins/gold/textures/windows/Toast_CloseBtn.png Binary files differnew file mode 100644 index 0000000000..f37d8d085d --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Toast_CloseBtn.png diff --git a/indra/newview/skins/gold/textures/windows/Toast_Over.png b/indra/newview/skins/gold/textures/windows/Toast_Over.png Binary files differnew file mode 100644 index 0000000000..5191e0858d --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Toast_Over.png diff --git a/indra/newview/skins/gold/textures/windows/Volume_Background.png b/indra/newview/skins/gold/textures/windows/Volume_Background.png Binary files differnew file mode 100644 index 0000000000..9f8680d079 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Volume_Background.png diff --git a/indra/newview/skins/gold/textures/windows/Wearables_Divider.png b/indra/newview/skins/gold/textures/windows/Wearables_Divider.png Binary files differnew file mode 100644 index 0000000000..8795ccd661 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Wearables_Divider.png diff --git a/indra/newview/skins/gold/textures/windows/Window_Background.png b/indra/newview/skins/gold/textures/windows/Window_Background.png Binary files differnew file mode 100644 index 0000000000..f19fb0300b --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Window_Background.png diff --git a/indra/newview/skins/gold/textures/windows/Window_Foreground.png b/indra/newview/skins/gold/textures/windows/Window_Foreground.png Binary files differnew file mode 100644 index 0000000000..15d2ff72b6 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/Window_Foreground.png diff --git a/indra/newview/skins/contrast/textures/windows/add_payment_image_center.png b/indra/newview/skins/gold/textures/windows/add_payment_image_center.png Binary files differindex 0b99a72f32..0b99a72f32 100644 --- a/indra/newview/skins/contrast/textures/windows/add_payment_image_center.png +++ b/indra/newview/skins/gold/textures/windows/add_payment_image_center.png diff --git a/indra/newview/skins/contrast/textures/windows/add_payment_image_left.png b/indra/newview/skins/gold/textures/windows/add_payment_image_left.png Binary files differindex a5b28d7023..a5b28d7023 100644 --- a/indra/newview/skins/contrast/textures/windows/add_payment_image_left.png +++ b/indra/newview/skins/gold/textures/windows/add_payment_image_left.png diff --git a/indra/newview/skins/contrast/textures/windows/add_payment_image_right.png b/indra/newview/skins/gold/textures/windows/add_payment_image_right.png Binary files differindex 5724d39744..5724d39744 100644 --- a/indra/newview/skins/contrast/textures/windows/add_payment_image_right.png +++ b/indra/newview/skins/gold/textures/windows/add_payment_image_right.png diff --git a/indra/newview/skins/gold/textures/windows/first_login_image.jpg b/indra/newview/skins/gold/textures/windows/first_login_image.jpg Binary files differnew file mode 100644 index 0000000000..58c417081a --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/first_login_image.jpg diff --git a/indra/newview/skins/gold/textures/windows/hint_arrow_down.png b/indra/newview/skins/gold/textures/windows/hint_arrow_down.png Binary files differnew file mode 100644 index 0000000000..b449d3be7c --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/hint_arrow_down.png diff --git a/indra/newview/skins/gold/textures/windows/hint_arrow_left.png b/indra/newview/skins/gold/textures/windows/hint_arrow_left.png Binary files differnew file mode 100644 index 0000000000..d93d621067 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/hint_arrow_left.png diff --git a/indra/newview/skins/gold/textures/windows/hint_arrow_lower_left.png b/indra/newview/skins/gold/textures/windows/hint_arrow_lower_left.png Binary files differnew file mode 100644 index 0000000000..5e8def5a5b --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/hint_arrow_lower_left.png diff --git a/indra/newview/skins/gold/textures/windows/hint_arrow_right.png b/indra/newview/skins/gold/textures/windows/hint_arrow_right.png Binary files differnew file mode 100644 index 0000000000..3524487fb3 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/hint_arrow_right.png diff --git a/indra/newview/skins/gold/textures/windows/hint_arrow_up.png b/indra/newview/skins/gold/textures/windows/hint_arrow_up.png Binary files differnew file mode 100644 index 0000000000..aca440d712 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/hint_arrow_up.png diff --git a/indra/newview/skins/gold/textures/windows/hint_background.png b/indra/newview/skins/gold/textures/windows/hint_background.png Binary files differnew file mode 100644 index 0000000000..d045bc5e29 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/hint_background.png diff --git a/indra/newview/skins/gold/textures/windows/login_mp_logo.png b/indra/newview/skins/gold/textures/windows/login_mp_logo.png Binary files differnew file mode 100644 index 0000000000..7526374ba2 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/login_mp_logo.png diff --git a/indra/newview/skins/gold/textures/windows/login_mp_logo_small.png b/indra/newview/skins/gold/textures/windows/login_mp_logo_small.png Binary files differnew file mode 100644 index 0000000000..779d8ff649 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/login_mp_logo_small.png diff --git a/indra/newview/skins/gold/textures/windows/login_sl_logo.png b/indra/newview/skins/gold/textures/windows/login_sl_logo.png Binary files differnew file mode 100644 index 0000000000..e4d4eb3ebf --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/login_sl_logo.png diff --git a/indra/newview/skins/gold/textures/windows/login_sl_logo_small.png b/indra/newview/skins/gold/textures/windows/login_sl_logo_small.png Binary files differnew file mode 100644 index 0000000000..36fb15de08 --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/login_sl_logo_small.png diff --git a/indra/newview/skins/gold/textures/windows/startup_logo.png b/indra/newview/skins/gold/textures/windows/startup_logo.png Binary files differnew file mode 100644 index 0000000000..6a81a6451d --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/startup_logo.png diff --git a/indra/newview/skins/gold/textures/windows/yellow_gradient.png b/indra/newview/skins/gold/textures/windows/yellow_gradient.png Binary files differnew file mode 100644 index 0000000000..4a07282ecb --- /dev/null +++ b/indra/newview/skins/gold/textures/windows/yellow_gradient.png diff --git a/indra/newview/skins/contrast/textures/world/BeaconArrow.png b/indra/newview/skins/gold/textures/world/BeaconArrow.png Binary files differindex 54934f738a..54934f738a 100644 --- a/indra/newview/skins/contrast/textures/world/BeaconArrow.png +++ b/indra/newview/skins/gold/textures/world/BeaconArrow.png diff --git a/indra/newview/skins/gold/textures/world/CameraDragDot.png b/indra/newview/skins/gold/textures/world/CameraDragDot.png Binary files differnew file mode 100644 index 0000000000..2ccf098e0f --- /dev/null +++ b/indra/newview/skins/gold/textures/world/CameraDragDot.png diff --git a/indra/newview/skins/gold/textures/world/NoEntryLines.png b/indra/newview/skins/gold/textures/world/NoEntryLines.png Binary files differnew file mode 100644 index 0000000000..b295ba1281 --- /dev/null +++ b/indra/newview/skins/gold/textures/world/NoEntryLines.png diff --git a/indra/newview/skins/gold/textures/world/NoEntryPassLines.png b/indra/newview/skins/gold/textures/world/NoEntryPassLines.png Binary files differnew file mode 100644 index 0000000000..34900e2c02 --- /dev/null +++ b/indra/newview/skins/gold/textures/world/NoEntryPassLines.png diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp index bff2289a7c..b82a58163c 100644 --- a/indra/newview/tests/lllogininstance_test.cpp +++ b/indra/newview/tests/lllogininstance_test.cpp @@ -66,6 +66,7 @@ static LLEventStream gTestPump("test_pump"); #include "../llstartup.h" LLSLURL LLStartUp::sStartSLURL; LLSLURL& LLStartUp::getStartSLURL() { return sStartSLURL; } +std::string LLStartUp::getUserId() { return ""; }; #include "lllogin.h" @@ -122,7 +123,7 @@ void LLCredential::authenticatorType(std::string &idType) LLNotificationPtr LLNotificationsUtil::add(const std::string& name, const LLSD& substitutions, const LLSD& payload, - boost::function<void (const LLSD&, const LLSD&)> functor) + std::function<void (const LLSD&, const LLSD&)> functor) { return LLNotificationPtr((LLNotification*)NULL); } @@ -252,7 +253,7 @@ void LLProgressView::setMessage(std::string const &){} // LLNotifications class MockNotifications : public LLNotificationsInterface { - boost::function<void (const LLSD&, const LLSD&)> mResponder; + std::function<void (const LLSD&, const LLSD&)> mResponder; int mAddedCount; public: diff --git a/indra/newview/tests/llslurl_test.cpp b/indra/newview/tests/llslurl_test.cpp index fc9f5b707a..3ff38ea372 100644 --- a/indra/newview/tests/llslurl_test.cpp +++ b/indra/newview/tests/llslurl_test.cpp @@ -177,15 +177,15 @@ namespace tut LLSLURL slurl = LLSLURL(""); ensure_equals("null slurl", (int)slurl.getType(), LLSLURL::LAST_LOCATION); - slurl = LLSLURL("http://slurl.com/secondlife/myregion"); + slurl = LLSLURL("https://slurl.com/secondlife/myregion"); ensure_equals("slurl.com slurl, region only - type", slurl.getType(), LLSLURL::LOCATION); ensure_equals("slurl.com slurl, region only", slurl.getSLURLString(), - "http://maps.secondlife.com/secondlife/myregion/128/128/0"); + "https://maps.secondlife.com/secondlife/myregion/128/128/0"); - slurl = LLSLURL("http://maps.secondlife.com/secondlife/myregion/1/2/3"); + slurl = LLSLURL("https://maps.secondlife.com/secondlife/myregion/1/2/3"); ensure_equals("maps.secondlife.com slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION); ensure_equals("maps.secondlife.com slurl, region + coords", slurl.getSLURLString(), - "http://maps.secondlife.com/secondlife/myregion/1/2/3"); + "https://maps.secondlife.com/secondlife/myregion/1/2/3"); slurl = LLSLURL("secondlife://"); ensure_equals("secondlife: slurl, empty - type", slurl.getType(), LLSLURL::EMPTY); @@ -196,27 +196,27 @@ namespace tut slurl = LLSLURL("secondlife://myregion"); ensure_equals("secondlife: slurl, region only - type", slurl.getType(), LLSLURL::LOCATION); ensure_equals("secondlife: slurl, region only", slurl.getSLURLString(), - "http://maps.secondlife.com/secondlife/myregion/128/128/0"); + "https://maps.secondlife.com/secondlife/myregion/128/128/0"); slurl = LLSLURL("secondlife://myregion/1/2/3"); ensure_equals("secondlife: slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION); ensure_equals("secondlife slurl, region + coords", slurl.getSLURLString(), - "http://maps.secondlife.com/secondlife/myregion/1/2/3"); + "https://maps.secondlife.com/secondlife/myregion/1/2/3"); slurl = LLSLURL("/myregion"); ensure_equals("/region slurl, region- type", slurl.getType(), LLSLURL::LOCATION); ensure_equals("/region slurl, region ", slurl.getSLURLString(), - "http://maps.secondlife.com/secondlife/myregion/128/128/0"); + "https://maps.secondlife.com/secondlife/myregion/128/128/0"); slurl = LLSLURL("/myregion/1/2/3"); ensure_equals("/: slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION); ensure_equals("/ slurl, region + coords", slurl.getSLURLString(), - "http://maps.secondlife.com/secondlife/myregion/1/2/3"); + "https://maps.secondlife.com/secondlife/myregion/1/2/3"); slurl = LLSLURL("my region/1/2/3"); ensure_equals(" slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION); ensure_equals(" slurl, region + coords", slurl.getSLURLString(), - "http://maps.secondlife.com/secondlife/my%20region/1/2/3"); + "https://maps.secondlife.com/secondlife/my%20region/1/2/3"); LLGridManager::getInstance()->setGridChoice("my.grid.com"); slurl = LLSLURL("https://my.grid.com/region/my%20region/1/2/3"); @@ -309,7 +309,7 @@ namespace tut slurl = LLSLURL("my region", LLVector3(1,2,3)); ensure_equals("default grid/region/vector - type", slurl.getType(), LLSLURL::LOCATION); ensure_equals(" default grid/region/vector", slurl.getSLURLString(), - "http://maps.secondlife.com/secondlife/my%20region/1/2/3"); + "https://maps.secondlife.com/secondlife/my%20region/1/2/3"); LLGridManager::getInstance()->setGridChoice("MyGrid"); slurl = LLSLURL("my region", LLVector3(1,2,3)); diff --git a/indra/newview/tests/llviewerassetstats_test.cpp b/indra/newview/tests/llviewerassetstats_test.cpp index d5e281bba8..10c68432a1 100644 --- a/indra/newview/tests/llviewerassetstats_test.cpp +++ b/indra/newview/tests/llviewerassetstats_test.cpp @@ -43,12 +43,15 @@ namespace LLStatViewer LLTrace::SampleStatHandle<> FPS_SAMPLE("fpssample"); } -void LLVOAvatar::getNearbyRezzedStats(std::vector<S32>& counts, F32& avg_cloud_time, S32& cloud_avatars) +void LLVOAvatar::getNearbyRezzedStats(std::vector<S32>& counts, F32& avg_cloud_time, S32& cloud_avatars, S32& pending_meshes, S32& control_avatars) { counts.resize(3); counts[0] = 0; counts[1] = 0; counts[2] = 1; + cloud_avatars = 0; + pending_meshes = 0; + control_avatars = 0; } // static diff --git a/indra/newview/tests/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp index d9cb9e7538..94cf0fcf10 100644 --- a/indra/newview/tests/llviewernetwork_test.cpp +++ b/indra/newview/tests/llviewernetwork_test.cpp @@ -391,7 +391,7 @@ namespace tut std::string("https://minimal.long.name/helpers/")); ensure_equals("minimal grid login page", LLGridManager::getInstance()->getLoginPage("minimal.long.name"), - std::string("http://minimal.long.name/app/login/")); + std::string("https://minimal.long.name/app/login/")); } diff --git a/indra/newview/tests/llworldmap_test.cpp b/indra/newview/tests/llworldmap_test.cpp index d5bf189d82..60172b3960 100644 --- a/indra/newview/tests/llworldmap_test.cpp +++ b/indra/newview/tests/llworldmap_test.cpp @@ -32,6 +32,7 @@ #include "lltrans.h" #include "lluistring.h" #include "../llviewertexture.h" +#include "../llviewercontrol.h" #include "../llworldmapmessage.h" // Class to test #include "../llworldmap.h" @@ -71,6 +72,11 @@ void LLUIString::updateResult() const { } void LLUIString::setArg(const std::string& , const std::string& ) { } void LLUIString::assign(const std::string& ) { } +LLControlGroup::LLControlGroup(const std::string& name) : LLInstanceTracker<LLControlGroup, std::string>(name) {} +LLControlGroup::~LLControlGroup() {} +bool LLControlGroup::getBOOL(std::string_view) { return true; } +LLControlGroup gSavedSettings("test_settings"); + // End Stubbing // ------------------------------------------------------------------------------------------- diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index fcf5a37364..2b24fdcbe9 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -63,7 +63,6 @@ class ViewerManifest(LLManifest): def construct(self): super(ViewerManifest, self).construct() self.path(src="../../scripts/messages/message_template.msg", dst="app_settings/message_template.msg") - self.path(src="../../etc/message.xml", dst="app_settings/message.xml") os.environ["XZ_DEFAULTS"] = "-T0" @@ -248,6 +247,16 @@ class ViewerManifest(LLManifest): } return "%(channel_vendor_base)s%(channel_variant_underscores)s_%(version_underscores)s_%(arch)s" % substitution_strings + def installer_base_name_mac(self): + global CHANNEL_VENDOR_BASE + # a standard map of strings for replacing in the templates + substitution_strings = { + 'channel_vendor_base' : '_'.join(CHANNEL_VENDOR_BASE.split()), + 'channel_variant_underscores':self.channel_variant_app_suffix(), + 'version_underscores' : '_'.join(self.args['version']) + } + return "%(channel_vendor_base)s%(channel_variant_underscores)s_%(version_underscores)s_universal" % substitution_strings + def app_name(self): global CHANNEL_VENDOR_BASE channel_type=self.channel_type() @@ -277,13 +286,13 @@ class ViewerManifest(LLManifest): # All lines up to and including the first blank line are the file header; skip them lines.reverse() # so that pop will pull from first to last line - while not re.match("\s*$", lines.pop()) : + while not re.match(r"\s*$", lines.pop()) : pass # do nothing # A line that starts with a non-whitespace character is a name; all others describe contributions, so collect the names names = [] for line in lines : - if re.match("\S", line) : + if re.match(r"\S", line) : names.append(line.rstrip()) # It's not fair to always put the same people at the head of the list random.shuffle(names) @@ -559,6 +568,9 @@ class Windows_x86_64_Manifest(ViewerManifest): ): self.path(libfile) + if self.args['discord'] == 'ON': + self.path("discord_partner_sdk.dll") + if self.args['openal'] == 'ON': # Get openal dll self.path("OpenAL32.dll") @@ -624,12 +636,16 @@ class Windows_x86_64_Manifest(ViewerManifest): with self.prefix(src=os.path.join(pkgdir, 'bin', config)): self.path("chrome_elf.dll") self.path("d3dcompiler_47.dll") + self.path("dxcompiler.dll") + self.path("dxil.dll") self.path("libcef.dll") self.path("libEGL.dll") self.path("libGLESv2.dll") - self.path("dullahan_host.exe") - self.path("snapshot_blob.bin") self.path("v8_context_snapshot.bin") + self.path("vk_swiftshader.dll") + self.path("vk_swiftshader_icd.json") + self.path("vulkan-1.dll") + self.path("dullahan_host.exe") # MSVC DLLs needed for CEF and have to be in same directory as plugin with self.prefix(src=os.path.join(self.args['build'], os.pardir, @@ -847,13 +863,12 @@ class Darwin_x86_64_Manifest(ViewerManifest): with self.prefix(src="", dst="Contents"): # everything goes in Contents bugsplat_db = self.args.get('bugsplat') if bugsplat_db: - # Inject BugsplatServerURL into Info.plist if provided. + # Inject Bugsplat's db into Info.plist if provided. Info_plist = self.dst_path_of("Info.plist") with open(Info_plist, 'rb') as f: Info = plistlib.load(f) # https://www.bugsplat.com/docs/platforms/os-x#configuration - Info["BugsplatServerURL"] = \ - "https://{}.bugsplat.com/".format(bugsplat_db) + Info["BugSplatDatabase"] = bugsplat_db self.put_in_file( plistlib.dumps(Info), os.path.basename(Info_plist), @@ -861,13 +876,30 @@ class Darwin_x86_64_Manifest(ViewerManifest): # CEF framework goes inside Contents/Frameworks. # Remember where we parked this car. - with self.prefix(src="", dst="Frameworks"): - CEF_framework = "Chromium Embedded Framework.framework" - self.path2basename(relpkgdir, CEF_framework) - CEF_framework = self.dst_path_of(CEF_framework) + with self.prefix(src=relpkgdir, dst="Frameworks"): + self.path("libndofdev.dylib") + if self.args.get('bugsplat'): self.path2basename(relpkgdir, "BugsplatMac.framework") + self.path2basename(relpkgdir, "CrashReporter.framework") + self.path2basename(relpkgdir, "HockeySDK.framework") + + # OpenAL dylibs + if self.args['openal'] == 'ON': + for libfile in ( + "libopenal.dylib", + "libalut.dylib", + ): + self.path(libfile) + + # WebRTC libraries + with self.prefix(src=os.path.join(self.args['build'], os.pardir, + 'sharedlibs', self.args['buildtype'], 'Resources')): + for libfile in ( + 'libllwebrtc.dylib', + ): + self.path(libfile) with self.prefix(dst="MacOS"): executable = self.dst_path_of(self.channel()) @@ -891,6 +923,24 @@ class Darwin_x86_64_Manifest(ViewerManifest): # work, we need the build to noisily fail! oldpath = subprocess.check_output( ['objdump', '--macho', '--dylib-id', '--non-verbose', + os.path.join(relpkgdir, "HockeySDK.framework", "HockeySDK")], + text=True + ).splitlines()[-1] # take the last line of output + self.run_command( + ['install_name_tool', '-change', oldpath, + '@executable_path/../Frameworks/HockeySDK.framework/HockeySDK', + executable]) + oldpath = subprocess.check_output( + ['objdump', '--macho', '--dylib-id', '--non-verbose', + os.path.join(relpkgdir, "CrashReporter.framework", "CrashReporter")], + text=True + ).splitlines()[-1] # take the last line of output + self.run_command( + ['install_name_tool', '-change', oldpath, + '@executable_path/../Frameworks/CrashReporter.framework/CrashReporter', + executable]) + oldpath = subprocess.check_output( + ['objdump', '--macho', '--dylib-id', '--non-verbose', os.path.join(relpkgdir, "BugsplatMac.framework", "BugsplatMac")], text=True ).splitlines()[-1] # take the last line of output @@ -928,16 +978,12 @@ class Darwin_x86_64_Manifest(ViewerManifest): self.path("*.png") self.path("*.gif") - with self.prefix(src=relpkgdir, dst=""): - self.path("libndofdev.dylib") - with self.prefix(src_dst="cursors_mac"): self.path("*.tif") self.path("licenses-mac.txt", dst="licenses.txt") self.path("featuretable_mac.txt") self.path("cube.dae") - self.path("SecondLife.nib") with self.prefix(src=pkgdir,dst=""): self.path("ca-bundle.crt") @@ -990,20 +1036,6 @@ class Darwin_x86_64_Manifest(ViewerManifest): print("Skipping %s" % dst) return added - # WebRTC libraries - with self.prefix(src=os.path.join(self.args['build'], os.pardir, - 'sharedlibs', self.args['buildtype'], 'Resources')): - for libfile in ( - 'libllwebrtc.dylib', - ): - self.path(libfile) - - oldpath = os.path.join("@rpath", libfile) - self.run_command( - ['install_name_tool', '-change', oldpath, - '@executable_path/../Resources/%s' % libfile, - executable]) - # dylibs is a list of all the .dylib files we expect to need # in our bundled sub-apps. For each of these we'll create a # symlink from sub-app/Contents/Resources to the real .dylib. @@ -1021,13 +1053,12 @@ class Darwin_x86_64_Manifest(ViewerManifest): ): self.path2basename(relpkgdir, libfile) - # OpenAL dylibs - if self.args['openal'] == 'ON': + # Discord social SDK + if self.args['discord'] == 'ON': for libfile in ( - "libopenal.dylib", - "libalut.dylib", + "libdiscord_partner_sdk.dylib", ): - dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile) + self.path2basename(relpkgdir, libfile) # our apps executable_path = {} @@ -1039,125 +1070,36 @@ class Darwin_x86_64_Manifest(ViewerManifest): executable_path[app] = \ self.dst_path_of(os.path.join(app, "Contents", "MacOS")) - # our apps dependencies on shared libs - # for each app, for each dylib we collected in dylibs, - # create a symlink to the real copy of the dylib. - with self.prefix(dst=os.path.join(app, "Contents", "Resources")): - for libfile in dylibs: - self.relsymlinkf(os.path.join(libfile_parent, libfile)) - # Dullahan helper apps go inside SLPlugin.app with self.prefix(dst=os.path.join( "SLPlugin.app", "Contents", "Frameworks")): - - frameworkname = 'Chromium Embedded Framework' - - # This code constructs a relative symlink from the - # target framework folder back to the real CEF framework. - # It needs to be relative so that the symlink still works when - # (as is normal) the user moves the app bundle out of the DMG - # and into the /Applications folder. Note we pass catch=False, - # letting the uncaught exception terminate the process, since - # without this symlink, Second Life web media can't possibly work. - - # It might seem simpler just to symlink Frameworks back to - # the parent of Chromimum Embedded Framework.framework. But - # that would create a symlink cycle, which breaks our - # packaging step. So make a symlink from Chromium Embedded - # Framework.framework to the directory of the same name, which - # is NOT an ancestor of the symlink. - - # from SLPlugin.app/Contents/Frameworks/Chromium Embedded - # Framework.framework back to - # $viewer_app/Contents/Frameworks/Chromium Embedded Framework.framework - SLPlugin_framework = self.relsymlinkf(CEF_framework, catch=False) - - # for all the multiple CEF/Dullahan (as of CEF 76) helper app bundles we need: - for helper in ( - "DullahanHelper", - "DullahanHelper (GPU)", - "DullahanHelper (Renderer)", - "DullahanHelper (Plugin)", - ): - # app is the directory name of the app bundle, with app/Contents/MacOS/helper as the executable - app = helper + ".app" - - # copy DullahanHelper.app - self.path2basename(relpkgdir, app) - - # and fix that up with a Frameworks/CEF symlink too - with self.prefix(dst=os.path.join( - app, 'Contents', 'Frameworks')): - # from Dullahan Helper *.app/Contents/Frameworks/Chromium Embedded - # Framework.framework back to - # SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework - # Since SLPlugin_framework is itself a - # symlink, don't let relsymlinkf() resolve -- - # explicitly call relpath(symlink=True) and - # create that symlink here. - helper_framework = \ - self.symlinkf(self.relpath(SLPlugin_framework, symlink=True), catch=False) - - # change_command includes install_name_tool, the - # -change subcommand and the old framework rpath - # stamped into the executable. To use it with - # run_command(), we must still append the new - # framework path and the pathname of the - # executable to change. - change_command = [ - 'install_name_tool', '-change', - '@rpath/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework'] - - with self.prefix(dst=os.path.join( - app, 'Contents', 'MacOS')): - # Now self.get_dst_prefix() is, at runtime, - # @executable_path. Locate the helper app - # framework (which is a symlink) from here. - newpath = os.path.join( - '@executable_path', - self.relpath(helper_framework, symlink=True), - frameworkname) - # and restamp the Dullahan Helper executable itself - self.run_command( - change_command + - [newpath, self.dst_path_of(helper)]) - - # SLPlugin plugins - with self.prefix(dst="llplugin"): - dylibexecutable = 'media_plugin_cef.dylib' + # copy CEF plugin self.path2basename("../media_plugins/cef/" + self.args['configuration'], - dylibexecutable) + "media_plugin_cef.dylib") - # Do this install_name_tool *after* media plugin is copied over. - # Locate the framework lib executable -- relative to - # SLPlugin.app/Contents/MacOS, which will be our - # @executable_path at runtime! - newpath = os.path.join( - '@executable_path', - self.relpath(SLPlugin_framework, executable_path["SLPlugin.app"], - symlink=True), - frameworkname) - # restamp media_plugin_cef.dylib - self.run_command( - change_command + - [newpath, self.dst_path_of(dylibexecutable)]) + # copy LibVLC plugin + self.path2basename("../media_plugins/libvlc/" + self.args['configuration'], + "media_plugin_libvlc.dylib") - # copy LibVLC plugin itself - dylibexecutable = 'media_plugin_libvlc.dylib' - self.path2basename("../media_plugins/libvlc/" + self.args['configuration'], dylibexecutable) - # add @rpath for the correct LibVLC subfolder - self.run_command(['install_name_tool', '-add_rpath', '@loader_path/lib', self.dst_path_of(dylibexecutable)]) + # CEF framework and vlc libraries goes inside Contents/Frameworks. + with self.prefix(src=os.path.join(pkgdir, 'lib', 'release')): + self.path("Chromium Embedded Framework.framework") + self.path("DullahanHelper.app") + self.path("DullahanHelper (Alerts).app") + self.path("DullahanHelper (GPU).app") + self.path("DullahanHelper (Renderer).app") + self.path("DullahanHelper (Plugin).app") - # copy LibVLC dynamic libraries - with self.prefix(src=relpkgdir, dst="lib"): + # Copy libvlc self.path( "libvlc*.dylib*" ) # copy LibVLC plugins folder - with self.prefix(src='plugins', dst=""): + with self.prefix(src='plugins', dst="plugins"): self.path( "*.dylib" ) self.path( "plugins.dat" ) + def package_finish(self): - imagename = self.installer_base_name() + imagename = self.installer_base_name_mac() self.set_github_output('imagename', imagename) finalname = imagename + ".dmg" self.package_file = finalname @@ -1797,34 +1739,6 @@ class Linux_x86_64_Manifest(LinuxManifest): self.path("libalut.so*") self.path("libopenal.so*") self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname - # KLUDGE: As of 2012-04-11, the 'fontconfig' package installs - # libfontconfig.so.1.4.4, along with symlinks libfontconfig.so.1 - # and libfontconfig.so. Before we added support for library-file - # wildcards, though, this self.path() call specifically named - # libfontconfig.so.1.4.4 WITHOUT also copying the symlinks. When I - # (nat) changed the call to self.path("libfontconfig.so.*"), we - # ended up with the libfontconfig.so.1 symlink in the target - # directory as well. But guess what! At least on Ubuntu 10.04, - # certain viewer fonts look terrible with libfontconfig.so.1 - # present in the target directory. Removing that symlink suffices - # to improve them. I suspect that means we actually do better when - # the viewer fails to find our packaged libfontconfig.so*, falling - # back on the system one instead -- but diagnosing and fixing that - # is a bit out of scope for the present project. Meanwhile, this - # particular wildcard specification gets us exactly what the - # previous call did, without having to explicitly state the - # version number. - self.path("libfontconfig.so.*.*") - - # Include libfreetype.so. but have it work as libfontconfig does. - self.path("libfreetype.so.*.*") - - try: - self.path("libtcmalloc.so*") #formerly called google perf tools - pass - except: - print("tcmalloc files not found, skipping") - pass # Vivox runtimes with self.prefix(src=relpkgdir, dst="bin"): @@ -1847,6 +1761,7 @@ if __name__ == "__main__": extra_arguments = [ dict(name='bugsplat', description="""BugSplat database to which to post crashes, if BugSplat crash reporting is desired""", default=''), + dict(name='discord', description="""Indication discord social sdk libraries are needed""", default='OFF'), dict(name='openal', description="""Indication openal libraries are needed""", default='OFF'), dict(name='tracy', description="""Indication tracy profiler is enabled""", default='OFF'), ] |
